From 7664a2d159c4674abcc7b88c52fefde46d4ffeba Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Thu, 23 Jan 2025 13:10:20 -0800 Subject: [PATCH 001/207] Add initial Quarto docs assets from experimental branch --- .gitignore | 3 + Makefile | 17 + docs/templates/module.qmd.jinja2 | 331 + docs/validmind/validmind.qmd | 14394 +++++++++++++++++++++++++++++ 4 files changed, 14745 insertions(+) create mode 100644 docs/templates/module.qmd.jinja2 create mode 100644 docs/validmind/validmind.qmd diff --git a/.gitignore b/.gitignore index 0ce6f7c95..4959087fd 100644 --- a/.gitignore +++ b/.gitignore @@ -214,3 +214,6 @@ my_tests/ *.sqlite *.db *.db-journal + +# Quarto docs +docs/validmind.json diff --git a/Makefile b/Makefile index d7494b6f9..148efdac3 100644 --- a/Makefile +++ b/Makefile @@ -51,6 +51,23 @@ else poetry run pdoc validmind -d google -t docs/templates --no-show-source --logo https://vmai.s3.us-west-1.amazonaws.com/validmind-logo.svg --favicon https://vmai.s3.us-west-1.amazonaws.com/favicon.ico endif +quarto-docs: clean-quarto docs/validmind.json docs/validmind/validmind.qmd $(patsubst %,docs/validmind/_%.qmd,$(SUBMODULES)) + +clean-quarto: + rm -f docs/validmind.json + rm -rf docs/validmind + mkdir -p docs/validmind + +docs/validmind.json: + rm -f $@ + poetry run python -m griffe dump validmind > $@ + +docs/validmind/validmind.qmd: docs/templates/module.qmd.jinja2 docs/validmind.json + jinja2 docs/templates/module.qmd.jinja2 docs/validmind.json > $@ + +docs/validmind/_%.qmd: docs/templates/submodule.qmd.jinja2 docs/validmind.json + jinja2 docs/templates/submodule.qmd.jinja2 docs/validmind.json -D module=$* > $@ + version: @:$(call check_defined, tag, new semver version tag to use on pyproject.toml) @poetry version $(tag) diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 new file mode 100644 index 000000000..94222c381 --- /dev/null +++ b/docs/templates/module.qmd.jinja2 @@ -0,0 +1,331 @@ +{%- macro is_public(doc) -%} + {%- if doc.name == "__init__" and (doc.docstring or (doc.kind == "function" and doc.signature_without_self.parameters)) -%} + true + {%- elif doc.name == "__doc__" -%} + {%- elif doc.kind == "module" and doc.fullname not in all_modules -%} + {%- elif (doc.qualname or doc.name) is in(validmind.members.__all__.value.elements if validmind.members.__all__ and validmind.members.__all__.value.elements else []) -%} + true + {%- elif not doc.name.startswith("_") and (doc.kind != "variable" or doc.is_enum_member or doc.docstring) -%} + true + {%- endif -%} +{%- endmacro -%} + +{%- macro format_return_type(returns) -%} +{%- if returns.cls == "ExprName" -%} + {%- if returns.name in validmind.members.client.members and validmind.members.client.members[returns.name].kind == "alias" -%} + {{ validmind.members.client.members[returns.name].target_path }} + {%- else -%} + {{ returns.name }} + {%- endif -%} +{%- elif returns.cls == "ExprSubscript" and returns.left is defined -%} + {{ returns.left.name }}[ + {%- if returns.slice.cls == "ExprTuple" -%} + {{ returns.slice.elements|map(attribute="name")|join(", ") }} + {%- else -%} + {{ returns.slice.name }} + {%- endif -%} + ] +{%- else -%} + {{ returns|string }} +{%- endif -%} +{%- endmacro %} + +{%- macro resolve_alias_path(member) -%} + {%- if member.kind == "alias" and member.target_path -%} + {{ member.target_path }} + {%- else -%} + {{ "" }} + {%- endif -%} +{%- endmacro -%} + +{%- macro get_flattened_members(module, level=1) -%} + {% if module.members -%} + {% for member_name, member in module.members.items() -%} + {% if member.kind == "module" and not member_name.startswith("_") and member_name not in ["preprocess", "preprocessing"] %} +{{ "#" * (level + 2) }} {{ member_name }} + +{% if member.docstring %} +{{ member.docstring.value if member.docstring.value is defined else member.docstring }} +{% endif %} + +{% if member.members %} +{{ get_flattened_members(member, level + 1) }} +{% endif %} + + {% elif member.kind == "class" and not member_name.startswith("_") %} +{{ "#" * (level + 3) }} class {{ member_name }}{% if member.bases %}({{ member.bases[0].name }}){% endif %} + +{{ member.docstring.value if member.docstring and member.docstring.value else member.docstring }} + + {% if member.members %} + {% for method_name, method in member.members.items() -%} + {% if not method_name.startswith("_") %} + +{{ "#" * (level + 4) }} {{ method_name }}() +```python +def {{ method_name }}({% for param in method.parameters %}{{ param.name }}{% if param.default is not none %} = {{ param.default }}{% endif -%}{% if not loop.last %}, {% endif -%}{% endfor %}): +``` +{% if member.docstring %} +{{ format_docstring_content(member.docstring.value if member.docstring.value is defined else member.docstring) }} +{% endif %} + + {%- endif -%} + {% endfor %} + {%- endif -%} + {% elif member.kind == "function" and not member_name.startswith("_") + and not member_name.startswith("simple_preprocess") %} + +{{ "#" * (level + 4) }} {{ member_name }}() + +```python +def {{ member_name }}({% for param in member.parameters %}{{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation.left.name if param.annotation.cls == "ExprSubscript" else "" }}{% endif -%}{% if param.default is not none %} = {{ param.default }}{% endif -%}{% if not loop.last %}, {% endif -%}{% endfor %}){% if member.returns %} -> {{ format_return_type(member.returns) }}{% endif %} +``` + +{% if member.docstring %} +{{ format_docstring_content(member.docstring.value if member.docstring.value is defined else member.docstring) }} +{% endif %} + + {% endif -%} + {% endfor %} + {% endif -%} +{% endmacro -%} + +{%- macro show_submodules(module) -%} + {%- if module.members -%} +#### Module Hierarchy + + {%- for submember_name, submember in module.members.items() -%} + {%- if submember.kind == "module" and not submember_name.startswith("_") -%} + +##### {{ submember_name }} + +* [{{ submember_name }}]({{ submember_name }}.qmd) +{% if submember.docstring %} +{{ submember.docstring.value if submember.docstring.value is defined else submember.docstring }} + +{% endif -%} + {%- if submember.members -%} + {%- for subsubmember_name, subsubmember in submember.members.items() -%} + {%- if subsubmember.kind == "module" and not subsubmember_name.startswith("_") -%} + +###### {{ subsubmember_name }} + +* [{{ subsubmember_name }}]({{ submember_name }}/{{ subsubmember_name }}.qmd) +{% if subsubmember.docstring %} +{{ subsubmember.docstring.value if subsubmember.docstring.value is defined else subsubmember.docstring }} + +{% endif -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} +{%- endmacro -%} + +{%- macro resolve_decorator(member, validmind) -%} + {%- if member.kind == "alias" and member.target_path -%} + {%- set path_parts = member.target_path.split(".") -%} + {%- set current_module = validmind -%} + + {%- if "tests" in current_module.members -%} + {%- set current_module = current_module.members["tests"] -%} + {%- if "decorator" in current_module.members -%} + {%- set current_module = current_module.members["decorator"] -%} + {%- set target_name = path_parts[-1] -%} + {%- if target_name in current_module.members -%} + {%- set target = current_module.members[target_name] -%} +```python +def {{ target_name }}({% if target.parameters -%} + {%- for param in target.parameters -%} + {{ param.name }}{% if param.kind == "variadic positional" %}*{% endif -%}{% if param.kind == "variadic keyword" %}**{% endif -%}{% if param.default is not none %} = {{ param.default }}{% endif -%}{% if not loop.last %}, {% endif -%} + {%- endfor -%} +{%- endif -%}): +``` + +{% if target.docstring %} +{{ format_docstring_content(target.docstring.value if target.docstring.value is defined else target.docstring) }} +{%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} +{%- endmacro -%} + +{%- macro format_docstring_content(docstring) -%} + {%- set docstring = docstring.replace(':\n-', ':\n\n-') -%} + {%- set docstring = docstring.replace('\n ', ' ') -%} + {%- set docstring = docstring.replace(':param ', '\n**Parameters**\n\n- **') -%} + {%- set docstring = docstring.replace(': ', '**: ', 1) -%} + {%- set docstring = docstring.replace(':return: ', '\n**Returns**\n\n- ') -%} + {%- set lines = docstring.split('\n') -%} + {%- set formatted_lines = [] -%} + {%- for line in lines -%} + {%- if line.startswith('### ') -%} + {%- set line = line.replace('### ', '###### ') -%} + {%- elif line.strip() == 'Args:' -%} + {%- set line = '**Arguments**\n' -%} + {%- elif line.strip() == 'Attributes:' -%} + {%- set line = '**Attributes**\n' -%} + {%- elif line.strip() == 'Raises:' -%} + {%- set line = '**Raises**\n' -%} + {%- elif line.strip() == 'Returns:' -%} + {%- set line = '**Returns**\n' -%} + {%- elif line.startswith(' ') -%} + {%- set trimmed = line.strip() -%} + {%- if ':' in trimmed -%} + {%- set parts = trimmed.split(':', 1) -%} + {%- set param = parts[0].strip() -%} + {%- set desc = parts[1].strip() -%} + {%- if '[DEPRECATED]' in desc -%} + {%- set desc = desc.replace('[DEPRECATED]', '') ~ '^[**Deprecation notice**
`' ~ param ~ '` has been deprecated and will be removed in a future release.]' -%} + {%- endif -%} + {%- set line = '- **' ~ param ~ '**: ' ~ desc -%} + {%- else -%} + {%- set line = '- ' ~ trimmed -%} + {%- endif -%} + {%- endif -%} + {%- if line.strip() or line.startswith(' ') -%} + {%- set _ = formatted_lines.append(line) -%} + {%- else -%} + {%- set _ = formatted_lines.append('') -%} + {%- endif -%} + {%- endfor -%} + {{ formatted_lines | join('\n') }} +{%- endmacro -%} + +--- +title: {{ "ValidMind Library" if validmind.name == "validmind" else validmind.name | capitalize }} +toc-depth: 4 +toc-expand: 4 +toc-location: left +toc-title: "" +--- +{% if validmind.name != "validmind" %} + {% set parentmodule = validmind.filepath.split("/")[-2] if validmind.filepath is defined and "/" in validmind.filepath else None %} + {% if parentmodule and parentmodule in all_modules %} + [← {{ parentmodule }}](../{{ parentmodule }}.qmd) + {% endif -%} +{% endif -%} + +{% if validmind.docstring %} +{{ validmind.docstring.value if validmind.docstring.value is defined else validmind.docstring }} +{%- endif -%} +{% if validmind.members %} + +## Python Library API +{% for member_name, member in validmind.members.items() -%} + {% if member_name == "__version__" + or (member.kind != "module" and "'" + member_name + "'" in validmind.members.__all__.value.elements) + or (member.kind == "alias" + and member.target_path + and member.target_path.startswith("validmind.") + and not member.name.startswith("_") + and ("'" + member.target_path.split(".")[-2] + "'" in validmind.members.__all__.value.elements)) %} +{% set display_name = "\_\_version\_\_" if member_name == "__version__" else member_name + "()" %} +### {{ display_name }} +{%- set resolved = member -%} +{% if member.kind == "alias" -%} + {% if member_name in ['tags', 'tasks', 'test'] -%} + {% set resolved = None -%} + {% set decorator_output = resolve_decorator(member, validmind) -%} + {% else -%} + {% set target_path = resolve_alias_path(member) -%} + {% if target_path -%} + {% set path_parts = target_path.split(".") -%} + {% set module_name = path_parts[-2] -%} + {% if module_name in validmind.members -%} + {% set module = validmind.members[module_name] -%} + {% set target_name = path_parts[-1] -%} + {% if target_name in module.members -%} + {% set resolved = module.members[target_name] -%} + {%- if resolved.kind == "alias" and resolved.target_path %} + {% set inner_module_name = resolved.target_path.split(".")[-2] -%} + {% set inner_target_name = resolved.target_path.split(".")[-1] -%} + {% if inner_module_name in validmind.members -%} + {% set inner_module = validmind.members[inner_module_name] -%} + {% if inner_target_name in inner_module.members -%} + {% set resolved = inner_module.members[inner_target_name] -%} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endif %} +{%- endif %} + +{% if member_name in ['tags', 'tasks', 'test'] and decorator_output is defined -%} +{{ decorator_output }} +{% elif resolved and resolved.kind == "function" -%} +{%- if resolved.labels and "async" in resolved.labels %}async {% endif -%} +```python +def {{ member_name }}{% if resolved.parameters %}( +{%- for param in resolved.parameters %} + {{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation.left.name if param.annotation.cls == "ExprSubscript" else "" }}{% endif -%}{% if param.default is not none %} = {{ param.default }}{% endif -%}{% if not loop.last %}, {% endif -%} +{%- endfor %} +){% else %}(){% endif -%} +{%- if resolved.returns %} -> {{ format_return_type(resolved.returns) }}:{% endif %} +``` +{% if resolved.docstring %} +{{ format_docstring_content(resolved.docstring.value if resolved.docstring.value is defined else resolved.docstring) }} +{%- endif -%} + +{% if resolved.decorators %} +#### Decorators: + +{% for decorator in resolved.decorators %} +- {{ decorator.value.values[0].name if decorator.value.cls == "ExprAttribute" else decorator.value }} +{% endfor %} +{% endif -%} + +{% elif member_name == "__version__" -%} +{% set version_value = member.members.__version__.value if member.members and member.members.__version__ -%} +```python +{{ version_value | replace("'", "") }} +``` +{% elif resolved.kind == "class" %} +{% if resolved.docstring %} +{{ format_docstring_content(resolved.docstring.value if resolved.docstring.value is defined else resolved.docstring) }} +{% endif -%} + +{% if resolved.bases %} +**Bases**: {% for base in resolved.bases %}{{ base[2] }}{% if not loop.last %}, {% endif -%}{% endfor %} +{% endif -%} + +{% if resolved.decorators %} +**Decorators**: +{% for decorator in resolved.decorators %} +- {{ decorator.value.name if decorator.value.cls == "ExprName" else decorator.value.values[0].name if decorator.value.cls == "ExprAttribute" else decorator.value }} +{% endfor %} +{% endif -%} + +{% else %} +{% if resolved.target_path %}**Import Path**: `{{ resolved.target_path }}`{% endif -%} + +{% if resolved.docstring %} +{{ format_docstring_content(resolved.docstring.value if resolved.docstring.value is defined else resolved.docstring) }} +{% endif -%} +{% endif -%} + + {% endif -%} +{% endfor %} + +## Submodules +{% for member_name, member in validmind.members.items() %} + {% if member.kind == "module" and "'" + member_name + "'" in validmind.members.__all__.value.elements %} +{% set display_name = "\_\_version\_\_" if member_name == "__version__" else member_name -%} +### {{ display_name }} + +{% if member.target_path %}**Import Path**: `{{ member.target_path }}`{% endif -%} + +{% if member.docstring %} +{{ member.docstring.value if member.docstring.value is defined else member.docstring }} +{% endif -%} + +{{ get_flattened_members(member) }} + {% endif -%} +{% endfor %} + +{{ show_submodules(validmind) }} +{% endif -%} \ No newline at end of file diff --git a/docs/validmind/validmind.qmd b/docs/validmind/validmind.qmd new file mode 100644 index 000000000..c0f128f78 --- /dev/null +++ b/docs/validmind/validmind.qmd @@ -0,0 +1,14394 @@ +--- +title: ValidMind Library +toc-depth: 4 +toc-expand: 4 +toc-location: left +toc-title: "" +--- + +The ValidMind Library is a suite of developer tools and methods designed to automate the documentation and validation of your models. + +Designed to be model agnostic, the ValidMind Library provides all the standard functionality without requiring you to rewrite any functions as long as your model is built in Python. + +With a rich array of documentation tools and test suites, from documenting descriptions of your datasets to testing your models for weak spots and overfit areas, the ValidMind Library helps you automate model documentation by feeding the ValidMind Platform with documentation artifacts and test results. + +To install the ValidMind Library: + +```bash +pip install validmind +``` + +To initialize the ValidMind Library, paste the code snippet with the model identifier credentials directly into your development source code, replacing this example with your own: + +```python +import validmind as vm + +vm.init( + api_host = "https://api.dev.vm.validmind.ai/api/v1/tracking/tracking", + api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + api_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + project = "" +) +``` + +After you have pasted the code snippet into your development source code and executed the code, the Python Library API will register with ValidMind. You can now use the ValidMind Library to document and test your models, and to upload to the ValidMind Platform. + +## Python Library API + + +### RawData() + + +**Import Path**: `validmind.vm_models.result.RawData` + +### \_\_version\_\_ + +```python +2.8.0 +``` + + +### get_test_suite() + +```python +def get_test_suite( + test_suite_id: str = None, + section: str = None, + args = (), + kwargs = {} +) -> validmind.vm_models.TestSuite: +``` + +Gets a TestSuite object for the current project or a specific test suite + +This function provides an interface to retrieve the TestSuite instance for the +current project or a specific TestSuite instance identified by test_suite_id. +The project Test Suite will contain sections for every section in the project's +documentation template and these Test Suite Sections will contain all the tests +associated with that template section. + +**Arguments** + +- **test_suite_id (str, optional)****: The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. +- **section (str, optional)**: The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. +- **args**: Additional arguments to pass to the TestSuite +- **kwargs**: Additional keyword arguments to pass to the TestSuite + +### init() + +```python +def init( + project: Optional = None, + api_key: Optional = None, + api_secret: Optional = None, + api_host: Optional = None, + model: Optional = None, + monitoring: bool = False +) +``` + +Initializes the API client instances and calls the /ping endpoint to ensure +the provided credentials are valid and we can connect to the ValidMind API. + +If the API key and secret are not provided, the client will attempt to +retrieve them from the environment variables `VM_API_KEY` and `VM_API_SECRET`. + +**Arguments** + +- **project (str, optional)****: The project CUID. Alias for model. Defaults to None. ^[**Deprecation notice**
`project (str, optional)**` has been deprecated and will be removed in a future release.] +- **model (str, optional)**: The model CUID. Defaults to None. +- **api_key (str, optional)**: The API key. Defaults to None. +- **api_secret (str, optional)**: The API secret. Defaults to None. +- **api_host (str, optional)**: The API host. Defaults to None. +- **monitoring (bool)**: The ongoing monitoring flag. Defaults to False. + +**Raises** + +- **ValueError**: If the API key and secret are not provided + +### init_dataset() + +```python +def init_dataset( + dataset, + model = None, + index = None, + index_name: str = None, + date_time_index: bool = False, + columns: list = None, + text_column: str = None, + target_column: str = None, + feature_columns: list = None, + extra_columns: dict = None, + class_labels: dict = None, + type: str = None, + input_id: str = None, + __log = True +) -> validmind.vm_models.dataset.VMDataset: +``` + +Initializes a VM Dataset, which can then be passed to other functions +that can perform additional analysis and tests on the data. This function +also ensures we are reading a valid dataset type. + +The following dataset types are supported: + +- Pandas DataFrame +- Polars DataFrame +- Numpy ndarray +- Torch TensorDataset + +**Arguments** + +- **dataset ****: dataset from various python libraries +- **model (VMModel)**: ValidMind model object +- **targets (vm.vm.DatasetTargets)**: A list of target variables +- **target_column (str)**: The name of the target column in the dataset +- **feature_columns (list)**: A list of names of feature columns in the dataset +- **extra_columns (dictionary)**: A dictionary containing the names of the +- prediction_column and group_by_columns in the dataset +- **class_labels (dict)**: A list of class labels for classification problems +- **type (str)**: The type of dataset (one of DATASET_TYPES) +- **input_id (str)**: The input ID for the dataset (e.g. "my_dataset"). By default, this will be set to `dataset` but if you are passing this dataset as a test input using some other key than `dataset`, then you should set this to the same key. + +**Raises** + +- **ValueError**: If the dataset type is not supported + +**Returns** + +- **vm.vm.Dataset**: A VM Dataset instance + +### init_model() + +```python +def init_model( + model: object = None, + input_id: str = 'model', + attributes: dict = None, + predict_fn: callable = None, + __log = True, + kwargs = {} +) -> validmind.vm_models.model.VMModel: +``` + +Initializes a VM Model, which can then be passed to other functions +that can perform additional analysis and tests on the data. This function +also ensures we are creating a model supported libraries. + +**Arguments** + +- **model****: A trained model or VMModel instance +- **input_id (str)**: The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. +- **attributes (dict)**: A dictionary of model attributes +- **predict_fn (callable)**: A function that takes an input and returns a prediction +- ****kwargs**: Additional arguments to pass to the model + +**Raises** + +- **ValueError**: If the model type is not supported + +**Returns** + +- **vm.VMModel**: A VM Model instance + +### init_r_model() + +```python +def init_r_model( + model_path: str, + input_id: str = 'model' +) -> validmind.vm_models.model.VMModel: +``` + +Initializes a VM Model for an R model + +R models must be saved to disk and the filetype depends on the model type... +Currently we support the following model types: + +- LogisticRegression `glm` model in R**: saved as an RDS file with `saveRDS` +- LinearRegression `lm` model in R: saved as an RDS file with `saveRDS` +- XGBClassifier: saved as a .json or .bin file with `xgb.save` +- XGBRegressor: saved as a .json or .bin file with `xgb.save` + +LogisticRegression and LinearRegression models are converted to sklearn models by extracting +the coefficients and intercept from the R model. XGB models are loaded using the xgboost +since xgb models saved in .json or .bin format can be loaded directly with either Python or R + +**Arguments** + +- **model_path (str)**: The path to the R model saved as an RDS or XGB file +- **model_type (str)**: The type of the model (one of R_MODEL_TYPES) + +**Returns** + +- **vm.vm.Model**: A VM Model instance + +### log_metric() + +```python +def log_metric( + key: str, + value: float, + inputs: Optional = None, + params: Optional = None, + recorded_at: Optional = None, + thresholds: Optional = None +) +``` + +Logs a unit metric + +Unit metrics are key-value pairs where the key is the metric name and the value is +a scalar (int or float). These key-value pairs are associated with the currently +selected model (inventory model in the ValidMind Platform) and keys can be logged +to over time to create a history of the metric. On the ValidMind Platform, these metrics +will be used to create plots/visualizations for documentation and dashboards etc. + +**Arguments** + +- **key (str)****: The metric key +- **value (float)**: The metric value +- **inputs (list, optional)**: A list of input IDs that were used to compute the metric. +- **params (dict, optional)**: Dictionary of parameters used to compute the metric. +- **recorded_at (str, optional)**: The timestamp of the metric. Server will use current time if not provided. +- **thresholds (dict, optional)**: Dictionary of thresholds for the metric. + +### preview_template() + +```python +def preview_template() +``` + +Preview the documentation template for the current project + +This function will display the documentation template for the current project. If +the project has not been initialized, then an error will be raised. + +**Raises** + +- **ValueError****: If the project has not been initialized + +### print_env() + + +**Import Path**: `validmind.tests.run.print_env` + +### reload() + +```python +def reload() +``` + +Reconnect to the ValidMind API and reload the project configuration + +### run_documentation_tests() + +```python +def run_documentation_tests( + section = None, + send = True, + fail_fast = False, + inputs = None, + config = None, + kwargs = {} +) +``` + +Collect and run all the tests associated with a template + +This function will analyze the current project's documentation template and collect +all the tests associated with it into a test suite. It will then run the test +suite, log the results to the ValidMind API, and display them to the user. + +**Arguments** + +- **section (str or list, optional)****: The section(s) to preview. Defaults to None. +- **send (bool, optional)**: Whether to send the results to the ValidMind API. Defaults to True. +- **fail_fast (bool, optional)**: Whether to stop running tests after the first failure. Defaults to False. +- **inputs (dict, optional)**: A dictionary of test inputs to pass to the TestSuite +- **config**: A dictionary of test parameters to override the defaults +- ****kwargs**: backwards compatibility for passing in test inputs using keyword arguments + +**Returns** + +- **TestSuite or dict**: The completed TestSuite instance or a dictionary of TestSuites if section is a list. + +**Raises** + +- **ValueError**: If the project has not been initialized + +### run_test_suite() + +```python +def run_test_suite( + test_suite_id, + send = True, + fail_fast = False, + config = None, + inputs = None, + kwargs = {} +) +``` + +High Level function for running a test suite + +This function provides a high level interface for running a test suite. A test suite is +a collection of tests. This function will automatically find the correct test suite +class based on the test_suite_id, initialize each of the tests, and run them. + +**Arguments** + +- **test_suite_id (str)****: The test suite name (e.g. 'classifier_full_suite') +- **config (dict, optional)**: A dictionary of parameters to pass to the tests in the test suite. Defaults to None. +- **send (bool, optional)**: Whether to post the test results to the API. send=False is useful for testing. Defaults to True. +- **fail_fast (bool, optional)**: Whether to stop running tests after the first failure. Defaults to False. +- **inputs (dict, optional)**: A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` `models` etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. +- ****kwargs**: backwards compatibility for passing in test inputs using keyword arguments + +**Raises** + +- **ValueError**: If the test suite name is not found or if there is an error initializing the test suite + +**Returns** + +- **TestSuite**: the TestSuite instance + +### tags() + +```python +def tags(tags* = ()): +``` + + +Decorator for specifying tags for a test. + +**Arguments** + +- ***tags****: The tags to apply to the test. + + +### tasks() + +```python +def tasks(tasks* = ()): +``` + + +Decorator for specifying the task types that a test is designed for. + +**Arguments** + +- ***tasks****: The task types that the test is designed for. + + +### test() + +```python +def test(func_or_id): +``` + + +Decorator for creating and registering custom tests + +This decorator registers the function it wraps as a test function within ValidMind +under the provided ID. Once decorated, the function can be run using the +`validmind.tests.run_test` function. + +The function can take two different types of arguments: + +- Inputs**: ValidMind model or dataset (or list of models/datasets). These arguments + must use the following names: `model`, `models`, `dataset`, `datasets`. +- Parameters: Any additional keyword arguments of any type (must have a default + value) that can have any name. + +The function should return one of the following types: + +- Table: Either a list of dictionaries or a pandas DataFrame +- Plot: Either a matplotlib figure or a plotly figure +- Scalar: A single number (int or float) +- Boolean: A single boolean value indicating whether the test passed or failed + +The function may also include a docstring. This docstring will be used and logged +as the metric's description. + +**Arguments** + +- **func**: The function to decorate +- **test_id**: The identifier for the metric. If not provided, the function name is used. + +**Returns** + +- The decorated function. + + +## Submodules + + + + + + +### \_\_version\_\_ + + + + + + + + +### datasets + + +Example datasets that can be used with the ValidMind Library. + +### classification + + +Entrypoint for classification datasets. + + + + +#### customer_churn + + + + + + +####### get_demo_test_config() + +```python +def get_demo_test_config(test_suite = None) +``` + + +Returns input configuration for the default documentation +template assigned to this demo model + +The default documentation template uses the following inputs: + +- raw_dataset +- train_dataset +- test_dataset +- model + +We assign the following inputs depending on the input config expected +by each test: + +- When a test expects a "dataset" we use the raw_dataset +- When a tets expects "datasets" we use the train_dataset and test_dataset +- When a test expects a "model" we use the model +- When a test expects "model" and "dataset" we use the model and test_dataset +- The only exception is ClassifierPerformance since that runs twice**: once +- with the train_dataset (in sample) and once with the test_dataset (out of sample) + + + + +####### load_data() + +```python +def load_data(full_dataset = False) +``` + + + + + +####### preprocess() + +```python +def preprocess(df) +``` + + + + + + + + +#### taiwan_credit + + + + + + +####### load_data() + +```python +def load_data() +``` + + + + + +####### preprocess() + +```python +def preprocess(df) +``` + + + + + + + + + + + + +### credit_risk + + +Entrypoint for credit risk datasets. + + + + +#### lending_club + + + + + + +####### compute_scores() + +```python +def compute_scores(probabilities) +``` + + + + + +####### feature_engineering() + +```python +def feature_engineering(df, verbose = True) +``` + + + + + +####### get_demo_test_config() + +```python +def get_demo_test_config(x_test = None, y_test = None) +``` + + +Get demo test configuration. + +**Arguments** + +- **x_test****: Test features DataFrame +- **y_test**: Test target Series + +**Returns** + +- **dict**: Test configuration dictionary + + + + +####### init_vm_objects() + +```python +def init_vm_objects(scorecard) +``` + + + + + +####### load_data() + +```python +def load_data(source = 'online', verbose = True) +``` + + +Load data from either an online source or offline files, automatically dropping specified columns for offline data. + + +**Parameters** + +- **source**: 'online' for online data, 'offline' for offline files. Defaults to 'online'. + +**Returns** + +- DataFrame containing the loaded data. + + + + +####### load_scorecard() + +```python +def load_scorecard() +``` + + + + + +####### load_test_config() + +```python +def load_test_config(scorecard) +``` + + + + + +####### preprocess() + +```python +def preprocess(df, verbose = True) +``` + + + + + +####### split() + +```python +def split(df, validation_size = None, test_size = 0.2, add_constant = False, verbose = True) +``` + + +Split dataset into train, validation (optional), and test sets. + +**Arguments** + +- **df****: Input DataFrame +- **validation_split**: If None, returns train/test split. If float, returns train/val/test split +- **test_size**: Proportion of data for test set (default: 0.2) +- **add_constant**: Whether to add constant column for statsmodels (default: False) + +**Returns** + +- **If validation_size is None**: train_df, test_df +- **If validation_size is float**: train_df, validation_df, test_df + + + + +####### woe_encoding() + +```python +def woe_encoding(df, verbose = True) +``` + + + + + + + + +#### lending_club_bias + + + + + + +####### compute_scores() + +```python +def compute_scores(probabilities) +``` + + + + + +####### load_data() + +```python +def load_data() +``` + + +Load data from the specified CSV file. + +:return**: DataFrame containing the loaded data. + + + + +####### preprocess() + +```python +def preprocess(df) +``` + + + + + +####### split() + +```python +def split(df, test_size = 0.3) +``` + + + + + + + + + + + + +### nlp + + +Example datasets that can be used with the ValidMind Library. + + + + +#### cnn_dailymail + + + + + + +####### display_nice() + +```python +def display_nice(df, num_rows = None) +``` + + +Primary function to format and display a DataFrame. + + + + +####### load_data() + +```python +def load_data(source = 'online', dataset_size = None) +``` + + +Load data from either online source or offline files. + + +**Parameters** + +- **source**: 'online' for online data, 'offline' for offline data. Defaults to 'online'. + +**Parameters** + +- **dataset_size: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. + +**Returns** + +- DataFrame containing the loaded data. + + + + + + + +#### twitter_covid_19 + + + + + + +####### load_data() + +```python +def load_data(full_dataset = False) +``` + + + + + + + + + + + + +### regression + + +Entrypoint for regression datasets + + + + +#### california_housing + + + + + + +####### load_data() + +```python +def load_data(full_dataset = False) +``` + + + + + +####### preprocess() + +```python +def preprocess(df) +``` + + + + + + + + +#### fred + + + + + + +####### load_all_data() + +```python +def load_all_data() +``` + + + + + +####### load_data() + +```python +def load_data() +``` + + + + + +####### load_model() + +```python +def load_model(model_name) +``` + + + + + +####### load_processed_data() + +```python +def load_processed_data() +``` + + + + + +####### load_test_dataset() + +```python +def load_test_dataset(model_name) +``` + + + + + +####### load_train_dataset() + +```python +def load_train_dataset(model_path) +``` + + + + + +####### preprocess() + +```python +def preprocess(df, split_option = 'train_test_val', train_size = 0.6, test_size = 0.2) +``` + + +Split a time series DataFrame into train, validation, and test sets. + +Parameters: +- **df (pandas.DataFrame)****: The time series DataFrame to be split. +- **split_option (str)**: The split option to choose from: 'train_test_val' (default) or 'train_test'. +- **train_size (float)**: The proportion of the dataset to include in the training set. Default is 0.6. +- **test_size (float)**: The proportion of the dataset to include in the test set. Default is 0.2. + +**Returns** + +- **train_df (pandas.DataFrame)**: The training set. +- **validation_df (pandas.DataFrame)**: The validation set (only returned if split_option is 'train_test_val'). +- **test_df (pandas.DataFrame)**: The test set. + + + + +####### transform() + +```python +def transform(df, transform_func = 'diff') +``` + + + + + + + + +#### fred_timeseries + + + + + + +####### align_date_range() + +```python +def align_date_range(dfs, start_date, end_date) +``` + + + + + +####### convert_to_levels() + +```python +def convert_to_levels(diff_df, original_df, target_column) +``` + + +Convert differenced data back to original levels. + + + + +####### get_common_date_range() + +```python +def get_common_date_range(dfs) +``` + + + + + +####### get_demo_test_config() + +```python +def get_demo_test_config() +``` + + + + + +####### load_data() + +```python +def load_data() +``` + + + + + + + + + +###### identify_frequencies() + +```python +def identify_frequencies(df) +``` + + +Identify the frequency of each series in the DataFrame. + + +**Parameters** + +- **df**: Time-series DataFrame + +**Returns** + +- DataFrame with two columns: 'Variable' and 'Frequency' + + + +#### lending_club + + + + + + +####### load_data() + +```python +def load_data() +``` + + + + + +####### preprocess() + +```python +def preprocess(df, split_option = 'train_test_val', train_size = 0.6, test_size = 0.2) +``` + + +Split a time series DataFrame into train, validation, and test sets. + +Parameters: +- **df (pandas.DataFrame)****: The time series DataFrame to be split. +- **split_option (str)**: The split option to choose from: 'train_test_val' (default) or 'train_test'. +- **train_size (float)**: The proportion of the dataset to include in the training set. Default is 0.6. +- **test_size (float)**: The proportion of the dataset to include in the test set. Default is 0.2. + +**Returns** + +- **train_df (pandas.DataFrame)**: The training set. +- **validation_df (pandas.DataFrame)**: The validation set (only returned if split_option is 'train_test_val'). +- **test_df (pandas.DataFrame)**: The test set. + + + + +####### transform() + +```python +def transform(df, transform_func = 'diff') +``` + + + + + + + + + +###### resample_to_common_frequency() + +```python +def resample_to_common_frequency(df, common_frequency = 'MS') +``` + + + + + + + + + + + +### errors + + +This module contains all the custom errors that are used in the ValidMind Library. + +The following base errors are defined for others: +- BaseError +- APIRequestError + +#### class APIRequestError(BaseError) + +Generic error for API request errors that are not known. + + +#### class BaseError(Exception) + + + + + + +##### description() +```python +def description(self, args = (), kwargs = {}): +``` + + +##### message() +```python +def message(): +``` + +#### class GetTestSuiteError(BaseError) + +When the test suite could not be found. + + +#### class InitializeTestSuiteError(BaseError) + +When the test suite was found but could not be initialized. + + +#### class InvalidAPICredentialsError(APIRequestError) + + + + + + +##### description() +```python +def description(self, args = (), kwargs = {}): +``` + +#### class InvalidContentIdPrefixError(APIRequestError) + +When an invalid text content_id is sent to the API. + + +#### class InvalidInputError(BaseError) + +When an invalid input object. + + +#### class InvalidMetricResultsError(APIRequestError) + +When an invalid metric results object is sent to the API. + + +#### class InvalidProjectError(APIRequestError) + + + + + + +##### description() +```python +def description(self, args = (), kwargs = {}): +``` + +#### class InvalidRequestBodyError(APIRequestError) + +When a POST/PUT request is made with an invalid request body. + + +#### class InvalidTestParametersError(BaseError) + +When an invalid parameters for the test. + + +#### class InvalidTestResultsError(APIRequestError) + +When an invalid test results object is sent to the API. + + +#### class InvalidTextObjectError(APIRequestError) + +When an invalid Metadat (Text) object is sent to the API. + + +#### class InvalidValueFormatterError(BaseError) + +When an invalid value formatter is provided when serializing results. + + +#### class InvalidXGBoostTrainedModelError(BaseError) + +When an invalid XGBoost trained model is used when calling init_r_model. + + +#### class LoadTestError(BaseError) + +Exception raised when an error occurs while loading a test + + + + +##### original_error() +```python +def original_error(): +``` + +Exception raised when an error occurs while loading a test + +#### class MismatchingClassLabelsError(BaseError) + +When the class labels found in the dataset don't match the provided target labels. + + +#### class MissingAPICredentialsError(BaseError) + + + + + + +##### description() +```python +def description(self, args = (), kwargs = {}): +``` + +#### class MissingCacheResultsArgumentsError(BaseError) + +When the cache_results function is missing arguments. + + +#### class MissingClassLabelError(BaseError) + +When the one or more class labels are missing from provided dataset targets. + + +#### class MissingDependencyError(BaseError) + +When a required dependency is missing. + + + + +##### extra() +```python +def extra(): +``` + +When a required dependency is missing. + + +##### required_dependencies() +```python +def required_dependencies(): +``` + +When a required dependency is missing. + +#### class MissingDocumentationTemplate(BaseError) + +When the client config is missing the documentation template. + + +#### class MissingModelIdError(BaseError) + + + + + + +##### description() +```python +def description(self, args = (), kwargs = {}): +``` + +#### class MissingOrInvalidModelPredictFnError(BaseError) + +When the pytorch model is missing a predict function or its predict +method does not have the expected arguments. + + +#### class MissingRExtrasError(BaseError) + +When the R extras have not been installed. + + + + +##### description() +```python +def description(self, args = (), kwargs = {}): +``` + +When the R extras have not been installed. + +#### class MissingRequiredTestInputError(BaseError) + +When a required test context variable is missing. + + +#### class MissingTextContentIdError(APIRequestError) + +When a Text object is sent to the API without a content_id. + + +#### class MissingTextContentsError(APIRequestError) + +When a Text object is sent to the API without a "text" attribute. + + +#### class SkipTestError(BaseError) + +Useful error to throw when a test cannot be executed. + + +#### class TestInputInvalidDatasetError(BaseError) + +When an invalid dataset is used in a test context. + + +#### class UnsupportedColumnTypeError(BaseError) + +When an unsupported column type is found on a dataset. + + +#### class UnsupportedDatasetError(BaseError) + +When an unsupported dataset is used. + + +#### class UnsupportedFigureError(BaseError) + +When an unsupported figure object is constructed. + + +#### class UnsupportedModelError(BaseError) + +When an unsupported model is used. + + +#### class UnsupportedModelForSHAPError(BaseError) + +When an unsupported model is used for SHAP importance. + + +#### class UnsupportedRModelError(BaseError) + +When an unsupported R model is used. + + + +##### raise_api_error() + +```python +def raise_api_error(error_string) +``` + + +Safely try to parse JSON from the response message in case the API +returns a non-JSON string or if the API returns a non-standard error + + + + +##### should_raise_on_fail_fast() + +```python +def should_raise_on_fail_fast(error) -> bool +``` + + +Determine whether an error should be raised when fail_fast is True. + + + + + + + + + + + + + + + + + + + + + + + + + +### test_suites + + +Entrypoint for test suites. + +### classifier + + +Test suites for sklearn-compatible classifier models + +Ideal setup is to have the API client to read a +custom test suite from the project's configuration + + + + +##### class ClassifierDiagnosis(TestSuite) + +Test suite for sklearn classifier model diagnosis tests + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for sklearn classifier model diagnosis tests + + +###### tests() +```python +def tests(): +``` + +Test suite for sklearn classifier model diagnosis tests + +##### class ClassifierFullSuite(TestSuite) + +Full test suite for binary classification models. + + + + +###### suite_id() +```python +def suite_id(): +``` + +Full test suite for binary classification models. + + +###### tests() +```python +def tests(): +``` + +Full test suite for binary classification models. + +##### class ClassifierMetrics(TestSuite) + +Test suite for sklearn classifier metrics + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for sklearn classifier metrics + + +###### tests() +```python +def tests(): +``` + +Test suite for sklearn classifier metrics + +##### class ClassifierModelValidation(TestSuite) + +Test suite for binary classification models. + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for binary classification models. + + +###### tests() +```python +def tests(): +``` + +Test suite for binary classification models. + +##### class ClassifierPerformance(TestSuite) + +Test suite for sklearn classifier models + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for sklearn classifier models + + +###### tests() +```python +def tests(): +``` + +Test suite for sklearn classifier models + + + + + +### cluster + + +Test suites for sklearn-compatible clustering models + +Ideal setup is to have the API client to read a +custom test suite from the project's configuration + + + + +##### class ClusterFullSuite(TestSuite) + +Full test suite for clustering models. + + + + +###### suite_id() +```python +def suite_id(): +``` + +Full test suite for clustering models. + + +###### tests() +```python +def tests(): +``` + +Full test suite for clustering models. + +##### class ClusterMetrics(TestSuite) + +Test suite for sklearn clustering metrics + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for sklearn clustering metrics + + +###### tests() +```python +def tests(): +``` + +Test suite for sklearn clustering metrics + +##### class ClusterPerformance(TestSuite) + +Test suite for sklearn cluster performance + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for sklearn cluster performance + + +###### tests() +```python +def tests(): +``` + +Test suite for sklearn cluster performance + + + + + + +##### describe_suite() + +```python +def describe_suite(test_suite_id: str, verbose = False) +``` + + +Describes a Test Suite by ID + +**Arguments** + +- **test_suite_id****: Test Suite ID +- **verbose**: If True, describe all plans and tests in the Test Suite + +**Returns** + +- **pandas.DataFrame**: A formatted table with the Test Suite description + + + +### embeddings + + +Test suites for embeddings models + +Ideal setup is to have the API client to read a +custom test suite from the project's configuration + + + + +##### class EmbeddingsFullSuite(TestSuite) + +Full test suite for embeddings models. + + + + +###### suite_id() +```python +def suite_id(): +``` + +Full test suite for embeddings models. + + +###### tests() +```python +def tests(): +``` + +Full test suite for embeddings models. + +##### class EmbeddingsMetrics(TestSuite) + +Test suite for embeddings metrics + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for embeddings metrics + + +###### tests() +```python +def tests(): +``` + +Test suite for embeddings metrics + +##### class EmbeddingsPerformance(TestSuite) + +Test suite for embeddings model performance + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for embeddings model performance + + +###### tests() +```python +def tests(): +``` + +Test suite for embeddings model performance + + + + + + +##### get_by_id() + +```python +def get_by_id(test_suite_id: str) +``` + + +Returns the test suite by ID + + + + +##### list_suites() + +```python +def list_suites(pretty: bool = True) +``` + + +Returns a list of all available test suites + + + +### llm + + +Test suites for LLMs + + + + +##### class LLMClassifierFullSuite(TestSuite) + +Full test suite for LLM classification models. + + + + +###### suite_id() +```python +def suite_id(): +``` + +Full test suite for LLM classification models. + + +###### tests() +```python +def tests(): +``` + +Full test suite for LLM classification models. + +##### class PromptValidation(TestSuite) + +Test suite for prompt validation + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for prompt validation + + +###### tests() +```python +def tests(): +``` + +Test suite for prompt validation + + + + + +### nlp + + +Test suites for NLP models + + + + +##### class NLPClassifierFullSuite(TestSuite) + +Full test suite for NLP classification models. + + + + +###### suite_id() +```python +def suite_id(): +``` + +Full test suite for NLP classification models. + + +###### tests() +```python +def tests(): +``` + +Full test suite for NLP classification models. + + + + + +### parameters_optimization + + +Test suites for sklearn-compatible hyper parameters tunning + +Ideal setup is to have the API client to read a +custom test suite from the project's configuration + + + + +##### class KmeansParametersOptimization(TestSuite) + +Test suite for sklearn hyperparameters optimization + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for sklearn hyperparameters optimization + + +###### tests() +```python +def tests(): +``` + +Test suite for sklearn hyperparameters optimization + + + + + + +##### register_test_suite() + +```python +def register_test_suite(suite_id: str, suite: TestSuite) +``` + + +Registers a custom test suite + + + +### regression + + + + + +##### class RegressionFullSuite(TestSuite) + +Full test suite for regression models. + + + + +###### suite_id() +```python +def suite_id(): +``` + +Full test suite for regression models. + + +###### tests() +```python +def tests(): +``` + +Full test suite for regression models. + +##### class RegressionMetrics(TestSuite) + +Test suite for performance metrics of regression metrics + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for performance metrics of regression metrics + + +###### tests() +```python +def tests(): +``` + +Test suite for performance metrics of regression metrics + +##### class RegressionPerformance(TestSuite) + +Test suite for regression model performance + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for regression model performance + + +###### tests() +```python +def tests(): +``` + +Test suite for regression model performance + + + + + +### statsmodels_timeseries + + +Time Series Test Suites from statsmodels + + + + +##### class RegressionModelDescription(TestSuite) + +Test suite for performance metric of regression model of statsmodels library + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for performance metric of regression model of statsmodels library + + +###### tests() +```python +def tests(): +``` + +Test suite for performance metric of regression model of statsmodels library + +##### class RegressionModelsEvaluation(TestSuite) + +Test suite for metrics comparison of regression model of statsmodels library + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for metrics comparison of regression model of statsmodels library + + +###### tests() +```python +def tests(): +``` + +Test suite for metrics comparison of regression model of statsmodels library + + + + + +### summarization + + +Test suites for llm summarization models + + + + +##### class SummarizationMetrics(TestSuite) + +Test suite for Summarization metrics + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for Summarization metrics + + +###### tests() +```python +def tests(): +``` + +Test suite for Summarization metrics + + + + + +### tabular_datasets + + +Test suites for tabular datasets + + + + +##### class TabularDataQuality(TestSuite) + +Test suite for data quality on tabular datasets + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for data quality on tabular datasets + + +###### tests() +```python +def tests(): +``` + +Test suite for data quality on tabular datasets + +##### class TabularDataset(TestSuite) + +Test suite for tabular datasets. + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for tabular datasets. + + +###### tests() +```python +def tests(): +``` + +Test suite for tabular datasets. + +##### class TabularDatasetDescription(TestSuite) + +Test suite to extract metadata and descriptive +statistics from a tabular dataset + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite to extract metadata and descriptive +statistics from a tabular dataset + + +###### tests() +```python +def tests(): +``` + +Test suite to extract metadata and descriptive +statistics from a tabular dataset + + + + + +### text_data + + +Test suites for text datasets + + + + +##### class TextDataQuality(TestSuite) + +Test suite for data quality on text data + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for data quality on text data + + +###### tests() +```python +def tests(): +``` + +Test suite for data quality on text data + + + + + +### time_series + + +Time Series Test Suites + + + + +##### class TimeSeriesDataQuality(TestSuite) + +Test suite for data quality on time series datasets + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for data quality on time series datasets + + +###### tests() +```python +def tests(): +``` + +Test suite for data quality on time series datasets + +##### class TimeSeriesDataset(TestSuite) + +Test suite for time series datasets. + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for time series datasets. + + +###### tests() +```python +def tests(): +``` + +Test suite for time series datasets. + +##### class TimeSeriesModelValidation(TestSuite) + +Test suite for time series model validation. + + + + +###### suite_id() +```python +def suite_id(): +``` + +Test suite for time series model validation. + + +###### tests() +```python +def tests(): +``` + +Test suite for time series model validation. + +##### class TimeSeriesMultivariate(TestSuite) + +This test suite provides a preliminary understanding of the features +and relationship in multivariate dataset. It presents various +multivariate visualizations that can help identify patterns, trends, +and relationships between pairs of variables. The visualizations are +designed to explore the relationships between multiple features +simultaneously. They allow you to quickly identify any patterns or +trends in the data, as well as any potential outliers or anomalies. +The individual feature distribution can also be explored to provide +insight into the range and frequency of values observed in the data. +This multivariate analysis test suite aims to provide an overview of +the data structure and guide further exploration and modeling. + + + + +###### suite_id() +```python +def suite_id(): +``` + +This test suite provides a preliminary understanding of the features +and relationship in multivariate dataset. It presents various +multivariate visualizations that can help identify patterns, trends, +and relationships between pairs of variables. The visualizations are +designed to explore the relationships between multiple features +simultaneously. They allow you to quickly identify any patterns or +trends in the data, as well as any potential outliers or anomalies. +The individual feature distribution can also be explored to provide +insight into the range and frequency of values observed in the data. +This multivariate analysis test suite aims to provide an overview of +the data structure and guide further exploration and modeling. + + +###### tests() +```python +def tests(): +``` + +This test suite provides a preliminary understanding of the features +and relationship in multivariate dataset. It presents various +multivariate visualizations that can help identify patterns, trends, +and relationships between pairs of variables. The visualizations are +designed to explore the relationships between multiple features +simultaneously. They allow you to quickly identify any patterns or +trends in the data, as well as any potential outliers or anomalies. +The individual feature distribution can also be explored to provide +insight into the range and frequency of values observed in the data. +This multivariate analysis test suite aims to provide an overview of +the data structure and guide further exploration and modeling. + +##### class TimeSeriesUnivariate(TestSuite) + +This test suite provides a preliminary understanding of the target variable(s) +used in the time series dataset. It visualizations that present the raw time +series data and a histogram of the target variable(s). + +The raw time series data provides a visual inspection of the target variable's +behavior over time. This helps to identify any patterns or trends in the data, +as well as any potential outliers or anomalies. The histogram of the target +variable displays the distribution of values, providing insight into the range +and frequency of values observed in the data. + + + + +###### suite_id() +```python +def suite_id(): +``` + +This test suite provides a preliminary understanding of the target variable(s) +used in the time series dataset. It visualizations that present the raw time +series data and a histogram of the target variable(s). + +The raw time series data provides a visual inspection of the target variable's +behavior over time. This helps to identify any patterns or trends in the data, +as well as any potential outliers or anomalies. The histogram of the target +variable displays the distribution of values, providing insight into the range +and frequency of values observed in the data. + + +###### tests() +```python +def tests(): +``` + +This test suite provides a preliminary understanding of the target variable(s) +used in the time series dataset. It visualizations that present the raw time +series data and a histogram of the target variable(s). + +The raw time series data provides a visual inspection of the target variable's +behavior over time. This helps to identify any patterns or trends in the data, +as well as any potential outliers or anomalies. The histogram of the target +variable displays the distribution of values, providing insight into the range +and frequency of values observed in the data. + + + + + + + + +### tests + + +ValidMind Tests Module + +### comparison + + + + + + +###### combine_results() + +```python +def combine_results(results: List) -> Tuple[, , ] +``` + + +Combine multiple test results into a single set of outputs. + +**Arguments** + +- **results****: A list of TestResult objects to combine. + +**Returns** + +- **A tuple containing**: - A list of combined outputs (tables and figures). - A dictionary of inputs with lists of all values. - A dictionary of parameters with lists of all values. + + + + +###### get_comparison_test_configs() + +```python +def get_comparison_test_configs(input_grid: Union = None, param_grid: Union = None, inputs: Union = None, params: Union = None) -> List[] +``` + + +Generate test configurations based on input and parameter grids. + +Function inputs should be validated before calling this. + +**Arguments** + +- **input_grid****: A dictionary or list defining the grid of inputs. +- **param_grid**: A dictionary or list defining the grid of parameters. +- **inputs**: A dictionary of inputs. +- **params**: A dictionary of parameters. + +**Returns** + +- A list of test configurations. + + + + + + + +### data_validation + + + + + +#### ACFandPACFPlot + + + + + + +####### ACFandPACFPlot() + +```python +def ACFandPACFPlot(dataset: VMDataset) +``` + + +Analyzes time series data using Autocorrelation Function (ACF) and Partial Autocorrelation Function (PACF) plots to +reveal trends and correlations. + +###### Purpose + +The ACF (Autocorrelation Function) and PACF (Partial Autocorrelation Function) plot test is employed to analyze +time series data in machine learning models. It illuminates the correlation of the data over time by plotting the +correlation of the series with its own lags (ACF), and the correlations after removing effects already accounted +for by earlier lags (PACF). This information can identify trends, such as seasonality, degrees of autocorrelation, +and inform the selection of order parameters for AutoRegressive Integrated Moving Average (ARIMA) models. + +###### Test Mechanism + +The `ACFandPACFPlot` test accepts a dataset with a time-based index. It first confirms the index is of a datetime +type, then handles any NaN values. The test subsequently generates ACF and PACF plots for each column in the +dataset, producing a subplot for each. If the dataset doesn't include key columns, an error is returned. + +###### Signs of High Risk + +- Sudden drops in the correlation at a specific lag might signal a model at high risk. +- Consistent high correlation across multiple lags could also indicate non-stationarity in the data, which may +suggest that a model estimated on this data won't generalize well to future, unknown data. + +###### Strengths + +- ACF and PACF plots offer clear graphical representations of the correlations in time series data. +- These plots are effective at revealing important data characteristics such as seasonality, trends, and +correlation patterns. +- The insights from these plots aid in better model configuration, particularly in the selection of ARIMA model +parameters. + +###### Limitations + +- ACF and PACF plots are exclusively for time series data and hence, can't be applied to all ML models. +- These plots require large, consistent datasets as gaps could lead to misleading results. +- The plots can only represent linear correlations and fail to capture any non-linear relationships within the data. +- The plots might be difficult for non-experts to interpret and should not replace more advanced analyses. + + + + + + + +#### ADF + + + + + + +####### ADF() + +```python +def ADF(dataset: VMDataset) +``` + + +Assesses the stationarity of a time series dataset using the Augmented Dickey-Fuller (ADF) test. + +###### Purpose + +The Augmented Dickey-Fuller (ADF) test metric is used to determine the order of integration, i.e., the stationarity +of a given time series dataset. The stationary property of data is pivotal in many machine learning models as it +impacts the reliability and effectiveness of predictions and forecasts. + +###### Test Mechanism + +The ADF test is executed using the `adfuller` function from the `statsmodels` library on each feature of the +dataset. Multiple outputs are generated for each run, including the ADF test statistic and p-value, count of lags +used, the number of observations considered in the test, critical values at various confidence levels, and the +information criterion. These results are stored for each feature for subsequent analysis. + +###### Signs of High Risk + +- An inflated ADF statistic and high p-value (generally above 0.05) indicate a high risk to the model's performance +due to the presence of a unit root indicating non-stationarity. +- Non-stationarity might result in untrustworthy or insufficient forecasts. + +###### Strengths + +- The ADF test is robust to sophisticated correlations within the data, making it suitable for settings where data +displays complex stochastic behavior. +- It provides explicit outputs like test statistics, critical values, and information criterion, enhancing +understanding and transparency in the model validation process. + +###### Limitations + +- The ADF test might demonstrate low statistical power, making it challenging to differentiate between a unit root +and near-unit-root processes, potentially causing false negatives. +- It assumes the data follows an autoregressive process, which might not always be the case. +- The test struggles with time series data that have structural breaks. + + + + + + + +#### AutoAR + + + + + + +####### AutoAR() + +```python +def AutoAR(dataset: VMDataset, max_ar_order: int = 3) +``` + + +Automatically identifies the optimal Autoregressive (AR) order for a time series using BIC and AIC criteria. + +###### Purpose + +The AutoAR test is intended to automatically identify the Autoregressive (AR) order of a time series by utilizing +the Bayesian Information Criterion (BIC) and Akaike Information Criterion (AIC). AR order is crucial in forecasting +tasks as it dictates the quantity of prior terms in the sequence to use for predicting the current term. The +objective is to select the most fitting AR model that encapsulates the trend and seasonality in the time series +data. + +###### Test Mechanism + +The test mechanism operates by iterating through a possible range of AR orders up to a defined maximum. An AR model +is fitted for each order, and the corresponding BIC and AIC are computed. BIC and AIC statistical measures are +designed to penalize models for complexity, preferring simpler models that fit the data proficiently. To verify the +stationarity of the time series, the Augmented Dickey-Fuller test is executed. The AR order, BIC, and AIC findings +are compiled into a dataframe for effortless comparison. Then, the AR order with the smallest BIC is established as +the desirable order for each variable. + +###### Signs of High Risk + +- An augmented Dickey Fuller test p-value > 0.05, indicating the time series isn't stationary, may lead to +inaccurate results. +- Problems with the model fitting procedure, such as computational or convergence issues. +- Continuous selection of the maximum specified AR order may suggest an insufficient set limit. + +###### Strengths + +- The test independently pinpoints the optimal AR order, thereby reducing potential human bias. +- It strikes a balance between model simplicity and goodness-of-fit to avoid overfitting. +- Has the capability to account for stationarity in a time series, an essential aspect for dependable AR modeling. +- The results are aggregated into a comprehensive table, enabling an easy interpretation. + +###### Limitations + +- The tests need a stationary time series input. +- They presume a linear relationship between the series and its lags. +- The search for the best model is constrained by the maximum AR order supplied in the parameters. Therefore, a low +max_ar_order could result in subpar outcomes. +- AIC and BIC may not always agree on the selection of the best model. This potentially requires the user to juggle +interpretational choices. + + + + + + + +#### AutoMA + + + + + + +####### AutoMA() + +```python +def AutoMA(dataset: VMDataset, max_ma_order: int = 3) +``` + + +Automatically selects the optimal Moving Average (MA) order for each variable in a time series dataset based on +minimal BIC and AIC values. + +###### Purpose + +The `AutoMA` metric serves an essential role of automated decision-making for selecting the optimal Moving Average +(MA) order for every variable in a given time series dataset. The selection is dependent on the minimalization of +BIC (Bayesian Information Criterion) and AIC (Akaike Information Criterion); these are established statistical +tools used for model selection. Furthermore, prior to the commencement of the model fitting process, the algorithm +conducts a stationarity test (Augmented Dickey-Fuller test) on each series. + +###### Test Mechanism + +Starting off, the `AutoMA` algorithm checks whether the `max_ma_order` parameter has been provided. It consequently +loops through all variables in the dataset, carrying out the Dickey-Fuller test for stationarity. For each +stationary variable, it fits an ARIMA model for orders running from 0 to `max_ma_order`. The result is a list +showcasing the BIC and AIC values of the ARIMA models based on different orders. The MA order, which yields the +smallest BIC, is chosen as the 'best MA order' for every single variable. The final results include a table +summarizing the auto MA analysis and another table listing the best MA order for each variable. + +###### Signs of High Risk + +- When a series is non-stationary (p-value>0.05 in the Dickey-Fuller test), the produced result could be inaccurate. +- Any error that arises in the process of fitting the ARIMA models, especially with a higher MA order, can +potentially indicate risks and might need further investigation. + +###### Strengths + +- The metric facilitates automation in the process of selecting the MA order for time series forecasting. This +significantly saves time and reduces efforts conventionally necessary for manual hyperparameter tuning. +- The use of both BIC and AIC enhances the likelihood of selecting the most suitable model. +- The metric ascertains the stationarity of the series prior to model fitting, thus ensuring that the underlying +assumptions of the MA model are fulfilled. + +###### Limitations + +- If the time series fails to be stationary, the metric may yield inaccurate results. Consequently, it necessitates +pre-processing steps to stabilize the series before fitting the ARIMA model. +- The metric adopts a rudimentary model selection process based on BIC and doesn't consider other potential model +selection strategies. Depending on the specific dataset, other strategies could be more appropriate. +- The 'max_ma_order' parameter must be manually input which doesn't always guarantee optimal performance, +especially when configured too low. +- The computation time increases with the rise in `max_ma_order`, hence, the metric may become computationally +costly for larger values. + + + + + + + +#### AutoStationarity + + + + + + +####### AutoStationarity() + +```python +def AutoStationarity(dataset: VMDataset, max_order: int = 5, threshold: float = 0.05) +``` + + +Automates Augmented Dickey-Fuller test to assess stationarity across multiple time series in a DataFrame. + +###### Purpose + +The AutoStationarity metric is intended to automatically detect and evaluate the stationary nature of each time +series in a DataFrame. It incorporates the Augmented Dickey-Fuller (ADF) test, a statistical approach used to +assess stationarity. Stationarity is a fundamental property suggesting that statistic features like mean and +variance remain unchanged over time. This is necessary for many time-series models. + +###### Test Mechanism + +The mechanism for the AutoStationarity test involves applying the Augmented Dicky-Fuller test to each time series +within the given dataframe to assess if they are stationary. Every series in the dataframe is looped, using the ADF +test up to a defined maximum order (configurable and by default set to 5). The p-value resulting from the ADF test +is compared against a predetermined threshold (also configurable and by default set to 0.05). The time series is +deemed stationary at its current differencing order if the p-value is less than the threshold. + +###### Signs of High Risk + +- A significant number of series not achieving stationarity even at the maximum order of differencing can indicate +high risk or potential failure in the model. +- This could suggest the series may not be appropriately modeled by a stationary process, hence other modeling +approaches might be required. + +###### Strengths + +- The key strength in this metric lies in the automation of the ADF test, enabling mass stationarity analysis +across various time series and boosting the efficiency and credibility of the analysis. +- The utilization of the ADF test, a widely accepted method for testing stationarity, lends authenticity to the +results derived. +- The introduction of the max order and threshold parameters give users the autonomy to determine their preferred +levels of stringency in the tests. + +###### Limitations + +- The Augmented Dickey-Fuller test and the stationarity test are not without their limitations. These tests are +premised on the assumption that the series can be modeled by an autoregressive process, which may not always hold +true. +- The stationarity check is highly sensitive to the choice of threshold for the significance level; an extremely +high or low threshold could lead to incorrect results regarding the stationarity properties. +- There's also a risk of over-differencing if the maximum order is set too high, which could induce unnecessary +cycles. + + + + + + + +#### BivariateScatterPlots + + + + + + +####### BivariateScatterPlots() + +```python +def BivariateScatterPlots(dataset) +``` + + +Generates bivariate scatterplots to visually inspect relationships between pairs of numerical predictor variables +in machine learning classification tasks. + +###### Purpose + +This function is intended for visual inspection and monitoring of relationships between pairs of numerical +variables in a machine learning model targeting classification tasks. It helps in understanding how predictor +variables (features) interact with each other, which can inform feature selection, model-building strategies, and +identify potential biases or irregularities in the data. + +###### Test Mechanism + +The function creates scatter plots for each pair of numerical features in the dataset. It first filters out +non-numerical and binary features, ensuring the plots focus on meaningful numerical relationships. The resulting +scatterplots are color-coded uniformly to avoid visual distraction, and the function returns a tuple of Plotly +figure objects, each representing a scatter plot for a pair of features. + +###### Signs of High Risk + +- Visual patterns suggesting non-linear relationships, multicollinearity, clustering, or outlier points in the +scatter plots. +- Such issues could affect the assumptions and performance of certain models, especially those assuming linearity, +like logistic regression. + +###### Strengths + +- Scatterplots provide an intuitive and visual tool to explore relationships between two variables. +- They are useful for identifying outliers, variable associations, and trends, including non-linear patterns. +- Supports visualization of binary or multi-class classification datasets, focusing on numerical features. + +###### Limitations + +- Scatterplots are limited to bivariate analysis, showing relationships between only two variables at a time. +- Not ideal for very large datasets where overlapping points can reduce the clarity of the visualization. +- Scatterplots are exploratory tools and do not provide quantitative measures of model quality or performance. +- Interpretation is subjective and relies on the domain knowledge and judgment of the viewer. + + + + + + + +#### BoxPierce + + + + + + +####### BoxPierce() + +```python +def BoxPierce(dataset) +``` + + +Detects autocorrelation in time-series data through the Box-Pierce test to validate model performance. + +###### Purpose + +The Box-Pierce test is utilized to detect the presence of autocorrelation in a time-series dataset. +Autocorrelation, or serial correlation, refers to the degree of similarity between observations based on the +temporal spacing between them. This test is essential for affirming the quality of a time-series model by ensuring +that the error terms in the model are random and do not adhere to a specific pattern. + +###### Test Mechanism + +The implementation of the Box-Pierce test involves calculating a test statistic along with a corresponding p-value +derived from the dataset features. These quantities are used to test the null hypothesis that posits the data to be +independently distributed. This is achieved by iterating over every feature column in the time-series data and +applying the `acorr_ljungbox` function of the statsmodels library. The function yields the Box-Pierce test +statistic as well as the respective p-value, all of which are cached as test results. + +###### Signs of High Risk + +- A low p-value, typically under 0.05 as per statistical convention, throws the null hypothesis of independence +into question. This implies that the dataset potentially houses autocorrelations, thus indicating a high-risk +scenario concerning model performance. +- Large Box-Pierce test statistic values may indicate the presence of autocorrelation. + +###### Strengths + +- Detects patterns in data that are supposed to be random, thereby ensuring no underlying autocorrelation. +- Can be computed efficiently given its low computational complexity. +- Can be widely applied to most regression problems, making it very versatile. + +###### Limitations + +- Assumes homoscedasticity (constant variance) and normality of residuals, which may not always be the case in +real-world datasets. +- May exhibit reduced power for detecting complex autocorrelation schemes such as higher-order or negative +correlations. +- It only provides a general indication of the existence of autocorrelation, without providing specific insights +into the nature or patterns of the detected autocorrelation. +- In the presence of trends or seasonal patterns, the Box-Pierce test may yield misleading results. +- Applicability is limited to time-series data, which limits its overall utility. + + + + + + + +#### ChiSquaredFeaturesTable + + + + + + +####### ChiSquaredFeaturesTable() + +```python +def ChiSquaredFeaturesTable(dataset, p_threshold = 0.05) +``` + + +Assesses the statistical association between categorical features and a target variable using the Chi-Squared test. + +###### Purpose + +The `ChiSquaredFeaturesTable` function is designed to evaluate the relationship between categorical features and a +target variable in a dataset. It performs a Chi-Squared test of independence for each categorical feature to +determine whether a statistically significant association exists with the target variable. This is particularly +useful in Model Risk Management for understanding the relevance of features and identifying potential biases in a +classification model. + +###### Test Mechanism + +The function creates a contingency table for each categorical feature and the target variable, then applies the +Chi-Squared test to compute the Chi-squared statistic and the p-value. The results for each feature include the +variable name, Chi-squared statistic, p-value, p-value threshold, and a pass/fail status based on whether the +p-value is below the specified threshold. The output is a DataFrame summarizing these results, sorted by p-value to +highlight the most statistically significant associations. + +###### Signs of High Risk + +- High p-values (greater than the set threshold) indicate a lack of significant association between a feature and +the target variable, resulting in a 'Fail' status. +- Features with a 'Fail' status might not be relevant for the model, which could negatively impact model +performance. + +###### Strengths + +- Provides a clear, statistical assessment of the relationship between categorical features and the target variable. +- Produces an easily interpretable summary with a 'Pass/Fail' outcome for each feature, helping in feature +selection. +- The p-value threshold is adjustable, allowing for flexibility in statistical rigor. + +###### Limitations + +- Assumes the dataset is tabular and consists of categorical variables, which may not be suitable for all datasets. +- The test is designed for classification tasks and is not applicable to regression problems. +- As with all hypothesis tests, the Chi-Squared test can only detect associations, not causal relationships. +- The choice of p-value threshold can affect the interpretation of feature relevance, and different thresholds may +lead to different conclusions. + + + + + + + +#### ClassImbalance + + +Threshold based tests + + + + + +####### ClassImbalance() + +```python +def ClassImbalance(dataset: VMDataset, min_percent_threshold: int = 10) -> Tuple[, , bool] +``` + + +Evaluates and quantifies class distribution imbalance in a dataset used by a machine learning model. + +###### Purpose + +The Class Imbalance test is designed to evaluate the distribution of target classes in a dataset that's utilized by +a machine learning model. Specifically, it aims to ensure that the classes aren't overly skewed, which could lead +to bias in the model's predictions. It's crucial to have a balanced training dataset to avoid creating a model +that's biased with high accuracy for the majority class and low accuracy for the minority class. + +###### Test Mechanism + +This Class Imbalance test operates by calculating the frequency (expressed as a percentage) of each class in the +target column of the dataset. It then checks whether each class appears in at least a set minimum percentage of the +total records. This minimum percentage is a modifiable parameter, but the default value is set to 10%. + +###### Signs of High Risk + +- Any class that represents less than the pre-set minimum percentage threshold is marked as high risk, implying a +potential class imbalance. +- The function provides a pass/fail outcome for each class based on this criterion. +- Fundamentally, if any class fails this test, it's highly likely that the dataset possesses imbalanced class +distribution. + +###### Strengths + +- The test can spot under-represented classes that could affect the efficiency of a machine learning model. +- The calculation is straightforward and swift. +- The test is highly informative because it not only spots imbalance, but it also quantifies the degree of +imbalance. +- The adjustable threshold enables flexibility and adaptation to differing use-cases or domain-specific needs. +- The test creates a visually insightful plot showing the classes and their corresponding proportions, enhancing +interpretability and comprehension of the data. + +###### Limitations + +- The test might struggle to perform well or provide vital insights for datasets with a high number of classes. In +such cases, the imbalance could be inevitable due to the inherent class distribution. +- Sensitivity to the threshold value might result in faulty detection of imbalance if the threshold is set +excessively high. +- Regardless of the percentage threshold, it doesn't account for varying costs or impacts of misclassifying +different classes, which might fluctuate based on specific applications or domains. +- While it can identify imbalances in class distribution, it doesn't provide direct methods to address or correct +these imbalances. +- The test is only applicable for classification operations and unsuitable for regression or clustering tasks. + + + + + + + +#### DatasetDescription + + + + + + +####### DatasetDescription() + +```python +def DatasetDescription(dataset: VMDataset) +``` + + +Provides comprehensive analysis and statistical summaries of each column in a machine learning model's dataset. + +###### Purpose + +The test depicted in the script is meant to run a comprehensive analysis on a Machine Learning model's datasets. +The test or metric is implemented to obtain a complete summary of the columns in the dataset, including vital +statistics of each column such as count, distinct values, missing values, histograms for numerical, categorical, +boolean, and text columns. This summary gives a comprehensive overview of the dataset to better understand the +characteristics of the data that the model is trained on or evaluates. + +###### Test Mechanism + +The DatasetDescription class accomplishes the purpose as follows**: firstly, the test method "run" infers the data +type of each column in the dataset and stores the details (id, column type). For each column, the +"describe_column" method is invoked to collect statistical information about the column, including count, +missing value count and its proportion to the total, unique value count, and its proportion to the total. Depending +on the data type of a column, histograms are generated that reflect the distribution of data within the column. +Numerical columns use the "get_numerical_histograms" method to calculate histogram distribution, whereas for +categorical, boolean and text columns, a histogram is computed with frequencies of each unique value in the +datasets. For unsupported types, an error is raised. Lastly, a summary table is built to aggregate all the +statistical insights and histograms of the columns in a dataset. + +###### Signs of High Risk + +- High ratio of missing values to total values in one or more columns which may impact the quality of the +predictions. +- Unsupported data types in dataset columns. +- Large number of unique values in the dataset's columns which might make it harder for the model to establish +patterns. +- Extreme skewness or irregular distribution of data as reflected in the histograms. + +###### Strengths + +- Provides a detailed analysis of the dataset with versatile summaries like count, unique values, histograms, etc. +- Flexibility in handling different types of data: numerical, categorical, boolean, and text. +- Useful in detecting problems in the dataset like missing values, unsupported data types, irregular data +distribution, etc. +- The summary gives a comprehensive understanding of dataset features allowing developers to make informed +decisions. + +###### Limitations + +- The computation can be expensive from a resource standpoint, particularly for large datasets with numerous columns. +- The histograms use an arbitrary number of bins which may not be the optimal number of bins for specific data +distribution. +- Unsupported data types for columns will raise an error which may limit evaluating the dataset. +- Columns with all null or missing values are not included in histogram computation. +- This test only validates the quality of the dataset but doesn't address the model's performance directly. + + + + +####### describe_column() + +```python +def describe_column(df, column) +``` + + +Gets descriptive statistics for a single column in a Pandas DataFrame. + + + + +####### get_column_histograms() + +```python +def get_column_histograms(df, column, type_) +``` + + +Returns a collection of histograms for a numerical or categorical column. +We store different combinations of bin sizes to allow analyzing the data better + +Will be used in favor of _get_histogram in the future + + + + +####### get_numerical_histograms() + +```python +def get_numerical_histograms(df, column) +``` + + +Returns a collection of histograms for a numerical column, each one +with a different bin size + + + + +####### infer_datatypes() + +```python +def infer_datatypes(df) +``` + + + + + + + + +#### DatasetSplit + + + + + + +####### DatasetSplit() + +```python +def DatasetSplit(datasets: List) +``` + + +Evaluates and visualizes the distribution proportions among training, testing, and validation datasets of an ML +model. + +###### Purpose + +The DatasetSplit test is designed to evaluate and visualize the distribution of data among training, testing, and +validation datasets, if available, within a given machine learning model. The main purpose is to assess whether the +model's datasets are split appropriately, as an imbalanced split might affect the model's ability to learn from the +data and generalize to unseen data. + +###### Test Mechanism + +The DatasetSplit test first calculates the total size of all available datasets in the model. Then, for each +individual dataset, the methodology involves determining the size of the dataset and its proportion relative to the +total size. The results are then conveniently summarized in a table that shows dataset names, sizes, and +proportions. Absolute size and proportion of the total dataset size are displayed for each individual dataset. + +###### Signs of High Risk + +- A very small training dataset, which may result in the model not learning enough from the data. +- A very large training dataset and a small test dataset, which may lead to model overfitting and poor +generalization to unseen data. +- A small or non-existent validation dataset, which might complicate the model's performance assessment. + +###### Strengths + +- The DatasetSplit test provides a clear, understandable visualization of dataset split proportions, which can +highlight any potential imbalance in dataset splits quickly. +- It covers a wide range of task types including classification, regression, and text-related tasks. +- The metric is not tied to any specific data type and is applicable to tabular data, time series data, or text +data. + +###### Limitations + +- The DatasetSplit test does not provide any insight into the quality or diversity of the data within each split, +just the size and proportion. +- The test does not give any recommendations or adjustments for imbalanced datasets. +- Potential lack of compatibility with more complex modes of data splitting (for example, stratified or time-based +splits) could limit the applicability of this test. + + + + + + + +#### DescriptiveStatistics + + + + + + +####### DescriptiveStatistics() + +```python +def DescriptiveStatistics(dataset: VMDataset) +``` + + +Performs a detailed descriptive statistical analysis of both numerical and categorical data within a model's +dataset. + +###### Purpose + +The purpose of the Descriptive Statistics metric is to provide a comprehensive summary of both numerical and +categorical data within a dataset. This involves statistics such as count, mean, standard deviation, minimum and +maximum values for numerical data. For categorical data, it calculates the count, number of unique values, most +common value and its frequency, and the proportion of the most frequent value relative to the total. The goal is to +visualize the overall distribution of the variables in the dataset, aiding in understanding the model's behavior +and predicting its performance. + +###### Test Mechanism + +The testing mechanism utilizes two in-built functions of pandas dataframes**: `describe()` for numerical fields and +`value_counts()` for categorical fields. The `describe()` function pulls out several summary statistics, while +`value_counts()` accounts for unique values. The resulting data is formatted into two distinct tables, one for +numerical and another for categorical variable summaries. These tables provide a clear summary of the main +characteristics of the variables, which can be instrumental in assessing the model's performance. + +###### Signs of High Risk + +- Skewed data or significant outliers can represent high risk. For numerical data, this may be reflected via a +significant difference between the mean and median (50% percentile). +- For categorical data, a lack of diversity (low count of unique values), or overdominance of a single category +(high frequency of the top value) can indicate high risk. + +###### Strengths + +- Provides a comprehensive summary of the dataset, shedding light on the distribution and characteristics of the +variables under consideration. +- It is a versatile and robust method, applicable to both numerical and categorical data. +- Helps highlight crucial anomalies such as outliers, extreme skewness, or lack of diversity, which are vital in +understanding model behavior during testing and validation. + +###### Limitations + +- While this metric offers a high-level overview of the data, it may fail to detect subtle correlations or complex +patterns. +- Does not offer any insights on the relationship between variables. +- Alone, descriptive statistics cannot be used to infer properties about future unseen data. +- Should be used in conjunction with other statistical tests to provide a comprehensive understanding of the +model's data. + + + + +####### get_summary_statistics_categorical() + +```python +def get_summary_statistics_categorical(df, categorical_fields) +``` + + + + + +####### get_summary_statistics_numerical() + +```python +def get_summary_statistics_numerical(df, numerical_fields) +``` + + + + + + + + +#### DickeyFullerGLS + + + + + + +####### DickeyFullerGLS() + +```python +def DickeyFullerGLS(dataset: VMDataset) +``` + + +Assesses stationarity in time series data using the Dickey-Fuller GLS test to determine the order of integration. + +###### Purpose + +The Dickey-Fuller GLS (DFGLS) test is utilized to determine the order of integration in time series data. For +machine learning models dealing with time series and forecasting, this metric evaluates the existence of a unit +root, thereby checking whether a time series is non-stationary. This analysis is a crucial initial step when +dealing with time series data. + +###### Test Mechanism + +This code implements the Dickey-Fuller GLS unit root test on each attribute of the dataset. This process involves +iterating through every column of the dataset and applying the DFGLS test to assess the presence of a unit root. +The resulting information, including the test statistic ('stat'), the p-value ('pvalue'), the quantity of lagged +differences utilized in the regression ('usedlag'), and the number of observations ('nobs'), is subsequently stored. + +###### Signs of High Risk + +- A high p-value for the DFGLS test represents a high risk. Specifically, a p-value above a typical threshold of +0.05 suggests that the time series data is quite likely to be non-stationary, thus presenting a high risk for +generating unreliable forecasts. + +###### Strengths + +- The Dickey-Fuller GLS test is a potent tool for checking the stationarity of time series data. +- It helps to verify the assumptions of the models before the actual construction of the machine learning models +proceeds. +- The results produced by this metric offer a clear insight into whether the data is appropriate for specific +machine learning models, especially those demanding the stationarity of time series data. + +###### Limitations + +- Despite its benefits, the DFGLS test does present some drawbacks. It can potentially lead to inaccurate +conclusions if the time series data incorporates a structural break. +- If the time series tends to follow a trend while still being stationary, the test might misinterpret it, +necessitating further detrending. +- The test also presents challenges when dealing with shorter time series data or volatile data, not producing +reliable results in these cases. + + + + + + + +#### Duplicates + + + + + + +####### Duplicates() + +```python +def Duplicates(dataset, min_threshold = 1) +``` + + +Tests dataset for duplicate entries, ensuring model reliability via data quality verification. + +###### Purpose + +The 'Duplicates' test is designed to check for duplicate rows within the dataset provided to the model. It serves +as a measure of data quality, ensuring that the model isn't merely memorizing duplicate entries or being swayed by +redundant information. This is an important step in the pre-processing of data for both classification and +regression tasks. + +###### Test Mechanism + +This test operates by checking each row for duplicates in the dataset. If a text column is specified in the +dataset, the test is conducted on this column; if not, the test is run on all feature columns. The number and +percentage of duplicates are calculated and returned in a DataFrame. Additionally, a test is passed if the total +count of duplicates falls below a specified minimum threshold. + +###### Signs of High Risk + +- A high number of duplicate rows in the dataset, which can lead to overfitting where the model performs well on +the training data but poorly on unseen data. +- A high percentage of duplicate rows in the dataset, indicating potential problems with data collection or +processing. + +###### Strengths + +- Assists in improving the reliability of the model's training process by ensuring the training data is not +contaminated with duplicate entries, which can distort statistical analyses. +- Provides both absolute numbers and percentage values of duplicate rows, giving a thorough overview of data +quality. +- Highly customizable as it allows for setting a user-defined minimum threshold to determine if the test has been +passed. + +###### Limitations + +- Does not distinguish between benign duplicates (i.e., coincidental identical entries in different rows) and +problematic duplicates originating from data collection or processing errors. +- The test becomes more computationally intensive as the size of the dataset increases, which might not be suitable +for very large datasets. +- Can only check for exact duplicates and may miss semantically similar information packaged differently. + + + + + + + +#### EngleGrangerCoint + + + + + + +####### EngleGrangerCoint() + +```python +def EngleGrangerCoint(dataset: VMDataset, threshold: float = 0.05) +``` + + +Assesses the degree of co-movement between pairs of time series data using the Engle-Granger cointegration test. + +###### Purpose + +The intent of this Engle-Granger cointegration test is to explore and quantify the degree of co-movement between +pairs of time series variables in a dataset. This is particularly useful in enhancing the accuracy of predictive +regressions whenever the underlying variables are co-integrated, i.e., they move together over time. + +###### Test Mechanism + +The test first drops any non-applicable values from the input dataset and then iterates over each pair of variables +to apply the Engle-Granger cointegration test. The test generates a 'p' value, which is then compared against a +pre-specified threshold (0.05 by default). The pair is labeled as 'Cointegrated' if the 'p' value is less than or +equal to the threshold or 'Not cointegrated' otherwise. A summary table is returned by the metric showing +cointegration results for each variable pair. + +###### Signs of High Risk + +- A significant number of hypothesized cointegrated variables do not pass the test. +- A considerable number of 'p' values are close to the threshold, indicating minor data fluctuations can switch the +decision between 'Cointegrated' and 'Not cointegrated'. + +###### Strengths + +- Provides an effective way to analyze relationships between time series, particularly in contexts where it's +essential to check if variables move together in a statistically significant manner. +- Useful in various domains, especially finance or economics, where predictive models often hinge on understanding +how different variables move together over time. + +###### Limitations + +- Assumes that the time series are integrated of the same order, which isn't always true in multivariate time +series datasets. +- The presence of non-stationary characteristics in the series or structural breaks can result in falsely positive +or negative cointegration results. +- May not perform well for small sample sizes due to lack of statistical power and should be supplemented with +other predictive indicators for a more robust model evaluation. + + + + + + + +#### FeatureTargetCorrelationPlot + + + + + + +####### FeatureTargetCorrelationPlot() + +```python +def FeatureTargetCorrelationPlot(dataset, fig_height = 600) +``` + + +Visualizes the correlation between input features and the model's target output in a color-coded horizontal bar +plot. + +###### Purpose + +This test is designed to graphically illustrate the correlations between distinct input features and the target +output of a Machine Learning model. Understanding how each feature influences the model's predictions is crucial—a +higher correlation indicates a stronger influence of the feature on the target variable. This correlation study is +especially advantageous during feature selection and for comprehending the model's operation. + +###### Test Mechanism + +This FeatureTargetCorrelationPlot test computes and presents the correlations between the features and the target +variable using a specific dataset. These correlations are calculated and are then graphically represented in a +horizontal bar plot, color-coded based on the strength of the correlation. A hovering template can also be utilized +for informative tooltips. It is possible to specify the features to be analyzed and adjust the graph's height +according to need. + +###### Signs of High Risk + +- There are no strong correlations (either positive or negative) between features and the target variable. This +could suggest high risk as the supplied features do not appear to significantly impact the prediction output. +- The presence of duplicated correlation values might hint at redundancy in the feature set. + +###### Strengths + +- Provides visual assistance to interpreting correlations more effectively. +- Gives a clear and simple tour of how each feature affects the model's target variable. +- Beneficial for feature selection and grasping the model's prediction nature. +- Precise correlation values for each feature are offered by the hover template, contributing to a granular-level +comprehension. + +###### Limitations + +- The test only accepts numerical data, meaning variables of other types need to be prepared beforehand. +- The plot assumes all correlations to be linear, thus non-linear relationships might not be captured effectively. +- Not apt for models that employ complex feature interactions, like Decision Trees or Neural Networks, as the test +may not accurately reflect their importance. + + + + + + + +#### HighCardinality + + + + + + +####### HighCardinality() + +```python +def HighCardinality(dataset: VMDataset, num_threshold: int = 100, percent_threshold: float = 0.1, threshold_type: str = 'percent') +``` + + +Assesses the number of unique values in categorical columns to detect high cardinality and potential overfitting. + +###### Purpose + +The “High Cardinality” test is used to evaluate the number of unique values present in the categorical columns of a +dataset. In this context, high cardinality implies the presence of a large number of unique, non-repetitive values +in the dataset. + +###### Test Mechanism + +The test first infers the dataset's type and then calculates an initial numeric threshold based on the test +parameters. It only considers columns classified as "Categorical". For each of these columns, the number of +distinct values (n_distinct) and the percentage of distinct values (p_distinct) are calculated. The test will pass +if n_distinct is less than the calculated numeric threshold. Lastly, the results, which include details such as +column name, number of distinct values, and pass/fail status, are compiled into a table. + +###### Signs of High Risk + +- A large number of distinct values (high cardinality) in one or more categorical columns implies a high risk. +- A column failing the test (n_distinct >= num_threshold) is another indicator of high risk. + +###### Strengths + +- The High Cardinality test is effective in early detection of potential overfitting and unwanted noise. +- It aids in identifying potential outliers and inconsistencies, thereby improving data quality. +- The test can be applied to both classification and regression task types, demonstrating its versatility. + +###### Limitations + +- The test is restricted to only "Categorical" data types and is thus not suitable for numerical or continuous +features, limiting its scope. +- The test does not consider the relevance or importance of unique values in categorical features, potentially +causing it to overlook critical data points. +- The threshold (both number and percent) used for the test is static and may not be optimal for diverse datasets +and varied applications. Further mechanisms to adjust and refine this threshold could enhance its effectiveness. + + + + + + + +#### HighPearsonCorrelation + + + + + + +####### HighPearsonCorrelation() + +```python +def HighPearsonCorrelation(dataset: VMDataset, max_threshold: float = 0.3, top_n_correlations: int = 10, feature_columns: list = None) +``` + + +Identifies highly correlated feature pairs in a dataset suggesting feature redundancy or multicollinearity. + +###### Purpose + +The High Pearson Correlation test measures the linear relationship between features in a dataset, with the main +goal of identifying high correlations that might indicate feature redundancy or multicollinearity. Identification +of such issues allows developers and risk management teams to properly deal with potential impacts on the machine +learning model's performance and interpretability. + +###### Test Mechanism + +The test works by generating pairwise Pearson correlations for all features in the dataset, then sorting and +eliminating duplicate and self-correlations. It assigns a Pass or Fail based on whether the absolute value of the +correlation coefficient surpasses a pre-set threshold (defaulted at 0.3). It lastly returns the top n strongest +correlations regardless of passing or failing status (where n is 10 by default but can be configured by passing the +`top_n_correlations` parameter). + +###### Signs of High Risk + +- A high risk indication would be the presence of correlation coefficients exceeding the threshold. +- If the features share a strong linear relationship, this could lead to potential multicollinearity and model +overfitting. +- Redundancy of variables can undermine the interpretability of the model due to uncertainty over the authenticity +of individual variable's predictive power. + +###### Strengths + +- Provides a quick and simple means of identifying relationships between feature pairs. +- Generates a transparent output that displays pairs of correlated variables, the Pearson correlation coefficient, +and a Pass or Fail status for each. +- Aids in early identification of potential multicollinearity issues that may disrupt model training. + +###### Limitations + +- Can only delineate linear relationships, failing to shed light on nonlinear relationships or dependencies. +- Sensitive to outliers where a few outliers could notably affect the correlation coefficient. +- Limited to identifying redundancy only within feature pairs; may fail to spot more complex relationships among +three or more variables. + + + + + + + +#### IQROutliersBarPlot + + + + + + +####### IQROutliersBarPlot() + +```python +def IQROutliersBarPlot(dataset: VMDataset, threshold: float = 1.5, fig_width: int = 800) +``` + + +Visualizes outlier distribution across percentiles in numerical data using the Interquartile Range (IQR) method. + +###### Purpose + +The InterQuartile Range Outliers Bar Plot (IQROutliersBarPlot) metric aims to visually analyze and evaluate the +extent of outliers in numeric variables based on percentiles. Its primary purpose is to clarify the dataset's +distribution, flag possible abnormalities in it, and gauge potential risks associated with processing potentially +skewed data, which can affect the machine learning model's predictive prowess. + +###### Test Mechanism + +The examination invokes a series of steps: + +1. For every numeric feature in the dataset, the 25th percentile (Q1) and 75th percentile (Q3) are calculated +before deriving the Interquartile Range (IQR), the difference between Q1 and Q3. +2. Subsequently, the metric calculates the lower and upper thresholds by subtracting Q1 from the `threshold` times +IQR and adding Q3 to `threshold` times IQR, respectively. The default `threshold` is set at 1.5. +3. Any value in the feature that falls below the lower threshold or exceeds the upper threshold is labeled as an +outlier. +4. The number of outliers are tallied for different percentiles, such as [0-25], [25-50], [50-75], and [75-100]. +5. These counts are employed to construct a bar plot for the feature, showcasing the distribution of outliers +across different percentiles. + +###### Signs of High Risk + +- A prevalence of outliers in the data, potentially skewing its distribution. +- Outliers dominating higher percentiles (75-100) which implies the presence of extreme values, capable of severely +influencing the model's performance. +- Certain features harboring most of their values as outliers, which signifies that these features might not +contribute positively to the model's forecasting ability. + +###### Strengths + +- Effectively identifies outliers in the data through visual means, facilitating easier comprehension and offering +insights into the outliers' possible impact on the model. +- Provides flexibility by accommodating all numeric features or a chosen subset. +- Task-agnostic in nature; it is viable for both classification and regression tasks. +- Can handle large datasets as its operation does not hinge on computationally heavy operations. + +###### Limitations + +- Its application is limited to numerical variables and does not extend to categorical ones. +- Only reveals the presence and distribution of outliers and does not provide insights into how these outliers +might affect the model's predictive performance. +- The assumption that data is unimodal and symmetric may not always hold true. In cases with non-normal +distributions, the results can be misleading. + + + + +####### compute_outliers() + +```python +def compute_outliers(series, threshold) +``` + + + + + + + + +#### IQROutliersTable + + + + + + +####### IQROutliersTable() + +```python +def IQROutliersTable(dataset: VMDataset, threshold: float = 1.5) +``` + + +Determines and summarizes outliers in numerical features using the Interquartile Range method. + +###### Purpose + +The "Interquartile Range Outliers Table" (IQROutliersTable) metric is designed to identify and summarize outliers +within numerical features of a dataset using the Interquartile Range (IQR) method. This exercise is crucial in the +pre-processing of data because outliers can substantially distort statistical analysis and impact the performance +of machine learning models. + +###### Test Mechanism + +The IQR, which is the range separating the first quartile (25th percentile) from the third quartile (75th +percentile), is calculated for each numerical feature within the dataset. An outlier is defined as a data point +falling below the "Q1 - 1.5 * IQR" or above "Q3 + 1.5 * IQR" range. The test computes the number of outliers and +their summary statistics (minimum, 25th percentile, median, 75th percentile, and maximum values) for each numerical +feature. If no specific features are chosen, the test applies to all numerical features in the dataset. The default +outlier threshold is set to 1.5 but can be customized by the user. + +###### Signs of High Risk + +- A large number of outliers in multiple features. +- Outliers significantly distanced from the mean value of variables. +- Extremely high or low outlier values indicative of data entry errors or other data quality issues. + +###### Strengths + +- Provides a comprehensive summary of outliers for each numerical feature, helping pinpoint features with potential +quality issues. +- The IQR method is robust to extremely high or low outlier values as it is based on quartile calculations. +- Can be customized to work on selected features and set thresholds for outliers. + +###### Limitations + +- Might cause false positives if the variable deviates from a normal or near-normal distribution, especially for +skewed distributions. +- Does not provide interpretation or recommendations for addressing outliers, relying on further analysis by users +or data scientists. +- Only applicable to numerical features, not categorical data. +- Default thresholds may not be optimal for data with heavy pre-processing, manipulation, or inherently high +kurtosis (heavy tails). + + + + +####### compute_outliers() + +```python +def compute_outliers(series, threshold = 1.5) +``` + + + + + + + + +#### IsolationForestOutliers + + + + + + +####### IsolationForestOutliers() + +```python +def IsolationForestOutliers(dataset: VMDataset, random_state: int = 0, contamination: float = 0.1, feature_columns: list = None) +``` + + +Detects outliers in a dataset using the Isolation Forest algorithm and visualizes results through scatter plots. + +###### Purpose + +The IsolationForestOutliers test is designed to identify anomalies or outliers in the model's dataset using the +isolation forest algorithm. This algorithm assumes that anomalous data points can be isolated more quickly due to +their distinctive properties. By creating isolation trees and identifying instances with shorter average path +lengths, the test is able to pick out data points that differ from the majority. + +###### Test Mechanism + +The test uses the isolation forest algorithm, which builds an ensemble of isolation trees by randomly selecting +features and splitting the data based on random thresholds. It isolates anomalies rather than focusing on normal +data points. For each pair of variables, a scatter plot is generated which distinguishes the identified outliers +from the inliers. The results of the test can be visualized using these scatter plots, illustrating the distinction +between outliers and inliers. + +###### Signs of High Risk + +- The presence of high contamination, indicating a large number of anomalies +- Inability to detect clusters of anomalies that are close in the feature space +- Misclassifying normal instances as anomalies +- Failure to detect actual anomalies + +###### Strengths + +- Ability to handle large, high-dimensional datasets +- Efficiency in isolating anomalies instead of normal instances +- Insensitivity to the underlying distribution of data +- Ability to recognize anomalies even when they are not separated from the main data cloud through identifying +distinctive properties +- Visually presents the test results for better understanding and interpretability + +###### Limitations + +- Difficult to detect anomalies that are close to each other or prevalent in datasets +- Dependency on the contamination parameter which may need fine-tuning to be effective +- Potential failure in detecting collective anomalies if they behave similarly to normal data +- Potential lack of precision in identifying which features contribute most to the anomalous behavior + + + + + + + +#### JarqueBera + + + + + + +####### JarqueBera() + +```python +def JarqueBera(dataset) +``` + + +Assesses normality of dataset features in an ML model using the Jarque-Bera test. + +###### Purpose + +The purpose of the Jarque-Bera test as implemented in this metric is to determine if the features in the dataset of +a given Machine Learning model follow a normal distribution. This is crucial for understanding the distribution and +behavior of the model's features, as numerous statistical methods assume normal distribution of the data. + +###### Test Mechanism + +The test mechanism involves computing the Jarque-Bera statistic, p-value, skew, and kurtosis for each feature in +the dataset. It utilizes the 'jarque_bera' function from the 'statsmodels' library in Python, storing the results +in a dictionary. The test evaluates the skewness and kurtosis to ascertain whether the dataset follows a normal +distribution. A significant p-value (typically less than 0.05) implies that the data does not possess normal +distribution. + +###### Signs of High Risk + +- A high Jarque-Bera statistic and a low p-value (usually less than 0.05) indicate high-risk conditions. +- Such results suggest the data significantly deviates from a normal distribution. If a machine learning model +expects feature data to be normally distributed, these findings imply that it may not function as intended. + +###### Strengths + +- Provides insights into the shape of the data distribution, helping determine whether a given set of data follows +a normal distribution. +- Particularly useful for risk assessment for models that assume a normal distribution of data. +- By measuring skewness and kurtosis, it provides additional insights into the nature and magnitude of a +distribution's deviation. + +###### Limitations + +- Only checks for normality in the data distribution. It cannot provide insights into other types of distributions. +- Datasets that aren't normally distributed but follow some other distribution might lead to inaccurate risk +assessments. +- Highly sensitive to large sample sizes, often rejecting the null hypothesis (that data is normally distributed) +even for minor deviations in larger datasets. + + + + + + + +#### KPSS + + + + + + +####### KPSS() + +```python +def KPSS(dataset: VMDataset) +``` + + +Assesses the stationarity of time-series data in a machine learning model using the KPSS unit root test. + +###### Purpose + +The KPSS (Kwiatkowski-Phillips-Schmidt-Shin) unit root test is utilized to ensure the stationarity of data within a +machine learning model. It specifically works on time-series data to establish the order of integration, which is +essential for accurate forecasting. A fundamental requirement for any time series model is that the series should +be stationary. + +###### Test Mechanism + +This test calculates the KPSS score for each feature in the dataset. The KPSS score includes a statistic, a +p-value, a used lag, and critical values. The core principle behind the KPSS test is to evaluate the hypothesis +that an observable time series is stationary around a deterministic trend. If the computed statistic exceeds the +critical value, the null hypothesis (that the series is stationary) is rejected, indicating that the series is +non-stationary. + +###### Signs of High Risk + +- High KPSS score, particularly if the calculated statistic is higher than the critical value. +- Rejection of the null hypothesis, indicating that the series is recognized as non-stationary, can severely affect +the model's forecasting capability. + +###### Strengths + +- Directly measures the stationarity of a series, fulfilling a key prerequisite for many time-series models. +- The underlying logic of the test is intuitive and simple, making it easy to understand and accessible for both +developers and risk management teams. + +###### Limitations + +- Assumes the absence of a unit root in the series and doesn't differentiate between series that are stationary and +those border-lining stationarity. +- The test may have restricted power against certain alternatives. +- The reliability of the test is contingent on the number of lags selected, which introduces potential bias in the +measurement. + + + + + + + +#### LJungBox + + + + + + +####### LJungBox() + +```python +def LJungBox(dataset) +``` + + +Assesses autocorrelations in dataset features by performing a Ljung-Box test on each feature. + +###### Purpose + +The Ljung-Box test is a type of statistical test utilized to ascertain whether there are autocorrelations within a +given dataset that differ significantly from zero. In the context of a machine learning model, this test is +primarily used to evaluate data utilized in regression tasks, especially those involving time series and +forecasting. + +###### Test Mechanism + +The test operates by iterating over each feature within the dataset and applying the `acorr_ljungbox` +function from the `statsmodels.stats.diagnostic` library. This function calculates the Ljung-Box statistic and +p-value for each feature. These results are then stored in a pandas DataFrame where the columns are the feature names, +statistic, and p-value respectively. Generally, a lower p-value indicates a higher likelihood of significant +autocorrelations within the feature. + +###### Signs of High Risk + +- High Ljung-Box statistic values or low p-values. +- Presence of significant autocorrelations in the respective features. +- Potential for negative impact on model performance or bias if autocorrelations are not properly handled. + +###### Strengths + +- Powerful tool for detecting autocorrelations within datasets, especially in time series data. +- Provides quantitative measures (statistic and p-value) for precise evaluation. +- Helps avoid issues related to autoregressive residuals and other challenges in regression models. + +###### Limitations + +- Cannot detect all types of non-linearity or complex interrelationships among variables. +- Testing individual features may not fully encapsulate the dynamics of the data if features interact with each other. +- Designed more for traditional statistical models and may not be fully compatible with certain types of complex + machine learning models. + + + + + + + +#### LaggedCorrelationHeatmap + + + + + + +####### LaggedCorrelationHeatmap() + +```python +def LaggedCorrelationHeatmap(dataset: VMDataset, num_lags: int = 10) +``` + + +Assesses and visualizes correlation between target variable and lagged independent variables in a time-series +dataset. + +###### Purpose + +The LaggedCorrelationHeatmap metric is utilized to appraise and illustrate the correlation between the target +variable and delayed copies (lags) of independent variables in a time-series dataset. It assists in revealing +relationships in time-series data where the influence of an independent variable on the dependent variable is not +immediate but occurs after a period (lags). + +###### Test Mechanism + +To execute this test, Python's Pandas library pairs with Plotly to perform computations and present the +visualization in the form of a heatmap. The test begins by extracting the target variable and corresponding +independent variables from the dataset. Then, generation of lags of independent variables takes place, followed by +the calculation of correlation between these lagged variables and the target variable. The outcome is a correlation +matrix that gets recorded and illustrated as a heatmap, where different color intensities represent the strength of +the correlation, making patterns easier to identify. + +###### Signs of High Risk + +- Insignificant correlations across the heatmap, indicating a lack of noteworthy relationships between variables. +- Correlations that break intuition or previous understanding, suggesting potential issues with the dataset or the +model. + +###### Strengths + +- This metric serves as an exceptional tool for exploring and visualizing time-dependent relationships between +features and the target variable in a time-series dataset. +- It aids in identifying delayed effects that might go unnoticed with other correlation measures. +- The heatmap offers an intuitive visual representation of time-dependent correlations and influences. + +###### Limitations + +- The metric presumes linear relationships between variables, potentially ignoring non-linear relationships. +- The correlation considered is linear; therefore, intricate non-linear interactions might be overlooked. +- The metric is only applicable for time-series data, limiting its utility outside of this context. +- The number of lags chosen can significantly influence the results; too many lags can render the heatmap difficult +to interpret, while too few might overlook delayed effects. +- This metric does not take into account any causal relationships, but merely demonstrates correlation. + + + + + + + +#### MissingValues + + + + + + +####### MissingValues() + +```python +def MissingValues(dataset: VMDataset, min_threshold: int = 1) +``` + + +Evaluates dataset quality by ensuring missing value ratio across all features does not exceed a set threshold. + +###### Purpose + +The Missing Values test is designed to evaluate the quality of a dataset by measuring the number of missing values +across all features. The objective is to ensure that the ratio of missing data to total data is less than a +predefined threshold, defaulting to 1, in order to maintain the data quality necessary for reliable predictive +strength in a machine learning model. + +###### Test Mechanism + +The mechanism for this test involves iterating through each column of the dataset, counting missing values +(represented as NaNs), and calculating the percentage they represent against the total number of rows. The test +then checks if these missing value counts are less than the predefined `min_threshold`. The results are shown in a +table summarizing each column, the number of missing values, the percentage of missing values in each column, and a +Pass/Fail status based on the threshold comparison. + +###### Signs of High Risk + +- When the number of missing values in any column exceeds the `min_threshold` value. +- Presence of missing values across many columns, leading to multiple instances of failing the threshold. + +###### Strengths + +- Quick and granular identification of missing data across each feature in the dataset. +- Provides an effective and straightforward means of maintaining data quality, essential for constructing efficient +machine learning models. + +###### Limitations + +- Does not suggest the root causes of the missing values or recommend ways to impute or handle them. +- May overlook features with significant missing data but still less than the `min_threshold`, potentially +impacting the model. +- Does not account for data encoded as values like "-999" or "None," which might not technically classify as +missing but could bear similar implications. + + + + + + + +#### MissingValuesBarPlot + + + + + + +####### MissingValuesBarPlot() + +```python +def MissingValuesBarPlot(dataset: VMDataset, threshold: int = 80, fig_height: int = 600) +``` + + +Assesses the percentage and distribution of missing values in the dataset via a bar plot, with emphasis on +identifying high-risk columns based on a user-defined threshold. + +###### Purpose + +The 'MissingValuesBarPlot' metric provides a color-coded visual representation of the percentage of missing values +for each column in an ML model's dataset. The primary purpose of this metric is to easily identify and quantify +missing data, which are essential steps in data preprocessing. The presence of missing data can potentially skew +the model's predictions and decrease its accuracy. Additionally, this metric uses a pre-set threshold to categorize +various columns into ones that contain missing data above the threshold (high risk) and below the threshold (less +risky). + +###### Test Mechanism + +The test mechanism involves scanning each column in the input dataset and calculating the percentage of missing +values. It then compares each column's missing data percentage with the predefined threshold, categorizing columns +with missing data above the threshold as high-risk. The test generates a bar plot in which columns with missing +data are represented on the y-axis and their corresponding missing data percentages are displayed on the x-axis. +The color of each bar reflects the missing data percentage in relation to the threshold**: grey for values below the +threshold and light coral for those exceeding it. The user-defined threshold is represented by a red dashed line on +the plot. + +###### Signs of High Risk + +- Columns with higher percentages of missing values beyond the threshold are high-risk. These are visually +represented by light coral bars on the bar plot. + +###### Strengths + +- Helps in quickly identifying and quantifying missing data across all columns of the dataset. +- Facilitates pattern recognition through visual representation. +- Enables customization of the level of risk tolerance via a user-defined threshold. +- Supports both classification and regression tasks, sharing its versatility. + +###### Limitations + +- It only considers the quantity of missing values, not differentiating between different types of missingness +(Missing completely at random - MCAR, Missing at random - MAR, Not Missing at random - NMAR). +- It doesn't offer insights into potential approaches for handling missing entries, such as various imputation +strategies. +- The metric does not consider possible impacts of the missing data on the model's accuracy or precision. +- Interpretation of the findings and the next steps might require an expert understanding of the field. + + + + + + + +#### MutualInformation + + + + + + +####### MutualInformation() + +```python +def MutualInformation(dataset: VMDataset, min_threshold: float = 0.01, task: str = 'classification') +``` + + +Calculates mutual information scores between features and target variable to evaluate feature relevance. + +###### Purpose + +The Mutual Information test quantifies the predictive power of each feature by measuring its statistical +dependency with the target variable. This helps identify relevant features for model training and +detect potential redundant or irrelevant variables, supporting feature selection decisions and model +interpretability. + +###### Test Mechanism + +The test employs sklearn's mutual_info_classif/mutual_info_regression functions to compute mutual +information between each feature and the target. It produces a normalized score (0 to 1) for each +feature, where higher scores indicate stronger relationships. Results are presented in both tabular +format and visualized through a bar plot with a configurable threshold line. + +###### Signs of High Risk + +- Many features showing very low mutual information scores +- Key business features exhibiting unexpectedly low scores +- All features showing similar, low information content +- Large discrepancy between business importance and MI scores +- Highly skewed distribution of MI scores +- Critical features below the minimum threshold +- Unexpected zero or near-zero scores for known important features +- Inconsistent scores across different data samples + +###### Strengths + +- Captures non-linear relationships between features and target +- Scale-invariant measurement of feature relevance +- Works for both classification and regression tasks +- Provides interpretable scores (0 to 1 scale) +- Supports automated feature selection +- No assumptions about data distribution +- Handles numerical and categorical features +- Computationally efficient for most datasets + +###### Limitations + +- Requires sufficient data for reliable estimates +- May be computationally intensive for very large datasets +- Cannot detect redundant features (pairwise relationships) +- Sensitive to feature discretization for continuous variables +- Does not account for feature interactions +- May underestimate importance of rare but crucial events +- Cannot handle missing values directly +- May be affected by extreme class imbalance + + + + + + + +#### PearsonCorrelationMatrix + + + + + + +####### PearsonCorrelationMatrix() + +```python +def PearsonCorrelationMatrix(dataset) +``` + + +Evaluates linear dependency between numerical variables in a dataset via a Pearson Correlation coefficient heat map. + +###### Purpose + +This test is intended to evaluate the extent of linear dependency between all pairs of numerical variables in the +given dataset. It provides the Pearson Correlation coefficient, which reveals any high correlations present. The +purpose of doing this is to identify potential redundancy, as variables that are highly correlated can often be +removed to reduce the dimensionality of the dataset without significantly impacting the model's performance. + +###### Test Mechanism + +This metric test generates a correlation matrix for all numerical variables in the dataset using the Pearson +correlation formula. A heat map is subsequently created to visualize this matrix effectively. The color of each +point on the heat map corresponds to the magnitude and direction (positive or negative) of the correlation, with a +range from -1 (perfect negative correlation) to 1 (perfect positive correlation). Any correlation coefficients +higher than 0.7 (in absolute terms) are indicated in white in the heat map, suggesting a high degree of correlation. + +###### Signs of High Risk + +- A large number of variables in the dataset showing a high degree of correlation (coefficients approaching ±1). +This indicates redundancy within the dataset, suggesting that some variables may not be contributing new +information to the model. +- Potential risk of overfitting. + +###### Strengths + +- Detects and quantifies the linearity of relationships between variables, aiding in identifying redundant +variables to simplify models and potentially improve performance. +- The heatmap visualization provides an easy-to-understand overview of correlations, beneficial for users not +comfortable with numerical matrices. + +###### Limitations + +- Limited to detecting linear relationships, potentially missing non-linear relationships which impede +opportunities for dimensionality reduction. +- Measures only the degree of linear relationship, not the strength of one variable's effect on another. +- The 0.7 correlation threshold is arbitrary and might exclude valid dependencies with lower coefficients. + + + + + + + +#### PhillipsPerronArch + + + + + + +####### PhillipsPerronArch() + +```python +def PhillipsPerronArch(dataset: VMDataset) +``` + + +Assesses the stationarity of time series data in each feature of the ML model using the Phillips-Perron test. + +###### Purpose + +The Phillips-Perron (PP) test is used to determine the stationarity of time series data for each feature in a +dataset, which is crucial for forecasting tasks. It tests the null hypothesis that a time series is unit-root +non-stationary. This is vital for understanding the stochastic behavior of the data and ensuring the robustness and +validity of predictions generated by regression analysis models. + +###### Test Mechanism + +The PP test is conducted for each feature in the dataset as follows: + +- A data frame is created from the dataset. +- For each column, the Phillips-Perron method calculates the test statistic, p-value, lags used, and number of +observations. +- The results are then stored for each feature, providing a metric that indicates the stationarity of the time +series data. + +###### Signs of High Risk + +- A high p-value, indicating that the series has a unit root and is non-stationary. +- Test statistic values exceeding critical values, suggesting non-stationarity. +- High 'usedlag' value, pointing towards autocorrelation issues that may degrade model performance. + +###### Strengths + +- Resilience against heteroskedasticity in the error term. +- Effective for long time series data. +- Helps in determining whether the time series is stationary, aiding in the selection of suitable forecasting +models. + +###### Limitations + +- Applicable only within a univariate time series framework. +- Relies on asymptotic theory, which may reduce the test’s power for small sample sizes. +- Non-stationary time series must be converted to stationary series through differencing, potentially leading to +loss of important data points. + + + + + + + +#### ProtectedClassesCombination + + + + + + +####### ProtectedClassesCombination() + +```python +def ProtectedClassesCombination(dataset, model, protected_classes = None) +``` + + +Visualizes combinations of protected classes and their corresponding error metric differences. + +###### Purpose + +This test aims to provide insights into how different combinations of protected classes affect various error metrics, +particularly the false negative rate (FNR) and false positive rate (FPR). By visualizing these combinations, +it helps identify potential biases or disparities in model performance across different intersectional groups. + +###### Test Mechanism + +The test performs the following steps: +1. Combines the specified protected class columns to create a single multi-class category. +2. Calculates error metrics (FNR, FPR, etc.) for each combination of protected classes. +3. Generates visualizations showing the distribution of these metrics across all class combinations. + +###### Signs of High Risk + +- Large disparities in FNR or FPR across different protected class combinations. +- Consistent patterns of higher error rates for specific combinations of protected attributes. +- Unexpected or unexplainable variations in error metrics between similar group combinations. + +###### Strengths + +- Provides a comprehensive view of intersectional fairness across multiple protected attributes. +- Allows for easy identification of potentially problematic combinations of protected classes. +- Visualizations make it easier to spot patterns or outliers in model performance across groups. + +###### Limitations + +- May become complex and difficult to interpret with a large number of protected classes or combinations. +- Does not provide statistical significance of observed differences. +- Visualization alone may not capture all nuances of intersectional fairness. + + + + + + + +#### ProtectedClassesDescription + + + + + + +####### ProtectedClassesDescription() + +```python +def ProtectedClassesDescription(dataset, protected_classes = None) +``` + + +Visualizes the distribution of protected classes in the dataset relative to the target variable +and provides descriptive statistics. + +###### Purpose + +The ProtectedClassesDescription test aims to identify potential biases or significant differences in the +distribution of target outcomes across different protected classes. This visualization and statistical summary +help in understanding the relationship between protected attributes and the target variable, which is crucial +for assessing fairness in machine learning models. + +###### Test Mechanism + +The function creates interactive stacked bar charts for each specified protected class using Plotly. +Additionally, it generates a single table of descriptive statistics for all protected classes, including: + +- Protected class and category +- Count and percentage of each category within the protected class +- Mean, median, and mode of the target variable for each category +- Standard deviation of the target variable for each category +- Minimum and maximum values of the target variable for each category + +###### Signs of High Risk + +- Significant imbalances in the distribution of target outcomes across different categories of a protected class. +- Large disparities in mean, median, or mode of the target variable across categories. +- Underrepresentation or overrepresentation of certain groups within protected classes. +- High standard deviations in certain categories, indicating potential volatility or outliers. + +###### Strengths + +- Provides both visual and statistical representation of potential biases in the dataset. +- Allows for easy identification of imbalances in target variable distribution across protected classes. +- Interactive plots enable detailed exploration of the data. +- Consolidated statistical summary provides quantitative measures to complement visual analysis. +- Applicable to both classification and regression tasks. + +###### Limitations + +- Does not provide advanced statistical measures of bias or fairness. +- May become cluttered if there are many categories within a protected class or many unique target values. +- Interpretation may require domain expertise to understand the implications of observed disparities. +- Does not account for intersectionality or complex interactions between multiple protected attributes. + + + + + + + +#### ProtectedClassesDisparity + + + + + + +####### ProtectedClassesDisparity() + +```python +def ProtectedClassesDisparity(dataset, model, protected_classes = None, disparity_tolerance = 1.25, metrics = {'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}) +``` + + +Investigates disparities in model performance across different protected class segments. + +###### Purpose + +This test aims to identify and quantify potential biases in model outcomes by comparing various performance metrics +across different segments of protected classes. It helps in assessing whether the model produces discriminatory +outcomes for certain groups, which is crucial for ensuring fairness in machine learning models. + +###### Test Mechanism + +The test performs the following steps: +1. Calculates performance metrics (e.g., false negative rate, false positive rate, true positive rate) for each segment + of the specified protected classes. +2. Computes disparity ratios by comparing these metrics between different segments and a reference group. +3. Generates visualizations showing the disparities and their relation to a user-defined disparity tolerance threshold. +4. Produces a comprehensive table with various disparity metrics for detailed analysis. + +###### Signs of High Risk + +- Disparity ratios exceeding the specified disparity tolerance threshold. +- Consistent patterns of higher error rates or lower performance for specific protected class segments. +- Statistically significant differences in performance metrics across segments. + +###### Strengths + +- Provides a comprehensive view of model fairness across multiple protected attributes and metrics. +- Allows for easy identification of problematic disparities through visual and tabular representations. +- Customizable disparity tolerance threshold to align with specific use-case requirements. +- Applicable to various performance metrics, offering a multi-faceted analysis of model fairness. + +###### Limitations + +- Relies on a predefined reference group for each protected class, which may not always be the most appropriate choice. +- Does not account for intersectionality between different protected attributes. +- The interpretation of results may require domain expertise to understand the implications of observed disparities. + + + + + + + +#### ProtectedClassesThresholdOptimizer + + + + + + +####### ProtectedClassesThresholdOptimizer() + +```python +def ProtectedClassesThresholdOptimizer(dataset, pipeline = None, protected_classes = None, X_train = None, y_train = None) +``` + + +Obtains a classifier by applying group-specific thresholds to the provided estimator. + +###### Purpose + +This test aims to optimize the fairness of a machine learning model by applying different +classification thresholds for different protected groups. It helps in mitigating bias and +achieving more equitable outcomes across different demographic groups. + +###### Test Mechanism + +The test uses Fairlearn's ThresholdOptimizer to: +1. Fit an optimizer on the training data, considering protected classes. +2. Apply optimized thresholds to make predictions on the test data. +3. Calculate and report various fairness metrics. +4. Visualize the optimized thresholds. + +###### Signs of High Risk + +- Large disparities in fairness metrics (e.g., Demographic Parity Ratio, Equalized Odds Ratio) + across different protected groups. +- Significant differences in False Positive Rates (FPR) or True Positive Rates (TPR) between groups. +- Thresholds that vary widely across different protected groups. + +###### Strengths + +- Provides a post-processing method to improve model fairness without modifying the original model. +- Allows for balancing multiple fairness criteria simultaneously. +- Offers visual insights into the threshold optimization process. + +###### Limitations + +- May lead to a decrease in overall model performance while improving fairness. +- Requires access to protected attribute information at prediction time. +- The effectiveness can vary depending on the chosen fairness constraint and objective. + + + + +####### calculate_fairness_metrics() + +```python +def calculate_fairness_metrics(test_df, target, y_pred_opt, protected_classes) +``` + + + + + +####### calculate_group_metrics() + +```python +def calculate_group_metrics(test_df, target, y_pred_opt, protected_classes) +``` + + + + + +####### get_thresholds_by_group() + +```python +def get_thresholds_by_group(threshold_optimizer) +``` + + + + + +####### initialize_and_fit_optimizer() + +```python +def initialize_and_fit_optimizer(pipeline, X_train, y_train, protected_classes_df) +``` + + + + + +####### make_predictions() + +```python +def make_predictions(threshold_optimizer, test_df, protected_classes) +``` + + + + + +####### plot_thresholds() + +```python +def plot_thresholds(threshold_optimizer) +``` + + + + + + + + +#### RollingStatsPlot + + + + + + +####### RollingStatsPlot() + +```python +def RollingStatsPlot(dataset: VMDataset, window_size: int = 12) +``` + + +Evaluates the stationarity of time series data by plotting its rolling mean and standard deviation over a specified +window. + +###### Purpose + +The `RollingStatsPlot` metric is employed to gauge the stationarity of time series data in a given dataset. This +metric specifically evaluates the rolling mean and rolling standard deviation of the dataset over a pre-specified +window size. The rolling mean provides an understanding of the average trend in the data, while the rolling +standard deviation gauges the volatility of the data within the window. It is critical in preparing time series +data for modeling as it reveals key insights into data behavior across time. + +###### Test Mechanism + +This mechanism is comprised of two steps. Initially, the rolling mean and standard deviation for each of the +dataset's columns are calculated over a window size, which can be user-specified or by default set to 12 data +points. Then, the calculated rolling mean and standard deviation are visualized via separate plots, illustrating +the trends and volatility in the dataset. A straightforward check is conducted to ensure the existence of columns +in the dataset, and to verify that the given dataset has been indexed by its date and time—a necessary prerequisite +for time series analysis. + +###### Signs of High Risk + +- The presence of non-stationary patterns in either the rolling mean or the rolling standard deviation plots, which +could indicate trends or seasonality in the data that may affect the performance of time series models. +- Missing columns in the dataset, which would prevent the execution of this metric correctly. +- The detection of NaN values in the dataset, which may need to be addressed before the metric can proceed +successfully. + +###### Strengths + +- Offers visualizations of trending behavior and volatility within the data, facilitating a broader understanding +of the dataset's inherent characteristics. +- Checks of the dataset's integrity, such as the existence of all required columns and the availability of a +datetime index. +- Adjusts to accommodate various window sizes, thus allowing accurate analysis of data with differing temporal +granularities. +- Considers each column of the data individually, thereby accommodating multi-feature datasets. + +###### Limitations + +- For all columns, a fixed-size window is utilized. This may not accurately capture patterns in datasets where +different features may require different optimal window sizes. +- Requires the dataset to be indexed by date and time, hence it may not be usable for datasets without a timestamp +index. +- Primarily serves for data visualization as it does not facilitate any quantitative measures for stationarity, +such as through statistical tests. Therefore, the interpretation is subjective and depends heavily on modeler +discretion. + + + + +####### plot_rolling_statistics() + +```python +def plot_rolling_statistics(df, col, window_size) +``` + + + + + + + + +#### RunsTest + + + + + + +####### RunsTest() + +```python +def RunsTest(dataset) +``` + + +Executes Runs Test on ML model to detect non-random patterns in output data sequence. + +###### Purpose + +The Runs Test is a statistical procedure used to determine whether the sequence of data extracted from the ML model +behaves randomly or not. Specifically, it analyzes runs, sequences of consecutive positives or negatives, in the +data to check if there are more or fewer runs than expected under the assumption of randomness. This can be an +indication of some pattern, trend, or cycle in the model's output which may need attention. + +###### Test Mechanism + +The testing mechanism applies the Runs Test from the statsmodels module on each column of the training dataset. For +every feature in the dataset, a Runs Test is executed, whose output includes a Runs Statistic and P-value. A low +P-value suggests that data arrangement in the feature is not likely to be random. The results are stored in a +dictionary where the keys are the feature names, and the values are another dictionary storing the test statistic +and the P-value for each feature. + +###### Signs of High Risk + +- High risk is indicated when the P-value is close to zero. +- If the P-value is less than a predefined significance level (like 0.05), it suggests that the runs (series of +positive or negative values) in the model's output are not random and are longer or shorter than what is expected +under a random scenario. +- This would mean there's a high risk of non-random distribution of errors or model outcomes, suggesting potential +issues with the model. + +###### Strengths + +- Straightforward and fast for detecting non-random patterns in data sequence. +- Validates assumptions of randomness, which is valuable for checking error distributions in regression models, +trendless time series data, and ensuring a classifier doesn't favor one class over another. +- Can be applied to both classification and regression tasks, making it versatile. + +###### Limitations + +- Assumes that the data is independently and identically distributed (i.i.d.), which might not be the case for many +real-world datasets. +- The conclusion drawn from the low P-value indicating non-randomness does not provide information about the type +or the source of the detected pattern. +- Sensitive to extreme values (outliers), and overly large or small run sequences can influence the results. +- Does not provide model performance evaluation; it is used to detect patterns in the sequence of outputs only. + + + + + + + +#### ScatterPlot + + + + + + +####### ScatterPlot() + +```python +def ScatterPlot(dataset) +``` + + +Assesses visual relationships, patterns, and outliers among features in a dataset through scatter plot matrices. + +###### Purpose + +The ScatterPlot test aims to visually analyze a given dataset by constructing a scatter plot matrix of its +numerical features. The primary goal is to uncover relationships, patterns, and outliers across different features +to provide both quantitative and qualitative insights into multidimensional relationships within the dataset. This +visual assessment aids in understanding the efficacy of the chosen features for model training and their +suitability. + +###### Test Mechanism + +Using the Seaborn library, the ScatterPlot function creates the scatter plot matrix. The process involves +retrieving all numerical columns from the dataset and generating a scatter matrix for these columns. The resulting +scatter plot provides visual representations of feature relationships. The function also adjusts axis labels for +readability and returns the final plot as a Matplotlib Figure object for further analysis and visualization. + +###### Signs of High Risk + +- The emergence of non-linear or random patterns across different feature pairs, suggesting complex relationships +unsuitable for linear assumptions. +- Lack of clear patterns or clusters, indicating weak or non-existent correlations among features, which could +challenge certain model types. +- Presence of outliers, as visual outliers can adversely influence the model's performance. + +###### Strengths + +- Provides insight into the multidimensional relationships among multiple features. +- Assists in identifying trends, correlations, and outliers that could affect model performance. +- Validates assumptions made during model creation, such as linearity. +- Versatile for application in both regression and classification tasks. +- Using Seaborn facilitates an intuitive and detailed visual exploration of data. + +###### Limitations + +- Scatter plot matrices may become cluttered and hard to decipher as the number of features increases. +- Primarily reveals pairwise relationships and may fail to illuminate complex interactions involving three or more +features. +- Being a visual tool, precision in quantitative analysis might be compromised. +- Outliers not clearly visible in plots can be missed, affecting model performance. +- Assumes that the dataset can fit into the computer's memory, which might not be valid for extremely large +datasets. + + + + + + + +#### ScoreBandDefaultRates + + + + + + +####### ScoreBandDefaultRates() + +```python +def ScoreBandDefaultRates(dataset: VMDataset, model: VMModel, score_column: str = 'score', score_bands: list = None) +``` + + +Analyzes default rates and population distribution across credit score bands. + +###### Purpose + +The Score Band Default Rates test evaluates the discriminatory power of credit scores by analyzing +default rates across different score bands. This helps validate score effectiveness, supports +policy decisions, and provides insights into portfolio risk distribution. + +###### Test Mechanism + +The test segments the score distribution into bands and calculates key metrics for each band: +1. Population count and percentage in each band +2. Default rate within each band +3. Cumulative statistics across bands +The results show how well the scores separate good and bad accounts. + +###### Signs of High Risk + +- Non-monotonic default rates across score bands +- Insufficient population in critical score bands +- Unexpected default rates for score ranges +- High concentration in specific score bands +- Similar default rates across adjacent bands +- Unstable default rates in key decision bands +- Extreme population skewness +- Poor risk separation between bands + +###### Strengths + +- Clear view of score effectiveness +- Supports policy threshold decisions +- Easy to interpret and communicate +- Directly links to business decisions +- Shows risk segmentation power +- Identifies potential score issues +- Helps validate scoring model +- Supports portfolio monitoring + +###### Limitations + +- Sensitive to band definition choices +- May mask within-band variations +- Requires sufficient data in each band +- Cannot capture non-linear patterns +- Point-in-time analysis only +- No temporal trend information +- Assumes band boundaries are appropriate +- May oversimplify risk patterns + + + + + + + +#### SeasonalDecompose + + + + + + +####### SeasonalDecompose() + +```python +def SeasonalDecompose(dataset: VMDataset, seasonal_model: str = 'additive') +``` + + +Assesses patterns and seasonality in a time series dataset by decomposing its features into foundational components. + +###### Purpose + +The Seasonal Decompose test aims to decompose the features of a time series dataset into their fundamental +components**: observed, trend, seasonal, and residuals. By utilizing the Seasonal Decomposition of Time Series by +Loess (STL) method, the test identifies underlying patterns, predominantly seasonality, in the dataset's features. +This aids in developing a more comprehensive understanding of the dataset, which in turn facilitates more effective +model validation. + +###### Test Mechanism + +The testing process leverages the `seasonal_decompose` function from the `statsmodels.tsa.seasonal` library to +evaluate each feature in the dataset. It isolates each feature into four components—observed, trend, seasonal, and +residuals—and generates six subplot graphs per feature for visual interpretation. Prior to decomposition, the test +scrutinizes and removes any non-finite values, ensuring the reliability of the analysis. + +###### Signs of High Risk + +- **Non-Finiteness**: Datasets with a high number of non-finite values may flag as high risk since these values are +omitted before conducting the seasonal decomposition. +- **Frequent Warnings**: Chronic failure to infer the frequency for a scrutinized feature indicates high risk. +- **High Seasonality**: A significant seasonal component could potentially render forecasts unreliable due to +overwhelming seasonal variation. + +###### Strengths + +- **Seasonality Detection**: Accurately discerns hidden seasonality patterns in dataset features. +- **Visualization**: Facilitates interpretation and comprehension through graphical representations. +- **Unrestricted Usage**: Not confined to any specific regression model, promoting wide-ranging applicability. + +###### Limitations + +- **Dependence on Assumptions**: Assumes that dataset features are periodically distributed. Features with no +inferable frequency are excluded from the test. +- **Handling Non-Finite Values**: Disregards non-finite values during analysis, potentially resulting in an +incomplete understanding of the dataset. +- **Unreliability with Noisy Datasets**: Produces unreliable results when used with datasets that contain heavy +noise. + + + + + + + +#### ShapiroWilk + + + + + + +####### ShapiroWilk() + +```python +def ShapiroWilk(dataset) +``` + + +Evaluates feature-wise normality of training data using the Shapiro-Wilk test. + +###### Purpose + +The Shapiro-Wilk test is utilized to investigate whether a particular dataset conforms to the standard normal +distribution. This analysis is crucial in machine learning modeling because the normality of the data can +profoundly impact the performance of the model. This metric is especially useful in evaluating various features of +the dataset in both classification and regression tasks. + +###### Test Mechanism + +The Shapiro-Wilk test is conducted on each feature column of the training dataset to determine if the data +contained fall within the normal distribution. The test presents a statistic and a p-value, with the p-value +serving to validate or repudiate the null hypothesis, which is that the tested data is normally distributed. + +###### Signs of High Risk + +- A p-value that falls below 0.05 signifies a high risk as it discards the null hypothesis, indicating that the +data does not adhere to the normal distribution. +- For machine learning models built on the presumption of data normality, such an outcome could result in subpar +performance or incorrect predictions. + +###### Strengths + +- The Shapiro-Wilk test is esteemed for its level of accuracy, thereby making it particularly well-suited to +datasets of small to moderate sizes. +- It proves its versatility through its efficient functioning in both classification and regression tasks. +- By separately testing each feature column, the Shapiro-Wilk test can raise an alarm if a specific feature does +not comply with the normality. + +###### Limitations + +- The Shapiro-Wilk test's sensitivity can be a disadvantage as it often rejects the null hypothesis (i.e., data is +normally distributed), even for minor deviations, especially in large datasets. This may lead to unwarranted 'false +alarms' of high risk by deeming the data as not normally distributed even if it approximates normal distribution. +- Exceptional care must be taken in managing missing data or outliers prior to testing as these can greatly skew +the results. +- Lastly, the Shapiro-Wilk test is not optimally suited for processing data with pronounced skewness or kurtosis. + + + + + + + +#### Skewness + + + + + + +####### Skewness() + +```python +def Skewness(dataset, max_threshold = 1) +``` + + +Evaluates the skewness of numerical data in a dataset to check against a defined threshold, aiming to ensure data +quality and optimize model performance. + +###### Purpose + +The purpose of the Skewness test is to measure the asymmetry in the distribution of data within a predictive +machine learning model. Specifically, it evaluates the divergence of said distribution from a normal distribution. +Understanding the level of skewness helps identify data quality issues, which are crucial for optimizing the +performance of traditional machine learning models in both classification and regression settings. + +###### Test Mechanism + +This test calculates the skewness of numerical columns in the dataset, focusing specifically on numerical data +types. The calculated skewness value is then compared against a predetermined maximum threshold, which is set by +default to 1. If the skewness value is less than this maximum threshold, the test passes; otherwise, it fails. The +test results, along with the skewness values and column names, are then recorded for further analysis. + +###### Signs of High Risk + +- Substantial skewness levels that significantly exceed the maximum threshold. +- Persistent skewness in the data, indicating potential issues with the foundational assumptions of the machine +learning model. +- Subpar model performance, erroneous predictions, or biased inferences due to skewed data distributions. + +###### Strengths + +- Fast and efficient identification of unequal data distributions within a machine learning model. +- Adjustable maximum threshold parameter, allowing for customization based on user needs. +- Provides a clear quantitative measure to mitigate model risks related to data skewness. + +###### Limitations + +- Only evaluates numeric columns, potentially missing skewness or bias in non-numeric data. +- Assumes that data should follow a normal distribution, which may not always be applicable to real-world data. +- Subjective threshold for risk grading, requiring expert input and recurrent iterations for refinement. + + + + + + + +#### SpreadPlot + + + + + + +####### SpreadPlot() + +```python +def SpreadPlot(dataset: VMDataset) +``` + + +Assesses potential correlations between pairs of time series variables through visualization to enhance +understanding of their relationships. + +###### Purpose + +The SpreadPlot test aims to graphically illustrate and analyze the relationships between pairs of time series +variables within a given dataset. This facilitated understanding helps in identifying and assessing potential time +series correlations, such as cointegration, between the variables. + +###### Test Mechanism + +The SpreadPlot test computes and represents the spread between each pair of time series variables in the dataset. +Specifically, the difference between two variables is calculated and presented as a line graph. This process is +iterated for each unique pair of variables in the dataset, allowing for comprehensive visualization of their +relationships. + +###### Signs of High Risk + +- Large fluctuations in the spread over a given timespan. +- Unexpected patterns or trends that may signal potential risks in the underlying correlations between the +variables. +- Presence of significant missing data or extreme outlier values, which could potentially skew the spread and +indicate high risk. + +###### Strengths + +- Allows for thorough visual examination and interpretation of the correlations between time-series pairs. +- Aids in revealing complex relationships like cointegration. +- Enhances interpretability by visualizing the relationships, thereby helping in spotting outliers and trends. +- Capable of handling numerous variable pairs from the dataset through a versatile and adaptable process. + +###### Limitations + +- Primarily serves as a visualization tool and does not offer quantitative measurements or statistics to +objectively determine relationships. +- Heavily relies on the quality and granularity of the data—missing data or outliers can notably disturb the +interpretation of relationships. +- Can become inefficient or difficult to interpret with a high number of variables due to the profuse number of +plots. +- Might not completely capture intricate non-linear relationships between the variables. + + + + + + + +#### TabularCategoricalBarPlots + + + + + + +####### TabularCategoricalBarPlots() + +```python +def TabularCategoricalBarPlots(dataset: VMDataset) +``` + + +Generates and visualizes bar plots for each category in categorical features to evaluate the dataset's composition. + +###### Purpose + +The purpose of this metric is to visually analyze categorical data using bar plots. It is intended to evaluate the +dataset's composition by displaying the counts of each category in each categorical feature. + +###### Test Mechanism + +The provided dataset is first checked to determine if it contains any categorical variables. If no categorical +columns are found, the tool raises a ValueError. For each categorical variable in the dataset, a separate bar plot +is generated. The number of occurrences for each category is calculated and displayed on the plot. If a dataset +contains multiple categorical columns, multiple bar plots are produced. + +###### Signs of High Risk + +- High risk could occur if the categorical variables exhibit an extreme imbalance, with categories having very few +instances possibly being underrepresented in the model, which could affect the model's performance and its ability +to generalize. +- Another sign of risk is if there are too many categories in a single variable, which could lead to overfitting +and make the model complex. + +###### Strengths + +- Provides a visual and intuitively understandable representation of categorical data. +- Aids in the analysis of variable distributions. +- Helps in easily identifying imbalances or rare categories that could affect the model's performance. + +###### Limitations + +- This method only works with categorical data and won't apply to numerical variables. +- It does not provide informative value when there are too many categories, as the bar chart could become cluttered +and hard to interpret. +- Offers no insights into the model's performance or precision, but rather provides a descriptive analysis of the +input. + + + + + + + +#### TabularDateTimeHistograms + + + + + + +####### TabularDateTimeHistograms() + +```python +def TabularDateTimeHistograms(dataset: VMDataset) +``` + + +Generates histograms to provide graphical insight into the distribution of time intervals in a model's datetime +data. + +###### Purpose + +The `TabularDateTimeHistograms` metric is designed to provide graphical insight into the distribution of time +intervals in a machine learning model's datetime data. By plotting histograms of differences between consecutive +date entries in all datetime variables, it enables an examination of the underlying pattern of time series data and +identification of anomalies. + +###### Test Mechanism + +This test operates by first identifying all datetime columns and extracting them from the dataset. For each +datetime column, it next computes the differences (in days) between consecutive dates, excluding zero values, and +visualizes these differences in a histogram. The Plotly library's histogram function is used to generate +histograms, which are labeled appropriately and provide a graphical representation of the frequency of different +day intervals in the dataset. + +###### Signs of High Risk + +- If no datetime columns are detected in the dataset, this would lead to a ValueError. Hence, the absence of +datetime columns signifies a high risk. +- A severely skewed or irregular distribution depicted in the histogram may indicate possible complications with +the data, such as faulty timestamps or abnormalities. + +###### Strengths + +- The metric offers a visual overview of time interval frequencies within the dataset, supporting the recognition +of inherent patterns. +- Histogram plots can aid in the detection of potential outliers and data anomalies, contributing to an assessment +of data quality. +- The metric is versatile, compatible with a range of task types, including classification and regression, and can +work with multiple datetime variables if present. + +###### Limitations + +- A major weakness of this metric is its dependence on the visual examination of data, as it does not provide a +measurable evaluation of the model. +- The metric might overlook complex or multi-dimensional trends in the data. +- The test is only applicable to datasets containing datetime columns and will fail if such columns are unavailable. +- The interpretation of the histograms relies heavily on the domain expertise and experience of the reviewer. + + + + + + + +#### TabularDescriptionTables + + + + + + +####### TabularDescriptionTables() + +```python +def TabularDescriptionTables(dataset) +``` + + +Summarizes key descriptive statistics for numerical, categorical, and datetime variables in a dataset. + +###### Purpose + +The main purpose of this metric is to gather and present the descriptive statistics of numerical, categorical, and +datetime variables present in a dataset. The attributes it measures include the count, mean, minimum and maximum +values, percentage of missing values, data types of fields, and unique values for categorical fields, among others. + +###### Test Mechanism + +The test first segregates the variables in the dataset according to their data types (numerical, categorical, or +datetime). Then, it compiles summary statistics for each type of variable. The specifics of these statistics vary +depending on the type of variable: + +- For numerical variables, the metric extracts descriptors like count, mean, minimum and maximum values, count of +missing values, and data types. +- For categorical variables, it counts the number of unique values, displays unique values, counts missing values, +and identifies data types. +- For datetime variables, it counts the number of unique values, identifies the earliest and latest dates, counts +missing values, and identifies data types. + +###### Signs of High Risk + +- Masses of missing values in the descriptive statistics results could hint at high risk or failure, indicating +potential data collection, integrity, and quality issues. +- Detection of inappropriate distributions for numerical variables, like having negative values for variables that +are always supposed to be positive. +- Identifying inappropriate data types, like a continuous variable being encoded as a categorical type. + +###### Strengths + +- Provides a comprehensive overview of the dataset. +- Gives a snapshot into the essence of the numerical, categorical, and datetime fields. +- Identifies potential data quality issues such as missing values or inconsistencies crucial for building credible +machine learning models. +- The metadata, including the data type and missing value information, are vital for anyone including data +scientists dealing with the dataset before the modeling process. + +###### Limitations + +- It does not perform any deeper statistical analysis or tests on the data. +- It does not handle issues such as outliers, or relationships between variables. +- It offers no insights into potential correlations or possible interactions between variables. +- It does not investigate the potential impact of missing values on the performance of the machine learning models. +- It does not explore potential transformation requirements that may be necessary to enhance the performance of the +chosen algorithm. + + + + +####### get_categorical_columns() + +```python +def get_categorical_columns(dataset) +``` + + + + + +####### get_datetime_columns() + +```python +def get_datetime_columns(dataset) +``` + + + + + +####### get_numerical_columns() + +```python +def get_numerical_columns(dataset) +``` + + + + + +####### get_summary_statistics_categorical() + +```python +def get_summary_statistics_categorical(dataset, categorical_fields) +``` + + + + + +####### get_summary_statistics_datetime() + +```python +def get_summary_statistics_datetime(dataset, datetime_fields) +``` + + + + + +####### get_summary_statistics_numerical() + +```python +def get_summary_statistics_numerical(dataset, numerical_fields) +``` + + + + + + + + +#### TabularNumericalHistograms + + + + + + +####### TabularNumericalHistograms() + +```python +def TabularNumericalHistograms(dataset: VMDataset) +``` + + +Generates histograms for each numerical feature in a dataset to provide visual insights into data distribution and +detect potential issues. + +###### Purpose + +The purpose of this test is to provide visual analysis of numerical data through the generation of histograms for +each numerical feature in the dataset. Histograms aid in the exploratory analysis of data, offering insight into +the distribution of the data, skewness, presence of outliers, and central tendencies. It helps in understanding if +the inputs to the model are normally distributed, which is a common assumption in many machine learning algorithms. + +###### Test Mechanism + +This test scans the provided dataset and extracts all the numerical columns. For each numerical column, it +constructs a histogram using plotly, with 50 bins. The deployment of histograms offers a robust visual aid, +ensuring unruffled identification and understanding of numerical data distribution patterns. + +###### Signs of High Risk + +- A high degree of skewness +- Unexpected data distributions +- Existence of extreme outliers in the histograms + +These may indicate issues with the data that the model is receiving. If data for a numerical feature is expected to +follow a certain distribution (like a normal distribution) but does not, it could lead to sub-par performance by +the model. As such these instances should be treated as high-risk indicators. + +###### Strengths + +- Provides a simple, easy-to-interpret visualization of how data for each numerical attribute is distributed. +- Helps detect skewed values and outliers that could potentially harm the AI model's performance. +- Can be applied to large datasets and multiple numerical variables conveniently. + +###### Limitations + +- Only works with numerical data, thus ignoring non-numerical or categorical data. +- Does not analyze relationships between different features, only the individual feature distributions. +- Is a univariate analysis and may miss patterns or anomalies that only appear when considering multiple variables +together. +- Does not provide any insight into how these features affect the output of the model; it is purely an input +analysis tool. + + + + + + + +#### TargetRateBarPlots + + + + + + +####### TargetRateBarPlots() + +```python +def TargetRateBarPlots(dataset: VMDataset) +``` + + +Generates bar plots visualizing the default rates of categorical features for a classification machine learning +model. + +###### Purpose + +This test, implemented as a metric, is designed to provide an intuitive, graphical summary of the decision-making +patterns exhibited by a categorical classification machine learning model. The model's performance is evaluated +using bar plots depicting the ratio of target rates—meaning the proportion of positive classes—for different +categorical inputs. This allows for an easy, at-a-glance understanding of the model's accuracy. + +###### Test Mechanism + +The test involves creating a pair of bar plots for each categorical feature in the dataset. The first plot depicts +the frequency of each category in the dataset, with each category visually distinguished by its unique color. The +second plot shows the mean target rate of each category (sourced from the "default_column"). Plotly, a Python +library, is used to generate these plots, with distinct plots created for each feature. If no specific columns are +selected, the test will generate plots for each categorical column in the dataset. + +###### Signs of High Risk + +- Inconsistent or non-binary values in the "default_column" could complicate or render impossible the calculation +of average target rates. +- Particularly low or high target rates for a specific category might suggest that the model is misclassifying +instances of that category. + +###### Strengths + +- This test offers a visually interpretable breakdown of the model's decisions, providing an easy way to spot +irregularities, inconsistencies, or patterns. +- Its flexibility allows for the inspection of one or multiple columns, as needed. + +###### Limitations + +- The readability of the bar plots drops as the number of distinct categories increases in the dataset, which can +make them harder to understand and less useful. + + + + + + + +#### TimeSeriesDescription + + + + + + +####### TimeSeriesDescription() + +```python +def TimeSeriesDescription(dataset) +``` + + +Generates a detailed analysis for the provided time series dataset, summarizing key statistics to identify trends, +patterns, and data quality issues. + +###### Purpose + +The TimeSeriesDescription function aims to analyze an individual time series by providing a summary of key +statistics. This helps in understanding trends, patterns, and data quality issues within the time series. + +###### Test Mechanism + +The function extracts the time series data and provides a summary of key statistics. The dataset is expected to +have a datetime index. The function checks this and raises an error if the index is not in datetime format. For +each variable (column) in the dataset, appropriate statistics including start date, end date, frequency, number of +missing values, count, min, and max values are calculated. + +###### Signs of High Risk + +- If the index of the dataset is not in datetime format, it could lead to errors in time-series analysis. +- Inconsistent or missing data within the dataset might affect the analysis of trends and patterns. + +###### Strengths + +- Provides a comprehensive summary of key statistics for each variable, helping to identify data quality issues +such as missing values. +- Helps in understanding the distribution and range of the data by including min and max values. + +###### Limitations + +- Assumes that the dataset is provided as a DataFrameDataset object with a .df attribute to access the pandas +DataFrame. +- Only analyzes datasets with a datetime index and will raise an error for other types of indices. +- Does not handle large datasets efficiently; performance may degrade with very large datasets. + + + + + + + +#### TimeSeriesDescriptiveStatistics + + + + + + +####### TimeSeriesDescriptiveStatistics() + +```python +def TimeSeriesDescriptiveStatistics(dataset) +``` + + +Evaluates the descriptive statistics of a time series dataset to identify trends, patterns, and data quality issues. + +###### Purpose + +The purpose of the TimeSeriesDescriptiveStatistics function is to analyze an individual time series by providing a +summary of key descriptive statistics. This analysis helps in understanding trends, patterns, and data quality +issues within the time series dataset. + +###### Test Mechanism + +The function extracts the time series data and provides a summary of key descriptive statistics. The dataset is +expected to have a datetime index, and the function will check this and raise an error if the index is not in a +datetime format. For each variable (column) in the dataset, appropriate statistics, including start date, end date, +min, mean, max, skewness, kurtosis, and count, are calculated. + +###### Signs of High Risk + +- If the index of the dataset is not in datetime format, it could lead to errors in time-series analysis. +- Inconsistent or missing data within the dataset might affect the analysis of trends and patterns. + +###### Strengths + +- Provides a comprehensive summary of key descriptive statistics for each variable. +- Helps identify data quality issues and understand the distribution of the data. + +###### Limitations + +- Assumes the dataset is provided as a DataFrameDataset object with a .df attribute to access the pandas DataFrame. +- Only analyzes datasets with a datetime index and will raise an error for other types of indices. +- Does not handle large datasets efficiently, and performance may degrade with very large datasets. + + + + + + + +#### TimeSeriesFrequency + + + + + + +####### TimeSeriesFrequency() + +```python +def TimeSeriesFrequency(dataset: VMDataset) +``` + + +Evaluates consistency of time series data frequency and generates a frequency plot. + +###### Purpose + +The purpose of the TimeSeriesFrequency test is to evaluate the consistency in the frequency of data points in a +time-series dataset. This test inspects the intervals or duration between each data point to determine if a fixed +pattern (such as daily, weekly, or monthly) exists. The identification of such patterns is crucial to time-series +analysis as any irregularities could lead to erroneous results and hinder the model's capacity for identifying +trends and patterns. + +###### Test Mechanism + +Initially, the test checks if the dataframe index is in datetime format. Subsequently, it utilizes pandas' +`infer_freq` method to identify the frequency of each data series within the dataframe. The `infer_freq` method +attempts to establish the frequency of a time series and returns both the frequency string and a dictionary +relating these strings to their respective labels. The test compares the frequencies of all datasets. If they share +a common frequency, the test passes, but it fails if they do not. Additionally, Plotly is used to create a +frequency plot, offering a visual depiction of the time differences between consecutive entries in the dataframe +index. + +###### Signs of High Risk + +- The test fails, indicating multiple unique frequencies within the dataset. This failure could suggest irregular +intervals between observations, potentially interrupting pattern recognition or trend analysis. +- The presence of missing or null frequencies could be an indication of inconsistencies in data or gaps within the +data collection process. + +###### Strengths + +- This test uses a systematic approach to checking the consistency of data frequency within a time-series dataset. +- It increases the model's reliability by asserting the consistency of observations over time, an essential factor +in time-series analysis. +- The test generates a visual plot, providing an intuitive representation of the dataset's frequency distribution, +which caters to visual learners and aids in interpretation and explanation. + +###### Limitations + +- This test is only applicable to time-series datasets and hence not suitable for other types of datasets. +- The `infer_freq` method might not always correctly infer frequency when faced with missing or irregular data +points. +- Depending on context or the model under development, mixed frequencies might sometimes be acceptable, but this +test considers them a failing condition. + + + + + + + +#### TimeSeriesHistogram + + + + + + +####### TimeSeriesHistogram() + +```python +def TimeSeriesHistogram(dataset, nbins = 30) +``` + + +Visualizes distribution of time-series data using histograms and Kernel Density Estimation (KDE) lines. + +###### Purpose + +The TimeSeriesHistogram test aims to perform a histogram analysis on time-series data to assess the distribution of +values within a dataset over time. This test is useful for regression tasks and can be applied to various types of +data, such as internet traffic, stock prices, and weather data, providing insights into the probability +distribution, skewness, and kurtosis of the dataset. + +###### Test Mechanism + +This test operates on a specific column within the dataset that must have a datetime type index. For each column in +the dataset, a histogram is created using Plotly's histplot function. If the dataset includes more than one +time-series, a distinct histogram is plotted for each series. Additionally, a Kernel Density Estimate (KDE) line is +drawn for each histogram, visualizing the data's underlying probability distribution. The x and y-axis labels are +hidden to focus solely on the data distribution. + +###### Signs of High Risk + +- The dataset lacks a column with a datetime type index. +- The specified columns do not exist within the dataset. +- High skewness or kurtosis in the data distribution, indicating potential bias. +- Presence of significant outliers in the data distribution. + +###### Strengths + +- Serves as a visual diagnostic tool for understanding data behavior and distribution trends. +- Effective for analyzing both single and multiple time-series data. +- KDE line provides a smooth estimate of the overall trend in data distribution. + +###### Limitations + +- Provides a high-level view without specific numeric measures such as skewness or kurtosis. +- The histogram loses some detail due to binning of data values. +- Cannot handle non-numeric data columns. +- Histogram shape may be sensitive to the number of bins used. + + + + + + + +#### TimeSeriesLinePlot + + + + + + +####### TimeSeriesLinePlot() + +```python +def TimeSeriesLinePlot(dataset: VMDataset) +``` + + +Generates and analyses time-series data through line plots revealing trends, patterns, anomalies over time. + +###### Purpose + +The TimeSeriesLinePlot metric is designed to generate and analyze time series data through the creation of line +plots. This assists in the initial inspection of the data by providing a visual representation of patterns, trends, +seasonality, irregularity, and anomalies that may be present in the dataset over a period of time. + +###### Test Mechanism + +The mechanism for this Python class involves extracting the column names from the provided dataset and subsequently +generating line plots for each column using the Plotly Python library. For every column in the dataset, a +time-series line plot is created where the values are plotted against the dataset's datetime index. It is important +to note that indexes that are not of datetime type will result in a ValueError. + +###### Signs of High Risk + +- Presence of time-series data that does not have datetime indices. +- Provided columns do not exist in the provided dataset. +- The detection of anomalous patterns or irregularities in the time-series plots, indicating potential high model +instability or probable predictive error. + +###### Strengths + +- The visual representation of complex time series data, which simplifies understanding and helps in recognizing +temporal trends, patterns, and anomalies. +- The adaptability of the metric, which allows it to effectively work with multiple time series within the same +dataset. +- Enables the identification of anomalies and irregular patterns through visual inspection, assisting in spotting +potential data or model performance problems. + +###### Limitations + +- The effectiveness of the metric is heavily reliant on the quality and patterns of the provided time series data. +- Exclusively a visual tool, it lacks the capability to provide quantitative measurements, making it less effective +for comparing and ranking multiple models or when specific numerical diagnostics are needed. +- The metric necessitates that the time-specific data has been transformed into a datetime index, with the data +formatted correctly. +- The metric has an inherent limitation in that it cannot extract deeper statistical insights from the time series +data, which can limit its efficacy with complex data structures and phenomena. + + + + + + + +#### TimeSeriesMissingValues + + + + + + +####### TimeSeriesMissingValues() + +```python +def TimeSeriesMissingValues(dataset: VMDataset, min_threshold: int = 1) +``` + + +Validates time-series data quality by confirming the count of missing values is below a certain threshold. + +###### Purpose + +This test is designed to validate the quality of a historical time-series dataset by verifying that the number of +missing values is below a specified threshold. As time-series models greatly depend on the continuity and +temporality of data points, missing values could compromise the model's performance. Consequently, this test aims +to ensure data quality and readiness for the machine learning model, safeguarding its predictive capacity. + +###### Test Mechanism + +The test method commences by validating if the dataset has a datetime index; if not, an error is raised. It +establishes a lower limit threshold for missing values and performs a missing values check on each column of the +dataset. An object for the test result is created stating whether the number of missing values is within the +specified threshold. Additionally, the test calculates the percentage of missing values alongside the raw count. + +###### Signs of High Risk + +- The number of missing values in any column of the dataset surpasses the threshold, marking a failure and a +high-risk scenario. The reasons could range from incomplete data collection, faulty sensors to data preprocessing +errors. + +###### Strengths + +- Effectively identifies missing values which could adversely affect the model’s performance. +- Applicable and customizable through the threshold parameter across different data sets. +- Goes beyond raw numbers by calculating the percentage of missing values, offering a more relative understanding +of data scarcity. + +###### Limitations + +- Although it identifies missing values, the test does not provide solutions to handle them. +- The test demands that the dataset should have a datetime index, hence limiting its use only to time series +analysis. +- The test's sensitivity to the 'min_threshold' parameter may raise false alarms if set too strictly or may +overlook problematic data if set too loosely. +- Solely focuses on the 'missingness' of the data and might fall short in addressing other aspects of data quality. + + + + + + + +#### TimeSeriesOutliers + + + + + + +####### TimeSeriesOutliers() + +```python +def TimeSeriesOutliers(dataset: VMDataset, zscore_threshold: int = 3) +``` + + +Identifies and visualizes outliers in time-series data using the z-score method. + +###### Purpose + +This test is designed to identify outliers in time-series data using the z-score method. It's vital for ensuring +data quality before modeling, as outliers can skew predictive models and significantly impact their overall +performance. + +###### Test Mechanism + +The test processes a given dataset which must have datetime indexing, checks if a 'zscore_threshold' parameter has +been supplied, and identifies columns with numeric data types. After finding numeric columns, the implementer then +applies the z-score method to each numeric column, identifying outliers based on the threshold provided. Each +outlier is listed together with their variable name, z-score, timestamp, and relative threshold in a dictionary and +converted to a DataFrame for convenient output. Additionally, it produces visual plots for each time series +illustrating outliers in the context of the broader dataset. The 'zscore_threshold' parameter sets the limit beyond +which a data point will be labeled as an outlier. The default threshold is set at 3, indicating that any data point +that falls 3 standard deviations away from the mean will be marked as an outlier. + +###### Signs of High Risk + +- Many or substantial outliers are present within the dataset, indicating significant anomalies. +- Data points with z-scores higher than the set threshold. +- Potential impact on the performance of machine learning models if outliers are not properly addressed. + +###### Strengths + +- The z-score method is a popular and robust method for identifying outliers in a dataset. +- Simplifies time series maintenance by requiring a datetime index. +- Identifies outliers for each numeric feature individually. +- Provides an elaborate report showing variables, dates, z-scores, and pass/fail tests. +- Offers visual inspection for detected outliers through plots. + +###### Limitations + +- The test only identifies outliers in numeric columns, not in categorical variables. +- The utility and accuracy of z-scores can be limited if the data doesn't follow a normal distribution. +- The method relies on a subjective z-score threshold for deciding what constitutes an outlier, which might not +always be suitable depending on the dataset and use case. +- It does not address possible ways to handle identified outliers in the data. +- The requirement for a datetime index could limit its application. + + + + + + + +#### TooManyZeroValues + + + + + + +####### TooManyZeroValues() + +```python +def TooManyZeroValues(dataset: VMDataset, max_percent_threshold: float = 0.03) +``` + + +Identifies numerical columns in a dataset that contain an excessive number of zero values, defined by a threshold +percentage. + +###### Purpose + +The 'TooManyZeroValues' test is utilized to identify numerical columns in the dataset that may present a quantity +of zero values considered excessive. The aim is to detect situations where these may implicate data sparsity or a +lack of variation, limiting their effectiveness within a machine learning model. The definition of 'too many' is +quantified as a percentage of total values, with a default set to 3%. + +###### Test Mechanism + +This test is conducted by looping through each column in the dataset and categorizing those that pertain to +numerical data. On identifying a numerical column, the function computes the total quantity of zero values and +their ratio to the total row count. Should the proportion exceed a pre-set threshold parameter, set by default at +0.03 or 3%, the column is considered to have failed the test. The results for each column are summarized and +reported, indicating the count and percentage of zero values for each numerical column, alongside a status +indicating whether the column has passed or failed the test. + +###### Signs of High Risk + +- Numerical columns showing a high ratio of zero values when compared to the total count of rows (exceeding the +predetermined threshold). +- Columns characterized by zero values across the board suggest a complete lack of data variation, signifying high +risk. + +###### Strengths + +- Assists in highlighting columns featuring an excess of zero values that could otherwise go unnoticed within a +large dataset. +- Provides the flexibility to alter the threshold that determines when the quantity of zero values becomes 'too +many', thus catering to specific needs of a particular analysis or model. +- Offers feedback in the form of both counts and percentages of zero values, which allows a closer inspection of +the distribution and proportion of zeros within a column. +- Targets specifically numerical data, thereby avoiding inappropriate application to non-numerical columns and +mitigating the risk of false test failures. + +###### Limitations + +- Is exclusively designed to check for zero values and doesn’t assess the potential impact of other values that +could affect the dataset, such as extremely high or low figures, missing values, or outliers. +- Lacks the ability to detect a repetitive pattern of zeros, which could be significant in time-series or +longitudinal data. +- Zero values can actually be meaningful in some contexts; therefore, tagging them as 'too many' could potentially +misinterpret the data to some extent. +- This test does not take into consideration the context of the dataset, and fails to recognize that within certain +columns, a high number of zero values could be quite normal and not necessarily an indicator of poor data quality. +- Cannot evaluate non-numerical or categorical columns, which might bring with them different types of concerns or +issues. + + + + + + + +#### UniqueRows + + + + + + +####### UniqueRows() + +```python +def UniqueRows(dataset: VMDataset, min_percent_threshold: float = 1) +``` + + +Verifies the diversity of the dataset by ensuring that the count of unique rows exceeds a prescribed threshold. + +###### Purpose + +The UniqueRows test is designed to gauge the quality of the data supplied to the machine learning model by +verifying that the count of distinct rows in the dataset exceeds a specific threshold, thereby ensuring a varied +collection of data. Diversity in data is essential for training an unbiased and robust model that excels when faced +with novel data. + +###### Test Mechanism + +The testing process starts with calculating the total number of rows in the dataset. Subsequently, the count of +unique rows is determined for each column in the dataset. If the percentage of unique rows (calculated as the ratio +of unique rows to the overall row count) is less than the prescribed minimum percentage threshold given as a +function parameter, the test passes. The results are cached and a final pass or fail verdict is given based on +whether all columns have successfully passed the test. + +###### Signs of High Risk + +- A lack of diversity in data columns, demonstrated by a count of unique rows that falls short of the preset +minimum percentage threshold, is indicative of high risk. +- This lack of variety in the data signals potential issues with data quality, possibly leading to overfitting in +the model and issues with generalization, thus posing a significant risk. + +###### Strengths + +- The UniqueRows test is efficient in evaluating the data's diversity across each information column in the dataset. +- This test provides a quick, systematic method to assess data quality based on uniqueness, which can be pivotal in +developing effective and unbiased machine learning models. + +###### Limitations + +- A limitation of the UniqueRows test is its assumption that the data's quality is directly proportionate to its +uniqueness, which may not always hold true. There might be contexts where certain non-unique rows are essential and +should not be overlooked. +- The test does not consider the relative 'importance' of each column in predicting the output, treating all +columns equally. +- This test may not be suitable or useful for categorical variables, where the count of unique categories is +inherently limited. + + + + + + + +#### WOEBinPlots + + + + + + +####### WOEBinPlots() + +```python +def WOEBinPlots(dataset: VMDataset, breaks_adj: list = None, fig_height: int = 600, fig_width: int = 500) +``` + + +Generates visualizations of Weight of Evidence (WoE) and Information Value (IV) for understanding predictive power +of categorical variables in a data set. + +###### Purpose + +This test is designed to visualize the Weight of Evidence (WoE) and Information Value (IV) for categorical +variables in a provided dataset. By showcasing the data distribution across different categories of each feature, +it aids in understanding each variable's predictive power in the context of a classification-based machine learning +model. Commonly used in credit scoring models, WoE and IV are robust statistical methods for evaluating a +variable's predictive power. + +###### Test Mechanism + +The test implementation follows defined steps. Initially, it selects non-numeric columns from the dataset and +changes them to string type, paving the way for accurate binning. It then performs an automated WoE binning +operation on these selected features, effectively categorizing the potential values of a variable into distinct +bins. After the binning process, the function generates two separate visualizations (a scatter chart for WoE values +and a bar chart for IV) for each variable. These visual presentations are formed according to the spread of each +metric across various categories of each feature. + +###### Signs of High Risk + +- Errors occurring during the binning process. +- Challenges in converting non-numeric columns into string data type. +- Misbalance in the distribution of WoE and IV, with certain bins overtaking others conspicuously. This could +denote that the model is disproportionately dependent on certain variables or categories for predictions, an +indication of potential risks to its robustness and generalizability. + +###### Strengths + +- Provides a detailed visual representation of the relationship between feature categories and the target variable. +This grants an intuitive understanding of each feature's contribution to the model. +- Allows for easy identification of features with high impact, facilitating feature selection and enhancing +comprehension of the model's decision logic. +- WoE conversions are monotonic, upholding the rank ordering of the original data points, which simplifies analysis. + +###### Limitations + +- The method is largely reliant on the binning process, and an inappropriate binning threshold or bin number choice +might result in a misrepresentation of the variable's distribution. +- While excellent for categorical data, the encoding of continuous variables into categorical can sometimes lead to +information loss. +- Extreme or outlier values can dramatically affect the computation of WoE and IV, skewing results. +- The method requires a sufficient number of events per bin to generate a reliable information value and weight of +evidence. + + + + + + + +#### WOEBinTable + + + + + + +####### WOEBinTable() + +```python +def WOEBinTable(dataset: VMDataset, breaks_adj: list = None) +``` + + +Assesses the Weight of Evidence (WoE) and Information Value (IV) of each feature to evaluate its predictive power +in a binary classification model. + +###### Purpose + +The Weight of Evidence (WoE) and Information Value (IV) test is designed to evaluate the predictive power of each +feature in a machine learning model. This test generates binned groups of values from each feature, computes the +WoE and IV for each bin, and provides insights into the relationship between each feature and the target variable, +illustrating their contribution to the model's predictive capabilities. + +###### Test Mechanism + +The test uses the `scorecardpy.woebin` method to perform automatic binning of the dataset based on WoE. The method +accepts a list of break points for binning numeric variables through the parameter `breaks_adj`. If no breaks are +provided, it uses default binning. The bins are then used to calculate the WoE and IV values, effectively creating +a dataframe that includes the bin boundaries, WoE, and IV values for each feature. A target variable is required +in the dataset to perform this analysis. + +###### Signs of High Risk + +- High IV values, indicating variables with excessive predictive power which might lead to overfitting. +- Errors during the binning process, potentially due to inappropriate data types or poorly defined bins. + +###### Strengths + +- Highly effective for feature selection in binary classification problems, as it quantifies the predictive +information within each feature concerning the binary outcome. +- The WoE transformation creates a monotonic relationship between the target and independent variables. + +###### Limitations + +- Primarily designed for binary classification tasks, making it less applicable or reliable for multi-class +classification or regression tasks. +- Potential difficulties if the dataset has many features, non-binnable features, or non-numeric features. +- The metric does not help in distinguishing whether the observed predictive factor is due to data randomness or a +true phenomenon. + + + + + + + +#### ZivotAndrewsArch + + + + + + +####### ZivotAndrewsArch() + +```python +def ZivotAndrewsArch(dataset: VMDataset) +``` + + +Evaluates the order of integration and stationarity of time series data using the Zivot-Andrews unit root test. + +###### Purpose + +The Zivot-Andrews Arch metric is used to evaluate the order of integration for time series data in a machine +learning model. It's designed to test for stationarity, a crucial aspect of time series analysis, where data points +are independent of time. Stationarity means that the statistical properties such as mean, variance, and +autocorrelation are constant over time. + +###### Test Mechanism + +The Zivot-Andrews unit root test is performed on each feature in the dataset using the `ZivotAndrews` function from +the `arch.unitroot` module. This function returns several metrics for each feature, including the statistical +value, p-value (probability value), the number of lags used, and the number of observations. The p-value is used to +decide on the null hypothesis (the time series has a unit root and is non-stationary) based on a chosen level of +significance. + +###### Signs of High Risk + +- A high p-value suggests high risk, indicating insufficient evidence to reject the null hypothesis, implying that +the time series has a unit root and is non-stationary. +- Non-stationary time series data can lead to misleading statistics and unreliable machine learning models. + +###### Strengths + +- Dynamically tests for stationarity against structural breaks in time series data, offering robust evaluation of +stationarity in features. +- Especially beneficial with financial, economic, or other time-series data where data observations lack a +consistent pattern and structural breaks may occur. + +###### Limitations + +- Assumes data is derived from a single-equation, autoregressive model, making it less appropriate for multivariate +time series data or data not aligning with this model. +- May not account for unexpected shocks or changes in the series trend, both of which can significantly impact data +stationarity. + + + + + + + +#### nlp + + + + + +##### CommonWords + + + + + + +######## CommonWords() + +```python +def CommonWords(dataset: VMDataset) +``` + + +Assesses the most frequent non-stopwords in a text column for identifying prevalent language patterns. + +###### Purpose + +The CommonWords metric is used to identify and visualize the most prevalent words within a specified text column of +a dataset. This provides insights into the prevalent language patterns and vocabulary, especially useful in Natural +Language Processing (NLP) tasks such as text classification and text summarization. + +###### Test Mechanism + +The test methodology involves splitting the specified text column's entries into words, collating them into a +corpus, and then counting the frequency of each word using the Counter. The forty most frequently occurring +non-stopwords are then visualized in an interactive bar chart using Plotly, where the x-axis represents the words, +and the y-axis indicates their frequency of occurrence. + +###### Signs of High Risk + +- A lack of distinct words within the list, or the most common words being stopwords. +- Frequent occurrence of irrelevant or inappropriate words could point out a poorly curated or noisy dataset. +- An error returned due to the absence of a valid Dataset object, indicating high risk as the metric cannot be +effectively implemented without it. + +###### Strengths + +- The metric provides clear insights into the language features – specifically word frequency – of unstructured +text data. +- It can reveal prominent vocabulary and language patterns, which prove vital for feature extraction in NLP tasks. +- The interactive visualization helps in quickly capturing the patterns and understanding the data intuitively. + +###### Limitations + +- The test disregards semantic or context-related information as it solely focuses on word frequency. +- It intentionally ignores stopwords, which might carry necessary significance in certain scenarios. +- The applicability is limited to English-language text data as English stopwords are used for filtering, hence +cannot account for data in other languages. +- The metric requires a valid Dataset object, indicating a dependency condition that limits its broader +applicability. + + + + + + + +##### Hashtags + + + + + + +######## Hashtags() + +```python +def Hashtags(dataset: VMDataset, top_hashtags: int = 25) +``` + + +Assesses hashtag frequency in a text column, highlighting usage trends and potential dataset bias or spam. + +###### Purpose + +The Hashtags test is designed to measure the frequency of hashtags used within a given text column in a dataset. It +is particularly useful for natural language processing tasks such as text classification and text summarization. +The goal is to identify common trends and patterns in the use of hashtags, which can serve as critical indicators +or features within a machine learning model. + +###### Test Mechanism + +The test implements a regular expression (regex) to extract all hashtags from the specified text column. For each +hashtag found, it makes a tally of its occurrences. It then outputs a list of the top N hashtags (default is 25, +but customizable), sorted by their counts in descending order. The results are also visualized in a bar plot, with +frequency counts on the y-axis and the corresponding hashtags on the x-axis. + +###### Signs of High Risk + +- A low diversity in the usage of hashtags, as indicated by a few hashtags being used disproportionately more than +others. +- Repeated usage of one or few hashtags can be indicative of spam or a biased dataset. +- If there are no or extremely few hashtags found in the dataset, it perhaps signifies that the text data does not +contain structured social media data. + +###### Strengths + +- Provides a concise visual representation of the frequency of hashtags, which can be critical for understanding +trends about a particular topic in text data. +- Instrumental in tasks specifically related to social media text analytics, such as opinion analysis and trend +discovery. +- Adaptable, allowing the flexibility to determine the number of top hashtags to be analyzed. + +###### Limitations + +- Assumes the presence of hashtags and therefore may not be applicable for text datasets that do not contain +hashtags (e.g., formal documents, scientific literature). +- Language-specific limitations of hashtag formulations are not taken into account. +- Does not account for typographical errors, variations, or synonyms in hashtags. +- Does not provide context or sentiment associated with the hashtags, so the information provided may have limited +utility on its own. + + + + + + + +##### LanguageDetection + + + + + + +######## LanguageDetection() + +```python +def LanguageDetection(dataset) +``` + + +Assesses the diversity of languages in a textual dataset by detecting and visualizing the distribution of languages. + +###### Purpose + +The Language Detection test aims to identify and visualize the distribution of languages present within a textual +dataset. This test helps in understanding the diversity of languages in the data, which is crucial for developing +and validating multilingual models. + +###### Test Mechanism + +This test operates by: + +- Checking if the dataset has a specified text column. +- Using a language detection library to determine the language of each text entry in the dataset. +- Generating a histogram plot of the language distribution, with language codes on the x-axis and their frequencies +on the y-axis. + +If the text column is not specified, a ValueError is raised to ensure proper dataset configuration. + +###### Signs of High Risk + +- A high proportion of entries returning "Unknown" language codes. +- Detection of unexpectedly diverse or incorrect language codes, indicating potential data quality issues. +- Significant imbalance in language distribution, which might indicate potential biases in the dataset. + +###### Strengths + +- Provides a visual representation of language diversity within the dataset. +- Helps identify data quality issues related to incorrect or unknown language detection. +- Useful for ensuring that multilingual models have adequate and appropriate representation from various languages. + +###### Limitations + +- Dependency on the accuracy of the language detection library, which may not be perfect. +- Languages with similar structures or limited text length may be incorrectly classified. +- The test returns "Unknown" for entries where language detection fails, which might mask underlying issues with +certain languages or text formats. + + + + + + + +##### Mentions + + + + + + +######## Mentions() + +```python +def Mentions(dataset: VMDataset, top_mentions: int = 25) +``` + + +Calculates and visualizes frequencies of '@' prefixed mentions in a text-based dataset for NLP model analysis. + +###### Purpose + +The "Mentions" test is designed to gauge the quality of data in a Natural Language Processing (NLP) or text-focused +Machine Learning model. The primary objective is to identify and calculate the frequency of 'mentions' within a +chosen text column of a dataset. A 'mention' in this context refers to individual text elements that are prefixed +by '@'. The output of this test reveals the most frequently mentioned entities or usernames, which can be integral +for applications such as social media analyses or customer sentiment analyses. + +###### Test Mechanism + +The test first verifies the existence of a text column in the provided dataset. It then employs a regular +expression pattern to extract mentions from the text. Subsequently, the frequency of each unique mention is +calculated. The test selects the most frequent mentions based on default or user-defined parameters, the default +being the top 25, for representation. This process of thresholding forms the core of the test. A treemap plot +visualizes the test results, where the size of each rectangle corresponds to the frequency of a particular mention. + +###### Signs of High Risk + +- The lack of a valid text column in the dataset, which would result in the failure of the test execution. +- The absence of any mentions within the text data, indicating that there might not be any text associated with +'@'. This situation could point toward sparse or poor-quality data, thereby hampering the model's generalization or +learning capabilities. + +###### Strengths + +- The test is specifically optimized for text-based datasets which gives it distinct power in the context of NLP. +- It enables quick identification and visually appealing representation of the predominant elements or mentions. +- It can provide crucial insights about the most frequently mentioned entities or usernames. + +###### Limitations + +- The test only recognizes mentions that are prefixed by '@', hence useful textual aspects not preceded by '@' +might be ignored. +- This test isn't suited for datasets devoid of textual data. +- It does not provide insights on less frequently occurring data or outliers, which means potentially significant +patterns could be overlooked. + + + + + + + +##### PolarityAndSubjectivity + + + + + + +######## PolarityAndSubjectivity() + +```python +def PolarityAndSubjectivity(dataset, threshold_subjectivity = 0.5, threshold_polarity = 0) +``` + + +Analyzes the polarity and subjectivity of text data within a given dataset to visualize the sentiment distribution. + +###### Purpose + +The Polarity and Subjectivity test is designed to evaluate the sentiment expressed in textual data. By analyzing +these aspects, it helps to identify the emotional tone and subjectivity of the dataset, which could be crucial in +understanding customer feedback, social media sentiments, or other text-related data. + +###### Test Mechanism + +This test uses TextBlob to compute the polarity and subjectivity scores of textual data in a given dataset. The +mechanism includes: + +- Iterating through each text entry in the specified column of the dataset. +- Applying the TextBlob library to compute the polarity (ranging from -1 for negative sentiment to +1 for positive +sentiment) and subjectivity (ranging from 0 for objective to 1 for subjective) for each entry. +- Creating a scatter plot using Plotly to visualize the relationship between polarity and subjectivity. + +###### Signs of High Risk + +- High concentration of negative polarity values indicating prevalent negative sentiments. +- High subjectivity scores suggesting the text data is largely opinion-based rather than factual. +- Disproportionate clusters of extreme scores (e.g., many points near -1 or +1 polarity). + +###### Strengths + +- Quantifies sentiment and subjectivity which can provide actionable insights. +- Visualizes sentiment distribution, aiding in easy interpretation. +- Utilizes well-established TextBlob library for sentiment analysis. + +###### Limitations + +- Polarity and subjectivity calculations may oversimplify nuanced text sentiments. +- Reliance on TextBlob which may not be accurate for all domains or contexts. +- Visualization could become cluttered with very large datasets, making interpretation difficult. + + + + + + + +##### Punctuations + + +Metrics functions for any Pandas-compatible datasets + + + + + +######## Punctuations() + +```python +def Punctuations(dataset, count_mode = 'token') +``` + + +Analyzes and visualizes the frequency distribution of punctuation usage in a given text dataset. + +###### Purpose + +The Punctuations Metric's primary purpose is to analyze the frequency of punctuation usage within a given text +dataset. This is often used in Natural Language Processing tasks, such as text classification and text +summarization. + +###### Test Mechanism + +The test begins by verifying that the input "dataset" is of the type VMDataset. The count_mode parameter must be +either "token" (counts punctuation marks as individual tokens) or "word" (counts punctuation marks within words). +Following that, a corpus is created from the dataset by splitting its text on spaces. Each unique punctuation +character in the text corpus is then tallied. The frequency distribution of each punctuation symbol is visualized +as a bar graph, with these results being stored as Figures and associated with the main Punctuations object. + +###### Signs of High Risk + +- Excessive or unusual frequency of specific punctuation marks, potentially denoting dubious quality, data +corruption, or skewed data. + +###### Strengths + +- Provides valuable insights into the distribution of punctuation usage in a text dataset. +- Important in validating the quality, consistency, and nature of the data. +- Can provide hints about the style or tonality of the text corpus, such as informal and emotional context +indicated by frequent exclamation marks. + +###### Limitations + +- Focuses solely on punctuation usage, potentially missing other important textual characteristics. +- General cultural or tonality assumptions based on punctuation distribution can be misguiding, as these vary +across different languages and contexts. +- Less effective with languages that use non-standard or different punctuation. +- Visualization may lack interpretability when there are many unique punctuation marks in the dataset. + + + + + + + +##### Sentiment + + + + + + +######## Sentiment() + +```python +def Sentiment(dataset) +``` + + +Analyzes the sentiment of text data within a dataset using the VADER sentiment analysis tool. + +###### Purpose + +The Sentiment test evaluates the overall sentiment of text data within a dataset. By analyzing sentiment scores, it +aims to ensure that the model is interpreting text data accurately and is not biased towards a particular sentiment. + +###### Test Mechanism + +This test uses the VADER (Valence Aware Dictionary and sEntiment Reasoner) SentimentIntensityAnalyzer. It processes +each text entry in a specified column of the dataset to calculate the compound sentiment score, which represents +the overall sentiment polarity. The distribution of these sentiment scores is then visualized using a KDE (Kernel +Density Estimation) plot, highlighting any skewness or concentration in sentiment. + +###### Signs of High Risk + +- Extreme polarity in sentiment scores, indicating potential bias. +- Unusual concentration of sentiment scores in a specific range. +- Significant deviation from expected sentiment distribution for the given text data. + +###### Strengths + +- Provides a clear visual representation of sentiment distribution. +- Uses a well-established sentiment analysis tool (VADER). +- Can handle a wide range of text data, making it flexible for various applications. + +###### Limitations + +- May not capture nuanced or context-specific sentiments. +- Relies heavily on the accuracy of the VADER sentiment analysis tool. +- Visualization alone may not provide comprehensive insights into underlying causes of sentiment distribution. + + + + + + + +##### StopWords + + +Threshold based tests + + + + + +######## StopWords() + +```python +def StopWords(dataset: VMDataset, min_percent_threshold: float = 0.5, num_words: int = 25) +``` + + +Evaluates and visualizes the frequency of English stop words in a text dataset against a defined threshold. + +###### Purpose + +The StopWords threshold test is a tool designed for assessing the quality of text data in an ML model. It focuses +on the identification and analysis of "stop words" in a given dataset. Stop words are frequent, common, yet +semantically insignificant words (for example**: "the", "and", "is") in a language. This test evaluates the +proportion of stop words to the total word count in the dataset, in essence, scrutinizing the frequency of stop +word usage. The core objective is to highlight the prevalent stop words based on their usage frequency, which can +be instrumental in cleaning the data from noise and improving ML model performance. + +###### Test Mechanism + +The StopWords test initiates on receiving an input of a 'VMDataset' object. Absence of such an object will trigger +an error. The methodology involves inspection of the text column of the VMDataset to create a 'corpus' (a +collection of written texts). Leveraging the Natural Language Toolkit's (NLTK) stop word repository, the test +screens the corpus for any stop words and documents their frequency. It further calculates the percentage usage of +each stop word compared to the total word count in the corpus. This percentage is evaluated against a predefined +'min_percent_threshold'. If this threshold is breached, the test returns a failed output. Top prevailing stop words +along with their usage percentages are returned, facilitated by a bar chart visualization of these stop words and +their frequency. + +###### Signs of High Risk + +- A percentage of any stop words exceeding the predefined 'min_percent_threshold'. +- High frequency of stop words in the dataset which may adversely affect the application's analytical performance +due to noise creation. + +###### Strengths + +- The ability to scrutinize and quantify the usage of stop words. +- Provides insights into potential noise in the text data due to stop words. +- Directly aids in enhancing model training efficiency. +- Includes a bar chart visualization feature to easily interpret and action upon the stop words frequency +information. + +###### Limitations + +- The test only supports English stop words, making it less effective with datasets of other languages. +- The 'min_percent_threshold' parameter may require fine-tuning for different datasets, impacting the overall +effectiveness of the test. +- Contextual use of the stop words within the dataset is not considered, potentially overlooking their significance +in certain contexts. +- The test focuses specifically on the frequency of stop words, not providing direct measures of model performance +or predictive accuracy. + + + + + + + +##### TextDescription + + + + + + +######## TextDescription() + +```python +def TextDescription(dataset: VMDataset, unwanted_tokens: set = {'cls': 'ExprSet', 'elements': ["'s'", '"s\'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"\'s"', "' '", '"\'\'"', "'dollar'", "'us'", "'``'"]}, lang: str = 'english') +``` + + +Conducts comprehensive textual analysis on a dataset using NLTK to evaluate various parameters and generate +visualizations. + +###### Purpose + +The TextDescription test aims to conduct a thorough textual analysis of a dataset using the NLTK (Natural Language +Toolkit) library. It evaluates various metrics such as total words, total sentences, average sentence length, total +paragraphs, total unique words, most common words, total punctuations, and lexical diversity. The goal is to +understand the nature of the text and anticipate challenges machine learning models might face in text processing, +language understanding, or summarization tasks. + +###### Test Mechanism + +The test works by: + +- Parsing the dataset and tokenizing the text into words, sentences, and paragraphs using NLTK. +- Removing stopwords and unwanted tokens. +- Calculating parameters like total words, total sentences, average sentence length, total paragraphs, total unique +words, total punctuations, and lexical diversity. +- Generating scatter plots to visualize correlations between various metrics (e.g., Total Words vs Total Sentences). + +###### Signs of High Risk + +- Anomalies or increased complexity in lexical diversity. +- Longer sentences and paragraphs. +- High uniqueness of words. +- Large number of unwanted tokens. +- Missing or erroneous visualizations. + +###### Strengths + +- Essential for pre-processing text data in machine learning models. +- Provides a comprehensive breakdown of text data, aiding in understanding its complexity. +- Generates visualizations to help comprehend text structure and complexity. + +###### Limitations + +- Highly dependent on the NLTK library, limiting the test to supported languages. +- Limited customization for removing undesirable tokens and stop words. +- Does not consider semantic or grammatical complexities. +- Assumes well-structured documents, which may result in inaccuracies with poorly formatted text. + + + + +######## create_metrics_df() + +```python +def create_metrics_df(df, text_column, unwanted_tokens, lang) +``` + + + + + + + + +##### Toxicity + + + + + + +######## Toxicity() + +```python +def Toxicity(dataset) +``` + + +Assesses the toxicity of text data within a dataset to visualize the distribution of toxicity scores. + +###### Purpose + +The Toxicity test aims to evaluate the level of toxic content present in a text dataset by leveraging a pre-trained +toxicity model. It helps in identifying potentially harmful or offensive language that may negatively impact users +or stakeholders. + +###### Test Mechanism + +This test uses a pre-trained toxicity evaluation model and applies it to each text entry in the specified column of +a dataset’s dataframe. The procedure involves: + +- Loading a pre-trained toxicity model. +- Extracting the text from the specified column in the dataset. +- Computing toxicity scores for each text entry. +- Generating a KDE (Kernel Density Estimate) plot to visualize the distribution of these toxicity scores. + +###### Signs of High Risk + +- High concentration of high toxicity scores in the KDE plot. +- A significant proportion of text entries with toxicity scores above a predefined threshold. +- Wide distribution of toxicity scores, indicating inconsistency in content quality. + +###### Strengths + +- Provides a visual representation of toxicity distribution, making it easier to identify outliers. +- Uses a robust pre-trained model for toxicity evaluation. +- Can process large text datasets efficiently. + +###### Limitations + +- Depends on the accuracy and bias of the pre-trained toxicity model. +- Does not provide context-specific insights, which may be necessary for nuanced understanding. +- May not capture all forms of subtle or indirect toxic language. + + + + + + + + + + + + + + + +### decorator + + +Decorators for creating and registering tests with the ValidMind Library. + + + + + +###### tags() + +```python +def tags(tags = ()) +``` + + +Decorator for specifying tags for a test. + +**Arguments** + +- ***tags****: The tags to apply to the test. + + + + +###### tasks() + +```python +def tasks(tasks = ()) +``` + + +Decorator for specifying the task types that a test is designed for. + +**Arguments** + +- ***tasks****: The task types that the test is designed for. + + + + +###### test() + +```python +def test(func_or_id) +``` + + +Decorator for creating and registering custom tests + +This decorator registers the function it wraps as a test function within ValidMind +under the provided ID. Once decorated, the function can be run using the +`validmind.tests.run_test` function. + +The function can take two different types of arguments: + +- Inputs**: ValidMind model or dataset (or list of models/datasets). These arguments + must use the following names: `model`, `models`, `dataset`, `datasets`. +- Parameters: Any additional keyword arguments of any type (must have a default + value) that can have any name. + +The function should return one of the following types: + +- Table: Either a list of dictionaries or a pandas DataFrame +- Plot: Either a matplotlib figure or a plotly figure +- Scalar: A single number (int or float) +- Boolean: A single boolean value indicating whether the test passed or failed + +The function may also include a docstring. This docstring will be used and logged +as the metric's description. + +**Arguments** + +- **func**: The function to decorate +- **test_id**: The identifier for the metric. If not provided, the function name is used. + +**Returns** + +- The decorated function. + + + + + + + +### load + + +Module for listing and loading tests. + + + + + +###### describe_test() + +```python +def describe_test(test_id: TestID = None, raw: bool = False, show: bool = True) +``` + + +Get or show details about the test + +This function can be used to see test details including the test name, description, +required inputs and default params. It can also be used to get a dictionary of the +above information for programmatic use. + +**Arguments** + +- **test_id (str, optional)****: The test ID. Defaults to None. +- **raw (bool, optional)**: If True, returns a dictionary with the test details. Defaults to False. + + + + +###### list_tags() + +```python +def list_tags() +``` + + +List unique tags from all test classes. + + + + +###### list_tasks() + +```python +def list_tasks() +``` + + +List unique tasks from all test classes. + + + + +###### list_tasks_and_tags() + +```python +def list_tasks_and_tags(as_json = False) +``` + + +List all task types and their associated tags, with one row per task type and +all tags for a task type in one row. + +**Returns** + +- **pandas.DataFrame****: A DataFrame with 'Task Type' and concatenated 'Tags'. + + + + +###### list_tests() + +```python +def list_tests(filter = None, task = None, tags = None, pretty = True, truncate = True) +``` + + +List all tests in the tests directory. + +**Arguments** + +- **filter (str, optional)****: Find tests where the ID, tasks or tags match the filter string. Defaults to None. +- **task (str, optional)**: Find tests that match the task. Can be used to narrow down matches from the filter string. Defaults to None. +- **tags (list, optional)**: Find tests that match list of tags. Can be used to narrow down matches from the filter string. Defaults to None. +- **pretty (bool, optional)**: If True, returns a pandas DataFrame with a formatted table. Defaults to True. +- **truncate (bool, optional)**: If True, truncates the test description to the first line. Defaults to True. (only used if pretty=True) + +**Returns** + +- **list or pandas.DataFrame**: A list of all tests or a formatted table. + + + + +###### load_test() + +```python +def load_test(test_id: str, test_func: callable = None, reload: bool = False) +``` + + +Load a test by test ID + +Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. +The tag is optional and is used to distinguish between multiple results from the +same test. + +**Arguments** + +- **test_id (str)****: The test ID in the format `namespace.path_to_module.TestName[:tag]` +- **test_func (callable, optional)**: The test function to load. If not provided, the test will be loaded from the test provider. Defaults to None. + + + + + + + +### model_validation + + + + + +#### BertScore + + + + + + +####### BertScore() + +```python +def BertScore(dataset, model, evaluation_model = 'distilbert-base-uncased') +``` + + +Assesses the quality of machine-generated text using BERTScore metrics and visualizes results through histograms +and bar charts, alongside compiling a comprehensive table of descriptive statistics. + +###### Purpose + +This function is designed to assess the quality of text generated by machine learning models using BERTScore +metrics. BERTScore evaluates text generation models' performance by calculating precision, recall, and F1 score +based on BERT contextual embeddings. + +###### Test Mechanism + +The function starts by extracting the true and predicted values from the provided dataset and model. It then +initializes the BERTScore evaluator. For each pair of true and predicted texts, the function calculates the +BERTScore metrics and compiles them into a dataframe. Histograms and bar charts are generated for each BERTScore +metric (Precision, Recall, and F1 Score) to visualize their distribution. Additionally, a table of descriptive +statistics (mean, median, standard deviation, minimum, and maximum) is compiled for each metric, providing a +comprehensive summary of the model's performance. The test uses the `evaluation_model` param to specify the +huggingface model to use for evaluation. `microsoft/deberta-xlarge-mnli` is the best-performing model but is +very large and may be slow without a GPU. `microsoft/deberta-large-mnli` is a smaller model that is faster to +run and `distilbert-base-uncased` is much lighter and can run on a CPU but is less accurate. + +###### Signs of High Risk + +- Consistently low scores across BERTScore metrics could indicate poor quality in the generated text, suggesting +that the model fails to capture the essential content of the reference texts. +- Low precision scores might suggest that the generated text contains a lot of redundant or irrelevant information. +- Low recall scores may indicate that important information from the reference text is being omitted. +- An imbalanced performance between precision and recall, reflected by a low F1 Score, could signal issues in the +model's ability to balance informativeness and conciseness. + +###### Strengths + +- Provides a multifaceted evaluation of text quality through different BERTScore metrics, offering a detailed view +of model performance. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of the +scores. +- Descriptive statistics offer a concise summary of the model's strengths and weaknesses in generating text. + +###### Limitations + +- BERTScore relies on the contextual embeddings from BERT models, which may not fully capture all nuances of text +similarity. +- The evaluation relies on the availability of high-quality reference texts, which may not always be obtainable. +- While useful for comparison, BERTScore metrics alone do not provide a complete assessment of a model's +performance and should be supplemented with other metrics and qualitative analysis. + + + + + + + +#### BleuScore + + + + + + +####### BleuScore() + +```python +def BleuScore(dataset, model) +``` + + +Evaluates the quality of machine-generated text using BLEU metrics and visualizes the results through histograms +and bar charts, alongside compiling a comprehensive table of descriptive statistics for BLEU scores. + +###### Purpose + +This function is designed to assess the quality of text generated by machine learning models using the BLEU metric. +BLEU, which stands for Bilingual Evaluation Understudy, is a metric used to evaluate the overlap of n-grams between +the machine-generated text and reference texts. This evaluation is crucial for tasks such as text summarization, +machine translation, and text generation, where the goal is to produce text that accurately reflects the content +and meaning of human-crafted references. + +###### Test Mechanism + +The function starts by extracting the true and predicted values from the provided dataset and model. It then +initializes the BLEU evaluator. For each pair of true and predicted texts, the function calculates the BLEU scores +and compiles them into a dataframe. Histograms and bar charts are generated for the BLEU scores to visualize their +distribution. Additionally, a table of descriptive statistics (mean, median, standard deviation, minimum, and +maximum) is compiled for the BLEU scores, providing a comprehensive summary of the model's performance. + +###### Signs of High Risk + +- Consistently low BLEU scores could indicate poor quality in the generated text, suggesting that the model fails +to capture the essential content of the reference texts. +- Low precision scores might suggest that the generated text contains a lot of redundant or irrelevant information. +- Low recall scores may indicate that important information from the reference text is being omitted. +- An imbalanced performance between precision and recall, reflected by a low BLEU score, could signal issues in the +model's ability to balance informativeness and conciseness. + +###### Strengths + +- Provides a straightforward and widely-used evaluation of text quality through BLEU scores. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of the +scores. +- Descriptive statistics offer a concise summary of the model's strengths and weaknesses in generating text. + +###### Limitations + +- BLEU metrics primarily focus on n-gram overlap and may not fully capture semantic coherence, fluency, or +grammatical quality of the text. +- The evaluation relies on the availability of high-quality reference texts, which may not always be obtainable. +- While useful for comparison, BLEU scores alone do not provide a complete assessment of a model's performance and +should be supplemented with other metrics and qualitative analysis. + + + + + + + +#### ClusterSizeDistribution + + + + + + +####### ClusterSizeDistribution() + +```python +def ClusterSizeDistribution(dataset: VMDataset, model: VMModel) +``` + + +Assesses the performance of clustering models by comparing the distribution of cluster sizes in model predictions +with the actual data. + +###### Purpose + +The Cluster Size Distribution test aims to assess the performance of clustering models by comparing the +distribution of cluster sizes in the model's predictions with the actual data. This comparison helps determine if +the clustering model's output aligns well with the true cluster distribution, providing insights into the model's +accuracy and performance. + +###### Test Mechanism + +The test mechanism involves the following steps: + +- Run the clustering model on the provided dataset to obtain predictions. +- Convert both the actual and predicted outputs into pandas dataframes. +- Use pandas built-in functions to derive the cluster size distributions from these dataframes. +- Construct two histograms**: one for the actual cluster size distribution and one for the predicted distribution. +- Plot the histograms side-by-side for visual comparison. + +###### Signs of High Risk + +- Discrepancies between the actual cluster size distribution and the predicted cluster size distribution. +- Irregular distribution of data across clusters in the predicted outcomes. +- High number of outlier clusters suggesting the model struggles to correctly group data. + +###### Strengths + +- Provides a visual and intuitive way to compare the clustering model's performance against actual data. +- Effectively reveals where the model may be over- or underestimating cluster sizes. +- Versatile as it works well with any clustering model. + +###### Limitations + +- Assumes that the actual cluster distribution is optimal, which may not always be the case. +- Relies heavily on visual comparison, which could be subjective and may not offer a precise numerical measure of +performance. +- May not fully capture other important aspects of clustering, such as cluster density, distances between clusters, +and the shape of clusters. + + + + + + + +#### ContextualRecall + + + + + + +####### ContextualRecall() + +```python +def ContextualRecall(dataset, model) +``` + + +Evaluates a Natural Language Generation model's ability to generate contextually relevant and factually correct +text, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of +descriptive statistics for contextual recall scores. + +###### Purpose + +The Contextual Recall metric is used to evaluate the ability of a natural language generation (NLG) model to +generate text that appropriately reflects the given context or prompt. It measures the model's capability to +remember and reproduce the main context in its resulting output. This metric is critical in natural language +processing tasks, as the coherency and contextuality of the generated text are essential. + +###### Test Mechanism + +The function starts by extracting the true and predicted values from the provided dataset and model. It then +tokenizes the reference and candidate texts into discernible words or tokens using NLTK. The token overlap between +the reference and candidate texts is identified, and the Contextual Recall score is computed by dividing the number +of overlapping tokens by the total number of tokens in the reference text. Scores are calculated for each test +dataset instance, resulting in an array of scores. These scores are visualized using a histogram and a bar chart to +show score variations across different rows. Additionally, a table of descriptive statistics (mean, median, +standard deviation, minimum, and maximum) is compiled for the contextual recall scores, providing a comprehensive +summary of the model's performance. + +###### Signs of High Risk + +- Low contextual recall scores could indicate that the model is not effectively reflecting the original context in +its output, leading to incoherent or contextually misaligned text. +- A consistent trend of low recall scores could suggest underperformance of the model. + +###### Strengths + +- Provides a quantifiable measure of a model's adherence to the context and factual elements of the generated +narrative. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of +contextual recall scores. +- Descriptive statistics offer a concise summary of the model's performance in generating contextually relevant +texts. + +###### Limitations + +- The focus on word overlap could result in high scores for texts that use many common words, even when these texts +lack coherence or meaningful context. +- This metric does not consider the order of words, which could lead to overestimated scores for scrambled outputs. +- Models that effectively use infrequent words might be undervalued, as these words might not overlap as often. + + + + + + + +#### FeaturesAUC + + + + + + +####### FeaturesAUC() + +```python +def FeaturesAUC(dataset: VMDataset, fontsize: int = 12, figure_height: int = 500) +``` + + +Evaluates the discriminatory power of each individual feature within a binary classification model by calculating +the Area Under the Curve (AUC) for each feature separately. + +###### Purpose + +The central objective of this metric is to quantify how well each feature on its own can differentiate between the +two classes in a binary classification problem. It serves as a univariate analysis tool that can help in +pre-modeling feature selection or post-modeling interpretation. + +###### Test Mechanism + +For each feature, the metric treats the feature values as raw scores to compute the AUC against the actual binary +outcomes. It provides an AUC value for each feature, offering a simple yet powerful indication of each feature's +univariate classification strength. + +###### Signs of High Risk + +- A feature with a low AUC score may not be contributing significantly to the differentiation between the two +classes, which could be a concern if it is expected to be predictive. +- Conversely, a surprisingly high AUC for a feature not believed to be informative may suggest data leakage or +other issues with the data. + +###### Strengths + +- By isolating each feature, it highlights the individual contribution of features to the classification task +without the influence of other variables. +- Useful for both initial feature evaluation and for providing insights into the model's reliance on individual +features after model training. + +###### Limitations + +- Does not reflect the combined effects of features or any interaction between them, which can be critical in +certain models. +- The AUC values are calculated without considering the model's use of the features, which could lead to different +interpretations of feature importance when considering the model holistically. +- This metric is applicable only to binary classification tasks and cannot be directly extended to multiclass +classification or regression without modifications. + + + + + + + +#### MeteorScore + + + + + + +####### MeteorScore() + +```python +def MeteorScore(dataset, model) +``` + + +Assesses the quality of machine-generated translations by comparing them to human-produced references using the +METEOR score, which evaluates precision, recall, and word order. + +###### Purpose + +The METEOR (Metric for Evaluation of Translation with Explicit ORdering) score is designed to evaluate the quality +of machine translations by comparing them against reference translations. It emphasizes both the accuracy and +fluency of translations, incorporating precision, recall, and word order into its assessment. + +###### Test Mechanism + +The function starts by extracting the true and predicted values from the provided dataset and model. The METEOR +score is computed for each pair of machine-generated translation (prediction) and its corresponding human-produced +reference. This is done by considering unigram matches between the translations, including matches based on surface +forms, stemmed forms, and synonyms. The score is a combination of unigram precision and recall, adjusted for word +order through a fragmentation penalty. Scores are compiled into a dataframe, and histograms and bar charts are +generated to visualize the distribution of METEOR scores. Additionally, a table of descriptive statistics (mean, +median, standard deviation, minimum, and maximum) is compiled for the METEOR scores, providing a comprehensive +summary of the model's performance. + +###### Signs of High Risk + +- Lower METEOR scores can indicate a lack of alignment between the machine-generated translations and their +human-produced references, highlighting potential deficiencies in both the accuracy and fluency of translations. +- Significant discrepancies in word order or an excessive fragmentation penalty could signal issues with how the +translation model processes and reconstructs sentence structures, potentially compromising the natural flow of +translated text. +- Persistent underperformance across a variety of text types or linguistic contexts might suggest a broader +inability of the model to adapt to the nuances of different languages or dialects, pointing towards gaps in its +training or inherent limitations. + +###### Strengths + +- Incorporates a balanced consideration of precision and recall, weighted towards recall to reflect the importance +of content coverage in translations. +- Directly accounts for word order, offering a nuanced evaluation of translation fluency beyond simple lexical +matching. +- Adapts to various forms of lexical similarity, including synonyms and stemmed forms, allowing for flexible +matching. + +###### Limitations + +- While comprehensive, the complexity of METEOR's calculation can make it computationally intensive, especially for +large datasets. +- The use of external resources for synonym and stemming matching may introduce variability based on the resources' +quality and relevance to the specific translation task. + + + + + + + +#### ModelMetadata + + + + + + +####### ModelMetadata() + +```python +def ModelMetadata(model) +``` + + +Compare metadata of different models and generate a summary table with the results. + +**Purpose****: The purpose of this function is to compare the metadata of different models, including information about their architecture, framework, framework version, and programming language. + +**Test Mechanism**: The function retrieves the metadata for each model using `get_model_info`, renames columns according to a predefined set of labels, and compiles this information into a summary table. + +**Signs of High Risk**: + +- Inconsistent or missing metadata across models can indicate potential issues in model documentation or management. +- Significant differences in framework versions or programming languages might pose challenges in model integration and deployment. + +**Strengths**: + +- Provides a clear comparison of essential model metadata. +- Standardizes metadata labels for easier interpretation and comparison. +- Helps identify potential compatibility or consistency issues across models. + +**Limitations**: + +- Assumes that the `get_model_info` function returns all necessary metadata fields. +- Relies on the correctness and completeness of the metadata provided by each model. +- Does not include detailed parameter information, focusing instead on high-level metadata. + + + + + + + +#### ModelPredictionResiduals + + + + + + +####### ModelPredictionResiduals() + +```python +def ModelPredictionResiduals(dataset, model, nbins = 100, p_value_threshold = 0.05, start_date = None, end_date = None) +``` + + +Assesses normality and behavior of residuals in regression models through visualization and statistical tests. + +###### Purpose + +The Model Prediction Residuals test aims to visualize the residuals of model predictions and assess their normality +using the Kolmogorov-Smirnov (KS) test. It helps to identify potential issues related to model assumptions and +effectiveness. + +###### Test Mechanism + +The function calculates residuals and generates +two figures**: one for the time series of residuals and one for the histogram of residuals. +It also calculates the KS test for normality and summarizes the results in a table. + +###### Signs of High Risk + +- Residuals are not normally distributed, indicating potential issues with model assumptions. +- High skewness or kurtosis in the residuals, which may suggest model misspecification. + +###### Strengths + +- Provides clear visualizations of residuals over time and their distribution. +- Includes statistical tests to assess the normality of residuals. +- Helps in identifying potential model misspecifications and assumption violations. + +###### Limitations + +- Assumes that the dataset is provided as a DataFrameDataset object with a .df attribute to access the pandas +DataFrame. +- Only generates plots for datasets with a datetime index, resulting in errors for other types of indices. + + + + + + + +#### RegardScore + + + + + + +####### RegardScore() + +```python +def RegardScore(dataset, model) +``` + + +Assesses the sentiment and potential biases in text generated by NLP models by computing and visualizing regard +scores. + +###### Purpose + +The `RegardScore` test aims to evaluate the levels of regard (positive, negative, neutral, or other) in texts +generated by NLP models. It helps in understanding the sentiment and bias present in the generated content. + +###### Test Mechanism + +This test extracts the true and predicted values from the provided dataset and model. It then computes the regard +scores for each text instance using a preloaded `regard` evaluation tool. The scores are compiled into dataframes, +and visualizations such as histograms and bar charts are generated to display the distribution of regard scores. +Additionally, descriptive statistics (mean, median, standard deviation, minimum, and maximum) are calculated for +the regard scores, providing a comprehensive overview of the model's performance. + +###### Signs of High Risk + +- Noticeable skewness in the histogram, especially when comparing the predicted regard scores with the target +regard scores, can indicate biases or inconsistencies in the model. +- Lack of neutral scores in the model's predictions, despite a balanced distribution in the target data, might +signal an issue. + +###### Strengths + +- Provides a clear evaluation of regard levels in generated texts, aiding in ensuring content appropriateness. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of +regard scores. +- Descriptive statistics offer a concise summary of the model's performance in generating texts with balanced +sentiments. + +###### Limitations + +- The accuracy of the regard scores is contingent upon the underlying `regard` tool. +- The scores provide a broad overview but do not specify which portions or tokens of the text are responsible for +high regard. +- Supplementary, in-depth analysis might be needed for granular insights. + + + + + + + +#### RegressionResidualsPlot + + + + + + +####### RegressionResidualsPlot() + +```python +def RegressionResidualsPlot(model: VMModel, dataset: VMDataset, bin_size: float = 0.1) +``` + + +Evaluates regression model performance using residual distribution and actual vs. predicted plots. + +###### Purpose + +The `RegressionResidualsPlot` metric aims to evaluate the performance of regression models. By generating and +analyzing two plots – a distribution of residuals and a scatter plot of actual versus predicted values – this tool +helps to visually appraise how well the model predicts and the nature of errors it makes. + +###### Test Mechanism + +The process begins by extracting the true output values (`y_true`) and the model's predicted values (`y_pred`). +Residuals are computed by subtracting predicted from true values. These residuals are then visualized using a +histogram to display their distribution. Additionally, a scatter plot is derived to compare true values against +predicted values, together with a "Perfect Fit" line, which represents an ideal match (predicted values equal +actual values), facilitating the assessment of the model's predictive accuracy. + +###### Signs of High Risk + +- Residuals showing a non-normal distribution, especially those with frequent extreme values. +- Significant deviations of predicted values from actual values in the scatter plot. +- Sparse density of data points near the "Perfect Fit" line in the scatter plot, indicating poor prediction +accuracy. +- Visible patterns or trends in the residuals plot, suggesting the model's failure to capture the underlying data +structure adequately. + +###### Strengths + +- Provides a direct, visually intuitive assessment of a regression model’s accuracy and handling of data. +- Visual plots can highlight issues of underfitting or overfitting. +- Can reveal systematic deviations or trends that purely numerical metrics might miss. +- Applicable across various regression model types. + +###### Limitations + +- Relies on visual interpretation, which can be subjective and less precise than numerical evaluations. +- May be difficult to interpret in cases with multi-dimensional outputs due to the plots’ two-dimensional nature. +- Overlapping data points in the residuals plot can complicate interpretation efforts. +- Does not summarize model performance into a single quantifiable metric, which might be needed for comparative or +summary analyses. + + + + + + + +#### RougeScore + + + + + + +####### RougeScore() + +```python +def RougeScore(dataset, model, metric = 'rouge-1') +``` + + +Assesses the quality of machine-generated text using ROUGE metrics and visualizes the results to provide +comprehensive performance insights. + +###### Purpose + +The ROUGE Score test is designed to evaluate the quality of text generated by machine learning models using various +ROUGE metrics. ROUGE, which stands for Recall-Oriented Understudy for Gisting Evaluation, measures the overlap of +n-grams, word sequences, and word pairs between machine-generated text and reference texts. This evaluation is +crucial for tasks like text summarization, machine translation, and text generation, where the goal is to produce +text that accurately reflects the content and meaning of human-crafted references. + +###### Test Mechanism + +The test extracts the true and predicted values from the provided dataset and model. It initializes the ROUGE +evaluator with the specified metric (e.g., ROUGE-1). For each pair of true and predicted texts, it calculates the +ROUGE scores and compiles them into a dataframe. Histograms and bar charts are generated for each ROUGE metric +(Precision, Recall, and F1 Score) to visualize their distribution. Additionally, a table of descriptive statistics +(mean, median, standard deviation, minimum, and maximum) is compiled for each metric, providing a comprehensive +summary of the model's performance. + +###### Signs of High Risk + +- Consistently low scores across ROUGE metrics could indicate poor quality in the generated text, suggesting that +the model fails to capture the essential content of the reference texts. +- Low precision scores might suggest that the generated text contains a lot of redundant or irrelevant information. +- Low recall scores may indicate that important information from the reference text is being omitted. +- An imbalanced performance between precision and recall, reflected by a low F1 Score, could signal issues in the +model's ability to balance informativeness and conciseness. + +###### Strengths + +- Provides a multifaceted evaluation of text quality through different ROUGE metrics, offering a detailed view of +model performance. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of the +scores. +- Descriptive statistics offer a concise summary of the model's strengths and weaknesses in generating text. + +###### Limitations + +- ROUGE metrics primarily focus on n-gram overlap and may not fully capture semantic coherence, fluency, or +grammatical quality of the text. +- The evaluation relies on the availability of high-quality reference texts, which may not always be obtainable. +- While useful for comparison, ROUGE scores alone do not provide a complete assessment of a model's performance and +should be supplemented with other metrics and qualitative analysis. + + + + + + + +#### TimeSeriesPredictionWithCI + + + + + + +####### TimeSeriesPredictionWithCI() + +```python +def TimeSeriesPredictionWithCI(dataset, model, confidence = 0.95) +``` + + +Assesses predictive accuracy and uncertainty in time series models, highlighting breaches beyond confidence +intervals. + +###### Purpose + +The purpose of the Time Series Prediction with Confidence Intervals (CI) test is to visualize the actual versus +predicted values for time series data, including confidence intervals, and to compute and report the number of +breaches beyond these intervals. This helps in evaluating the reliability and accuracy of the model's predictions. + +###### Test Mechanism + +The function performs the following steps: + +- Calculates the standard deviation of prediction errors. +- Determines the confidence intervals using a specified confidence level, typically 95%. +- Counts the number of actual values that fall outside the confidence intervals, referred to as breaches. +- Generates a plot visualizing the actual values, predicted values, and confidence intervals. +- Returns a DataFrame summarizing the breach information, including the total breaches, upper breaches, and lower +breaches. + +###### Signs of High Risk + +- A high number of breaches indicates that the model's predictions are not reliable within the specified confidence +level. +- Significant deviations between actual and predicted values may highlight model inadequacies or issues with data +quality. + +###### Strengths + +- Provides a visual representation of prediction accuracy and the uncertainty around predictions. +- Includes a statistical measure of prediction reliability through confidence intervals. +- Computes and reports breaches, offering a quantitative assessment of prediction performance. + +###### Limitations + +- Assumes that the dataset is provided as a DataFrameDataset object with a datetime index. +- Requires that `dataset.y_pred(model)` returns the predicted values for the model. +- The calculation of confidence intervals assumes normally distributed errors, which may not hold for all datasets. + + + + + + + +#### TimeSeriesPredictionsPlot + + + + + + +####### TimeSeriesPredictionsPlot() + +```python +def TimeSeriesPredictionsPlot(dataset, model) +``` + + +Plot actual vs predicted values for time series data and generate a visual comparison for the model. + +###### Purpose + +The purpose of this function is to visualize the actual versus predicted values for time +series data for a single model. + +###### Test Mechanism + +The function plots the actual values from the dataset and overlays the predicted +values from the model using Plotly for interactive visualization. + +- Large discrepancies between actual and predicted values indicate poor model performance. +- Systematic deviations in predicted values can highlight model bias or issues with data patterns. + +###### Strengths + +- Provides a clear visual comparison of model predictions against actual values. +- Uses Plotly for interactive and visually appealing plots. + +###### Limitations + +- Assumes that the dataset is provided as a DataFrameDataset object with a datetime index. +- Requires that `dataset.y_pred(model)` returns the predicted values for the model. + + + + + + + +#### TimeSeriesR2SquareBySegments + + + + + + +####### TimeSeriesR2SquareBySegments() + +```python +def TimeSeriesR2SquareBySegments(dataset, model, segments = None) +``` + + +Evaluates the R-Squared values of regression models over specified time segments in time series data to assess +segment-wise model performance. + +###### Purpose + +The TimeSeriesR2SquareBySegments test aims to evaluate the R-Squared values for several regression models across +different segments of time series data. This helps in determining how well the models explain the variability in +the data within each specific time segment. + +###### Test Mechanism +- Provides a visual representation of model performance across different time segments. +- Allows for identification of segments where the model performs poorly. +- Calculating the R-Squared values for each segment. +- Generating a bar chart to visually represent the R-Squared values across different models and segments. + +###### Signs of High Risk + +- Significantly low R-Squared values for certain time segments, indicating poor model performance in those periods. +- Large variability in R-Squared values across different segments for the same model, suggesting inconsistent +performance. + +###### Strengths + +- Provides a visual representation of how well models perform over different time periods. +- Helps identify time segments where models may need improvement or retraining. +- Facilitates comparison between multiple models in a straightforward manner. + +###### Limitations + +- Assumes datasets are provided as DataFrameDataset objects with the attributes `y`, `y_pred`, and +`feature_columns`. +- Requires that `dataset.y_pred(model)` returns predicted values for the model. +- Assumes that both `y_true` and `y_pred` are pandas Series with datetime indices, which may not always be the case. +- May not account for more nuanced temporal dependencies within the segments. + + + + + + + +#### TokenDisparity + + + + + + +####### TokenDisparity() + +```python +def TokenDisparity(dataset, model) +``` + + +Evaluates the token disparity between reference and generated texts, visualizing the results through histograms and +bar charts, alongside compiling a comprehensive table of descriptive statistics for token counts. + +###### Purpose + +The Token Disparity test aims to assess the difference in the number of tokens between reference texts and texts +generated by the model. Understanding token disparity is essential for evaluating how well the generated content +matches the expected length and richness of the reference texts. + +###### Test Mechanism + +The test extracts true and predicted values from the dataset and model. It computes the number of tokens in each +reference and generated text. The results are visualized using histograms and bar charts to display the +distribution of token counts. Additionally, a table of descriptive statistics, including the mean, median, standard +deviation, minimum, and maximum token counts, is compiled to provide a detailed summary of token usage. + +###### Signs of High Risk + +- Significant disparity in token counts between reference and generated texts could indicate issues with text +generation quality, such as verbosity or lack of detail. +- Consistently low token counts in generated texts compared to references might suggest that the model is producing +incomplete or overly concise outputs. + +###### Strengths + +- Provides a simple yet effective evaluation of text length and token usage. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of +token counts. +- Descriptive statistics offer a concise summary of the model's performance in generating texts of appropriate +length. + +###### Limitations + +- Token counts alone do not provide a complete assessment of text quality and should be supplemented with other +metrics and qualitative analysis. + + + + + + + +#### ToxicityScore + + + + + + +####### ToxicityScore() + +```python +def ToxicityScore(dataset, model) +``` + + +Assesses the toxicity levels of texts generated by NLP models to identify and mitigate harmful or offensive content. + +###### Purpose + +The ToxicityScore metric is designed to evaluate the toxicity levels of texts generated by models. This is crucial +for identifying and mitigating harmful or offensive content in machine-generated texts. + +###### Test Mechanism + +The function starts by extracting the input, true, and predicted values from the provided dataset and model. The +toxicity score is computed for each text using a preloaded `toxicity` evaluation tool. The scores are compiled into +dataframes, and histograms and bar charts are generated to visualize the distribution of toxicity scores. +Additionally, a table of descriptive statistics (mean, median, standard deviation, minimum, and maximum) is +compiled for the toxicity scores, providing a comprehensive summary of the model's performance. + +###### Signs of High Risk + +- Drastic spikes in toxicity scores indicate potentially toxic content within the associated text segment. +- Persistent high toxicity scores across multiple texts may suggest systemic issues in the model's text generation +process. + +###### Strengths + +- Provides a clear evaluation of toxicity levels in generated texts, helping to ensure content safety and +appropriateness. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of +toxicity scores. +- Descriptive statistics offer a concise summary of the model's performance in generating non-toxic texts. + +###### Limitations + +- The accuracy of the toxicity scores is contingent upon the underlying `toxicity` tool. +- The scores provide a broad overview but do not specify which portions or tokens of the text are responsible for +high toxicity. +- Supplementary, in-depth analysis might be needed for granular insights. + + + + + + + +#### sklearn + + + + + +##### AdjustedMutualInformation + + + + + + +######## AdjustedMutualInformation() + +```python +def AdjustedMutualInformation(model: VMModel, dataset: VMDataset) +``` + + +Evaluates clustering model performance by measuring mutual information between true and predicted labels, adjusting +for chance. + +###### Purpose + +The purpose of this metric (Adjusted Mutual Information) is to evaluate the performance of a machine learning +model, more specifically, a clustering model. It measures the mutual information between the true labels and the +ones predicted by the model, adjusting for chance. + +###### Test Mechanism + +The Adjusted Mutual Information (AMI) uses sklearn's `adjusted_mutual_info_score` function. This function +calculates the mutual information between the true labels and the ones predicted while correcting for the chance +correlation expected due to random label assignments. This test requires the model, the training dataset, and the +test dataset as inputs. + +###### Signs of High Risk + +- Low Adjusted Mutual Information Score**: This score ranges between 0 and 1. A low score (closer to 0) can indicate +poor model performance as the predicted labels do not align well with the true labels. +- In case of high-dimensional data, if the algorithm shows high scores, this could also be a potential risk as AMI +may not perform reliably. + +###### Strengths + +- The AMI metric takes into account the randomness of the predicted labels, which makes it more robust than the +simple Mutual Information. +- The scale of AMI is not dependent on the sizes of the clustering, allowing for comparability between different +datasets or models. +- Good for comparing the output of clustering algorithms where the number of clusters is not known a priori. + +###### Limitations + +- Adjusted Mutual Information does not take into account the continuous nature of some data. As a result, it may +not be the best choice for regression or other continuous types of tasks. +- AMI has the drawback of being biased towards clusterings with a higher number of clusters. +- In comparison to other metrics, AMI can be slower to compute. +- The interpretability of the score can be complex as it depends on the understanding of information theory +concepts. + + + + + + + +##### AdjustedRandIndex + + + + + + +######## AdjustedRandIndex() + +```python +def AdjustedRandIndex(model: VMModel, dataset: VMDataset) +``` + + +Measures the similarity between two data clusters using the Adjusted Rand Index (ARI) metric in clustering machine +learning models. + +###### Purpose + +The Adjusted Rand Index (ARI) metric is intended to measure the similarity between two data clusters. This metric +is specifically used for clustering machine learning models to quantify how well the model is clustering and +producing data groups. It involves comparing the model's produced clusters against the actual (true) clusters found +in the dataset. + +###### Test Mechanism + +The Adjusted Rand Index (ARI) is calculated using the `adjusted_rand_score` method from the `sklearn.metrics` +module in Python. The test requires inputs including the model itself and the model's training and test datasets. +The model's computed clusters and the true clusters are compared, and the similarities are measured to compute the +ARI. + +###### Signs of High Risk + +- If the ARI is close to zero, it signifies that the model's cluster assignments are random and do not match the +actual dataset clusters, indicating a high risk. +- An ARI of less than zero indicates that the model's clustering performance is worse than random. + +###### Strengths + +- ARI is normalized and provides a consistent metric between -1 and +1, irrespective of raw cluster sizes or +dataset size variations. +- It does not require a ground truth for computation, making it ideal for unsupervised learning model evaluations. +- It penalizes for false positives and false negatives, providing a robust measure of clustering quality. + +###### Limitations + +- In real-world situations, true clustering is often unknown, which can hinder the practical application of the ARI. +- The ARI requires all individual data instances to be independent, which may not always hold true. +- It may be difficult to interpret the implications of an ARI score without context or a benchmark, as it is +heavily dependent on the characteristics of the dataset used. + + + + + + + +##### CalibrationCurve + + + + + + +######## CalibrationCurve() + +```python +def CalibrationCurve(model: VMModel, dataset: VMDataset, n_bins: int = 10) +``` + + +Evaluates the calibration of probability estimates by comparing predicted probabilities against observed +frequencies. + +###### Purpose + +The Calibration Curve test assesses how well a model's predicted probabilities align with actual +observed frequencies. This is crucial for applications requiring accurate probability estimates, +such as risk assessment, decision-making systems, and cost-sensitive applications where probability +calibration directly impacts business decisions. + +###### Test Mechanism + +The test uses sklearn's calibration_curve function to: +1. Sort predictions into bins based on predicted probabilities +2. Calculate the mean predicted probability in each bin +3. Compare against the observed frequency of positive cases +4. Plot the results against the perfect calibration line (y=x) +The resulting curve shows how well the predicted probabilities match empirical probabilities. + +###### Signs of High Risk + +- Significant deviation from the perfect calibration line +- Systematic overconfidence (predictions too close to 0 or 1) +- Systematic underconfidence (predictions clustered around 0.5) +- Empty or sparse bins indicating poor probability coverage +- Sharp discontinuities in the calibration curve +- Different calibration patterns across different probability ranges +- Consistent over/under estimation in critical probability regions +- Large confidence intervals in certain probability ranges + +###### Strengths + +- Visual and intuitive interpretation of probability quality +- Identifies systematic biases in probability estimates +- Supports probability threshold selection +- Helps understand model confidence patterns +- Applicable across different classification models +- Enables comparison between different models +- Guides potential need for recalibration +- Critical for risk-sensitive applications + +###### Limitations + +- Sensitive to the number of bins chosen +- Requires sufficient samples in each bin for reliable estimates +- May mask local calibration issues within bins +- Does not account for feature-dependent calibration issues +- Limited to binary classification problems +- Cannot detect all forms of miscalibration +- Assumes bin boundaries are appropriate for the problem +- May be affected by class imbalance + + + + + + + +##### ClassifierPerformance + + + + + + +######## ClassifierPerformance() + +```python +def ClassifierPerformance(dataset: VMDataset, model: VMModel, average: str = 'macro') +``` + + +Evaluates performance of binary or multiclass classification models using precision, recall, F1-Score, accuracy, +and ROC AUC scores. + +###### Purpose + +The Classifier Performance test is designed to evaluate the performance of Machine Learning classification models. +It accomplishes this by computing precision, recall, F1-Score, and accuracy, as well as the ROC AUC (Receiver +operating characteristic - Area under the curve) scores, thereby providing a comprehensive analytic view of the +models' performance. The test is adaptable, handling binary and multiclass models equally effectively. + +###### Test Mechanism + +The test produces a report that includes precision, recall, F1-Score, and accuracy, by leveraging the +`classification_report` from scikit-learn's metrics module. For multiclass models, macro and weighted averages for +these scores are also calculated. Additionally, the ROC AUC scores are calculated and included in the report using +the `multiclass_roc_auc_score` function. The outcome of the test (report format) differs based on whether the model +is binary or multiclass. + +###### Signs of High Risk + +- Low values for precision, recall, F1-Score, accuracy, and ROC AUC, indicating poor performance. +- Imbalance in precision and recall scores. +- A low ROC AUC score, especially scores close to 0.5 or lower, suggesting a failing model. + +###### Strengths + +- Versatile, capable of assessing both binary and multiclass models. +- Utilizes a variety of commonly employed performance metrics, offering a comprehensive view of model performance. +- The use of ROC-AUC as a metric is beneficial for evaluating unbalanced datasets. + +###### Limitations + +- Assumes correctly identified labels for binary classification models. +- Specifically designed for classification models and not suitable for regression models. +- May provide limited insights if the test dataset does not represent real-world scenarios adequately. + + + + +######## multiclass_roc_auc_score() + +```python +def multiclass_roc_auc_score(y_test, y_pred, average = 'macro') +``` + + + + + + + + +##### ClassifierThresholdOptimization + + + + + + +######## ClassifierThresholdOptimization() + +```python +def ClassifierThresholdOptimization(dataset: VMDataset, model: VMModel, methods = None, target_recall = None) +``` + + +Analyzes and visualizes different threshold optimization methods for binary classification models. + +###### Purpose + +The Classifier Threshold Optimization test identifies optimal decision thresholds using various +methods to balance different performance metrics. This helps adapt the model's decision boundary +to specific business requirements, such as minimizing false positives in fraud detection or +achieving target recall in medical diagnosis. + +###### Test Mechanism + +The test implements multiple threshold optimization methods: +1. Youden's J statistic (maximizing sensitivity + specificity - 1) +2. F1-score optimization (balancing precision and recall) +3. Precision-Recall equality point +4. Target recall achievement +5. Naive (0.5) threshold +For each method, it computes ROC and PR curves, identifies optimal points, and provides +comprehensive performance metrics at each threshold. + +###### Signs of High Risk + +- Large discrepancies between different optimization methods +- Optimal thresholds far from the default 0.5 +- Poor performance metrics across all thresholds +- Significant gap between achieved and target recall +- Unstable thresholds across different methods +- Extreme trade-offs between precision and recall +- Threshold optimization showing minimal impact +- Business metrics not improving with optimization + +###### Strengths + +- Multiple optimization strategies for different needs +- Visual and numerical results for comparison +- Support for business-driven optimization (target recall) +- Comprehensive performance metrics at each threshold +- Integration with ROC and PR curves +- Handles class imbalance through various metrics +- Enables informed threshold selection +- Supports cost-sensitive decision making + +###### Limitations + +- Assumes cost of false positives/negatives are known +- May need adjustment for highly imbalanced datasets +- Threshold might not be stable across different samples +- Cannot handle multi-class problems directly +- Optimization methods may conflict with business needs +- Requires sufficient validation data +- May not capture temporal changes in optimal threshold +- Single threshold may not be optimal for all subgroups + +**Arguments** + +- **dataset****: VMDataset containing features and target +- **model**: VMModel containing predictions +- **methods**: List of methods to compare (default: ['youden', 'f1', 'precision_recall']) +- **target_recall**: Target recall value if using 'target_recall' method + +**Returns** + +- **Dictionary containing**: - table: DataFrame comparing different threshold optimization methods (using weighted averages for precision, recall, and f1) - figure: Plotly figure showing ROC and PR curves with optimal thresholds + + + + +######## find_optimal_threshold() + +```python +def find_optimal_threshold(y_true, y_prob, method = 'youden', target_recall = None) +``` + + +Find the optimal classification threshold using various methods. + +**Arguments** + +- **y_true****: True binary labels +- **y_prob**: Predicted probabilities +- **method**: Method to use for finding optimal threshold +- **target_recall**: Required if method='target_recall' + +**Returns** + +- **dict**: Dictionary containing threshold and metrics + + + + + + + +##### ClusterCosineSimilarity + + + + + + +######## ClusterCosineSimilarity() + +```python +def ClusterCosineSimilarity(model: VMModel, dataset: VMDataset) +``` + + +Measures the intra-cluster similarity of a clustering model using cosine similarity. + +###### Purpose + +The purpose of this metric is to measure how similar the data points within each cluster of a clustering model are. +This is done using cosine similarity, which compares the multi-dimensional direction (but not magnitude) of data +vectors. From a Model Risk Management perspective, this metric is used to quantitatively validate that clusters +formed by a model have high intra-cluster similarity. + +###### Test Mechanism + +This test works by first extracting the true and predicted clusters of the model's training data. Then, it computes +the centroid (average data point) of each cluster. Next, it calculates the cosine similarity between each data +point within a cluster and its respective centroid. Finally, it outputs the mean cosine similarity of each cluster, +highlighting how similar, on average, data points in a cluster are to the cluster's centroid. + +###### Signs of High Risk + +- Low mean cosine similarity for one or more clusters**: If the mean cosine similarity is low, the data points within +the respective cluster have high variance in their directions. This can be indicative of poor clustering, +suggesting that the model might not be suitably separating the data into distinct patterns. +- High disparity between mean cosine similarity values across clusters: If there's a significant difference in mean +cosine similarity across different clusters, this could indicate imbalance in how the model forms clusters. + +###### Strengths + +- Cosine similarity operates in a multi-dimensional space, making it effective for measuring similarity in high +dimensional datasets, typical for many machine learning problems. +- It provides an agnostic view of the cluster performance by only considering the direction (and not the magnitude) +of each vector. +- This metric is not dependent on the scale of the variables, making it equally effective on different scales. + +###### Limitations + +- Cosine similarity does not consider magnitudes (i.e. lengths) of vectors, only their direction. This means it may +overlook instances where clusters have been adequately separated in terms of magnitude. +- This method summarily assumes that centroids represent the average behavior of data points in each cluster. This +might not always be true, especially in clusters with high amounts of variance or non-spherical shapes. +- It primarily works with continuous variables and is not suitable for binary or categorical variables. +- Lastly, although rare, perfect perpendicular vectors (cosine similarity = 0) could be within the same cluster, +which may give an inaccurate representation of a 'bad' cluster due to low cosine similarity score. + + + + + + + +##### ClusterPerformanceMetrics + + + + + + +######## ClusterPerformanceMetrics() + +```python +def ClusterPerformanceMetrics(model: VMModel, dataset: VMDataset) +``` + + +Evaluates the performance of clustering machine learning models using multiple established metrics. + +###### Purpose + +The `ClusterPerformanceMetrics` test is used to assess the performance and validity of clustering machine learning +models. It evaluates homogeneity, completeness, V measure score, the Adjusted Rand Index, the Adjusted Mutual +Information, and the Fowlkes-Mallows score of the model. These metrics provide a holistic understanding of the +model's ability to accurately form clusters of the given dataset. + +###### Test Mechanism + +The `ClusterPerformanceMetrics` test runs a clustering ML model over a given dataset and then calculates six +metrics using the Scikit-learn metrics computation functions**: Homogeneity Score, Completeness Score, V Measure, +Adjusted Rand Index (ARI), Adjusted Mutual Information (AMI), and Fowlkes-Mallows Score. It then returns the result +as a summary, presenting the metric values for both training and testing datasets. + +###### Signs of High Risk + +- Low Homogeneity Score: Indicates that the clusters formed contain a variety of classes, resulting in less pure +clusters. +- Low Completeness Score: Suggests that class instances are scattered across multiple clusters rather than being +gathered in a single cluster. +- Low V Measure: Reports a low overall clustering performance. +- ARI close to 0 or Negative: Implies that clustering results are random or disagree with the true labels. +- AMI close to 0: Means that clustering labels are random compared with the true labels. +- Low Fowlkes-Mallows score: Signifies less precise and poor clustering performance in terms of precision and +recall. + +###### Strengths + +- Provides a comprehensive view of clustering model performance by examining multiple clustering metrics. +- Uses established and widely accepted metrics from scikit-learn, providing reliability in the results. +- Able to provide performance metrics for both training and testing datasets. +- Clearly defined and human-readable descriptions of each score make it easy to understand what each score +represents. + +###### Limitations + +- Only applies to clustering models; not suitable for other types of machine learning models. +- Does not test for overfitting or underfitting in the clustering model. +- All the scores rely on ground truth labels, the absence or inaccuracy of which can lead to misleading results. +- Does not consider aspects like computational efficiency of the model or its capability to handle high dimensional +data. + + + + + + + +##### CompletenessScore + + + + + + +######## CompletenessScore() + +```python +def CompletenessScore(model: VMModel, dataset: VMDataset) +``` + + +Evaluates a clustering model's capacity to categorize instances from a single class into the same cluster. + +###### Purpose + +The Completeness Score metric is used to assess the performance of clustering models. It measures the extent to +which all the data points that are members of a given class are elements of the same cluster. The aim is to +determine the capability of the model to categorize all instances from a single class into the same cluster. + +###### Test Mechanism + +This test takes three inputs, a model and its associated training and testing datasets. It invokes the +`completeness_score` function from the sklearn library on the labels predicted by the model. High scores indicate +that data points from the same class generally appear in the same cluster, while low scores suggest the opposite. + +###### Signs of High Risk + +- Low completeness score**: This suggests that the model struggles to group instances from the same class into one +cluster, indicating poor clustering performance. + +###### Strengths + +- The Completeness Score provides an effective method for assessing the performance of a clustering model, +specifically its ability to group class instances together. +- This test metric conveniently relies on the capabilities provided by the sklearn library, ensuring consistent and +reliable test results. + +###### Limitations + +- This metric only evaluates a specific aspect of clustering, meaning it may not provide a holistic or complete +view of the model's performance. +- It cannot assess the effectiveness of the model in differentiating between separate classes, as it is solely +focused on how well data points from the same class are grouped. +- The Completeness Score only applies to clustering models; it cannot be used for other types of machine learning +models. + + + + + + + +##### ConfusionMatrix + + + + + + +######## ConfusionMatrix() + +```python +def ConfusionMatrix(dataset: VMDataset, model: VMModel) +``` + + +Evaluates and visually represents the classification ML model's predictive performance using a Confusion Matrix +heatmap. + +###### Purpose + +The Confusion Matrix tester is designed to assess the performance of a classification Machine Learning model. This +performance is evaluated based on how well the model is able to correctly classify True Positives, True Negatives, +False Positives, and False Negatives - fundamental aspects of model accuracy. + +###### Test Mechanism + +The mechanism used involves taking the predicted results (`y_test_predict`) from the classification model and +comparing them against the actual values (`y_test_true`). A confusion matrix is built using the unique labels +extracted from `y_test_true`, employing scikit-learn's metrics. The matrix is then visually rendered with the help +of Plotly's `create_annotated_heatmap` function. A heatmap is created which provides a two-dimensional graphical +representation of the model's performance, showcasing distributions of True Positives (TP), True Negatives (TN), +False Positives (FP), and False Negatives (FN). + +###### Signs of High Risk + +- High numbers of False Positives (FP) and False Negatives (FN), depicting that the model is not effectively +classifying the values. +- Low numbers of True Positives (TP) and True Negatives (TN), implying that the model is struggling with correctly +identifying class labels. + +###### Strengths + +- It provides a simplified yet comprehensive visual snapshot of the classification model's predictive performance. +- It distinctly brings out True Positives (TP), True Negatives (TN), False Positives (FP), and False Negatives +(FN), thus making it easier to focus on potential areas of improvement. +- The matrix is beneficial in dealing with multi-class classification problems as it can provide a simple view of +complex model performances. +- It aids in understanding the different types of errors that the model could potentially make, as it provides +in-depth insights into Type-I and Type-II errors. + +###### Limitations + +- In cases of unbalanced classes, the effectiveness of the confusion matrix might be lessened. It may wrongly +interpret the accuracy of a model that is essentially just predicting the majority class. +- It does not provide a single unified statistic that could evaluate the overall performance of the model. +Different aspects of the model's performance are evaluated separately instead. +- It mainly serves as a descriptive tool and does not offer the capability for statistical hypothesis testing. +- Risks of misinterpretation exist because the matrix doesn't directly provide precision, recall, or F1-score data. +These metrics have to be computed separately. + + + + + + + +##### FeatureImportance + + + + + + +######## FeatureImportance() + +```python +def FeatureImportance(dataset: VMDataset, model: VMModel, num_features: int = 3) +``` + + +Compute feature importance scores for a given model and generate a summary table +with the top important features. + +###### Purpose + +The Feature Importance Comparison test is designed to compare the feature importance scores for different models +when applied to various datasets. By doing so, it aims to identify the most impactful features and assess the +consistency of feature importance across models. + +###### Test Mechanism + +This test works by iterating through each dataset-model pair and calculating permutation feature importance (PFI) +scores. It then generates a summary table containing the top `num_features` important features for each model. The +process involves: + +- Extracting features and target data from each dataset. +- Computing PFI scores using `sklearn.inspection.permutation_importance`. +- Sorting and selecting the top features based on their importance scores. +- Compiling these features into a summary table for comparison. + +###### Signs of High Risk + +- Key features expected to be important are ranked low, indicating potential issues with model training or data +quality. +- High variance in feature importance scores across different models, suggesting instability in feature selection. + +###### Strengths + +- Provides a clear comparison of the most important features for each model. +- Uses permutation importance, which is a model-agnostic method and can be applied to any estimator. + +###### Limitations + +- Assumes that the dataset is provided as a DataFrameDataset object with `x_df` and `y_df` methods to access +feature and target data. +- Requires that `model.model` is compatible with `sklearn.inspection.permutation_importance`. +- The function's output is dependent on the number of features specified by `num_features`, which defaults to 3 but +can be adjusted. + + + + + + + +##### FowlkesMallowsScore + + + + + + +######## FowlkesMallowsScore() + +```python +def FowlkesMallowsScore(dataset: VMDataset, model: VMModel) +``` + + +Evaluates the similarity between predicted and actual cluster assignments in a model using the Fowlkes-Mallows +score. + +###### Purpose + +The FowlkesMallowsScore is a performance metric used to validate clustering algorithms within machine learning +models. The score intends to evaluate the matching grade between two clusters. It measures the similarity between +the predicted and actual cluster assignments, thus gauging the accuracy of the model's clustering capability. + +###### Test Mechanism + +The FowlkesMallowsScore method applies the `fowlkes_mallows_score` function from the `sklearn` library to evaluate +the model's accuracy in clustering different types of data. The test fetches the datasets from the model's training +and testing datasets as inputs then compares the resulting clusters against the previously known clusters to obtain +a score. A high score indicates a better clustering performance by the model. + +###### Signs of High Risk + +- A low Fowlkes-Mallows score (near zero)**: This indicates that the model's clustering capability is poor and the +algorithm isn't properly grouping data. +- Inconsistently low scores across different datasets: This may indicate that the model's clustering performance is +not robust and the model may fail when applied to unseen data. + +###### Strengths + +- The Fowlkes-Mallows score is a simple and effective method for evaluating the performance of clustering +algorithms. +- This metric takes into account both precision and recall in its calculation, therefore providing a balanced and +comprehensive measure of model performance. +- The Fowlkes-Mallows score is non-biased meaning it treats False Positives and False Negatives equally. + +###### Limitations + +- As a pairwise-based method, this score can be computationally intensive for large datasets and can become +unfeasible as the size of the dataset increases. +- The Fowlkes-Mallows score works best with balanced distribution of samples across clusters. If this condition is +not met, the score can be skewed. +- It does not handle mismatching numbers of clusters between the true and predicted labels. As such, it may return +misleading results if the predicted labels suggest a different number of clusters than what is in the true labels. + + + + + + + +##### HomogeneityScore + + + + + + +######## HomogeneityScore() + +```python +def HomogeneityScore(dataset: VMDataset, model: VMModel) +``` + + +Assesses clustering homogeneity by comparing true and predicted labels, scoring from 0 (heterogeneous) to 1 +(homogeneous). + +###### Purpose + +The Homogeneity Score encapsulated in this performance test is used to measure the homogeneity of the clusters +formed by a machine learning model. In simple terms, a clustering result satisfies homogeneity if all of its +clusters contain only points which are members of a single class. + +###### Test Mechanism + +This test uses the `homogeneity_score` function from the `sklearn.metrics` library to compare the ground truth +class labels of the training and testing sets with the labels predicted by the given model. The returned score is a +metric of the clustering accuracy, and ranges from 0.0 to 1.0, with 1.0 denoting the highest possible degree of +homogeneity. + +###### Signs of High Risk + +- A score close to 0**: This denotes that clusters are highly heterogenous and points within the same cluster might +not belong to the same class. +- A significantly lower score for testing data compared to the score for training data: This can indicate +overfitting, where the model has learned to perfectly match the training data but fails to perform well on unseen +data. + +###### Strengths + +- It provides a simple quantitative measure of the degree to which clusters contain points from only one class. +- Useful for validating clustering solutions where the ground truth — class membership of points — is known. +- It's agnostic to the absolute labels, and cares only that the points within the same cluster have the same class +label. + +###### Limitations + +- The Homogeneity Score is not useful for clustering solutions where the ground truth labels are not known. +- It doesn’t work well with differently sized clusters since it gives predominance to larger clusters. +- The score does not address the actual number of clusters formed, or the evenness of cluster sizes. It only checks +the homogeneity within the given clusters created by the model. + + + + + + + +##### HyperParametersTuning + + + + + + +######## HyperParametersTuning() + +```python +def HyperParametersTuning(model: VMModel, dataset: VMDataset, param_grid: dict, scoring: Union = None, thresholds: Union = None, fit_params: dict = None) +``` + + +Performs exhaustive grid search over specified parameter ranges to find optimal model configurations +across different metrics and decision thresholds. + +###### Purpose + +The Hyperparameter Tuning test systematically explores the model's parameter space to identify optimal +configurations. It supports multiple optimization metrics and decision thresholds, providing a comprehensive +view of how different parameter combinations affect various aspects of model performance. + +###### Test Mechanism + +The test uses scikit-learn's GridSearchCV to perform cross-validation for each parameter combination. +For each specified threshold and optimization metric, it creates a scoring dictionary with +threshold-adjusted metrics, performs grid search with cross-validation, records best parameters and +corresponding scores, and combines results into a comparative table. This process is repeated for each +optimization metric to provide a comprehensive view of model performance under different configurations. + +###### Signs of High Risk + +- Large performance variations across different parameter combinations +- Significant discrepancies between different optimization metrics +- Best parameters at the edges of the parameter grid +- Unstable performance across different thresholds +- Overly complex model configurations (risk of overfitting) +- Very different optimal parameters for different metrics +- Cross-validation scores showing high variance +- Extreme parameter values in best configurations + +###### Strengths + +- Comprehensive exploration of parameter space +- Supports multiple optimization metrics +- Allows threshold optimization +- Provides comparative view across different configurations +- Uses cross-validation for robust evaluation +- Helps understand trade-offs between different metrics +- Enables systematic parameter selection +- Supports both classification and clustering tasks + +###### Limitations + +- Computationally expensive for large parameter grids +- May not find global optimum (limited to grid points) +- Cannot handle dependencies between parameters +- Memory intensive for large datasets +- Limited to scikit-learn compatible models +- Cross-validation splits may not preserve time series structure +- Grid search may miss optimal values between grid points +- Resource intensive for high-dimensional parameter spaces + + + + +######## custom_recall() + +```python +def custom_recall(y_true, y_pred_proba, threshold = 0.5) +``` + + + + + + + + +##### KMeansClustersOptimization + + + + + + +######## KMeansClustersOptimization() + +```python +def KMeansClustersOptimization(model: VMModel, dataset: VMDataset, n_clusters: Union = None) +``` + + +Optimizes the number of clusters in K-means models using Elbow and Silhouette methods. + +###### Purpose + +This metric is used to optimize the number of clusters used in K-means clustering models. It intends to measure and +evaluate the optimal number of clusters by leveraging two methodologies, namely the Elbow method and the Silhouette +method. This is crucial as an inappropriate number of clusters can either overly simplify or overcomplicate the +structure of the data, thereby undermining the effectiveness of the model. + +###### Test Mechanism + +The test mechanism involves iterating over a predefined range of cluster numbers and applying both the Elbow method +and the Silhouette method. The Elbow method computes the sum of the minimum euclidean distances between data points +and their respective cluster centers (distortion). This value decreases as the number of clusters increases; the +optimal number is typically at the 'elbow' point where the decrease in distortion becomes less pronounced. +Meanwhile, the Silhouette method calculates the average silhouette score for each data point in the dataset, +providing a measure of how similar each item is to its own cluster compared to other clusters. The optimal number +of clusters under this method is the one that maximizes the average silhouette score. The results of both methods +are plotted for visual inspection. + +###### Signs of High Risk + +- A high distortion value or a low silhouette average score for the optimal number of clusters. +- No clear 'elbow' point or plateau observed in the distortion plot, or a uniformly low silhouette average score +across different numbers of clusters, suggesting the data is not amenable to clustering. +- An optimal cluster number that is unreasonably high or low, suggestive of overfitting or underfitting, +respectively. + +###### Strengths + +- Provides both a visual and quantitative method to determine the optimal number of clusters. +- Leverages two different methods (Elbow and Silhouette), thereby affording robustness and versatility in assessing +the data's clusterability. +- Facilitates improved model performance by allowing for an informed selection of the number of clusters. + +###### Limitations + +- Assumes that a suitable number of clusters exists in the data, which may not always be true, especially for +complex or noisy data. +- Both methods may fail to provide definitive answers when the data lacks clear cluster structures. +- Might not be straightforward to determine the 'elbow' point or maximize the silhouette average score, especially +in larger and complicated datasets. +- Assumes spherical clusters (due to using the Euclidean distance in the Elbow method), which might not align with +the actual structure of the data. + + + + + + + +##### MinimumAccuracy + + + + + + +######## MinimumAccuracy() + +```python +def MinimumAccuracy(dataset: VMDataset, model: VMModel, min_threshold: float = 0.7) +``` + + +Checks if the model's prediction accuracy meets or surpasses a specified threshold. + +###### Purpose + +The Minimum Accuracy test’s objective is to verify whether the model's prediction accuracy on a specific dataset +meets or surpasses a predetermined minimum threshold. Accuracy, which is simply the ratio of correct predictions to +total predictions, is a key metric for evaluating the model's performance. Considering binary as well as multiclass +classifications, accurate labeling becomes indispensable. + +###### Test Mechanism + +The test mechanism involves contrasting the model's accuracy score with a preset minimum threshold value, with the +default being 0.7. The accuracy score is computed utilizing sklearn’s `accuracy_score` method, where the true +labels `y_true` and predicted labels `class_pred` are compared. If the accuracy score is above the threshold, the +test receives a passing mark. The test returns the result along with the accuracy score and threshold used for the +test. + +###### Signs of High Risk + +- Model fails to achieve or surpass the predefined score threshold. +- Persistent scores below the threshold, indicating a high risk of inaccurate predictions. + +###### Strengths + +- Simplicity, presenting a straightforward measure of holistic model performance across all classes. +- Particularly advantageous when classes are balanced. +- Versatile, as it can be implemented on both binary and multiclass classification tasks. + +###### Limitations + +- Misleading accuracy scores when classes in the dataset are highly imbalanced. +- Favoritism towards the majority class, giving an inaccurate perception of model performance. +- Inability to measure the model's precision, recall, or capacity to manage false positives or false negatives. +- Focused on overall correctness and may not be sufficient for all types of model analytics. + + + + + + + +##### MinimumF1Score + + + + + + +######## MinimumF1Score() + +```python +def MinimumF1Score(dataset: VMDataset, model: VMModel, min_threshold: float = 0.5) +``` + + +Assesses if the model's F1 score on the validation set meets a predefined minimum threshold, ensuring balanced +performance between precision and recall. + +###### Purpose + +The main objective of this test is to ensure that the F1 score, a balanced measure of precision and recall, of the +model meets or surpasses a predefined threshold on the validation dataset. The F1 score is highly useful for +gauging model performance in classification tasks, especially in cases where the distribution of positive and +negative classes is skewed. + +###### Test Mechanism + +The F1 score for the validation dataset is computed through scikit-learn's metrics in Python. The scoring mechanism +differs based on the classification problem**: for multi-class problems, macro averaging is used, and for binary +classification, the built-in `f1_score` calculation is used. The obtained F1 score is then assessed against the +predefined minimum F1 score that is expected from the model. + +###### Signs of High Risk + +- If a model returns an F1 score that is less than the established threshold, it is regarded as high risk. +- A low F1 score might suggest that the model is not finding an optimal balance between precision and recall, +failing to effectively identify positive classes while minimizing false positives. + +###### Strengths + +- Provides a balanced measure of a model's performance by accounting for both false positives and false negatives. +- Particularly advantageous in scenarios with imbalanced class distribution, where accuracy can be misleading. +- Flexibility in setting the threshold value allows tailored minimum acceptable performance standards. + +###### Limitations + +- May not be suitable for all types of models and machine learning tasks. +- The F1 score assumes an equal cost for false positives and false negatives, which may not be true in some +real-world scenarios. +- Practitioners might need to rely on other metrics such as precision, recall, or the ROC-AUC score that align more +closely with specific requirements. + + + + + + + +##### MinimumROCAUCScore + + + + + + +######## MinimumROCAUCScore() + +```python +def MinimumROCAUCScore(dataset: VMDataset, model: VMModel, min_threshold: float = 0.5) +``` + + +Validates model by checking if the ROC AUC score meets or surpasses a specified threshold. + +###### Purpose + +The Minimum ROC AUC Score test is used to determine the model's performance by ensuring that the Receiver Operating +Characteristic Area Under the Curve (ROC AUC) score on the validation dataset meets or exceeds a predefined +threshold. The ROC AUC score indicates how well the model can distinguish between different classes, making it a +crucial measure in binary and multiclass classification tasks. + +###### Test Mechanism + +This test implementation calculates the multiclass ROC AUC score on the true target values and the model's +predictions. The test converts the multi-class target variables into binary format using `LabelBinarizer` before +computing the score. If this ROC AUC score is higher than the predefined threshold (defaulted to 0.5), the test +passes; otherwise, it fails. The results, including the ROC AUC score, the threshold, and whether the test passed +or failed, are then stored in a `ThresholdTestResult` object. + +###### Signs of High Risk + +- A high risk or failure in the model's performance as related to this metric would be represented by a low ROC AUC +score, specifically any score lower than the predefined minimum threshold. This suggests that the model is +struggling to distinguish between different classes effectively. + +###### Strengths + +- The test considers both the true positive rate and false positive rate, providing a comprehensive performance +measure. +- ROC AUC score is threshold-independent meaning it measures the model's quality across various classification +thresholds. +- Works robustly with binary as well as multi-class classification problems. + +###### Limitations + +- ROC AUC may not be useful if the class distribution is highly imbalanced; it could perform well in terms of AUC +but still fail to predict the minority class. +- The test does not provide insight into what specific aspects of the model are causing poor performance if the ROC +AUC score is unsatisfactory. +- The use of macro average for multiclass ROC AUC score implies equal weightage to each class, which might not be +appropriate if the classes are imbalanced. + + + + + + + +##### ModelParameters + + + + + + +######## ModelParameters() + +```python +def ModelParameters(model, model_params = None) +``` + + +Extracts and displays model parameters in a structured format for transparency and reproducibility. + +###### Purpose + +The Model Parameters test is designed to provide transparency into model configuration and ensure +reproducibility of machine learning models. It accomplishes this by extracting and presenting all +relevant parameters that define the model's behavior, making it easier to audit, validate, and +reproduce model training. + +###### Test Mechanism + +The test leverages scikit-learn's API convention of get_params() to extract model parameters. It +produces a structured DataFrame containing parameter names and their corresponding values. For models +that follow scikit-learn's API (including XGBoost, RandomForest, and other estimators), all +parameters are automatically extracted and displayed. + +###### Signs of High Risk + +- Missing crucial parameters that should be explicitly set +- Extreme parameter values that could indicate overfitting (e.g., unlimited tree depth) +- Inconsistent parameters across different versions of the same model type +- Parameter combinations known to cause instability or poor performance +- Default values used for critical parameters that should be tuned + +###### Strengths + +- Universal compatibility with scikit-learn API-compliant models +- Ensures transparency in model configuration +- Facilitates model reproducibility and version control +- Enables systematic parameter auditing +- Supports both classification and regression models +- Helps identify potential configuration issues + +###### Limitations + +- Only works with models implementing scikit-learn's get_params() method +- Cannot capture dynamic parameters set during model training +- Does not validate parameter values for model-specific appropriateness +- Parameter meanings and impacts may vary across different model types +- Cannot detect indirect parameter interactions or their effects on model performance + + + + + + + +##### ModelsPerformanceComparison + + + + + + +######## ModelsPerformanceComparison() + +```python +def ModelsPerformanceComparison(dataset: VMDataset, models: list) +``` + + +Evaluates and compares the performance of multiple Machine Learning models using various metrics like accuracy, +precision, recall, and F1 score. + +###### Purpose + +The Models Performance Comparison test aims to evaluate and compare the performance of various Machine Learning +models using test data. It employs multiple metrics such as accuracy, precision, recall, and the F1 score, among +others, to assess model performance and assist in selecting the most effective model for the designated task. + +###### Test Mechanism + +The test employs Scikit-learn’s performance metrics to evaluate each model's performance for both binary and +multiclass classification tasks. To compare performances, the test runs each model against the test dataset, then +produces a comprehensive classification report. This report includes metrics such as accuracy, precision, recall, +and the F1 score. Based on whether the task at hand is binary or multiclass classification, it calculates metrics +for all the classes and their weighted averages, macro averages, and per-class metrics. The test will be skipped if +no models are supplied. + +###### Signs of High Risk + +- Low scores in accuracy, precision, recall, and F1 metrics indicate a potentially high risk. +- A low area under the Receiver Operating Characteristic (ROC) curve (roc_auc score) is another possible indicator +of high risk. +- If the metrics scores are significantly lower than alternative models, this might suggest a high risk of failure. + +###### Strengths + +- Provides a simple way to compare the performance of multiple models, accommodating both binary and multiclass +classification tasks. +- Offers a holistic view of model performance through a comprehensive report of key performance metrics. +- The inclusion of the ROC AUC score is advantageous, as this robust performance metric can effectively handle +class imbalance issues. + +###### Limitations + +- May not be suitable for more complex performance evaluations that consider factors such as prediction speed, +computational cost, or business-specific constraints. +- The test's reliability depends on the provided test dataset; hence, the selected models' performance could vary +with unseen data or changes in the data distribution. +- The ROC AUC score might not be as meaningful or easily interpretable for multilabel/multiclass tasks. + + + + + + + +##### OverfitDiagnosis + + + + + + +######## OverfitDiagnosis() + +```python +def OverfitDiagnosis(model: VMModel, datasets: List, metric: str = None, cut_off_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}) +``` + + +Assesses potential overfitting in a model's predictions, identifying regions where performance between training and +testing sets deviates significantly. + +###### Purpose + +The Overfit Diagnosis test aims to identify areas in a model's predictions where there is a significant difference +in performance between the training and testing sets. This test helps to pinpoint specific regions or feature +segments where the model may be overfitting. + +###### Test Mechanism + +This test compares the model's performance on training versus test data, grouped by feature columns. It calculates +the difference between the training and test performance for each group and identifies regions where this +difference exceeds a specified threshold: + +- The test works for both classification and regression models. +- It defaults to using the AUC metric for classification models and the MSE metric for regression models. +- The threshold for identifying overfitting regions is set to 0.04 by default. +- The test calculates the performance metrics for each feature segment and plots regions where the performance gap +exceeds the threshold. + +###### Signs of High Risk + +- Significant gaps between training and test performance metrics for specific feature segments. +- Multiple regions with performance gaps exceeding the defined threshold. +- Higher than expected differences in predicted versus actual values in the test set compared to the training set. + +###### Strengths + +- Identifies specific areas where overfitting occurs. +- Supports multiple performance metrics, providing flexibility. +- Applicable to both classification and regression models. +- Visualization of overfitting segments aids in better understanding and debugging. + +###### Limitations + +- The default threshold may not be suitable for all use cases and requires tuning. +- May not capture more subtle forms of overfitting that do not exceed the threshold. +- Assumes that the binning of features adequately represents the data segments. + + + + + + + +##### PermutationFeatureImportance + + + + + + +######## PermutationFeatureImportance() + +```python +def PermutationFeatureImportance(model: VMModel, dataset: VMDataset, fontsize: Union = None, figure_height: Union = None) +``` + + +Assesses the significance of each feature in a model by evaluating the impact on model performance when feature +values are randomly rearranged. + +###### Purpose + +The Permutation Feature Importance (PFI) metric aims to assess the importance of each feature used by the Machine +Learning model. The significance is measured by evaluating the decrease in the model's performance when the +feature's values are randomly arranged. + +###### Test Mechanism + +PFI is calculated via the `permutation_importance` method from the `sklearn.inspection` module. This method +shuffles the columns of the feature dataset and measures the impact on the model's performance. A significant +decrease in performance after permutating a feature's values deems the feature as important. On the other hand, if +performance remains the same, the feature is likely not important. The output of the PFI metric is a figure +illustrating the importance of each feature. + +###### Signs of High Risk + +- The model heavily relies on a feature with highly variable or easily permutable values, indicating instability. +- A feature deemed unimportant by the model but expected to have a significant effect on the outcome based on +domain knowledge is not influencing the model's predictions. + +###### Strengths + +- Provides insights into the importance of different features and may reveal underlying data structure. +- Can indicate overfitting if a particular feature or set of features overly impacts the model's predictions. +- Model-agnostic and can be used with any classifier that provides a measure of prediction accuracy before and +after feature permutation. + +###### Limitations + +- Does not imply causality; it only presents the amount of information that a feature provides for the prediction +task. +- Does not account for interactions between features. If features are correlated, the permutation importance may +allocate importance to one and not the other. +- Cannot interact with certain libraries like statsmodels, pytorch, catboost, etc., thus limiting its applicability. + + + + + + + +##### PopulationStabilityIndex + + + + + + +######## PopulationStabilityIndex() + +```python +def PopulationStabilityIndex(datasets: List, model: VMModel, num_bins: int = 10, mode: str = 'fixed') +``` + + +Assesses the Population Stability Index (PSI) to quantify the stability of an ML model's predictions across +different datasets. + +###### Purpose + +The Population Stability Index (PSI) serves as a quantitative assessment for evaluating the stability of a machine +learning model's output distributions when comparing two different datasets. Typically, these would be a +development and a validation dataset or two datasets collected at different periods. The PSI provides a measurable +indication of any significant shift in the model's performance over time or noticeable changes in the +characteristics of the population the model is making predictions for. + +###### Test Mechanism + +The implementation of the PSI in this script involves calculating the PSI for each feature between the training and +test datasets. Data from both datasets is sorted and placed into either a predetermined number of bins or +quantiles. The boundaries for these bins are initially determined based on the distribution of the training data. +The contents of each bin are calculated and their respective proportions determined. Subsequently, the PSI is +derived for each bin through a logarithmic transformation of the ratio of the proportions of data for each feature +in the training and test datasets. The PSI, along with the proportions of data in each bin for both datasets, are +displayed in a summary table, a grouped bar chart, and a scatter plot. + +###### Signs of High Risk + +- A high PSI value is a clear indicator of high risk. Such a value suggests a significant shift in the model +predictions or severe changes in the characteristics of the underlying population. +- This ultimately suggests that the model may not be performing as well as expected and that it may be less +reliable for making future predictions. + +###### Strengths + +- The PSI provides a quantitative measure of the stability of a model over time or across different samples, making +it an invaluable tool for evaluating changes in a model's performance. +- It allows for direct comparisons across different features based on the PSI value. +- The calculation and interpretation of the PSI are straightforward, facilitating its use in model risk management. +- The use of visual aids such as tables and charts further simplifies the comprehension and interpretation of the +PSI. + +###### Limitations + +- The PSI test does not account for the interdependence between features**: features that are dependent on one +another may show similar shifts in their distributions, which in turn may result in similar PSI values. +- The PSI test does not inherently provide insights into why there are differences in distributions or why the PSI +values may have changed. +- The test may not handle features with significant outliers adequately. +- Additionally, the PSI test is performed on model predictions, not on the underlying data distributions which can +lead to misinterpretations. Any changes in PSI could be due to shifts in the model (model drift), changes in the +relationships between features and the target variable (concept drift), or both. However, distinguishing between +these causes is non-trivial. + + + + +######## calculate_psi() + +```python +def calculate_psi(score_initial, score_new, num_bins = 10, mode = 'fixed') +``` + + +Taken from: +https://towardsdatascience.com/checking-model-stability-and-population-shift-with-psi-and-csi-6d12af008783 + + + + + + + +##### PrecisionRecallCurve + + + + + + +######## PrecisionRecallCurve() + +```python +def PrecisionRecallCurve(model: VMModel, dataset: VMDataset) +``` + + +Evaluates the precision-recall trade-off for binary classification models and visualizes the Precision-Recall curve. + +###### Purpose + +The Precision Recall Curve metric is intended to evaluate the trade-off between precision and recall in +classification models, particularly binary classification models. It assesses the model's capacity to produce +accurate results (high precision), as well as its ability to capture a majority of all positive instances (high +recall). + +###### Test Mechanism + +The test extracts ground truth labels and prediction probabilities from the model's test dataset. It applies the +`precision_recall_curve` method from the sklearn metrics module to these extracted labels and predictions, which +computes a precision-recall pair for each possible threshold. This calculation results in an array of precision and +recall scores that can be plotted against each other to form the Precision-Recall Curve. This curve is then +visually represented by using Plotly's scatter plot. + +###### Signs of High Risk + +- A lower area under the Precision-Recall Curve signifies high risk. +- This corresponds to a model yielding a high amount of false positives (low precision) and/or false negatives (low +recall). +- If the curve is closer to the bottom left of the plot, rather than being closer to the top right corner, it can +be a sign of high risk. + +###### Strengths + +- This metric aptly represents the balance between precision (minimizing false positives) and recall (minimizing +false negatives), which is especially critical in scenarios where both values are significant. +- Through the graphic representation, it enables an intuitive understanding of the model's performance across +different threshold levels. + +###### Limitations + +- This metric is only applicable to binary classification models - it raises errors for multiclass classification +models or Foundation models. +- It may not fully represent the overall accuracy of the model if the cost of false positives and false negatives +are extremely different, or if the dataset is heavily imbalanced. + + + + + + + +##### ROCCurve + + + + + + +######## ROCCurve() + +```python +def ROCCurve(model: VMModel, dataset: VMDataset) +``` + + +Evaluates binary classification model performance by generating and plotting the Receiver Operating Characteristic +(ROC) curve and calculating the Area Under Curve (AUC) score. + +###### Purpose + +The Receiver Operating Characteristic (ROC) curve is designed to evaluate the performance of binary classification +models. This curve illustrates the balance between the True Positive Rate (TPR) and False Positive Rate (FPR) +across various threshold levels. In combination with the Area Under the Curve (AUC), the ROC curve aims to measure +the model's discrimination ability between the two defined classes in a binary classification problem (e.g., +default vs non-default). Ideally, a higher AUC score signifies superior model performance in accurately +distinguishing between the positive and negative classes. + +###### Test Mechanism + +First, this script selects the target model and datasets that require binary classification. It then calculates the +predicted probabilities for the test set, and uses this data, along with the true outcomes, to generate and plot +the ROC curve. Additionally, it includes a line signifying randomness (AUC of 0.5). The AUC score for the model's +ROC curve is also computed, presenting a numerical estimation of the model's performance. If any Infinite values +are detected in the ROC threshold, these are effectively eliminated. The resulting ROC curve, AUC score, and +thresholds are consequently saved for future reference. + +###### Signs of High Risk + +- A high risk is potentially linked to the model's performance if the AUC score drops below or nears 0.5. +- Another warning sign would be the ROC curve lying closer to the line of randomness, indicating no discriminative +ability. +- For the model to be deemed competent at its classification tasks, it is crucial that the AUC score is +significantly above 0.5. + +###### Strengths + +- The ROC Curve offers an inclusive visual depiction of a model's discriminative power throughout all conceivable +classification thresholds, unlike other metrics that solely disclose model performance at one fixed threshold. +- Despite the proportions of the dataset, the AUC Score, which represents the entire ROC curve as a single data +point, continues to be consistent, proving to be the ideal choice for such situations. + +###### Limitations + +- The primary limitation is that this test is exclusively structured for binary classification tasks, thus limiting +its application towards other model types. +- Furthermore, its performance might be subpar with models that output probabilities highly skewed towards 0 or 1. +- At the extreme, the ROC curve could reflect high performance even when the majority of classifications are +incorrect, provided that the model's ranking format is retained. This phenomenon is commonly termed the "Class +Imbalance Problem". + + + + + + + +##### RegressionErrors + + + + + + +######## RegressionErrors() + +```python +def RegressionErrors(model, dataset) +``` + + +Assesses the performance and error distribution of a regression model using various error metrics. + +###### Purpose + +The purpose of the Regression Errors test is to measure the performance of a regression model by calculating +several error metrics. This evaluation helps determine the model's accuracy and potential issues like overfitting +or bias by analyzing differences in error metrics between the training and testing datasets. + +###### Test Mechanism + +The test computes the following error metrics: + +- **Mean Absolute Error (MAE)****: Average of the absolute differences between true values and predicted values. +- **Mean Squared Error (MSE)**: Average of the squared differences between true values and predicted values. +- **Root Mean Squared Error (RMSE)**: Square root of the mean squared error. +- **Mean Absolute Percentage Error (MAPE)**: Average of the absolute differences between true values and predicted +values, divided by the true values, and expressed as a percentage. +- **Mean Bias Deviation (MBD)**: Average bias between true values and predicted values. + +These metrics are calculated separately for the training and testing datasets and compared to identify +discrepancies. + +###### Signs of High Risk + +- High values for MAE, MSE, RMSE, or MAPE indicating poor model performance. +- Large differences in error metrics between the training and testing datasets, suggesting overfitting. +- Significant deviation of MBD from zero, indicating systematic bias in model predictions. + +###### Strengths + +- Provides a comprehensive overview of model performance through multiple error metrics. +- Individual metrics offer specific insights, e.g., MAE for interpretability, MSE for emphasizing larger errors. +- RMSE is useful for being in the same unit as the target variable. +- MAPE allows the error to be expressed as a percentage. +- MBD detects systematic bias in model predictions. + +###### Limitations + +- MAE and MSE are sensitive to outliers. +- RMSE heavily penalizes larger errors, which might not always be desirable. +- MAPE can be misleading when actual values are near zero. +- MBD may not be suitable if bias varies with the magnitude of actual values. +- These metrics may not capture all nuances of model performance and should be interpreted with domain-specific +context. + + + + + + + +##### RegressionErrorsComparison + + + + + + +######## RegressionErrorsComparison() + +```python +def RegressionErrorsComparison(datasets, models) +``` + + +Assesses multiple regression error metrics to compare model performance across different datasets, emphasizing +systematic overestimation or underestimation and large percentage errors. + +###### Purpose + +The purpose of this test is to compare regression errors for different models applied to various datasets. It aims +to examine model performance using multiple error metrics, thereby identifying areas where models may be +underperforming or exhibiting bias. + +###### Test Mechanism + +The function iterates through each dataset-model pair and calculates various error metrics, including Mean Absolute +Error (MAE), Mean Squared Error (MSE), Mean Absolute Percentage Error (MAPE), and Mean Bias Deviation (MBD). The +results are summarized in a table, which provides a comprehensive view of each model's performance on the datasets. + +###### Signs of High Risk + +- High Mean Absolute Error (MAE) or Mean Squared Error (MSE), indicating poor model performance. +- High Mean Absolute Percentage Error (MAPE), suggesting large percentage errors, especially problematic if the +true values are small. +- Mean Bias Deviation (MBD) significantly different from zero, indicating systematic overestimation or +underestimation by the model. + +###### Strengths + +- Provides multiple error metrics to assess model performance from different perspectives. +- Includes a check to avoid division by zero when calculating MAPE. + +###### Limitations + +- Assumes that the dataset is provided as a DataFrameDataset object with `y`, `y_pred`, and `feature_columns` +attributes. +- Relies on the `logger` from `validmind.logging` to warn about zero values in `y_true`, which should be correctly +implemented and imported. +- Requires that `dataset.y_pred(model)` returns the predicted values for the model. + + + + + + + +##### RegressionPerformance + + + + + + +######## RegressionPerformance() + +```python +def RegressionPerformance(model: VMModel, dataset: VMDataset) +``` + + +Evaluates the performance of a regression model using five different metrics**: MAE, MSE, RMSE, MAPE, and MBD. + +###### Purpose + +The Regression Models Performance Comparison metric is used to measure the performance of regression models. It +calculates multiple evaluation metrics, including Mean Absolute Error (MAE), Mean Squared Error (MSE), +Root Mean Squared Error (RMSE), Mean Absolute Percentage Error (MAPE), and Mean Bias Deviation (MBD), thereby +enabling a comprehensive view of model performance. + +###### Test Mechanism + +The test uses the sklearn library to calculate the MAE, MSE, RMSE, MAPE, and MBD. These calculations encapsulate both +the direction and the magnitude of error in predictions, thereby providing a multi-faceted view of model accuracy. + +###### Signs of High Risk + +- High values of MAE, MSE, RMSE, and MAPE, which indicate a high error rate and imply a larger departure of the +model's predictions from the true values. +- A large value of MBD, which shows a consistent bias in the model’s predictions. + +###### Strengths + +- The metric evaluates models on five different metrics offering a comprehensive analysis of model performance. +- It is designed to handle regression tasks and can be seamlessly integrated with libraries like sklearn. + +###### Limitations + +- The metric only evaluates regression models and does not evaluate classification models. +- The test assumes that the models have been trained and tested appropriately prior to evaluation. It does not +handle pre-processing, feature selection, or other stages in the model lifecycle. + + + + + + + +##### RegressionR2Square + + + + + + +######## RegressionR2Square() + +```python +def RegressionR2Square(dataset, model) +``` + + +Assesses the overall goodness-of-fit of a regression model by evaluating R-squared (R2) and Adjusted R-squared (Adj +R2) scores to determine the model's explanatory power over the dependent variable. + +###### Purpose + +The purpose of the RegressionR2Square Metric test is to measure the overall goodness-of-fit of a regression model. +Specifically, this Python-based test evaluates the R-squared (R2) and Adjusted R-squared (Adj R2) scores, which are +statistical measures used to assess the strength of the relationship between the model's predictors and the +response variable. + +###### Test Mechanism + +The test deploys the `r2_score` method from the Scikit-learn metrics module to measure the R2 score on both +training and test sets. This score reflects the proportion of the variance in the dependent variable that is +predictable from the independent variables. The test also calculates the Adjusted R2 score, which accounts for the +number of predictors in the model to penalize model complexity and reduce overfitting. The Adjusted R2 score will +be smaller if unnecessary predictors are included in the model. + +###### Signs of High Risk + +- Low R2 or Adjusted R2 scores, suggesting that the model does not explain much variation in the dependent variable. +- Significant discrepancy between R2 scores on the training set and test set, indicating overfitting and poor +generalization to unseen data. + +###### Strengths + +- Widely-used measure in regression analysis, providing a sound general indication of model performance. +- Easy to interpret and understand, as it represents the proportion of the dependent variable's variance explained +by the independent variables. +- Adjusted R2 score helps control overfitting by penalizing unnecessary predictors. + +###### Limitations + +- Sensitive to the inclusion of unnecessary predictors even though Adjusted R2 penalizes complexity. +- Less reliable in cases of non-linear relationships or when the underlying assumptions of linear regression are +violated. +- Does not provide insight on whether the correct regression model was used or if key assumptions have been met. + + + + + + + +##### RegressionR2SquareComparison + + + + + + +######## RegressionR2SquareComparison() + +```python +def RegressionR2SquareComparison(datasets, models) +``` + + +Compares R-Squared and Adjusted R-Squared values for different regression models across multiple datasets to assess +model performance and relevance of features. + +###### Purpose + +The Regression R2 Square Comparison test aims to compare the R-Squared and Adjusted R-Squared values for different +regression models across various datasets. It helps in assessing how well each model explains the variability in +the dataset, and whether the models include irrelevant features. + +###### Test Mechanism + +This test operates by: + +- Iterating through each dataset-model pair. +- Calculating the R-Squared values to measure how much of the variability in the dataset is explained by the model. +- Calculating the Adjusted R-Squared values, which adjust the R-Squared based on the number of predictors in the +model, making it more reliable when comparing models with different numbers of features. +- Generating a summary table containing these values for each combination of dataset and model. + +###### Signs of High Risk + +- If the R-Squared values are significantly low, it indicates the model isn't explaining much of the variability in +the dataset. +- A significant difference between R-Squared and Adjusted R-Squared values might indicate that the model includes +irrelevant features. + +###### Strengths + +- Provides a quantitative measure of model performance in terms of variance explained. +- Adjusted R-Squared accounts for the number of predictors, making it a more reliable measure when comparing models +with different numbers of features. +- Useful for time-series forecasting and regression tasks. + +###### Limitations + +- Assumes the dataset is provided as a DataFrameDataset object with `y`, `y_pred`, and `feature_columns` attributes. +- Relies on `adj_r2_score` from the `statsmodels.statsutils` module, which needs to be correctly implemented and +imported. +- Requires that `dataset.y_pred(model)` returns the predicted values for the model. + + + + + + + +##### RobustnessDiagnosis + + + + + + +######## RobustnessDiagnosis() + +```python +def RobustnessDiagnosis(datasets: List, model: VMModel, metric: str = None, scaling_factor_std_dev_list: List = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'}, performance_decay_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}) +``` + + +Assesses the robustness of a machine learning model by evaluating performance decay under noisy conditions. + +###### Purpose + +The Robustness Diagnosis test aims to evaluate the resilience of a machine learning model when subjected to +perturbations or noise in its input data. This is essential for understanding the model's ability to handle +real-world scenarios where data may be imperfect or corrupted. + +###### Test Mechanism + +This test introduces Gaussian noise to the numeric input features of the datasets at varying scales of standard +deviation. The performance of the model is then measured using a specified metric. The process includes: + +- Adding Gaussian noise to numerical input features based on scaling factors. +- Evaluating the model's performance on the perturbed data using metrics like AUC for classification tasks and MSE +for regression tasks. +- Aggregating and plotting the results to visualize performance decay relative to perturbation size. + +###### Signs of High Risk + +- A significant drop in performance metrics with minimal noise. +- Performance decay values exceeding the specified threshold. +- Consistent failure to meet performance standards across multiple perturbation scales. + +###### Strengths + +- Provides insights into the model's robustness against noisy or corrupted data. +- Utilizes a variety of performance metrics suitable for both classification and regression tasks. +- Visualization helps in understanding the extent of performance degradation. + +###### Limitations + +- Gaussian noise might not adequately represent all types of real-world data perturbations. +- Performance thresholds are somewhat arbitrary and might need tuning. +- The test may not account for more complex or unstructured noise patterns that could affect model robustness. + + + + + + + +##### SHAPGlobalImportance + + + + + + +######## SHAPGlobalImportance() + +```python +def SHAPGlobalImportance(model: VMModel, dataset: VMDataset, kernel_explainer_samples: int = 10, tree_or_linear_explainer_samples: int = 200, class_of_interest: int = None) +``` + + +Evaluates and visualizes global feature importance using SHAP values for model explanation and risk identification. + +###### Purpose + +The SHAP (SHapley Additive exPlanations) Global Importance metric aims to elucidate model outcomes by attributing +them to the contributing features. It assigns a quantifiable global importance to each feature via their respective +absolute Shapley values, thereby making it suitable for tasks like classification (both binary and multiclass). +This metric forms an essential part of model risk management. + +###### Test Mechanism + +The exam begins with the selection of a suitable explainer which aligns with the model's type. For tree-based +models like XGBClassifier, RandomForestClassifier, CatBoostClassifier, TreeExplainer is used whereas for linear +models like LogisticRegression, XGBRegressor, LinearRegression, it is the LinearExplainer. Once the explainer +calculates the Shapley values, these values are visualized using two specific graphical representations: + +1. Mean Importance Plot**: This graph portrays the significance of individual features based on their absolute +Shapley values. It calculates the average of these absolute Shapley values across all instances to highlight the +global importance of features. + +2. Summary Plot: This visual tool combines the feature importance with their effects. Every dot on this chart +represents a Shapley value for a certain feature in a specific case. The vertical axis is denoted by the feature +whereas the horizontal one corresponds to the Shapley value. A color gradient indicates the value of the feature, +gradually changing from low to high. Features are systematically organized in accordance with their importance. + +###### Signs of High Risk + +- Overemphasis on certain features in SHAP importance plots, thus hinting at the possibility of model overfitting +- Anomalies such as unexpected or illogical features showing high importance, which might suggest that the model's +decisions are rooted in incorrect or undesirable reasoning +- A SHAP summary plot filled with high variability or scattered data points, indicating a cause for concern + +###### Strengths + +- SHAP does more than just illustrating global feature significance, it offers a detailed perspective on how +different features shape the model's decision-making logic for each instance. +- It provides clear insights into model behavior. + +###### Limitations + +- High-dimensional data can convolute interpretations. +- Associating importance with tangible real-world impact still involves a certain degree of subjectivity. + + + + +######## generate_shap_plot() + +```python +def generate_shap_plot(type_, shap_values, x_test) +``` + + +Plots two types of SHAP global importance (SHAP). + +**Arguments** + +- **type_****: The type of SHAP plot to generate. Must be "mean" or "summary". +- **shap_values**: The SHAP values to plot. +- **x_test**: The test data used to generate the SHAP values. + +**Returns** + +- The generated plot. + + + + +######## select_shap_values() + +```python +def select_shap_values(shap_values, class_of_interest) +``` + + +Selects SHAP values for binary or multiclass classification. + +For regression models, returns the SHAP values directly as there are no classes. + +**Arguments** + +- **shap_values****: The SHAP values returned by the SHAP explainer. For multiclass classification, this will be a list where each element corresponds to a class. For regression, this will be a single array of SHAP values. +- **class_of_interest**: The class index for which to retrieve SHAP values. If None (default), the function will assume binary classification and use class 1 by default. + +**Returns** + +- The SHAP values for the specified class (classification) or for the regression +- output. + +**Raises** + +- **ValueError**: If class_of_interest is specified and is out of bounds for the number of classes. + + + + + + + +##### ScoreProbabilityAlignment + + + + + + +######## ScoreProbabilityAlignment() + +```python +def ScoreProbabilityAlignment(model: VMModel, dataset: VMDataset, score_column: str = 'score', n_bins: int = 10) +``` + + +Analyzes the alignment between credit scores and predicted probabilities. + +###### Purpose + +The Score-Probability Alignment test evaluates how well credit scores align with +predicted default probabilities. This helps validate score scaling, identify potential +calibration issues, and ensure scores reflect risk appropriately. + +###### Test Mechanism + +The test: +1. Groups scores into bins +2. Calculates average predicted probability per bin +3. Tests monotonicity of relationship +4. Analyzes probability distribution within score bands + +###### Signs of High Risk + +- Non-monotonic relationship between scores and probabilities +- Large probability variations within score bands +- Unexpected probability jumps between adjacent bands +- Poor alignment with expected odds-to-score relationship +- Inconsistent probability patterns across score ranges +- Clustering of probabilities at extreme values +- Score bands with similar probability profiles +- Unstable probability estimates in key decision bands + +###### Strengths + +- Direct validation of score-to-probability relationship +- Identifies potential calibration issues +- Supports score band validation +- Helps understand model behavior +- Useful for policy setting +- Visual and numerical results +- Easy to interpret +- Supports regulatory documentation + +###### Limitations + +- Sensitive to bin selection +- Requires sufficient data per bin +- May mask within-bin variations +- Point-in-time analysis only +- Cannot detect all forms of miscalibration +- Assumes scores should align with probabilities +- May oversimplify complex relationships +- Limited to binary outcomes + + + + + + + +##### SilhouettePlot + + + + + + +######## SilhouettePlot() + +```python +def SilhouettePlot(model: VMModel, dataset: VMDataset) +``` + + +Calculates and visualizes Silhouette Score, assessing the degree of data point suitability to its cluster in ML +models. + +###### Purpose + +This test calculates the Silhouette Score, which is a model performance metric used in clustering applications. +Primarily, the Silhouette Score evaluates how similar a data point is to its own cluster compared to other +clusters. The metric ranges between -1 and 1, where a high value indicates that the object is well matched to its +own cluster and poorly matched to neighboring clusters. Thus, the goal is to achieve a high Silhouette Score, +implying well-separated clusters. + +###### Test Mechanism + +The test first extracts the true and predicted labels from the model's training data. The test runs the Silhouette +Score function, which takes as input the training dataset features and the predicted labels, subsequently +calculating the average score. This average Silhouette Score is printed for reference. The script then calculates +the silhouette coefficients for each data point, helping to form the Silhouette Plot. Each cluster is represented +in this plot, with color distinguishing between different clusters. A red dashed line indicates the average +Silhouette Score. The Silhouette Scores are also collected into a structured table, facilitating model performance +analysis and comparison. + +###### Signs of High Risk + +- A low Silhouette Score, potentially indicating that the clusters are not well separated and that data points may +not be fitting well to their respective clusters. +- A Silhouette Plot displaying overlapping clusters or the absence of clear distinctions between clusters visually +also suggests poor clustering performance. + +###### Strengths + +- The Silhouette Score provides a clear and quantitative measure of how well data points have been grouped into +clusters, offering insights into model performance. +- The Silhouette Plot provides an intuitive, graphical representation of the clustering mechanism, aiding visual +assessments of model performance. +- It does not require ground truth labels, so it's useful when true cluster assignments are not known. + +###### Limitations + +- The Silhouette Score may be susceptible to the influence of outliers, which could impact its accuracy and +reliability. +- It assumes the clusters are convex and isotropic, which might not be the case with complex datasets. +- Due to the average nature of the Silhouette Score, the metric does not account for individual data point +assignment nuances, so potentially relevant details may be omitted. +- Computationally expensive for large datasets, as it requires pairwise distance computations. + + + + + + + +##### TrainingTestDegradation + + + + + + +######## TrainingTestDegradation() + +```python +def TrainingTestDegradation(datasets: List, model: VMModel, max_threshold: float = 0.1) +``` + + +Tests if model performance degradation between training and test datasets exceeds a predefined threshold. + +###### Purpose + +The `TrainingTestDegradation` class serves as a test to verify that the degradation in performance between the +training and test datasets does not exceed a predefined threshold. This test measures the model's ability to +generalize from its training data to unseen test data, assessing key classification metrics such as accuracy, +precision, recall, and f1 score to verify the model's robustness and reliability. + +###### Test Mechanism + +The code applies several predefined metrics, including accuracy, precision, recall, and f1 scores, to the model's +predictions for both the training and test datasets. It calculates the degradation as the difference between the +training score and test score divided by the training score. The test is considered successful if the degradation +for each metric is less than the preset maximum threshold of 10%. The results are summarized in a table showing +each metric's train score, test score, degradation percentage, and pass/fail status. + +###### Signs of High Risk + +- A degradation percentage that exceeds the maximum allowed threshold of 10% for any of the evaluated metrics. +- A high difference or gap between the metric scores on the training and the test datasets. +- The 'Pass/Fail' column displaying 'Fail' for any of the evaluated metrics. + +###### Strengths + +- Provides a quantitative measure of the model's ability to generalize to unseen data, which is key for predicting +its practical real-world performance. +- By evaluating multiple metrics, it takes into account different facets of model performance and enables a more +holistic evaluation. +- The use of a variable predefined threshold allows the flexibility to adjust the acceptability criteria for +different scenarios. + +###### Limitations + +- The test compares raw performance on training and test data but does not factor in the nature of the data. Areas +with less representation in the training set might still perform poorly on unseen data. +- It requires good coverage and balance in the test and training datasets to produce reliable results, which may +not always be available. +- The test is currently only designed for classification tasks. + + + + + + + +##### VMeasure + + + + + + +######## VMeasure() + +```python +def VMeasure(dataset: VMDataset, model: VMModel) +``` + + +Evaluates homogeneity and completeness of a clustering model using the V Measure Score. + +###### Purpose + +The purpose of this metric, V Measure Score (V Score), is to evaluate the performance of a clustering model. It +measures the homogeneity and completeness of a set of cluster labels, where homogeneity refers to each cluster +containing only members of a single class and completeness meaning all members of a given class are assigned to the +same cluster. + +###### Test Mechanism + +ClusterVMeasure is a class that inherits from another class, ClusterPerformance. It uses the `v_measure_score` +function from the sklearn module's metrics package. The required inputs to perform this metric are the model, train +dataset, and test dataset. The test is appropriate for models tasked with clustering. + +###### Signs of High Risk + +- Low V Measure Score**: A low V Measure Score indicates that the clustering model has poor homogeneity or +completeness, or both. This might signal that the model is failing to correctly cluster the data. + +###### Strengths + +- The V Measure Score is a harmonic mean between homogeneity and completeness. This ensures that both attributes +are taken into account when evaluating the model, providing an overall measure of its cluster validity. +- The metric does not require knowledge of the ground truth classes when measuring homogeneity and completeness, +making it applicable in instances where such information is unavailable. + +###### Limitations + +- The V Measure Score can be influenced by the number of clusters, which means that it might not always reflect the +quality of the clustering. Partitioning the data into many small clusters could lead to high homogeneity but low +completeness, leading to a low V Measure Score even if the clustering might be useful. +- It assumes equal importance of homogeneity and completeness. In some applications, one may be more important than +the other. The V Measure Score does not provide flexibility in assigning different weights to homogeneity and +completeness. + + + + + + + +##### WeakspotsDiagnosis + + + + + + +######## WeakspotsDiagnosis() + +```python +def WeakspotsDiagnosis(datasets: List, model: VMModel, features_columns: Union = None, metrics: Union = None, thresholds: Union = None) +``` + + +Identifies and visualizes weak spots in a machine learning model's performance across various sections of the +feature space. + +###### Purpose + +The weak spots test is applied to evaluate the performance of a machine learning model within specific regions of +its feature space. This test slices the feature space into various sections, evaluating the model's outputs within +each section against specific performance metrics (e.g., accuracy, precision, recall, and F1 scores). The ultimate +aim is to identify areas where the model's performance falls below the set thresholds, thereby exposing its +possible weaknesses and limitations. + +###### Test Mechanism + +The test mechanism adopts an approach of dividing the feature space of the training dataset into numerous bins. The +model's performance metrics (accuracy, precision, recall, F1 scores) are then computed for each bin on both the +training and test datasets. A "weak spot" is identified if any of the performance metrics fall below a +predetermined threshold for a particular bin on the test dataset. The test results are visually plotted as bar +charts for each performance metric, indicating the bins which fail to meet the established threshold. + +###### Signs of High Risk + +- Any performance metric of the model dropping below the set thresholds. +- Significant disparity in performance between the training and test datasets within a bin could be an indication +of overfitting. +- Regions or slices with consistently low performance metrics. Such instances could mean that the model struggles +to handle specific types of input data adequately, resulting in potentially inaccurate predictions. + +###### Strengths + +- The test helps pinpoint precise regions of the feature space where the model's performance is below par, allowing +for more targeted improvements to the model. +- The graphical presentation of the performance metrics offers an intuitive way to understand the model's +performance across different feature areas. +- The test exhibits flexibility, letting users set different thresholds for various performance metrics according +to the specific requirements of the application. + +###### Limitations + +- The binning system utilized for the feature space in the test could over-simplify the model's behavior within +each bin. The granularity of this slicing depends on the chosen 'bins' parameter and can sometimes be arbitrary. +- The effectiveness of this test largely hinges on the selection of thresholds for the performance metrics, which +may not hold universally applicable and could be subjected to the specifications of a particular model and +application. +- The test is unable to handle datasets with a text column, limiting its application to numerical or categorical +data types only. +- Despite its usefulness in highlighting problematic regions, the test does not offer direct suggestions for model +improvement. + + + + + + + + + + + +#### statsmodels + + + + + +##### AutoARIMA + + + + + + +######## AutoARIMA() + +```python +def AutoARIMA(model: VMModel, dataset: VMDataset) +``` + + +Evaluates ARIMA models for time-series forecasting, ranking them using Bayesian and Akaike Information Criteria. + +###### Purpose + +The AutoARIMA validation test is designed to evaluate and rank AutoRegressive Integrated Moving Average (ARIMA) +models. These models are primarily used for forecasting time-series data. The validation test automatically fits +multiple ARIMA models, with varying parameters, to every variable within the given dataset. The models are then +ranked based on their Bayesian Information Criterion (BIC) and Akaike Information Criterion (AIC) values, which +provide a basis for the efficient model selection process. + +###### Test Mechanism + +This metric proceeds by generating an array of feasible combinations of ARIMA model parameters which are within a +prescribed limit. These limits include `max_p`, `max_d`, `max_q`; they represent the autoregressive, differencing, +and moving average components respectively. Upon applying these sets of parameters, the validation test fits each +ARIMA model to the time-series data provided. For each model, it subsequently proceeds to calculate and record both +the BIC and AIC values, which serve as performance indicators for the model fit. Prior to this parameter fitting +process, the Augmented Dickey-Fuller test for data stationarity is conducted on the data series. If a series is +found to be non-stationary, a warning message is sent out, given that ARIMA models necessitate input series to be +stationary. + +###### Signs of High Risk + +- If the p-value of the Augmented Dickey-Fuller test for a variable exceeds 0.05, a warning is logged. This warning +indicates that the series might not be stationary, leading to potentially inaccurate results. +- Consistent failure in fitting ARIMA models (as made evident through logged errors) might disclose issues with +either the data or model stability. + +###### Strengths + +- The AutoARIMA validation test simplifies the often complex task of selecting the most suitable ARIMA model based +on BIC and AIC criteria. +- The mechanism incorporates a check for non-stationarity within the data, which is a critical prerequisite for +ARIMA models. +- The exhaustive search through all possible combinations of model parameters enhances the likelihood of +identifying the best-fit model. + +###### Limitations + +- This validation test can be computationally costly as it involves creating and fitting multiple ARIMA models for +every variable. +- Although the test checks for non-stationarity and logs warnings where present, it does not apply any +transformations to the data to establish stationarity. +- The selection of models leans solely on BIC and AIC criteria, which may not yield the best predictive model in +all scenarios. +- The test is only applicable to regression tasks involving time-series data, and may not work effectively for +other types of machine learning tasks. + + + + + + + +##### CumulativePredictionProbabilities + + + + + + +######## CumulativePredictionProbabilities() + +```python +def CumulativePredictionProbabilities(dataset, model, title = 'Cumulative Probabilities') +``` + + +Visualizes cumulative probabilities of positive and negative classes for both training and testing in classification models. + +###### Purpose + +This metric is utilized to evaluate the distribution of predicted probabilities for positive and negative classes +in a classification model. It provides a visual assessment of the model's behavior by plotting the cumulative +probabilities for positive and negative classes across both the training and test datasets. + +###### Test Mechanism + +The classification model is evaluated by first computing the predicted probabilities for each instance in both +the training and test datasets, which are then added as a new column in these sets. The cumulative probabilities +for positive and negative classes are subsequently calculated and sorted in ascending order. Cumulative +distributions of these probabilities are created for both positive and negative classes across both training and +test datasets. These cumulative probabilities are represented visually in a plot, containing two subplots - one for +the training data and the other for the test data, with lines representing cumulative distributions of positive and +negative classes. + +###### Signs of High Risk + +- Imbalanced distribution of probabilities for either positive or negative classes. +- Notable discrepancies or significant differences between the cumulative probability distributions for the +training data versus the test data. +- Marked discrepancies or large differences between the cumulative probability distributions for positive and +negative classes. + +###### Strengths + +- Provides a visual illustration of data, which enhances the ease of understanding and interpreting the model's +behavior. +- Allows for the comparison of model's behavior across training and testing datasets, providing insights about how +well the model is generalized. +- Differentiates between positive and negative classes and their respective distribution patterns, aiding in +problem diagnosis. + +###### Limitations + +- Exclusive to classification tasks and specifically to classification models. +- Graphical results necessitate human interpretation and may not be directly applicable for automated risk +detection. +- The method does not give a solitary quantifiable measure of model risk, instead, it offers a visual +representation and broad distributional information. +- If the training and test datasets are not representative of the overall data distribution, the metric could +provide misleading results. + + + + + + + +##### DurbinWatsonTest + + + + + + +######## DurbinWatsonTest() + +```python +def DurbinWatsonTest(dataset, model, threshold = {'cls': 'ExprList', 'elements': ['1.5', '2.5']}) +``` + + +Assesses autocorrelation in time series data features using the Durbin-Watson statistic. + +###### Purpose + +The Durbin-Watson Test metric detects autocorrelation in time series data (where a set of data values influences +their predecessors). Autocorrelation is a crucial factor for regression tasks as these often assume the +independence of residuals. A model with significant autocorrelation may give unreliable predictions. + +###### Test Mechanism + +Utilizing the `durbin_watson` function in the `statsmodels` Python library, the Durbin-Watson (DW) Test metric +generates a statistical value for each feature of the training dataset. The function is looped over all columns of +the dataset, calculating and caching the DW value for each column for further analysis. A DW metric value nearing 2 +indicates no autocorrelation. Conversely, values approaching 0 suggest positive autocorrelation, and those leaning +towards 4 imply negative autocorrelation. + +###### Signs of High Risk + +- If a feature's DW value significantly deviates from 2, it could signal a high risk due to potential +autocorrelation issues in the dataset. +- A value closer to 0 could imply positive autocorrelation, while a value nearer to 4 could point to negative +autocorrelation, both leading to potentially unreliable prediction models. + +###### Strengths + +- The metric specializes in identifying autocorrelation in prediction model residuals. +- Autocorrelation detection assists in diagnosing violation of various modeling technique assumptions, particularly +in regression analysis and time-series data modeling. + +###### Limitations + +- The Durbin-Watson Test mainly detects linear autocorrelation and could overlook other types of relationships. +- The metric is highly sensitive to data points order. Shuffling the order could lead to notably different results. +- The test only checks for first-order autocorrelation (between a variable and its immediate predecessor) and fails +to detect higher-order autocorrelation. + + + + + + + +##### GINITable + + + + + + +######## GINITable() + +```python +def GINITable(dataset, model) +``` + + +Evaluates classification model performance using AUC, GINI, and KS metrics for training and test datasets. + +###### Purpose + +The 'GINITable' metric is designed to evaluate the performance of a classification model by emphasizing its +discriminatory power. Specifically, it calculates and presents three important metrics - the Area under the ROC +Curve (AUC), the GINI coefficient, and the Kolmogorov-Smirnov (KS) statistic - for both training and test datasets. + +###### Test Mechanism + +Using a dictionary for storing performance metrics for both the training and test datasets, the 'GINITable' metric +calculates each of these metrics sequentially. The Area under the ROC Curve (AUC) is calculated via the +`roc_auc_score` function from the Scikit-Learn library. The GINI coefficient, a measure of statistical dispersion, +is then computed by doubling the AUC and subtracting 1. Finally, the Kolmogorov-Smirnov (KS) statistic is +calculated via the `roc_curve` function from Scikit-Learn, with the False Positive Rate (FPR) subtracted from the +True Positive Rate (TPR) and the maximum value taken from the resulting data. These metrics are then stored in a +pandas DataFrame for convenient visualization. + +###### Signs of High Risk + +- Low values for performance metrics may suggest a reduction in model performance, particularly a low AUC which +indicates poor classification performance, or a low GINI coefficient, which could suggest a decreased ability to +discriminate different classes. +- A high KS value may be an indicator of potential overfitting, as this generally signifies a substantial +divergence between positive and negative distributions. +- Significant discrepancies between the performance on the training dataset and the test dataset may present +another signal of high risk. + +###### Strengths + +- Offers three key performance metrics (AUC, GINI, and KS) in one test, providing a more comprehensive evaluation +of the model. +- Provides a direct comparison between the model's performance on training and testing datasets, which aids in +identifying potential underfitting or overfitting. +- The applied metrics are class-distribution invariant, thereby remaining effective for evaluating model +performance even when dealing with imbalanced datasets. +- Presents the metrics in a user-friendly table format for easy comprehension and analysis. + +###### Limitations + +- The GINI coefficient and KS statistic are both dependent on the AUC value. Therefore, any errors in the +calculation of the latter will adversely impact the former metrics too. +- Mainly suited for binary classification models and may require modifications for effective application in +multi-class scenarios. +- The metrics used are threshold-dependent and may exhibit high variability based on the chosen cut-off points. +- The test does not incorporate a method to efficiently handle missing or inefficiently processed data, which could +lead to inaccuracies in the metrics if the data is not appropriately preprocessed. + + + + + + + +##### KolmogorovSmirnov + + + + + + +######## KolmogorovSmirnov() + +```python +def KolmogorovSmirnov(model: VMModel, dataset: VMDataset, dist: str = 'norm') +``` + + +Assesses whether each feature in the dataset aligns with a normal distribution using the Kolmogorov-Smirnov test. + +###### Purpose + +The Kolmogorov-Smirnov (KS) test evaluates the distribution of features in a dataset to determine their alignment +with a normal distribution. This is important because many statistical methods and machine learning models assume +normality in the data distribution. + +###### Test Mechanism + +This test calculates the KS statistic and corresponding p-value for each feature in the dataset. It does so by +comparing the cumulative distribution function of the feature with an ideal normal distribution. The KS statistic +and p-value for each feature are then stored in a dictionary. The p-value threshold to reject the normal +distribution hypothesis is not preset, providing flexibility for different applications. + +###### Signs of High Risk + +- Elevated KS statistic for a feature combined with a low p-value, indicating a significant divergence from a +normal distribution. +- Features with notable deviations that could create problems if the model assumes normality in data distribution. + +###### Strengths + +- The KS test is sensitive to differences in the location and shape of empirical cumulative distribution functions. +- It is non-parametric and adaptable to various datasets, as it does not assume any specific data distribution. +- Provides detailed insights into the distribution of individual features. + +###### Limitations + +- The test's sensitivity to disparities in the tails of data distribution might cause false alarms about +non-normality. +- Less effective for multivariate distributions, as it is designed for univariate distributions. +- Does not identify specific types of non-normality, such as skewness or kurtosis, which could impact model fitting. + + + + + + + +##### Lilliefors + + + + + + +######## Lilliefors() + +```python +def Lilliefors(dataset: VMDataset) +``` + + +Assesses the normality of feature distributions in an ML model's training dataset using the Lilliefors test. + +###### Purpose + +The purpose of this metric is to utilize the Lilliefors test, named in honor of the Swedish statistician Hubert +Lilliefors, in order to assess whether the features of the machine learning model's training dataset conform to a +normal distribution. This is done because the assumption of normal distribution plays a vital role in numerous +statistical procedures as well as numerous machine learning models. Should the features fail to follow a normal +distribution, some model types may not operate at optimal efficiency. This can potentially lead to inaccurate +predictions. + +###### Test Mechanism + +The application of this test happens across all feature columns within the training dataset. For each feature, the +Lilliefors test returns a test statistic and p-value. The test statistic quantifies how far the feature's +distribution is from an ideal normal distribution, whereas the p-value aids in determining the statistical +relevance of this deviation. The final results are stored within a dictionary, the keys of which correspond to the +name of the feature column, and the values being another dictionary which houses the test statistic and p-value. + +###### Signs of High Risk + +- If the p-value corresponding to a specific feature sinks below a pre-established significance level, generally +set at 0.05, then it can be deduced that the distribution of that feature significantly deviates from a normal +distribution. This can present a high risk for models that assume normality, as these models may perform +inaccurately or inefficiently in the presence of such a feature. + +###### Strengths + +- One advantage of the Lilliefors test is its utility irrespective of whether the mean and variance of the normal +distribution are known in advance. This makes it a more robust option in real-world situations where these values +might not be known. +- The test has the ability to screen every feature column, offering a holistic view of the dataset. + +###### Limitations + +- Despite the practical applications of the Lilliefors test in validating normality, it does come with some +limitations. +- It is only capable of testing unidimensional data, thus rendering it ineffective for datasets with interactions +between features or multi-dimensional phenomena. +- The test might not be as sensitive as some other tests (like the Anderson-Darling test) in detecting deviations +from a normal distribution. +- Like any other statistical test, Lilliefors test may also produce false positives or negatives. Hence, banking +solely on this test, without considering other characteristics of the data, may give rise to risks. + + + + + + + +##### PredictionProbabilitiesHistogram + + + + + + +######## PredictionProbabilitiesHistogram() + +```python +def PredictionProbabilitiesHistogram(dataset, model, title = 'Histogram of Predictive Probabilities') +``` + + +Assesses the predictive probability distribution for binary classification to evaluate model performance and +potential overfitting or bias. + +###### Purpose + +The Prediction Probabilities Histogram test is designed to generate histograms displaying the Probability of +Default (PD) predictions for both positive and negative classes in training and testing datasets. This helps in +evaluating the performance of a classification model. + +###### Test Mechanism + +The metric follows these steps to execute the test: + +- Extracts the target column from both the train and test datasets. +- Uses the model's predict function to calculate probabilities. +- Adds these probabilities as a new column to the training and testing dataframes. +- Generates histograms for each class (0 or 1) within the training and testing datasets. +- Sets different opacities for the histograms to enhance visualization. +- Overlays the four histograms (two for training and two for testing) on two different subplot frames. +- Returns a plotly graph object displaying the visualization. + +###### Signs of High Risk + +- Significant discrepancies between the histograms of training and testing data. +- Large disparities between the histograms for the positive and negative classes. +- Potential overfitting or bias indicated by significant issues. +- Unevenly distributed probabilities suggesting inaccurate model predictions. + +###### Strengths + +- Offers a visual representation of the PD predictions made by the model, aiding in understanding its behavior. +- Assesses both the training and testing datasets, adding depth to model validation. +- Highlights disparities between classes, providing insights into class imbalance or data skewness. +- Effectively visualizes risk spread, which is particularly beneficial for credit risk prediction. + +###### Limitations + +- Specifically tailored for binary classification scenarios and not suited for multi-class classification tasks. +- Provides a robust visual representation but lacks a quantifiable measure to assess model performance. + + + + + + + +##### RegressionCoeffs + + + + + + +######## RegressionCoeffs() + +```python +def RegressionCoeffs(model) +``` + + +Assesses the significance and uncertainty of predictor variables in a regression model through visualization of +coefficients and their 95% confidence intervals. + +###### Purpose + +The `RegressionCoeffs` metric visualizes the estimated regression coefficients alongside their 95% confidence intervals, +providing insights into the impact and significance of predictor variables on the response variable. This visualization +helps to understand the variability and uncertainty in the model's estimates, aiding in the evaluation of the +significance of each predictor. + +###### Test Mechanism + +The function operates by extracting the estimated coefficients and their standard errors from the regression model. +Using these, it calculates the confidence intervals at a 95% confidence level, which indicates the range within which +the true coefficient value is expected to fall 95% of the time. The confidence intervals are computed using the +Z-value associated with the 95% confidence level. The coefficients and their confidence intervals are then visualized +in a bar plot. The x-axis represents the predictor variables, the y-axis represents the estimated coefficients, and +the error bars depict the confidence intervals. + +###### Signs of High Risk + +- The confidence interval for a coefficient contains the zero value, suggesting that the predictor may not significantly +contribute to the model. +- Multiple coefficients with confidence intervals that include zero, potentially indicating issues with model reliability. +- Very wide confidence intervals, which may suggest high uncertainty in the coefficient estimates and potential model +instability. + +###### Strengths + +- Provides a clear visualization that allows for easy interpretation of the significance and impact of predictor +variables. +- Includes confidence intervals, which provide additional information about the uncertainty surrounding each coefficient +estimate. + +###### Limitations + +- The method assumes normality of residuals and independence of observations, assumptions that may not always hold true +in practice. +- It does not address issues related to multi-collinearity among predictor variables, which can affect the interpretation +of coefficients. +- This metric is limited to regression tasks using tabular data and is not applicable to other types of machine learning +tasks or data structures. + + + + + + + +##### RegressionFeatureSignificance + + + + + + +######## RegressionFeatureSignificance() + +```python +def RegressionFeatureSignificance(model: VMModel, fontsize: int = 10, p_threshold: float = 0.05) +``` + + +Assesses and visualizes the statistical significance of features in a regression model. + +###### Purpose + +The Regression Feature Significance metric assesses the significance of each feature in a given set of regression +model. It creates a visualization displaying p-values for every feature of the model, assisting model developers +in understanding which features are most influential in their model. + +###### Test Mechanism + +The test mechanism involves extracting the model's coefficients and p-values for each feature, and then plotting these +values. The x-axis on the plot contains the p-values while the y-axis denotes the coefficients of each feature. A +vertical red line is drawn at the threshold for p-value significance, which is 0.05 by default. Any features with +p-values to the left of this line are considered statistically significant at the chosen level. + +###### Signs of High Risk + +- Any feature with a high p-value (greater than the threshold) is considered a potential high risk, as it suggests +the feature is not statistically significant and may not be reliably contributing to the model's predictions. +- A high number of such features may indicate problems with the model validation, variable selection, and overall +reliability of the model predictions. + +###### Strengths + +- Helps identify the features that significantly contribute to a model's prediction, providing insights into the +feature importance. +- Provides tangible, easy-to-understand visualizations to interpret the feature significance. + +###### Limitations + +- This metric assumes model features are independent, which may not always be the case. Multicollinearity (high +correlation amongst predictors) can cause high variance and unreliable statistical tests of significance. +- The p-value strategy for feature selection doesn't take into account the magnitude of the effect, focusing solely +on whether the feature is likely non-zero. +- This test is specific to regression models and wouldn't be suitable for other types of ML models. +- P-value thresholds are somewhat arbitrary and do not always indicate practical significance, only statistical +significance. + + + + + + + +##### RegressionModelForecastPlot + + + + + + +######## RegressionModelForecastPlot() + +```python +def RegressionModelForecastPlot(model: VMModel, dataset: VMDataset, start_date: Union = None, end_date: Union = None) +``` + + +Generates plots to visually compare the forecasted outcomes of a regression model against actual observed values over +a specified date range. + +###### Purpose + +This metric is useful for time-series models or any model where the outcome changes over time, allowing direct +comparison of predicted vs actual values. It can help identify overfitting or underfitting situations as well as +general model performance. + +###### Test Mechanism + +This test generates a plot with the x-axis representing the date ranging from the specified "start_date" to the +"end_date", while the y-axis shows the value of the outcome variable. Two lines are plotted**: one representing the +forecasted values and the other representing the observed values. The "start_date" and "end_date" can be parameters +of this test; if these parameters are not provided, they are set to the minimum and maximum date available in the +dataset. + +###### Signs of High Risk + +- High risk or failure signs could be deduced visually from the plots if the forecasted line significantly deviates +from the observed line, indicating the model's predicted values are not matching actual outcomes. +- A model that struggles to handle the edge conditions like maximum and minimum data points could also be +considered a sign of risk. + +###### Strengths + +- Visualization: The plot provides an intuitive and clear illustration of how well the forecast matches the actual +values, making it straightforward even for non-technical stakeholders to interpret. +- Flexibility: It allows comparison for multiple models and for specified time periods. +- Model Evaluation: It can be useful in identifying overfitting or underfitting situations, as these will manifest +as discrepancies between the forecasted and observed values. + +###### Limitations + +- Interpretation Bias: Interpretation of the plot is subjective and can lead to different conclusions by different +evaluators. +- Lack of Precision: Visual representation might not provide precise values of the deviation. +- Inapplicability: Limited to cases where the order of data points (time-series) matters, it might not be of much +use in problems that are not related to time series prediction. + + + + + + + +##### RegressionModelForecastPlotLevels + + + + + + +######## RegressionModelForecastPlotLevels() + +```python +def RegressionModelForecastPlotLevels(model: VMModel, dataset: VMDataset) +``` + + +Assesses the alignment between forecasted and observed values in regression models through visual plots + +###### Purpose + +This test aims to visually assess the performance of a regression model by comparing its forecasted values against +the actual observed values for both the raw and transformed (integrated) data. This helps determine the accuracy +of the model and can help identify overfitting or underfitting. The integration is applied to highlight the trend +rather than the absolute level. + +###### Test Mechanism + +This test generates two plots: + +- Raw data vs forecast +- Transformed data vs forecast + +The transformed data is created by performing a cumulative sum on the raw data. + +###### Signs of High Risk + +- Significant deviation between forecasted and observed values. +- Patterns suggesting overfitting or underfitting. +- Large discrepancies in the plotted forecasts, indicating potential issues with model generalizability and +precision. + +###### Strengths + +- Provides an intuitive, visual way to assess multiple regression models, aiding in easier interpretation and +evaluation of forecast accuracy. + +###### Limitations + +- Relies heavily on visual interpretation, which may vary between individuals. +- Does not provide a numerical metric to quantify forecast accuracy, relying solely on visual assessment. + + + + +######## integrate_diff() + +```python +def integrate_diff(series_diff, start_value) +``` + + + + + + + + +##### RegressionModelSensitivityPlot + + + + + + +######## RegressionModelSensitivityPlot() + +```python +def RegressionModelSensitivityPlot(dataset: VMDataset, model: VMModel, shocks: List = {'cls': 'ExprList', 'elements': ['0.1']}, transformation: Union = None) +``` + + +Assesses the sensitivity of a regression model to changes in independent variables by applying shocks and +visualizing the impact. + +###### Purpose + +The Regression Sensitivity Plot test is designed to perform sensitivity analysis on regression models. This test +aims to measure the impact of slight changes (shocks) applied to individual variables on the system's outcome while +keeping all other variables constant. By doing so, it analyzes the effects of each independent variable on the +dependent variable within the regression model, helping identify significant risk factors that could substantially +influence the model's output. + +###### Test Mechanism + +This test operates by initially applying shocks of varying magnitudes, defined by specific parameters, to each of +the model's features, one at a time. With all other variables held constant, a new prediction is made for each +dataset subjected to shocks. Any changes in the model's predictions are directly attributed to the shocks applied. +If the transformation parameter is set to "integrate," initial predictions and target values undergo transformation +via an integration function before being plotted. Finally, a plot demonstrating observed values against predicted +values for each model is generated, showcasing a distinct line graph illustrating predictions for each shock. + +###### Signs of High Risk + +- Drastic alterations in model predictions due to minor shocks to an individual variable, indicating high +sensitivity and potential over-dependence on that variable. +- Unusually high or unpredictable shifts in response to shocks, suggesting potential model instability or +overfitting. + +###### Strengths + +- Helps identify variables that strongly influence model outcomes, aiding in understanding feature importance. +- Generates visual plots, making results easily interpretable even to non-technical stakeholders. +- Useful in identifying overfitting and detecting unstable models that react excessively to minor variable changes. + +###### Limitations + +- Operates on the assumption that all other variables remain unchanged during the application of a shock, which may +not reflect real-world interdependencies. +- Best compatible with linear models and may not effectively evaluate the sensitivity of non-linear models. +- Provides a visual representation without a numerical risk measure, potentially introducing subjectivity in +interpretation. + + + + +######## integrate_diff() + +```python +def integrate_diff(series_diff, start_value) +``` + + + + + + + + +##### RegressionModelSummary + + + + + + +######## RegressionModelSummary() + +```python +def RegressionModelSummary(dataset: VMDataset, model: VMModel) +``` + + +Evaluates regression model performance using metrics including R-Squared, Adjusted R-Squared, MSE, and RMSE. + +###### Purpose + +The Regression Model Summary test evaluates the performance of regression models by measuring their predictive +ability regarding dependent variables given changes in the independent variables. It uses conventional regression +metrics such as R-Squared, Adjusted R-Squared, Mean Squared Error (MSE), and Root Mean Squared Error (RMSE) to +assess the model's accuracy and fit. + +###### Test Mechanism + +This test uses the sklearn library to calculate the R-Squared, Adjusted R-Squared, MSE, and RMSE. It outputs a +table with the results of these metrics along with the feature columns used by the model. + +###### Signs of High Risk + +- Low R-Squared and Adjusted R-Squared values. +- High MSE and RMSE values. + +###### Strengths + +- Offers an extensive evaluation of regression models by combining four key measures of model accuracy and fit. +- Provides a comprehensive view of the model's performance. +- Both the R-Squared and Adjusted R-Squared measures are readily interpretable. + +###### Limitations + +- RMSE and MSE might be sensitive to outliers. +- A high R-Squared or Adjusted R-Squared may not necessarily indicate a good model, especially in cases of +overfitting. + + + + + + + +##### RegressionPermutationFeatureImportance + + + + + + +######## RegressionPermutationFeatureImportance() + +```python +def RegressionPermutationFeatureImportance(dataset: VMDataset, model: VMModel, fontsize: int = 12, figure_height: int = 500) +``` + + +Assesses the significance of each feature in a model by evaluating the impact on model performance when feature +values are randomly rearranged. + +###### Purpose + +The primary purpose of this metric is to determine which features significantly impact the performance of a +regression model developed using statsmodels. The metric measures how much the prediction accuracy deteriorates +when each feature's values are permuted. + +###### Test Mechanism + +This metric shuffles the values of each feature one at a time in the dataset, computes the model's performance +after each permutation, and compares it to the baseline performance. A significant decrease in performance +indicates the importance of the feature. + +###### Signs of High Risk + +- Significant reliance on a feature that, when permuted, leads to a substantial decrease in performance, suggesting +overfitting or high model dependency on that feature. +- Features identified as unimportant despite known impacts from domain knowledge, suggesting potential issues in +model training or data preprocessing. + +###### Strengths + +- Directly assesses the impact of each feature on model performance, providing clear insights into model +dependencies. +- Model-agnostic within the scope of statsmodels, applicable to any regression model that outputs predictions. + +###### Limitations + +- The metric is specific to statsmodels and cannot be used with other types of models without adaptation. +- It does not capture interactions between features, which can lead to underestimating the importance of correlated +features. +- Assumes independence of features when calculating importance, which might not always hold true. + + + + + + + +##### ScorecardHistogram + + + + + + +######## ScorecardHistogram() + +```python +def ScorecardHistogram(dataset, title = 'Histogram of Scores', score_column = 'score') +``` + + +The Scorecard Histogram test evaluates the distribution of credit scores between default and non-default instances, +providing critical insights into the performance and generalizability of credit-risk models. + +###### Purpose + +The Scorecard Histogram test metric provides a visual interpretation of the credit scores generated by a machine +learning model for credit-risk classification tasks. It aims to compare the alignment of the model's scoring +decisions with the actual outcomes of credit loan applications. It helps in identifying potential discrepancies +between the model's predictions and real-world risk levels. + +###### Test Mechanism + +This metric uses logistic regression to generate a histogram of credit scores for both default (negative class) and +non-default (positive class) instances. Using both training and test datasets, the metric calculates the credit +score of each instance with a scorecard method, considering the impact of different features on the likelihood of +default. It includes the default point to odds (PDO) scaling factor and predefined target score and odds settings. +Histograms for training and test sets are computed and plotted separately to offer insights into the model's +generalizability to unseen data. + +###### Signs of High Risk + +- Discrepancies between the distributions of training and testing data, indicating a model's poor generalization +ability +- Skewed distributions favoring specific scores or classes, representing potential bias + +###### Strengths + +- Provides a visual interpretation of the model's credit scoring system, enhancing comprehension of model behavior +- Enables a direct comparison between actual and predicted scores for both training and testing data +- Its intuitive visualization helps understand the model's ability to differentiate between positive and negative +classes +- Can unveil patterns or anomalies not easily discerned through numerical metrics alone + +###### Limitations + +- Despite its value for visual interpretation, it doesn't quantify the performance of the model and therefore may +lack precision for thorough model evaluation +- The quality of input data can strongly influence the metric, as bias or noise in the data will affect both the +score calculation and resultant histogram +- Its specificity to credit scoring models limits its applicability across a wider variety of machine learning +tasks and models +- The metric's effectiveness is somewhat tied to the subjective interpretation of the analyst, relying on their +judgment of the characteristics and implications of the plot. + + + + + + + +##### statsutils + + + + + + +######## adj_r2_score() + +```python +def adj_r2_score(actual: , predicted: , rowcount: int, featurecount: int) +``` + + +Adjusted R2 Score + + + + + + + + + + + + + + + +### output + + + + + +##### class BooleanOutputHandler(OutputHandler) + + + + + + +###### can_handle() +```python +def can_handle(self, item): +``` + + +###### process() +```python +def process(self, item, result): +``` + +##### class FigureOutputHandler(OutputHandler) + + + + + + +###### can_handle() +```python +def can_handle(self, item): +``` + + +###### process() +```python +def process(self, item, result): +``` + +##### class MetricOutputHandler(OutputHandler) + + + + + + +###### can_handle() +```python +def can_handle(self, item): +``` + + +###### process() +```python +def process(self, item, result): +``` + +##### class OutputHandler(ABC) + +Base class for handling different types of test outputs + + + + +###### can_handle() +```python +def can_handle(self, item): +``` + +Base class for handling different types of test outputs + + +###### process() +```python +def process(self, item, result): +``` + +Base class for handling different types of test outputs + +##### class RawDataOutputHandler(OutputHandler) + + + + + + +###### can_handle() +```python +def can_handle(self, item): +``` + + +###### process() +```python +def process(self, item, result): +``` + +##### class TableOutputHandler(OutputHandler) + + + + + + +###### can_handle() +```python +def can_handle(self, item): +``` + + +###### process() +```python +def process(self, item, result): +``` + + +###### process_output() + +```python +def process_output(item: Any, result: TestResult) -> None +``` + + +Process a single test output item and update the TestResult. + + + + + + + +### prompt_validation + + + + + +#### Bias + + + + + + +####### Bias() + +```python +def Bias(model, min_threshold = 7) +``` + + +Assesses potential bias in a Large Language Model by analyzing the distribution and order of exemplars in the +prompt. + +###### Purpose + +The Bias Evaluation test calculates if and how the order and distribution of exemplars (examples) in a few-shot +learning prompt affect the output of a Large Language Model (LLM). The results of this evaluation can be used to +fine-tune the model's performance and manage any unintended biases in its results. + +###### Test Mechanism + +This test uses two checks: + +1. **Distribution of Exemplars:** The number of positive vs. negative examples in a prompt is varied. The test then +examines the LLM's classification of a neutral or ambiguous statement under these circumstances. +2. **Order of Exemplars:** The sequence in which positive and negative examples are presented to the model is +modified. Their resultant effect on the LLM's response is studied. + +For each test case, the LLM grades the input prompt on a scale of 1 to 10. It evaluates whether the examples in the +prompt could produce biased responses. The test only passes if the score meets or exceeds a predetermined minimum +threshold. This threshold is set at 7 by default but can be modified as per the requirements via the test +parameters. + +###### Signs of High Risk + +- A skewed result favoring either positive or negative responses may suggest potential bias in the model. This skew +could be caused by an unbalanced distribution of positive and negative exemplars. +- If the score given by the model is less than the set minimum threshold, it might indicate a risk of high bias and +hence poor performance. + +###### Strengths + +- This test provides a quantitative measure of potential bias, offering clear guidelines for developers about +whether their Large Language Model (LLM) contains significant bias. +- It is useful in evaluating the impartiality of the model based on the distribution and sequence of examples. +- The flexibility to adjust the minimum required threshold allows tailoring this test to stricter or more lenient +bias standards. + +###### Limitations + +- The test may not pick up on more subtle forms of bias or biases that are not directly related to the distribution +or order of exemplars. +- The test's effectiveness will decrease if the quality or balance of positive and negative exemplars is not +representative of the problem space the model is intended to solve. +- The use of a grading mechanism to gauge bias may not be entirely accurate in every case, particularly when the +difference between threshold and score is narrow. + + + + + + + +#### Clarity + + + + + + +####### Clarity() + +```python +def Clarity(model, min_threshold = 7) +``` + + +Evaluates and scores the clarity of prompts in a Large Language Model based on specified guidelines. + +###### Purpose + +The Clarity evaluation metric is used to assess how clear the prompts of a Large Language Model (LLM) are. This +assessment is particularly important because clear prompts assist the LLM in more accurately interpreting and +responding to instructions. + +###### Test Mechanism + +The evaluation uses an LLM to scrutinize the clarity of prompts, factoring in considerations such as the inclusion +of relevant details, persona adoption, step-by-step instructions, usage of examples, and specification of desired +output length. Each prompt is rated on a clarity scale of 1 to 10, and any prompt scoring at or above the preset +threshold (default of 7) will be marked as clear. It is important to note that this threshold can be adjusted via +test parameters, providing flexibility in the evaluation process. + +###### Signs of High Risk + +- Prompts that consistently score below the clarity threshold +- Repeated failure of prompts to adhere to guidelines for clarity, including detail inclusion, persona adoption, +explicit step-by-step instructions, use of examples, and specification of output length + +###### Strengths + +- Encourages the development of more effective prompts that aid the LLM in interpreting instructions accurately +- Applies a quantifiable measure (a score from 1 to 10) to evaluate the clarity of prompts +- Threshold for clarity is adjustable, allowing for flexible evaluation depending on the context + +###### Limitations + +- Scoring system is subjective and relies on the AI’s interpretation of 'clarity' +- The test assumes that all required factors (detail inclusion, persona adoption, step-by-step instructions, use of +examples, and specification of output length) contribute equally to clarity, which might not always be the case +- The evaluation may not be as effective if used on non-textual models + + + + + + + +#### Conciseness + + + + + + +####### Conciseness() + +```python +def Conciseness(model, min_threshold = 7) +``` + + +Analyzes and grades the conciseness of prompts provided to a Large Language Model. + +###### Purpose + +The Conciseness Assessment is designed to evaluate the brevity and succinctness of prompts provided to a Language +Learning Model (LLM). A concise prompt strikes a balance between offering clear instructions and eliminating +redundant or unnecessary information, ensuring that the LLM receives relevant input without being overwhelmed. + +###### Test Mechanism + +Using an LLM, this test conducts a conciseness analysis on input prompts. The analysis grades the prompt on a scale +from 1 to 10, where the grade reflects how well the prompt delivers clear instructions without being verbose. +Prompts that score equal to or above a predefined threshold (default set to 7) are deemed successfully concise. +This threshold can be adjusted to meet specific requirements. + +###### Signs of High Risk + +- Prompts that consistently score below the predefined threshold. +- Prompts that are overly wordy or contain unnecessary information. +- Prompts that create confusion or ambiguity due to excess or unnecessary information. + +###### Strengths + +- Ensures clarity and effectiveness of the prompts. +- Promotes brevity and preciseness in prompts without sacrificing essential information. +- Useful for models like LLMs, where input prompt length and clarity greatly influence model performance. +- Provides a quantifiable measure of prompt conciseness. + +###### Limitations + +- The conciseness score is based on an AI's assessment, which might not fully capture human interpretation of +conciseness. +- The predefined threshold for conciseness could be subjective and might need adjustment based on application. +- The test is dependent on the LLM’s understanding of conciseness, which might vary from model to model. + + + + + + + +#### Delimitation + + + + + + +####### Delimitation() + +```python +def Delimitation(model, min_threshold = 7) +``` + + +Evaluates the proper use of delimiters in prompts provided to Large Language Models. + +###### Purpose + +The Delimitation Test aims to assess whether prompts provided to the Language Learning Model (LLM) correctly use +delimiters to mark different sections of the input. Well-delimited prompts help simplify the interpretation process +for the LLM, ensuring that the responses are precise and accurate. + +###### Test Mechanism + +The test employs an LLM to examine prompts for appropriate use of delimiters such as triple quotation marks, XML +tags, and section titles. Each prompt is assigned a score from 1 to 10 based on its delimitation integrity. Prompts +with scores equal to or above the preset threshold (which is 7 by default, although it can be adjusted as +necessary) pass the test. + +###### Signs of High Risk + +- Prompts missing, improperly placed, or incorrectly used delimiters, leading to misinterpretation by the LLM. +- High-risk scenarios with complex prompts involving multiple tasks or diverse data where correct delimitation is +crucial. +- Scores below the threshold, indicating a high risk. + +###### Strengths + +- Ensures clarity in demarcating different components of given prompts. +- Reduces ambiguity in understanding prompts, especially for complex tasks. +- Provides a quantified insight into the appropriateness of delimiter usage, aiding continuous improvement. + +###### Limitations + +- Only checks for the presence and placement of delimiters, not whether the correct delimiter type is used for the +specific data or task. +- May not fully reveal the impacts of poor delimitation on the LLM's final performance. +- The preset score threshold may not be refined enough for complex tasks and prompts, requiring regular manual +adjustment. + + + + + + + +#### NegativeInstruction + + + + + + +####### NegativeInstruction() + +```python +def NegativeInstruction(model, min_threshold = 7) +``` + + +Evaluates and grades the use of affirmative, proactive language over negative instructions in LLM prompts. + +###### Purpose + +The Negative Instruction test is utilized to scrutinize the prompts given to a Large Language Model (LLM). The +objective is to ensure these prompts are expressed using proactive, affirmative language. The focus is on +instructions indicating what needs to be done rather than what needs to be avoided, thereby guiding the LLM more +efficiently towards the desired output. + +###### Test Mechanism + +An LLM is employed to evaluate each prompt. The prompt is graded based on its use of positive instructions with +scores ranging between 1-10. This grade reflects how effectively the prompt leverages affirmative language while +shying away from negative or restrictive instructions. A prompt that attains a grade equal to or above a +predetermined threshold (7 by default) is regarded as adhering effectively to the best practices of positive +instruction. This threshold can be custom-tailored through the test parameters. + +###### Signs of High Risk + +- Low score obtained from the LLM analysis, indicating heavy reliance on negative instructions in the prompts. +- Failure to surpass the preset minimum threshold. +- The LLM generates ambiguous or undesirable outputs as a consequence of the negative instructions used in the +prompt. + +###### Strengths + +- Encourages the usage of affirmative, proactive language in prompts, aiding in more accurate and advantageous +model responses. +- The test result provides a comprehensible score, helping to understand how well a prompt follows the positive +instruction best practices. + +###### Limitations + +- Despite an adequate score, a prompt could still be misleading or could lead to undesired responses due to factors +not covered by this test. +- The test necessitates an LLM for evaluation, which might not be available or feasible in certain scenarios. +- A numeric scoring system, while straightforward, may oversimplify complex issues related to prompt designing and +instruction clarity. +- The effectiveness of the test hinges significantly on the predetermined threshold level, which can be subjective +and may need to be adjusted according to specific use-cases. + + + + + + + +#### Robustness + + + + + + +####### Robustness() + +```python +def Robustness(model, dataset, num_tests = 10) +``` + + +Assesses the robustness of prompts provided to a Large Language Model under varying conditions and contexts. This test +specifically measures the model's ability to generate correct classifications with the given prompt even when the +inputs are edge cases or otherwise difficult to classify. + +###### Purpose + +The Robustness test is meant to evaluate the resilience and reliability of prompts provided to a Language Learning +Model (LLM). The aim of this test is to guarantee that the prompts consistently generate accurate and expected +outputs, even in diverse or challenging scenarios. This test is only applicable to LLM-powered text classification +tasks where the prompt has a single input variable. + +###### Test Mechanism + +The Robustness test appraises prompts under various conditions, alterations, and contexts to ascertain their +stability in producing consistent responses from the LLM. Factors evaluated include different phrasings, inclusion +of potential distracting elements, and various input complexities. By default, the test generates 10 inputs for a +prompt but can be adjusted according to test parameters. + +###### Signs of High Risk + +- If the output from the tests diverges extensively from the expected results, this indicates high risk. +- When the prompt doesn't give a consistent performance across various tests. +- A high risk is indicated when the prompt is susceptible to breaking, especially when the output is expected to be +of a specific type. + +###### Strengths + +- The robustness test helps to ensure stable performance of the LLM prompts and lowers the chances of generating +unexpected or off-target outputs. +- This test is vital for applications where predictability and reliability of the LLM’s output are crucial. + +###### Limitations + +- Currently, the test only supports single-variable prompts, which restricts its application to more complex models. +- When there are too many target classes (over 10), the test is skipped, which can leave potential vulnerabilities +unchecked in complex multi-class models. +- The test may not account for all potential conditions or alterations that could show up in practical use +scenarios. + + + + + + + +#### Specificity + + + + + + +####### Specificity() + +```python +def Specificity(model, min_threshold = 7) +``` + + +Evaluates and scores the specificity of prompts provided to a Large Language Model (LLM), based on clarity, detail, +and relevance. + +###### Purpose + +The Specificity Test evaluates the clarity, precision, and effectiveness of the prompts provided to a Language +Model (LLM). It aims to ensure that the instructions embedded in a prompt are indisputably clear and relevant, +thereby helping to remove ambiguity and steer the LLM towards desired outputs. This level of specificity +significantly affects the accuracy and relevance of LLM outputs. + +###### Test Mechanism + +The Specificity Test employs an LLM to grade each prompt based on clarity, detail, and relevance parameters within +a specificity scale that extends from 1 to 10. On this scale, prompts scoring equal to or more than a predefined +threshold (set to 7 by default) pass the evaluation, while those scoring below this threshold fail it. Users can +adjust this threshold as per their requirements. + +###### Signs of High Risk + +- Prompts scoring consistently below the established threshold +- Vague or ambiguous prompts that do not provide clear direction to the LLM +- Overly verbose prompts that may confuse the LLM instead of providing clear guidance + +###### Strengths + +- Enables precise and clear communication with the LLM to achieve desired outputs +- Serves as a crucial means to measure the effectiveness of prompts +- Highly customizable, allowing users to set their threshold based on specific use cases + +###### Limitations + +- This test doesn't consider the content comprehension capability of the LLM +- High specificity score doesn't guarantee a high-quality response from the LLM, as the model's performance is also +dependent on various other factors +- Striking a balance between specificity and verbosity can be challenging, as overly detailed prompts might confuse +or mislead the model + + + + + + + +#### ai_powered_test + + + + + + +####### call_model() + +```python +def call_model(system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42) +``` + + +Call LLM with the given prompts and return the response + + + + +####### get_explanation() + +```python +def get_explanation(response: str) +``` + + +Get just the explanation from the response string +- **TODO****: use json response mode instead of this + +- **e.g. "Score**: 8 +Explanation: " -> "" + + + + +####### get_score() + +```python +def get_score(response: str) +``` + + +Get just the score from the response string +- **TODO****: use json response mode instead of this + +- **e.g. "Score**: 8 +Explanation: " -> 8 + + + + + + + + + + + + +##### register_test_provider() + +```python +def register_test_provider(namespace: str, test_provider: TestProvider) -> None +``` + + +Register an external test provider + +**Arguments** + +- **namespace (str)****: The namespace of the test provider +- **test_provider (TestProvider)**: The test provider + + + +### run + + + + + + +###### build_test_result() + +```python +def build_test_result(outputs: Union, test_id: str, test_doc: str, inputs: Dict, params: Union, title: Optional = None) +``` + + +Build a TestResult object from a set of raw test function outputs + + + + +###### print_env() + +```python +def print_env() +``` + + + + + +###### run_test() + +```python +def run_test(test_id: Union = None, name: Union = None, unit_metrics: Union = None, inputs: Union = None, input_grid: Union = None, params: Union = None, param_grid: Union = None, show: bool = True, generate_description: bool = True, title: Optional = None, post_process_fn: Union = None, kwargs = {}) -> TestResult +``` + + +Run a ValidMind or custom test + +This function is the main entry point for running tests. It can run simple unit metrics, +ValidMind and custom tests, composite tests made up of multiple unit metrics and comparison +tests made up of multiple tests. + +**Arguments** + +- **test_id (TestID, optional)****: Test ID to run. Not required if `name` and `unit_metrics` provided. +- **params (dict, optional)**: Parameters to customize test behavior. See test details for available parameters. +- **param_grid (Union[Dict[str, List[Any]], List[Dict[str, Any]]], optional)**: For comparison tests, either: - Dict mapping parameter names to lists of values (creates Cartesian product) - List of parameter dictionaries to test +- **inputs (Dict[str, Any], optional)**: Test inputs (models/datasets initialized with vm.init_model/dataset) +- **input_grid (Union[Dict[str, List[Any]], List[Dict[str, Any]]], optional)**: For comparison tests, either: - Dict mapping input names to lists of values (creates Cartesian product) - List of input dictionaries to test +- **name (str, optional)**: Test name (required for composite metrics) +- **unit_metrics (list, optional)**: Unit metric IDs to run as composite metric +- **show (bool, optional)**: Whether to display results. Defaults to True. +- **generate_description (bool, optional)**: Whether to generate a description. Defaults to True. +- **title (str, optional)**: Custom title for the test result +- **post_process_fn (Callable[[TestResult], None], optional)**: Function to post-process the test result + +**Returns** + +- **TestResult**: A TestResult object containing the test results + +**Raises** + +- **ValueError**: If the test inputs are invalid +- **LoadTestError**: If the test class fails to load + + + + + + + +### test_providers + + + + + +##### class LocalTestProvider + +Test providers in ValidMind are responsible for loading tests from different sources, +such as local files, databases, or remote services. The LocalTestProvider specifically +loads tests from the local file system. + +To use the LocalTestProvider, you need to provide the root_folder, which is the +root directory for local tests. The test_id is a combination of the namespace (set +when registering the test provider) and the path to the test class module, where +slashes are replaced by dots and the .py extension is left out. + +Example usage: + +``` +# Create an instance of LocalTestProvider with the root folder +test_provider = LocalTestProvider("/path/to/tests/folder") + +# Register the test provider with a namespace +register_test_provider("my_namespace", test_provider) + +# List all tests in the namespace (returns a list of test IDs) +test_provider.list_tests() +# this is used by the validmind.tests.list_tests() function to aggregate all tests +# from all test providers + +# Load a test using the test_id (namespace + path to test class module) +test = test_provider.load_test("my_namespace.my_test_class") +# full path to the test class module is /path/to/tests/folder/my_test_class.py +``` + +Attributes: + root_folder (str): The root directory for local tests. + + + + +###### list_tests() +```python +def list_tests(self): +``` + +Test providers in ValidMind are responsible for loading tests from different sources, +such as local files, databases, or remote services. The LocalTestProvider specifically +loads tests from the local file system. + +To use the LocalTestProvider, you need to provide the root_folder, which is the +root directory for local tests. The test_id is a combination of the namespace (set +when registering the test provider) and the path to the test class module, where +slashes are replaced by dots and the .py extension is left out. + +Example usage: + +``` +# Create an instance of LocalTestProvider with the root folder +test_provider = LocalTestProvider("/path/to/tests/folder") + +# Register the test provider with a namespace +register_test_provider("my_namespace", test_provider) + +# List all tests in the namespace (returns a list of test IDs) +test_provider.list_tests() +# this is used by the validmind.tests.list_tests() function to aggregate all tests +# from all test providers + +# Load a test using the test_id (namespace + path to test class module) +test = test_provider.load_test("my_namespace.my_test_class") +# full path to the test class module is /path/to/tests/folder/my_test_class.py +``` + +**Attributes** + +- **root_folder (str)****: The root directory for local tests. + + +###### load_test() +```python +def load_test(self, test_id): +``` + +Test providers in ValidMind are responsible for loading tests from different sources, +such as local files, databases, or remote services. The LocalTestProvider specifically +loads tests from the local file system. + +To use the LocalTestProvider, you need to provide the root_folder, which is the +root directory for local tests. The test_id is a combination of the namespace (set +when registering the test provider) and the path to the test class module, where +slashes are replaced by dots and the .py extension is left out. + +Example usage: + +``` +# Create an instance of LocalTestProvider with the root folder +test_provider = LocalTestProvider("/path/to/tests/folder") + +# Register the test provider with a namespace +register_test_provider("my_namespace", test_provider) + +# List all tests in the namespace (returns a list of test IDs) +test_provider.list_tests() +# this is used by the validmind.tests.list_tests() function to aggregate all tests +# from all test providers + +# Load a test using the test_id (namespace + path to test class module) +test = test_provider.load_test("my_namespace.my_test_class") +# full path to the test class module is /path/to/tests/folder/my_test_class.py +``` + +**Attributes** + +- **root_folder (str)****: The root directory for local tests. + + +###### root_folder() +```python +def root_folder(): +``` + +Test providers in ValidMind are responsible for loading tests from different sources, +such as local files, databases, or remote services. The LocalTestProvider specifically +loads tests from the local file system. + +To use the LocalTestProvider, you need to provide the root_folder, which is the +root directory for local tests. The test_id is a combination of the namespace (set +when registering the test provider) and the path to the test class module, where +slashes are replaced by dots and the .py extension is left out. + +Example usage: + +``` +# Create an instance of LocalTestProvider with the root folder +test_provider = LocalTestProvider("/path/to/tests/folder") + +# Register the test provider with a namespace +register_test_provider("my_namespace", test_provider) + +# List all tests in the namespace (returns a list of test IDs) +test_provider.list_tests() +# this is used by the validmind.tests.list_tests() function to aggregate all tests +# from all test providers + +# Load a test using the test_id (namespace + path to test class module) +test = test_provider.load_test("my_namespace.my_test_class") +# full path to the test class module is /path/to/tests/folder/my_test_class.py +``` + +**Attributes** + +- **root_folder (str)****: The root directory for local tests. + +##### class TestProvider(Protocol) + +Protocol for user-defined test providers + + + + +###### list_tests() +```python +def list_tests(self): +``` + +Protocol for user-defined test providers + + +###### load_test() +```python +def load_test(self, test_id): +``` + +Protocol for user-defined test providers + +##### class ValidMindTestProvider + +Test provider for ValidMind tests + + + + +###### list_tests() +```python +def list_tests(self): +``` + +Test provider for ValidMind tests + + +###### load_test() +```python +def load_test(self, test_id): +``` + +Test provider for ValidMind tests + + +###### metrics_provider() +```python +def metrics_provider(): +``` + +Test provider for ValidMind tests + + +###### tests_provider() +```python +def tests_provider(): +``` + +Test provider for ValidMind tests + + + + + +### utils + + +Test Module Utils + + + + + +###### ensure_equal_lengths() + +```python +def ensure_equal_lengths(y_true, y_pred, dataset_id = None) +``` + + +Check if true and predicted values have matching lengths, log warning if they don't, +and truncate to the shorter length if necessary. Also removes any NaN/None values. + +**Arguments** + +- **y_true****: List or array of true values +- **y_pred**: List or array of predicted values +- **dataset_id**: Optional identifier for the dataset (for logging) + +**Returns** + +- **tuple**: (cleaned_y_true, cleaned_y_pred) + + + + +###### remove_nan_pairs() + +```python +def remove_nan_pairs(y_true, y_pred, dataset_id = None) +``` + + +Remove pairs where either true or predicted values are NaN/None. +**Arguments** + +- **y_true****: List or array of true values +- **y_pred**: List or array of predicted values +- **dataset_id**: Optional identifier for the dataset (for logging) +**Returns** + +- **tuple**: (cleaned_y_true, cleaned_y_pred) + + + + +###### test_description() + +```python +def test_description(test_class, truncate = True) +``` + + + + + +###### validate_prediction() + +```python +def validate_prediction(y_true, y_pred, dataset_id = None) +``` + + +Comprehensive validation of true and predicted value pairs. +Handles NaN/None values and length mismatches. + +**Arguments** + +- **y_true****: List or array of true values +- **y_pred**: List or array of predicted values +- **dataset_id**: Optional identifier for the dataset (for logging) + +**Returns** + +- **tuple**: (cleaned_y_true, cleaned_y_pred) with matching lengths and no NaN values + +Example: +- >>> y_true, y_pred = validate_prediction_pairs(dataset.y, model.predict(dataset.X), dataset.input_id) + + + + + + + + + + +### unit_metrics + + + +##### describe_metric() + +```python +def describe_metric(metric_id: str, kwargs = {}) +``` + + +Describe a metric + + + + +##### list_metrics() + +```python +def list_metrics(kwargs = {}) +``` + + +List all metrics + + + + +##### run_metric() + +```python +def run_metric(metric_id: str, kwargs = {}) +``` + + +Run a metric + + + + + + + +### vm_models + + +Models entrypoint + +### dataset + + + + + +#### dataset + + +Dataset class wrapper + + + + +###### class DataFrameDataset(VMDataset) + +VM dataset implementation for pandas DataFrame. + + + +###### class PolarsDataset(VMDataset) + +VM dataset implementation for Polars DataFrame. + + + +###### class TorchDataset(VMDataset) + +VM dataset implementation for PyTorch Datasets. + + + +###### class VMDataset(VMInput) + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +Attributes: + raw_dataset (np.ndarray): The raw dataset as a NumPy array. + input_id (str): Identifier for the dataset. + index (np.ndarray): The raw dataset index as a NumPy array. + columns (Set[str]): The column names of the dataset. + target_column (str): The target column name of the dataset. + feature_columns (List[str]): The feature column names of the dataset. + feature_columns_numeric (List[str]): The numeric feature column names of the dataset. + feature_columns_categorical (List[str]): The categorical feature column names of the dataset. + text_column (str): The text column name of the dataset for NLP tasks. + target_class_labels (Dict): The class labels for the target columns. + df (pd.DataFrame): The dataset as a pandas DataFrame. + extra_columns (Dict): Extra columns to include in the dataset. + + + + +####### add_extra_column() +```python +def add_extra_column(self, column_name, column_values = None): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### assign_predictions() +```python +def assign_predictions(self, model, prediction_column = None, prediction_values = None, probability_column = None, probability_values = None, prediction_probabilities = None, kwargs = {}): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### column_aliases() +```python +def column_aliases(): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### columns() +```python +def columns(): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### df() +```python +def df(): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### extra_columns() +```python +def extra_columns(): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### index() +```python +def index(): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### input_id() +```python +def input_id(): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### prediction_column() +```python +def prediction_column(self, model, column_name = None): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### probability_column() +```python +def probability_column(self, model, column_name = None): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### target_class_labels() +```python +def target_class_labels(): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### target_classes() +```python +def target_classes(self): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### target_column() +```python +def target_column(): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### text_column() +```python +def text_column(): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### with_options() +```python +def with_options(self, kwargs = {}): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### x() +```python +def x(): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### x_df() +```python +def x_df(self): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### y() +```python +def y(): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### y_df() +```python +def y_df(self): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### y_pred() +```python +def y_pred(self, model): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### y_pred_df() +```python +def y_pred_df(self, model): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### y_prob() +```python +def y_prob(self, model): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + +####### y_prob_df() +```python +def y_prob_df(self, model): +``` + +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) +by converting the user's dataset into a numpy array collecting metadata like +column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only +need to work with numpy arrays and pandas dataframes in this class. + +**Attributes** + +- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. +- **input_id (str)**: Identifier for the dataset. +- **index (np.ndarray)**: The raw dataset index as a NumPy array. +- **columns (Set[str])**: The column names of the dataset. +- **target_column (str)**: The target column name of the dataset. +- **feature_columns (List[str])**: The feature column names of the dataset. +- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. +- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. +- **text_column (str)**: The text column name of the dataset for NLP tasks. +- **target_class_labels (Dict)**: The class labels for the target columns. +- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. +- **extra_columns (Dict)**: Extra columns to include in the dataset. + + + + + +#### utils + + + + + +###### class ExtraColumns + +Extra columns for the dataset. + + + + +####### add_extra() +```python +def add_extra(self, column_name): +``` + +Extra columns for the dataset. + + +####### extras() +```python +def extras(): +``` + +Extra columns for the dataset. + + +####### flatten() +```python +def flatten(self): +``` + +Extra columns for the dataset. + + +####### from_dict() +```python +def from_dict(cls, data): +``` + +Extra columns for the dataset. + + +####### group_by_column() +```python +def group_by_column(): +``` + +Extra columns for the dataset. + + +####### prediction_column() +```python +def prediction_column(self, model, column_name = None): +``` + +Extra columns for the dataset. + + +####### prediction_columns() +```python +def prediction_columns(): +``` + +Extra columns for the dataset. + + +####### probability_column() +```python +def probability_column(self, model, column_name = None): +``` + +Extra columns for the dataset. + + +####### probability_columns() +```python +def probability_columns(): +``` + +Extra columns for the dataset. + + +####### as_df() + +```python +def as_df(series_or_frame: Union) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +``` + + + + + +####### compute_predictions() + +```python +def compute_predictions(model, X, kwargs = {}) -> tuple +``` + + + + + +####### convert_index_to_datetime() + +```python +def convert_index_to_datetime(df) +``` + + +Attempts to convert the index of the dataset to a datetime index +and leaves the index unchanged if it fails. + + + + + + + + + + + +### figure + + +Figure objects track the figure schema supported by the ValidMind API + + + + +##### class Figure + +Figure objects track the schema supported by the ValidMind API + + + + +###### figure() +```python +def figure(): +``` + +Figure objects track the schema supported by the ValidMind API + + +###### key() +```python +def key(): +``` + +Figure objects track the schema supported by the ValidMind API + + +###### ref_id() +```python +def ref_id(): +``` + +Figure objects track the schema supported by the ValidMind API + + +###### serialize() +```python +def serialize(self): +``` + +Figure objects track the schema supported by the ValidMind API + + +###### serialize_files() +```python +def serialize_files(self): +``` + +Figure objects track the schema supported by the ValidMind API + + +###### to_widget() +```python +def to_widget(self): +``` + +Figure objects track the schema supported by the ValidMind API + + +###### create_figure() + +```python +def create_figure(figure: Union, key: str, ref_id: str) -> Figure +``` + + +Create a VM Figure object from a raw figure object + + + + +###### is_matplotlib_figure() + +```python +def is_matplotlib_figure(figure) -> bool +``` + + + + + +###### is_plotly_figure() + +```python +def is_plotly_figure(figure) -> bool +``` + + + + + +###### is_png_image() + +```python +def is_png_image(figure) -> bool +``` + + + + + + + + +### input + + +Base class for ValidMind Input types + + + + +##### class VMInput(ABC) + +Base class for ValidMind Input types + + + + +###### with_options() +```python +def with_options(self, kwargs = {}): +``` + +Base class for ValidMind Input types + + + + + +### model + + +Model class wrapper module + + + + +##### class ModelAttributes + +Model attributes definition + + + + +###### architecture() +```python +def architecture(): +``` + +Model attributes definition + + +###### framework() +```python +def framework(): +``` + +Model attributes definition + + +###### framework_version() +```python +def framework_version(): +``` + +Model attributes definition + + +###### from_dict() +```python +def from_dict(cls, data): +``` + +Model attributes definition + + +###### language() +```python +def language(): +``` + +Model attributes definition + + +###### task() +```python +def task(): +``` + +Model attributes definition + +##### class ModelPipeline + +Helper class for chaining models together + +This shouldn't be used directly, it just gets used when chaining models with the +`|` operator since you can't use a list directly - you must use a type that +overloads the `|` operator. + + + + +###### models() +```python +def models(): +``` + +Helper class for chaining models together + +This shouldn't be used directly, it just gets used when chaining models with the +`|` operator since you can't use a list directly - you must use a type that +overloads the `|` operator. + +##### class ModelTask(Enum) + +Model task enums + + + + +###### CLASSIFICATION() +```python +def CLASSIFICATION(): +``` + +Model task enums + + +###### REGRESSION() +```python +def REGRESSION(): +``` + +Model task enums + +##### class VMModel(VMInput) + +An base class that wraps a trained model instance and its associated data. + +Attributes: + model (object, optional): The trained model instance. Defaults to None. + input_id (str, optional): The input ID for the model. Defaults to None. + attributes (ModelAttributes, optional): The attributes of the model. Defaults to None. + name (str, optional): The name of the model. Defaults to the class name. + + + + +###### attributes() +```python +def attributes(): +``` + +An base class that wraps a trained model instance and its associated data. + +**Attributes** + +- **model (object, optional)****: The trained model instance. Defaults to None. +- **input_id (str, optional)**: The input ID for the model. Defaults to None. +- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. +- **name (str, optional)**: The name of the model. Defaults to the class name. + + +###### class_() +```python +def class_(): +``` + +An base class that wraps a trained model instance and its associated data. + +**Attributes** + +- **model (object, optional)****: The trained model instance. Defaults to None. +- **input_id (str, optional)**: The input ID for the model. Defaults to None. +- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. +- **name (str, optional)**: The name of the model. Defaults to the class name. + + +###### input_id() +```python +def input_id(): +``` + +An base class that wraps a trained model instance and its associated data. + +**Attributes** + +- **model (object, optional)****: The trained model instance. Defaults to None. +- **input_id (str, optional)**: The input ID for the model. Defaults to None. +- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. +- **name (str, optional)**: The name of the model. Defaults to the class name. + + +###### language() +```python +def language(): +``` + +An base class that wraps a trained model instance and its associated data. + +**Attributes** + +- **model (object, optional)****: The trained model instance. Defaults to None. +- **input_id (str, optional)**: The input ID for the model. Defaults to None. +- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. +- **name (str, optional)**: The name of the model. Defaults to the class name. + + +###### library() +```python +def library(): +``` + +An base class that wraps a trained model instance and its associated data. + +**Attributes** + +- **model (object, optional)****: The trained model instance. Defaults to None. +- **input_id (str, optional)**: The input ID for the model. Defaults to None. +- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. +- **name (str, optional)**: The name of the model. Defaults to the class name. + + +###### library_version() +```python +def library_version(): +``` + +An base class that wraps a trained model instance and its associated data. + +**Attributes** + +- **model (object, optional)****: The trained model instance. Defaults to None. +- **input_id (str, optional)**: The input ID for the model. Defaults to None. +- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. +- **name (str, optional)**: The name of the model. Defaults to the class name. + + +###### model() +```python +def model(): +``` + +An base class that wraps a trained model instance and its associated data. + +**Attributes** + +- **model (object, optional)****: The trained model instance. Defaults to None. +- **input_id (str, optional)**: The input ID for the model. Defaults to None. +- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. +- **name (str, optional)**: The name of the model. Defaults to the class name. + + +###### name() +```python +def name(): +``` + +An base class that wraps a trained model instance and its associated data. + +**Attributes** + +- **model (object, optional)****: The trained model instance. Defaults to None. +- **input_id (str, optional)**: The input ID for the model. Defaults to None. +- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. +- **name (str, optional)**: The name of the model. Defaults to the class name. + + +###### predict() +```python +def predict(self, args = (), kwargs = {}): +``` + +An base class that wraps a trained model instance and its associated data. + +**Attributes** + +- **model (object, optional)****: The trained model instance. Defaults to None. +- **input_id (str, optional)**: The input ID for the model. Defaults to None. +- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. +- **name (str, optional)**: The name of the model. Defaults to the class name. + + +###### predict_proba() +```python +def predict_proba(self, args = (), kwargs = {}): +``` + +An base class that wraps a trained model instance and its associated data. + +**Attributes** + +- **model (object, optional)****: The trained model instance. Defaults to None. +- **input_id (str, optional)**: The input ID for the model. Defaults to None. +- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. +- **name (str, optional)**: The name of the model. Defaults to the class name. + + +###### serialize() +```python +def serialize(self): +``` + +An base class that wraps a trained model instance and its associated data. + +**Attributes** + +- **model (object, optional)****: The trained model instance. Defaults to None. +- **input_id (str, optional)**: The input ID for the model. Defaults to None. +- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. +- **name (str, optional)**: The name of the model. Defaults to the class name. + + +###### get_model_class() + +```python +def get_model_class(model, predict_fn = None) +``` + + + + + +###### has_method_with_arguments() + +```python +def has_method_with_arguments(cls, method_name, n_args) +``` + + + + + +###### is_model_metadata() + +```python +def is_model_metadata(model) +``` + + +Checks if the model is a dictionary containing metadata about a model. +We want to check if the metadata dictionary contains at least the following keys: + +- architecture +- language + + + + +###### is_pytorch_model() + +```python +def is_pytorch_model(model) +``` + + +Checks if the model is a PyTorch model. Need to extend this +method to check for all ways a PyTorch model can be created + + + + +###### model_module() + +```python +def model_module(model) +``` + + + + + + + + +### result + + + + + +#### result + + +Result Objects for test results + + + + +###### class ErrorResult(Result) + +Result for test suites that fail to load or run properly + + + + +####### error() +```python +def error(): +``` + +Result for test suites that fail to load or run properly + + +####### log_async() +```python +def log_async(self): +``` + +Result for test suites that fail to load or run properly + + +####### message() +```python +def message(): +``` + +Result for test suites that fail to load or run properly + + +####### name() +```python +def name(): +``` + +Result for test suites that fail to load or run properly + + +####### to_widget() +```python +def to_widget(self): +``` + +Result for test suites that fail to load or run properly + +###### class RawData + +Holds raw data for a test result + + + + +####### inspect() +```python +def inspect(self, show = True): +``` + +Holds raw data for a test result + + +####### log() +```python +def log(): +``` + +Holds raw data for a test result + + +####### serialize() +```python +def serialize(self): +``` + +Holds raw data for a test result + +###### class Result + +Base Class for test suite results + + + + +####### log() +```python +def log(self): +``` + +Base Class for test suite results + + +####### name() +```python +def name(): +``` + +Base Class for test suite results + + +####### result_id() +```python +def result_id(): +``` + +Base Class for test suite results + + +####### show() +```python +def show(self): +``` + +Base Class for test suite results + + +####### to_widget() +```python +def to_widget(self): +``` + +Base Class for test suite results + +###### class ResultTable + +A dataclass that holds the table summary of result + + + + +####### data() +```python +def data(): +``` + +A dataclass that holds the table summary of result + + +####### serialize() +```python +def serialize(self): +``` + +A dataclass that holds the table summary of result + + +####### title() +```python +def title(): +``` + +A dataclass that holds the table summary of result + +###### class TestResult(Result) + +Test result + + + + +####### add_figure() +```python +def add_figure(self, figure): +``` + +Test result + + +####### add_table() +```python +def add_table(self, table, title = None): +``` + +Test result + + +####### description() +```python +def description(): +``` + +Test result + + +####### doc() +```python +def doc(): +``` + +Test result + + +####### figures() +```python +def figures(): +``` + +Test result + + +####### inputs() +```python +def inputs(): +``` + +Test result + + +####### log() +```python +def log(self, section_id = None, position = None, unsafe = False): +``` + +Test result + + +####### log_async() +```python +def log_async(self, section_id = None, position = None, unsafe = False): +``` + +Test result + + +####### metadata() +```python +def metadata(): +``` + +Test result + + +####### metric() +```python +def metric(): +``` + +Test result + + +####### name() +```python +def name(): +``` + +Test result + + +####### params() +```python +def params(): +``` + +Test result + + +####### passed() +```python +def passed(): +``` + +Test result + + +####### raw_data() +```python +def raw_data(): +``` + +Test result + + +####### ref_id() +```python +def ref_id(): +``` + +Test result + + +####### remove_figure() +```python +def remove_figure(self, index = 0): +``` + +Test result + + +####### remove_table() +```python +def remove_table(self, index): +``` + +Test result + + +####### serialize() +```python +def serialize(self): +``` + +Test result + + +####### tables() +```python +def tables(): +``` + +Test result + + +####### test_name() +```python +def test_name(): +``` + +Test result + + +####### title() +```python +def title(): +``` + +Test result + + +####### to_widget() +```python +def to_widget(self): +``` + +Test result + + + + + +#### utils + + + + + + +####### check_for_sensitive_data() + +```python +def check_for_sensitive_data(data: , inputs: List) +``` + + +Check if a table contains raw data from input datasets + + + + +####### figures_to_widgets() + +```python +def figures_to_widgets(figures: List) -> list +``` + + +Plot figures to a ipywidgets GridBox + + + + +####### get_result_template() + +```python +def get_result_template() +``` + + +Get the jinja html template for rendering test results + + + + +####### tables_to_widgets() + +```python +def tables_to_widgets(tables: List) +``` + + +Convert summary (list of json tables) into a list of ipywidgets + + + + +####### update_metadata() + +```python +def update_metadata(content_id: str, text: str, _json: Union = None) +``` + + +Create or Update a Metadata Object + + + + + + + + + + + + + + + +#### Module Hierarchy##### api_client + +* [api_client](api_client.qmd) + +ValidMind API client + +Note that this takes advantage of the fact that python modules are singletons to store and share +the configuration and session across the entire project regardless of where the client is imported. + +##### client + +* [client](client.qmd) + +Client interface for all data and model validation functions + +##### client_config + +* [client_config](client_config.qmd) + +Central class to track configuration of the ValidMind Library +client against the ValidMind API + +##### datasets + +* [datasets](datasets.qmd) + +Example datasets that can be used with the ValidMind Library. + +###### classification + +* [classification](datasets/classification.qmd) + +Entrypoint for classification datasets. + +###### credit_risk + +* [credit_risk](datasets/credit_risk.qmd) + +Entrypoint for credit risk datasets. + +###### nlp + +* [nlp](datasets/nlp.qmd) + +Example datasets that can be used with the ValidMind Library. + +###### regression + +* [regression](datasets/regression.qmd) + +Entrypoint for regression datasets + +##### errors + +* [errors](errors.qmd) + +This module contains all the custom errors that are used in the ValidMind Library. + +The following base errors are defined for others: +- BaseError +- APIRequestError + +##### html_templates + +* [html_templates](html_templates.qmd) +###### content_blocks + +* [content_blocks](html_templates/content_blocks.qmd) +##### input_registry + +* [input_registry](input_registry.qmd) + +Central class to register inputs + +##### logging + +* [logging](logging.qmd) + +ValidMind logging module. + +##### models + +* [models](models.qmd) +###### foundation + +* [foundation](models/foundation.qmd) +###### function + +* [function](models/function.qmd) +###### huggingface + +* [huggingface](models/huggingface.qmd) +###### metadata + +* [metadata](models/metadata.qmd) +###### pipeline + +* [pipeline](models/pipeline.qmd) +###### pytorch + +* [pytorch](models/pytorch.qmd) +###### r_model + +* [r_model](models/r_model.qmd) +###### sklearn + +* [sklearn](models/sklearn.qmd) +##### template + +* [template](template.qmd) +##### test_suites + +* [test_suites](test_suites.qmd) + +Entrypoint for test suites. + +###### classifier + +* [classifier](test_suites/classifier.qmd) + +Test suites for sklearn-compatible classifier models + +Ideal setup is to have the API client to read a +custom test suite from the project's configuration + +###### cluster + +* [cluster](test_suites/cluster.qmd) + +Test suites for sklearn-compatible clustering models + +Ideal setup is to have the API client to read a +custom test suite from the project's configuration + +###### embeddings + +* [embeddings](test_suites/embeddings.qmd) + +Test suites for embeddings models + +Ideal setup is to have the API client to read a +custom test suite from the project's configuration + +###### llm + +* [llm](test_suites/llm.qmd) + +Test suites for LLMs + +###### nlp + +* [nlp](test_suites/nlp.qmd) + +Test suites for NLP models + +###### parameters_optimization + +* [parameters_optimization](test_suites/parameters_optimization.qmd) + +Test suites for sklearn-compatible hyper parameters tunning + +Ideal setup is to have the API client to read a +custom test suite from the project's configuration + +###### regression + +* [regression](test_suites/regression.qmd) +###### statsmodels_timeseries + +* [statsmodels_timeseries](test_suites/statsmodels_timeseries.qmd) + +Time Series Test Suites from statsmodels + +###### summarization + +* [summarization](test_suites/summarization.qmd) + +Test suites for llm summarization models + +###### tabular_datasets + +* [tabular_datasets](test_suites/tabular_datasets.qmd) + +Test suites for tabular datasets + +###### text_data + +* [text_data](test_suites/text_data.qmd) + +Test suites for text datasets + +###### time_series + +* [time_series](test_suites/time_series.qmd) + +Time Series Test Suites + +##### tests + +* [tests](tests.qmd) + +ValidMind Tests Module + +###### comparison + +* [comparison](tests/comparison.qmd) +###### data_validation + +* [data_validation](tests/data_validation.qmd) +###### decorator + +* [decorator](tests/decorator.qmd) + +Decorators for creating and registering tests with the ValidMind Library. + +###### load + +* [load](tests/load.qmd) + +Module for listing and loading tests. + +###### model_validation + +* [model_validation](tests/model_validation.qmd) +###### output + +* [output](tests/output.qmd) +###### prompt_validation + +* [prompt_validation](tests/prompt_validation.qmd) +###### run + +* [run](tests/run.qmd) +###### test_providers + +* [test_providers](tests/test_providers.qmd) +###### utils + +* [utils](tests/utils.qmd) + +Test Module Utils + +##### unit_metrics + +* [unit_metrics](unit_metrics.qmd) +##### utils + +* [utils](utils.qmd) +##### vm_models + +* [vm_models](vm_models.qmd) + +Models entrypoint + +###### dataset + +* [dataset](vm_models/dataset.qmd) +###### figure + +* [figure](vm_models/figure.qmd) + +Figure objects track the figure schema supported by the ValidMind API + +###### input + +* [input](vm_models/input.qmd) + +Base class for ValidMind Input types + +###### model + +* [model](vm_models/model.qmd) + +Model class wrapper module + +###### result + +* [result](vm_models/result.qmd) + From 35c4b372a65b6246c80be64447d87084f06c4263 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Thu, 23 Jan 2025 17:48:28 -0800 Subject: [PATCH 002/207] Save point --- docs/validmind.tree | 1988 +++++++++++++++++++++++++++++++++++++++++++ scripts/api_tree.py | 90 ++ 2 files changed, 2078 insertions(+) create mode 100644 docs/validmind.tree create mode 100644 scripts/api_tree.py diff --git a/docs/validmind.tree b/docs/validmind.tree new file mode 100644 index 000000000..5bc47a848 --- /dev/null +++ b/docs/validmind.tree @@ -0,0 +1,1988 @@ + +ValidMind Python API: +├── NumbaDeprecationWarning (alias) +├── NumbaPendingDeprecationWarning (alias) +├── RawData (alias) +├── api_client (module) +│ ├── Any (alias) +│ ├── BytesIO (alias) +│ ├── Dict (alias) +│ ├── Figure (alias) +│ ├── FormData (alias) +│ ├── List (alias) +│ ├── MissingAPICredentialsError (alias) +│ ├── MissingModelIdError (alias) +│ ├── NumpyEncoder (alias) +│ ├── Optional (alias) +│ ├── Tuple (alias) +│ ├── Union (alias) +│ ├── aget_metadata (function) +│ ├── aiohttp (None) +│ ├── alog_figure (function) +│ ├── alog_input (function) +│ ├── alog_metadata (function) +│ ├── alog_metric (function) +│ ├── alog_test_result (function) +│ ├── asyncio (None) +│ ├── atexit (None) +│ ├── client_config (alias) +│ ├── generate_test_result_description (function) +│ ├── get_ai_key (function) +│ ├── get_api_host (function) +│ ├── get_api_model (function) +│ ├── get_logger (alias) +│ ├── init (function) +│ ├── init_sentry (alias) +│ ├── json (None) +│ ├── log_input (function) +│ ├── log_metric (function) +│ ├── os (None) +│ ├── raise_api_error (alias) +│ ├── reload (function) +│ ├── requests (None) +│ ├── run_async (alias) +│ ├── send_single_error (alias) +│ ├── urlencode (alias) +│ └── urljoin (alias) +├── client (module) +│ ├── DataFrameDataset (alias) +│ ├── GetTestSuiteError (alias) +│ ├── InitializeTestSuiteError (alias) +│ ├── MetadataModel (alias) +│ ├── MissingDocumentationTemplate (alias) +│ ├── MissingRExtrasError (alias) +│ ├── ModelAttributes (alias) +│ ├── PolarsDataset (alias) +│ ├── RModel (alias) +│ ├── TestSuite (alias) +│ ├── TestSuiteRunner (alias) +│ ├── TorchDataset (alias) +│ ├── UnsupportedDatasetError (alias) +│ ├── UnsupportedModelError (alias) +│ ├── VMDataset (alias) +│ ├── VMModel (alias) +│ ├── client_config (alias) +│ ├── get_dataset_info (alias) +│ ├── get_logger (alias) +│ ├── get_model_class (alias) +│ ├── get_model_info (alias) +│ ├── get_template_test_suite (alias) +│ ├── get_test_suite (function) +│ ├── get_test_suite_by_id (alias) +│ ├── init_dataset (function) +│ ├── init_model (function) +│ ├── init_r_model (function) +│ ├── input_registry (alias) +│ ├── is_model_metadata (alias) +│ ├── log_input (alias) +│ ├── pd (None) +│ ├── pl (None) +│ ├── preview_template (function) +│ ├── run_documentation_tests (function) +│ └── run_test_suite (function) +├── client_config (module) +│ ├── ClientConfig (class) +│ │ └── can_generate_llm_test_descriptions (function) +│ └── dataclass (alias) +├── datasets (module) +│ ├── classification (module) +│ │ ├── customer_churn (module) +│ │ │ ├── get_demo_test_config (function) +│ │ │ ├── load_data (function) +│ │ │ ├── os (None) +│ │ │ ├── pd (None) +│ │ │ ├── preprocess (function) +│ │ │ ├── simple_preprocess_booleans (alias) +│ │ │ ├── simple_preprocess_categoricals (alias) +│ │ │ ├── simple_preprocess_numericals (alias) +│ │ │ ├── train_test_split (alias) +│ │ │ └── vm (None) +│ │ ├── pd (None) +│ │ ├── simple_preprocess_booleans (function) +│ │ ├── simple_preprocess_categoricals (function) +│ │ ├── simple_preprocess_numericals (function) +│ │ └── taiwan_credit (module) +│ │ ├── load_data (function) +│ │ ├── os (None) +│ │ ├── pd (None) +│ │ ├── preprocess (function) +│ │ ├── simple_preprocess_booleans (alias) +│ │ ├── simple_preprocess_categoricals (alias) +│ │ ├── simple_preprocess_numericals (alias) +│ │ └── train_test_split (alias) +│ ├── credit_risk (module) +│ │ ├── lending_club (module) +│ │ │ ├── RandomForestClassifier (alias) +│ │ │ ├── compute_scores (function) +│ │ │ ├── feature_engineering (function) +│ │ │ ├── get_demo_test_config (function) +│ │ │ ├── init_vm_objects (function) +│ │ │ ├── load_data (function) +│ │ │ ├── load_scorecard (function) +│ │ │ ├── load_test_config (function) +│ │ │ ├── logging (None) +│ │ │ ├── np (None) +│ │ │ ├── os (None) +│ │ │ ├── pd (None) +│ │ │ ├── preprocess (function) +│ │ │ ├── sc (None) +│ │ │ ├── sm (alias) +│ │ │ ├── split (function) +│ │ │ ├── train_test_split (alias) +│ │ │ ├── vm (None) +│ │ │ ├── warnings (None) +│ │ │ ├── woe_encoding (function) +│ │ │ └── xgb (None) +│ │ └── lending_club_bias (module) +│ │ ├── LabelEncoder (alias) +│ │ ├── compute_scores (function) +│ │ ├── load_data (function) +│ │ ├── np (None) +│ │ ├── os (None) +│ │ ├── pd (None) +│ │ ├── preprocess (function) +│ │ ├── split (function) +│ │ └── train_test_split (alias) +│ ├── nlp (module) +│ │ ├── cnn_dailymail (module) +│ │ │ ├── HTML (alias) +│ │ │ ├── display (alias) +│ │ │ ├── display_nice (function) +│ │ │ ├── load_data (function) +│ │ │ ├── load_dataset (alias) +│ │ │ ├── os (None) +│ │ │ ├── pd (None) +│ │ │ ├── tabulate (alias) +│ │ │ └── textwrap (None) +│ │ └── twitter_covid_19 (module) +│ │ ├── load_data (function) +│ │ ├── os (None) +│ │ └── pd (None) +│ └── regression (module) +│ ├── california_housing (module) +│ │ ├── fetch_california_housing (alias) +│ │ ├── load_data (function) +│ │ ├── os (None) +│ │ ├── preprocess (function) +│ │ └── train_test_split (alias) +│ ├── fred (module) +│ │ ├── load_all_data (function) +│ │ ├── load_data (function) +│ │ ├── load_model (function) +│ │ ├── load_processed_data (function) +│ │ ├── load_test_dataset (function) +│ │ ├── load_train_dataset (function) +│ │ ├── os (None) +│ │ ├── pd (None) +│ │ ├── pickle (None) +│ │ ├── preprocess (function) +│ │ └── transform (function) +│ ├── fred_timeseries (module) +│ │ ├── align_date_range (function) +│ │ ├── convert_to_levels (function) +│ │ ├── get_common_date_range (function) +│ │ ├── get_demo_test_config (function) +│ │ ├── load_data (function) +│ │ ├── os (None) +│ │ └── pd (None) +│ ├── identify_frequencies (function) +│ ├── lending_club (module) +│ │ ├── load_data (function) +│ │ ├── os (None) +│ │ ├── pd (None) +│ │ ├── preprocess (function) +│ │ └── transform (function) +│ ├── pd (None) +│ └── resample_to_common_frequency (function) +├── errors (module) +│ ├── APIRequestError (class) +│ ├── BaseError (class) +│ │ └── description (function) +│ ├── GetTestSuiteError (class) +│ ├── InitializeTestSuiteError (class) +│ ├── InvalidAPICredentialsError (class) +│ │ └── description (function) +│ ├── InvalidContentIdPrefixError (class) +│ ├── InvalidInputError (class) +│ ├── InvalidMetricResultsError (class) +│ ├── InvalidProjectError (class) +│ │ └── description (function) +│ ├── InvalidRequestBodyError (class) +│ ├── InvalidTestParametersError (class) +│ ├── InvalidTestResultsError (class) +│ ├── InvalidTextObjectError (class) +│ ├── InvalidValueFormatterError (class) +│ ├── InvalidXGBoostTrainedModelError (class) +│ ├── LoadTestError (class) +│ ├── MismatchingClassLabelsError (class) +│ ├── MissingAPICredentialsError (class) +│ │ └── description (function) +│ ├── MissingCacheResultsArgumentsError (class) +│ ├── MissingClassLabelError (class) +│ ├── MissingDependencyError (class) +│ ├── MissingDocumentationTemplate (class) +│ ├── MissingModelIdError (class) +│ │ └── description (function) +│ ├── MissingOrInvalidModelPredictFnError (class) +│ ├── MissingRExtrasError (class) +│ │ └── description (function) +│ ├── MissingRequiredTestInputError (class) +│ ├── MissingTextContentIdError (class) +│ ├── MissingTextContentsError (class) +│ ├── Optional (alias) +│ ├── SkipTestError (class) +│ ├── TestInputInvalidDatasetError (class) +│ ├── UnsupportedColumnTypeError (class) +│ ├── UnsupportedDatasetError (class) +│ ├── UnsupportedFigureError (class) +│ ├── UnsupportedModelError (class) +│ ├── UnsupportedModelForSHAPError (class) +│ ├── UnsupportedRModelError (class) +│ ├── json (None) +│ ├── raise_api_error (function) +│ └── should_raise_on_fail_fast (function) +├── get_test_suite (alias) +├── html_templates (module) +│ └── content_blocks (module) +├── init (alias) +├── init_dataset (alias) +├── init_model (alias) +├── init_r_model (alias) +├── input_registry (module) +│ ├── InputRegistry (class) +│ │ ├── add (function) +│ │ ├── get (function) +│ │ └── list_input_objects (function) +│ ├── InvalidInputError (alias) +│ └── VMInput (alias) +├── log_metric (alias) +├── logging (module) +│ ├── event_from_exception (alias) +│ ├── exc_info_from_error (alias) +│ ├── get_logger (function) +│ ├── init_sentry (function) +│ ├── log_performance (function) +│ ├── log_performance_async (function) +│ ├── logging (None) +│ ├── os (None) +│ ├── send_single_error (function) +│ ├── sentry_sdk (None) +│ └── time (None) +├── models (module) +│ ├── CatBoostModel (alias) +│ ├── FoundationModel (alias) +│ ├── FunctionModel (alias) +│ ├── HFModel (alias) +│ ├── MetadataModel (alias) +│ ├── PipelineModel (alias) +│ ├── Prompt (alias) +│ ├── PyTorchModel (alias) +│ ├── SKlearnModel (alias) +│ ├── StatsModelsModel (alias) +│ ├── XGBoostModel (alias) +│ ├── foundation (module) +│ │ ├── FoundationModel (class) +│ │ │ └── predict (function) +│ │ ├── FunctionModel (alias) +│ │ ├── Prompt (class) +│ │ ├── dataclass (alias) +│ │ ├── get_logger (alias) +│ │ └── pd (None) +│ ├── function (module) +│ │ ├── FunctionModel (class) +│ │ │ └── predict (function) +│ │ ├── Input (class) +│ │ │ └── get_new (function) +│ │ └── VMModel (alias) +│ ├── huggingface (module) +│ │ ├── HFModel (class) +│ │ │ ├── predict (function) +│ │ │ └── predict_proba (function) +│ │ ├── MissingOrInvalidModelPredictFnError (alias) +│ │ ├── VMModel (alias) +│ │ ├── dataclass (alias) +│ │ ├── get_logger (alias) +│ │ └── has_method_with_arguments (alias) +│ ├── metadata (module) +│ │ ├── MetadataModel (class) +│ │ │ ├── predict (function) +│ │ │ └── predict_proba (function) +│ │ ├── MissingOrInvalidModelPredictFnError (alias) +│ │ └── VMModel (alias) +│ ├── pipeline (module) +│ │ ├── ModelAttributes (alias) +│ │ ├── ModelPipeline (alias) +│ │ ├── PipelineModel (class) +│ │ │ ├── predict (function) +│ │ │ └── serialize (function) +│ │ ├── VMModel (alias) +│ │ └── get_logger (alias) +│ ├── pytorch (module) +│ │ ├── MissingOrInvalidModelPredictFnError (alias) +│ │ ├── PyTorchModel (class) +│ │ │ ├── predict (function) +│ │ │ └── predict_proba (function) +│ │ ├── VMModel (alias) +│ │ ├── get_logger (alias) +│ │ └── has_method_with_arguments (alias) +│ ├── r_model (module) +│ │ ├── MissingRExtrasError (alias) +│ │ ├── RModel (class) +│ │ │ ├── predict (function) +│ │ │ ├── predict_proba (function) +│ │ │ ├── r_predict (function) +│ │ │ ├── r_xgb_predict (function) +│ │ │ └── regression_coefficients (function) +│ │ ├── VMModel (alias) +│ │ ├── get_full_class_name (function) +│ │ ├── get_logger (alias) +│ │ ├── np (None) +│ │ └── pd (None) +│ └── sklearn (module) +│ ├── CatBoostModel (class) +│ ├── MissingOrInvalidModelPredictFnError (alias) +│ ├── SKlearnModel (class) +│ │ ├── predict (function) +│ │ └── predict_proba (function) +│ ├── StatsModelsModel (class) +│ │ └── regression_coefficients (function) +│ ├── VMModel (alias) +│ ├── XGBoostModel (class) +│ ├── get_logger (alias) +│ ├── has_method_with_arguments (alias) +│ └── pd (None) +├── preview_template (alias) +├── print_env (alias) +├── reload (alias) +├── run_documentation_tests (alias) +├── run_test_suite (alias) +├── tags (alias) +├── tasks (alias) +├── template (module) +│ ├── Accordion (alias) +│ ├── HTML (alias) +│ ├── LoadTestError (alias) +│ ├── TestSuite (alias) +│ ├── VBox (alias) +│ ├── describe_test (alias) +│ ├── display (alias) +│ ├── failed_content_block_html (alias) +│ ├── get_logger (alias) +│ ├── get_template_test_suite (function) +│ ├── is_notebook (alias) +│ ├── non_test_content_block_html (alias) +│ └── preview_template (function) +├── test (alias) +├── test_suites (module) +│ ├── ClassifierDiagnosis (alias) +│ ├── ClassifierFullSuite (alias) +│ ├── ClassifierMetrics (alias) +│ ├── ClassifierModelValidation (alias) +│ ├── ClassifierPerformance (alias) +│ ├── ClusterFullSuite (alias) +│ ├── ClusterMetrics (alias) +│ ├── ClusterPerformance (alias) +│ ├── EmbeddingsFullSuite (alias) +│ ├── EmbeddingsMetrics (alias) +│ ├── EmbeddingsPerformance (alias) +│ ├── KmeansParametersOptimization (alias) +│ ├── LLMClassifierFullSuite (alias) +│ ├── NLPClassifierFullSuite (alias) +│ ├── PromptValidation (alias) +│ ├── RegressionFullSuite (alias) +│ ├── RegressionMetrics (alias) +│ ├── RegressionModelDescription (alias) +│ ├── RegressionModelsEvaluation (alias) +│ ├── RegressionPerformance (alias) +│ ├── SummarizationMetrics (alias) +│ ├── TabularDataQuality (alias) +│ ├── TabularDataset (alias) +│ ├── TabularDatasetDescription (alias) +│ ├── TestSuite (alias) +│ ├── TextDataQuality (alias) +│ ├── TimeSeriesDataQuality (alias) +│ ├── TimeSeriesDataset (alias) +│ ├── TimeSeriesModelValidation (alias) +│ ├── TimeSeriesMultivariate (alias) +│ ├── TimeSeriesUnivariate (alias) +│ ├── classifier (module) +│ │ ├── ClassifierDiagnosis (class) +│ │ ├── ClassifierFullSuite (class) +│ │ ├── ClassifierMetrics (class) +│ │ ├── ClassifierModelValidation (class) +│ │ ├── ClassifierPerformance (class) +│ │ ├── TabularDataQuality (alias) +│ │ ├── TabularDatasetDescription (alias) +│ │ └── TestSuite (alias) +│ ├── cluster (module) +│ │ ├── ClusterFullSuite (class) +│ │ ├── ClusterMetrics (class) +│ │ ├── ClusterPerformance (class) +│ │ ├── KmeansParametersOptimization (alias) +│ │ └── TestSuite (alias) +│ ├── describe_suite (function) +│ ├── embeddings (module) +│ │ ├── EmbeddingsFullSuite (class) +│ │ ├── EmbeddingsMetrics (class) +│ │ ├── EmbeddingsPerformance (class) +│ │ └── TestSuite (alias) +│ ├── format_dataframe (alias) +│ ├── get_by_id (function) +│ ├── get_logger (alias) +│ ├── getdoc (alias) +│ ├── list_suites (function) +│ ├── llm (module) +│ │ ├── ClassifierDiagnosis (alias) +│ │ ├── ClassifierMetrics (alias) +│ │ ├── ClassifierPerformance (alias) +│ │ ├── LLMClassifierFullSuite (class) +│ │ ├── PromptValidation (class) +│ │ ├── TestSuite (alias) +│ │ └── TextDataQuality (alias) +│ ├── load_test (alias) +│ ├── nlp (module) +│ │ ├── ClassifierDiagnosis (alias) +│ │ ├── ClassifierMetrics (alias) +│ │ ├── ClassifierPerformance (alias) +│ │ ├── NLPClassifierFullSuite (class) +│ │ ├── TestSuite (alias) +│ │ └── TextDataQuality (alias) +│ ├── parameters_optimization (module) +│ │ ├── KmeansParametersOptimization (class) +│ │ └── TestSuite (alias) +│ ├── pd (None) +│ ├── register_test_suite (function) +│ ├── regression (module) +│ │ ├── RegressionFullSuite (class) +│ │ ├── RegressionMetrics (class) +│ │ ├── RegressionPerformance (class) +│ │ ├── TabularDataQuality (alias) +│ │ ├── TabularDatasetDescription (alias) +│ │ └── TestSuite (alias) +│ ├── statsmodels_timeseries (module) +│ │ ├── RegressionModelDescription (class) +│ │ ├── RegressionModelsEvaluation (class) +│ │ └── TestSuite (alias) +│ ├── summarization (module) +│ │ ├── SummarizationMetrics (class) +│ │ └── TestSuite (alias) +│ ├── tabular_datasets (module) +│ │ ├── TabularDataQuality (class) +│ │ ├── TabularDataset (class) +│ │ ├── TabularDatasetDescription (class) +│ │ └── TestSuite (alias) +│ ├── test_id_to_name (alias) +│ ├── text_data (module) +│ │ ├── TestSuite (alias) +│ │ └── TextDataQuality (class) +│ └── time_series (module) +│ ├── RegressionModelDescription (alias) +│ ├── RegressionModelsEvaluation (alias) +│ ├── TestSuite (alias) +│ ├── TimeSeriesDataQuality (class) +│ ├── TimeSeriesDataset (class) +│ ├── TimeSeriesModelValidation (class) +│ ├── TimeSeriesMultivariate (class) +│ └── TimeSeriesUnivariate (class) +├── tests (module) +│ ├── LoadTestError (alias) +│ ├── LocalTestProvider (alias) +│ ├── TestProvider (alias) +│ ├── comparison (module) +│ │ ├── Any (alias) +│ │ ├── Dict (alias) +│ │ ├── List (alias) +│ │ ├── ResultTable (alias) +│ │ ├── TestResult (alias) +│ │ ├── Tuple (alias) +│ │ ├── Union (alias) +│ │ ├── VMInput (alias) +│ │ ├── combine_results (function) +│ │ ├── get_comparison_test_configs (function) +│ │ ├── get_logger (alias) +│ │ ├── is_matplotlib_figure (alias) +│ │ ├── is_plotly_figure (alias) +│ │ ├── is_png_image (alias) +│ │ ├── pd (None) +│ │ ├── product (alias) +│ │ └── test_id_to_name (alias) +│ ├── data_validation (module) +│ │ ├── ACFandPACFPlot (module) +│ │ │ ├── ACFandPACFPlot (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── acf (alias) +│ │ │ ├── go (alias) +│ │ │ ├── pacf (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── ADF (module) +│ │ │ ├── ADF (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── adfuller (alias) +│ │ │ ├── get_logger (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── AutoAR (module) +│ │ │ ├── AutoAR (function) +│ │ │ ├── AutoReg (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── adfuller (alias) +│ │ │ ├── get_logger (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── AutoMA (module) +│ │ │ ├── ARIMA (alias) +│ │ │ ├── AutoMA (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── adfuller (alias) +│ │ │ ├── get_logger (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── AutoStationarity (module) +│ │ │ ├── AutoStationarity (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── adfuller (alias) +│ │ │ ├── np (None) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── BivariateScatterPlots (module) +│ │ │ ├── BivariateScatterPlots (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── itertools (None) +│ │ │ ├── px (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── BoxPierce (module) +│ │ │ ├── BoxPierce (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── acorr_ljungbox (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── ChiSquaredFeaturesTable (module) +│ │ │ ├── ChiSquaredFeaturesTable (function) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── chi2_contingency (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── ClassImbalance (module) +│ │ │ ├── Any (alias) +│ │ │ ├── ClassImbalance (function) +│ │ │ ├── Dict (alias) +│ │ │ ├── RawData (alias) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── Tuple (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── go (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── DatasetDescription (module) +│ │ │ ├── Counter (alias) +│ │ │ ├── DatasetDescription (function) +│ │ │ ├── ProfilingTypeSet (alias) +│ │ │ ├── RawData (alias) +│ │ │ ├── Settings (alias) +│ │ │ ├── UnsupportedColumnTypeError (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── describe_column (function) +│ │ │ ├── get_column_histograms (function) +│ │ │ ├── get_logger (alias) +│ │ │ ├── get_numerical_histograms (function) +│ │ │ ├── infer_datatypes (function) +│ │ │ ├── np (None) +│ │ │ ├── re (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── DatasetSplit (module) +│ │ │ ├── DatasetSplit (function) +│ │ │ ├── List (alias) +│ │ │ ├── RawData (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── DescriptiveStatistics (module) +│ │ │ ├── DescriptiveStatistics (function) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── format_records (alias) +│ │ │ ├── get_summary_statistics_categorical (function) +│ │ │ ├── get_summary_statistics_numerical (function) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── DickeyFullerGLS (module) +│ │ │ ├── DFGLS (alias) +│ │ │ ├── DickeyFullerGLS (function) +│ │ │ ├── LinAlgError (alias) +│ │ │ ├── RawData (alias) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── get_logger (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── Duplicates (module) +│ │ │ ├── Duplicates (function) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── EngleGrangerCoint (module) +│ │ │ ├── EngleGrangerCoint (function) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── coint (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── FeatureTargetCorrelationPlot (module) +│ │ │ ├── FeatureTargetCorrelationPlot (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── go (alias) +│ │ │ ├── np (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── HighCardinality (module) +│ │ │ ├── HighCardinality (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── HighPearsonCorrelation (module) +│ │ │ ├── HighPearsonCorrelation (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── IQROutliersBarPlot (module) +│ │ │ ├── IQROutliersBarPlot (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── compute_outliers (function) +│ │ │ ├── go (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── IQROutliersTable (module) +│ │ │ ├── IQROutliersTable (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── compute_outliers (function) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── IsolationForestOutliers (module) +│ │ │ ├── IsolationForest (alias) +│ │ │ ├── IsolationForestOutliers (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── itertools (None) +│ │ │ ├── plt (alias) +│ │ │ ├── sns (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── JarqueBera (module) +│ │ │ ├── JarqueBera (function) +│ │ │ ├── jarque_bera (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── KPSS (module) +│ │ │ ├── KPSS (function) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── get_logger (alias) +│ │ │ ├── kpss (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── LJungBox (module) +│ │ │ ├── LJungBox (function) +│ │ │ ├── acorr_ljungbox (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── LaggedCorrelationHeatmap (module) +│ │ │ ├── LaggedCorrelationHeatmap (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── ff (alias) +│ │ │ ├── np (None) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── MissingValues (module) +│ │ │ ├── MissingValues (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── MissingValuesBarPlot (module) +│ │ │ ├── MissingValuesBarPlot (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── go (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── MutualInformation (module) +│ │ │ ├── MutualInformation (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── go (alias) +│ │ │ ├── mutual_info_classif (alias) +│ │ │ ├── mutual_info_regression (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── PearsonCorrelationMatrix (module) +│ │ │ ├── PearsonCorrelationMatrix (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── go (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── PhillipsPerronArch (module) +│ │ │ ├── LinAlgError (alias) +│ │ │ ├── PhillipsPerron (alias) +│ │ │ ├── PhillipsPerronArch (function) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── get_logger (alias) +│ │ │ ├── np (None) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── ProtectedClassesCombination (module) +│ │ │ ├── MetricFrame (alias) +│ │ │ ├── MissingDependencyError (alias) +│ │ │ ├── ProtectedClassesCombination (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── count (alias) +│ │ │ ├── demographic_parity_ratio (alias) +│ │ │ ├── equalized_odds_ratio (alias) +│ │ │ ├── false_positive_rate (alias) +│ │ │ ├── get_logger (alias) +│ │ │ ├── go (alias) +│ │ │ ├── pd (None) +│ │ │ ├── selection_rate (alias) +│ │ │ ├── sp (alias) +│ │ │ ├── sys (None) +│ │ │ ├── tags (alias) +│ │ │ ├── tasks (alias) +│ │ │ └── true_positive_rate (alias) +│ │ ├── ProtectedClassesDescription (module) +│ │ │ ├── ProtectedClassesDescription (function) +│ │ │ ├── get_logger (alias) +│ │ │ ├── go (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── ProtectedClassesDisparity (module) +│ │ │ ├── Bias (alias) +│ │ │ ├── Group (alias) +│ │ │ ├── MissingDependencyError (alias) +│ │ │ ├── Plot (alias) +│ │ │ ├── ProtectedClassesDisparity (function) +│ │ │ ├── ap (alias) +│ │ │ ├── get_logger (alias) +│ │ │ ├── io (None) +│ │ │ ├── pd (None) +│ │ │ ├── sys (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── ProtectedClassesThresholdOptimizer (module) +│ │ │ ├── MetricFrame (alias) +│ │ │ ├── MissingDependencyError (alias) +│ │ │ ├── ProtectedClassesThresholdOptimizer (function) +│ │ │ ├── ThresholdOptimizer (alias) +│ │ │ ├── calculate_fairness_metrics (function) +│ │ │ ├── calculate_group_metrics (function) +│ │ │ ├── count (alias) +│ │ │ ├── demographic_parity_ratio (alias) +│ │ │ ├── equalized_odds_ratio (alias) +│ │ │ ├── false_negative_rate (alias) +│ │ │ ├── false_positive_rate (alias) +│ │ │ ├── get_logger (alias) +│ │ │ ├── get_thresholds_by_group (function) +│ │ │ ├── initialize_and_fit_optimizer (function) +│ │ │ ├── json (None) +│ │ │ ├── make_predictions (function) +│ │ │ ├── pd (None) +│ │ │ ├── plot_threshold_optimizer (alias) +│ │ │ ├── plot_thresholds (function) +│ │ │ ├── plt (alias) +│ │ │ ├── sys (None) +│ │ │ ├── tags (alias) +│ │ │ ├── tasks (alias) +│ │ │ └── true_positive_rate (alias) +│ │ ├── RollingStatsPlot (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── RollingStatsPlot (function) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── pd (None) +│ │ │ ├── plot_rolling_statistics (function) +│ │ │ ├── plt (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── RunsTest (module) +│ │ │ ├── RunsTest (function) +│ │ │ ├── pd (None) +│ │ │ ├── runstest_1samp (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── ScatterPlot (module) +│ │ │ ├── ScatterPlot (function) +│ │ │ ├── plt (alias) +│ │ │ ├── sns (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── ScoreBandDefaultRates (module) +│ │ │ ├── ScoreBandDefaultRates (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── VMModel (alias) +│ │ │ ├── np (None) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── SeasonalDecompose (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── SeasonalDecompose (function) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── get_logger (alias) +│ │ │ ├── go (alias) +│ │ │ ├── make_subplots (alias) +│ │ │ ├── np (None) +│ │ │ ├── pd (None) +│ │ │ ├── seasonal_decompose (alias) +│ │ │ ├── stats (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── ShapiroWilk (module) +│ │ │ ├── ShapiroWilk (function) +│ │ │ ├── pd (None) +│ │ │ ├── stats (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── Skewness (module) +│ │ │ ├── ProfilingTypeSet (alias) +│ │ │ ├── Settings (alias) +│ │ │ ├── Skewness (function) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── SpreadPlot (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── SpreadPlot (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── pd (None) +│ │ │ ├── plt (alias) +│ │ │ ├── sns (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TabularCategoricalBarPlots (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── TabularCategoricalBarPlots (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── go (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TabularDateTimeHistograms (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── TabularDateTimeHistograms (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── go (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TabularDescriptionTables (module) +│ │ │ ├── TabularDescriptionTables (function) +│ │ │ ├── get_categorical_columns (function) +│ │ │ ├── get_datetime_columns (function) +│ │ │ ├── get_numerical_columns (function) +│ │ │ ├── get_summary_statistics_categorical (function) +│ │ │ ├── get_summary_statistics_datetime (function) +│ │ │ ├── get_summary_statistics_numerical (function) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TabularNumericalHistograms (module) +│ │ │ ├── TabularNumericalHistograms (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── go (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TargetRateBarPlots (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── TargetRateBarPlots (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── go (alias) +│ │ │ ├── make_subplots (alias) +│ │ │ ├── np (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TimeSeriesDescription (module) +│ │ │ ├── TimeSeriesDescription (function) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TimeSeriesDescriptiveStatistics (module) +│ │ │ ├── TimeSeriesDescriptiveStatistics (function) +│ │ │ ├── kurtosis (alias) +│ │ │ ├── pd (None) +│ │ │ ├── skew (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TimeSeriesFrequency (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── TimeSeriesFrequency (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── go (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TimeSeriesHistogram (module) +│ │ │ ├── TimeSeriesHistogram (function) +│ │ │ ├── get_logger (alias) +│ │ │ ├── pd (None) +│ │ │ ├── px (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TimeSeriesLinePlot (module) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── TimeSeriesLinePlot (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── go (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TimeSeriesMissingValues (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── TimeSeriesMissingValues (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── ff (alias) +│ │ │ ├── pd (None) +│ │ │ ├── px (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TimeSeriesOutliers (module) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── TimeSeriesOutliers (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── go (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TooManyZeroValues (module) +│ │ │ ├── TooManyZeroValues (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── UniqueRows (module) +│ │ │ ├── UniqueRows (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── WOEBinPlots (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── WOEBinPlots (function) +│ │ │ ├── get_logger (alias) +│ │ │ ├── go (alias) +│ │ │ ├── make_subplots (alias) +│ │ │ ├── np (None) +│ │ │ ├── pd (None) +│ │ │ ├── px (alias) +│ │ │ ├── sc (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── WOEBinTable (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── WOEBinTable (function) +│ │ │ ├── pd (None) +│ │ │ ├── sc (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── ZivotAndrewsArch (module) +│ │ │ ├── LinAlgError (alias) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── ZivotAndrews (alias) +│ │ │ ├── ZivotAndrewsArch (function) +│ │ │ ├── get_logger (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ └── nlp (module) +│ │ ├── CommonWords (module) +│ │ │ ├── CommonWords (function) +│ │ │ ├── Counter (alias) +│ │ │ ├── RawData (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── go (alias) +│ │ │ ├── nltk (None) +│ │ │ ├── stopwords (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── Hashtags (module) +│ │ │ ├── Hashtags (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── go (alias) +│ │ │ ├── re (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── LanguageDetection (module) +│ │ │ ├── LangDetectException (alias) +│ │ │ ├── LanguageDetection (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── detect (alias) +│ │ │ ├── px (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── Mentions (module) +│ │ │ ├── Mentions (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── pd (None) +│ │ │ ├── px (alias) +│ │ │ ├── re (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── PolarityAndSubjectivity (module) +│ │ │ ├── PolarityAndSubjectivity (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── TextBlob (alias) +│ │ │ ├── pd (None) +│ │ │ ├── px (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── Punctuations (module) +│ │ │ ├── Punctuations (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── defaultdict (alias) +│ │ │ ├── go (alias) +│ │ │ ├── string (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── Sentiment (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── Sentiment (function) +│ │ │ ├── SentimentIntensityAnalyzer (alias) +│ │ │ ├── nltk (None) +│ │ │ ├── plt (alias) +│ │ │ ├── sns (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── StopWords (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── StopWords (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── defaultdict (alias) +│ │ │ ├── go (alias) +│ │ │ ├── nltk (None) +│ │ │ ├── pd (None) +│ │ │ ├── stopwords (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TextDescription (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── TextDescription (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── create_metrics_df (function) +│ │ │ ├── nltk (None) +│ │ │ ├── pd (None) +│ │ │ ├── px (alias) +│ │ │ ├── stopwords (alias) +│ │ │ ├── string (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ └── Toxicity (module) +│ │ ├── RawData (alias) +│ │ ├── Toxicity (function) +│ │ ├── evaluate (None) +│ │ ├── plt (alias) +│ │ ├── sns (None) +│ │ ├── tags (alias) +│ │ └── tasks (alias) +│ ├── decorator (module) +│ │ ├── get_logger (alias) +│ │ ├── inspect (None) +│ │ ├── load_test (alias) +│ │ ├── os (None) +│ │ ├── tags (function) +│ │ ├── tasks (function) +│ │ ├── test (function) +│ │ ├── test_store (alias) +│ │ └── wraps (alias) +│ ├── describe_test (alias) +│ ├── get_logger (alias) +│ ├── list_tags (alias) +│ ├── list_tasks (alias) +│ ├── list_tasks_and_tags (alias) +│ ├── list_tests (alias) +│ ├── load (module) +│ │ ├── Accordion (alias) +│ │ ├── HTML (alias) +│ │ ├── List (alias) +│ │ ├── LoadTestError (alias) +│ │ ├── MissingDependencyError (alias) +│ │ ├── TestID (alias) +│ │ ├── VMDataset (alias) +│ │ ├── VMModel (alias) +│ │ ├── describe_test (function) +│ │ ├── display (alias) +│ │ ├── format_dataframe (alias) +│ │ ├── fuzzy_match (alias) +│ │ ├── get_logger (alias) +│ │ ├── inspect (None) +│ │ ├── json (None) +│ │ ├── list_tags (function) +│ │ ├── list_tasks (function) +│ │ ├── list_tasks_and_tags (function) +│ │ ├── list_tests (function) +│ │ ├── load_test (function) +│ │ ├── md_to_html (alias) +│ │ ├── pd (None) +│ │ ├── pformat (alias) +│ │ ├── test_content_block_html (alias) +│ │ ├── test_id_to_name (alias) +│ │ ├── test_provider_store (alias) +│ │ ├── test_store (alias) +│ │ └── uuid4 (alias) +│ ├── load_test (alias) +│ ├── model_validation (module) +│ │ ├── BertScore (module) +│ │ │ ├── BertScore (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── evaluate (None) +│ │ │ ├── go (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ ├── tasks (alias) +│ │ │ └── validate_prediction (alias) +│ │ ├── BleuScore (module) +│ │ │ ├── BleuScore (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── evaluate (None) +│ │ │ ├── go (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ ├── tasks (alias) +│ │ │ └── validate_prediction (alias) +│ │ ├── ClusterSizeDistribution (module) +│ │ │ ├── ClusterSizeDistribution (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── VMModel (alias) +│ │ │ ├── go (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── ContextualRecall (module) +│ │ │ ├── ContextualRecall (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── go (alias) +│ │ │ ├── nltk (None) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ ├── tasks (alias) +│ │ │ └── validate_prediction (alias) +│ │ ├── FeaturesAUC (module) +│ │ │ ├── FeaturesAUC (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── get_logger (alias) +│ │ │ ├── go (alias) +│ │ │ ├── np (None) +│ │ │ ├── pd (None) +│ │ │ ├── roc_auc_score (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── MeteorScore (module) +│ │ │ ├── MeteorScore (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── evaluate (None) +│ │ │ ├── go (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ ├── tasks (alias) +│ │ │ └── validate_prediction (alias) +│ │ ├── ModelMetadata (module) +│ │ │ ├── ModelMetadata (function) +│ │ │ ├── get_model_info (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── ModelPredictionResiduals (module) +│ │ │ ├── ModelPredictionResiduals (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── go (alias) +│ │ │ ├── kstest (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── RegardScore (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── RegardScore (function) +│ │ │ ├── evaluate (None) +│ │ │ ├── go (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ ├── tasks (alias) +│ │ │ └── validate_prediction (alias) +│ │ ├── RegressionResidualsPlot (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── RegressionResidualsPlot (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── VMModel (alias) +│ │ │ ├── ff (alias) +│ │ │ ├── go (alias) +│ │ │ ├── np (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── RougeScore (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── Rouge (alias) +│ │ │ ├── RougeScore (function) +│ │ │ ├── go (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TimeSeriesPredictionWithCI (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── TimeSeriesPredictionWithCI (function) +│ │ │ ├── go (alias) +│ │ │ ├── norm (alias) +│ │ │ ├── np (None) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TimeSeriesPredictionsPlot (module) +│ │ │ ├── TimeSeriesPredictionsPlot (function) +│ │ │ ├── go (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TimeSeriesR2SquareBySegments (module) +│ │ │ ├── TimeSeriesR2SquareBySegments (function) +│ │ │ ├── metrics (alias) +│ │ │ ├── pd (None) +│ │ │ ├── px (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── TokenDisparity (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── TokenDisparity (function) +│ │ │ ├── go (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── ToxicityScore (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── ToxicityScore (function) +│ │ │ ├── evaluate (None) +│ │ │ ├── go (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── sklearn (module) +│ │ │ ├── AdjustedMutualInformation (module) +│ │ │ │ ├── AdjustedMutualInformation (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── adjusted_mutual_info_score (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── AdjustedRandIndex (module) +│ │ │ │ ├── AdjustedRandIndex (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── adjusted_rand_score (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── CalibrationCurve (module) +│ │ │ │ ├── CalibrationCurve (function) +│ │ │ │ ├── RawData (alias) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── calibration_curve (alias) +│ │ │ │ ├── go (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── ClassifierPerformance (module) +│ │ │ │ ├── ClassifierPerformance (function) +│ │ │ │ ├── LabelBinarizer (alias) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── classification_report (alias) +│ │ │ │ ├── multiclass_roc_auc_score (function) +│ │ │ │ ├── np (None) +│ │ │ │ ├── roc_auc_score (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── ClassifierThresholdOptimization (module) +│ │ │ │ ├── ClassifierThresholdOptimization (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── confusion_matrix (alias) +│ │ │ │ ├── find_optimal_threshold (function) +│ │ │ │ ├── go (alias) +│ │ │ │ ├── make_subplots (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── pd (None) +│ │ │ │ ├── precision_recall_curve (alias) +│ │ │ │ ├── roc_curve (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── ClusterCosineSimilarity (module) +│ │ │ │ ├── ClusterCosineSimilarity (function) +│ │ │ │ ├── RawData (alias) +│ │ │ │ ├── SkipTestError (alias) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── cosine_similarity (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── ClusterPerformanceMetrics (module) +│ │ │ │ ├── ClusterPerformanceMetrics (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── adjusted_mutual_info_score (alias) +│ │ │ │ ├── adjusted_rand_score (alias) +│ │ │ │ ├── completeness_score (alias) +│ │ │ │ ├── fowlkes_mallows_score (alias) +│ │ │ │ ├── homogeneity_score (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ ├── tasks (alias) +│ │ │ │ └── v_measure_score (alias) +│ │ │ ├── CompletenessScore (module) +│ │ │ │ ├── CompletenessScore (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── completeness_score (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── ConfusionMatrix (module) +│ │ │ │ ├── ConfusionMatrix (function) +│ │ │ │ ├── RawData (alias) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── confusion_matrix (alias) +│ │ │ │ ├── ff (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── FeatureImportance (module) +│ │ │ │ ├── FeatureImportance (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── pd (None) +│ │ │ │ ├── permutation_importance (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── FowlkesMallowsScore (module) +│ │ │ │ ├── FowlkesMallowsScore (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── metrics (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── HomogeneityScore (module) +│ │ │ │ ├── HomogeneityScore (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── metrics (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── HyperParametersTuning (module) +│ │ │ │ ├── Dict (alias) +│ │ │ │ ├── GridSearchCV (alias) +│ │ │ │ ├── HyperParametersTuning (function) +│ │ │ │ ├── List (alias) +│ │ │ │ ├── Union (alias) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── custom_recall (function) +│ │ │ │ ├── make_scorer (alias) +│ │ │ │ ├── recall_score (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── KMeansClustersOptimization (module) +│ │ │ │ ├── KMeansClustersOptimization (function) +│ │ │ │ ├── List (alias) +│ │ │ │ ├── RawData (alias) +│ │ │ │ ├── SkipTestError (alias) +│ │ │ │ ├── Union (alias) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── cdist (alias) +│ │ │ │ ├── clone (alias) +│ │ │ │ ├── go (alias) +│ │ │ │ ├── make_subplots (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── silhouette_score (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── MinimumAccuracy (module) +│ │ │ │ ├── MinimumAccuracy (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── accuracy_score (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── MinimumF1Score (module) +│ │ │ │ ├── MinimumF1Score (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── f1_score (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── MinimumROCAUCScore (module) +│ │ │ │ ├── LabelBinarizer (alias) +│ │ │ │ ├── MinimumROCAUCScore (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── roc_auc_score (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── ModelParameters (module) +│ │ │ │ ├── ModelParameters (function) +│ │ │ │ ├── pd (None) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── ModelsPerformanceComparison (module) +│ │ │ │ ├── ModelsPerformanceComparison (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── classification_report (alias) +│ │ │ │ ├── multiclass_roc_auc_score (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── OverfitDiagnosis (module) +│ │ │ │ ├── List (alias) +│ │ │ │ ├── OverfitDiagnosis (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── get_logger (alias) +│ │ │ │ ├── metrics (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── pd (None) +│ │ │ │ ├── plt (alias) +│ │ │ │ ├── sns (None) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── PermutationFeatureImportance (module) +│ │ │ │ ├── PermutationFeatureImportance (function) +│ │ │ │ ├── RawData (alias) +│ │ │ │ ├── SkipTestError (alias) +│ │ │ │ ├── Union (alias) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── get_logger (alias) +│ │ │ │ ├── go (alias) +│ │ │ │ ├── permutation_importance (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── PopulationStabilityIndex (module) +│ │ │ │ ├── List (alias) +│ │ │ │ ├── PopulationStabilityIndex (function) +│ │ │ │ ├── RawData (alias) +│ │ │ │ ├── SkipTestError (alias) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── calculate_psi (function) +│ │ │ │ ├── get_logger (alias) +│ │ │ │ ├── go (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── pd (None) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── PrecisionRecallCurve (module) +│ │ │ │ ├── FoundationModel (alias) +│ │ │ │ ├── PrecisionRecallCurve (function) +│ │ │ │ ├── RawData (alias) +│ │ │ │ ├── SkipTestError (alias) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── go (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── precision_recall_curve (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── ROCCurve (module) +│ │ │ │ ├── ROCCurve (function) +│ │ │ │ ├── RawData (alias) +│ │ │ │ ├── SkipTestError (alias) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── go (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── roc_auc_score (alias) +│ │ │ │ ├── roc_curve (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── RegressionErrors (module) +│ │ │ │ ├── RegressionErrors (function) +│ │ │ │ ├── metrics (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── pd (None) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── RegressionErrorsComparison (module) +│ │ │ │ ├── RegressionErrorsComparison (function) +│ │ │ │ ├── get_logger (alias) +│ │ │ │ ├── metrics (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── pd (None) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── RegressionPerformance (module) +│ │ │ │ ├── RegressionPerformance (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── get_logger (alias) +│ │ │ │ ├── mean_absolute_error (alias) +│ │ │ │ ├── mean_squared_error (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── RegressionR2Square (module) +│ │ │ │ ├── RegressionR2Square (function) +│ │ │ │ ├── adj_r2_score (alias) +│ │ │ │ ├── metrics (alias) +│ │ │ │ ├── pd (None) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── RegressionR2SquareComparison (module) +│ │ │ │ ├── RegressionR2SquareComparison (function) +│ │ │ │ ├── adj_r2_score (alias) +│ │ │ │ ├── metrics (alias) +│ │ │ │ ├── pd (None) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── RobustnessDiagnosis (module) +│ │ │ │ ├── List (alias) +│ │ │ │ ├── MissingOrInvalidModelPredictFnError (alias) +│ │ │ │ ├── RobustnessDiagnosis (function) +│ │ │ │ ├── Tuple (alias) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── add (alias) +│ │ │ │ ├── defaultdict (alias) +│ │ │ │ ├── get_logger (alias) +│ │ │ │ ├── go (alias) +│ │ │ │ ├── metrics (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── pd (None) +│ │ │ │ ├── sns (None) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── SHAPGlobalImportance (module) +│ │ │ │ ├── CatBoostModel (alias) +│ │ │ │ ├── RawData (alias) +│ │ │ │ ├── SHAPGlobalImportance (function) +│ │ │ │ ├── SKlearnModel (alias) +│ │ │ │ ├── StatsModelsModel (alias) +│ │ │ │ ├── UnsupportedModelForSHAPError (alias) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── generate_shap_plot (function) +│ │ │ │ ├── get_logger (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── plt (alias) +│ │ │ │ ├── select_shap_values (function) +│ │ │ │ ├── shap (None) +│ │ │ │ ├── tags (alias) +│ │ │ │ ├── tasks (alias) +│ │ │ │ └── warnings (None) +│ │ │ ├── ScoreProbabilityAlignment (module) +│ │ │ │ ├── ScoreProbabilityAlignment (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── go (alias) +│ │ │ │ ├── pd (None) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── SilhouettePlot (module) +│ │ │ │ ├── RawData (alias) +│ │ │ │ ├── SilhouettePlot (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── np (None) +│ │ │ │ ├── plt (alias) +│ │ │ │ ├── silhouette_samples (alias) +│ │ │ │ ├── silhouette_score (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ ├── TrainingTestDegradation (module) +│ │ │ │ ├── List (alias) +│ │ │ │ ├── RawData (alias) +│ │ │ │ ├── TrainingTestDegradation (function) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── classification_report (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ ├── tasks (alias) +│ │ │ │ └── unique (alias) +│ │ │ ├── VMeasure (module) +│ │ │ │ ├── VMDataset (alias) +│ │ │ │ ├── VMModel (alias) +│ │ │ │ ├── VMeasure (function) +│ │ │ │ ├── metrics (alias) +│ │ │ │ ├── tags (alias) +│ │ │ │ └── tasks (alias) +│ │ │ └── WeakspotsDiagnosis (module) +│ │ │ ├── Callable (alias) +│ │ │ ├── Dict (alias) +│ │ │ ├── List (alias) +│ │ │ ├── Tuple (alias) +│ │ │ ├── Union (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── VMModel (alias) +│ │ │ ├── WeakspotsDiagnosis (function) +│ │ │ ├── metrics (alias) +│ │ │ ├── pd (None) +│ │ │ ├── plt (alias) +│ │ │ ├── sns (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ └── statsmodels (module) +│ │ ├── AutoARIMA (module) +│ │ │ ├── ARIMA (alias) +│ │ │ ├── AutoARIMA (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── VMModel (alias) +│ │ │ ├── adfuller (alias) +│ │ │ ├── get_logger (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── CumulativePredictionProbabilities (module) +│ │ │ ├── CumulativePredictionProbabilities (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── cm (alias) +│ │ │ ├── go (alias) +│ │ │ ├── np (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── DurbinWatsonTest (module) +│ │ │ ├── DurbinWatsonTest (function) +│ │ │ ├── durbin_watson (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── GINITable (module) +│ │ │ ├── GINITable (function) +│ │ │ ├── np (None) +│ │ │ ├── pd (None) +│ │ │ ├── roc_auc_score (alias) +│ │ │ ├── roc_curve (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── KolmogorovSmirnov (module) +│ │ │ ├── InvalidTestParametersError (alias) +│ │ │ ├── KolmogorovSmirnov (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── VMModel (alias) +│ │ │ ├── kstest_normal (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── Lilliefors (module) +│ │ │ ├── Lilliefors (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── lilliefors (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── PredictionProbabilitiesHistogram (module) +│ │ │ ├── PredictionProbabilitiesHistogram (function) +│ │ │ ├── cm (alias) +│ │ │ ├── go (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── RegressionCoeffs (module) +│ │ │ ├── RegressionCoeffs (function) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── go (alias) +│ │ │ ├── pd (None) +│ │ │ ├── stats (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── RegressionFeatureSignificance (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── RegressionFeatureSignificance (function) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── VMModel (alias) +│ │ │ ├── get_logger (alias) +│ │ │ ├── plt (alias) +│ │ │ ├── sns (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── RegressionModelForecastPlot (module) +│ │ │ ├── RegressionModelForecastPlot (function) +│ │ │ ├── Union (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── VMModel (alias) +│ │ │ ├── get_logger (alias) +│ │ │ ├── pd (None) +│ │ │ ├── plt (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── RegressionModelForecastPlotLevels (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── RegressionModelForecastPlotLevels (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── VMModel (alias) +│ │ │ ├── integrate_diff (function) +│ │ │ ├── np (None) +│ │ │ ├── pd (None) +│ │ │ ├── plt (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── RegressionModelSensitivityPlot (module) +│ │ │ ├── List (alias) +│ │ │ ├── RawData (alias) +│ │ │ ├── RegressionModelSensitivityPlot (function) +│ │ │ ├── Union (alias) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── VMModel (alias) +│ │ │ ├── get_logger (alias) +│ │ │ ├── integrate_diff (function) +│ │ │ ├── np (None) +│ │ │ ├── plt (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── RegressionModelSummary (module) +│ │ │ ├── RegressionModelSummary (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── VMModel (alias) +│ │ │ ├── adj_r2_score (alias) +│ │ │ ├── mean_squared_error (alias) +│ │ │ ├── r2_score (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── RegressionPermutationFeatureImportance (module) +│ │ │ ├── RawData (alias) +│ │ │ ├── RegressionPermutationFeatureImportance (function) +│ │ │ ├── VMDataset (alias) +│ │ │ ├── VMModel (alias) +│ │ │ ├── check_random_state (alias) +│ │ │ ├── get_logger (alias) +│ │ │ ├── go (alias) +│ │ │ ├── np (None) +│ │ │ ├── pd (None) +│ │ │ ├── r2_score (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── ScorecardHistogram (module) +│ │ │ ├── ScorecardHistogram (function) +│ │ │ ├── cm (alias) +│ │ │ ├── go (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ └── statsutils (module) +│ │ ├── adj_r2_score (function) +│ │ ├── np (None) +│ │ └── r2_score (alias) +│ ├── output (module) +│ │ ├── ABC (alias) +│ │ ├── Any (alias) +│ │ ├── BooleanOutputHandler (class) +│ │ │ ├── can_handle (function) +│ │ │ └── process (function) +│ │ ├── Dict (alias) +│ │ ├── Figure (alias) +│ │ ├── FigureOutputHandler (class) +│ │ │ ├── can_handle (function) +│ │ │ └── process (function) +│ │ ├── List (alias) +│ │ ├── MetricOutputHandler (class) +│ │ │ ├── can_handle (function) +│ │ │ └── process (function) +│ │ ├── OutputHandler (class) +│ │ │ ├── can_handle (function) +│ │ │ └── process (function) +│ │ ├── RawData (alias) +│ │ ├── RawDataOutputHandler (class) +│ │ │ ├── can_handle (function) +│ │ │ └── process (function) +│ │ ├── ResultTable (alias) +│ │ ├── TableOutputHandler (class) +│ │ │ ├── can_handle (function) +│ │ │ └── process (function) +│ │ ├── TestResult (alias) +│ │ ├── Union (alias) +│ │ ├── abstractmethod (alias) +│ │ ├── is_matplotlib_figure (alias) +│ │ ├── is_plotly_figure (alias) +│ │ ├── is_png_image (alias) +│ │ ├── np (None) +│ │ ├── pd (None) +│ │ ├── process_output (function) +│ │ └── uuid4 (alias) +│ ├── prompt_validation (module) +│ │ ├── Bias (module) +│ │ │ ├── Bias (function) +│ │ │ ├── MissingRequiredTestInputError (alias) +│ │ │ ├── RawData (alias) +│ │ │ ├── call_model (alias) +│ │ │ ├── get_explanation (alias) +│ │ │ ├── get_score (alias) +│ │ │ ├── missing_prompt_message (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── Clarity (module) +│ │ │ ├── Clarity (function) +│ │ │ ├── MissingRequiredTestInputError (alias) +│ │ │ ├── RawData (alias) +│ │ │ ├── call_model (alias) +│ │ │ ├── get_explanation (alias) +│ │ │ ├── get_score (alias) +│ │ │ ├── missing_prompt_message (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── Conciseness (module) +│ │ │ ├── Conciseness (function) +│ │ │ ├── MissingRequiredTestInputError (alias) +│ │ │ ├── RawData (alias) +│ │ │ ├── call_model (alias) +│ │ │ ├── get_explanation (alias) +│ │ │ ├── get_score (alias) +│ │ │ ├── missing_prompt_message (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── Delimitation (module) +│ │ │ ├── Delimitation (function) +│ │ │ ├── MissingRequiredTestInputError (alias) +│ │ │ ├── RawData (alias) +│ │ │ ├── call_model (alias) +│ │ │ ├── get_explanation (alias) +│ │ │ ├── get_score (alias) +│ │ │ ├── missing_prompt_message (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── NegativeInstruction (module) +│ │ │ ├── MissingRequiredTestInputError (alias) +│ │ │ ├── NegativeInstruction (function) +│ │ │ ├── RawData (alias) +│ │ │ ├── call_model (alias) +│ │ │ ├── get_explanation (alias) +│ │ │ ├── get_score (alias) +│ │ │ ├── missing_prompt_message (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── Robustness (module) +│ │ │ ├── MissingRequiredTestInputError (alias) +│ │ │ ├── RawData (alias) +│ │ │ ├── Robustness (function) +│ │ │ ├── SkipTestError (alias) +│ │ │ ├── call_model (alias) +│ │ │ ├── missing_prompt_message (alias) +│ │ │ ├── pd (None) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ ├── Specificity (module) +│ │ │ ├── MissingRequiredTestInputError (alias) +│ │ │ ├── RawData (alias) +│ │ │ ├── Specificity (function) +│ │ │ ├── call_model (alias) +│ │ │ ├── get_explanation (alias) +│ │ │ ├── get_score (alias) +│ │ │ ├── missing_prompt_message (alias) +│ │ │ ├── tags (alias) +│ │ │ └── tasks (alias) +│ │ └── ai_powered_test (module) +│ │ ├── call_model (function) +│ │ ├── client_config (alias) +│ │ ├── get_client_and_model (alias) +│ │ ├── get_explanation (function) +│ │ ├── get_score (function) +│ │ └── re (None) +│ ├── register_test_provider (function) +│ ├── run (module) +│ │ ├── Any (alias) +│ │ ├── Callable (alias) +│ │ ├── Dict (alias) +│ │ ├── List (alias) +│ │ ├── MissingRequiredTestInputError (alias) +│ │ ├── Optional (alias) +│ │ ├── TestID (alias) +│ │ ├── TestResult (alias) +│ │ ├── Tuple (alias) +│ │ ├── Union (alias) +│ │ ├── VMInput (alias) +│ │ ├── build_test_result (function) +│ │ ├── combine_results (alias) +│ │ ├── datetime (alias) +│ │ ├── describe_test (alias) +│ │ ├── get_comparison_test_configs (alias) +│ │ ├── get_logger (alias) +│ │ ├── get_result_description (alias) +│ │ ├── getdoc (alias) +│ │ ├── input_registry (alias) +│ │ ├── load_test (alias) +│ │ ├── platform (None) +│ │ ├── pprint (None) +│ │ ├── print_env (function) +│ │ ├── process_output (alias) +│ │ ├── run_test (function) +│ │ ├── subprocess (None) +│ │ ├── test_id_to_name (alias) +│ │ ├── time (None) +│ │ └── uuid4 (alias) +│ ├── run_test (alias) +│ ├── tags (alias) +│ ├── tasks (alias) +│ ├── test (alias) +│ ├── test_provider_store (alias) +│ ├── test_providers (module) +│ │ ├── List (alias) +│ │ ├── LocalTestProvider (class) +│ │ │ ├── list_tests (function) +│ │ │ └── load_test (function) +│ │ ├── Path (alias) +│ │ ├── Protocol (alias) +│ │ ├── TestProvider (class) +│ │ │ ├── list_tests (function) +│ │ │ └── load_test (function) +│ │ ├── ValidMindTestProvider (class) +│ │ │ ├── list_tests (function) +│ │ │ └── load_test (function) +│ │ ├── get_logger (alias) +│ │ ├── importlib (None) +│ │ ├── os (None) +│ │ ├── re (None) +│ │ └── sys (None) +├── unit_metrics (module) +│ ├── describe_metric (function) +│ ├── describe_test (alias) +│ ├── list_metrics (function) +│ ├── run_metric (function) +│ ├── run_test (alias) +│ └── test_provider_store (alias) +├── vm_models (module) +│ ├── Figure (alias) +│ ├── ModelAttributes (alias) +│ ├── R_MODEL_TYPES (alias) +│ ├── ResultTable (alias) +│ ├── TestResult (alias) +│ ├── TestSuite (alias) +│ ├── TestSuiteRunner (alias) +│ ├── VMDataset (alias) +│ ├── VMInput (alias) +│ └── VMModel (alias) +└── warnings (None) diff --git a/scripts/api_tree.py b/scripts/api_tree.py new file mode 100644 index 000000000..a952fce5d --- /dev/null +++ b/scripts/api_tree.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +import json +import sys +from typing import Any, Dict + +# Define which kinds of members to show +SHOW_KINDS = {'module', 'class', 'function'} # Base kinds to show + +# Modules to skip +SKIP_MODULES = {'utils'} # Add any other modules you want to skip + +def resolve_alias(member: Dict[str, Any], data: Dict[str, Any]) -> Dict[str, Any]: + """Resolve an alias to its target member.""" + if member.get('kind') == 'alias' and member.get('target_path'): + path_parts = member['target_path'].split('.') + current = data + for part in path_parts[1:]: # Skip the first part (validmind) + if part in current.get('members', {}): + current = current['members'][part] + else: + return member + return current + return member + +def print_tree(data: Dict[str, Any], prefix: str = "", is_last: bool = True, is_root: bool = False, full_data: Dict[str, Any] = None) -> None: + """Print a tree view of the API structure.""" + members = data.get('members', {}) + + # For vm_models, only show items listed in __all__ + if data.get('name') == 'vm_models' and '__all__' in members: + all_elements = members['__all__'].get('value', {}).get('elements', []) + items = [(name, member) for name, member in sorted(members.items()) + if name in {elem.strip("'") for elem in all_elements}] + else: + # For other modules, use normal filtering + items = [(name, member) for name, member in sorted(members.items()) + if member and (member.get('kind') in SHOW_KINDS or member.get('kind') == 'alias')] + + for i, (name, member) in enumerate(items): + if name == '__all__': + continue + + # Skip private members and utils module + if name.startswith('_') or name in SKIP_MODULES: + continue + + is_last_item = i == len(items) - 1 + + # Resolve alias before getting kind and members + resolved_member = resolve_alias(member, full_data) + kind = resolved_member.get('kind') if resolved_member else 'unknown' + + # Create the branch symbol + branch = "└── " if is_last_item else "├── " + + # Print the current item + print(f"{prefix}{branch}{name} ({kind})") + + # Recursively print children for modules and classes + if (kind == 'module' or kind == 'class') and 'members' in resolved_member: + new_prefix = prefix + (" " if is_last_item else "│ ") + print_tree(resolved_member, new_prefix, is_last_item, is_root=False, full_data=full_data) + +def main(): + """Main function to process the JSON file.""" + if len(sys.argv) != 2: + print("Usage: python api_tree.py ") + sys.exit(1) + + json_path = sys.argv[1] + + try: + with open(json_path) as f: + data = json.load(f) + print("\nValidMind Python API:") + # Start with the 'validmind' module + if 'validmind' in data: + print_tree(data['validmind'], is_root=True, full_data=data) + else: + print("Error: No 'validmind' module found in JSON") + + except FileNotFoundError: + print(f"Error: File {json_path} not found") + sys.exit(1) + except json.JSONDecodeError: + print(f"Error: {json_path} is not a valid JSON file") + sys.exit(1) + +if __name__ == "__main__": + main() \ No newline at end of file From 4a0091224252b996597dde775f8d8c9ab89703eb Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 24 Jan 2025 06:51:14 -0800 Subject: [PATCH 003/207] Save point --- scripts/api_tree.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/scripts/api_tree.py b/scripts/api_tree.py index a952fce5d..d3d0b9e15 100644 --- a/scripts/api_tree.py +++ b/scripts/api_tree.py @@ -26,15 +26,9 @@ def print_tree(data: Dict[str, Any], prefix: str = "", is_last: bool = True, is_ """Print a tree view of the API structure.""" members = data.get('members', {}) - # For vm_models, only show items listed in __all__ - if data.get('name') == 'vm_models' and '__all__' in members: - all_elements = members['__all__'].get('value', {}).get('elements', []) - items = [(name, member) for name, member in sorted(members.items()) - if name in {elem.strip("'") for elem in all_elements}] - else: - # For other modules, use normal filtering - items = [(name, member) for name, member in sorted(members.items()) - if member and (member.get('kind') in SHOW_KINDS or member.get('kind') == 'alias')] + # Filter items to only show desired kinds + items = [(name, member) for name, member in sorted(members.items()) + if member and (member.get('kind') in SHOW_KINDS or member.get('kind') == 'alias')] for i, (name, member) in enumerate(items): if name == '__all__': From 8f6aa8b6557edd36df1aeabd44ccde6a2f1ba2a0 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 24 Jan 2025 13:31:37 -0800 Subject: [PATCH 004/207] Add API tree script --- docs/validmind.tree | 2178 ++++++++----------------------------------- scripts/api_tree.py | 173 +++- 2 files changed, 564 insertions(+), 1787 deletions(-) diff --git a/docs/validmind.tree b/docs/validmind.tree index 5bc47a848..58b1cc93e 100644 --- a/docs/validmind.tree +++ b/docs/validmind.tree @@ -1,170 +1,56 @@ -ValidMind Python API: -├── NumbaDeprecationWarning (alias) -├── NumbaPendingDeprecationWarning (alias) -├── RawData (alias) -├── api_client (module) -│ ├── Any (alias) -│ ├── BytesIO (alias) -│ ├── Dict (alias) -│ ├── Figure (alias) -│ ├── FormData (alias) -│ ├── List (alias) -│ ├── MissingAPICredentialsError (alias) -│ ├── MissingModelIdError (alias) -│ ├── NumpyEncoder (alias) -│ ├── Optional (alias) -│ ├── Tuple (alias) -│ ├── Union (alias) -│ ├── aget_metadata (function) -│ ├── aiohttp (None) -│ ├── alog_figure (function) -│ ├── alog_input (function) -│ ├── alog_metadata (function) -│ ├── alog_metric (function) -│ ├── alog_test_result (function) -│ ├── asyncio (None) -│ ├── atexit (None) -│ ├── client_config (alias) -│ ├── generate_test_result_description (function) -│ ├── get_ai_key (function) -│ ├── get_api_host (function) -│ ├── get_api_model (function) -│ ├── get_logger (alias) -│ ├── init (function) -│ ├── init_sentry (alias) -│ ├── json (None) -│ ├── log_input (function) -│ ├── log_metric (function) -│ ├── os (None) -│ ├── raise_api_error (alias) -│ ├── reload (function) -│ ├── requests (None) -│ ├── run_async (alias) -│ ├── send_single_error (alias) -│ ├── urlencode (alias) -│ └── urljoin (alias) -├── client (module) -│ ├── DataFrameDataset (alias) -│ ├── GetTestSuiteError (alias) -│ ├── InitializeTestSuiteError (alias) -│ ├── MetadataModel (alias) -│ ├── MissingDocumentationTemplate (alias) -│ ├── MissingRExtrasError (alias) -│ ├── ModelAttributes (alias) -│ ├── PolarsDataset (alias) -│ ├── RModel (alias) -│ ├── TestSuite (alias) -│ ├── TestSuiteRunner (alias) -│ ├── TorchDataset (alias) -│ ├── UnsupportedDatasetError (alias) -│ ├── UnsupportedModelError (alias) -│ ├── VMDataset (alias) -│ ├── VMModel (alias) -│ ├── client_config (alias) -│ ├── get_dataset_info (alias) -│ ├── get_logger (alias) -│ ├── get_model_class (alias) -│ ├── get_model_info (alias) -│ ├── get_template_test_suite (alias) -│ ├── get_test_suite (function) -│ ├── get_test_suite_by_id (alias) -│ ├── init_dataset (function) -│ ├── init_model (function) -│ ├── init_r_model (function) -│ ├── input_registry (alias) -│ ├── is_model_metadata (alias) -│ ├── log_input (alias) -│ ├── pd (None) -│ ├── pl (None) -│ ├── preview_template (function) -│ ├── run_documentation_tests (function) -│ └── run_test_suite (function) -├── client_config (module) -│ ├── ClientConfig (class) -│ │ └── can_generate_llm_test_descriptions (function) -│ └── dataclass (alias) -├── datasets (module) -│ ├── classification (module) +validmind (* = docstring) +├── RawData (alias) -> validmind.vm_models.result.RawData* +├── get_test_suite (alias) -> validmind.client.get_test_suite* +├── init (alias) -> validmind.api_client.init* +├── init_dataset (alias) -> validmind.client.init_dataset* +├── init_model (alias) -> validmind.client.init_model* +├── init_r_model (alias) -> validmind.client.init_r_model* +├── log_metric (alias) -> validmind.api_client.log_metric* +├── preview_template (alias) -> validmind.client.preview_template* +├── print_env (alias) -> validmind.tests.run.print_env +├── reload (alias) -> validmind.api_client.reload* +├── run_documentation_tests (alias) -> validmind.client.run_documentation_tests* +├── run_test_suite (alias) -> validmind.client.run_test_suite* +├── tags (alias) -> validmind.tests.decorator.tags* +├── tasks (alias) -> validmind.tests.decorator.tasks* +├── test (alias) -> validmind.tests.decorator.test* +├── datasets (module)* +│ ├── classification (module)* │ │ ├── customer_churn (module) -│ │ │ ├── get_demo_test_config (function) +│ │ │ ├── get_demo_test_config (function)* │ │ │ ├── load_data (function) -│ │ │ ├── os (None) -│ │ │ ├── pd (None) -│ │ │ ├── preprocess (function) -│ │ │ ├── simple_preprocess_booleans (alias) -│ │ │ ├── simple_preprocess_categoricals (alias) -│ │ │ ├── simple_preprocess_numericals (alias) -│ │ │ ├── train_test_split (alias) -│ │ │ └── vm (None) -│ │ ├── pd (None) -│ │ ├── simple_preprocess_booleans (function) -│ │ ├── simple_preprocess_categoricals (function) -│ │ ├── simple_preprocess_numericals (function) +│ │ │ └── preprocess (function) │ │ └── taiwan_credit (module) │ │ ├── load_data (function) -│ │ ├── os (None) -│ │ ├── pd (None) -│ │ ├── preprocess (function) -│ │ ├── simple_preprocess_booleans (alias) -│ │ ├── simple_preprocess_categoricals (alias) -│ │ ├── simple_preprocess_numericals (alias) -│ │ └── train_test_split (alias) -│ ├── credit_risk (module) +│ │ └── preprocess (function) +│ ├── credit_risk (module)* │ │ ├── lending_club (module) -│ │ │ ├── RandomForestClassifier (alias) │ │ │ ├── compute_scores (function) │ │ │ ├── feature_engineering (function) -│ │ │ ├── get_demo_test_config (function) +│ │ │ ├── get_demo_test_config (function)* │ │ │ ├── init_vm_objects (function) -│ │ │ ├── load_data (function) +│ │ │ ├── load_data (function)* │ │ │ ├── load_scorecard (function) │ │ │ ├── load_test_config (function) -│ │ │ ├── logging (None) -│ │ │ ├── np (None) -│ │ │ ├── os (None) -│ │ │ ├── pd (None) │ │ │ ├── preprocess (function) -│ │ │ ├── sc (None) -│ │ │ ├── sm (alias) -│ │ │ ├── split (function) -│ │ │ ├── train_test_split (alias) -│ │ │ ├── vm (None) -│ │ │ ├── warnings (None) -│ │ │ ├── woe_encoding (function) -│ │ │ └── xgb (None) +│ │ │ ├── split (function)* +│ │ │ └── woe_encoding (function) │ │ └── lending_club_bias (module) -│ │ ├── LabelEncoder (alias) │ │ ├── compute_scores (function) -│ │ ├── load_data (function) -│ │ ├── np (None) -│ │ ├── os (None) -│ │ ├── pd (None) +│ │ ├── load_data (function)* │ │ ├── preprocess (function) -│ │ ├── split (function) -│ │ └── train_test_split (alias) -│ ├── nlp (module) +│ │ └── split (function) +│ ├── nlp (module)* │ │ ├── cnn_dailymail (module) -│ │ │ ├── HTML (alias) -│ │ │ ├── display (alias) -│ │ │ ├── display_nice (function) -│ │ │ ├── load_data (function) -│ │ │ ├── load_dataset (alias) -│ │ │ ├── os (None) -│ │ │ ├── pd (None) -│ │ │ ├── tabulate (alias) -│ │ │ └── textwrap (None) +│ │ │ ├── display_nice (function)* +│ │ │ └── load_data (function)* │ │ └── twitter_covid_19 (module) -│ │ ├── load_data (function) -│ │ ├── os (None) -│ │ └── pd (None) -│ └── regression (module) +│ │ └── load_data (function) +│ └── regression (module)* │ ├── california_housing (module) -│ │ ├── fetch_california_housing (alias) │ │ ├── load_data (function) -│ │ ├── os (None) -│ │ ├── preprocess (function) -│ │ └── train_test_split (alias) +│ │ └── preprocess (function) │ ├── fred (module) │ │ ├── load_all_data (function) │ │ ├── load_data (function) @@ -172,1817 +58,579 @@ ValidMind Python API: │ │ ├── load_processed_data (function) │ │ ├── load_test_dataset (function) │ │ ├── load_train_dataset (function) -│ │ ├── os (None) -│ │ ├── pd (None) -│ │ ├── pickle (None) -│ │ ├── preprocess (function) +│ │ ├── preprocess (function)* │ │ └── transform (function) │ ├── fred_timeseries (module) │ │ ├── align_date_range (function) -│ │ ├── convert_to_levels (function) +│ │ ├── convert_to_levels (function)* │ │ ├── get_common_date_range (function) │ │ ├── get_demo_test_config (function) -│ │ ├── load_data (function) -│ │ ├── os (None) -│ │ └── pd (None) -│ ├── identify_frequencies (function) -│ ├── lending_club (module) -│ │ ├── load_data (function) -│ │ ├── os (None) -│ │ ├── pd (None) -│ │ ├── preprocess (function) -│ │ └── transform (function) -│ ├── pd (None) -│ └── resample_to_common_frequency (function) -├── errors (module) -│ ├── APIRequestError (class) +│ │ └── load_data (function) +│ └── lending_club (module) +│ ├── load_data (function) +│ ├── preprocess (function)* +│ └── transform (function) +├── errors (module)* +│ ├── APIRequestError (class)* │ ├── BaseError (class) +│ │ ├── __init__ (function) │ │ └── description (function) -│ ├── GetTestSuiteError (class) -│ ├── InitializeTestSuiteError (class) +│ ├── GetTestSuiteError (class)* +│ ├── InitializeTestSuiteError (class)* │ ├── InvalidAPICredentialsError (class) │ │ └── description (function) -│ ├── InvalidContentIdPrefixError (class) -│ ├── InvalidInputError (class) -│ ├── InvalidMetricResultsError (class) +│ ├── InvalidContentIdPrefixError (class)* +│ ├── InvalidInputError (class)* +│ ├── InvalidMetricResultsError (class)* │ ├── InvalidProjectError (class) │ │ └── description (function) -│ ├── InvalidRequestBodyError (class) -│ ├── InvalidTestParametersError (class) -│ ├── InvalidTestResultsError (class) -│ ├── InvalidTextObjectError (class) -│ ├── InvalidValueFormatterError (class) -│ ├── InvalidXGBoostTrainedModelError (class) -│ ├── LoadTestError (class) -│ ├── MismatchingClassLabelsError (class) +│ ├── InvalidRequestBodyError (class)* +│ ├── InvalidTestParametersError (class)* +│ ├── InvalidTestResultsError (class)* +│ ├── InvalidTextObjectError (class)* +│ ├── InvalidValueFormatterError (class)* +│ ├── InvalidXGBoostTrainedModelError (class)* +│ ├── LoadTestError (class)* +│ │ └── __init__ (function) +│ ├── MismatchingClassLabelsError (class)* │ ├── MissingAPICredentialsError (class) │ │ └── description (function) -│ ├── MissingCacheResultsArgumentsError (class) -│ ├── MissingClassLabelError (class) -│ ├── MissingDependencyError (class) -│ ├── MissingDocumentationTemplate (class) +│ ├── MissingCacheResultsArgumentsError (class)* +│ ├── MissingClassLabelError (class)* +│ ├── MissingDependencyError (class)* +│ │ └── __init__ (function)* +│ ├── MissingDocumentationTemplate (class)* │ ├── MissingModelIdError (class) │ │ └── description (function) -│ ├── MissingOrInvalidModelPredictFnError (class) -│ ├── MissingRExtrasError (class) +│ ├── MissingOrInvalidModelPredictFnError (class)* +│ ├── MissingRExtrasError (class)* │ │ └── description (function) -│ ├── MissingRequiredTestInputError (class) -│ ├── MissingTextContentIdError (class) -│ ├── MissingTextContentsError (class) -│ ├── Optional (alias) -│ ├── SkipTestError (class) -│ ├── TestInputInvalidDatasetError (class) -│ ├── UnsupportedColumnTypeError (class) -│ ├── UnsupportedDatasetError (class) -│ ├── UnsupportedFigureError (class) -│ ├── UnsupportedModelError (class) -│ ├── UnsupportedModelForSHAPError (class) -│ ├── UnsupportedRModelError (class) -│ ├── json (None) -│ ├── raise_api_error (function) -│ └── should_raise_on_fail_fast (function) -├── get_test_suite (alias) -├── html_templates (module) -│ └── content_blocks (module) -├── init (alias) -├── init_dataset (alias) -├── init_model (alias) -├── init_r_model (alias) -├── input_registry (module) -│ ├── InputRegistry (class) -│ │ ├── add (function) -│ │ ├── get (function) -│ │ └── list_input_objects (function) -│ ├── InvalidInputError (alias) -│ └── VMInput (alias) -├── log_metric (alias) -├── logging (module) -│ ├── event_from_exception (alias) -│ ├── exc_info_from_error (alias) -│ ├── get_logger (function) -│ ├── init_sentry (function) -│ ├── log_performance (function) -│ ├── log_performance_async (function) -│ ├── logging (None) -│ ├── os (None) -│ ├── send_single_error (function) -│ ├── sentry_sdk (None) -│ └── time (None) -├── models (module) -│ ├── CatBoostModel (alias) -│ ├── FoundationModel (alias) -│ ├── FunctionModel (alias) -│ ├── HFModel (alias) -│ ├── MetadataModel (alias) -│ ├── PipelineModel (alias) -│ ├── Prompt (alias) -│ ├── PyTorchModel (alias) -│ ├── SKlearnModel (alias) -│ ├── StatsModelsModel (alias) -│ ├── XGBoostModel (alias) -│ ├── foundation (module) -│ │ ├── FoundationModel (class) -│ │ │ └── predict (function) -│ │ ├── FunctionModel (alias) -│ │ ├── Prompt (class) -│ │ ├── dataclass (alias) -│ │ ├── get_logger (alias) -│ │ └── pd (None) -│ ├── function (module) -│ │ ├── FunctionModel (class) -│ │ │ └── predict (function) -│ │ ├── Input (class) -│ │ │ └── get_new (function) -│ │ └── VMModel (alias) -│ ├── huggingface (module) -│ │ ├── HFModel (class) -│ │ │ ├── predict (function) -│ │ │ └── predict_proba (function) -│ │ ├── MissingOrInvalidModelPredictFnError (alias) -│ │ ├── VMModel (alias) -│ │ ├── dataclass (alias) -│ │ ├── get_logger (alias) -│ │ └── has_method_with_arguments (alias) -│ ├── metadata (module) -│ │ ├── MetadataModel (class) -│ │ │ ├── predict (function) -│ │ │ └── predict_proba (function) -│ │ ├── MissingOrInvalidModelPredictFnError (alias) -│ │ └── VMModel (alias) -│ ├── pipeline (module) -│ │ ├── ModelAttributes (alias) -│ │ ├── ModelPipeline (alias) -│ │ ├── PipelineModel (class) -│ │ │ ├── predict (function) -│ │ │ └── serialize (function) -│ │ ├── VMModel (alias) -│ │ └── get_logger (alias) -│ ├── pytorch (module) -│ │ ├── MissingOrInvalidModelPredictFnError (alias) -│ │ ├── PyTorchModel (class) -│ │ │ ├── predict (function) -│ │ │ └── predict_proba (function) -│ │ ├── VMModel (alias) -│ │ ├── get_logger (alias) -│ │ └── has_method_with_arguments (alias) -│ ├── r_model (module) -│ │ ├── MissingRExtrasError (alias) -│ │ ├── RModel (class) -│ │ │ ├── predict (function) -│ │ │ ├── predict_proba (function) -│ │ │ ├── r_predict (function) -│ │ │ ├── r_xgb_predict (function) -│ │ │ └── regression_coefficients (function) -│ │ ├── VMModel (alias) -│ │ ├── get_full_class_name (function) -│ │ ├── get_logger (alias) -│ │ ├── np (None) -│ │ └── pd (None) -│ └── sklearn (module) -│ ├── CatBoostModel (class) -│ ├── MissingOrInvalidModelPredictFnError (alias) -│ ├── SKlearnModel (class) -│ │ ├── predict (function) -│ │ └── predict_proba (function) -│ ├── StatsModelsModel (class) -│ │ └── regression_coefficients (function) -│ ├── VMModel (alias) -│ ├── XGBoostModel (class) -│ ├── get_logger (alias) -│ ├── has_method_with_arguments (alias) -│ └── pd (None) -├── preview_template (alias) -├── print_env (alias) -├── reload (alias) -├── run_documentation_tests (alias) -├── run_test_suite (alias) -├── tags (alias) -├── tasks (alias) -├── template (module) -│ ├── Accordion (alias) -│ ├── HTML (alias) -│ ├── LoadTestError (alias) -│ ├── TestSuite (alias) -│ ├── VBox (alias) -│ ├── describe_test (alias) -│ ├── display (alias) -│ ├── failed_content_block_html (alias) -│ ├── get_logger (alias) -│ ├── get_template_test_suite (function) -│ ├── is_notebook (alias) -│ ├── non_test_content_block_html (alias) -│ └── preview_template (function) -├── test (alias) -├── test_suites (module) -│ ├── ClassifierDiagnosis (alias) -│ ├── ClassifierFullSuite (alias) -│ ├── ClassifierMetrics (alias) -│ ├── ClassifierModelValidation (alias) -│ ├── ClassifierPerformance (alias) -│ ├── ClusterFullSuite (alias) -│ ├── ClusterMetrics (alias) -│ ├── ClusterPerformance (alias) -│ ├── EmbeddingsFullSuite (alias) -│ ├── EmbeddingsMetrics (alias) -│ ├── EmbeddingsPerformance (alias) -│ ├── KmeansParametersOptimization (alias) -│ ├── LLMClassifierFullSuite (alias) -│ ├── NLPClassifierFullSuite (alias) -│ ├── PromptValidation (alias) -│ ├── RegressionFullSuite (alias) -│ ├── RegressionMetrics (alias) -│ ├── RegressionModelDescription (alias) -│ ├── RegressionModelsEvaluation (alias) -│ ├── RegressionPerformance (alias) -│ ├── SummarizationMetrics (alias) -│ ├── TabularDataQuality (alias) -│ ├── TabularDataset (alias) -│ ├── TabularDatasetDescription (alias) -│ ├── TestSuite (alias) -│ ├── TextDataQuality (alias) -│ ├── TimeSeriesDataQuality (alias) -│ ├── TimeSeriesDataset (alias) -│ ├── TimeSeriesModelValidation (alias) -│ ├── TimeSeriesMultivariate (alias) -│ ├── TimeSeriesUnivariate (alias) -│ ├── classifier (module) -│ │ ├── ClassifierDiagnosis (class) -│ │ ├── ClassifierFullSuite (class) -│ │ ├── ClassifierMetrics (class) -│ │ ├── ClassifierModelValidation (class) -│ │ ├── ClassifierPerformance (class) -│ │ ├── TabularDataQuality (alias) -│ │ ├── TabularDatasetDescription (alias) -│ │ └── TestSuite (alias) -│ ├── cluster (module) -│ │ ├── ClusterFullSuite (class) -│ │ ├── ClusterMetrics (class) -│ │ ├── ClusterPerformance (class) -│ │ ├── KmeansParametersOptimization (alias) -│ │ └── TestSuite (alias) -│ ├── describe_suite (function) -│ ├── embeddings (module) -│ │ ├── EmbeddingsFullSuite (class) -│ │ ├── EmbeddingsMetrics (class) -│ │ ├── EmbeddingsPerformance (class) -│ │ └── TestSuite (alias) -│ ├── format_dataframe (alias) -│ ├── get_by_id (function) -│ ├── get_logger (alias) -│ ├── getdoc (alias) -│ ├── list_suites (function) -│ ├── llm (module) -│ │ ├── ClassifierDiagnosis (alias) -│ │ ├── ClassifierMetrics (alias) -│ │ ├── ClassifierPerformance (alias) -│ │ ├── LLMClassifierFullSuite (class) -│ │ ├── PromptValidation (class) -│ │ ├── TestSuite (alias) -│ │ └── TextDataQuality (alias) -│ ├── load_test (alias) -│ ├── nlp (module) -│ │ ├── ClassifierDiagnosis (alias) -│ │ ├── ClassifierMetrics (alias) -│ │ ├── ClassifierPerformance (alias) -│ │ ├── NLPClassifierFullSuite (class) -│ │ ├── TestSuite (alias) -│ │ └── TextDataQuality (alias) -│ ├── parameters_optimization (module) -│ │ ├── KmeansParametersOptimization (class) -│ │ └── TestSuite (alias) -│ ├── pd (None) -│ ├── register_test_suite (function) +│ ├── MissingRequiredTestInputError (class)* +│ ├── MissingTextContentIdError (class)* +│ ├── MissingTextContentsError (class)* +│ ├── SkipTestError (class)* +│ ├── TestInputInvalidDatasetError (class)* +│ ├── UnsupportedColumnTypeError (class)* +│ ├── UnsupportedDatasetError (class)* +│ ├── UnsupportedFigureError (class)* +│ ├── UnsupportedModelError (class)* +│ ├── UnsupportedModelForSHAPError (class)* +│ ├── UnsupportedRModelError (class)* +│ ├── raise_api_error (function)* +│ └── should_raise_on_fail_fast (function)* +├── test_suites (module)* +│ ├── classifier (module)* +│ │ ├── ClassifierDiagnosis (class)* +│ │ ├── ClassifierFullSuite (class)* +│ │ ├── ClassifierMetrics (class)* +│ │ ├── ClassifierModelValidation (class)* +│ │ └── ClassifierPerformance (class)* +│ ├── cluster (module)* +│ │ ├── ClusterFullSuite (class)* +│ │ ├── ClusterMetrics (class)* +│ │ └── ClusterPerformance (class)* +│ ├── embeddings (module)* +│ │ ├── EmbeddingsFullSuite (class)* +│ │ ├── EmbeddingsMetrics (class)* +│ │ └── EmbeddingsPerformance (class)* +│ ├── llm (module)* +│ │ ├── LLMClassifierFullSuite (class)* +│ │ └── PromptValidation (class)* +│ ├── nlp (module)* +│ │ └── NLPClassifierFullSuite (class)* +│ ├── parameters_optimization (module)* +│ │ └── KmeansParametersOptimization (class)* │ ├── regression (module) -│ │ ├── RegressionFullSuite (class) -│ │ ├── RegressionMetrics (class) -│ │ ├── RegressionPerformance (class) -│ │ ├── TabularDataQuality (alias) -│ │ ├── TabularDatasetDescription (alias) -│ │ └── TestSuite (alias) -│ ├── statsmodels_timeseries (module) -│ │ ├── RegressionModelDescription (class) -│ │ ├── RegressionModelsEvaluation (class) -│ │ └── TestSuite (alias) -│ ├── summarization (module) -│ │ ├── SummarizationMetrics (class) -│ │ └── TestSuite (alias) -│ ├── tabular_datasets (module) -│ │ ├── TabularDataQuality (class) -│ │ ├── TabularDataset (class) -│ │ ├── TabularDatasetDescription (class) -│ │ └── TestSuite (alias) -│ ├── test_id_to_name (alias) -│ ├── text_data (module) -│ │ ├── TestSuite (alias) -│ │ └── TextDataQuality (class) -│ └── time_series (module) -│ ├── RegressionModelDescription (alias) -│ ├── RegressionModelsEvaluation (alias) -│ ├── TestSuite (alias) -│ ├── TimeSeriesDataQuality (class) -│ ├── TimeSeriesDataset (class) -│ ├── TimeSeriesModelValidation (class) -│ ├── TimeSeriesMultivariate (class) -│ └── TimeSeriesUnivariate (class) -├── tests (module) -│ ├── LoadTestError (alias) -│ ├── LocalTestProvider (alias) -│ ├── TestProvider (alias) +│ │ ├── RegressionFullSuite (class)* +│ │ ├── RegressionMetrics (class)* +│ │ └── RegressionPerformance (class)* +│ ├── statsmodels_timeseries (module)* +│ │ ├── RegressionModelDescription (class)* +│ │ └── RegressionModelsEvaluation (class)* +│ ├── summarization (module)* +│ │ └── SummarizationMetrics (class)* +│ ├── tabular_datasets (module)* +│ │ ├── TabularDataQuality (class)* +│ │ ├── TabularDataset (class)* +│ │ └── TabularDatasetDescription (class)* +│ ├── text_data (module)* +│ │ └── TextDataQuality (class)* +│ ├── time_series (module)* +│ │ ├── TimeSeriesDataQuality (class)* +│ │ ├── TimeSeriesDataset (class)* +│ │ ├── TimeSeriesModelValidation (class)* +│ │ ├── TimeSeriesMultivariate (class)* +│ │ └── TimeSeriesUnivariate (class)* +│ ├── describe_suite (function)* +│ ├── get_by_id (function)* +│ ├── list_suites (function)* +│ └── register_test_suite (function)* +├── tests (module)* │ ├── comparison (module) -│ │ ├── Any (alias) -│ │ ├── Dict (alias) -│ │ ├── List (alias) -│ │ ├── ResultTable (alias) -│ │ ├── TestResult (alias) -│ │ ├── Tuple (alias) -│ │ ├── Union (alias) -│ │ ├── VMInput (alias) -│ │ ├── combine_results (function) -│ │ ├── get_comparison_test_configs (function) -│ │ ├── get_logger (alias) -│ │ ├── is_matplotlib_figure (alias) -│ │ ├── is_plotly_figure (alias) -│ │ ├── is_png_image (alias) -│ │ ├── pd (None) -│ │ ├── product (alias) -│ │ └── test_id_to_name (alias) +│ │ ├── combine_results (function)* +│ │ └── get_comparison_test_configs (function)* │ ├── data_validation (module) │ │ ├── ACFandPACFPlot (module) -│ │ │ ├── ACFandPACFPlot (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── acf (alias) -│ │ │ ├── go (alias) -│ │ │ ├── pacf (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── ACFandPACFPlot (function)* │ │ ├── ADF (module) -│ │ │ ├── ADF (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── adfuller (alias) -│ │ │ ├── get_logger (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── ADF (function)* │ │ ├── AutoAR (module) -│ │ │ ├── AutoAR (function) -│ │ │ ├── AutoReg (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── adfuller (alias) -│ │ │ ├── get_logger (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── AutoAR (function)* │ │ ├── AutoMA (module) -│ │ │ ├── ARIMA (alias) -│ │ │ ├── AutoMA (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── adfuller (alias) -│ │ │ ├── get_logger (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── AutoMA (function)* │ │ ├── AutoStationarity (module) -│ │ │ ├── AutoStationarity (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── adfuller (alias) -│ │ │ ├── np (None) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── AutoStationarity (function)* │ │ ├── BivariateScatterPlots (module) -│ │ │ ├── BivariateScatterPlots (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── itertools (None) -│ │ │ ├── px (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── BivariateScatterPlots (function)* │ │ ├── BoxPierce (module) -│ │ │ ├── BoxPierce (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── acorr_ljungbox (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── BoxPierce (function)* │ │ ├── ChiSquaredFeaturesTable (module) -│ │ │ ├── ChiSquaredFeaturesTable (function) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── chi2_contingency (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) -│ │ ├── ClassImbalance (module) -│ │ │ ├── Any (alias) -│ │ │ ├── ClassImbalance (function) -│ │ │ ├── Dict (alias) -│ │ │ ├── RawData (alias) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── Tuple (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── go (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── ChiSquaredFeaturesTable (function)* +│ │ ├── ClassImbalance (module)* +│ │ │ └── ClassImbalance (function)* │ │ ├── DatasetDescription (module) -│ │ │ ├── Counter (alias) -│ │ │ ├── DatasetDescription (function) -│ │ │ ├── ProfilingTypeSet (alias) -│ │ │ ├── RawData (alias) -│ │ │ ├── Settings (alias) -│ │ │ ├── UnsupportedColumnTypeError (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── describe_column (function) -│ │ │ ├── get_column_histograms (function) -│ │ │ ├── get_logger (alias) -│ │ │ ├── get_numerical_histograms (function) -│ │ │ ├── infer_datatypes (function) -│ │ │ ├── np (None) -│ │ │ ├── re (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ ├── DatasetDescription (function)* +│ │ │ ├── describe_column (function)* +│ │ │ ├── get_column_histograms (function)* +│ │ │ ├── get_numerical_histograms (function)* +│ │ │ └── infer_datatypes (function) │ │ ├── DatasetSplit (module) -│ │ │ ├── DatasetSplit (function) -│ │ │ ├── List (alias) -│ │ │ ├── RawData (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── DatasetSplit (function)* │ │ ├── DescriptiveStatistics (module) -│ │ │ ├── DescriptiveStatistics (function) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── format_records (alias) +│ │ │ ├── DescriptiveStatistics (function)* │ │ │ ├── get_summary_statistics_categorical (function) -│ │ │ ├── get_summary_statistics_numerical (function) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── get_summary_statistics_numerical (function) │ │ ├── DickeyFullerGLS (module) -│ │ │ ├── DFGLS (alias) -│ │ │ ├── DickeyFullerGLS (function) -│ │ │ ├── LinAlgError (alias) -│ │ │ ├── RawData (alias) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── get_logger (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── DickeyFullerGLS (function)* │ │ ├── Duplicates (module) -│ │ │ ├── Duplicates (function) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── Duplicates (function)* │ │ ├── EngleGrangerCoint (module) -│ │ │ ├── EngleGrangerCoint (function) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── coint (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── EngleGrangerCoint (function)* │ │ ├── FeatureTargetCorrelationPlot (module) -│ │ │ ├── FeatureTargetCorrelationPlot (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── go (alias) -│ │ │ ├── np (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── FeatureTargetCorrelationPlot (function)* │ │ ├── HighCardinality (module) -│ │ │ ├── HighCardinality (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── HighCardinality (function)* │ │ ├── HighPearsonCorrelation (module) -│ │ │ ├── HighPearsonCorrelation (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── HighPearsonCorrelation (function)* │ │ ├── IQROutliersBarPlot (module) -│ │ │ ├── IQROutliersBarPlot (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── compute_outliers (function) -│ │ │ ├── go (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ ├── IQROutliersBarPlot (function)* +│ │ │ └── compute_outliers (function) │ │ ├── IQROutliersTable (module) -│ │ │ ├── IQROutliersTable (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── compute_outliers (function) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ ├── IQROutliersTable (function)* +│ │ │ └── compute_outliers (function) │ │ ├── IsolationForestOutliers (module) -│ │ │ ├── IsolationForest (alias) -│ │ │ ├── IsolationForestOutliers (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── itertools (None) -│ │ │ ├── plt (alias) -│ │ │ ├── sns (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── IsolationForestOutliers (function)* │ │ ├── JarqueBera (module) -│ │ │ ├── JarqueBera (function) -│ │ │ ├── jarque_bera (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── JarqueBera (function)* │ │ ├── KPSS (module) -│ │ │ ├── KPSS (function) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── get_logger (alias) -│ │ │ ├── kpss (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── KPSS (function)* │ │ ├── LJungBox (module) -│ │ │ ├── LJungBox (function) -│ │ │ ├── acorr_ljungbox (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── LJungBox (function)* │ │ ├── LaggedCorrelationHeatmap (module) -│ │ │ ├── LaggedCorrelationHeatmap (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── ff (alias) -│ │ │ ├── np (None) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── LaggedCorrelationHeatmap (function)* │ │ ├── MissingValues (module) -│ │ │ ├── MissingValues (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── MissingValues (function)* │ │ ├── MissingValuesBarPlot (module) -│ │ │ ├── MissingValuesBarPlot (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── go (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── MissingValuesBarPlot (function)* │ │ ├── MutualInformation (module) -│ │ │ ├── MutualInformation (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── go (alias) -│ │ │ ├── mutual_info_classif (alias) -│ │ │ ├── mutual_info_regression (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── MutualInformation (function)* │ │ ├── PearsonCorrelationMatrix (module) -│ │ │ ├── PearsonCorrelationMatrix (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── go (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── PearsonCorrelationMatrix (function)* │ │ ├── PhillipsPerronArch (module) -│ │ │ ├── LinAlgError (alias) -│ │ │ ├── PhillipsPerron (alias) -│ │ │ ├── PhillipsPerronArch (function) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── get_logger (alias) -│ │ │ ├── np (None) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── PhillipsPerronArch (function)* │ │ ├── ProtectedClassesCombination (module) -│ │ │ ├── MetricFrame (alias) -│ │ │ ├── MissingDependencyError (alias) -│ │ │ ├── ProtectedClassesCombination (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── count (alias) -│ │ │ ├── demographic_parity_ratio (alias) -│ │ │ ├── equalized_odds_ratio (alias) -│ │ │ ├── false_positive_rate (alias) -│ │ │ ├── get_logger (alias) -│ │ │ ├── go (alias) -│ │ │ ├── pd (None) -│ │ │ ├── selection_rate (alias) -│ │ │ ├── sp (alias) -│ │ │ ├── sys (None) -│ │ │ ├── tags (alias) -│ │ │ ├── tasks (alias) -│ │ │ └── true_positive_rate (alias) +│ │ │ └── ProtectedClassesCombination (function)* │ │ ├── ProtectedClassesDescription (module) -│ │ │ ├── ProtectedClassesDescription (function) -│ │ │ ├── get_logger (alias) -│ │ │ ├── go (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── ProtectedClassesDescription (function)* │ │ ├── ProtectedClassesDisparity (module) -│ │ │ ├── Bias (alias) -│ │ │ ├── Group (alias) -│ │ │ ├── MissingDependencyError (alias) -│ │ │ ├── Plot (alias) -│ │ │ ├── ProtectedClassesDisparity (function) -│ │ │ ├── ap (alias) -│ │ │ ├── get_logger (alias) -│ │ │ ├── io (None) -│ │ │ ├── pd (None) -│ │ │ ├── sys (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── ProtectedClassesDisparity (function)* │ │ ├── ProtectedClassesThresholdOptimizer (module) -│ │ │ ├── MetricFrame (alias) -│ │ │ ├── MissingDependencyError (alias) -│ │ │ ├── ProtectedClassesThresholdOptimizer (function) -│ │ │ ├── ThresholdOptimizer (alias) +│ │ │ ├── ProtectedClassesThresholdOptimizer (function)* │ │ │ ├── calculate_fairness_metrics (function) │ │ │ ├── calculate_group_metrics (function) -│ │ │ ├── count (alias) -│ │ │ ├── demographic_parity_ratio (alias) -│ │ │ ├── equalized_odds_ratio (alias) -│ │ │ ├── false_negative_rate (alias) -│ │ │ ├── false_positive_rate (alias) -│ │ │ ├── get_logger (alias) │ │ │ ├── get_thresholds_by_group (function) │ │ │ ├── initialize_and_fit_optimizer (function) -│ │ │ ├── json (None) │ │ │ ├── make_predictions (function) -│ │ │ ├── pd (None) -│ │ │ ├── plot_threshold_optimizer (alias) -│ │ │ ├── plot_thresholds (function) -│ │ │ ├── plt (alias) -│ │ │ ├── sys (None) -│ │ │ ├── tags (alias) -│ │ │ ├── tasks (alias) -│ │ │ └── true_positive_rate (alias) +│ │ │ └── plot_thresholds (function) │ │ ├── RollingStatsPlot (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── RollingStatsPlot (function) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── pd (None) -│ │ │ ├── plot_rolling_statistics (function) -│ │ │ ├── plt (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ ├── RollingStatsPlot (function)* +│ │ │ └── plot_rolling_statistics (function) │ │ ├── RunsTest (module) -│ │ │ ├── RunsTest (function) -│ │ │ ├── pd (None) -│ │ │ ├── runstest_1samp (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── RunsTest (function)* │ │ ├── ScatterPlot (module) -│ │ │ ├── ScatterPlot (function) -│ │ │ ├── plt (alias) -│ │ │ ├── sns (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── ScatterPlot (function)* │ │ ├── ScoreBandDefaultRates (module) -│ │ │ ├── ScoreBandDefaultRates (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── VMModel (alias) -│ │ │ ├── np (None) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── ScoreBandDefaultRates (function)* │ │ ├── SeasonalDecompose (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── SeasonalDecompose (function) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── get_logger (alias) -│ │ │ ├── go (alias) -│ │ │ ├── make_subplots (alias) -│ │ │ ├── np (None) -│ │ │ ├── pd (None) -│ │ │ ├── seasonal_decompose (alias) -│ │ │ ├── stats (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── SeasonalDecompose (function)* │ │ ├── ShapiroWilk (module) -│ │ │ ├── ShapiroWilk (function) -│ │ │ ├── pd (None) -│ │ │ ├── stats (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── ShapiroWilk (function)* │ │ ├── Skewness (module) -│ │ │ ├── ProfilingTypeSet (alias) -│ │ │ ├── Settings (alias) -│ │ │ ├── Skewness (function) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── Skewness (function)* │ │ ├── SpreadPlot (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── SpreadPlot (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── pd (None) -│ │ │ ├── plt (alias) -│ │ │ ├── sns (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── SpreadPlot (function)* │ │ ├── TabularCategoricalBarPlots (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── TabularCategoricalBarPlots (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── go (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── TabularCategoricalBarPlots (function)* │ │ ├── TabularDateTimeHistograms (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── TabularDateTimeHistograms (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── go (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── TabularDateTimeHistograms (function)* │ │ ├── TabularDescriptionTables (module) -│ │ │ ├── TabularDescriptionTables (function) +│ │ │ ├── TabularDescriptionTables (function)* │ │ │ ├── get_categorical_columns (function) │ │ │ ├── get_datetime_columns (function) │ │ │ ├── get_numerical_columns (function) │ │ │ ├── get_summary_statistics_categorical (function) │ │ │ ├── get_summary_statistics_datetime (function) -│ │ │ ├── get_summary_statistics_numerical (function) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── get_summary_statistics_numerical (function) │ │ ├── TabularNumericalHistograms (module) -│ │ │ ├── TabularNumericalHistograms (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── go (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── TabularNumericalHistograms (function)* │ │ ├── TargetRateBarPlots (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── TargetRateBarPlots (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── go (alias) -│ │ │ ├── make_subplots (alias) -│ │ │ ├── np (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── TargetRateBarPlots (function)* │ │ ├── TimeSeriesDescription (module) -│ │ │ ├── TimeSeriesDescription (function) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── TimeSeriesDescription (function)* │ │ ├── TimeSeriesDescriptiveStatistics (module) -│ │ │ ├── TimeSeriesDescriptiveStatistics (function) -│ │ │ ├── kurtosis (alias) -│ │ │ ├── pd (None) -│ │ │ ├── skew (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── TimeSeriesDescriptiveStatistics (function)* │ │ ├── TimeSeriesFrequency (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── TimeSeriesFrequency (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── go (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── TimeSeriesFrequency (function)* │ │ ├── TimeSeriesHistogram (module) -│ │ │ ├── TimeSeriesHistogram (function) -│ │ │ ├── get_logger (alias) -│ │ │ ├── pd (None) -│ │ │ ├── px (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── TimeSeriesHistogram (function)* │ │ ├── TimeSeriesLinePlot (module) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── TimeSeriesLinePlot (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── go (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── TimeSeriesLinePlot (function)* │ │ ├── TimeSeriesMissingValues (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── TimeSeriesMissingValues (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── ff (alias) -│ │ │ ├── pd (None) -│ │ │ ├── px (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── TimeSeriesMissingValues (function)* │ │ ├── TimeSeriesOutliers (module) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── TimeSeriesOutliers (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── go (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── TimeSeriesOutliers (function)* │ │ ├── TooManyZeroValues (module) -│ │ │ ├── TooManyZeroValues (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── TooManyZeroValues (function)* │ │ ├── UniqueRows (module) -│ │ │ ├── UniqueRows (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── UniqueRows (function)* │ │ ├── WOEBinPlots (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── WOEBinPlots (function) -│ │ │ ├── get_logger (alias) -│ │ │ ├── go (alias) -│ │ │ ├── make_subplots (alias) -│ │ │ ├── np (None) -│ │ │ ├── pd (None) -│ │ │ ├── px (alias) -│ │ │ ├── sc (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── WOEBinPlots (function)* │ │ ├── WOEBinTable (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── WOEBinTable (function) -│ │ │ ├── pd (None) -│ │ │ ├── sc (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── WOEBinTable (function)* │ │ ├── ZivotAndrewsArch (module) -│ │ │ ├── LinAlgError (alias) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── ZivotAndrews (alias) -│ │ │ ├── ZivotAndrewsArch (function) -│ │ │ ├── get_logger (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── ZivotAndrewsArch (function)* │ │ └── nlp (module) │ │ ├── CommonWords (module) -│ │ │ ├── CommonWords (function) -│ │ │ ├── Counter (alias) -│ │ │ ├── RawData (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── go (alias) -│ │ │ ├── nltk (None) -│ │ │ ├── stopwords (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── CommonWords (function)* │ │ ├── Hashtags (module) -│ │ │ ├── Hashtags (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── go (alias) -│ │ │ ├── re (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── Hashtags (function)* │ │ ├── LanguageDetection (module) -│ │ │ ├── LangDetectException (alias) -│ │ │ ├── LanguageDetection (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── detect (alias) -│ │ │ ├── px (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── LanguageDetection (function)* │ │ ├── Mentions (module) -│ │ │ ├── Mentions (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── pd (None) -│ │ │ ├── px (alias) -│ │ │ ├── re (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── Mentions (function)* │ │ ├── PolarityAndSubjectivity (module) -│ │ │ ├── PolarityAndSubjectivity (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── TextBlob (alias) -│ │ │ ├── pd (None) -│ │ │ ├── px (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) -│ │ ├── Punctuations (module) -│ │ │ ├── Punctuations (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── defaultdict (alias) -│ │ │ ├── go (alias) -│ │ │ ├── string (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── PolarityAndSubjectivity (function)* +│ │ ├── Punctuations (module)* +│ │ │ └── Punctuations (function)* │ │ ├── Sentiment (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── Sentiment (function) -│ │ │ ├── SentimentIntensityAnalyzer (alias) -│ │ │ ├── nltk (None) -│ │ │ ├── plt (alias) -│ │ │ ├── sns (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) -│ │ ├── StopWords (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── StopWords (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── defaultdict (alias) -│ │ │ ├── go (alias) -│ │ │ ├── nltk (None) -│ │ │ ├── pd (None) -│ │ │ ├── stopwords (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── Sentiment (function)* +│ │ ├── StopWords (module)* +│ │ │ └── StopWords (function)* │ │ ├── TextDescription (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── TextDescription (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── create_metrics_df (function) -│ │ │ ├── nltk (None) -│ │ │ ├── pd (None) -│ │ │ ├── px (alias) -│ │ │ ├── stopwords (alias) -│ │ │ ├── string (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ ├── TextDescription (function)* +│ │ │ └── create_metrics_df (function) │ │ └── Toxicity (module) -│ │ ├── RawData (alias) -│ │ ├── Toxicity (function) -│ │ ├── evaluate (None) -│ │ ├── plt (alias) -│ │ ├── sns (None) -│ │ ├── tags (alias) -│ │ └── tasks (alias) -│ ├── decorator (module) -│ │ ├── get_logger (alias) -│ │ ├── inspect (None) -│ │ ├── load_test (alias) -│ │ ├── os (None) -│ │ ├── tags (function) -│ │ ├── tasks (function) -│ │ ├── test (function) -│ │ ├── test_store (alias) -│ │ └── wraps (alias) -│ ├── describe_test (alias) -│ ├── get_logger (alias) -│ ├── list_tags (alias) -│ ├── list_tasks (alias) -│ ├── list_tasks_and_tags (alias) -│ ├── list_tests (alias) -│ ├── load (module) -│ │ ├── Accordion (alias) -│ │ ├── HTML (alias) -│ │ ├── List (alias) -│ │ ├── LoadTestError (alias) -│ │ ├── MissingDependencyError (alias) -│ │ ├── TestID (alias) -│ │ ├── VMDataset (alias) -│ │ ├── VMModel (alias) -│ │ ├── describe_test (function) -│ │ ├── display (alias) -│ │ ├── format_dataframe (alias) -│ │ ├── fuzzy_match (alias) -│ │ ├── get_logger (alias) -│ │ ├── inspect (None) -│ │ ├── json (None) -│ │ ├── list_tags (function) -│ │ ├── list_tasks (function) -│ │ ├── list_tasks_and_tags (function) -│ │ ├── list_tests (function) -│ │ ├── load_test (function) -│ │ ├── md_to_html (alias) -│ │ ├── pd (None) -│ │ ├── pformat (alias) -│ │ ├── test_content_block_html (alias) -│ │ ├── test_id_to_name (alias) -│ │ ├── test_provider_store (alias) -│ │ ├── test_store (alias) -│ │ └── uuid4 (alias) -│ ├── load_test (alias) +│ │ └── Toxicity (function)* +│ ├── decorator (module)* +│ │ ├── tags (function)* +│ │ ├── tasks (function)* +│ │ └── test (function)* +│ ├── load (module)* +│ │ ├── describe_test (function)* +│ │ ├── list_tags (function)* +│ │ ├── list_tasks (function)* +│ │ ├── list_tasks_and_tags (function)* +│ │ ├── list_tests (function)* +│ │ └── load_test (function)* │ ├── model_validation (module) │ │ ├── BertScore (module) -│ │ │ ├── BertScore (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── evaluate (None) -│ │ │ ├── go (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ ├── tasks (alias) -│ │ │ └── validate_prediction (alias) +│ │ │ └── BertScore (function)* │ │ ├── BleuScore (module) -│ │ │ ├── BleuScore (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── evaluate (None) -│ │ │ ├── go (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ ├── tasks (alias) -│ │ │ └── validate_prediction (alias) +│ │ │ └── BleuScore (function)* │ │ ├── ClusterSizeDistribution (module) -│ │ │ ├── ClusterSizeDistribution (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── VMModel (alias) -│ │ │ ├── go (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── ClusterSizeDistribution (function)* │ │ ├── ContextualRecall (module) -│ │ │ ├── ContextualRecall (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── go (alias) -│ │ │ ├── nltk (None) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ ├── tasks (alias) -│ │ │ └── validate_prediction (alias) +│ │ │ └── ContextualRecall (function)* │ │ ├── FeaturesAUC (module) -│ │ │ ├── FeaturesAUC (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── get_logger (alias) -│ │ │ ├── go (alias) -│ │ │ ├── np (None) -│ │ │ ├── pd (None) -│ │ │ ├── roc_auc_score (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── FeaturesAUC (function)* │ │ ├── MeteorScore (module) -│ │ │ ├── MeteorScore (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── evaluate (None) -│ │ │ ├── go (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ ├── tasks (alias) -│ │ │ └── validate_prediction (alias) +│ │ │ └── MeteorScore (function)* │ │ ├── ModelMetadata (module) -│ │ │ ├── ModelMetadata (function) -│ │ │ ├── get_model_info (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── ModelMetadata (function)* │ │ ├── ModelPredictionResiduals (module) -│ │ │ ├── ModelPredictionResiduals (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── go (alias) -│ │ │ ├── kstest (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── ModelPredictionResiduals (function)* │ │ ├── RegardScore (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── RegardScore (function) -│ │ │ ├── evaluate (None) -│ │ │ ├── go (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ ├── tasks (alias) -│ │ │ └── validate_prediction (alias) +│ │ │ └── RegardScore (function)* │ │ ├── RegressionResidualsPlot (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── RegressionResidualsPlot (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── VMModel (alias) -│ │ │ ├── ff (alias) -│ │ │ ├── go (alias) -│ │ │ ├── np (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── RegressionResidualsPlot (function)* │ │ ├── RougeScore (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── Rouge (alias) -│ │ │ ├── RougeScore (function) -│ │ │ ├── go (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── RougeScore (function)* │ │ ├── TimeSeriesPredictionWithCI (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── TimeSeriesPredictionWithCI (function) -│ │ │ ├── go (alias) -│ │ │ ├── norm (alias) -│ │ │ ├── np (None) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── TimeSeriesPredictionWithCI (function)* │ │ ├── TimeSeriesPredictionsPlot (module) -│ │ │ ├── TimeSeriesPredictionsPlot (function) -│ │ │ ├── go (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── TimeSeriesPredictionsPlot (function)* │ │ ├── TimeSeriesR2SquareBySegments (module) -│ │ │ ├── TimeSeriesR2SquareBySegments (function) -│ │ │ ├── metrics (alias) -│ │ │ ├── pd (None) -│ │ │ ├── px (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── TimeSeriesR2SquareBySegments (function)* │ │ ├── TokenDisparity (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── TokenDisparity (function) -│ │ │ ├── go (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── TokenDisparity (function)* │ │ ├── ToxicityScore (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── ToxicityScore (function) -│ │ │ ├── evaluate (None) -│ │ │ ├── go (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── ToxicityScore (function)* │ │ ├── sklearn (module) │ │ │ ├── AdjustedMutualInformation (module) -│ │ │ │ ├── AdjustedMutualInformation (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── adjusted_mutual_info_score (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── AdjustedMutualInformation (function)* │ │ │ ├── AdjustedRandIndex (module) -│ │ │ │ ├── AdjustedRandIndex (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── adjusted_rand_score (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── AdjustedRandIndex (function)* │ │ │ ├── CalibrationCurve (module) -│ │ │ │ ├── CalibrationCurve (function) -│ │ │ │ ├── RawData (alias) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── calibration_curve (alias) -│ │ │ │ ├── go (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── CalibrationCurve (function)* │ │ │ ├── ClassifierPerformance (module) -│ │ │ │ ├── ClassifierPerformance (function) -│ │ │ │ ├── LabelBinarizer (alias) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── classification_report (alias) -│ │ │ │ ├── multiclass_roc_auc_score (function) -│ │ │ │ ├── np (None) -│ │ │ │ ├── roc_auc_score (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ ├── ClassifierPerformance (function)* +│ │ │ │ └── multiclass_roc_auc_score (function) │ │ │ ├── ClassifierThresholdOptimization (module) -│ │ │ │ ├── ClassifierThresholdOptimization (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── confusion_matrix (alias) -│ │ │ │ ├── find_optimal_threshold (function) -│ │ │ │ ├── go (alias) -│ │ │ │ ├── make_subplots (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── pd (None) -│ │ │ │ ├── precision_recall_curve (alias) -│ │ │ │ ├── roc_curve (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ ├── ClassifierThresholdOptimization (function)* +│ │ │ │ └── find_optimal_threshold (function)* │ │ │ ├── ClusterCosineSimilarity (module) -│ │ │ │ ├── ClusterCosineSimilarity (function) -│ │ │ │ ├── RawData (alias) -│ │ │ │ ├── SkipTestError (alias) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── cosine_similarity (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── ClusterCosineSimilarity (function)* │ │ │ ├── ClusterPerformanceMetrics (module) -│ │ │ │ ├── ClusterPerformanceMetrics (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── adjusted_mutual_info_score (alias) -│ │ │ │ ├── adjusted_rand_score (alias) -│ │ │ │ ├── completeness_score (alias) -│ │ │ │ ├── fowlkes_mallows_score (alias) -│ │ │ │ ├── homogeneity_score (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ ├── tasks (alias) -│ │ │ │ └── v_measure_score (alias) +│ │ │ │ └── ClusterPerformanceMetrics (function)* │ │ │ ├── CompletenessScore (module) -│ │ │ │ ├── CompletenessScore (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── completeness_score (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── CompletenessScore (function)* │ │ │ ├── ConfusionMatrix (module) -│ │ │ │ ├── ConfusionMatrix (function) -│ │ │ │ ├── RawData (alias) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── confusion_matrix (alias) -│ │ │ │ ├── ff (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── ConfusionMatrix (function)* │ │ │ ├── FeatureImportance (module) -│ │ │ │ ├── FeatureImportance (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── pd (None) -│ │ │ │ ├── permutation_importance (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── FeatureImportance (function)* │ │ │ ├── FowlkesMallowsScore (module) -│ │ │ │ ├── FowlkesMallowsScore (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── metrics (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── FowlkesMallowsScore (function)* │ │ │ ├── HomogeneityScore (module) -│ │ │ │ ├── HomogeneityScore (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── metrics (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── HomogeneityScore (function)* │ │ │ ├── HyperParametersTuning (module) -│ │ │ │ ├── Dict (alias) -│ │ │ │ ├── GridSearchCV (alias) -│ │ │ │ ├── HyperParametersTuning (function) -│ │ │ │ ├── List (alias) -│ │ │ │ ├── Union (alias) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── custom_recall (function) -│ │ │ │ ├── make_scorer (alias) -│ │ │ │ ├── recall_score (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ ├── HyperParametersTuning (function)* +│ │ │ │ └── custom_recall (function) │ │ │ ├── KMeansClustersOptimization (module) -│ │ │ │ ├── KMeansClustersOptimization (function) -│ │ │ │ ├── List (alias) -│ │ │ │ ├── RawData (alias) -│ │ │ │ ├── SkipTestError (alias) -│ │ │ │ ├── Union (alias) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── cdist (alias) -│ │ │ │ ├── clone (alias) -│ │ │ │ ├── go (alias) -│ │ │ │ ├── make_subplots (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── silhouette_score (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── KMeansClustersOptimization (function)* │ │ │ ├── MinimumAccuracy (module) -│ │ │ │ ├── MinimumAccuracy (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── accuracy_score (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── MinimumAccuracy (function)* │ │ │ ├── MinimumF1Score (module) -│ │ │ │ ├── MinimumF1Score (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── f1_score (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── MinimumF1Score (function)* │ │ │ ├── MinimumROCAUCScore (module) -│ │ │ │ ├── LabelBinarizer (alias) -│ │ │ │ ├── MinimumROCAUCScore (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── roc_auc_score (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── MinimumROCAUCScore (function)* │ │ │ ├── ModelParameters (module) -│ │ │ │ ├── ModelParameters (function) -│ │ │ │ ├── pd (None) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── ModelParameters (function)* │ │ │ ├── ModelsPerformanceComparison (module) -│ │ │ │ ├── ModelsPerformanceComparison (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── classification_report (alias) -│ │ │ │ ├── multiclass_roc_auc_score (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── ModelsPerformanceComparison (function)* │ │ │ ├── OverfitDiagnosis (module) -│ │ │ │ ├── List (alias) -│ │ │ │ ├── OverfitDiagnosis (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── get_logger (alias) -│ │ │ │ ├── metrics (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── pd (None) -│ │ │ │ ├── plt (alias) -│ │ │ │ ├── sns (None) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── OverfitDiagnosis (function)* │ │ │ ├── PermutationFeatureImportance (module) -│ │ │ │ ├── PermutationFeatureImportance (function) -│ │ │ │ ├── RawData (alias) -│ │ │ │ ├── SkipTestError (alias) -│ │ │ │ ├── Union (alias) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── get_logger (alias) -│ │ │ │ ├── go (alias) -│ │ │ │ ├── permutation_importance (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── PermutationFeatureImportance (function)* │ │ │ ├── PopulationStabilityIndex (module) -│ │ │ │ ├── List (alias) -│ │ │ │ ├── PopulationStabilityIndex (function) -│ │ │ │ ├── RawData (alias) -│ │ │ │ ├── SkipTestError (alias) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── calculate_psi (function) -│ │ │ │ ├── get_logger (alias) -│ │ │ │ ├── go (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── pd (None) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ ├── PopulationStabilityIndex (function)* +│ │ │ │ └── calculate_psi (function)* │ │ │ ├── PrecisionRecallCurve (module) -│ │ │ │ ├── FoundationModel (alias) -│ │ │ │ ├── PrecisionRecallCurve (function) -│ │ │ │ ├── RawData (alias) -│ │ │ │ ├── SkipTestError (alias) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── go (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── precision_recall_curve (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── PrecisionRecallCurve (function)* │ │ │ ├── ROCCurve (module) -│ │ │ │ ├── ROCCurve (function) -│ │ │ │ ├── RawData (alias) -│ │ │ │ ├── SkipTestError (alias) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── go (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── roc_auc_score (alias) -│ │ │ │ ├── roc_curve (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── ROCCurve (function)* │ │ │ ├── RegressionErrors (module) -│ │ │ │ ├── RegressionErrors (function) -│ │ │ │ ├── metrics (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── pd (None) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── RegressionErrors (function)* │ │ │ ├── RegressionErrorsComparison (module) -│ │ │ │ ├── RegressionErrorsComparison (function) -│ │ │ │ ├── get_logger (alias) -│ │ │ │ ├── metrics (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── pd (None) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── RegressionErrorsComparison (function)* │ │ │ ├── RegressionPerformance (module) -│ │ │ │ ├── RegressionPerformance (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── get_logger (alias) -│ │ │ │ ├── mean_absolute_error (alias) -│ │ │ │ ├── mean_squared_error (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── RegressionPerformance (function)* │ │ │ ├── RegressionR2Square (module) -│ │ │ │ ├── RegressionR2Square (function) -│ │ │ │ ├── adj_r2_score (alias) -│ │ │ │ ├── metrics (alias) -│ │ │ │ ├── pd (None) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── RegressionR2Square (function)* │ │ │ ├── RegressionR2SquareComparison (module) -│ │ │ │ ├── RegressionR2SquareComparison (function) -│ │ │ │ ├── adj_r2_score (alias) -│ │ │ │ ├── metrics (alias) -│ │ │ │ ├── pd (None) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── RegressionR2SquareComparison (function)* │ │ │ ├── RobustnessDiagnosis (module) -│ │ │ │ ├── List (alias) -│ │ │ │ ├── MissingOrInvalidModelPredictFnError (alias) -│ │ │ │ ├── RobustnessDiagnosis (function) -│ │ │ │ ├── Tuple (alias) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── add (alias) -│ │ │ │ ├── defaultdict (alias) -│ │ │ │ ├── get_logger (alias) -│ │ │ │ ├── go (alias) -│ │ │ │ ├── metrics (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── pd (None) -│ │ │ │ ├── sns (None) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── RobustnessDiagnosis (function)* │ │ │ ├── SHAPGlobalImportance (module) -│ │ │ │ ├── CatBoostModel (alias) -│ │ │ │ ├── RawData (alias) -│ │ │ │ ├── SHAPGlobalImportance (function) -│ │ │ │ ├── SKlearnModel (alias) -│ │ │ │ ├── StatsModelsModel (alias) -│ │ │ │ ├── UnsupportedModelForSHAPError (alias) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── generate_shap_plot (function) -│ │ │ │ ├── get_logger (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── plt (alias) -│ │ │ │ ├── select_shap_values (function) -│ │ │ │ ├── shap (None) -│ │ │ │ ├── tags (alias) -│ │ │ │ ├── tasks (alias) -│ │ │ │ └── warnings (None) +│ │ │ │ ├── SHAPGlobalImportance (function)* +│ │ │ │ ├── generate_shap_plot (function)* +│ │ │ │ └── select_shap_values (function)* │ │ │ ├── ScoreProbabilityAlignment (module) -│ │ │ │ ├── ScoreProbabilityAlignment (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── go (alias) -│ │ │ │ ├── pd (None) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── ScoreProbabilityAlignment (function)* │ │ │ ├── SilhouettePlot (module) -│ │ │ │ ├── RawData (alias) -│ │ │ │ ├── SilhouettePlot (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── np (None) -│ │ │ │ ├── plt (alias) -│ │ │ │ ├── silhouette_samples (alias) -│ │ │ │ ├── silhouette_score (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── SilhouettePlot (function)* │ │ │ ├── TrainingTestDegradation (module) -│ │ │ │ ├── List (alias) -│ │ │ │ ├── RawData (alias) -│ │ │ │ ├── TrainingTestDegradation (function) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── classification_report (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ ├── tasks (alias) -│ │ │ │ └── unique (alias) +│ │ │ │ └── TrainingTestDegradation (function)* │ │ │ ├── VMeasure (module) -│ │ │ │ ├── VMDataset (alias) -│ │ │ │ ├── VMModel (alias) -│ │ │ │ ├── VMeasure (function) -│ │ │ │ ├── metrics (alias) -│ │ │ │ ├── tags (alias) -│ │ │ │ └── tasks (alias) +│ │ │ │ └── VMeasure (function)* │ │ │ └── WeakspotsDiagnosis (module) -│ │ │ ├── Callable (alias) -│ │ │ ├── Dict (alias) -│ │ │ ├── List (alias) -│ │ │ ├── Tuple (alias) -│ │ │ ├── Union (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── VMModel (alias) -│ │ │ ├── WeakspotsDiagnosis (function) -│ │ │ ├── metrics (alias) -│ │ │ ├── pd (None) -│ │ │ ├── plt (alias) -│ │ │ ├── sns (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── WeakspotsDiagnosis (function)* │ │ └── statsmodels (module) │ │ ├── AutoARIMA (module) -│ │ │ ├── ARIMA (alias) -│ │ │ ├── AutoARIMA (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── VMModel (alias) -│ │ │ ├── adfuller (alias) -│ │ │ ├── get_logger (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── AutoARIMA (function)* │ │ ├── CumulativePredictionProbabilities (module) -│ │ │ ├── CumulativePredictionProbabilities (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── cm (alias) -│ │ │ ├── go (alias) -│ │ │ ├── np (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── CumulativePredictionProbabilities (function)* │ │ ├── DurbinWatsonTest (module) -│ │ │ ├── DurbinWatsonTest (function) -│ │ │ ├── durbin_watson (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── DurbinWatsonTest (function)* │ │ ├── GINITable (module) -│ │ │ ├── GINITable (function) -│ │ │ ├── np (None) -│ │ │ ├── pd (None) -│ │ │ ├── roc_auc_score (alias) -│ │ │ ├── roc_curve (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── GINITable (function)* │ │ ├── KolmogorovSmirnov (module) -│ │ │ ├── InvalidTestParametersError (alias) -│ │ │ ├── KolmogorovSmirnov (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── VMModel (alias) -│ │ │ ├── kstest_normal (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── KolmogorovSmirnov (function)* │ │ ├── Lilliefors (module) -│ │ │ ├── Lilliefors (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── lilliefors (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── Lilliefors (function)* │ │ ├── PredictionProbabilitiesHistogram (module) -│ │ │ ├── PredictionProbabilitiesHistogram (function) -│ │ │ ├── cm (alias) -│ │ │ ├── go (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── PredictionProbabilitiesHistogram (function)* │ │ ├── RegressionCoeffs (module) -│ │ │ ├── RegressionCoeffs (function) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── go (alias) -│ │ │ ├── pd (None) -│ │ │ ├── stats (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── RegressionCoeffs (function)* │ │ ├── RegressionFeatureSignificance (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── RegressionFeatureSignificance (function) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── VMModel (alias) -│ │ │ ├── get_logger (alias) -│ │ │ ├── plt (alias) -│ │ │ ├── sns (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── RegressionFeatureSignificance (function)* │ │ ├── RegressionModelForecastPlot (module) -│ │ │ ├── RegressionModelForecastPlot (function) -│ │ │ ├── Union (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── VMModel (alias) -│ │ │ ├── get_logger (alias) -│ │ │ ├── pd (None) -│ │ │ ├── plt (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── RegressionModelForecastPlot (function)* │ │ ├── RegressionModelForecastPlotLevels (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── RegressionModelForecastPlotLevels (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── VMModel (alias) -│ │ │ ├── integrate_diff (function) -│ │ │ ├── np (None) -│ │ │ ├── pd (None) -│ │ │ ├── plt (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ ├── RegressionModelForecastPlotLevels (function)* +│ │ │ └── integrate_diff (function) │ │ ├── RegressionModelSensitivityPlot (module) -│ │ │ ├── List (alias) -│ │ │ ├── RawData (alias) -│ │ │ ├── RegressionModelSensitivityPlot (function) -│ │ │ ├── Union (alias) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── VMModel (alias) -│ │ │ ├── get_logger (alias) -│ │ │ ├── integrate_diff (function) -│ │ │ ├── np (None) -│ │ │ ├── plt (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ ├── RegressionModelSensitivityPlot (function)* +│ │ │ └── integrate_diff (function) │ │ ├── RegressionModelSummary (module) -│ │ │ ├── RegressionModelSummary (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── VMModel (alias) -│ │ │ ├── adj_r2_score (alias) -│ │ │ ├── mean_squared_error (alias) -│ │ │ ├── r2_score (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── RegressionModelSummary (function)* │ │ ├── RegressionPermutationFeatureImportance (module) -│ │ │ ├── RawData (alias) -│ │ │ ├── RegressionPermutationFeatureImportance (function) -│ │ │ ├── VMDataset (alias) -│ │ │ ├── VMModel (alias) -│ │ │ ├── check_random_state (alias) -│ │ │ ├── get_logger (alias) -│ │ │ ├── go (alias) -│ │ │ ├── np (None) -│ │ │ ├── pd (None) -│ │ │ ├── r2_score (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── RegressionPermutationFeatureImportance (function)* │ │ ├── ScorecardHistogram (module) -│ │ │ ├── ScorecardHistogram (function) -│ │ │ ├── cm (alias) -│ │ │ ├── go (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── ScorecardHistogram (function)* │ │ └── statsutils (module) -│ │ ├── adj_r2_score (function) -│ │ ├── np (None) -│ │ └── r2_score (alias) +│ │ └── adj_r2_score (function)* │ ├── output (module) -│ │ ├── ABC (alias) -│ │ ├── Any (alias) │ │ ├── BooleanOutputHandler (class) │ │ │ ├── can_handle (function) │ │ │ └── process (function) -│ │ ├── Dict (alias) -│ │ ├── Figure (alias) │ │ ├── FigureOutputHandler (class) │ │ │ ├── can_handle (function) │ │ │ └── process (function) -│ │ ├── List (alias) │ │ ├── MetricOutputHandler (class) │ │ │ ├── can_handle (function) │ │ │ └── process (function) -│ │ ├── OutputHandler (class) -│ │ │ ├── can_handle (function) -│ │ │ └── process (function) -│ │ ├── RawData (alias) +│ │ ├── OutputHandler (class)* +│ │ │ ├── can_handle (function)* +│ │ │ └── process (function)* │ │ ├── RawDataOutputHandler (class) │ │ │ ├── can_handle (function) │ │ │ └── process (function) -│ │ ├── ResultTable (alias) │ │ ├── TableOutputHandler (class) │ │ │ ├── can_handle (function) │ │ │ └── process (function) -│ │ ├── TestResult (alias) -│ │ ├── Union (alias) -│ │ ├── abstractmethod (alias) -│ │ ├── is_matplotlib_figure (alias) -│ │ ├── is_plotly_figure (alias) -│ │ ├── is_png_image (alias) -│ │ ├── np (None) -│ │ ├── pd (None) -│ │ ├── process_output (function) -│ │ └── uuid4 (alias) +│ │ └── process_output (function)* │ ├── prompt_validation (module) │ │ ├── Bias (module) -│ │ │ ├── Bias (function) -│ │ │ ├── MissingRequiredTestInputError (alias) -│ │ │ ├── RawData (alias) -│ │ │ ├── call_model (alias) -│ │ │ ├── get_explanation (alias) -│ │ │ ├── get_score (alias) -│ │ │ ├── missing_prompt_message (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── Bias (function)* │ │ ├── Clarity (module) -│ │ │ ├── Clarity (function) -│ │ │ ├── MissingRequiredTestInputError (alias) -│ │ │ ├── RawData (alias) -│ │ │ ├── call_model (alias) -│ │ │ ├── get_explanation (alias) -│ │ │ ├── get_score (alias) -│ │ │ ├── missing_prompt_message (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── Clarity (function)* │ │ ├── Conciseness (module) -│ │ │ ├── Conciseness (function) -│ │ │ ├── MissingRequiredTestInputError (alias) -│ │ │ ├── RawData (alias) -│ │ │ ├── call_model (alias) -│ │ │ ├── get_explanation (alias) -│ │ │ ├── get_score (alias) -│ │ │ ├── missing_prompt_message (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── Conciseness (function)* │ │ ├── Delimitation (module) -│ │ │ ├── Delimitation (function) -│ │ │ ├── MissingRequiredTestInputError (alias) -│ │ │ ├── RawData (alias) -│ │ │ ├── call_model (alias) -│ │ │ ├── get_explanation (alias) -│ │ │ ├── get_score (alias) -│ │ │ ├── missing_prompt_message (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── Delimitation (function)* │ │ ├── NegativeInstruction (module) -│ │ │ ├── MissingRequiredTestInputError (alias) -│ │ │ ├── NegativeInstruction (function) -│ │ │ ├── RawData (alias) -│ │ │ ├── call_model (alias) -│ │ │ ├── get_explanation (alias) -│ │ │ ├── get_score (alias) -│ │ │ ├── missing_prompt_message (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── NegativeInstruction (function)* │ │ ├── Robustness (module) -│ │ │ ├── MissingRequiredTestInputError (alias) -│ │ │ ├── RawData (alias) -│ │ │ ├── Robustness (function) -│ │ │ ├── SkipTestError (alias) -│ │ │ ├── call_model (alias) -│ │ │ ├── missing_prompt_message (alias) -│ │ │ ├── pd (None) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── Robustness (function)* │ │ ├── Specificity (module) -│ │ │ ├── MissingRequiredTestInputError (alias) -│ │ │ ├── RawData (alias) -│ │ │ ├── Specificity (function) -│ │ │ ├── call_model (alias) -│ │ │ ├── get_explanation (alias) -│ │ │ ├── get_score (alias) -│ │ │ ├── missing_prompt_message (alias) -│ │ │ ├── tags (alias) -│ │ │ └── tasks (alias) +│ │ │ └── Specificity (function)* │ │ └── ai_powered_test (module) -│ │ ├── call_model (function) -│ │ ├── client_config (alias) -│ │ ├── get_client_and_model (alias) -│ │ ├── get_explanation (function) -│ │ ├── get_score (function) -│ │ └── re (None) -│ ├── register_test_provider (function) +│ │ ├── call_model (function)* +│ │ ├── get_explanation (function)* +│ │ └── get_score (function)* │ ├── run (module) -│ │ ├── Any (alias) -│ │ ├── Callable (alias) -│ │ ├── Dict (alias) -│ │ ├── List (alias) -│ │ ├── MissingRequiredTestInputError (alias) -│ │ ├── Optional (alias) -│ │ ├── TestID (alias) -│ │ ├── TestResult (alias) -│ │ ├── Tuple (alias) -│ │ ├── Union (alias) -│ │ ├── VMInput (alias) -│ │ ├── build_test_result (function) -│ │ ├── combine_results (alias) -│ │ ├── datetime (alias) -│ │ ├── describe_test (alias) -│ │ ├── get_comparison_test_configs (alias) -│ │ ├── get_logger (alias) -│ │ ├── get_result_description (alias) -│ │ ├── getdoc (alias) -│ │ ├── input_registry (alias) -│ │ ├── load_test (alias) -│ │ ├── platform (None) -│ │ ├── pprint (None) +│ │ ├── build_test_result (function)* │ │ ├── print_env (function) -│ │ ├── process_output (alias) -│ │ ├── run_test (function) -│ │ ├── subprocess (None) -│ │ ├── test_id_to_name (alias) -│ │ ├── time (None) -│ │ └── uuid4 (alias) -│ ├── run_test (alias) -│ ├── tags (alias) -│ ├── tasks (alias) -│ ├── test (alias) -│ ├── test_provider_store (alias) +│ │ └── run_test (function)* │ ├── test_providers (module) -│ │ ├── List (alias) -│ │ ├── LocalTestProvider (class) -│ │ │ ├── list_tests (function) -│ │ │ └── load_test (function) -│ │ ├── Path (alias) -│ │ ├── Protocol (alias) -│ │ ├── TestProvider (class) -│ │ │ ├── list_tests (function) -│ │ │ └── load_test (function) -│ │ ├── ValidMindTestProvider (class) -│ │ │ ├── list_tests (function) -│ │ │ └── load_test (function) -│ │ ├── get_logger (alias) -│ │ ├── importlib (None) -│ │ ├── os (None) -│ │ ├── re (None) -│ │ └── sys (None) +│ │ ├── LocalTestProvider (class)* +│ │ │ ├── __init__ (function)* +│ │ │ ├── list_tests (function)* +│ │ │ └── load_test (function)* +│ │ ├── TestProvider (class)* +│ │ │ ├── list_tests (function)* +│ │ │ └── load_test (function)* +│ │ └── ValidMindTestProvider (class)* +│ │ ├── __init__ (function) +│ │ ├── list_tests (function)* +│ │ └── load_test (function)* +│ └── register_test_provider (function)* ├── unit_metrics (module) -│ ├── describe_metric (function) -│ ├── describe_test (alias) -│ ├── list_metrics (function) -│ ├── run_metric (function) -│ ├── run_test (alias) -│ └── test_provider_store (alias) -├── vm_models (module) -│ ├── Figure (alias) -│ ├── ModelAttributes (alias) -│ ├── R_MODEL_TYPES (alias) -│ ├── ResultTable (alias) -│ ├── TestResult (alias) -│ ├── TestSuite (alias) -│ ├── TestSuiteRunner (alias) -│ ├── VMDataset (alias) -│ ├── VMInput (alias) -│ └── VMModel (alias) -└── warnings (None) +│ ├── describe_metric (function)* +│ ├── list_metrics (function)* +│ └── run_metric (function)* +└── vm_models (module)* + ├── dataset (module) + │ └── dataset (module)* + │ ├── DataFrameDataset (class)* + │ │ └── __init__ (function)* + │ ├── PolarsDataset (class)* + │ │ └── __init__ (function)* + │ ├── TorchDataset (class)* + │ │ └── __init__ (function)* + │ └── VMDataset (class)* + │ ├── __init__ (function)* + │ ├── add_extra_column (function)* + │ ├── assign_predictions (function)* + │ ├── prediction_column (function)* + │ ├── probability_column (function)* + │ ├── target_classes (function)* + │ ├── with_options (function)* + │ ├── x_df (function)* + │ ├── y_df (function)* + │ ├── y_pred (function)* + │ ├── y_pred_df (function)* + │ ├── y_prob (function)* + │ └── y_prob_df (function)* + ├── figure (module)* + │ ├── Figure (class)* + │ │ ├── __init__ (function) + │ │ ├── __post_init__ (function) + │ │ ├── serialize (function)* + │ │ ├── serialize_files (function)* + │ │ └── to_widget (function)* + │ ├── create_figure (function)* + │ ├── is_matplotlib_figure (function) + │ ├── is_plotly_figure (function) + │ └── is_png_image (function) + ├── input (module)* + │ └── VMInput (class)* + │ └── with_options (function)* + ├── model (module)* + │ ├── ModelAttributes (class)* + │ │ ├── __init__ (function) + │ │ └── from_dict (function)* + │ ├── ModelPipeline (class)* + │ │ └── __init__ (function) + │ ├── ModelTask (class)* + │ ├── VMModel (class)* + │ │ ├── __init__ (function) + │ │ ├── __post_init__ (function)* + │ │ ├── predict (function)* + │ │ ├── predict_proba (function)* + │ │ └── serialize (function)* + │ ├── get_model_class (function) + │ ├── has_method_with_arguments (function) + │ ├── is_model_metadata (function)* + │ ├── is_pytorch_model (function)* + │ └── model_module (function) + └── result (module) + └── result (module)* + ├── ErrorResult (class)* + │ ├── __init__ (function) + │ ├── log_async (function) + │ └── to_widget (function) + ├── RawData (class)* + │ ├── __init__ (function)* + │ ├── inspect (function)* + │ └── serialize (function) + ├── Result (class)* + │ ├── __init__ (function) + │ ├── log (function)* + │ ├── show (function)* + │ └── to_widget (function)* + ├── ResultTable (class)* + │ ├── __init__ (function) + │ ├── __post_init__ (function) + │ └── serialize (function) + └── TestResult (class)* + ├── __init__ (function) + ├── __post_init__ (function) + ├── add_figure (function)* + ├── add_table (function)* + ├── log (function)* + ├── log_async (function) + ├── remove_figure (function)* + ├── remove_table (function)* + ├── serialize (function)* + └── to_widget (function) diff --git a/scripts/api_tree.py b/scripts/api_tree.py index d3d0b9e15..8589bd5a5 100644 --- a/scripts/api_tree.py +++ b/scripts/api_tree.py @@ -4,17 +4,22 @@ from typing import Any, Dict # Define which kinds of members to show -SHOW_KINDS = {'module', 'class', 'function'} # Base kinds to show +SHOW_KINDS = {'module', 'class', 'function', 'method'} # Modules to skip -SKIP_MODULES = {'utils'} # Add any other modules you want to skip +SKIP_MODULES = {'utils'} def resolve_alias(member: Dict[str, Any], data: Dict[str, Any]) -> Dict[str, Any]: """Resolve an alias to its target member.""" if member.get('kind') == 'alias' and member.get('target_path'): path_parts = member['target_path'].split('.') - current = data - for part in path_parts[1:]: # Skip the first part (validmind) + + # Skip resolution if it's not in our codebase + if path_parts[0] != 'validmind': + return member + + current = data[path_parts[0]] # Start at validmind + for part in path_parts[1:]: if part in current.get('members', {}): current = current['members'][part] else: @@ -22,38 +27,162 @@ def resolve_alias(member: Dict[str, Any], data: Dict[str, Any]) -> Dict[str, Any return current return member +def get_all_members(members: Dict[str, Any]) -> set: + """Extract the __all__ list from a module's members if present.""" + if '__all__' in members: + all_elements = members['__all__'].get('value', {}).get('elements', []) + return {elem.strip("'") for elem in all_elements} + return set() + +def has_docstring(member: Dict[str, Any]) -> bool: + """Check if a member has a docstring.""" + docstring = member.get('docstring', {}) + if isinstance(docstring, dict): + return bool(docstring.get('value')) + return bool(docstring) + +def get_sort_key(item): + """Get sort key for an item tuple (name, member).""" + name, member = item + + # Special case: __version__ should be first + if name == "__version__": + return (0, name) + + kind = member.get('kind', '') + + # Then: + # 1. Aliases (top-level exports) + # 2. Modules + # 3. Everything else alphabetically + if kind == 'alias': + return (1, name) + elif kind == 'module': + return (2, name) + else: + return (3, name) + +def resolve_alias_target(data: Dict[str, Any], target_path: str, visited_paths=None) -> Dict[str, Any]: + """Resolve an alias target to its actual member definition.""" + if not target_path or not target_path.startswith('validmind.'): + return None + + # Prevent infinite recursion with visited paths set + if visited_paths is None: + visited_paths = set() + if target_path in visited_paths: + return None + visited_paths.add(target_path) + + # Split path into parts and remove 'validmind' prefix + parts = target_path.split('.') + if parts[0] != 'validmind': + return None + parts = parts[1:] # Remove 'validmind' prefix + + # Start at root + current = data + for i, part in enumerate(parts): + if part not in current.get('members', {}): + return None + current = current['members'][part] + + # If we found another alias, recursively resolve it + if current.get('kind') == 'alias': + next_target = current.get('target_path') + if next_target: + return resolve_alias_target(data, next_target, visited_paths) + + return current + def print_tree(data: Dict[str, Any], prefix: str = "", is_last: bool = True, is_root: bool = False, full_data: Dict[str, Any] = None) -> None: """Print a tree view of the API structure.""" members = data.get('members', {}) - # Filter items to only show desired kinds - items = [(name, member) for name, member in sorted(members.items()) - if member and (member.get('kind') in SHOW_KINDS or member.get('kind') == 'alias')] + # Get root __all__ if we're at root level + root_all = set() + if is_root and 'validmind' in full_data: + root_module = full_data['validmind'] + root_all = set(get_all_members(root_module.get('members', {}))) - for i, (name, member) in enumerate(items): - if name == '__all__': + # Get module-level __all__ members + all_members = set(get_all_members(members)) + + # Filter and sort items + items = [] + for name, member in sorted(members.items()): + if not member or member.get('kind') is None: continue # Skip private members and utils module - if name.startswith('_') or name in SKIP_MODULES: + if name.startswith('_') and name not in {'__init__', '__post_init__'}: continue - + + if name in SKIP_MODULES: + continue + + # At root level, only show items from __all__ + if is_root: + if name not in root_all: + continue + items.append((name, member)) + continue + + # Handle aliases + if member.get('kind') == 'alias': + # Keep aliases only if they're in __all__ + if name not in all_members: + continue + # Skip external library imports + target_path = member.get('target_path', '') + if not target_path.startswith('validmind.'): + continue + + # Show only modules, classes, functions in __all__ (if present) + kind = member.get('kind', 'unknown') + if kind == 'module' or kind == 'class' or ( + kind in SHOW_KINDS and (name in all_members or not all_members) + ): + items.append((name, member)) + + # Sort items using custom sort key + items.sort(key=get_sort_key) + + # Print items + for i, (name, member) in enumerate(items): is_last_item = i == len(items) - 1 + kind = member.get('kind', 'unknown') - # Resolve alias before getting kind and members - resolved_member = resolve_alias(member, full_data) - kind = resolved_member.get('kind') if resolved_member else 'unknown' - - # Create the branch symbol + # Create branch symbol branch = "└── " if is_last_item else "├── " - # Print the current item - print(f"{prefix}{branch}{name} ({kind})") + # For aliases, check both alias and target docstrings + docstring_marker = "" + if kind == 'alias' and full_data: + # Check if either the alias or its target has a docstring + has_alias_docstring = has_docstring(member) + target = member.get('target_path', '') + target = resolve_alias_target(full_data['validmind'], target) + has_target_docstring = target is not None and has_docstring(target) + + if has_alias_docstring or has_target_docstring: + docstring_marker = "*" + else: + docstring_marker = "*" if has_docstring(member) else "" + + # For aliases, show the target path + if kind == 'alias': + target = f" -> {member.get('target_path', 'unknown')}" + else: + target = "" + + # Print the item + print(f"{prefix}{branch}{name} ({kind}){target}{docstring_marker}") # Recursively print children for modules and classes - if (kind == 'module' or kind == 'class') and 'members' in resolved_member: + if kind in {'module', 'class'} and 'members' in member: new_prefix = prefix + (" " if is_last_item else "│ ") - print_tree(resolved_member, new_prefix, is_last_item, is_root=False, full_data=full_data) + print_tree(member, new_prefix, is_last_item, is_root=False, full_data=full_data) def main(): """Main function to process the JSON file.""" @@ -66,8 +195,8 @@ def main(): try: with open(json_path) as f: data = json.load(f) - print("\nValidMind Python API:") - # Start with the 'validmind' module + print("\nvalidmind (* = docstring)") + # Pass the full data to print_tree for resolving aliases if 'validmind' in data: print_tree(data['validmind'], is_root=True, full_data=data) else: From 11e4db33d4cf4b6d2003404f0d3f63b1c318e3db Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 24 Jan 2025 13:46:48 -0800 Subject: [PATCH 005/207] Save point --- docs/validmind.tree | 196 ++++++++++++++++++++++---------------------- scripts/api_tree.py | 16 ++-- 2 files changed, 109 insertions(+), 103 deletions(-) diff --git a/docs/validmind.tree b/docs/validmind.tree index 58b1cc93e..d582a2653 100644 --- a/docs/validmind.tree +++ b/docs/validmind.tree @@ -71,6 +71,8 @@ validmind (* = docstring) │ ├── preprocess (function)* │ └── transform (function) ├── errors (module)* +│ ├── raise_api_error (function)* +│ ├── should_raise_on_fail_fast (function)* │ ├── APIRequestError (class)* │ ├── BaseError (class) │ │ ├── __init__ (function) @@ -115,10 +117,12 @@ validmind (* = docstring) │ ├── UnsupportedFigureError (class)* │ ├── UnsupportedModelError (class)* │ ├── UnsupportedModelForSHAPError (class)* -│ ├── UnsupportedRModelError (class)* -│ ├── raise_api_error (function)* -│ └── should_raise_on_fail_fast (function)* +│ └── UnsupportedRModelError (class)* ├── test_suites (module)* +│ ├── describe_suite (function)* +│ ├── get_by_id (function)* +│ ├── list_suites (function)* +│ ├── register_test_suite (function)* │ ├── classifier (module)* │ │ ├── ClassifierDiagnosis (class)* │ │ ├── ClassifierFullSuite (class)* @@ -155,20 +159,64 @@ validmind (* = docstring) │ │ └── TabularDatasetDescription (class)* │ ├── text_data (module)* │ │ └── TextDataQuality (class)* -│ ├── time_series (module)* -│ │ ├── TimeSeriesDataQuality (class)* -│ │ ├── TimeSeriesDataset (class)* -│ │ ├── TimeSeriesModelValidation (class)* -│ │ ├── TimeSeriesMultivariate (class)* -│ │ └── TimeSeriesUnivariate (class)* -│ ├── describe_suite (function)* -│ ├── get_by_id (function)* -│ ├── list_suites (function)* -│ └── register_test_suite (function)* +│ └── time_series (module)* +│ ├── TimeSeriesDataQuality (class)* +│ ├── TimeSeriesDataset (class)* +│ ├── TimeSeriesModelValidation (class)* +│ ├── TimeSeriesMultivariate (class)* +│ └── TimeSeriesUnivariate (class)* ├── tests (module)* +│ ├── register_test_provider (function)* │ ├── comparison (module) │ │ ├── combine_results (function)* │ │ └── get_comparison_test_configs (function)* +│ ├── decorator (module)* +│ │ ├── tags (function)* +│ │ ├── tasks (function)* +│ │ └── test (function)* +│ ├── load (module)* +│ │ ├── describe_test (function)* +│ │ ├── list_tags (function)* +│ │ ├── list_tasks (function)* +│ │ ├── list_tasks_and_tags (function)* +│ │ ├── list_tests (function)* +│ │ └── load_test (function)* +│ ├── output (module) +│ │ ├── process_output (function)* +│ │ ├── BooleanOutputHandler (class) +│ │ │ ├── can_handle (function) +│ │ │ └── process (function) +│ │ ├── FigureOutputHandler (class) +│ │ │ ├── can_handle (function) +│ │ │ └── process (function) +│ │ ├── MetricOutputHandler (class) +│ │ │ ├── can_handle (function) +│ │ │ └── process (function) +│ │ ├── OutputHandler (class)* +│ │ │ ├── can_handle (function)* +│ │ │ └── process (function)* +│ │ ├── RawDataOutputHandler (class) +│ │ │ ├── can_handle (function) +│ │ │ └── process (function) +│ │ └── TableOutputHandler (class) +│ │ ├── can_handle (function) +│ │ └── process (function) +│ ├── run (module) +│ │ ├── build_test_result (function)* +│ │ ├── print_env (function) +│ │ └── run_test (function)* +│ ├── test_providers (module) +│ │ ├── LocalTestProvider (class)* +│ │ │ ├── __init__ (function)* +│ │ │ ├── list_tests (function)* +│ │ │ └── load_test (function)* +│ │ ├── TestProvider (class)* +│ │ │ ├── list_tests (function)* +│ │ │ └── load_test (function)* +│ │ └── ValidMindTestProvider (class)* +│ │ ├── __init__ (function) +│ │ ├── list_tests (function)* +│ │ └── load_test (function)* │ ├── data_validation (module) │ │ ├── ACFandPACFPlot (module) │ │ │ └── ACFandPACFPlot (function)* @@ -331,17 +379,6 @@ validmind (* = docstring) │ │ │ └── create_metrics_df (function) │ │ └── Toxicity (module) │ │ └── Toxicity (function)* -│ ├── decorator (module)* -│ │ ├── tags (function)* -│ │ ├── tasks (function)* -│ │ └── test (function)* -│ ├── load (module)* -│ │ ├── describe_test (function)* -│ │ ├── list_tags (function)* -│ │ ├── list_tasks (function)* -│ │ ├── list_tasks_and_tags (function)* -│ │ ├── list_tests (function)* -│ │ └── load_test (function)* │ ├── model_validation (module) │ │ ├── BertScore (module) │ │ │ └── BertScore (function)* @@ -489,62 +526,25 @@ validmind (* = docstring) │ │ │ └── ScorecardHistogram (function)* │ │ └── statsutils (module) │ │ └── adj_r2_score (function)* -│ ├── output (module) -│ │ ├── BooleanOutputHandler (class) -│ │ │ ├── can_handle (function) -│ │ │ └── process (function) -│ │ ├── FigureOutputHandler (class) -│ │ │ ├── can_handle (function) -│ │ │ └── process (function) -│ │ ├── MetricOutputHandler (class) -│ │ │ ├── can_handle (function) -│ │ │ └── process (function) -│ │ ├── OutputHandler (class)* -│ │ │ ├── can_handle (function)* -│ │ │ └── process (function)* -│ │ ├── RawDataOutputHandler (class) -│ │ │ ├── can_handle (function) -│ │ │ └── process (function) -│ │ ├── TableOutputHandler (class) -│ │ │ ├── can_handle (function) -│ │ │ └── process (function) -│ │ └── process_output (function)* -│ ├── prompt_validation (module) -│ │ ├── Bias (module) -│ │ │ └── Bias (function)* -│ │ ├── Clarity (module) -│ │ │ └── Clarity (function)* -│ │ ├── Conciseness (module) -│ │ │ └── Conciseness (function)* -│ │ ├── Delimitation (module) -│ │ │ └── Delimitation (function)* -│ │ ├── NegativeInstruction (module) -│ │ │ └── NegativeInstruction (function)* -│ │ ├── Robustness (module) -│ │ │ └── Robustness (function)* -│ │ ├── Specificity (module) -│ │ │ └── Specificity (function)* -│ │ └── ai_powered_test (module) -│ │ ├── call_model (function)* -│ │ ├── get_explanation (function)* -│ │ └── get_score (function)* -│ ├── run (module) -│ │ ├── build_test_result (function)* -│ │ ├── print_env (function) -│ │ └── run_test (function)* -│ ├── test_providers (module) -│ │ ├── LocalTestProvider (class)* -│ │ │ ├── __init__ (function)* -│ │ │ ├── list_tests (function)* -│ │ │ └── load_test (function)* -│ │ ├── TestProvider (class)* -│ │ │ ├── list_tests (function)* -│ │ │ └── load_test (function)* -│ │ └── ValidMindTestProvider (class)* -│ │ ├── __init__ (function) -│ │ ├── list_tests (function)* -│ │ └── load_test (function)* -│ └── register_test_provider (function)* +│ └── prompt_validation (module) +│ ├── Bias (module) +│ │ └── Bias (function)* +│ ├── Clarity (module) +│ │ └── Clarity (function)* +│ ├── Conciseness (module) +│ │ └── Conciseness (function)* +│ ├── Delimitation (module) +│ │ └── Delimitation (function)* +│ ├── NegativeInstruction (module) +│ │ └── NegativeInstruction (function)* +│ ├── Robustness (module) +│ │ └── Robustness (function)* +│ ├── Specificity (module) +│ │ └── Specificity (function)* +│ └── ai_powered_test (module) +│ ├── call_model (function)* +│ ├── get_explanation (function)* +│ └── get_score (function)* ├── unit_metrics (module) │ ├── describe_metric (function)* │ ├── list_metrics (function)* @@ -573,37 +573,37 @@ validmind (* = docstring) │ ├── y_prob (function)* │ └── y_prob_df (function)* ├── figure (module)* - │ ├── Figure (class)* - │ │ ├── __init__ (function) - │ │ ├── __post_init__ (function) - │ │ ├── serialize (function)* - │ │ ├── serialize_files (function)* - │ │ └── to_widget (function)* │ ├── create_figure (function)* │ ├── is_matplotlib_figure (function) │ ├── is_plotly_figure (function) - │ └── is_png_image (function) + │ ├── is_png_image (function) + │ └── Figure (class)* + │ ├── __init__ (function) + │ ├── __post_init__ (function) + │ ├── serialize (function)* + │ ├── serialize_files (function)* + │ └── to_widget (function)* ├── input (module)* │ └── VMInput (class)* │ └── with_options (function)* ├── model (module)* + │ ├── get_model_class (function) + │ ├── has_method_with_arguments (function) + │ ├── is_model_metadata (function)* + │ ├── is_pytorch_model (function)* + │ ├── model_module (function) │ ├── ModelAttributes (class)* │ │ ├── __init__ (function) │ │ └── from_dict (function)* │ ├── ModelPipeline (class)* │ │ └── __init__ (function) │ ├── ModelTask (class)* - │ ├── VMModel (class)* - │ │ ├── __init__ (function) - │ │ ├── __post_init__ (function)* - │ │ ├── predict (function)* - │ │ ├── predict_proba (function)* - │ │ └── serialize (function)* - │ ├── get_model_class (function) - │ ├── has_method_with_arguments (function) - │ ├── is_model_metadata (function)* - │ ├── is_pytorch_model (function)* - │ └── model_module (function) + │ └── VMModel (class)* + │ ├── __init__ (function) + │ ├── __post_init__ (function)* + │ ├── predict (function)* + │ ├── predict_proba (function)* + │ └── serialize (function)* └── result (module) └── result (module)* ├── ErrorResult (class)* diff --git a/scripts/api_tree.py b/scripts/api_tree.py index 8589bd5a5..e3b5694fa 100644 --- a/scripts/api_tree.py +++ b/scripts/api_tree.py @@ -51,14 +51,20 @@ def get_sort_key(item): kind = member.get('kind', '') + # Special case: validation modules in tests should be last + if kind == 'module' and name.endswith('_validation'): + return (4, name) + # Then: - # 1. Aliases (top-level exports) - # 2. Modules - # 3. Everything else alphabetically + # 1. Aliases (top-level exports) + # 2. Functions + # 3. Modules and other items if kind == 'alias': return (1, name) - elif kind == 'module': + elif kind == 'function': return (2, name) + elif kind == 'module': + return (3, name) else: return (3, name) @@ -195,7 +201,7 @@ def main(): try: with open(json_path) as f: data = json.load(f) - print("\nvalidmind (* = docstring)") + print("validmind (* = docstring)") # Pass the full data to print_tree for resolving aliases if 'validmind' in data: print_tree(data['validmind'], is_root=True, full_data=data) From 7e2daafe58c2ac8d123fe9a98b3f251ad0223b6b Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 24 Jan 2025 13:54:24 -0800 Subject: [PATCH 006/207] Save point --- scripts/api_tree.py | 72 +++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/scripts/api_tree.py b/scripts/api_tree.py index e3b5694fa..5f1d7896a 100644 --- a/scripts/api_tree.py +++ b/scripts/api_tree.py @@ -114,45 +114,47 @@ def print_tree(data: Dict[str, Any], prefix: str = "", is_last: bool = True, is_ # Get module-level __all__ members all_members = set(get_all_members(members)) - # Filter and sort items - items = [] - for name, member in sorted(members.items()): - if not member or member.get('kind') is None: - continue - - # Skip private members and utils module - if name.startswith('_') and name not in {'__init__', '__post_init__'}: - continue - - if name in SKIP_MODULES: - continue - - # At root level, only show items from __all__ - if is_root: - if name not in root_all: + # Special handling for vm_models - flatten structure to just show classes + if data.get('name') == 'vm_models': + items = [] + # Recursively search for classes in __all__ + vm_models_all = {'VMInput', 'VMDataset', 'VMModel', 'Figure', 'ModelAttributes', 'ResultTable', 'TestResult'} + + def collect_classes(module_data): + for name, member in module_data.get('members', {}).items(): + if name in vm_models_all and member.get('kind') == 'class': + items.append((name, member)) + elif member.get('kind') == 'module': + collect_classes(member) + + collect_classes(data) + items.sort(key=lambda x: x[0]) # Sort classes alphabetically + else: + # Filter and sort items + items = [] + for name, member in sorted(members.items()): + if not member or member.get('kind') is None: continue - items.append((name, member)) - continue - - # Handle aliases - if member.get('kind') == 'alias': - # Keep aliases only if they're in __all__ - if name not in all_members: + + # Skip private members and utils module + if name.startswith('_') and name not in {'__init__', '__post_init__'}: continue - # Skip external library imports - target_path = member.get('target_path', '') - if not target_path.startswith('validmind.'): + + if name in SKIP_MODULES: continue - - # Show only modules, classes, functions in __all__ (if present) - kind = member.get('kind', 'unknown') - if kind == 'module' or kind == 'class' or ( - kind in SHOW_KINDS and (name in all_members or not all_members) - ): + + # At root level, only show items from __all__ + if is_root: + if name not in root_all: + continue + items.append((name, member)) + continue + items.append((name, member)) # Sort items using custom sort key - items.sort(key=get_sort_key) + if data.get('name') != 'vm_models': # Don't sort vm_models items as they're pre-sorted + items.sort(key=get_sort_key) # Print items for i, (name, member) in enumerate(items): @@ -167,8 +169,8 @@ def print_tree(data: Dict[str, Any], prefix: str = "", is_last: bool = True, is_ if kind == 'alias' and full_data: # Check if either the alias or its target has a docstring has_alias_docstring = has_docstring(member) - target = member.get('target_path', '') - target = resolve_alias_target(full_data['validmind'], target) + target_path = member.get('target_path', '') + target = resolve_alias_target(full_data['validmind'], target_path) has_target_docstring = target is not None and has_docstring(target) if has_alias_docstring or has_target_docstring: From 60eb7167f922f56633d7489578c0b218d0648d63 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 26 Jan 2025 11:21:52 -0800 Subject: [PATCH 007/207] Save point before switching to Griffe API --- Makefile | 2 +- docs/validmind.tree | 116 ++++++++++++-------------------------------- scripts/api_tree.py | 65 +++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 86 deletions(-) diff --git a/Makefile b/Makefile index 148efdac3..f9fb38c7e 100644 --- a/Makefile +++ b/Makefile @@ -60,7 +60,7 @@ clean-quarto: docs/validmind.json: rm -f $@ - poetry run python -m griffe dump validmind > $@ + poetry run python -m griffe dump validmind -f -o $@ -d google -r -U docs/validmind/validmind.qmd: docs/templates/module.qmd.jinja2 docs/validmind.json jinja2 docs/templates/module.qmd.jinja2 docs/validmind.json > $@ diff --git a/docs/validmind.tree b/docs/validmind.tree index d582a2653..35fea74dd 100644 --- a/docs/validmind.tree +++ b/docs/validmind.tree @@ -1,4 +1,3 @@ - validmind (* = docstring) ├── RawData (alias) -> validmind.vm_models.result.RawData* ├── get_test_suite (alias) -> validmind.client.get_test_suite* @@ -550,87 +549,34 @@ validmind (* = docstring) │ ├── list_metrics (function)* │ └── run_metric (function)* └── vm_models (module)* - ├── dataset (module) - │ └── dataset (module)* - │ ├── DataFrameDataset (class)* - │ │ └── __init__ (function)* - │ ├── PolarsDataset (class)* - │ │ └── __init__ (function)* - │ ├── TorchDataset (class)* - │ │ └── __init__ (function)* - │ └── VMDataset (class)* - │ ├── __init__ (function)* - │ ├── add_extra_column (function)* - │ ├── assign_predictions (function)* - │ ├── prediction_column (function)* - │ ├── probability_column (function)* - │ ├── target_classes (function)* - │ ├── with_options (function)* - │ ├── x_df (function)* - │ ├── y_df (function)* - │ ├── y_pred (function)* - │ ├── y_pred_df (function)* - │ ├── y_prob (function)* - │ └── y_prob_df (function)* - ├── figure (module)* - │ ├── create_figure (function)* - │ ├── is_matplotlib_figure (function) - │ ├── is_plotly_figure (function) - │ ├── is_png_image (function) - │ └── Figure (class)* - │ ├── __init__ (function) - │ ├── __post_init__ (function) - │ ├── serialize (function)* - │ ├── serialize_files (function)* - │ └── to_widget (function)* - ├── input (module)* - │ └── VMInput (class)* - │ └── with_options (function)* - ├── model (module)* - │ ├── get_model_class (function) - │ ├── has_method_with_arguments (function) - │ ├── is_model_metadata (function)* - │ ├── is_pytorch_model (function)* - │ ├── model_module (function) - │ ├── ModelAttributes (class)* - │ │ ├── __init__ (function) - │ │ └── from_dict (function)* - │ ├── ModelPipeline (class)* - │ │ └── __init__ (function) - │ ├── ModelTask (class)* - │ └── VMModel (class)* - │ ├── __init__ (function) - │ ├── __post_init__ (function)* - │ ├── predict (function)* - │ ├── predict_proba (function)* - │ └── serialize (function)* - └── result (module) - └── result (module)* - ├── ErrorResult (class)* - │ ├── __init__ (function) - │ ├── log_async (function) - │ └── to_widget (function) - ├── RawData (class)* - │ ├── __init__ (function)* - │ ├── inspect (function)* - │ └── serialize (function) - ├── Result (class)* - │ ├── __init__ (function) - │ ├── log (function)* - │ ├── show (function)* - │ └── to_widget (function)* - ├── ResultTable (class)* - │ ├── __init__ (function) - │ ├── __post_init__ (function) - │ └── serialize (function) - └── TestResult (class)* - ├── __init__ (function) - ├── __post_init__ (function) - ├── add_figure (function)* - ├── add_table (function)* - ├── log (function)* - ├── log_async (function) - ├── remove_figure (function)* - ├── remove_table (function)* - ├── serialize (function)* - └── to_widget (function) + └── vm_models (module)* + ├── VMInput (alias) -> validmind.vm_models.input.VMInput + │ ├── with_options (function)* + ├── VMDataset (alias) -> validmind.vm_models.dataset.dataset.VMDataset + │ ├── add_extra_column (function)* + │ ├── assign_predictions (function)* + │ ├── prediction_column (function)* + │ ├── probability_column (function)* + │ ├── target_classes (function)* + │ ├── with_options (function)* + │ ├── x_df (function)* + │ ├── y_df (function)* + │ ├── y_pred (function)* + │ ├── y_pred_df (function)* + │ ├── y_prob (function)* + │ ├── y_prob_df (function)* + ├── VMModel (alias) -> validmind.vm_models.model.VMModel + │ ├── predict (function)* + │ ├── predict_proba (function)* + │ ├── serialize (function)* + ├── Figure (alias) -> validmind.vm_models.figure.Figure + │ ├── serialize (function)* + │ ├── serialize_files (function)* + │ ├── to_widget (function)* + ├── ModelAttributes (alias) -> validmind.vm_models.model.ModelAttributes + │ ├── from_dict (function)* + ├── R_MODEL_TYPES (alias) -> validmind.vm_models.model.R_MODEL_TYPES + ├── ResultTable (alias) -> validmind.vm_models.result.ResultTable + ├── TestResult (alias) -> validmind.vm_models.result.TestResult + ├── TestSuite (alias) -> validmind.vm_models.test_suite.test_suite.TestSuite + ├── TestSuiteRunner (alias) -> validmind.vm_models.test_suite.runner.TestSuiteRunner diff --git a/scripts/api_tree.py b/scripts/api_tree.py index e3b5694fa..d508350fe 100644 --- a/scripts/api_tree.py +++ b/scripts/api_tree.py @@ -101,9 +101,74 @@ def resolve_alias_target(data: Dict[str, Any], target_path: str, visited_paths=N return current +def find_class_def(members: dict, class_name: str) -> dict: + """Recursively search for a class definition in the members dictionary.""" + if not isinstance(members, dict): + return None + + # Check if this is the class we're looking for + if members.get('kind') == 'class' and members.get('name') == class_name: + return members + + # Search in members + if 'members' in members: + for member in members['members'].values(): + result = find_class_def(member, class_name) + if result: + return result + return None + def print_tree(data: Dict[str, Any], prefix: str = "", is_last: bool = True, is_root: bool = False, full_data: Dict[str, Any] = None) -> None: """Print a tree view of the API structure.""" members = data.get('members', {}) + name = data.get('name', '') + + # Special handling for vm_models + if name == 'vm_models': + docstring = '*' if data.get('docstring') else '' + print(f"{prefix}{'└── ' if is_last else '├── '}{name} (module){docstring}") + + # Get vm_models members + vm_members = full_data['validmind']['members']['vm_models']['members'] + + # Get the __all__ list + if '__all__' in vm_members: + all_value = vm_members['__all__'].get('value', {}) + if 'elements' in all_value: + all_list = [e.strip("'") for e in all_value['elements']] + + new_prefix = prefix + (' ' if is_last else '│ ') + # Print items in __all__ order + for item in all_list: + if item in vm_members: + member = vm_members[item] + docstring = '*' if member.get('docstring') else '' + if member.get('kind') == 'alias': + target = member.get('target_path', '') + print(f"{new_prefix}├── {item} (alias) -> {target}{docstring}") + + # Get the class name from the target path + class_name = target.split('.')[-1] + + # Navigate through the JSON structure + current = vm_members + for part in target.split('.')[2:]: # Skip 'validmind' and 'vm_models' + if part in current: + current = current[part] + elif 'members' in current and part in current['members']: + current = current['members'][part] + else: + break + + # If we found a class definition, print its methods + if current.get('kind') == 'class': + class_prefix = new_prefix + "│ " + for method_name, method in sorted(current.get('members', {}).items()): + if (method.get('kind') == 'function' and + not method_name.startswith('_')): + method_docstring = '*' if method.get('docstring') else '' + print(f"{class_prefix}├── {method_name} (function){method_docstring}") + return # Get root __all__ if we're at root level root_all = set() From c549bee27b6f4ef6e4d72897f57beec9afda782a Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 26 Jan 2025 13:03:36 -0800 Subject: [PATCH 008/207] Save point before splitting QMD template --- docs/validmind.tree | 18 ++++++++++------ scripts/api_tree.py | 25 +++++++++++++++------- validmind/vm_models/test_suite/__init__.py | 5 +++++ 3 files changed, 34 insertions(+), 14 deletions(-) create mode 100644 validmind/vm_models/test_suite/__init__.py diff --git a/docs/validmind.tree b/docs/validmind.tree index 35fea74dd..d12874a88 100644 --- a/docs/validmind.tree +++ b/docs/validmind.tree @@ -551,7 +551,7 @@ validmind (* = docstring) └── vm_models (module)* └── vm_models (module)* ├── VMInput (alias) -> validmind.vm_models.input.VMInput - │ ├── with_options (function)* + │ └── with_options (function)* ├── VMDataset (alias) -> validmind.vm_models.dataset.dataset.VMDataset │ ├── add_extra_column (function)* │ ├── assign_predictions (function)* @@ -564,19 +564,25 @@ validmind (* = docstring) │ ├── y_pred (function)* │ ├── y_pred_df (function)* │ ├── y_prob (function)* - │ ├── y_prob_df (function)* + │ └── y_prob_df (function)* ├── VMModel (alias) -> validmind.vm_models.model.VMModel │ ├── predict (function)* │ ├── predict_proba (function)* - │ ├── serialize (function)* + │ └── serialize (function)* ├── Figure (alias) -> validmind.vm_models.figure.Figure │ ├── serialize (function)* │ ├── serialize_files (function)* - │ ├── to_widget (function)* + │ └── to_widget (function)* ├── ModelAttributes (alias) -> validmind.vm_models.model.ModelAttributes - │ ├── from_dict (function)* + │ └── from_dict (function)* ├── R_MODEL_TYPES (alias) -> validmind.vm_models.model.R_MODEL_TYPES ├── ResultTable (alias) -> validmind.vm_models.result.ResultTable ├── TestResult (alias) -> validmind.vm_models.result.TestResult ├── TestSuite (alias) -> validmind.vm_models.test_suite.test_suite.TestSuite - ├── TestSuiteRunner (alias) -> validmind.vm_models.test_suite.runner.TestSuiteRunner + │ ├── get_default_config (function)* + │ ├── get_tests (function)* + │ └── num_tests (function)* + └── TestSuiteRunner (alias) -> validmind.vm_models.test_suite.runner.TestSuiteRunner + ├── log_results (function)* + ├── run (function)* + └── summarize (function) diff --git a/scripts/api_tree.py b/scripts/api_tree.py index d508350fe..bc0d9a15a 100644 --- a/scripts/api_tree.py +++ b/scripts/api_tree.py @@ -139,13 +139,15 @@ def print_tree(data: Dict[str, Any], prefix: str = "", is_last: bool = True, is_ new_prefix = prefix + (' ' if is_last else '│ ') # Print items in __all__ order - for item in all_list: + for i, item in enumerate(all_list): + is_last_item = i == len(all_list) - 1 # Check if this is the last item if item in vm_members: member = vm_members[item] docstring = '*' if member.get('docstring') else '' if member.get('kind') == 'alias': target = member.get('target_path', '') - print(f"{new_prefix}├── {item} (alias) -> {target}{docstring}") + branch = '└── ' if is_last_item else '├── ' # Use correct branch for last item + print(f"{new_prefix}{branch}{item} (alias) -> {target}{docstring}") # Get the class name from the target path class_name = target.split('.')[-1] @@ -162,12 +164,19 @@ def print_tree(data: Dict[str, Any], prefix: str = "", is_last: bool = True, is_ # If we found a class definition, print its methods if current.get('kind') == 'class': - class_prefix = new_prefix + "│ " - for method_name, method in sorted(current.get('members', {}).items()): - if (method.get('kind') == 'function' and - not method_name.startswith('_')): - method_docstring = '*' if method.get('docstring') else '' - print(f"{class_prefix}├── {method_name} (function){method_docstring}") + class_prefix = new_prefix + (' ' if is_last_item else '│ ') # Adjust prefix based on last item + methods = [(name, method) for name, method in current.get('members', {}).items() + if method.get('kind') == 'function' and not name.startswith('_')] + + # Sort methods + methods.sort() + + # Print methods with proper last item handling + for j, (method_name, method) in enumerate(methods): + is_last_method = j == len(methods) - 1 + method_docstring = '*' if method.get('docstring') else '' + branch = '└── ' if is_last_method else '├── ' + print(f"{class_prefix}{branch}{method_name} (function){method_docstring}") return # Get root __all__ if we're at root level diff --git a/validmind/vm_models/test_suite/__init__.py b/validmind/vm_models/test_suite/__init__.py new file mode 100644 index 000000000..07da4fcbe --- /dev/null +++ b/validmind/vm_models/test_suite/__init__.py @@ -0,0 +1,5 @@ +# Copyright © 2023-2024 ValidMind Inc. All rights reserved. +# See the LICENSE file in the root of this repository for details. +# SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial + +"""Test suite module.""" \ No newline at end of file From f20dbee3490c7264e02a798e08645e13f5cf88c1 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 26 Jan 2025 18:54:39 -0800 Subject: [PATCH 009/207] Interim commit with mostly working reimplementation of template --- Makefile | 23 +- docs/templates/class.qmd.jinja2 | 22 + docs/templates/function.qmd.jinja2 | 14 + docs/templates/macros/docstring.jinja2 | 66 + docs/templates/macros/navigation.jinja2 | 26 + docs/templates/macros/types.jinja2 | 53 + docs/templates/module.qmd.jinja2 | 365 +- docs/templates/template.qmd.jinja2_OLD | 331 + docs/validmind.qmd | 459 + docs/validmind/datasets.qmd | 20 + docs/validmind/datasets/classification.qmd | 18 + .../classification/customer_churn.qmd | 44 + .../datasets/classification/taiwan_credit.qmd | 18 + docs/validmind/datasets/credit_risk.qmd | 18 + .../datasets/credit_risk/lending_club.qmd | 87 + .../credit_risk/lending_club_bias.qmd | 31 + docs/validmind/datasets/nlp.qmd | 18 + docs/validmind/datasets/nlp/cnn_dailymail.qmd | 41 + .../datasets/nlp/twitter_covid_19.qmd | 15 + docs/validmind/datasets/regression.qmd | 18 + docs/validmind/datasets/regression/fred.qmd | 53 + .../datasets/regression/lending_club.qmd | 38 + docs/validmind/errors.qmd | 424 + docs/validmind/test_suites.qmd | 70 + docs/validmind/test_suites/classifier.qmd | 85 + docs/validmind/test_suites/cluster.qmd | 59 + docs/validmind/test_suites/embeddings.qmd | 59 + docs/validmind/test_suites/llm.qmd | 43 + docs/validmind/test_suites/nlp.qmd | 30 + .../test_suites/parameters_optimization.qmd | 33 + docs/validmind/test_suites/regression.qmd | 51 + .../test_suites/statsmodels_timeseries.qmd | 43 + docs/validmind/test_suites/summarization.qmd | 30 + .../test_suites/tabular_datasets.qmd | 57 + docs/validmind/test_suites/text_data.qmd | 30 + docs/validmind/test_suites/time_series.qmd | 100 + docs/validmind/tests.qmd | 35 + docs/validmind/tests/data_validation.qmd | 71 + .../tests/data_validation/ACFandPACFPlot.qmd | 56 + docs/validmind/tests/data_validation/ADF.qmd | 53 + .../tests/data_validation/AutoAR.qmd | 60 + .../tests/data_validation/AutoMA.qmd | 63 + .../data_validation/AutoStationarity.qmd | 61 + .../data_validation/BivariateScatterPlots.qmd | 55 + .../tests/data_validation/BoxPierce.qmd | 59 + .../ChiSquaredFeaturesTable.qmd | 58 + .../tests/data_validation/ClassImbalance.qmd | 70 + .../data_validation/DatasetDescription.qmd | 98 + .../tests/data_validation/DatasetSplit.qmd | 58 + .../data_validation/DescriptiveStatistics.qmd | 68 + .../tests/data_validation/DickeyFullerGLS.qmd | 57 + .../tests/data_validation/Duplicates.qmd | 58 + .../data_validation/EngleGrangerCoint.qmd | 56 + .../FeatureTargetCorrelationPlot.qmd | 57 + .../tests/data_validation/HighCardinality.qmd | 54 + .../HighPearsonCorrelation.qmd | 57 + .../data_validation/IQROutliersBarPlot.qmd | 68 + .../data_validation/IQROutliersTable.qmd | 62 + .../IsolationForestOutliers.qmd | 58 + .../tests/data_validation/JarqueBera.qmd | 56 + docs/validmind/tests/data_validation/KPSS.qmd | 55 + .../tests/data_validation/LJungBox.qmd | 54 + .../LaggedCorrelationHeatmap.qmd | 59 + .../tests/data_validation/MissingValues.qmd | 54 + .../data_validation/MissingValuesBarPlot.qmd | 61 + .../data_validation/MutualInformation.qmd | 67 + .../PearsonCorrelationMatrix.qmd | 56 + .../data_validation/PhillipsPerronArch.qmd | 57 + .../ProtectedClassesCombination.qmd | 51 + .../ProtectedClassesDescription.qmd | 61 + .../ProtectedClassesDisparity.qmd | 54 + .../ProtectedClassesThresholdOptimizer.qmd | 71 + .../data_validation/RollingStatsPlot.qmd | 69 + .../tests/data_validation/RunsTest.qmd | 60 + .../tests/data_validation/ScatterPlot.qmd | 61 + .../data_validation/ScoreBandDefaultRates.qmd | 67 + .../data_validation/SeasonalDecompose.qmd | 58 + .../tests/data_validation/ShapiroWilk.qmd | 57 + .../tests/data_validation/Skewness.qmd | 54 + .../tests/data_validation/SpreadPlot.qmd | 59 + .../TabularCategoricalBarPlots.qmd | 54 + .../TabularDateTimeHistograms.qmd | 60 + .../TabularDescriptionTables.qmd | 83 + .../TabularNumericalHistograms.qmd | 59 + .../data_validation/TargetRateBarPlots.qmd | 54 + .../data_validation/TimeSeriesDescription.qmd | 51 + .../TimeSeriesDescriptiveStatistics.qmd | 49 + .../data_validation/TimeSeriesFrequency.qmd | 61 + .../data_validation/TimeSeriesHistogram.qmd | 55 + .../data_validation/TimeSeriesLinePlot.qmd | 59 + .../TimeSeriesMissingValues.qmd | 56 + .../data_validation/TimeSeriesOutliers.qmd | 60 + .../data_validation/TooManyZeroValues.qmd | 68 + .../tests/data_validation/UniqueRows.qmd | 58 + .../tests/data_validation/WOEBinPlots.qmd | 64 + .../tests/data_validation/WOEBinTable.qmd | 55 + .../data_validation/ZivotAndrewsArch.qmd | 55 + docs/validmind/tests/data_validation/nlp.qmd | 21 + .../tests/data_validation/nlp/CommonWords.qmd | 56 + .../tests/data_validation/nlp/Hashtags.qmd | 59 + .../data_validation/nlp/LanguageDetection.qmd | 56 + .../tests/data_validation/nlp/Mentions.qmd | 57 + .../nlp/PolarityAndSubjectivity.qmd | 54 + .../data_validation/nlp/Punctuations.qmd | 59 + .../tests/data_validation/nlp/Sentiment.qmd | 50 + .../tests/data_validation/nlp/StopWords.qmd | 69 + .../data_validation/nlp/TextDescription.qmd | 63 + .../tests/data_validation/nlp/Toxicity.qmd | 54 + docs/validmind/tests/model_validation.qmd | 29 + .../tests/model_validation/BertScore.qmd | 64 + .../tests/model_validation/BleuScore.qmd | 61 + .../ClusterSizeDistribution.qmd | 58 + .../model_validation/ContextualRecall.qmd | 62 + .../tests/model_validation/FeaturesAUC.qmd | 56 + .../tests/model_validation/MeteorScore.qmd | 65 + .../tests/model_validation/ModelMetadata.qmd | 41 + .../ModelPredictionResiduals.qmd | 49 + .../tests/model_validation/RegardScore.qmd | 56 + .../RegressionResidualsPlot.qmd | 58 + .../tests/model_validation/RougeScore.qmd | 63 + .../TimeSeriesPredictionWithCI.qmd | 57 + .../TimeSeriesPredictionsPlot.qmd | 43 + .../TimeSeriesR2SquareBySegments.qmd | 53 + .../tests/model_validation/TokenDisparity.qmd | 54 + .../tests/model_validation/ToxicityScore.qmd | 54 + .../tests/model_validation/sklearn.qmd | 47 + .../sklearn/AdjustedMutualInformation.qmd | 58 + .../sklearn/AdjustedRandIndex.qmd | 55 + .../sklearn/CalibrationCurve.qmd | 70 + .../sklearn/ClassifierPerformance.qmd | 57 + .../ClassifierThresholdOptimization.qmd | 101 + .../sklearn/ClusterCosineSimilarity.qmd | 60 + .../sklearn/ClusterPerformanceMetrics.qmd | 62 + .../sklearn/CompletenessScore.qmd | 53 + .../sklearn/ConfusionMatrix.qmd | 63 + .../sklearn/FeatureImportance.qmd | 57 + .../sklearn/FowlkesMallowsScore.qmd | 58 + .../sklearn/HomogeneityScore.qmd | 56 + .../sklearn/HyperParametersTuning.qmd | 71 + .../sklearn/KMeansClustersOptimization.qmd | 63 + .../sklearn/MinimumAccuracy.qmd | 53 + .../sklearn/MinimumF1Score.qmd | 55 + .../sklearn/MinimumROCAUCScore.qmd | 58 + .../sklearn/ModelParameters.qmd | 59 + .../sklearn/ModelsPerformanceComparison.qmd | 59 + .../sklearn/OverfitDiagnosis.qmd | 58 + .../sklearn/PermutationFeatureImportance.qmd | 56 + .../sklearn/PopulationStabilityIndex.qmd | 76 + .../sklearn/PrecisionRecallCurve.qmd | 57 + .../model_validation/sklearn/ROCCurve.qmd | 63 + .../sklearn/RegressionErrors.qmd | 63 + .../sklearn/RegressionErrorsComparison.qmd | 54 + .../sklearn/RegressionPerformance.qmd | 49 + .../sklearn/RegressionR2Square.qmd | 56 + .../sklearn/RegressionR2SquareComparison.qmd | 58 + .../sklearn/RobustnessDiagnosis.qmd | 54 + .../sklearn/SHAPGlobalImportance.qmd | 103 + .../sklearn/ScoreProbabilityAlignment.qmd | 67 + .../sklearn/SilhouettePlot.qmd | 63 + .../sklearn/TrainingTestDegradation.qmd | 58 + .../model_validation/sklearn/VMeasure.qmd | 54 + .../sklearn/WeakspotsDiagnosis.qmd | 66 + .../tests/model_validation/statsmodels.qmd | 27 + .../statsmodels/AutoARIMA.qmd | 66 + .../CumulativePredictionProbabilities.qmd | 63 + .../statsmodels/DurbinWatsonTest.qmd | 54 + .../statsmodels/GINITable.qmd | 66 + .../statsmodels/KolmogorovSmirnov.qmd | 52 + .../statsmodels/Lilliefors.qmd | 62 + .../PredictionProbabilitiesHistogram.qmd | 58 + .../statsmodels/RegressionCoeffs.qmd | 61 + .../RegressionFeatureSignificance.qmd | 56 + .../RegressionModelForecastPlot.qmd | 58 + .../RegressionModelForecastPlotLevels.qmd | 56 + .../RegressionModelSensitivityPlot.qmd | 62 + .../statsmodels/RegressionModelSummary.qmd | 49 + ...RegressionPermutationFeatureImportance.qmd | 53 + .../statsmodels/ScorecardHistogram.qmd | 62 + .../statsmodels/statsutils.qmd | 20 + docs/validmind/tests/prompt_validation.qmd | 19 + .../tests/prompt_validation/Bias.qmd | 65 + .../tests/prompt_validation/Clarity.qmd | 53 + .../tests/prompt_validation/Conciseness.qmd | 53 + .../tests/prompt_validation/Delimitation.qmd | 54 + .../prompt_validation/NegativeInstruction.qmd | 59 + .../tests/prompt_validation/Robustness.qmd | 57 + .../tests/prompt_validation/Specificity.qmd | 55 + .../prompt_validation/ai_powered_test.qmd | 44 + docs/validmind/unit_metrics.qmd | 36 + docs/validmind/validmind.qmd | 14394 ---------------- docs/validmind/vm_models.qmd | 17 + scripts/generate_quarto_docs.py | 139 + 192 files changed, 11573 insertions(+), 14714 deletions(-) create mode 100644 docs/templates/class.qmd.jinja2 create mode 100644 docs/templates/function.qmd.jinja2 create mode 100644 docs/templates/macros/docstring.jinja2 create mode 100644 docs/templates/macros/navigation.jinja2 create mode 100644 docs/templates/macros/types.jinja2 create mode 100644 docs/templates/template.qmd.jinja2_OLD create mode 100644 docs/validmind.qmd create mode 100644 docs/validmind/datasets.qmd create mode 100644 docs/validmind/datasets/classification.qmd create mode 100644 docs/validmind/datasets/classification/customer_churn.qmd create mode 100644 docs/validmind/datasets/classification/taiwan_credit.qmd create mode 100644 docs/validmind/datasets/credit_risk.qmd create mode 100644 docs/validmind/datasets/credit_risk/lending_club.qmd create mode 100644 docs/validmind/datasets/credit_risk/lending_club_bias.qmd create mode 100644 docs/validmind/datasets/nlp.qmd create mode 100644 docs/validmind/datasets/nlp/cnn_dailymail.qmd create mode 100644 docs/validmind/datasets/nlp/twitter_covid_19.qmd create mode 100644 docs/validmind/datasets/regression.qmd create mode 100644 docs/validmind/datasets/regression/fred.qmd create mode 100644 docs/validmind/datasets/regression/lending_club.qmd create mode 100644 docs/validmind/errors.qmd create mode 100644 docs/validmind/test_suites.qmd create mode 100644 docs/validmind/test_suites/classifier.qmd create mode 100644 docs/validmind/test_suites/cluster.qmd create mode 100644 docs/validmind/test_suites/embeddings.qmd create mode 100644 docs/validmind/test_suites/llm.qmd create mode 100644 docs/validmind/test_suites/nlp.qmd create mode 100644 docs/validmind/test_suites/parameters_optimization.qmd create mode 100644 docs/validmind/test_suites/regression.qmd create mode 100644 docs/validmind/test_suites/statsmodels_timeseries.qmd create mode 100644 docs/validmind/test_suites/summarization.qmd create mode 100644 docs/validmind/test_suites/tabular_datasets.qmd create mode 100644 docs/validmind/test_suites/text_data.qmd create mode 100644 docs/validmind/test_suites/time_series.qmd create mode 100644 docs/validmind/tests.qmd create mode 100644 docs/validmind/tests/data_validation.qmd create mode 100644 docs/validmind/tests/data_validation/ACFandPACFPlot.qmd create mode 100644 docs/validmind/tests/data_validation/ADF.qmd create mode 100644 docs/validmind/tests/data_validation/AutoAR.qmd create mode 100644 docs/validmind/tests/data_validation/AutoMA.qmd create mode 100644 docs/validmind/tests/data_validation/AutoStationarity.qmd create mode 100644 docs/validmind/tests/data_validation/BivariateScatterPlots.qmd create mode 100644 docs/validmind/tests/data_validation/BoxPierce.qmd create mode 100644 docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd create mode 100644 docs/validmind/tests/data_validation/ClassImbalance.qmd create mode 100644 docs/validmind/tests/data_validation/DatasetDescription.qmd create mode 100644 docs/validmind/tests/data_validation/DatasetSplit.qmd create mode 100644 docs/validmind/tests/data_validation/DescriptiveStatistics.qmd create mode 100644 docs/validmind/tests/data_validation/DickeyFullerGLS.qmd create mode 100644 docs/validmind/tests/data_validation/Duplicates.qmd create mode 100644 docs/validmind/tests/data_validation/EngleGrangerCoint.qmd create mode 100644 docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd create mode 100644 docs/validmind/tests/data_validation/HighCardinality.qmd create mode 100644 docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd create mode 100644 docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd create mode 100644 docs/validmind/tests/data_validation/IQROutliersTable.qmd create mode 100644 docs/validmind/tests/data_validation/IsolationForestOutliers.qmd create mode 100644 docs/validmind/tests/data_validation/JarqueBera.qmd create mode 100644 docs/validmind/tests/data_validation/KPSS.qmd create mode 100644 docs/validmind/tests/data_validation/LJungBox.qmd create mode 100644 docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd create mode 100644 docs/validmind/tests/data_validation/MissingValues.qmd create mode 100644 docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd create mode 100644 docs/validmind/tests/data_validation/MutualInformation.qmd create mode 100644 docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd create mode 100644 docs/validmind/tests/data_validation/PhillipsPerronArch.qmd create mode 100644 docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd create mode 100644 docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd create mode 100644 docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd create mode 100644 docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd create mode 100644 docs/validmind/tests/data_validation/RollingStatsPlot.qmd create mode 100644 docs/validmind/tests/data_validation/RunsTest.qmd create mode 100644 docs/validmind/tests/data_validation/ScatterPlot.qmd create mode 100644 docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd create mode 100644 docs/validmind/tests/data_validation/SeasonalDecompose.qmd create mode 100644 docs/validmind/tests/data_validation/ShapiroWilk.qmd create mode 100644 docs/validmind/tests/data_validation/Skewness.qmd create mode 100644 docs/validmind/tests/data_validation/SpreadPlot.qmd create mode 100644 docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd create mode 100644 docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd create mode 100644 docs/validmind/tests/data_validation/TabularDescriptionTables.qmd create mode 100644 docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd create mode 100644 docs/validmind/tests/data_validation/TargetRateBarPlots.qmd create mode 100644 docs/validmind/tests/data_validation/TimeSeriesDescription.qmd create mode 100644 docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd create mode 100644 docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd create mode 100644 docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd create mode 100644 docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd create mode 100644 docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd create mode 100644 docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd create mode 100644 docs/validmind/tests/data_validation/TooManyZeroValues.qmd create mode 100644 docs/validmind/tests/data_validation/UniqueRows.qmd create mode 100644 docs/validmind/tests/data_validation/WOEBinPlots.qmd create mode 100644 docs/validmind/tests/data_validation/WOEBinTable.qmd create mode 100644 docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd create mode 100644 docs/validmind/tests/data_validation/nlp.qmd create mode 100644 docs/validmind/tests/data_validation/nlp/CommonWords.qmd create mode 100644 docs/validmind/tests/data_validation/nlp/Hashtags.qmd create mode 100644 docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd create mode 100644 docs/validmind/tests/data_validation/nlp/Mentions.qmd create mode 100644 docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd create mode 100644 docs/validmind/tests/data_validation/nlp/Punctuations.qmd create mode 100644 docs/validmind/tests/data_validation/nlp/Sentiment.qmd create mode 100644 docs/validmind/tests/data_validation/nlp/StopWords.qmd create mode 100644 docs/validmind/tests/data_validation/nlp/TextDescription.qmd create mode 100644 docs/validmind/tests/data_validation/nlp/Toxicity.qmd create mode 100644 docs/validmind/tests/model_validation.qmd create mode 100644 docs/validmind/tests/model_validation/BertScore.qmd create mode 100644 docs/validmind/tests/model_validation/BleuScore.qmd create mode 100644 docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd create mode 100644 docs/validmind/tests/model_validation/ContextualRecall.qmd create mode 100644 docs/validmind/tests/model_validation/FeaturesAUC.qmd create mode 100644 docs/validmind/tests/model_validation/MeteorScore.qmd create mode 100644 docs/validmind/tests/model_validation/ModelMetadata.qmd create mode 100644 docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd create mode 100644 docs/validmind/tests/model_validation/RegardScore.qmd create mode 100644 docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd create mode 100644 docs/validmind/tests/model_validation/RougeScore.qmd create mode 100644 docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd create mode 100644 docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd create mode 100644 docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd create mode 100644 docs/validmind/tests/model_validation/TokenDisparity.qmd create mode 100644 docs/validmind/tests/model_validation/ToxicityScore.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/VMeasure.qmd create mode 100644 docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels/GINITable.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd create mode 100644 docs/validmind/tests/model_validation/statsmodels/statsutils.qmd create mode 100644 docs/validmind/tests/prompt_validation.qmd create mode 100644 docs/validmind/tests/prompt_validation/Bias.qmd create mode 100644 docs/validmind/tests/prompt_validation/Clarity.qmd create mode 100644 docs/validmind/tests/prompt_validation/Conciseness.qmd create mode 100644 docs/validmind/tests/prompt_validation/Delimitation.qmd create mode 100644 docs/validmind/tests/prompt_validation/NegativeInstruction.qmd create mode 100644 docs/validmind/tests/prompt_validation/Robustness.qmd create mode 100644 docs/validmind/tests/prompt_validation/Specificity.qmd create mode 100644 docs/validmind/tests/prompt_validation/ai_powered_test.qmd create mode 100644 docs/validmind/unit_metrics.qmd delete mode 100644 docs/validmind/validmind.qmd create mode 100644 docs/validmind/vm_models.qmd create mode 100644 scripts/generate_quarto_docs.py diff --git a/Makefile b/Makefile index f9fb38c7e..f2a8f0652 100644 --- a/Makefile +++ b/Makefile @@ -51,22 +51,17 @@ else poetry run pdoc validmind -d google -t docs/templates --no-show-source --logo https://vmai.s3.us-west-1.amazonaws.com/validmind-logo.svg --favicon https://vmai.s3.us-west-1.amazonaws.com/favicon.ico endif -quarto-docs: clean-quarto docs/validmind.json docs/validmind/validmind.qmd $(patsubst %,docs/validmind/_%.qmd,$(SUBMODULES)) - -clean-quarto: +quarto-docs: + # Clean old files rm -f docs/validmind.json rm -rf docs/validmind mkdir -p docs/validmind - -docs/validmind.json: - rm -f $@ - poetry run python -m griffe dump validmind -f -o $@ -d google -r -U - -docs/validmind/validmind.qmd: docs/templates/module.qmd.jinja2 docs/validmind.json - jinja2 docs/templates/module.qmd.jinja2 docs/validmind.json > $@ - -docs/validmind/_%.qmd: docs/templates/submodule.qmd.jinja2 docs/validmind.json - jinja2 docs/templates/submodule.qmd.jinja2 docs/validmind.json -D module=$* > $@ + + # Generate API JSON dump + poetry run python -m griffe dump validmind -f -o docs/validmind.json -d google -r -U + + # Generate Quarto docs from templates + poetry run python scripts/generate_quarto_docs.py version: @:$(call check_defined, tag, new semver version tag to use on pyproject.toml) @@ -95,7 +90,7 @@ ensure-clean-notebooks: # Quick target to run all checks check: copyright format lint test verify-copyright verify-exposed-credentials ensure-clean-notebooks -.PHONY: docs +.PHONY: docs quarto-docs notebook: @python notebooks/templates/e2e_template.py diff --git a/docs/templates/class.qmd.jinja2 b/docs/templates/class.qmd.jinja2 new file mode 100644 index 000000000..ba1111e1f --- /dev/null +++ b/docs/templates/class.qmd.jinja2 @@ -0,0 +1,22 @@ +{% if member.kind == "class" %} + +### Class: {{ member.name }} + +{% if member.docstring %} +{{ doc.format_docstring(member.docstring) }} + +{% endif %} +{% if member.bases %} +**Bases:** {% for base in member.bases %}{{ types.format_type(base) }}{% if not loop.last %}, {% endif %}{% endfor %} + +{% endif %} +{% if member.members %} +#### Methods + +{% for method in member.members | sort_members %} +{% if is_public(method, member, full_data) %} +{% include "function.qmd.jinja2" %} +{% endif %} +{% endfor %} +{% endif %} +{% endif %} \ No newline at end of file diff --git a/docs/templates/function.qmd.jinja2 b/docs/templates/function.qmd.jinja2 new file mode 100644 index 000000000..b61c5a3cd --- /dev/null +++ b/docs/templates/function.qmd.jinja2 @@ -0,0 +1,14 @@ +{%- if member.kind == "function" %} + +#### {{ member.name }} + +{% if member.docstring %} +{{ doc.format_docstring(member.docstring) }} +{% endif %} +{% if member.signature %} +**Signature:** `{{ member.signature }}` +{% endif %} +{% if member.returns %} +**Returns:** {{ types.format_type(member.returns) }} +{% endif %} +{% endif %} \ No newline at end of file diff --git a/docs/templates/macros/docstring.jinja2 b/docs/templates/macros/docstring.jinja2 new file mode 100644 index 000000000..ddf65f93e --- /dev/null +++ b/docs/templates/macros/docstring.jinja2 @@ -0,0 +1,66 @@ +{% macro format_docstring(docstring) %} +{% if docstring is mapping %} + {%- set content = docstring.value -%} + {%- set content = content.replace(':\n-', ':\n\n-') -%} + {%- set content = content.replace('\n ', ' ') -%} + {%- set content = content.replace(':param ', '\n**Parameters**\n\n- **') -%} + {%- set content = content.replace(': ', '**: ', 1) -%} + {%- set content = content.replace(':return: ', '\n**Returns**\n\n- ') -%} + {%- set lines = content.split('\n') -%} + {%- set formatted_lines = [] -%} + {%- for line in lines -%} + {%- if line.startswith('### ') -%} + {%- set line = line.replace('### ', '###### ') -%} + {%- elif line.strip() == 'Args:' -%} + {%- set line = '**Arguments**\n' -%} + {%- elif line.strip() == 'Attributes:' -%} + {%- set line = '**Attributes**\n' -%} + {%- elif line.strip() == 'Raises:' -%} + {%- set line = '**Raises**\n' -%} + {%- elif line.strip() == 'Returns:' -%} + {%- set line = '**Returns**\n' -%} + {%- elif line.startswith(' ') -%} + {%- set trimmed = line.strip() -%} + {%- if ':' in trimmed -%} + {%- set parts = trimmed.split(':', 1) -%} + {%- set param = parts[0].strip() -%} + {%- set desc = parts[1].strip() -%} + {%- if '[DEPRECATED]' in desc -%} + {%- set desc = desc.replace('[DEPRECATED]', '') ~ '^[**Deprecation notice**
`' ~ param ~ '` has been deprecated and will be removed in a future release.]' -%} + {%- endif -%} + {%- set line = '- **' ~ param ~ '**: ' ~ desc -%} + {%- else -%} + {%- set line = '- ' ~ trimmed -%} + {%- endif -%} + {%- endif -%} + {%- if line.strip() or line.startswith(' ') -%} + {%- set _ = formatted_lines.append(line) -%} + {%- else -%} + {%- set _ = formatted_lines.append('') -%} + {%- endif -%} + {%- endfor -%} +{{ formatted_lines | join('\n') }} + +{% if docstring.params %} +**Parameters:** +{% for param in docstring.params %} + `{{ param.name }}`: {{ param.description }} +{% endfor %} +{% endif %} + +{% if docstring.returns %} +**Returns:** +{{ docstring.returns }} +{% endif %} + +{% if docstring.raises %} +**Raises:** +{% for error in docstring.raises %} + `{{ error.type }}`: {{ error.description }} +{% endfor %} +{% endif %} +{% else %} +{{ docstring }} + +{% endif %} +{% endmacro %} \ No newline at end of file diff --git a/docs/templates/macros/navigation.jinja2 b/docs/templates/macros/navigation.jinja2 new file mode 100644 index 000000000..c852b6993 --- /dev/null +++ b/docs/templates/macros/navigation.jinja2 @@ -0,0 +1,26 @@ +{% macro breadcrumbs(module) %} +{# {% set parts = module.path.split('.') %} +[API Reference](../index.qmd) +{% for part in parts %} +/ {% if loop.last %}{{ part }}{% else %}[{{ part }}]({{ '../' * (parts|length - loop.index) }}{{ part }}/index.qmd){% endif %} +{% endfor %} #} +{% endmacro %} + +{% macro module_tree(module) %} +{% if module.members %} +``` +{{ print_tree(module) }} +``` +{% endif %} +{% endmacro %} + +{% macro print_tree(node, prefix='', is_last=True) %} +{{ prefix }}{{ '└── ' if is_last else '├── ' }}{{ node.name }} +{% if node.members %} +{% for member in node.members | sort_members %} +{% if is_public(member) %} +{{ print_tree(member, prefix + (' ' if is_last else '│ '), loop.last) }} +{% endif %} +{% endfor %} +{% endif %} +{% endmacro %} \ No newline at end of file diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 new file mode 100644 index 000000000..e44ea73f2 --- /dev/null +++ b/docs/templates/macros/types.jinja2 @@ -0,0 +1,53 @@ +{% macro format_type(type) %} +{% if type is mapping %} +{% if type.kind == 'union' %} +{{ type.types | map('format_type') | join(' | ') }} +{% elif type.kind == 'generic' %} +{{ type.base }}[{{ type.args | map('format_type') | join(', ') }}] +{% else %} +{{ type.name }} +{% endif %} +{% else %} +{{ type }} +{% endif %} +{% endmacro %} + +{%- macro format_return_type(returns) -%} +{%- if returns.cls == "ExprName" -%} + {%- if returns.name in validmind.members.client.members and validmind.members.client.members[returns.name].kind == "alias" -%} + {{ validmind.members.client.members[returns.name].target_path }} + {%- else -%} + {{ returns.name }} + {%- endif -%} +{%- elif returns.cls == "ExprSubscript" and returns.left is defined -%} + {{ returns.left.name }}[ + {%- if returns.slice.cls == "ExprTuple" -%} + {{ returns.slice.elements|map(attribute="name")|join(", ") }} + {%- else -%} + {{ returns.slice.name }} + {%- endif -%} + ] +{%- else -%} + {{ returns|string }} +{%- endif -%} +{%- endmacro %} + +{%- macro format_module_return_type(returns, module, full_data) -%} +{%- if returns.cls == "ExprName" -%} + {%- if returns.name in module.members and module.members[returns.name].kind == "alias" -%} + {{ module.members[returns.name].target_path }} + {%- else -%} + {{ returns.name }} + {%- endif -%} +{%- elif returns.cls == "ExprSubscript" and returns.left is defined -%} + {{ returns.left.name }}[ + {%- if returns.slice.cls == "ExprTuple" -%} + {{ returns.slice.elements|map(attribute="name")|join(", ") }} + {%- else -%} + {{ returns.slice.name }} + {%- endif -%} + ] +{%- else -%} + {{ returns|string }} +{%- endif -%} +{%- endmacro %} \ No newline at end of file diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index 94222c381..30dcdcc37 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -1,331 +1,84 @@ -{%- macro is_public(doc) -%} - {%- if doc.name == "__init__" and (doc.docstring or (doc.kind == "function" and doc.signature_without_self.parameters)) -%} - true - {%- elif doc.name == "__doc__" -%} - {%- elif doc.kind == "module" and doc.fullname not in all_modules -%} - {%- elif (doc.qualname or doc.name) is in(validmind.members.__all__.value.elements if validmind.members.__all__ and validmind.members.__all__.value.elements else []) -%} - true - {%- elif not doc.name.startswith("_") and (doc.kind != "variable" or doc.is_enum_member or doc.docstring) -%} - true - {%- endif -%} -{%- endmacro -%} - -{%- macro format_return_type(returns) -%} -{%- if returns.cls == "ExprName" -%} - {%- if returns.name in validmind.members.client.members and validmind.members.client.members[returns.name].kind == "alias" -%} - {{ validmind.members.client.members[returns.name].target_path }} - {%- else -%} - {{ returns.name }} - {%- endif -%} -{%- elif returns.cls == "ExprSubscript" and returns.left is defined -%} - {{ returns.left.name }}[ - {%- if returns.slice.cls == "ExprTuple" -%} - {{ returns.slice.elements|map(attribute="name")|join(", ") }} - {%- else -%} - {{ returns.slice.name }} - {%- endif -%} - ] -{%- else -%} - {{ returns|string }} -{%- endif -%} -{%- endmacro %} - -{%- macro resolve_alias_path(member) -%} - {%- if member.kind == "alias" and member.target_path -%} - {{ member.target_path }} - {%- else -%} - {{ "" }} - {%- endif -%} -{%- endmacro -%} - -{%- macro get_flattened_members(module, level=1) -%} - {% if module.members -%} - {% for member_name, member in module.members.items() -%} - {% if member.kind == "module" and not member_name.startswith("_") and member_name not in ["preprocess", "preprocessing"] %} -{{ "#" * (level + 2) }} {{ member_name }} - -{% if member.docstring %} -{{ member.docstring.value if member.docstring.value is defined else member.docstring }} +{% import "macros/docstring.jinja2" as doc %} +{% import "macros/types.jinja2" as types %} +{% import "macros/navigation.jinja2" as nav %} +--- +title: {{ module.name }} +toc-depth: 3 +toc-expand: 3 +{% if module.name == "validmind" %} +aliases: + - index.html {% endif %} +--- -{% if member.members %} -{{ get_flattened_members(member, level + 1) }} +{% if module.docstring %} +{{ doc.format_docstring(module.docstring) }} {% endif %} - {% elif member.kind == "class" and not member_name.startswith("_") %} -{{ "#" * (level + 3) }} class {{ member_name }}{% if member.bases %}({{ member.bases[0].name }}){% endif %} - -{{ member.docstring.value if member.docstring and member.docstring.value else member.docstring }} +{% if module.members and module.name == "validmind" %} +## Python API - {% if member.members %} - {% for method_name, method in member.members.items() -%} - {% if not method_name.startswith("_") %} +{% if module.members.__version__ %} +### __version__ -{{ "#" * (level + 4) }} {{ method_name }}() ```python -def {{ method_name }}({% for param in method.parameters %}{{ param.name }}{% if param.default is not none %} = {{ param.default }}{% endif -%}{% if not loop.last %}, {% endif -%}{% endfor %}): +{{ module.members.__version__.value | replace("'", "") if module.members.__version__.value else module.members.__version__.members.__version__.value | replace("'", "") }} ``` -{% if member.docstring %} -{{ format_docstring_content(member.docstring.value if member.docstring.value is defined else member.docstring) }} {% endif %} - {%- endif -%} - {% endfor %} - {%- endif -%} - {% elif member.kind == "function" and not member_name.startswith("_") - and not member_name.startswith("simple_preprocess") %} - -{{ "#" * (level + 4) }} {{ member_name }}() +{% for member in module.members | sort_members %} +{% if is_public(member, module, full_data, is_root) and member.kind == "alias" %} +{% set target = resolve_alias(member, full_data) %} +{% if target and target.docstring %} +### {{ member.name }}[()]{.muted} +{% if target.kind == "function" %} ```python -def {{ member_name }}({% for param in member.parameters %}{{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation.left.name if param.annotation.cls == "ExprSubscript" else "" }}{% endif -%}{% if param.default is not none %} = {{ param.default }}{% endif -%}{% if not loop.last %}, {% endif -%}{% endfor %}){% if member.returns %} -> {{ format_return_type(member.returns) }}{% endif %} -``` - -{% if member.docstring %} -{{ format_docstring_content(member.docstring.value if member.docstring.value is defined else member.docstring) }} +{% if target.labels and "async" in target.labels %}async {% endif %} +def {{ member.name }}( +{% for param in target.parameters %} + {{ '**' if param.kind == 'variadic keyword' else '*' if param.kind == 'variadic positional' else '' }}{{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation.left.name if param.annotation.cls == "ExprSubscript" else "" }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %}, {% endif %} - - {% endif -%} - {% endfor %} - {% endif -%} -{% endmacro -%} - -{%- macro show_submodules(module) -%} - {%- if module.members -%} -#### Module Hierarchy - - {%- for submember_name, submember in module.members.items() -%} - {%- if submember.kind == "module" and not submember_name.startswith("_") -%} - -##### {{ submember_name }} - -* [{{ submember_name }}]({{ submember_name }}.qmd) -{% if submember.docstring %} -{{ submember.docstring.value if submember.docstring.value is defined else submember.docstring }} - -{% endif -%} - {%- if submember.members -%} - {%- for subsubmember_name, subsubmember in submember.members.items() -%} - {%- if subsubmember.kind == "module" and not subsubmember_name.startswith("_") -%} - -###### {{ subsubmember_name }} - -* [{{ subsubmember_name }}]({{ submember_name }}/{{ subsubmember_name }}.qmd) -{% if subsubmember.docstring %} -{{ subsubmember.docstring.value if subsubmember.docstring.value is defined else subsubmember.docstring }} - -{% endif -%} - {%- endif -%} - {%- endfor -%} - {%- endif -%} - {%- endif -%} - {%- endfor -%} - {%- endif -%} -{%- endmacro -%} - -{%- macro resolve_decorator(member, validmind) -%} - {%- if member.kind == "alias" and member.target_path -%} - {%- set path_parts = member.target_path.split(".") -%} - {%- set current_module = validmind -%} - - {%- if "tests" in current_module.members -%} - {%- set current_module = current_module.members["tests"] -%} - {%- if "decorator" in current_module.members -%} - {%- set current_module = current_module.members["decorator"] -%} - {%- set target_name = path_parts[-1] -%} - {%- if target_name in current_module.members -%} - {%- set target = current_module.members[target_name] -%} -```python -def {{ target_name }}({% if target.parameters -%} - {%- for param in target.parameters -%} - {{ param.name }}{% if param.kind == "variadic positional" %}*{% endif -%}{% if param.kind == "variadic keyword" %}**{% endif -%}{% if param.default is not none %} = {{ param.default }}{% endif -%}{% if not loop.last %}, {% endif -%} - {%- endfor -%} -{%- endif -%}): -``` - -{% if target.docstring %} -{{ format_docstring_content(target.docstring.value if target.docstring.value is defined else target.docstring) }} -{%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endif -%} -{%- endmacro -%} - -{%- macro format_docstring_content(docstring) -%} - {%- set docstring = docstring.replace(':\n-', ':\n\n-') -%} - {%- set docstring = docstring.replace('\n ', ' ') -%} - {%- set docstring = docstring.replace(':param ', '\n**Parameters**\n\n- **') -%} - {%- set docstring = docstring.replace(': ', '**: ', 1) -%} - {%- set docstring = docstring.replace(':return: ', '\n**Returns**\n\n- ') -%} - {%- set lines = docstring.split('\n') -%} - {%- set formatted_lines = [] -%} - {%- for line in lines -%} - {%- if line.startswith('### ') -%} - {%- set line = line.replace('### ', '###### ') -%} - {%- elif line.strip() == 'Args:' -%} - {%- set line = '**Arguments**\n' -%} - {%- elif line.strip() == 'Attributes:' -%} - {%- set line = '**Attributes**\n' -%} - {%- elif line.strip() == 'Raises:' -%} - {%- set line = '**Raises**\n' -%} - {%- elif line.strip() == 'Returns:' -%} - {%- set line = '**Returns**\n' -%} - {%- elif line.startswith(' ') -%} - {%- set trimmed = line.strip() -%} - {%- if ':' in trimmed -%} - {%- set parts = trimmed.split(':', 1) -%} - {%- set param = parts[0].strip() -%} - {%- set desc = parts[1].strip() -%} - {%- if '[DEPRECATED]' in desc -%} - {%- set desc = desc.replace('[DEPRECATED]', '') ~ '^[**Deprecation notice**
`' ~ param ~ '` has been deprecated and will be removed in a future release.]' -%} - {%- endif -%} - {%- set line = '- **' ~ param ~ '**: ' ~ desc -%} - {%- else -%} - {%- set line = '- ' ~ trimmed -%} - {%- endif -%} - {%- endif -%} - {%- if line.strip() or line.startswith(' ') -%} - {%- set _ = formatted_lines.append(line) -%} - {%- else -%} - {%- set _ = formatted_lines.append('') -%} - {%- endif -%} - {%- endfor -%} - {{ formatted_lines | join('\n') }} -{%- endmacro -%} - ---- -title: {{ "ValidMind Library" if validmind.name == "validmind" else validmind.name | capitalize }} -toc-depth: 4 -toc-expand: 4 -toc-location: left -toc-title: "" ---- -{% if validmind.name != "validmind" %} - {% set parentmodule = validmind.filepath.split("/")[-2] if validmind.filepath is defined and "/" in validmind.filepath else None %} - {% if parentmodule and parentmodule in all_modules %} - [← {{ parentmodule }}](../{{ parentmodule }}.qmd) - {% endif -%} -{% endif -%} - -{% if validmind.docstring %} -{{ validmind.docstring.value if validmind.docstring.value is defined else validmind.docstring }} -{%- endif -%} -{% if validmind.members %} - -## Python Library API -{% for member_name, member in validmind.members.items() -%} - {% if member_name == "__version__" - or (member.kind != "module" and "'" + member_name + "'" in validmind.members.__all__.value.elements) - or (member.kind == "alias" - and member.target_path - and member.target_path.startswith("validmind.") - and not member.name.startswith("_") - and ("'" + member.target_path.split(".")[-2] + "'" in validmind.members.__all__.value.elements)) %} -{% set display_name = "\_\_version\_\_" if member_name == "__version__" else member_name + "()" %} -### {{ display_name }} -{%- set resolved = member -%} -{% if member.kind == "alias" -%} - {% if member_name in ['tags', 'tasks', 'test'] -%} - {% set resolved = None -%} - {% set decorator_output = resolve_decorator(member, validmind) -%} - {% else -%} - {% set target_path = resolve_alias_path(member) -%} - {% if target_path -%} - {% set path_parts = target_path.split(".") -%} - {% set module_name = path_parts[-2] -%} - {% if module_name in validmind.members -%} - {% set module = validmind.members[module_name] -%} - {% set target_name = path_parts[-1] -%} - {% if target_name in module.members -%} - {% set resolved = module.members[target_name] -%} - {%- if resolved.kind == "alias" and resolved.target_path %} - {% set inner_module_name = resolved.target_path.split(".")[-2] -%} - {% set inner_target_name = resolved.target_path.split(".")[-1] -%} - {% if inner_module_name in validmind.members -%} - {% set inner_module = validmind.members[inner_module_name] -%} - {% if inner_target_name in inner_module.members -%} - {% set resolved = inner_module.members[inner_target_name] -%} - {%- endif %} - {%- endif %} - {%- endif %} - {%- endif %} - {%- endif %} - {%- endif %} - {%- endif %} -{%- endif %} - -{% if member_name in ['tags', 'tasks', 'test'] and decorator_output is defined -%} -{{ decorator_output }} -{% elif resolved and resolved.kind == "function" -%} -{%- if resolved.labels and "async" in resolved.labels %}async {% endif -%} -```python -def {{ member_name }}{% if resolved.parameters %}( -{%- for param in resolved.parameters %} - {{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation.left.name if param.annotation.cls == "ExprSubscript" else "" }}{% endif -%}{% if param.default is not none %} = {{ param.default }}{% endif -%}{% if not loop.last %}, {% endif -%} {%- endfor %} -){% else %}(){% endif -%} -{%- if resolved.returns %} -> {{ format_return_type(resolved.returns) }}:{% endif %} +){% if target.returns %} -> {{ types.format_module_return_type(target.returns, module, full_data) }}{% endif %}: ``` -{% if resolved.docstring %} -{{ format_docstring_content(resolved.docstring.value if resolved.docstring.value is defined else resolved.docstring) }} -{%- endif -%} - -{% if resolved.decorators %} -#### Decorators: - -{% for decorator in resolved.decorators %} -- {{ decorator.value.values[0].name if decorator.value.cls == "ExprAttribute" else decorator.value }} -{% endfor %} -{% endif -%} - -{% elif member_name == "__version__" -%} -{% set version_value = member.members.__version__.value if member.members and member.members.__version__ -%} -```python -{{ version_value | replace("'", "") }} -``` -{% elif resolved.kind == "class" %} -{% if resolved.docstring %} -{{ format_docstring_content(resolved.docstring.value if resolved.docstring.value is defined else resolved.docstring) }} -{% endif -%} - -{% if resolved.bases %} -**Bases**: {% for base in resolved.bases %}{{ base[2] }}{% if not loop.last %}, {% endif -%}{% endfor %} -{% endif -%} +{% endif %} -{% if resolved.decorators %} -**Decorators**: -{% for decorator in resolved.decorators %} -- {{ decorator.value.name if decorator.value.cls == "ExprName" else decorator.value.values[0].name if decorator.value.cls == "ExprAttribute" else decorator.value }} +{{ doc.format_docstring(target.docstring) }} +{% endif %} +{% endif %} {% endfor %} -{% endif -%} - -{% else %} -{% if resolved.target_path %}**Import Path**: `{{ resolved.target_path }}`{% endif -%} - -{% if resolved.docstring %} -{{ format_docstring_content(resolved.docstring.value if resolved.docstring.value is defined else resolved.docstring) }} -{% endif -%} -{% endif -%} +{% endif %} - {% endif -%} +{% if module.members %} +{# List modules #} +{% set has_modules = namespace(value=false) %} +{% for member in module.members | sort_members %} +{% if is_public(member, module, full_data, is_root) and member.kind == "module" %} +{% set has_modules.value = true %} +{% endif %} {% endfor %} +{% if has_modules.value and module.name == "validmind" %} ## Submodules -{% for member_name, member in validmind.members.items() %} - {% if member.kind == "module" and "'" + member_name + "'" in validmind.members.__all__.value.elements %} -{% set display_name = "\_\_version\_\_" if member_name == "__version__" else member_name -%} -### {{ display_name }} -{% if member.target_path %}**Import Path**: `{{ member.target_path }}`{% endif -%} - -{% if member.docstring %} -{{ member.docstring.value if member.docstring.value is defined else member.docstring }} -{% endif -%} +{% endif %} -{{ get_flattened_members(member) }} - {% endif -%} +{% for member in module.members | sort_members %} +{% if is_public(member, module, full_data, is_root) and member.kind == "module" %} +- [{{ member.name }}]({{ module.name }}/{{ member.name }}.qmd) +{% endif %} {% endfor %} -{{ show_submodules(validmind) }} -{% endif -%} \ No newline at end of file +{# List classes and functions #} +{% for member in module.members | sort_members %} +{% if is_public(member, module, full_data, is_root) %} +{% set resolved = resolve_alias(member, full_data) %} +{% if resolved.kind == "class" %} +{% include "class.qmd.jinja2" %} +{% elif resolved.kind == "function" %} +{% include "function.qmd.jinja2" %} +{% endif %} +{% endif %} +{% endfor %} +{% endif %} \ No newline at end of file diff --git a/docs/templates/template.qmd.jinja2_OLD b/docs/templates/template.qmd.jinja2_OLD new file mode 100644 index 000000000..94222c381 --- /dev/null +++ b/docs/templates/template.qmd.jinja2_OLD @@ -0,0 +1,331 @@ +{%- macro is_public(doc) -%} + {%- if doc.name == "__init__" and (doc.docstring or (doc.kind == "function" and doc.signature_without_self.parameters)) -%} + true + {%- elif doc.name == "__doc__" -%} + {%- elif doc.kind == "module" and doc.fullname not in all_modules -%} + {%- elif (doc.qualname or doc.name) is in(validmind.members.__all__.value.elements if validmind.members.__all__ and validmind.members.__all__.value.elements else []) -%} + true + {%- elif not doc.name.startswith("_") and (doc.kind != "variable" or doc.is_enum_member or doc.docstring) -%} + true + {%- endif -%} +{%- endmacro -%} + +{%- macro format_return_type(returns) -%} +{%- if returns.cls == "ExprName" -%} + {%- if returns.name in validmind.members.client.members and validmind.members.client.members[returns.name].kind == "alias" -%} + {{ validmind.members.client.members[returns.name].target_path }} + {%- else -%} + {{ returns.name }} + {%- endif -%} +{%- elif returns.cls == "ExprSubscript" and returns.left is defined -%} + {{ returns.left.name }}[ + {%- if returns.slice.cls == "ExprTuple" -%} + {{ returns.slice.elements|map(attribute="name")|join(", ") }} + {%- else -%} + {{ returns.slice.name }} + {%- endif -%} + ] +{%- else -%} + {{ returns|string }} +{%- endif -%} +{%- endmacro %} + +{%- macro resolve_alias_path(member) -%} + {%- if member.kind == "alias" and member.target_path -%} + {{ member.target_path }} + {%- else -%} + {{ "" }} + {%- endif -%} +{%- endmacro -%} + +{%- macro get_flattened_members(module, level=1) -%} + {% if module.members -%} + {% for member_name, member in module.members.items() -%} + {% if member.kind == "module" and not member_name.startswith("_") and member_name not in ["preprocess", "preprocessing"] %} +{{ "#" * (level + 2) }} {{ member_name }} + +{% if member.docstring %} +{{ member.docstring.value if member.docstring.value is defined else member.docstring }} +{% endif %} + +{% if member.members %} +{{ get_flattened_members(member, level + 1) }} +{% endif %} + + {% elif member.kind == "class" and not member_name.startswith("_") %} +{{ "#" * (level + 3) }} class {{ member_name }}{% if member.bases %}({{ member.bases[0].name }}){% endif %} + +{{ member.docstring.value if member.docstring and member.docstring.value else member.docstring }} + + {% if member.members %} + {% for method_name, method in member.members.items() -%} + {% if not method_name.startswith("_") %} + +{{ "#" * (level + 4) }} {{ method_name }}() +```python +def {{ method_name }}({% for param in method.parameters %}{{ param.name }}{% if param.default is not none %} = {{ param.default }}{% endif -%}{% if not loop.last %}, {% endif -%}{% endfor %}): +``` +{% if member.docstring %} +{{ format_docstring_content(member.docstring.value if member.docstring.value is defined else member.docstring) }} +{% endif %} + + {%- endif -%} + {% endfor %} + {%- endif -%} + {% elif member.kind == "function" and not member_name.startswith("_") + and not member_name.startswith("simple_preprocess") %} + +{{ "#" * (level + 4) }} {{ member_name }}() + +```python +def {{ member_name }}({% for param in member.parameters %}{{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation.left.name if param.annotation.cls == "ExprSubscript" else "" }}{% endif -%}{% if param.default is not none %} = {{ param.default }}{% endif -%}{% if not loop.last %}, {% endif -%}{% endfor %}){% if member.returns %} -> {{ format_return_type(member.returns) }}{% endif %} +``` + +{% if member.docstring %} +{{ format_docstring_content(member.docstring.value if member.docstring.value is defined else member.docstring) }} +{% endif %} + + {% endif -%} + {% endfor %} + {% endif -%} +{% endmacro -%} + +{%- macro show_submodules(module) -%} + {%- if module.members -%} +#### Module Hierarchy + + {%- for submember_name, submember in module.members.items() -%} + {%- if submember.kind == "module" and not submember_name.startswith("_") -%} + +##### {{ submember_name }} + +* [{{ submember_name }}]({{ submember_name }}.qmd) +{% if submember.docstring %} +{{ submember.docstring.value if submember.docstring.value is defined else submember.docstring }} + +{% endif -%} + {%- if submember.members -%} + {%- for subsubmember_name, subsubmember in submember.members.items() -%} + {%- if subsubmember.kind == "module" and not subsubmember_name.startswith("_") -%} + +###### {{ subsubmember_name }} + +* [{{ subsubmember_name }}]({{ submember_name }}/{{ subsubmember_name }}.qmd) +{% if subsubmember.docstring %} +{{ subsubmember.docstring.value if subsubmember.docstring.value is defined else subsubmember.docstring }} + +{% endif -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} + {%- endif -%} + {%- endfor -%} + {%- endif -%} +{%- endmacro -%} + +{%- macro resolve_decorator(member, validmind) -%} + {%- if member.kind == "alias" and member.target_path -%} + {%- set path_parts = member.target_path.split(".") -%} + {%- set current_module = validmind -%} + + {%- if "tests" in current_module.members -%} + {%- set current_module = current_module.members["tests"] -%} + {%- if "decorator" in current_module.members -%} + {%- set current_module = current_module.members["decorator"] -%} + {%- set target_name = path_parts[-1] -%} + {%- if target_name in current_module.members -%} + {%- set target = current_module.members[target_name] -%} +```python +def {{ target_name }}({% if target.parameters -%} + {%- for param in target.parameters -%} + {{ param.name }}{% if param.kind == "variadic positional" %}*{% endif -%}{% if param.kind == "variadic keyword" %}**{% endif -%}{% if param.default is not none %} = {{ param.default }}{% endif -%}{% if not loop.last %}, {% endif -%} + {%- endfor -%} +{%- endif -%}): +``` + +{% if target.docstring %} +{{ format_docstring_content(target.docstring.value if target.docstring.value is defined else target.docstring) }} +{%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} + {%- endif -%} +{%- endmacro -%} + +{%- macro format_docstring_content(docstring) -%} + {%- set docstring = docstring.replace(':\n-', ':\n\n-') -%} + {%- set docstring = docstring.replace('\n ', ' ') -%} + {%- set docstring = docstring.replace(':param ', '\n**Parameters**\n\n- **') -%} + {%- set docstring = docstring.replace(': ', '**: ', 1) -%} + {%- set docstring = docstring.replace(':return: ', '\n**Returns**\n\n- ') -%} + {%- set lines = docstring.split('\n') -%} + {%- set formatted_lines = [] -%} + {%- for line in lines -%} + {%- if line.startswith('### ') -%} + {%- set line = line.replace('### ', '###### ') -%} + {%- elif line.strip() == 'Args:' -%} + {%- set line = '**Arguments**\n' -%} + {%- elif line.strip() == 'Attributes:' -%} + {%- set line = '**Attributes**\n' -%} + {%- elif line.strip() == 'Raises:' -%} + {%- set line = '**Raises**\n' -%} + {%- elif line.strip() == 'Returns:' -%} + {%- set line = '**Returns**\n' -%} + {%- elif line.startswith(' ') -%} + {%- set trimmed = line.strip() -%} + {%- if ':' in trimmed -%} + {%- set parts = trimmed.split(':', 1) -%} + {%- set param = parts[0].strip() -%} + {%- set desc = parts[1].strip() -%} + {%- if '[DEPRECATED]' in desc -%} + {%- set desc = desc.replace('[DEPRECATED]', '') ~ '^[**Deprecation notice**
`' ~ param ~ '` has been deprecated and will be removed in a future release.]' -%} + {%- endif -%} + {%- set line = '- **' ~ param ~ '**: ' ~ desc -%} + {%- else -%} + {%- set line = '- ' ~ trimmed -%} + {%- endif -%} + {%- endif -%} + {%- if line.strip() or line.startswith(' ') -%} + {%- set _ = formatted_lines.append(line) -%} + {%- else -%} + {%- set _ = formatted_lines.append('') -%} + {%- endif -%} + {%- endfor -%} + {{ formatted_lines | join('\n') }} +{%- endmacro -%} + +--- +title: {{ "ValidMind Library" if validmind.name == "validmind" else validmind.name | capitalize }} +toc-depth: 4 +toc-expand: 4 +toc-location: left +toc-title: "" +--- +{% if validmind.name != "validmind" %} + {% set parentmodule = validmind.filepath.split("/")[-2] if validmind.filepath is defined and "/" in validmind.filepath else None %} + {% if parentmodule and parentmodule in all_modules %} + [← {{ parentmodule }}](../{{ parentmodule }}.qmd) + {% endif -%} +{% endif -%} + +{% if validmind.docstring %} +{{ validmind.docstring.value if validmind.docstring.value is defined else validmind.docstring }} +{%- endif -%} +{% if validmind.members %} + +## Python Library API +{% for member_name, member in validmind.members.items() -%} + {% if member_name == "__version__" + or (member.kind != "module" and "'" + member_name + "'" in validmind.members.__all__.value.elements) + or (member.kind == "alias" + and member.target_path + and member.target_path.startswith("validmind.") + and not member.name.startswith("_") + and ("'" + member.target_path.split(".")[-2] + "'" in validmind.members.__all__.value.elements)) %} +{% set display_name = "\_\_version\_\_" if member_name == "__version__" else member_name + "()" %} +### {{ display_name }} +{%- set resolved = member -%} +{% if member.kind == "alias" -%} + {% if member_name in ['tags', 'tasks', 'test'] -%} + {% set resolved = None -%} + {% set decorator_output = resolve_decorator(member, validmind) -%} + {% else -%} + {% set target_path = resolve_alias_path(member) -%} + {% if target_path -%} + {% set path_parts = target_path.split(".") -%} + {% set module_name = path_parts[-2] -%} + {% if module_name in validmind.members -%} + {% set module = validmind.members[module_name] -%} + {% set target_name = path_parts[-1] -%} + {% if target_name in module.members -%} + {% set resolved = module.members[target_name] -%} + {%- if resolved.kind == "alias" and resolved.target_path %} + {% set inner_module_name = resolved.target_path.split(".")[-2] -%} + {% set inner_target_name = resolved.target_path.split(".")[-1] -%} + {% if inner_module_name in validmind.members -%} + {% set inner_module = validmind.members[inner_module_name] -%} + {% if inner_target_name in inner_module.members -%} + {% set resolved = inner_module.members[inner_target_name] -%} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endif %} +{%- endif %} + +{% if member_name in ['tags', 'tasks', 'test'] and decorator_output is defined -%} +{{ decorator_output }} +{% elif resolved and resolved.kind == "function" -%} +{%- if resolved.labels and "async" in resolved.labels %}async {% endif -%} +```python +def {{ member_name }}{% if resolved.parameters %}( +{%- for param in resolved.parameters %} + {{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation.left.name if param.annotation.cls == "ExprSubscript" else "" }}{% endif -%}{% if param.default is not none %} = {{ param.default }}{% endif -%}{% if not loop.last %}, {% endif -%} +{%- endfor %} +){% else %}(){% endif -%} +{%- if resolved.returns %} -> {{ format_return_type(resolved.returns) }}:{% endif %} +``` +{% if resolved.docstring %} +{{ format_docstring_content(resolved.docstring.value if resolved.docstring.value is defined else resolved.docstring) }} +{%- endif -%} + +{% if resolved.decorators %} +#### Decorators: + +{% for decorator in resolved.decorators %} +- {{ decorator.value.values[0].name if decorator.value.cls == "ExprAttribute" else decorator.value }} +{% endfor %} +{% endif -%} + +{% elif member_name == "__version__" -%} +{% set version_value = member.members.__version__.value if member.members and member.members.__version__ -%} +```python +{{ version_value | replace("'", "") }} +``` +{% elif resolved.kind == "class" %} +{% if resolved.docstring %} +{{ format_docstring_content(resolved.docstring.value if resolved.docstring.value is defined else resolved.docstring) }} +{% endif -%} + +{% if resolved.bases %} +**Bases**: {% for base in resolved.bases %}{{ base[2] }}{% if not loop.last %}, {% endif -%}{% endfor %} +{% endif -%} + +{% if resolved.decorators %} +**Decorators**: +{% for decorator in resolved.decorators %} +- {{ decorator.value.name if decorator.value.cls == "ExprName" else decorator.value.values[0].name if decorator.value.cls == "ExprAttribute" else decorator.value }} +{% endfor %} +{% endif -%} + +{% else %} +{% if resolved.target_path %}**Import Path**: `{{ resolved.target_path }}`{% endif -%} + +{% if resolved.docstring %} +{{ format_docstring_content(resolved.docstring.value if resolved.docstring.value is defined else resolved.docstring) }} +{% endif -%} +{% endif -%} + + {% endif -%} +{% endfor %} + +## Submodules +{% for member_name, member in validmind.members.items() %} + {% if member.kind == "module" and "'" + member_name + "'" in validmind.members.__all__.value.elements %} +{% set display_name = "\_\_version\_\_" if member_name == "__version__" else member_name -%} +### {{ display_name }} + +{% if member.target_path %}**Import Path**: `{{ member.target_path }}`{% endif -%} + +{% if member.docstring %} +{{ member.docstring.value if member.docstring.value is defined else member.docstring }} +{% endif -%} + +{{ get_flattened_members(member) }} + {% endif -%} +{% endfor %} + +{{ show_submodules(validmind) }} +{% endif -%} \ No newline at end of file diff --git a/docs/validmind.qmd b/docs/validmind.qmd new file mode 100644 index 000000000..e9610415a --- /dev/null +++ b/docs/validmind.qmd @@ -0,0 +1,459 @@ +--- +title: validmind +toc-depth: 3 +toc-expand: 3 +aliases: + - index.html +--- + +The ValidMind Library is a suite of developer tools and methods designed to automate the documentation and validation of your models. + +Designed to be model agnostic, the ValidMind Library provides all the standard functionality without requiring you to rewrite any functions as long as your model is built in Python. + +With a rich array of documentation tools and test suites, from documenting descriptions of your datasets to testing your models for weak spots and overfit areas, the ValidMind Library helps you automate model documentation by feeding the ValidMind Platform with documentation artifacts and test results. + +To install the ValidMind Library: + +```bash +pip install validmind +``` + +To initialize the ValidMind Library, paste the code snippet with the model identifier credentials directly into your development source code, replacing this example with your own: + +```python +import validmind as vm + +vm.init( + api_host = "https://api.dev.vm.validmind.ai/api/v1/tracking/tracking", + api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + api_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + project = "" +) +``` + +After you have pasted the code snippet into your development source code and executed the code, the Python Library API will register with ValidMind. You can now use the ValidMind Library to document and test your models, and to upload to the ValidMind Platform. + + + + + +## Python API + +### __version__ + +```python +2.8.0 +``` + +### get_test_suite[()]{.muted} + +```python +def get_test_suite( + test_suite_id: str = None, + section: str = None, + *args = (), + **kwargs = {}) -> TestSuite: +``` + +Gets a TestSuite object for the current project or a specific test suite + +This function provides an interface to retrieve the TestSuite instance for the +current project or a specific TestSuite instance identified by test_suite_id. +The project Test Suite will contain sections for every section in the project's +documentation template and these Test Suite Sections will contain all the tests +associated with that template section. + +**Arguments** + +- **test_suite_id (str, optional)****: The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. +- **section (str, optional)**: The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. +- **args**: Additional arguments to pass to the TestSuite +- **kwargs**: Additional keyword arguments to pass to the TestSuite + + + + +### init[()]{.muted} + +```python +def init( + project: Optional = None, + api_key: Optional = None, + api_secret: Optional = None, + api_host: Optional = None, + model: Optional = None, + monitoring: bool = False): +``` + +Initializes the API client instances and calls the /ping endpoint to ensure +the provided credentials are valid and we can connect to the ValidMind API. + +If the API key and secret are not provided, the client will attempt to +retrieve them from the environment variables `VM_API_KEY` and `VM_API_SECRET`. + +**Arguments** + +- **project (str, optional)****: The project CUID. Alias for model. Defaults to None. ^[**Deprecation notice**
`project (str, optional)**` has been deprecated and will be removed in a future release.] +- **model (str, optional)**: The model CUID. Defaults to None. +- **api_key (str, optional)**: The API key. Defaults to None. +- **api_secret (str, optional)**: The API secret. Defaults to None. +- **api_host (str, optional)**: The API host. Defaults to None. +- **monitoring (bool)**: The ongoing monitoring flag. Defaults to False. + +**Raises** + +- **ValueError**: If the API key and secret are not provided + + + + +### init_dataset[()]{.muted} + +```python +def init_dataset( + dataset, + model = None, + index = None, + index_name: str = None, + date_time_index: bool = False, + columns: list = None, + text_column: str = None, + target_column: str = None, + feature_columns: list = None, + extra_columns: dict = None, + class_labels: dict = None, + type: str = None, + input_id: str = None, + __log = True) -> VMDataset: +``` + +Initializes a VM Dataset, which can then be passed to other functions +that can perform additional analysis and tests on the data. This function +also ensures we are reading a valid dataset type. + +The following dataset types are supported: + +- Pandas DataFrame +- Polars DataFrame +- Numpy ndarray +- Torch TensorDataset + +**Arguments** + +- **dataset ****: dataset from various python libraries +- **model (VMModel)**: ValidMind model object +- **targets (vm.vm.DatasetTargets)**: A list of target variables +- **target_column (str)**: The name of the target column in the dataset +- **feature_columns (list)**: A list of names of feature columns in the dataset +- **extra_columns (dictionary)**: A dictionary containing the names of the +- prediction_column and group_by_columns in the dataset +- **class_labels (dict)**: A list of class labels for classification problems +- **type (str)**: The type of dataset (one of DATASET_TYPES) +- **input_id (str)**: The input ID for the dataset (e.g. "my_dataset"). By default, this will be set to `dataset` but if you are passing this dataset as a test input using some other key than `dataset`, then you should set this to the same key. + +**Raises** + +- **ValueError**: If the dataset type is not supported + +**Returns** + +- **vm.vm.Dataset**: A VM Dataset instance + + + + +### init_model[()]{.muted} + +```python +def init_model( + model: object = None, + input_id: str = 'model', + attributes: dict = None, + predict_fn: callable = None, + __log = True, + **kwargs = {}) -> VMModel: +``` + +Initializes a VM Model, which can then be passed to other functions +that can perform additional analysis and tests on the data. This function +also ensures we are creating a model supported libraries. + +**Arguments** + +- **model****: A trained model or VMModel instance +- **input_id (str)**: The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. +- **attributes (dict)**: A dictionary of model attributes +- **predict_fn (callable)**: A function that takes an input and returns a prediction +- ****kwargs**: Additional arguments to pass to the model + +**Raises** + +- **ValueError**: If the model type is not supported + +**Returns** + +- **vm.VMModel**: A VM Model instance + + + + +### init_r_model[()]{.muted} + +```python +def init_r_model( + model_path: str, + input_id: str = 'model') -> VMModel: +``` + +Initializes a VM Model for an R model + +R models must be saved to disk and the filetype depends on the model type... +Currently we support the following model types: + +- LogisticRegression `glm` model in R**: saved as an RDS file with `saveRDS` +- LinearRegression `lm` model in R: saved as an RDS file with `saveRDS` +- XGBClassifier: saved as a .json or .bin file with `xgb.save` +- XGBRegressor: saved as a .json or .bin file with `xgb.save` + +LogisticRegression and LinearRegression models are converted to sklearn models by extracting +the coefficients and intercept from the R model. XGB models are loaded using the xgboost +since xgb models saved in .json or .bin format can be loaded directly with either Python or R + +**Arguments** + +- **model_path (str)**: The path to the R model saved as an RDS or XGB file +- **model_type (str)**: The type of the model (one of R_MODEL_TYPES) + +**Returns** + +- **vm.vm.Model**: A VM Model instance + + + + +### log_metric[()]{.muted} + +```python +def log_metric( + key: str, + value: float, + inputs: Optional = None, + params: Optional = None, + recorded_at: Optional = None, + thresholds: Optional = None): +``` + +Logs a unit metric + +Unit metrics are key-value pairs where the key is the metric name and the value is +a scalar (int or float). These key-value pairs are associated with the currently +selected model (inventory model in the ValidMind Platform) and keys can be logged +to over time to create a history of the metric. On the ValidMind Platform, these metrics +will be used to create plots/visualizations for documentation and dashboards etc. + +**Arguments** + +- **key (str)****: The metric key +- **value (float)**: The metric value +- **inputs (list, optional)**: A list of input IDs that were used to compute the metric. +- **params (dict, optional)**: Dictionary of parameters used to compute the metric. +- **recorded_at (str, optional)**: The timestamp of the metric. Server will use current time if not provided. +- **thresholds (dict, optional)**: Dictionary of thresholds for the metric. + + + + +### preview_template[()]{.muted} + +```python +def preview_template( +): +``` + +Preview the documentation template for the current project + +This function will display the documentation template for the current project. If +the project has not been initialized, then an error will be raised. + +**Raises** + +- **ValueError****: If the project has not been initialized + + + + +### reload[()]{.muted} + +```python +def reload( +): +``` + +Reconnect to the ValidMind API and reload the project configuration + + + + +### run_documentation_tests[()]{.muted} + +```python +def run_documentation_tests( + section = None, + send = True, + fail_fast = False, + inputs = None, + config = None, + **kwargs = {}): +``` + +Collect and run all the tests associated with a template + +This function will analyze the current project's documentation template and collect +all the tests associated with it into a test suite. It will then run the test +suite, log the results to the ValidMind API, and display them to the user. + +**Arguments** + +- **section (str or list, optional)****: The section(s) to preview. Defaults to None. +- **send (bool, optional)**: Whether to send the results to the ValidMind API. Defaults to True. +- **fail_fast (bool, optional)**: Whether to stop running tests after the first failure. Defaults to False. +- **inputs (dict, optional)**: A dictionary of test inputs to pass to the TestSuite +- **config**: A dictionary of test parameters to override the defaults +- ****kwargs**: backwards compatibility for passing in test inputs using keyword arguments + +**Returns** + +- **TestSuite or dict**: The completed TestSuite instance or a dictionary of TestSuites if section is a list. + +**Raises** + +- **ValueError**: If the project has not been initialized + + + + +### run_test_suite[()]{.muted} + +```python +def run_test_suite( + test_suite_id, + send = True, + fail_fast = False, + config = None, + inputs = None, + **kwargs = {}): +``` + +High Level function for running a test suite + +This function provides a high level interface for running a test suite. A test suite is +a collection of tests. This function will automatically find the correct test suite +class based on the test_suite_id, initialize each of the tests, and run them. + +**Arguments** + +- **test_suite_id (str)****: The test suite name (e.g. 'classifier_full_suite') +- **config (dict, optional)**: A dictionary of parameters to pass to the tests in the test suite. Defaults to None. +- **send (bool, optional)**: Whether to post the test results to the API. send=False is useful for testing. Defaults to True. +- **fail_fast (bool, optional)**: Whether to stop running tests after the first failure. Defaults to False. +- **inputs (dict, optional)**: A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` `models` etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. +- ****kwargs**: backwards compatibility for passing in test inputs using keyword arguments + +**Raises** + +- **ValueError**: If the test suite name is not found or if there is an error initializing the test suite + +**Returns** + +- **TestSuite**: the TestSuite instance + + + + +### tags[()]{.muted} + +```python +def tags( + *tags = ()): +``` + +Decorator for specifying tags for a test. + +**Arguments** + +- ***tags****: The tags to apply to the test. + + + + +### tasks[()]{.muted} + +```python +def tasks( + *tasks = ()): +``` + +Decorator for specifying the task types that a test is designed for. + +**Arguments** + +- ***tasks****: The task types that the test is designed for. + + + + +### test[()]{.muted} + +```python +def test( + func_or_id): +``` + +Decorator for creating and registering custom tests + +This decorator registers the function it wraps as a test function within ValidMind +under the provided ID. Once decorated, the function can be run using the +`validmind.tests.run_test` function. + +The function can take two different types of arguments: + +- Inputs**: ValidMind model or dataset (or list of models/datasets). These arguments + must use the following names: `model`, `models`, `dataset`, `datasets`. +- Parameters: Any additional keyword arguments of any type (must have a default + value) that can have any name. + +The function should return one of the following types: + +- Table: Either a list of dictionaries or a pandas DataFrame +- Plot: Either a matplotlib figure or a plotly figure +- Scalar: A single number (int or float) +- Boolean: A single boolean value indicating whether the test passed or failed + +The function may also include a docstring. This docstring will be used and logged +as the metric's description. + +**Arguments** + +- **func**: The function to decorate +- **test_id**: The identifier for the metric. If not provided, the function name is used. + +**Returns** + +- The decorated function. + + + + + + +## Submodules + + +- [datasets](validmind/datasets.qmd) +- [errors](validmind/errors.qmd) +- [test_suites](validmind/test_suites.qmd) +- [tests](validmind/tests.qmd) +- [unit_metrics](validmind/unit_metrics.qmd) +- [vm_models](validmind/vm_models.qmd) + + \ No newline at end of file diff --git a/docs/validmind/datasets.qmd b/docs/validmind/datasets.qmd new file mode 100644 index 000000000..31d92e519 --- /dev/null +++ b/docs/validmind/datasets.qmd @@ -0,0 +1,20 @@ +--- +title: datasets +toc-depth: 3 +toc-expand: 3 +--- + +Example datasets that can be used with the ValidMind Library. + + + + + + + + +- [classification](datasets/classification.qmd) +- [credit_risk](datasets/credit_risk.qmd) +- [nlp](datasets/nlp.qmd) +- [regression](datasets/regression.qmd) + diff --git a/docs/validmind/datasets/classification.qmd b/docs/validmind/datasets/classification.qmd new file mode 100644 index 000000000..4809d587c --- /dev/null +++ b/docs/validmind/datasets/classification.qmd @@ -0,0 +1,18 @@ +--- +title: classification +toc-depth: 3 +toc-expand: 3 +--- + +Entrypoint for classification datasets. + + + + + + + + +- [customer_churn](classification/customer_churn.qmd) +- [taiwan_credit](classification/taiwan_credit.qmd) + diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd new file mode 100644 index 000000000..8570b7b90 --- /dev/null +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -0,0 +1,44 @@ +--- +title: customer_churn +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### get_demo_test_config + +Returns input configuration for the default documentation +template assigned to this demo model + +The default documentation template uses the following inputs: + +- raw_dataset +- train_dataset +- test_dataset +- model + +We assign the following inputs depending on the input config expected +by each test: + +- When a test expects a "dataset" we use the raw_dataset +- When a tets expects "datasets" we use the train_dataset and test_dataset +- When a test expects a "model" we use the model +- When a test expects "model" and "dataset" we use the model and test_dataset +- The only exception is ClassifierPerformance since that runs twice**: once +- with the train_dataset (in sample) and once with the test_dataset (out of sample) + + + + + +#### load_data + + +#### preprocess + + \ No newline at end of file diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd new file mode 100644 index 000000000..2a7600e8e --- /dev/null +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -0,0 +1,18 @@ +--- +title: taiwan_credit +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### load_data + + +#### preprocess + + \ No newline at end of file diff --git a/docs/validmind/datasets/credit_risk.qmd b/docs/validmind/datasets/credit_risk.qmd new file mode 100644 index 000000000..be844f42b --- /dev/null +++ b/docs/validmind/datasets/credit_risk.qmd @@ -0,0 +1,18 @@ +--- +title: credit_risk +toc-depth: 3 +toc-expand: 3 +--- + +Entrypoint for credit risk datasets. + + + + + + + + +- [lending_club](credit_risk/lending_club.qmd) +- [lending_club_bias](credit_risk/lending_club_bias.qmd) + diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd new file mode 100644 index 000000000..f092213e0 --- /dev/null +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -0,0 +1,87 @@ +--- +title: lending_club +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### compute_scores + + +#### feature_engineering + + +#### get_demo_test_config + +Get demo test configuration. + +**Arguments** + +- **x_test****: Test features DataFrame +- **y_test**: Test target Series + +**Returns** + +- **dict**: Test configuration dictionary + + + + + +#### init_vm_objects + + +#### load_data + +Load data from either an online source or offline files, automatically dropping specified columns for offline data. + + +**Parameters** + +- **source**: 'online' for online data, 'offline' for offline files. Defaults to 'online'. + +**Returns** + +- DataFrame containing the loaded data. + + + + + +#### load_scorecard + + +#### load_test_config + + +#### preprocess + + +#### split + +Split dataset into train, validation (optional), and test sets. + +**Arguments** + +- **df****: Input DataFrame +- **validation_split**: If None, returns train/test split. If float, returns train/val/test split +- **test_size**: Proportion of data for test set (default: 0.2) +- **add_constant**: Whether to add constant column for statsmodels (default: False) + +**Returns** + +- **If validation_size is None**: train_df, test_df +- **If validation_size is float**: train_df, validation_df, test_df + + + + + +#### woe_encoding + + \ No newline at end of file diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd new file mode 100644 index 000000000..6b26244a1 --- /dev/null +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -0,0 +1,31 @@ +--- +title: lending_club_bias +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### compute_scores + + +#### load_data + +Load data from the specified CSV file. + +:return**: DataFrame containing the loaded data. + + + + + +#### preprocess + + +#### split + + \ No newline at end of file diff --git a/docs/validmind/datasets/nlp.qmd b/docs/validmind/datasets/nlp.qmd new file mode 100644 index 000000000..2264d70fa --- /dev/null +++ b/docs/validmind/datasets/nlp.qmd @@ -0,0 +1,18 @@ +--- +title: nlp +toc-depth: 3 +toc-expand: 3 +--- + +Example datasets that can be used with the ValidMind Library. + + + + + + + + +- [cnn_dailymail](nlp/cnn_dailymail.qmd) +- [twitter_covid_19](nlp/twitter_covid_19.qmd) + diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd new file mode 100644 index 000000000..09ac0fa7a --- /dev/null +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -0,0 +1,41 @@ +--- +title: cnn_dailymail +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### display_nice + +Primary function to format and display a DataFrame. + + + + + +#### load_data + +Load data from either online source or offline files. + + +**Parameters** + +- **source**: 'online' for online data, 'offline' for offline data. Defaults to 'online'. + +**Parameters** + +- **dataset_size: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. + +**Returns** + +- DataFrame containing the loaded data. + + + + + \ No newline at end of file diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd new file mode 100644 index 000000000..88c409013 --- /dev/null +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -0,0 +1,15 @@ +--- +title: twitter_covid_19 +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### load_data + + \ No newline at end of file diff --git a/docs/validmind/datasets/regression.qmd b/docs/validmind/datasets/regression.qmd new file mode 100644 index 000000000..aefd059fd --- /dev/null +++ b/docs/validmind/datasets/regression.qmd @@ -0,0 +1,18 @@ +--- +title: regression +toc-depth: 3 +toc-expand: 3 +--- + +Entrypoint for regression datasets + + + + + + + + +- [fred](regression/fred.qmd) +- [lending_club](regression/lending_club.qmd) + diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd new file mode 100644 index 000000000..0e99a666a --- /dev/null +++ b/docs/validmind/datasets/regression/fred.qmd @@ -0,0 +1,53 @@ +--- +title: fred +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### load_all_data + + +#### load_data + + +#### load_model + + +#### load_processed_data + + +#### load_test_dataset + + +#### load_train_dataset + + +#### preprocess + +Split a time series DataFrame into train, validation, and test sets. + +Parameters: +- **df (pandas.DataFrame)****: The time series DataFrame to be split. +- **split_option (str)**: The split option to choose from: 'train_test_val' (default) or 'train_test'. +- **train_size (float)**: The proportion of the dataset to include in the training set. Default is 0.6. +- **test_size (float)**: The proportion of the dataset to include in the test set. Default is 0.2. + +**Returns** + +- **train_df (pandas.DataFrame)**: The training set. +- **validation_df (pandas.DataFrame)**: The validation set (only returned if split_option is 'train_test_val'). +- **test_df (pandas.DataFrame)**: The test set. + + + + + +#### transform + + \ No newline at end of file diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd new file mode 100644 index 000000000..387fd6a33 --- /dev/null +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -0,0 +1,38 @@ +--- +title: lending_club +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### load_data + + +#### preprocess + +Split a time series DataFrame into train, validation, and test sets. + +Parameters: +- **df (pandas.DataFrame)****: The time series DataFrame to be split. +- **split_option (str)**: The split option to choose from: 'train_test_val' (default) or 'train_test'. +- **train_size (float)**: The proportion of the dataset to include in the training set. Default is 0.6. +- **test_size (float)**: The proportion of the dataset to include in the test set. Default is 0.2. + +**Returns** + +- **train_df (pandas.DataFrame)**: The training set. +- **validation_df (pandas.DataFrame)**: The validation set (only returned if split_option is 'train_test_val'). +- **test_df (pandas.DataFrame)**: The test set. + + + + + +#### transform + + \ No newline at end of file diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd new file mode 100644 index 000000000..3f6c66e7c --- /dev/null +++ b/docs/validmind/errors.qmd @@ -0,0 +1,424 @@ +--- +title: errors +toc-depth: 3 +toc-expand: 3 +--- + +This module contains all the custom errors that are used in the ValidMind Library. + +The following base errors are defined for others: + +- BaseError +- APIRequestError + + + + + + + + + + +#### raise_api_error + +Safely try to parse JSON from the response message in case the API +returns a non-JSON string or if the API returns a non-standard error + + + + + +#### should_raise_on_fail_fast + +Determine whether an error should be raised when fail_fast is True. + + + + +**Returns:** bool + + +### Class: APIRequestError + +Generic error for API request errors that are not known. + + + + + +**Bases:** BaseError + + +### Class: BaseError + +**Bases:** Exception + +#### Methods + + +### Class: GetTestSuiteError + +When the test suite could not be found. + + + + + +**Bases:** BaseError + + +### Class: InitializeTestSuiteError + +When the test suite was found but could not be initialized. + + + + + +**Bases:** BaseError + + +### Class: InvalidAPICredentialsError + +**Bases:** APIRequestError + +#### Methods + + +### Class: InvalidContentIdPrefixError + +When an invalid text content_id is sent to the API. + + + + + +**Bases:** APIRequestError + + +### Class: InvalidInputError + +When an invalid input object. + + + + + +**Bases:** BaseError + + +### Class: InvalidMetricResultsError + +When an invalid metric results object is sent to the API. + + + + + +**Bases:** APIRequestError + + +### Class: InvalidProjectError + +**Bases:** APIRequestError + +#### Methods + + +### Class: InvalidRequestBodyError + +When a POST/PUT request is made with an invalid request body. + + + + + +**Bases:** APIRequestError + + +### Class: InvalidTestParametersError + +When an invalid parameters for the test. + + + + + +**Bases:** BaseError + + +### Class: InvalidTestResultsError + +When an invalid test results object is sent to the API. + + + + + +**Bases:** APIRequestError + + +### Class: InvalidTextObjectError + +When an invalid Metadat (Text) object is sent to the API. + + + + + +**Bases:** APIRequestError + + +### Class: InvalidValueFormatterError + +When an invalid value formatter is provided when serializing results. + + + + + +**Bases:** BaseError + + +### Class: InvalidXGBoostTrainedModelError + +When an invalid XGBoost trained model is used when calling init_r_model. + + + + + +**Bases:** BaseError + + +### Class: LoadTestError + +Exception raised when an error occurs while loading a test + + + + + +**Bases:** BaseError + +#### Methods + + +### Class: MismatchingClassLabelsError + +When the class labels found in the dataset don't match the provided target labels. + + + + + +**Bases:** BaseError + + +### Class: MissingAPICredentialsError + +**Bases:** BaseError + +#### Methods + + +### Class: MissingCacheResultsArgumentsError + +When the cache_results function is missing arguments. + + + + + +**Bases:** BaseError + + +### Class: MissingClassLabelError + +When the one or more class labels are missing from provided dataset targets. + + + + + +**Bases:** BaseError + + +### Class: MissingDependencyError + +When a required dependency is missing. + + + + + +**Bases:** BaseError + +#### Methods + + +### Class: MissingDocumentationTemplate + +When the client config is missing the documentation template. + + + + + +**Bases:** BaseError + + +### Class: MissingModelIdError + +**Bases:** BaseError + +#### Methods + + +### Class: MissingOrInvalidModelPredictFnError + +When the pytorch model is missing a predict function or its predict +method does not have the expected arguments. + + + + + +**Bases:** BaseError + + +### Class: MissingRequiredTestInputError + +When a required test context variable is missing. + + + + + +**Bases:** BaseError + + +### Class: MissingRExtrasError + +When the R extras have not been installed. + + + + + +**Bases:** BaseError + +#### Methods + + +### Class: MissingTextContentIdError + +When a Text object is sent to the API without a content_id. + + + + + +**Bases:** APIRequestError + + +### Class: MissingTextContentsError + +When a Text object is sent to the API without a "text" attribute. + + + + + +**Bases:** APIRequestError + + +### Class: SkipTestError + +Useful error to throw when a test cannot be executed. + + + + + +**Bases:** BaseError + + +### Class: TestInputInvalidDatasetError + +When an invalid dataset is used in a test context. + + + + + +**Bases:** BaseError + + +### Class: UnsupportedColumnTypeError + +When an unsupported column type is found on a dataset. + + + + + +**Bases:** BaseError + + +### Class: UnsupportedDatasetError + +When an unsupported dataset is used. + + + + + +**Bases:** BaseError + + +### Class: UnsupportedFigureError + +When an unsupported figure object is constructed. + + + + + +**Bases:** BaseError + + +### Class: UnsupportedModelError + +When an unsupported model is used. + + + + + +**Bases:** BaseError + + +### Class: UnsupportedModelForSHAPError + +When an unsupported model is used for SHAP importance. + + + + + +**Bases:** BaseError + + +### Class: UnsupportedRModelError + +When an unsupported R model is used. + + + + + +**Bases:** BaseError + + \ No newline at end of file diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd new file mode 100644 index 000000000..f0dee525a --- /dev/null +++ b/docs/validmind/test_suites.qmd @@ -0,0 +1,70 @@ +--- +title: test_suites +toc-depth: 3 +toc-expand: 3 +--- + +Entrypoint for test suites. + + + + + + + + +- [classifier](test_suites/classifier.qmd) +- [cluster](test_suites/cluster.qmd) +- [embeddings](test_suites/embeddings.qmd) +- [llm](test_suites/llm.qmd) +- [nlp](test_suites/nlp.qmd) +- [parameters_optimization](test_suites/parameters_optimization.qmd) +- [regression](test_suites/regression.qmd) +- [statsmodels_timeseries](test_suites/statsmodels_timeseries.qmd) +- [summarization](test_suites/summarization.qmd) +- [tabular_datasets](test_suites/tabular_datasets.qmd) +- [text_data](test_suites/text_data.qmd) +- [time_series](test_suites/time_series.qmd) + + +#### describe_suite + +Describes a Test Suite by ID + +**Arguments** + +- **test_suite_id****: Test Suite ID +- **verbose**: If True, describe all plans and tests in the Test Suite + +**Returns** + +- **pandas.DataFrame**: A formatted table with the Test Suite description + + + + + +#### get_by_id + +Returns the test suite by ID + + + + + +#### list_suites + +Returns a list of all available test suites + + + + + +#### register_test_suite + +Registers a custom test suite + + + + + \ No newline at end of file diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd new file mode 100644 index 000000000..08d6f6740 --- /dev/null +++ b/docs/validmind/test_suites/classifier.qmd @@ -0,0 +1,85 @@ +--- +title: classifier +toc-depth: 3 +toc-expand: 3 +--- + +Test suites for sklearn-compatible classifier models + +Ideal setup is to have the API client to read a +custom test suite from the project's configuration + + + + + + + + + + +### Class: ClassifierDiagnosis + +Test suite for sklearn classifier model diagnosis tests + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: ClassifierFullSuite + +Full test suite for binary classification models. + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: ClassifierMetrics + +Test suite for sklearn classifier metrics + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: ClassifierModelValidation + +Test suite for binary classification models. + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: ClassifierPerformance + +Test suite for sklearn classifier models + + + + + +**Bases:** TestSuite + +#### Methods + + \ No newline at end of file diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd new file mode 100644 index 000000000..b682d2fbd --- /dev/null +++ b/docs/validmind/test_suites/cluster.qmd @@ -0,0 +1,59 @@ +--- +title: cluster +toc-depth: 3 +toc-expand: 3 +--- + +Test suites for sklearn-compatible clustering models + +Ideal setup is to have the API client to read a +custom test suite from the project's configuration + + + + + + + + + + +### Class: ClusterFullSuite + +Full test suite for clustering models. + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: ClusterMetrics + +Test suite for sklearn clustering metrics + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: ClusterPerformance + +Test suite for sklearn cluster performance + + + + + +**Bases:** TestSuite + +#### Methods + + \ No newline at end of file diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd new file mode 100644 index 000000000..71dd73a3a --- /dev/null +++ b/docs/validmind/test_suites/embeddings.qmd @@ -0,0 +1,59 @@ +--- +title: embeddings +toc-depth: 3 +toc-expand: 3 +--- + +Test suites for embeddings models + +Ideal setup is to have the API client to read a +custom test suite from the project's configuration + + + + + + + + + + +### Class: EmbeddingsFullSuite + +Full test suite for embeddings models. + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: EmbeddingsMetrics + +Test suite for embeddings metrics + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: EmbeddingsPerformance + +Test suite for embeddings model performance + + + + + +**Bases:** TestSuite + +#### Methods + + \ No newline at end of file diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd new file mode 100644 index 000000000..a74c005b4 --- /dev/null +++ b/docs/validmind/test_suites/llm.qmd @@ -0,0 +1,43 @@ +--- +title: llm +toc-depth: 3 +toc-expand: 3 +--- + +Test suites for LLMs + + + + + + + + + + +### Class: LLMClassifierFullSuite + +Full test suite for LLM classification models. + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: PromptValidation + +Test suite for prompt validation + + + + + +**Bases:** TestSuite + +#### Methods + + \ No newline at end of file diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd new file mode 100644 index 000000000..e61d1a767 --- /dev/null +++ b/docs/validmind/test_suites/nlp.qmd @@ -0,0 +1,30 @@ +--- +title: nlp +toc-depth: 3 +toc-expand: 3 +--- + +Test suites for NLP models + + + + + + + + + + +### Class: NLPClassifierFullSuite + +Full test suite for NLP classification models. + + + + + +**Bases:** TestSuite + +#### Methods + + \ No newline at end of file diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd new file mode 100644 index 000000000..c7b290552 --- /dev/null +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -0,0 +1,33 @@ +--- +title: parameters_optimization +toc-depth: 3 +toc-expand: 3 +--- + +Test suites for sklearn-compatible hyper parameters tunning + +Ideal setup is to have the API client to read a +custom test suite from the project's configuration + + + + + + + + + + +### Class: KmeansParametersOptimization + +Test suite for sklearn hyperparameters optimization + + + + + +**Bases:** TestSuite + +#### Methods + + \ No newline at end of file diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd new file mode 100644 index 000000000..83305745d --- /dev/null +++ b/docs/validmind/test_suites/regression.qmd @@ -0,0 +1,51 @@ +--- +title: regression +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +### Class: RegressionFullSuite + +Full test suite for regression models. + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: RegressionMetrics + +Test suite for performance metrics of regression metrics + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: RegressionPerformance + +Test suite for regression model performance + + + + + +**Bases:** TestSuite + +#### Methods + + \ No newline at end of file diff --git a/docs/validmind/test_suites/statsmodels_timeseries.qmd b/docs/validmind/test_suites/statsmodels_timeseries.qmd new file mode 100644 index 000000000..1e8ed79bd --- /dev/null +++ b/docs/validmind/test_suites/statsmodels_timeseries.qmd @@ -0,0 +1,43 @@ +--- +title: statsmodels_timeseries +toc-depth: 3 +toc-expand: 3 +--- + +Time Series Test Suites from statsmodels + + + + + + + + + + +### Class: RegressionModelDescription + +Test suite for performance metric of regression model of statsmodels library + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: RegressionModelsEvaluation + +Test suite for metrics comparison of regression model of statsmodels library + + + + + +**Bases:** TestSuite + +#### Methods + + \ No newline at end of file diff --git a/docs/validmind/test_suites/summarization.qmd b/docs/validmind/test_suites/summarization.qmd new file mode 100644 index 000000000..d3f5d2605 --- /dev/null +++ b/docs/validmind/test_suites/summarization.qmd @@ -0,0 +1,30 @@ +--- +title: summarization +toc-depth: 3 +toc-expand: 3 +--- + +Test suites for llm summarization models + + + + + + + + + + +### Class: SummarizationMetrics + +Test suite for Summarization metrics + + + + + +**Bases:** TestSuite + +#### Methods + + \ No newline at end of file diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd new file mode 100644 index 000000000..0f0d8e0d4 --- /dev/null +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -0,0 +1,57 @@ +--- +title: tabular_datasets +toc-depth: 3 +toc-expand: 3 +--- + +Test suites for tabular datasets + + + + + + + + + + +### Class: TabularDataQuality + +Test suite for data quality on tabular datasets + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: TabularDataset + +Test suite for tabular datasets. + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: TabularDatasetDescription + +Test suite to extract metadata and descriptive +statistics from a tabular dataset + + + + + +**Bases:** TestSuite + +#### Methods + + \ No newline at end of file diff --git a/docs/validmind/test_suites/text_data.qmd b/docs/validmind/test_suites/text_data.qmd new file mode 100644 index 000000000..d6273c441 --- /dev/null +++ b/docs/validmind/test_suites/text_data.qmd @@ -0,0 +1,30 @@ +--- +title: text_data +toc-depth: 3 +toc-expand: 3 +--- + +Test suites for text datasets + + + + + + + + + + +### Class: TextDataQuality + +Test suite for data quality on text data + + + + + +**Bases:** TestSuite + +#### Methods + + \ No newline at end of file diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd new file mode 100644 index 000000000..e5d48a9ad --- /dev/null +++ b/docs/validmind/test_suites/time_series.qmd @@ -0,0 +1,100 @@ +--- +title: time_series +toc-depth: 3 +toc-expand: 3 +--- + +Time Series Test Suites + + + + + + + + + + +### Class: TimeSeriesDataQuality + +Test suite for data quality on time series datasets + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: TimeSeriesDataset + +Test suite for time series datasets. + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: TimeSeriesModelValidation + +Test suite for time series model validation. + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: TimeSeriesMultivariate + +This test suite provides a preliminary understanding of the features +and relationship in multivariate dataset. It presents various +multivariate visualizations that can help identify patterns, trends, +and relationships between pairs of variables. The visualizations are +designed to explore the relationships between multiple features +simultaneously. They allow you to quickly identify any patterns or +trends in the data, as well as any potential outliers or anomalies. +The individual feature distribution can also be explored to provide +insight into the range and frequency of values observed in the data. +This multivariate analysis test suite aims to provide an overview of +the data structure and guide further exploration and modeling. + + + + + +**Bases:** TestSuite + +#### Methods + + +### Class: TimeSeriesUnivariate + +This test suite provides a preliminary understanding of the target variable(s) +used in the time series dataset. It visualizations that present the raw time +series data and a histogram of the target variable(s). + +The raw time series data provides a visual inspection of the target variable's +behavior over time. This helps to identify any patterns or trends in the data, +as well as any potential outliers or anomalies. The histogram of the target +variable displays the distribution of values, providing insight into the range +and frequency of values observed in the data. + + + + + +**Bases:** TestSuite + +#### Methods + + \ No newline at end of file diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd new file mode 100644 index 000000000..725909b7b --- /dev/null +++ b/docs/validmind/tests.qmd @@ -0,0 +1,35 @@ +--- +title: tests +toc-depth: 3 +toc-expand: 3 +--- + +ValidMind Tests Module + + + + + + + + +- [data_validation](tests/data_validation.qmd) +- [model_validation](tests/model_validation.qmd) +- [prompt_validation](tests/prompt_validation.qmd) + + +#### register_test_provider + +Register an external test provider + +**Arguments** + +- **namespace (str)****: The namespace of the test provider +- **test_provider (TestProvider)**: The test provider + + + + +**Returns:** None + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation.qmd b/docs/validmind/tests/data_validation.qmd new file mode 100644 index 000000000..27e2d42fd --- /dev/null +++ b/docs/validmind/tests/data_validation.qmd @@ -0,0 +1,71 @@ +--- +title: data_validation +toc-depth: 3 +toc-expand: 3 +--- + + + + + +- [ACFandPACFPlot](data_validation/ACFandPACFPlot.qmd) +- [ADF](data_validation/ADF.qmd) +- [AutoAR](data_validation/AutoAR.qmd) +- [AutoMA](data_validation/AutoMA.qmd) +- [AutoStationarity](data_validation/AutoStationarity.qmd) +- [BivariateScatterPlots](data_validation/BivariateScatterPlots.qmd) +- [BoxPierce](data_validation/BoxPierce.qmd) +- [ChiSquaredFeaturesTable](data_validation/ChiSquaredFeaturesTable.qmd) +- [ClassImbalance](data_validation/ClassImbalance.qmd) +- [DatasetDescription](data_validation/DatasetDescription.qmd) +- [DatasetSplit](data_validation/DatasetSplit.qmd) +- [DescriptiveStatistics](data_validation/DescriptiveStatistics.qmd) +- [DickeyFullerGLS](data_validation/DickeyFullerGLS.qmd) +- [Duplicates](data_validation/Duplicates.qmd) +- [EngleGrangerCoint](data_validation/EngleGrangerCoint.qmd) +- [FeatureTargetCorrelationPlot](data_validation/FeatureTargetCorrelationPlot.qmd) +- [HighCardinality](data_validation/HighCardinality.qmd) +- [HighPearsonCorrelation](data_validation/HighPearsonCorrelation.qmd) +- [IQROutliersBarPlot](data_validation/IQROutliersBarPlot.qmd) +- [IQROutliersTable](data_validation/IQROutliersTable.qmd) +- [IsolationForestOutliers](data_validation/IsolationForestOutliers.qmd) +- [JarqueBera](data_validation/JarqueBera.qmd) +- [KPSS](data_validation/KPSS.qmd) +- [LaggedCorrelationHeatmap](data_validation/LaggedCorrelationHeatmap.qmd) +- [LJungBox](data_validation/LJungBox.qmd) +- [MissingValues](data_validation/MissingValues.qmd) +- [MissingValuesBarPlot](data_validation/MissingValuesBarPlot.qmd) +- [MutualInformation](data_validation/MutualInformation.qmd) +- [nlp](data_validation/nlp.qmd) +- [PearsonCorrelationMatrix](data_validation/PearsonCorrelationMatrix.qmd) +- [PhillipsPerronArch](data_validation/PhillipsPerronArch.qmd) +- [ProtectedClassesCombination](data_validation/ProtectedClassesCombination.qmd) +- [ProtectedClassesDescription](data_validation/ProtectedClassesDescription.qmd) +- [ProtectedClassesDisparity](data_validation/ProtectedClassesDisparity.qmd) +- [ProtectedClassesThresholdOptimizer](data_validation/ProtectedClassesThresholdOptimizer.qmd) +- [RollingStatsPlot](data_validation/RollingStatsPlot.qmd) +- [RunsTest](data_validation/RunsTest.qmd) +- [ScatterPlot](data_validation/ScatterPlot.qmd) +- [ScoreBandDefaultRates](data_validation/ScoreBandDefaultRates.qmd) +- [SeasonalDecompose](data_validation/SeasonalDecompose.qmd) +- [ShapiroWilk](data_validation/ShapiroWilk.qmd) +- [Skewness](data_validation/Skewness.qmd) +- [SpreadPlot](data_validation/SpreadPlot.qmd) +- [TabularCategoricalBarPlots](data_validation/TabularCategoricalBarPlots.qmd) +- [TabularDateTimeHistograms](data_validation/TabularDateTimeHistograms.qmd) +- [TabularDescriptionTables](data_validation/TabularDescriptionTables.qmd) +- [TabularNumericalHistograms](data_validation/TabularNumericalHistograms.qmd) +- [TargetRateBarPlots](data_validation/TargetRateBarPlots.qmd) +- [TimeSeriesDescription](data_validation/TimeSeriesDescription.qmd) +- [TimeSeriesDescriptiveStatistics](data_validation/TimeSeriesDescriptiveStatistics.qmd) +- [TimeSeriesFrequency](data_validation/TimeSeriesFrequency.qmd) +- [TimeSeriesHistogram](data_validation/TimeSeriesHistogram.qmd) +- [TimeSeriesLinePlot](data_validation/TimeSeriesLinePlot.qmd) +- [TimeSeriesMissingValues](data_validation/TimeSeriesMissingValues.qmd) +- [TimeSeriesOutliers](data_validation/TimeSeriesOutliers.qmd) +- [TooManyZeroValues](data_validation/TooManyZeroValues.qmd) +- [UniqueRows](data_validation/UniqueRows.qmd) +- [WOEBinPlots](data_validation/WOEBinPlots.qmd) +- [WOEBinTable](data_validation/WOEBinTable.qmd) +- [ZivotAndrewsArch](data_validation/ZivotAndrewsArch.qmd) + diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd new file mode 100644 index 000000000..0b8dce1ee --- /dev/null +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -0,0 +1,56 @@ +--- +title: ACFandPACFPlot +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ACFandPACFPlot + +Analyzes time series data using Autocorrelation Function (ACF) and Partial Autocorrelation Function (PACF) plots to +reveal trends and correlations. + +###### Purpose + +The ACF (Autocorrelation Function) and PACF (Partial Autocorrelation Function) plot test is employed to analyze +time series data in machine learning models. It illuminates the correlation of the data over time by plotting the +correlation of the series with its own lags (ACF), and the correlations after removing effects already accounted +for by earlier lags (PACF). This information can identify trends, such as seasonality, degrees of autocorrelation, +and inform the selection of order parameters for AutoRegressive Integrated Moving Average (ARIMA) models. + +###### Test Mechanism + +The `ACFandPACFPlot` test accepts a dataset with a time-based index. It first confirms the index is of a datetime +type, then handles any NaN values. The test subsequently generates ACF and PACF plots for each column in the +dataset, producing a subplot for each. If the dataset doesn't include key columns, an error is returned. + +###### Signs of High Risk + +- Sudden drops in the correlation at a specific lag might signal a model at high risk. +- Consistent high correlation across multiple lags could also indicate non-stationarity in the data, which may +suggest that a model estimated on this data won't generalize well to future, unknown data. + +###### Strengths + +- ACF and PACF plots offer clear graphical representations of the correlations in time series data. +- These plots are effective at revealing important data characteristics such as seasonality, trends, and +correlation patterns. +- The insights from these plots aid in better model configuration, particularly in the selection of ARIMA model +parameters. + +###### Limitations + +- ACF and PACF plots are exclusively for time series data and hence, can't be applied to all ML models. +- These plots require large, consistent datasets as gaps could lead to misleading results. +- The plots can only represent linear correlations and fail to capture any non-linear relationships within the data. +- The plots might be difficult for non-experts to interpret and should not replace more advanced analyses. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd new file mode 100644 index 000000000..06454d25d --- /dev/null +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -0,0 +1,53 @@ +--- +title: ADF +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ADF + +Assesses the stationarity of a time series dataset using the Augmented Dickey-Fuller (ADF) test. + +###### Purpose + +The Augmented Dickey-Fuller (ADF) test metric is used to determine the order of integration, i.e., the stationarity +of a given time series dataset. The stationary property of data is pivotal in many machine learning models as it +impacts the reliability and effectiveness of predictions and forecasts. + +###### Test Mechanism + +The ADF test is executed using the `adfuller` function from the `statsmodels` library on each feature of the +dataset. Multiple outputs are generated for each run, including the ADF test statistic and p-value, count of lags +used, the number of observations considered in the test, critical values at various confidence levels, and the +information criterion. These results are stored for each feature for subsequent analysis. + +###### Signs of High Risk + +- An inflated ADF statistic and high p-value (generally above 0.05) indicate a high risk to the model's performance +due to the presence of a unit root indicating non-stationarity. +- Non-stationarity might result in untrustworthy or insufficient forecasts. + +###### Strengths + +- The ADF test is robust to sophisticated correlations within the data, making it suitable for settings where data +displays complex stochastic behavior. +- It provides explicit outputs like test statistics, critical values, and information criterion, enhancing +understanding and transparency in the model validation process. + +###### Limitations + +- The ADF test might demonstrate low statistical power, making it challenging to differentiate between a unit root +and near-unit-root processes, potentially causing false negatives. +- It assumes the data follows an autoregressive process, which might not always be the case. +- The test struggles with time series data that have structural breaks. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd new file mode 100644 index 000000000..3eba578db --- /dev/null +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -0,0 +1,60 @@ +--- +title: AutoAR +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### AutoAR + +Automatically identifies the optimal Autoregressive (AR) order for a time series using BIC and AIC criteria. + +###### Purpose + +The AutoAR test is intended to automatically identify the Autoregressive (AR) order of a time series by utilizing +the Bayesian Information Criterion (BIC) and Akaike Information Criterion (AIC). AR order is crucial in forecasting +tasks as it dictates the quantity of prior terms in the sequence to use for predicting the current term. The +objective is to select the most fitting AR model that encapsulates the trend and seasonality in the time series +data. + +###### Test Mechanism + +The test mechanism operates by iterating through a possible range of AR orders up to a defined maximum. An AR model +is fitted for each order, and the corresponding BIC and AIC are computed. BIC and AIC statistical measures are +designed to penalize models for complexity, preferring simpler models that fit the data proficiently. To verify the +stationarity of the time series, the Augmented Dickey-Fuller test is executed. The AR order, BIC, and AIC findings +are compiled into a dataframe for effortless comparison. Then, the AR order with the smallest BIC is established as +the desirable order for each variable. + +###### Signs of High Risk + +- An augmented Dickey Fuller test p-value > 0.05, indicating the time series isn't stationary, may lead to +inaccurate results. +- Problems with the model fitting procedure, such as computational or convergence issues. +- Continuous selection of the maximum specified AR order may suggest an insufficient set limit. + +###### Strengths + +- The test independently pinpoints the optimal AR order, thereby reducing potential human bias. +- It strikes a balance between model simplicity and goodness-of-fit to avoid overfitting. +- Has the capability to account for stationarity in a time series, an essential aspect for dependable AR modeling. +- The results are aggregated into a comprehensive table, enabling an easy interpretation. + +###### Limitations + +- The tests need a stationary time series input. +- They presume a linear relationship between the series and its lags. +- The search for the best model is constrained by the maximum AR order supplied in the parameters. Therefore, a low +max_ar_order could result in subpar outcomes. +- AIC and BIC may not always agree on the selection of the best model. This potentially requires the user to juggle +interpretational choices. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd new file mode 100644 index 000000000..efd993384 --- /dev/null +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -0,0 +1,63 @@ +--- +title: AutoMA +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### AutoMA + +Automatically selects the optimal Moving Average (MA) order for each variable in a time series dataset based on +minimal BIC and AIC values. + +###### Purpose + +The `AutoMA` metric serves an essential role of automated decision-making for selecting the optimal Moving Average +(MA) order for every variable in a given time series dataset. The selection is dependent on the minimalization of +BIC (Bayesian Information Criterion) and AIC (Akaike Information Criterion); these are established statistical +tools used for model selection. Furthermore, prior to the commencement of the model fitting process, the algorithm +conducts a stationarity test (Augmented Dickey-Fuller test) on each series. + +###### Test Mechanism + +Starting off, the `AutoMA` algorithm checks whether the `max_ma_order` parameter has been provided. It consequently +loops through all variables in the dataset, carrying out the Dickey-Fuller test for stationarity. For each +stationary variable, it fits an ARIMA model for orders running from 0 to `max_ma_order`. The result is a list +showcasing the BIC and AIC values of the ARIMA models based on different orders. The MA order, which yields the +smallest BIC, is chosen as the 'best MA order' for every single variable. The final results include a table +summarizing the auto MA analysis and another table listing the best MA order for each variable. + +###### Signs of High Risk + +- When a series is non-stationary (p-value>0.05 in the Dickey-Fuller test), the produced result could be inaccurate. +- Any error that arises in the process of fitting the ARIMA models, especially with a higher MA order, can +potentially indicate risks and might need further investigation. + +###### Strengths + +- The metric facilitates automation in the process of selecting the MA order for time series forecasting. This +significantly saves time and reduces efforts conventionally necessary for manual hyperparameter tuning. +- The use of both BIC and AIC enhances the likelihood of selecting the most suitable model. +- The metric ascertains the stationarity of the series prior to model fitting, thus ensuring that the underlying +assumptions of the MA model are fulfilled. + +###### Limitations + +- If the time series fails to be stationary, the metric may yield inaccurate results. Consequently, it necessitates +pre-processing steps to stabilize the series before fitting the ARIMA model. +- The metric adopts a rudimentary model selection process based on BIC and doesn't consider other potential model +selection strategies. Depending on the specific dataset, other strategies could be more appropriate. +- The 'max_ma_order' parameter must be manually input which doesn't always guarantee optimal performance, +especially when configured too low. +- The computation time increases with the rise in `max_ma_order`, hence, the metric may become computationally +costly for larger values. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd new file mode 100644 index 000000000..0761ecebe --- /dev/null +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -0,0 +1,61 @@ +--- +title: AutoStationarity +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### AutoStationarity + +Automates Augmented Dickey-Fuller test to assess stationarity across multiple time series in a DataFrame. + +###### Purpose + +The AutoStationarity metric is intended to automatically detect and evaluate the stationary nature of each time +series in a DataFrame. It incorporates the Augmented Dickey-Fuller (ADF) test, a statistical approach used to +assess stationarity. Stationarity is a fundamental property suggesting that statistic features like mean and +variance remain unchanged over time. This is necessary for many time-series models. + +###### Test Mechanism + +The mechanism for the AutoStationarity test involves applying the Augmented Dicky-Fuller test to each time series +within the given dataframe to assess if they are stationary. Every series in the dataframe is looped, using the ADF +test up to a defined maximum order (configurable and by default set to 5). The p-value resulting from the ADF test +is compared against a predetermined threshold (also configurable and by default set to 0.05). The time series is +deemed stationary at its current differencing order if the p-value is less than the threshold. + +###### Signs of High Risk + +- A significant number of series not achieving stationarity even at the maximum order of differencing can indicate +high risk or potential failure in the model. +- This could suggest the series may not be appropriately modeled by a stationary process, hence other modeling +approaches might be required. + +###### Strengths + +- The key strength in this metric lies in the automation of the ADF test, enabling mass stationarity analysis +across various time series and boosting the efficiency and credibility of the analysis. +- The utilization of the ADF test, a widely accepted method for testing stationarity, lends authenticity to the +results derived. +- The introduction of the max order and threshold parameters give users the autonomy to determine their preferred +levels of stringency in the tests. + +###### Limitations + +- The Augmented Dickey-Fuller test and the stationarity test are not without their limitations. These tests are +premised on the assumption that the series can be modeled by an autoregressive process, which may not always hold +true. +- The stationarity check is highly sensitive to the choice of threshold for the significance level; an extremely +high or low threshold could lead to incorrect results regarding the stationarity properties. +- There's also a risk of over-differencing if the maximum order is set too high, which could induce unnecessary +cycles. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd new file mode 100644 index 000000000..7632f2804 --- /dev/null +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -0,0 +1,55 @@ +--- +title: BivariateScatterPlots +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### BivariateScatterPlots + +Generates bivariate scatterplots to visually inspect relationships between pairs of numerical predictor variables +in machine learning classification tasks. + +###### Purpose + +This function is intended for visual inspection and monitoring of relationships between pairs of numerical +variables in a machine learning model targeting classification tasks. It helps in understanding how predictor +variables (features) interact with each other, which can inform feature selection, model-building strategies, and +identify potential biases or irregularities in the data. + +###### Test Mechanism + +The function creates scatter plots for each pair of numerical features in the dataset. It first filters out +non-numerical and binary features, ensuring the plots focus on meaningful numerical relationships. The resulting +scatterplots are color-coded uniformly to avoid visual distraction, and the function returns a tuple of Plotly +figure objects, each representing a scatter plot for a pair of features. + +###### Signs of High Risk + +- Visual patterns suggesting non-linear relationships, multicollinearity, clustering, or outlier points in the +scatter plots. +- Such issues could affect the assumptions and performance of certain models, especially those assuming linearity, +like logistic regression. + +###### Strengths + +- Scatterplots provide an intuitive and visual tool to explore relationships between two variables. +- They are useful for identifying outliers, variable associations, and trends, including non-linear patterns. +- Supports visualization of binary or multi-class classification datasets, focusing on numerical features. + +###### Limitations + +- Scatterplots are limited to bivariate analysis, showing relationships between only two variables at a time. +- Not ideal for very large datasets where overlapping points can reduce the clarity of the visualization. +- Scatterplots are exploratory tools and do not provide quantitative measures of model quality or performance. +- Interpretation is subjective and relies on the domain knowledge and judgment of the viewer. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd new file mode 100644 index 000000000..159b5f0d6 --- /dev/null +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -0,0 +1,59 @@ +--- +title: BoxPierce +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### BoxPierce + +Detects autocorrelation in time-series data through the Box-Pierce test to validate model performance. + +###### Purpose + +The Box-Pierce test is utilized to detect the presence of autocorrelation in a time-series dataset. +Autocorrelation, or serial correlation, refers to the degree of similarity between observations based on the +temporal spacing between them. This test is essential for affirming the quality of a time-series model by ensuring +that the error terms in the model are random and do not adhere to a specific pattern. + +###### Test Mechanism + +The implementation of the Box-Pierce test involves calculating a test statistic along with a corresponding p-value +derived from the dataset features. These quantities are used to test the null hypothesis that posits the data to be +independently distributed. This is achieved by iterating over every feature column in the time-series data and +applying the `acorr_ljungbox` function of the statsmodels library. The function yields the Box-Pierce test +statistic as well as the respective p-value, all of which are cached as test results. + +###### Signs of High Risk + +- A low p-value, typically under 0.05 as per statistical convention, throws the null hypothesis of independence +into question. This implies that the dataset potentially houses autocorrelations, thus indicating a high-risk +scenario concerning model performance. +- Large Box-Pierce test statistic values may indicate the presence of autocorrelation. + +###### Strengths + +- Detects patterns in data that are supposed to be random, thereby ensuring no underlying autocorrelation. +- Can be computed efficiently given its low computational complexity. +- Can be widely applied to most regression problems, making it very versatile. + +###### Limitations + +- Assumes homoscedasticity (constant variance) and normality of residuals, which may not always be the case in +real-world datasets. +- May exhibit reduced power for detecting complex autocorrelation schemes such as higher-order or negative +correlations. +- It only provides a general indication of the existence of autocorrelation, without providing specific insights +into the nature or patterns of the detected autocorrelation. +- In the presence of trends or seasonal patterns, the Box-Pierce test may yield misleading results. +- Applicability is limited to time-series data, which limits its overall utility. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd new file mode 100644 index 000000000..04445f626 --- /dev/null +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -0,0 +1,58 @@ +--- +title: ChiSquaredFeaturesTable +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ChiSquaredFeaturesTable + +Assesses the statistical association between categorical features and a target variable using the Chi-Squared test. + +###### Purpose + +The `ChiSquaredFeaturesTable` function is designed to evaluate the relationship between categorical features and a +target variable in a dataset. It performs a Chi-Squared test of independence for each categorical feature to +determine whether a statistically significant association exists with the target variable. This is particularly +useful in Model Risk Management for understanding the relevance of features and identifying potential biases in a +classification model. + +###### Test Mechanism + +The function creates a contingency table for each categorical feature and the target variable, then applies the +Chi-Squared test to compute the Chi-squared statistic and the p-value. The results for each feature include the +variable name, Chi-squared statistic, p-value, p-value threshold, and a pass/fail status based on whether the +p-value is below the specified threshold. The output is a DataFrame summarizing these results, sorted by p-value to +highlight the most statistically significant associations. + +###### Signs of High Risk + +- High p-values (greater than the set threshold) indicate a lack of significant association between a feature and +the target variable, resulting in a 'Fail' status. +- Features with a 'Fail' status might not be relevant for the model, which could negatively impact model +performance. + +###### Strengths + +- Provides a clear, statistical assessment of the relationship between categorical features and the target variable. +- Produces an easily interpretable summary with a 'Pass/Fail' outcome for each feature, helping in feature +selection. +- The p-value threshold is adjustable, allowing for flexibility in statistical rigor. + +###### Limitations + +- Assumes the dataset is tabular and consists of categorical variables, which may not be suitable for all datasets. +- The test is designed for classification tasks and is not applicable to regression problems. +- As with all hypothesis tests, the Chi-Squared test can only detect associations, not causal relationships. +- The choice of p-value threshold can affect the interpretation of feature relevance, and different thresholds may +lead to different conclusions. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd new file mode 100644 index 000000000..3046e9fb9 --- /dev/null +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -0,0 +1,70 @@ +--- +title: ClassImbalance +toc-depth: 3 +toc-expand: 3 +--- + +Threshold based tests + + + + + + + + + + +#### ClassImbalance + +Evaluates and quantifies class distribution imbalance in a dataset used by a machine learning model. + +###### Purpose + +The Class Imbalance test is designed to evaluate the distribution of target classes in a dataset that's utilized by +a machine learning model. Specifically, it aims to ensure that the classes aren't overly skewed, which could lead +to bias in the model's predictions. It's crucial to have a balanced training dataset to avoid creating a model +that's biased with high accuracy for the majority class and low accuracy for the minority class. + +###### Test Mechanism + +This Class Imbalance test operates by calculating the frequency (expressed as a percentage) of each class in the +target column of the dataset. It then checks whether each class appears in at least a set minimum percentage of the +total records. This minimum percentage is a modifiable parameter, but the default value is set to 10%. + +###### Signs of High Risk + +- Any class that represents less than the pre-set minimum percentage threshold is marked as high risk, implying a +potential class imbalance. +- The function provides a pass/fail outcome for each class based on this criterion. +- Fundamentally, if any class fails this test, it's highly likely that the dataset possesses imbalanced class +distribution. + +###### Strengths + +- The test can spot under-represented classes that could affect the efficiency of a machine learning model. +- The calculation is straightforward and swift. +- The test is highly informative because it not only spots imbalance, but it also quantifies the degree of +imbalance. +- The adjustable threshold enables flexibility and adaptation to differing use-cases or domain-specific needs. +- The test creates a visually insightful plot showing the classes and their corresponding proportions, enhancing +interpretability and comprehension of the data. + +###### Limitations + +- The test might struggle to perform well or provide vital insights for datasets with a high number of classes. In +such cases, the imbalance could be inevitable due to the inherent class distribution. +- Sensitivity to the threshold value might result in faulty detection of imbalance if the threshold is set +excessively high. +- Regardless of the percentage threshold, it doesn't account for varying costs or impacts of misclassifying +different classes, which might fluctuate based on specific applications or domains. +- While it can identify imbalances in class distribution, it doesn't provide direct methods to address or correct +these imbalances. +- The test is only applicable for classification operations and unsuitable for regression or clustering tasks. + + + + +**Returns:** + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd new file mode 100644 index 000000000..f86b1981b --- /dev/null +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -0,0 +1,98 @@ +--- +title: DatasetDescription +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### DatasetDescription + +Provides comprehensive analysis and statistical summaries of each column in a machine learning model's dataset. + +###### Purpose + +The test depicted in the script is meant to run a comprehensive analysis on a Machine Learning model's datasets. +The test or metric is implemented to obtain a complete summary of the columns in the dataset, including vital +statistics of each column such as count, distinct values, missing values, histograms for numerical, categorical, +boolean, and text columns. This summary gives a comprehensive overview of the dataset to better understand the +characteristics of the data that the model is trained on or evaluates. + +###### Test Mechanism + +The DatasetDescription class accomplishes the purpose as follows**: firstly, the test method "run" infers the data +type of each column in the dataset and stores the details (id, column type). For each column, the +"describe_column" method is invoked to collect statistical information about the column, including count, +missing value count and its proportion to the total, unique value count, and its proportion to the total. Depending +on the data type of a column, histograms are generated that reflect the distribution of data within the column. +Numerical columns use the "get_numerical_histograms" method to calculate histogram distribution, whereas for +categorical, boolean and text columns, a histogram is computed with frequencies of each unique value in the +datasets. For unsupported types, an error is raised. Lastly, a summary table is built to aggregate all the +statistical insights and histograms of the columns in a dataset. + +###### Signs of High Risk + +- High ratio of missing values to total values in one or more columns which may impact the quality of the +predictions. +- Unsupported data types in dataset columns. +- Large number of unique values in the dataset's columns which might make it harder for the model to establish +patterns. +- Extreme skewness or irregular distribution of data as reflected in the histograms. + +###### Strengths + +- Provides a detailed analysis of the dataset with versatile summaries like count, unique values, histograms, etc. +- Flexibility in handling different types of data: numerical, categorical, boolean, and text. +- Useful in detecting problems in the dataset like missing values, unsupported data types, irregular data +distribution, etc. +- The summary gives a comprehensive understanding of dataset features allowing developers to make informed +decisions. + +###### Limitations + +- The computation can be expensive from a resource standpoint, particularly for large datasets with numerous columns. +- The histograms use an arbitrary number of bins which may not be the optimal number of bins for specific data +distribution. +- Unsupported data types for columns will raise an error which may limit evaluating the dataset. +- Columns with all null or missing values are not included in histogram computation. +- This test only validates the quality of the dataset but doesn't address the model's performance directly. + + + + + +#### describe_column + +Gets descriptive statistics for a single column in a Pandas DataFrame. + + + + + +#### get_column_histograms + +Returns a collection of histograms for a numerical or categorical column. +We store different combinations of bin sizes to allow analyzing the data better + +Will be used in favor of _get_histogram in the future + + + + + +#### get_numerical_histograms + +Returns a collection of histograms for a numerical column, each one +with a different bin size + + + + + +#### infer_datatypes + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd new file mode 100644 index 000000000..e34784f17 --- /dev/null +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -0,0 +1,58 @@ +--- +title: DatasetSplit +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### DatasetSplit + +Evaluates and visualizes the distribution proportions among training, testing, and validation datasets of an ML +model. + +###### Purpose + +The DatasetSplit test is designed to evaluate and visualize the distribution of data among training, testing, and +validation datasets, if available, within a given machine learning model. The main purpose is to assess whether the +model's datasets are split appropriately, as an imbalanced split might affect the model's ability to learn from the +data and generalize to unseen data. + +###### Test Mechanism + +The DatasetSplit test first calculates the total size of all available datasets in the model. Then, for each +individual dataset, the methodology involves determining the size of the dataset and its proportion relative to the +total size. The results are then conveniently summarized in a table that shows dataset names, sizes, and +proportions. Absolute size and proportion of the total dataset size are displayed for each individual dataset. + +###### Signs of High Risk + +- A very small training dataset, which may result in the model not learning enough from the data. +- A very large training dataset and a small test dataset, which may lead to model overfitting and poor +generalization to unseen data. +- A small or non-existent validation dataset, which might complicate the model's performance assessment. + +###### Strengths + +- The DatasetSplit test provides a clear, understandable visualization of dataset split proportions, which can +highlight any potential imbalance in dataset splits quickly. +- It covers a wide range of task types including classification, regression, and text-related tasks. +- The metric is not tied to any specific data type and is applicable to tabular data, time series data, or text +data. + +###### Limitations + +- The DatasetSplit test does not provide any insight into the quality or diversity of the data within each split, +just the size and proportion. +- The test does not give any recommendations or adjustments for imbalanced datasets. +- Potential lack of compatibility with more complex modes of data splitting (for example, stratified or time-based +splits) could limit the applicability of this test. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd new file mode 100644 index 000000000..4bf91fda1 --- /dev/null +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -0,0 +1,68 @@ +--- +title: DescriptiveStatistics +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### DescriptiveStatistics + +Performs a detailed descriptive statistical analysis of both numerical and categorical data within a model's +dataset. + +###### Purpose + +The purpose of the Descriptive Statistics metric is to provide a comprehensive summary of both numerical and +categorical data within a dataset. This involves statistics such as count, mean, standard deviation, minimum and +maximum values for numerical data. For categorical data, it calculates the count, number of unique values, most +common value and its frequency, and the proportion of the most frequent value relative to the total. The goal is to +visualize the overall distribution of the variables in the dataset, aiding in understanding the model's behavior +and predicting its performance. + +###### Test Mechanism + +The testing mechanism utilizes two in-built functions of pandas dataframes**: `describe()` for numerical fields and +`value_counts()` for categorical fields. The `describe()` function pulls out several summary statistics, while +`value_counts()` accounts for unique values. The resulting data is formatted into two distinct tables, one for +numerical and another for categorical variable summaries. These tables provide a clear summary of the main +characteristics of the variables, which can be instrumental in assessing the model's performance. + +###### Signs of High Risk + +- Skewed data or significant outliers can represent high risk. For numerical data, this may be reflected via a +significant difference between the mean and median (50% percentile). +- For categorical data, a lack of diversity (low count of unique values), or overdominance of a single category +(high frequency of the top value) can indicate high risk. + +###### Strengths + +- Provides a comprehensive summary of the dataset, shedding light on the distribution and characteristics of the +variables under consideration. +- It is a versatile and robust method, applicable to both numerical and categorical data. +- Helps highlight crucial anomalies such as outliers, extreme skewness, or lack of diversity, which are vital in +understanding model behavior during testing and validation. + +###### Limitations + +- While this metric offers a high-level overview of the data, it may fail to detect subtle correlations or complex +patterns. +- Does not offer any insights on the relationship between variables. +- Alone, descriptive statistics cannot be used to infer properties about future unseen data. +- Should be used in conjunction with other statistical tests to provide a comprehensive understanding of the +model's data. + + + + + +#### get_summary_statistics_categorical + + +#### get_summary_statistics_numerical + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd new file mode 100644 index 000000000..3f2088685 --- /dev/null +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -0,0 +1,57 @@ +--- +title: DickeyFullerGLS +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### DickeyFullerGLS + +Assesses stationarity in time series data using the Dickey-Fuller GLS test to determine the order of integration. + +###### Purpose + +The Dickey-Fuller GLS (DFGLS) test is utilized to determine the order of integration in time series data. For +machine learning models dealing with time series and forecasting, this metric evaluates the existence of a unit +root, thereby checking whether a time series is non-stationary. This analysis is a crucial initial step when +dealing with time series data. + +###### Test Mechanism + +This code implements the Dickey-Fuller GLS unit root test on each attribute of the dataset. This process involves +iterating through every column of the dataset and applying the DFGLS test to assess the presence of a unit root. +The resulting information, including the test statistic ('stat'), the p-value ('pvalue'), the quantity of lagged +differences utilized in the regression ('usedlag'), and the number of observations ('nobs'), is subsequently stored. + +###### Signs of High Risk + +- A high p-value for the DFGLS test represents a high risk. Specifically, a p-value above a typical threshold of +0.05 suggests that the time series data is quite likely to be non-stationary, thus presenting a high risk for +generating unreliable forecasts. + +###### Strengths + +- The Dickey-Fuller GLS test is a potent tool for checking the stationarity of time series data. +- It helps to verify the assumptions of the models before the actual construction of the machine learning models +proceeds. +- The results produced by this metric offer a clear insight into whether the data is appropriate for specific +machine learning models, especially those demanding the stationarity of time series data. + +###### Limitations + +- Despite its benefits, the DFGLS test does present some drawbacks. It can potentially lead to inaccurate +conclusions if the time series data incorporates a structural break. +- If the time series tends to follow a trend while still being stationary, the test might misinterpret it, +necessitating further detrending. +- The test also presents challenges when dealing with shorter time series data or volatile data, not producing +reliable results in these cases. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd new file mode 100644 index 000000000..5f15517eb --- /dev/null +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -0,0 +1,58 @@ +--- +title: Duplicates +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### Duplicates + +Tests dataset for duplicate entries, ensuring model reliability via data quality verification. + +###### Purpose + +The 'Duplicates' test is designed to check for duplicate rows within the dataset provided to the model. It serves +as a measure of data quality, ensuring that the model isn't merely memorizing duplicate entries or being swayed by +redundant information. This is an important step in the pre-processing of data for both classification and +regression tasks. + +###### Test Mechanism + +This test operates by checking each row for duplicates in the dataset. If a text column is specified in the +dataset, the test is conducted on this column; if not, the test is run on all feature columns. The number and +percentage of duplicates are calculated and returned in a DataFrame. Additionally, a test is passed if the total +count of duplicates falls below a specified minimum threshold. + +###### Signs of High Risk + +- A high number of duplicate rows in the dataset, which can lead to overfitting where the model performs well on +the training data but poorly on unseen data. +- A high percentage of duplicate rows in the dataset, indicating potential problems with data collection or +processing. + +###### Strengths + +- Assists in improving the reliability of the model's training process by ensuring the training data is not +contaminated with duplicate entries, which can distort statistical analyses. +- Provides both absolute numbers and percentage values of duplicate rows, giving a thorough overview of data +quality. +- Highly customizable as it allows for setting a user-defined minimum threshold to determine if the test has been +passed. + +###### Limitations + +- Does not distinguish between benign duplicates (i.e., coincidental identical entries in different rows) and +problematic duplicates originating from data collection or processing errors. +- The test becomes more computationally intensive as the size of the dataset increases, which might not be suitable +for very large datasets. +- Can only check for exact duplicates and may miss semantically similar information packaged differently. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd new file mode 100644 index 000000000..7faee8613 --- /dev/null +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -0,0 +1,56 @@ +--- +title: EngleGrangerCoint +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### EngleGrangerCoint + +Assesses the degree of co-movement between pairs of time series data using the Engle-Granger cointegration test. + +###### Purpose + +The intent of this Engle-Granger cointegration test is to explore and quantify the degree of co-movement between +pairs of time series variables in a dataset. This is particularly useful in enhancing the accuracy of predictive +regressions whenever the underlying variables are co-integrated, i.e., they move together over time. + +###### Test Mechanism + +The test first drops any non-applicable values from the input dataset and then iterates over each pair of variables +to apply the Engle-Granger cointegration test. The test generates a 'p' value, which is then compared against a +pre-specified threshold (0.05 by default). The pair is labeled as 'Cointegrated' if the 'p' value is less than or +equal to the threshold or 'Not cointegrated' otherwise. A summary table is returned by the metric showing +cointegration results for each variable pair. + +###### Signs of High Risk + +- A significant number of hypothesized cointegrated variables do not pass the test. +- A considerable number of 'p' values are close to the threshold, indicating minor data fluctuations can switch the +decision between 'Cointegrated' and 'Not cointegrated'. + +###### Strengths + +- Provides an effective way to analyze relationships between time series, particularly in contexts where it's +essential to check if variables move together in a statistically significant manner. +- Useful in various domains, especially finance or economics, where predictive models often hinge on understanding +how different variables move together over time. + +###### Limitations + +- Assumes that the time series are integrated of the same order, which isn't always true in multivariate time +series datasets. +- The presence of non-stationary characteristics in the series or structural breaks can result in falsely positive +or negative cointegration results. +- May not perform well for small sample sizes due to lack of statistical power and should be supplemented with +other predictive indicators for a more robust model evaluation. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd new file mode 100644 index 000000000..52d83f76a --- /dev/null +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -0,0 +1,57 @@ +--- +title: FeatureTargetCorrelationPlot +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### FeatureTargetCorrelationPlot + +Visualizes the correlation between input features and the model's target output in a color-coded horizontal bar +plot. + +###### Purpose + +This test is designed to graphically illustrate the correlations between distinct input features and the target +output of a Machine Learning model. Understanding how each feature influences the model's predictions is crucial—a +higher correlation indicates a stronger influence of the feature on the target variable. This correlation study is +especially advantageous during feature selection and for comprehending the model's operation. + +###### Test Mechanism + +This FeatureTargetCorrelationPlot test computes and presents the correlations between the features and the target +variable using a specific dataset. These correlations are calculated and are then graphically represented in a +horizontal bar plot, color-coded based on the strength of the correlation. A hovering template can also be utilized +for informative tooltips. It is possible to specify the features to be analyzed and adjust the graph's height +according to need. + +###### Signs of High Risk + +- There are no strong correlations (either positive or negative) between features and the target variable. This +could suggest high risk as the supplied features do not appear to significantly impact the prediction output. +- The presence of duplicated correlation values might hint at redundancy in the feature set. + +###### Strengths + +- Provides visual assistance to interpreting correlations more effectively. +- Gives a clear and simple tour of how each feature affects the model's target variable. +- Beneficial for feature selection and grasping the model's prediction nature. +- Precise correlation values for each feature are offered by the hover template, contributing to a granular-level +comprehension. + +###### Limitations + +- The test only accepts numerical data, meaning variables of other types need to be prepared beforehand. +- The plot assumes all correlations to be linear, thus non-linear relationships might not be captured effectively. +- Not apt for models that employ complex feature interactions, like Decision Trees or Neural Networks, as the test +may not accurately reflect their importance. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd new file mode 100644 index 000000000..0f0dd3bd1 --- /dev/null +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -0,0 +1,54 @@ +--- +title: HighCardinality +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### HighCardinality + +Assesses the number of unique values in categorical columns to detect high cardinality and potential overfitting. + +###### Purpose + +The “High Cardinality” test is used to evaluate the number of unique values present in the categorical columns of a +dataset. In this context, high cardinality implies the presence of a large number of unique, non-repetitive values +in the dataset. + +###### Test Mechanism + +The test first infers the dataset's type and then calculates an initial numeric threshold based on the test +parameters. It only considers columns classified as "Categorical". For each of these columns, the number of +distinct values (n_distinct) and the percentage of distinct values (p_distinct) are calculated. The test will pass +if n_distinct is less than the calculated numeric threshold. Lastly, the results, which include details such as +column name, number of distinct values, and pass/fail status, are compiled into a table. + +###### Signs of High Risk + +- A large number of distinct values (high cardinality) in one or more categorical columns implies a high risk. +- A column failing the test (n_distinct >= num_threshold) is another indicator of high risk. + +###### Strengths + +- The High Cardinality test is effective in early detection of potential overfitting and unwanted noise. +- It aids in identifying potential outliers and inconsistencies, thereby improving data quality. +- The test can be applied to both classification and regression task types, demonstrating its versatility. + +###### Limitations + +- The test is restricted to only "Categorical" data types and is thus not suitable for numerical or continuous +features, limiting its scope. +- The test does not consider the relevance or importance of unique values in categorical features, potentially +causing it to overlook critical data points. +- The threshold (both number and percent) used for the test is static and may not be optimal for diverse datasets +and varied applications. Further mechanisms to adjust and refine this threshold could enhance its effectiveness. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd new file mode 100644 index 000000000..f99428452 --- /dev/null +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -0,0 +1,57 @@ +--- +title: HighPearsonCorrelation +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### HighPearsonCorrelation + +Identifies highly correlated feature pairs in a dataset suggesting feature redundancy or multicollinearity. + +###### Purpose + +The High Pearson Correlation test measures the linear relationship between features in a dataset, with the main +goal of identifying high correlations that might indicate feature redundancy or multicollinearity. Identification +of such issues allows developers and risk management teams to properly deal with potential impacts on the machine +learning model's performance and interpretability. + +###### Test Mechanism + +The test works by generating pairwise Pearson correlations for all features in the dataset, then sorting and +eliminating duplicate and self-correlations. It assigns a Pass or Fail based on whether the absolute value of the +correlation coefficient surpasses a pre-set threshold (defaulted at 0.3). It lastly returns the top n strongest +correlations regardless of passing or failing status (where n is 10 by default but can be configured by passing the +`top_n_correlations` parameter). + +###### Signs of High Risk + +- A high risk indication would be the presence of correlation coefficients exceeding the threshold. +- If the features share a strong linear relationship, this could lead to potential multicollinearity and model +overfitting. +- Redundancy of variables can undermine the interpretability of the model due to uncertainty over the authenticity +of individual variable's predictive power. + +###### Strengths + +- Provides a quick and simple means of identifying relationships between feature pairs. +- Generates a transparent output that displays pairs of correlated variables, the Pearson correlation coefficient, +and a Pass or Fail status for each. +- Aids in early identification of potential multicollinearity issues that may disrupt model training. + +###### Limitations + +- Can only delineate linear relationships, failing to shed light on nonlinear relationships or dependencies. +- Sensitive to outliers where a few outliers could notably affect the correlation coefficient. +- Limited to identifying redundancy only within feature pairs; may fail to spot more complex relationships among +three or more variables. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd new file mode 100644 index 000000000..8f65694bf --- /dev/null +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -0,0 +1,68 @@ +--- +title: IQROutliersBarPlot +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### compute_outliers + + +#### IQROutliersBarPlot + +Visualizes outlier distribution across percentiles in numerical data using the Interquartile Range (IQR) method. + +###### Purpose + +The InterQuartile Range Outliers Bar Plot (IQROutliersBarPlot) metric aims to visually analyze and evaluate the +extent of outliers in numeric variables based on percentiles. Its primary purpose is to clarify the dataset's +distribution, flag possible abnormalities in it, and gauge potential risks associated with processing potentially +skewed data, which can affect the machine learning model's predictive prowess. + +###### Test Mechanism + +The examination invokes a series of steps: + +1. For every numeric feature in the dataset, the 25th percentile (Q1) and 75th percentile (Q3) are calculated +before deriving the Interquartile Range (IQR), the difference between Q1 and Q3. +2. Subsequently, the metric calculates the lower and upper thresholds by subtracting Q1 from the `threshold` times +IQR and adding Q3 to `threshold` times IQR, respectively. The default `threshold` is set at 1.5. +3. Any value in the feature that falls below the lower threshold or exceeds the upper threshold is labeled as an +outlier. +4. The number of outliers are tallied for different percentiles, such as [0-25], [25-50], [50-75], and [75-100]. +5. These counts are employed to construct a bar plot for the feature, showcasing the distribution of outliers +across different percentiles. + +###### Signs of High Risk + +- A prevalence of outliers in the data, potentially skewing its distribution. +- Outliers dominating higher percentiles (75-100) which implies the presence of extreme values, capable of severely +influencing the model's performance. +- Certain features harboring most of their values as outliers, which signifies that these features might not +contribute positively to the model's forecasting ability. + +###### Strengths + +- Effectively identifies outliers in the data through visual means, facilitating easier comprehension and offering +insights into the outliers' possible impact on the model. +- Provides flexibility by accommodating all numeric features or a chosen subset. +- Task-agnostic in nature; it is viable for both classification and regression tasks. +- Can handle large datasets as its operation does not hinge on computationally heavy operations. + +###### Limitations + +- Its application is limited to numerical variables and does not extend to categorical ones. +- Only reveals the presence and distribution of outliers and does not provide insights into how these outliers +might affect the model's predictive performance. +- The assumption that data is unimodal and symmetric may not always hold true. In cases with non-normal +distributions, the results can be misleading. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd new file mode 100644 index 000000000..fa9291ab3 --- /dev/null +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -0,0 +1,62 @@ +--- +title: IQROutliersTable +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### compute_outliers + + +#### IQROutliersTable + +Determines and summarizes outliers in numerical features using the Interquartile Range method. + +###### Purpose + +The "Interquartile Range Outliers Table" (IQROutliersTable) metric is designed to identify and summarize outliers +within numerical features of a dataset using the Interquartile Range (IQR) method. This exercise is crucial in the +pre-processing of data because outliers can substantially distort statistical analysis and impact the performance +of machine learning models. + +###### Test Mechanism + +The IQR, which is the range separating the first quartile (25th percentile) from the third quartile (75th +percentile), is calculated for each numerical feature within the dataset. An outlier is defined as a data point +falling below the "Q1 - 1.5 * IQR" or above "Q3 + 1.5 * IQR" range. The test computes the number of outliers and +their summary statistics (minimum, 25th percentile, median, 75th percentile, and maximum values) for each numerical +feature. If no specific features are chosen, the test applies to all numerical features in the dataset. The default +outlier threshold is set to 1.5 but can be customized by the user. + +###### Signs of High Risk + +- A large number of outliers in multiple features. +- Outliers significantly distanced from the mean value of variables. +- Extremely high or low outlier values indicative of data entry errors or other data quality issues. + +###### Strengths + +- Provides a comprehensive summary of outliers for each numerical feature, helping pinpoint features with potential +quality issues. +- The IQR method is robust to extremely high or low outlier values as it is based on quartile calculations. +- Can be customized to work on selected features and set thresholds for outliers. + +###### Limitations + +- Might cause false positives if the variable deviates from a normal or near-normal distribution, especially for +skewed distributions. +- Does not provide interpretation or recommendations for addressing outliers, relying on further analysis by users +or data scientists. +- Only applicable to numerical features, not categorical data. +- Default thresholds may not be optimal for data with heavy pre-processing, manipulation, or inherently high +kurtosis (heavy tails). + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd new file mode 100644 index 000000000..2f7dd7d0d --- /dev/null +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -0,0 +1,58 @@ +--- +title: IsolationForestOutliers +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### IsolationForestOutliers + +Detects outliers in a dataset using the Isolation Forest algorithm and visualizes results through scatter plots. + +###### Purpose + +The IsolationForestOutliers test is designed to identify anomalies or outliers in the model's dataset using the +isolation forest algorithm. This algorithm assumes that anomalous data points can be isolated more quickly due to +their distinctive properties. By creating isolation trees and identifying instances with shorter average path +lengths, the test is able to pick out data points that differ from the majority. + +###### Test Mechanism + +The test uses the isolation forest algorithm, which builds an ensemble of isolation trees by randomly selecting +features and splitting the data based on random thresholds. It isolates anomalies rather than focusing on normal +data points. For each pair of variables, a scatter plot is generated which distinguishes the identified outliers +from the inliers. The results of the test can be visualized using these scatter plots, illustrating the distinction +between outliers and inliers. + +###### Signs of High Risk + +- The presence of high contamination, indicating a large number of anomalies +- Inability to detect clusters of anomalies that are close in the feature space +- Misclassifying normal instances as anomalies +- Failure to detect actual anomalies + +###### Strengths + +- Ability to handle large, high-dimensional datasets +- Efficiency in isolating anomalies instead of normal instances +- Insensitivity to the underlying distribution of data +- Ability to recognize anomalies even when they are not separated from the main data cloud through identifying +distinctive properties +- Visually presents the test results for better understanding and interpretability + +###### Limitations + +- Difficult to detect anomalies that are close to each other or prevalent in datasets +- Dependency on the contamination parameter which may need fine-tuning to be effective +- Potential failure in detecting collective anomalies if they behave similarly to normal data +- Potential lack of precision in identifying which features contribute most to the anomalous behavior + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd new file mode 100644 index 000000000..eb06d740a --- /dev/null +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -0,0 +1,56 @@ +--- +title: JarqueBera +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### JarqueBera + +Assesses normality of dataset features in an ML model using the Jarque-Bera test. + +###### Purpose + +The purpose of the Jarque-Bera test as implemented in this metric is to determine if the features in the dataset of +a given Machine Learning model follow a normal distribution. This is crucial for understanding the distribution and +behavior of the model's features, as numerous statistical methods assume normal distribution of the data. + +###### Test Mechanism + +The test mechanism involves computing the Jarque-Bera statistic, p-value, skew, and kurtosis for each feature in +the dataset. It utilizes the 'jarque_bera' function from the 'statsmodels' library in Python, storing the results +in a dictionary. The test evaluates the skewness and kurtosis to ascertain whether the dataset follows a normal +distribution. A significant p-value (typically less than 0.05) implies that the data does not possess normal +distribution. + +###### Signs of High Risk + +- A high Jarque-Bera statistic and a low p-value (usually less than 0.05) indicate high-risk conditions. +- Such results suggest the data significantly deviates from a normal distribution. If a machine learning model +expects feature data to be normally distributed, these findings imply that it may not function as intended. + +###### Strengths + +- Provides insights into the shape of the data distribution, helping determine whether a given set of data follows +a normal distribution. +- Particularly useful for risk assessment for models that assume a normal distribution of data. +- By measuring skewness and kurtosis, it provides additional insights into the nature and magnitude of a +distribution's deviation. + +###### Limitations + +- Only checks for normality in the data distribution. It cannot provide insights into other types of distributions. +- Datasets that aren't normally distributed but follow some other distribution might lead to inaccurate risk +assessments. +- Highly sensitive to large sample sizes, often rejecting the null hypothesis (that data is normally distributed) +even for minor deviations in larger datasets. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd new file mode 100644 index 000000000..b760bc7e0 --- /dev/null +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -0,0 +1,55 @@ +--- +title: KPSS +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### KPSS + +Assesses the stationarity of time-series data in a machine learning model using the KPSS unit root test. + +###### Purpose + +The KPSS (Kwiatkowski-Phillips-Schmidt-Shin) unit root test is utilized to ensure the stationarity of data within a +machine learning model. It specifically works on time-series data to establish the order of integration, which is +essential for accurate forecasting. A fundamental requirement for any time series model is that the series should +be stationary. + +###### Test Mechanism + +This test calculates the KPSS score for each feature in the dataset. The KPSS score includes a statistic, a +p-value, a used lag, and critical values. The core principle behind the KPSS test is to evaluate the hypothesis +that an observable time series is stationary around a deterministic trend. If the computed statistic exceeds the +critical value, the null hypothesis (that the series is stationary) is rejected, indicating that the series is +non-stationary. + +###### Signs of High Risk + +- High KPSS score, particularly if the calculated statistic is higher than the critical value. +- Rejection of the null hypothesis, indicating that the series is recognized as non-stationary, can severely affect +the model's forecasting capability. + +###### Strengths + +- Directly measures the stationarity of a series, fulfilling a key prerequisite for many time-series models. +- The underlying logic of the test is intuitive and simple, making it easy to understand and accessible for both +developers and risk management teams. + +###### Limitations + +- Assumes the absence of a unit root in the series and doesn't differentiate between series that are stationary and +those border-lining stationarity. +- The test may have restricted power against certain alternatives. +- The reliability of the test is contingent on the number of lags selected, which introduces potential bias in the +measurement. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd new file mode 100644 index 000000000..346c6efae --- /dev/null +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -0,0 +1,54 @@ +--- +title: LJungBox +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### LJungBox + +Assesses autocorrelations in dataset features by performing a Ljung-Box test on each feature. + +###### Purpose + +The Ljung-Box test is a type of statistical test utilized to ascertain whether there are autocorrelations within a +given dataset that differ significantly from zero. In the context of a machine learning model, this test is +primarily used to evaluate data utilized in regression tasks, especially those involving time series and +forecasting. + +###### Test Mechanism + +The test operates by iterating over each feature within the dataset and applying the `acorr_ljungbox` +function from the `statsmodels.stats.diagnostic` library. This function calculates the Ljung-Box statistic and +p-value for each feature. These results are then stored in a pandas DataFrame where the columns are the feature names, +statistic, and p-value respectively. Generally, a lower p-value indicates a higher likelihood of significant +autocorrelations within the feature. + +###### Signs of High Risk + +- High Ljung-Box statistic values or low p-values. +- Presence of significant autocorrelations in the respective features. +- Potential for negative impact on model performance or bias if autocorrelations are not properly handled. + +###### Strengths + +- Powerful tool for detecting autocorrelations within datasets, especially in time series data. +- Provides quantitative measures (statistic and p-value) for precise evaluation. +- Helps avoid issues related to autoregressive residuals and other challenges in regression models. + +###### Limitations + +- Cannot detect all types of non-linearity or complex interrelationships among variables. +- Testing individual features may not fully encapsulate the dynamics of the data if features interact with each other. +- Designed more for traditional statistical models and may not be fully compatible with certain types of complex + machine learning models. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd new file mode 100644 index 000000000..0df76c3a0 --- /dev/null +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -0,0 +1,59 @@ +--- +title: LaggedCorrelationHeatmap +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### LaggedCorrelationHeatmap + +Assesses and visualizes correlation between target variable and lagged independent variables in a time-series +dataset. + +###### Purpose + +The LaggedCorrelationHeatmap metric is utilized to appraise and illustrate the correlation between the target +variable and delayed copies (lags) of independent variables in a time-series dataset. It assists in revealing +relationships in time-series data where the influence of an independent variable on the dependent variable is not +immediate but occurs after a period (lags). + +###### Test Mechanism + +To execute this test, Python's Pandas library pairs with Plotly to perform computations and present the +visualization in the form of a heatmap. The test begins by extracting the target variable and corresponding +independent variables from the dataset. Then, generation of lags of independent variables takes place, followed by +the calculation of correlation between these lagged variables and the target variable. The outcome is a correlation +matrix that gets recorded and illustrated as a heatmap, where different color intensities represent the strength of +the correlation, making patterns easier to identify. + +###### Signs of High Risk + +- Insignificant correlations across the heatmap, indicating a lack of noteworthy relationships between variables. +- Correlations that break intuition or previous understanding, suggesting potential issues with the dataset or the +model. + +###### Strengths + +- This metric serves as an exceptional tool for exploring and visualizing time-dependent relationships between +features and the target variable in a time-series dataset. +- It aids in identifying delayed effects that might go unnoticed with other correlation measures. +- The heatmap offers an intuitive visual representation of time-dependent correlations and influences. + +###### Limitations + +- The metric presumes linear relationships between variables, potentially ignoring non-linear relationships. +- The correlation considered is linear; therefore, intricate non-linear interactions might be overlooked. +- The metric is only applicable for time-series data, limiting its utility outside of this context. +- The number of lags chosen can significantly influence the results; too many lags can render the heatmap difficult +to interpret, while too few might overlook delayed effects. +- This metric does not take into account any causal relationships, but merely demonstrates correlation. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd new file mode 100644 index 000000000..d38126d49 --- /dev/null +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -0,0 +1,54 @@ +--- +title: MissingValues +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### MissingValues + +Evaluates dataset quality by ensuring missing value ratio across all features does not exceed a set threshold. + +###### Purpose + +The Missing Values test is designed to evaluate the quality of a dataset by measuring the number of missing values +across all features. The objective is to ensure that the ratio of missing data to total data is less than a +predefined threshold, defaulting to 1, in order to maintain the data quality necessary for reliable predictive +strength in a machine learning model. + +###### Test Mechanism + +The mechanism for this test involves iterating through each column of the dataset, counting missing values +(represented as NaNs), and calculating the percentage they represent against the total number of rows. The test +then checks if these missing value counts are less than the predefined `min_threshold`. The results are shown in a +table summarizing each column, the number of missing values, the percentage of missing values in each column, and a +Pass/Fail status based on the threshold comparison. + +###### Signs of High Risk + +- When the number of missing values in any column exceeds the `min_threshold` value. +- Presence of missing values across many columns, leading to multiple instances of failing the threshold. + +###### Strengths + +- Quick and granular identification of missing data across each feature in the dataset. +- Provides an effective and straightforward means of maintaining data quality, essential for constructing efficient +machine learning models. + +###### Limitations + +- Does not suggest the root causes of the missing values or recommend ways to impute or handle them. +- May overlook features with significant missing data but still less than the `min_threshold`, potentially +impacting the model. +- Does not account for data encoded as values like "-999" or "None," which might not technically classify as +missing but could bear similar implications. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd new file mode 100644 index 000000000..20541f15f --- /dev/null +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -0,0 +1,61 @@ +--- +title: MissingValuesBarPlot +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### MissingValuesBarPlot + +Assesses the percentage and distribution of missing values in the dataset via a bar plot, with emphasis on +identifying high-risk columns based on a user-defined threshold. + +###### Purpose + +The 'MissingValuesBarPlot' metric provides a color-coded visual representation of the percentage of missing values +for each column in an ML model's dataset. The primary purpose of this metric is to easily identify and quantify +missing data, which are essential steps in data preprocessing. The presence of missing data can potentially skew +the model's predictions and decrease its accuracy. Additionally, this metric uses a pre-set threshold to categorize +various columns into ones that contain missing data above the threshold (high risk) and below the threshold (less +risky). + +###### Test Mechanism + +The test mechanism involves scanning each column in the input dataset and calculating the percentage of missing +values. It then compares each column's missing data percentage with the predefined threshold, categorizing columns +with missing data above the threshold as high-risk. The test generates a bar plot in which columns with missing +data are represented on the y-axis and their corresponding missing data percentages are displayed on the x-axis. +The color of each bar reflects the missing data percentage in relation to the threshold**: grey for values below the +threshold and light coral for those exceeding it. The user-defined threshold is represented by a red dashed line on +the plot. + +###### Signs of High Risk + +- Columns with higher percentages of missing values beyond the threshold are high-risk. These are visually +represented by light coral bars on the bar plot. + +###### Strengths + +- Helps in quickly identifying and quantifying missing data across all columns of the dataset. +- Facilitates pattern recognition through visual representation. +- Enables customization of the level of risk tolerance via a user-defined threshold. +- Supports both classification and regression tasks, sharing its versatility. + +###### Limitations + +- It only considers the quantity of missing values, not differentiating between different types of missingness +(Missing completely at random - MCAR, Missing at random - MAR, Not Missing at random - NMAR). +- It doesn't offer insights into potential approaches for handling missing entries, such as various imputation +strategies. +- The metric does not consider possible impacts of the missing data on the model's accuracy or precision. +- Interpretation of the findings and the next steps might require an expert understanding of the field. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd new file mode 100644 index 000000000..c4fbbe305 --- /dev/null +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -0,0 +1,67 @@ +--- +title: MutualInformation +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### MutualInformation + +Calculates mutual information scores between features and target variable to evaluate feature relevance. + +###### Purpose + +The Mutual Information test quantifies the predictive power of each feature by measuring its statistical +dependency with the target variable. This helps identify relevant features for model training and +detect potential redundant or irrelevant variables, supporting feature selection decisions and model +interpretability. + +###### Test Mechanism + +The test employs sklearn's mutual_info_classif/mutual_info_regression functions to compute mutual +information between each feature and the target. It produces a normalized score (0 to 1) for each +feature, where higher scores indicate stronger relationships. Results are presented in both tabular +format and visualized through a bar plot with a configurable threshold line. + +###### Signs of High Risk + +- Many features showing very low mutual information scores +- Key business features exhibiting unexpectedly low scores +- All features showing similar, low information content +- Large discrepancy between business importance and MI scores +- Highly skewed distribution of MI scores +- Critical features below the minimum threshold +- Unexpected zero or near-zero scores for known important features +- Inconsistent scores across different data samples + +###### Strengths + +- Captures non-linear relationships between features and target +- Scale-invariant measurement of feature relevance +- Works for both classification and regression tasks +- Provides interpretable scores (0 to 1 scale) +- Supports automated feature selection +- No assumptions about data distribution +- Handles numerical and categorical features +- Computationally efficient for most datasets + +###### Limitations + +- Requires sufficient data for reliable estimates +- May be computationally intensive for very large datasets +- Cannot detect redundant features (pairwise relationships) +- Sensitive to feature discretization for continuous variables +- Does not account for feature interactions +- May underestimate importance of rare but crucial events +- Cannot handle missing values directly +- May be affected by extreme class imbalance + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd new file mode 100644 index 000000000..459fea14d --- /dev/null +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -0,0 +1,56 @@ +--- +title: PearsonCorrelationMatrix +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### PearsonCorrelationMatrix + +Evaluates linear dependency between numerical variables in a dataset via a Pearson Correlation coefficient heat map. + +###### Purpose + +This test is intended to evaluate the extent of linear dependency between all pairs of numerical variables in the +given dataset. It provides the Pearson Correlation coefficient, which reveals any high correlations present. The +purpose of doing this is to identify potential redundancy, as variables that are highly correlated can often be +removed to reduce the dimensionality of the dataset without significantly impacting the model's performance. + +###### Test Mechanism + +This metric test generates a correlation matrix for all numerical variables in the dataset using the Pearson +correlation formula. A heat map is subsequently created to visualize this matrix effectively. The color of each +point on the heat map corresponds to the magnitude and direction (positive or negative) of the correlation, with a +range from -1 (perfect negative correlation) to 1 (perfect positive correlation). Any correlation coefficients +higher than 0.7 (in absolute terms) are indicated in white in the heat map, suggesting a high degree of correlation. + +###### Signs of High Risk + +- A large number of variables in the dataset showing a high degree of correlation (coefficients approaching ±1). +This indicates redundancy within the dataset, suggesting that some variables may not be contributing new +information to the model. +- Potential risk of overfitting. + +###### Strengths + +- Detects and quantifies the linearity of relationships between variables, aiding in identifying redundant +variables to simplify models and potentially improve performance. +- The heatmap visualization provides an easy-to-understand overview of correlations, beneficial for users not +comfortable with numerical matrices. + +###### Limitations + +- Limited to detecting linear relationships, potentially missing non-linear relationships which impede +opportunities for dimensionality reduction. +- Measures only the degree of linear relationship, not the strength of one variable's effect on another. +- The 0.7 correlation threshold is arbitrary and might exclude valid dependencies with lower coefficients. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd new file mode 100644 index 000000000..bce49f563 --- /dev/null +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -0,0 +1,57 @@ +--- +title: PhillipsPerronArch +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### PhillipsPerronArch + +Assesses the stationarity of time series data in each feature of the ML model using the Phillips-Perron test. + +###### Purpose + +The Phillips-Perron (PP) test is used to determine the stationarity of time series data for each feature in a +dataset, which is crucial for forecasting tasks. It tests the null hypothesis that a time series is unit-root +non-stationary. This is vital for understanding the stochastic behavior of the data and ensuring the robustness and +validity of predictions generated by regression analysis models. + +###### Test Mechanism + +The PP test is conducted for each feature in the dataset as follows: + +- A data frame is created from the dataset. +- For each column, the Phillips-Perron method calculates the test statistic, p-value, lags used, and number of +observations. +- The results are then stored for each feature, providing a metric that indicates the stationarity of the time +series data. + +###### Signs of High Risk + +- A high p-value, indicating that the series has a unit root and is non-stationary. +- Test statistic values exceeding critical values, suggesting non-stationarity. +- High 'usedlag' value, pointing towards autocorrelation issues that may degrade model performance. + +###### Strengths + +- Resilience against heteroskedasticity in the error term. +- Effective for long time series data. +- Helps in determining whether the time series is stationary, aiding in the selection of suitable forecasting +models. + +###### Limitations + +- Applicable only within a univariate time series framework. +- Relies on asymptotic theory, which may reduce the test’s power for small sample sizes. +- Non-stationary time series must be converted to stationary series through differencing, potentially leading to +loss of important data points. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd new file mode 100644 index 000000000..82110988c --- /dev/null +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -0,0 +1,51 @@ +--- +title: ProtectedClassesCombination +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ProtectedClassesCombination + +Visualizes combinations of protected classes and their corresponding error metric differences. + +###### Purpose + +This test aims to provide insights into how different combinations of protected classes affect various error metrics, +particularly the false negative rate (FNR) and false positive rate (FPR). By visualizing these combinations, +it helps identify potential biases or disparities in model performance across different intersectional groups. + +###### Test Mechanism + +The test performs the following steps: +1. Combines the specified protected class columns to create a single multi-class category. +2. Calculates error metrics (FNR, FPR, etc.) for each combination of protected classes. +3. Generates visualizations showing the distribution of these metrics across all class combinations. + +###### Signs of High Risk + +- Large disparities in FNR or FPR across different protected class combinations. +- Consistent patterns of higher error rates for specific combinations of protected attributes. +- Unexpected or unexplainable variations in error metrics between similar group combinations. + +###### Strengths + +- Provides a comprehensive view of intersectional fairness across multiple protected attributes. +- Allows for easy identification of potentially problematic combinations of protected classes. +- Visualizations make it easier to spot patterns or outliers in model performance across groups. + +###### Limitations + +- May become complex and difficult to interpret with a large number of protected classes or combinations. +- Does not provide statistical significance of observed differences. +- Visualization alone may not capture all nuances of intersectional fairness. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd new file mode 100644 index 000000000..629646290 --- /dev/null +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -0,0 +1,61 @@ +--- +title: ProtectedClassesDescription +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ProtectedClassesDescription + +Visualizes the distribution of protected classes in the dataset relative to the target variable +and provides descriptive statistics. + +###### Purpose + +The ProtectedClassesDescription test aims to identify potential biases or significant differences in the +distribution of target outcomes across different protected classes. This visualization and statistical summary +help in understanding the relationship between protected attributes and the target variable, which is crucial +for assessing fairness in machine learning models. + +###### Test Mechanism + +The function creates interactive stacked bar charts for each specified protected class using Plotly. +Additionally, it generates a single table of descriptive statistics for all protected classes, including: + +- Protected class and category +- Count and percentage of each category within the protected class +- Mean, median, and mode of the target variable for each category +- Standard deviation of the target variable for each category +- Minimum and maximum values of the target variable for each category + +###### Signs of High Risk + +- Significant imbalances in the distribution of target outcomes across different categories of a protected class. +- Large disparities in mean, median, or mode of the target variable across categories. +- Underrepresentation or overrepresentation of certain groups within protected classes. +- High standard deviations in certain categories, indicating potential volatility or outliers. + +###### Strengths + +- Provides both visual and statistical representation of potential biases in the dataset. +- Allows for easy identification of imbalances in target variable distribution across protected classes. +- Interactive plots enable detailed exploration of the data. +- Consolidated statistical summary provides quantitative measures to complement visual analysis. +- Applicable to both classification and regression tasks. + +###### Limitations + +- Does not provide advanced statistical measures of bias or fairness. +- May become cluttered if there are many categories within a protected class or many unique target values. +- Interpretation may require domain expertise to understand the implications of observed disparities. +- Does not account for intersectionality or complex interactions between multiple protected attributes. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd new file mode 100644 index 000000000..54f0302ed --- /dev/null +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -0,0 +1,54 @@ +--- +title: ProtectedClassesDisparity +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ProtectedClassesDisparity + +Investigates disparities in model performance across different protected class segments. + +###### Purpose + +This test aims to identify and quantify potential biases in model outcomes by comparing various performance metrics +across different segments of protected classes. It helps in assessing whether the model produces discriminatory +outcomes for certain groups, which is crucial for ensuring fairness in machine learning models. + +###### Test Mechanism + +The test performs the following steps: +1. Calculates performance metrics (e.g., false negative rate, false positive rate, true positive rate) for each segment + of the specified protected classes. +2. Computes disparity ratios by comparing these metrics between different segments and a reference group. +3. Generates visualizations showing the disparities and their relation to a user-defined disparity tolerance threshold. +4. Produces a comprehensive table with various disparity metrics for detailed analysis. + +###### Signs of High Risk + +- Disparity ratios exceeding the specified disparity tolerance threshold. +- Consistent patterns of higher error rates or lower performance for specific protected class segments. +- Statistically significant differences in performance metrics across segments. + +###### Strengths + +- Provides a comprehensive view of model fairness across multiple protected attributes and metrics. +- Allows for easy identification of problematic disparities through visual and tabular representations. +- Customizable disparity tolerance threshold to align with specific use-case requirements. +- Applicable to various performance metrics, offering a multi-faceted analysis of model fairness. + +###### Limitations + +- Relies on a predefined reference group for each protected class, which may not always be the most appropriate choice. +- Does not account for intersectionality between different protected attributes. +- The interpretation of results may require domain expertise to understand the implications of observed disparities. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd new file mode 100644 index 000000000..41160a780 --- /dev/null +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -0,0 +1,71 @@ +--- +title: ProtectedClassesThresholdOptimizer +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### calculate_fairness_metrics + + +#### calculate_group_metrics + + +#### get_thresholds_by_group + + +#### initialize_and_fit_optimizer + + +#### make_predictions + + +#### plot_thresholds + + +#### ProtectedClassesThresholdOptimizer + +Obtains a classifier by applying group-specific thresholds to the provided estimator. + +###### Purpose + +This test aims to optimize the fairness of a machine learning model by applying different +classification thresholds for different protected groups. It helps in mitigating bias and +achieving more equitable outcomes across different demographic groups. + +###### Test Mechanism + +The test uses Fairlearn's ThresholdOptimizer to: +1. Fit an optimizer on the training data, considering protected classes. +2. Apply optimized thresholds to make predictions on the test data. +3. Calculate and report various fairness metrics. +4. Visualize the optimized thresholds. + +###### Signs of High Risk + +- Large disparities in fairness metrics (e.g., Demographic Parity Ratio, Equalized Odds Ratio) + across different protected groups. +- Significant differences in False Positive Rates (FPR) or True Positive Rates (TPR) between groups. +- Thresholds that vary widely across different protected groups. + +###### Strengths + +- Provides a post-processing method to improve model fairness without modifying the original model. +- Allows for balancing multiple fairness criteria simultaneously. +- Offers visual insights into the threshold optimization process. + +###### Limitations + +- May lead to a decrease in overall model performance while improving fairness. +- Requires access to protected attribute information at prediction time. +- The effectiveness can vary depending on the chosen fairness constraint and objective. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd new file mode 100644 index 000000000..419669205 --- /dev/null +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -0,0 +1,69 @@ +--- +title: RollingStatsPlot +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### plot_rolling_statistics + + +#### RollingStatsPlot + +Evaluates the stationarity of time series data by plotting its rolling mean and standard deviation over a specified +window. + +###### Purpose + +The `RollingStatsPlot` metric is employed to gauge the stationarity of time series data in a given dataset. This +metric specifically evaluates the rolling mean and rolling standard deviation of the dataset over a pre-specified +window size. The rolling mean provides an understanding of the average trend in the data, while the rolling +standard deviation gauges the volatility of the data within the window. It is critical in preparing time series +data for modeling as it reveals key insights into data behavior across time. + +###### Test Mechanism + +This mechanism is comprised of two steps. Initially, the rolling mean and standard deviation for each of the +dataset's columns are calculated over a window size, which can be user-specified or by default set to 12 data +points. Then, the calculated rolling mean and standard deviation are visualized via separate plots, illustrating +the trends and volatility in the dataset. A straightforward check is conducted to ensure the existence of columns +in the dataset, and to verify that the given dataset has been indexed by its date and time—a necessary prerequisite +for time series analysis. + +###### Signs of High Risk + +- The presence of non-stationary patterns in either the rolling mean or the rolling standard deviation plots, which +could indicate trends or seasonality in the data that may affect the performance of time series models. +- Missing columns in the dataset, which would prevent the execution of this metric correctly. +- The detection of NaN values in the dataset, which may need to be addressed before the metric can proceed +successfully. + +###### Strengths + +- Offers visualizations of trending behavior and volatility within the data, facilitating a broader understanding +of the dataset's inherent characteristics. +- Checks of the dataset's integrity, such as the existence of all required columns and the availability of a +datetime index. +- Adjusts to accommodate various window sizes, thus allowing accurate analysis of data with differing temporal +granularities. +- Considers each column of the data individually, thereby accommodating multi-feature datasets. + +###### Limitations + +- For all columns, a fixed-size window is utilized. This may not accurately capture patterns in datasets where +different features may require different optimal window sizes. +- Requires the dataset to be indexed by date and time, hence it may not be usable for datasets without a timestamp +index. +- Primarily serves for data visualization as it does not facilitate any quantitative measures for stationarity, +such as through statistical tests. Therefore, the interpretation is subjective and depends heavily on modeler +discretion. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd new file mode 100644 index 000000000..6f140676a --- /dev/null +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -0,0 +1,60 @@ +--- +title: RunsTest +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### RunsTest + +Executes Runs Test on ML model to detect non-random patterns in output data sequence. + +###### Purpose + +The Runs Test is a statistical procedure used to determine whether the sequence of data extracted from the ML model +behaves randomly or not. Specifically, it analyzes runs, sequences of consecutive positives or negatives, in the +data to check if there are more or fewer runs than expected under the assumption of randomness. This can be an +indication of some pattern, trend, or cycle in the model's output which may need attention. + +###### Test Mechanism + +The testing mechanism applies the Runs Test from the statsmodels module on each column of the training dataset. For +every feature in the dataset, a Runs Test is executed, whose output includes a Runs Statistic and P-value. A low +P-value suggests that data arrangement in the feature is not likely to be random. The results are stored in a +dictionary where the keys are the feature names, and the values are another dictionary storing the test statistic +and the P-value for each feature. + +###### Signs of High Risk + +- High risk is indicated when the P-value is close to zero. +- If the P-value is less than a predefined significance level (like 0.05), it suggests that the runs (series of +positive or negative values) in the model's output are not random and are longer or shorter than what is expected +under a random scenario. +- This would mean there's a high risk of non-random distribution of errors or model outcomes, suggesting potential +issues with the model. + +###### Strengths + +- Straightforward and fast for detecting non-random patterns in data sequence. +- Validates assumptions of randomness, which is valuable for checking error distributions in regression models, +trendless time series data, and ensuring a classifier doesn't favor one class over another. +- Can be applied to both classification and regression tasks, making it versatile. + +###### Limitations + +- Assumes that the data is independently and identically distributed (i.i.d.), which might not be the case for many +real-world datasets. +- The conclusion drawn from the low P-value indicating non-randomness does not provide information about the type +or the source of the detected pattern. +- Sensitive to extreme values (outliers), and overly large or small run sequences can influence the results. +- Does not provide model performance evaluation; it is used to detect patterns in the sequence of outputs only. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd new file mode 100644 index 000000000..997084d33 --- /dev/null +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -0,0 +1,61 @@ +--- +title: ScatterPlot +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ScatterPlot + +Assesses visual relationships, patterns, and outliers among features in a dataset through scatter plot matrices. + +###### Purpose + +The ScatterPlot test aims to visually analyze a given dataset by constructing a scatter plot matrix of its +numerical features. The primary goal is to uncover relationships, patterns, and outliers across different features +to provide both quantitative and qualitative insights into multidimensional relationships within the dataset. This +visual assessment aids in understanding the efficacy of the chosen features for model training and their +suitability. + +###### Test Mechanism + +Using the Seaborn library, the ScatterPlot function creates the scatter plot matrix. The process involves +retrieving all numerical columns from the dataset and generating a scatter matrix for these columns. The resulting +scatter plot provides visual representations of feature relationships. The function also adjusts axis labels for +readability and returns the final plot as a Matplotlib Figure object for further analysis and visualization. + +###### Signs of High Risk + +- The emergence of non-linear or random patterns across different feature pairs, suggesting complex relationships +unsuitable for linear assumptions. +- Lack of clear patterns or clusters, indicating weak or non-existent correlations among features, which could +challenge certain model types. +- Presence of outliers, as visual outliers can adversely influence the model's performance. + +###### Strengths + +- Provides insight into the multidimensional relationships among multiple features. +- Assists in identifying trends, correlations, and outliers that could affect model performance. +- Validates assumptions made during model creation, such as linearity. +- Versatile for application in both regression and classification tasks. +- Using Seaborn facilitates an intuitive and detailed visual exploration of data. + +###### Limitations + +- Scatter plot matrices may become cluttered and hard to decipher as the number of features increases. +- Primarily reveals pairwise relationships and may fail to illuminate complex interactions involving three or more +features. +- Being a visual tool, precision in quantitative analysis might be compromised. +- Outliers not clearly visible in plots can be missed, affecting model performance. +- Assumes that the dataset can fit into the computer's memory, which might not be valid for extremely large +datasets. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd new file mode 100644 index 000000000..91363aeb6 --- /dev/null +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -0,0 +1,67 @@ +--- +title: ScoreBandDefaultRates +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ScoreBandDefaultRates + +Analyzes default rates and population distribution across credit score bands. + +###### Purpose + +The Score Band Default Rates test evaluates the discriminatory power of credit scores by analyzing +default rates across different score bands. This helps validate score effectiveness, supports +policy decisions, and provides insights into portfolio risk distribution. + +###### Test Mechanism + +The test segments the score distribution into bands and calculates key metrics for each band: +1. Population count and percentage in each band +2. Default rate within each band +3. Cumulative statistics across bands +The results show how well the scores separate good and bad accounts. + +###### Signs of High Risk + +- Non-monotonic default rates across score bands +- Insufficient population in critical score bands +- Unexpected default rates for score ranges +- High concentration in specific score bands +- Similar default rates across adjacent bands +- Unstable default rates in key decision bands +- Extreme population skewness +- Poor risk separation between bands + +###### Strengths + +- Clear view of score effectiveness +- Supports policy threshold decisions +- Easy to interpret and communicate +- Directly links to business decisions +- Shows risk segmentation power +- Identifies potential score issues +- Helps validate scoring model +- Supports portfolio monitoring + +###### Limitations + +- Sensitive to band definition choices +- May mask within-band variations +- Requires sufficient data in each band +- Cannot capture non-linear patterns +- Point-in-time analysis only +- No temporal trend information +- Assumes band boundaries are appropriate +- May oversimplify risk patterns + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd new file mode 100644 index 000000000..594c9ed0f --- /dev/null +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -0,0 +1,58 @@ +--- +title: SeasonalDecompose +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### SeasonalDecompose + +Assesses patterns and seasonality in a time series dataset by decomposing its features into foundational components. + +###### Purpose + +The Seasonal Decompose test aims to decompose the features of a time series dataset into their fundamental +components**: observed, trend, seasonal, and residuals. By utilizing the Seasonal Decomposition of Time Series by +Loess (STL) method, the test identifies underlying patterns, predominantly seasonality, in the dataset's features. +This aids in developing a more comprehensive understanding of the dataset, which in turn facilitates more effective +model validation. + +###### Test Mechanism + +The testing process leverages the `seasonal_decompose` function from the `statsmodels.tsa.seasonal` library to +evaluate each feature in the dataset. It isolates each feature into four components—observed, trend, seasonal, and +residuals—and generates six subplot graphs per feature for visual interpretation. Prior to decomposition, the test +scrutinizes and removes any non-finite values, ensuring the reliability of the analysis. + +###### Signs of High Risk + +- **Non-Finiteness**: Datasets with a high number of non-finite values may flag as high risk since these values are +omitted before conducting the seasonal decomposition. +- **Frequent Warnings**: Chronic failure to infer the frequency for a scrutinized feature indicates high risk. +- **High Seasonality**: A significant seasonal component could potentially render forecasts unreliable due to +overwhelming seasonal variation. + +###### Strengths + +- **Seasonality Detection**: Accurately discerns hidden seasonality patterns in dataset features. +- **Visualization**: Facilitates interpretation and comprehension through graphical representations. +- **Unrestricted Usage**: Not confined to any specific regression model, promoting wide-ranging applicability. + +###### Limitations + +- **Dependence on Assumptions**: Assumes that dataset features are periodically distributed. Features with no +inferable frequency are excluded from the test. +- **Handling Non-Finite Values**: Disregards non-finite values during analysis, potentially resulting in an +incomplete understanding of the dataset. +- **Unreliability with Noisy Datasets**: Produces unreliable results when used with datasets that contain heavy +noise. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd new file mode 100644 index 000000000..5ebbd0495 --- /dev/null +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -0,0 +1,57 @@ +--- +title: ShapiroWilk +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ShapiroWilk + +Evaluates feature-wise normality of training data using the Shapiro-Wilk test. + +###### Purpose + +The Shapiro-Wilk test is utilized to investigate whether a particular dataset conforms to the standard normal +distribution. This analysis is crucial in machine learning modeling because the normality of the data can +profoundly impact the performance of the model. This metric is especially useful in evaluating various features of +the dataset in both classification and regression tasks. + +###### Test Mechanism + +The Shapiro-Wilk test is conducted on each feature column of the training dataset to determine if the data +contained fall within the normal distribution. The test presents a statistic and a p-value, with the p-value +serving to validate or repudiate the null hypothesis, which is that the tested data is normally distributed. + +###### Signs of High Risk + +- A p-value that falls below 0.05 signifies a high risk as it discards the null hypothesis, indicating that the +data does not adhere to the normal distribution. +- For machine learning models built on the presumption of data normality, such an outcome could result in subpar +performance or incorrect predictions. + +###### Strengths + +- The Shapiro-Wilk test is esteemed for its level of accuracy, thereby making it particularly well-suited to +datasets of small to moderate sizes. +- It proves its versatility through its efficient functioning in both classification and regression tasks. +- By separately testing each feature column, the Shapiro-Wilk test can raise an alarm if a specific feature does +not comply with the normality. + +###### Limitations + +- The Shapiro-Wilk test's sensitivity can be a disadvantage as it often rejects the null hypothesis (i.e., data is +normally distributed), even for minor deviations, especially in large datasets. This may lead to unwarranted 'false +alarms' of high risk by deeming the data as not normally distributed even if it approximates normal distribution. +- Exceptional care must be taken in managing missing data or outliers prior to testing as these can greatly skew +the results. +- Lastly, the Shapiro-Wilk test is not optimally suited for processing data with pronounced skewness or kurtosis. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd new file mode 100644 index 000000000..2c30f0873 --- /dev/null +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -0,0 +1,54 @@ +--- +title: Skewness +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### Skewness + +Evaluates the skewness of numerical data in a dataset to check against a defined threshold, aiming to ensure data +quality and optimize model performance. + +###### Purpose + +The purpose of the Skewness test is to measure the asymmetry in the distribution of data within a predictive +machine learning model. Specifically, it evaluates the divergence of said distribution from a normal distribution. +Understanding the level of skewness helps identify data quality issues, which are crucial for optimizing the +performance of traditional machine learning models in both classification and regression settings. + +###### Test Mechanism + +This test calculates the skewness of numerical columns in the dataset, focusing specifically on numerical data +types. The calculated skewness value is then compared against a predetermined maximum threshold, which is set by +default to 1. If the skewness value is less than this maximum threshold, the test passes; otherwise, it fails. The +test results, along with the skewness values and column names, are then recorded for further analysis. + +###### Signs of High Risk + +- Substantial skewness levels that significantly exceed the maximum threshold. +- Persistent skewness in the data, indicating potential issues with the foundational assumptions of the machine +learning model. +- Subpar model performance, erroneous predictions, or biased inferences due to skewed data distributions. + +###### Strengths + +- Fast and efficient identification of unequal data distributions within a machine learning model. +- Adjustable maximum threshold parameter, allowing for customization based on user needs. +- Provides a clear quantitative measure to mitigate model risks related to data skewness. + +###### Limitations + +- Only evaluates numeric columns, potentially missing skewness or bias in non-numeric data. +- Assumes that data should follow a normal distribution, which may not always be applicable to real-world data. +- Subjective threshold for risk grading, requiring expert input and recurrent iterations for refinement. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd new file mode 100644 index 000000000..460a49074 --- /dev/null +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -0,0 +1,59 @@ +--- +title: SpreadPlot +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### SpreadPlot + +Assesses potential correlations between pairs of time series variables through visualization to enhance +understanding of their relationships. + +###### Purpose + +The SpreadPlot test aims to graphically illustrate and analyze the relationships between pairs of time series +variables within a given dataset. This facilitated understanding helps in identifying and assessing potential time +series correlations, such as cointegration, between the variables. + +###### Test Mechanism + +The SpreadPlot test computes and represents the spread between each pair of time series variables in the dataset. +Specifically, the difference between two variables is calculated and presented as a line graph. This process is +iterated for each unique pair of variables in the dataset, allowing for comprehensive visualization of their +relationships. + +###### Signs of High Risk + +- Large fluctuations in the spread over a given timespan. +- Unexpected patterns or trends that may signal potential risks in the underlying correlations between the +variables. +- Presence of significant missing data or extreme outlier values, which could potentially skew the spread and +indicate high risk. + +###### Strengths + +- Allows for thorough visual examination and interpretation of the correlations between time-series pairs. +- Aids in revealing complex relationships like cointegration. +- Enhances interpretability by visualizing the relationships, thereby helping in spotting outliers and trends. +- Capable of handling numerous variable pairs from the dataset through a versatile and adaptable process. + +###### Limitations + +- Primarily serves as a visualization tool and does not offer quantitative measurements or statistics to +objectively determine relationships. +- Heavily relies on the quality and granularity of the data—missing data or outliers can notably disturb the +interpretation of relationships. +- Can become inefficient or difficult to interpret with a high number of variables due to the profuse number of +plots. +- Might not completely capture intricate non-linear relationships between the variables. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd new file mode 100644 index 000000000..78a13b58f --- /dev/null +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -0,0 +1,54 @@ +--- +title: TabularCategoricalBarPlots +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TabularCategoricalBarPlots + +Generates and visualizes bar plots for each category in categorical features to evaluate the dataset's composition. + +###### Purpose + +The purpose of this metric is to visually analyze categorical data using bar plots. It is intended to evaluate the +dataset's composition by displaying the counts of each category in each categorical feature. + +###### Test Mechanism + +The provided dataset is first checked to determine if it contains any categorical variables. If no categorical +columns are found, the tool raises a ValueError. For each categorical variable in the dataset, a separate bar plot +is generated. The number of occurrences for each category is calculated and displayed on the plot. If a dataset +contains multiple categorical columns, multiple bar plots are produced. + +###### Signs of High Risk + +- High risk could occur if the categorical variables exhibit an extreme imbalance, with categories having very few +instances possibly being underrepresented in the model, which could affect the model's performance and its ability +to generalize. +- Another sign of risk is if there are too many categories in a single variable, which could lead to overfitting +and make the model complex. + +###### Strengths + +- Provides a visual and intuitively understandable representation of categorical data. +- Aids in the analysis of variable distributions. +- Helps in easily identifying imbalances or rare categories that could affect the model's performance. + +###### Limitations + +- This method only works with categorical data and won't apply to numerical variables. +- It does not provide informative value when there are too many categories, as the bar chart could become cluttered +and hard to interpret. +- Offers no insights into the model's performance or precision, but rather provides a descriptive analysis of the +input. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd new file mode 100644 index 000000000..d5e4469e1 --- /dev/null +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -0,0 +1,60 @@ +--- +title: TabularDateTimeHistograms +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TabularDateTimeHistograms + +Generates histograms to provide graphical insight into the distribution of time intervals in a model's datetime +data. + +###### Purpose + +The `TabularDateTimeHistograms` metric is designed to provide graphical insight into the distribution of time +intervals in a machine learning model's datetime data. By plotting histograms of differences between consecutive +date entries in all datetime variables, it enables an examination of the underlying pattern of time series data and +identification of anomalies. + +###### Test Mechanism + +This test operates by first identifying all datetime columns and extracting them from the dataset. For each +datetime column, it next computes the differences (in days) between consecutive dates, excluding zero values, and +visualizes these differences in a histogram. The Plotly library's histogram function is used to generate +histograms, which are labeled appropriately and provide a graphical representation of the frequency of different +day intervals in the dataset. + +###### Signs of High Risk + +- If no datetime columns are detected in the dataset, this would lead to a ValueError. Hence, the absence of +datetime columns signifies a high risk. +- A severely skewed or irregular distribution depicted in the histogram may indicate possible complications with +the data, such as faulty timestamps or abnormalities. + +###### Strengths + +- The metric offers a visual overview of time interval frequencies within the dataset, supporting the recognition +of inherent patterns. +- Histogram plots can aid in the detection of potential outliers and data anomalies, contributing to an assessment +of data quality. +- The metric is versatile, compatible with a range of task types, including classification and regression, and can +work with multiple datetime variables if present. + +###### Limitations + +- A major weakness of this metric is its dependence on the visual examination of data, as it does not provide a +measurable evaluation of the model. +- The metric might overlook complex or multi-dimensional trends in the data. +- The test is only applicable to datasets containing datetime columns and will fail if such columns are unavailable. +- The interpretation of the histograms relies heavily on the domain expertise and experience of the reviewer. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd new file mode 100644 index 000000000..19c901596 --- /dev/null +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -0,0 +1,83 @@ +--- +title: TabularDescriptionTables +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### get_categorical_columns + + +#### get_datetime_columns + + +#### get_numerical_columns + + +#### get_summary_statistics_categorical + + +#### get_summary_statistics_datetime + + +#### get_summary_statistics_numerical + + +#### TabularDescriptionTables + +Summarizes key descriptive statistics for numerical, categorical, and datetime variables in a dataset. + +###### Purpose + +The main purpose of this metric is to gather and present the descriptive statistics of numerical, categorical, and +datetime variables present in a dataset. The attributes it measures include the count, mean, minimum and maximum +values, percentage of missing values, data types of fields, and unique values for categorical fields, among others. + +###### Test Mechanism + +The test first segregates the variables in the dataset according to their data types (numerical, categorical, or +datetime). Then, it compiles summary statistics for each type of variable. The specifics of these statistics vary +depending on the type of variable: + +- For numerical variables, the metric extracts descriptors like count, mean, minimum and maximum values, count of +missing values, and data types. +- For categorical variables, it counts the number of unique values, displays unique values, counts missing values, +and identifies data types. +- For datetime variables, it counts the number of unique values, identifies the earliest and latest dates, counts +missing values, and identifies data types. + +###### Signs of High Risk + +- Masses of missing values in the descriptive statistics results could hint at high risk or failure, indicating +potential data collection, integrity, and quality issues. +- Detection of inappropriate distributions for numerical variables, like having negative values for variables that +are always supposed to be positive. +- Identifying inappropriate data types, like a continuous variable being encoded as a categorical type. + +###### Strengths + +- Provides a comprehensive overview of the dataset. +- Gives a snapshot into the essence of the numerical, categorical, and datetime fields. +- Identifies potential data quality issues such as missing values or inconsistencies crucial for building credible +machine learning models. +- The metadata, including the data type and missing value information, are vital for anyone including data +scientists dealing with the dataset before the modeling process. + +###### Limitations + +- It does not perform any deeper statistical analysis or tests on the data. +- It does not handle issues such as outliers, or relationships between variables. +- It offers no insights into potential correlations or possible interactions between variables. +- It does not investigate the potential impact of missing values on the performance of the machine learning models. +- It does not explore potential transformation requirements that may be necessary to enhance the performance of the +chosen algorithm. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd new file mode 100644 index 000000000..0e3babf0e --- /dev/null +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -0,0 +1,59 @@ +--- +title: TabularNumericalHistograms +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TabularNumericalHistograms + +Generates histograms for each numerical feature in a dataset to provide visual insights into data distribution and +detect potential issues. + +###### Purpose + +The purpose of this test is to provide visual analysis of numerical data through the generation of histograms for +each numerical feature in the dataset. Histograms aid in the exploratory analysis of data, offering insight into +the distribution of the data, skewness, presence of outliers, and central tendencies. It helps in understanding if +the inputs to the model are normally distributed, which is a common assumption in many machine learning algorithms. + +###### Test Mechanism + +This test scans the provided dataset and extracts all the numerical columns. For each numerical column, it +constructs a histogram using plotly, with 50 bins. The deployment of histograms offers a robust visual aid, +ensuring unruffled identification and understanding of numerical data distribution patterns. + +###### Signs of High Risk + +- A high degree of skewness +- Unexpected data distributions +- Existence of extreme outliers in the histograms + +These may indicate issues with the data that the model is receiving. If data for a numerical feature is expected to +follow a certain distribution (like a normal distribution) but does not, it could lead to sub-par performance by +the model. As such these instances should be treated as high-risk indicators. + +###### Strengths + +- Provides a simple, easy-to-interpret visualization of how data for each numerical attribute is distributed. +- Helps detect skewed values and outliers that could potentially harm the AI model's performance. +- Can be applied to large datasets and multiple numerical variables conveniently. + +###### Limitations + +- Only works with numerical data, thus ignoring non-numerical or categorical data. +- Does not analyze relationships between different features, only the individual feature distributions. +- Is a univariate analysis and may miss patterns or anomalies that only appear when considering multiple variables +together. +- Does not provide any insight into how these features affect the output of the model; it is purely an input +analysis tool. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd new file mode 100644 index 000000000..844ddefde --- /dev/null +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -0,0 +1,54 @@ +--- +title: TargetRateBarPlots +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TargetRateBarPlots + +Generates bar plots visualizing the default rates of categorical features for a classification machine learning +model. + +###### Purpose + +This test, implemented as a metric, is designed to provide an intuitive, graphical summary of the decision-making +patterns exhibited by a categorical classification machine learning model. The model's performance is evaluated +using bar plots depicting the ratio of target rates—meaning the proportion of positive classes—for different +categorical inputs. This allows for an easy, at-a-glance understanding of the model's accuracy. + +###### Test Mechanism + +The test involves creating a pair of bar plots for each categorical feature in the dataset. The first plot depicts +the frequency of each category in the dataset, with each category visually distinguished by its unique color. The +second plot shows the mean target rate of each category (sourced from the "default_column"). Plotly, a Python +library, is used to generate these plots, with distinct plots created for each feature. If no specific columns are +selected, the test will generate plots for each categorical column in the dataset. + +###### Signs of High Risk + +- Inconsistent or non-binary values in the "default_column" could complicate or render impossible the calculation +of average target rates. +- Particularly low or high target rates for a specific category might suggest that the model is misclassifying +instances of that category. + +###### Strengths + +- This test offers a visually interpretable breakdown of the model's decisions, providing an easy way to spot +irregularities, inconsistencies, or patterns. +- Its flexibility allows for the inspection of one or multiple columns, as needed. + +###### Limitations + +- The readability of the bar plots drops as the number of distinct categories increases in the dataset, which can +make them harder to understand and less useful. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd new file mode 100644 index 000000000..dbad2b87e --- /dev/null +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -0,0 +1,51 @@ +--- +title: TimeSeriesDescription +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TimeSeriesDescription + +Generates a detailed analysis for the provided time series dataset, summarizing key statistics to identify trends, +patterns, and data quality issues. + +###### Purpose + +The TimeSeriesDescription function aims to analyze an individual time series by providing a summary of key +statistics. This helps in understanding trends, patterns, and data quality issues within the time series. + +###### Test Mechanism + +The function extracts the time series data and provides a summary of key statistics. The dataset is expected to +have a datetime index. The function checks this and raises an error if the index is not in datetime format. For +each variable (column) in the dataset, appropriate statistics including start date, end date, frequency, number of +missing values, count, min, and max values are calculated. + +###### Signs of High Risk + +- If the index of the dataset is not in datetime format, it could lead to errors in time-series analysis. +- Inconsistent or missing data within the dataset might affect the analysis of trends and patterns. + +###### Strengths + +- Provides a comprehensive summary of key statistics for each variable, helping to identify data quality issues +such as missing values. +- Helps in understanding the distribution and range of the data by including min and max values. + +###### Limitations + +- Assumes that the dataset is provided as a DataFrameDataset object with a .df attribute to access the pandas +DataFrame. +- Only analyzes datasets with a datetime index and will raise an error for other types of indices. +- Does not handle large datasets efficiently; performance may degrade with very large datasets. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd new file mode 100644 index 000000000..d81f1a083 --- /dev/null +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -0,0 +1,49 @@ +--- +title: TimeSeriesDescriptiveStatistics +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TimeSeriesDescriptiveStatistics + +Evaluates the descriptive statistics of a time series dataset to identify trends, patterns, and data quality issues. + +###### Purpose + +The purpose of the TimeSeriesDescriptiveStatistics function is to analyze an individual time series by providing a +summary of key descriptive statistics. This analysis helps in understanding trends, patterns, and data quality +issues within the time series dataset. + +###### Test Mechanism + +The function extracts the time series data and provides a summary of key descriptive statistics. The dataset is +expected to have a datetime index, and the function will check this and raise an error if the index is not in a +datetime format. For each variable (column) in the dataset, appropriate statistics, including start date, end date, +min, mean, max, skewness, kurtosis, and count, are calculated. + +###### Signs of High Risk + +- If the index of the dataset is not in datetime format, it could lead to errors in time-series analysis. +- Inconsistent or missing data within the dataset might affect the analysis of trends and patterns. + +###### Strengths + +- Provides a comprehensive summary of key descriptive statistics for each variable. +- Helps identify data quality issues and understand the distribution of the data. + +###### Limitations + +- Assumes the dataset is provided as a DataFrameDataset object with a .df attribute to access the pandas DataFrame. +- Only analyzes datasets with a datetime index and will raise an error for other types of indices. +- Does not handle large datasets efficiently, and performance may degrade with very large datasets. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd new file mode 100644 index 000000000..d56a3fd01 --- /dev/null +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -0,0 +1,61 @@ +--- +title: TimeSeriesFrequency +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TimeSeriesFrequency + +Evaluates consistency of time series data frequency and generates a frequency plot. + +###### Purpose + +The purpose of the TimeSeriesFrequency test is to evaluate the consistency in the frequency of data points in a +time-series dataset. This test inspects the intervals or duration between each data point to determine if a fixed +pattern (such as daily, weekly, or monthly) exists. The identification of such patterns is crucial to time-series +analysis as any irregularities could lead to erroneous results and hinder the model's capacity for identifying +trends and patterns. + +###### Test Mechanism + +Initially, the test checks if the dataframe index is in datetime format. Subsequently, it utilizes pandas' +`infer_freq` method to identify the frequency of each data series within the dataframe. The `infer_freq` method +attempts to establish the frequency of a time series and returns both the frequency string and a dictionary +relating these strings to their respective labels. The test compares the frequencies of all datasets. If they share +a common frequency, the test passes, but it fails if they do not. Additionally, Plotly is used to create a +frequency plot, offering a visual depiction of the time differences between consecutive entries in the dataframe +index. + +###### Signs of High Risk + +- The test fails, indicating multiple unique frequencies within the dataset. This failure could suggest irregular +intervals between observations, potentially interrupting pattern recognition or trend analysis. +- The presence of missing or null frequencies could be an indication of inconsistencies in data or gaps within the +data collection process. + +###### Strengths + +- This test uses a systematic approach to checking the consistency of data frequency within a time-series dataset. +- It increases the model's reliability by asserting the consistency of observations over time, an essential factor +in time-series analysis. +- The test generates a visual plot, providing an intuitive representation of the dataset's frequency distribution, +which caters to visual learners and aids in interpretation and explanation. + +###### Limitations + +- This test is only applicable to time-series datasets and hence not suitable for other types of datasets. +- The `infer_freq` method might not always correctly infer frequency when faced with missing or irregular data +points. +- Depending on context or the model under development, mixed frequencies might sometimes be acceptable, but this +test considers them a failing condition. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd new file mode 100644 index 000000000..ee4fd6f11 --- /dev/null +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -0,0 +1,55 @@ +--- +title: TimeSeriesHistogram +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TimeSeriesHistogram + +Visualizes distribution of time-series data using histograms and Kernel Density Estimation (KDE) lines. + +###### Purpose + +The TimeSeriesHistogram test aims to perform a histogram analysis on time-series data to assess the distribution of +values within a dataset over time. This test is useful for regression tasks and can be applied to various types of +data, such as internet traffic, stock prices, and weather data, providing insights into the probability +distribution, skewness, and kurtosis of the dataset. + +###### Test Mechanism + +This test operates on a specific column within the dataset that must have a datetime type index. For each column in +the dataset, a histogram is created using Plotly's histplot function. If the dataset includes more than one +time-series, a distinct histogram is plotted for each series. Additionally, a Kernel Density Estimate (KDE) line is +drawn for each histogram, visualizing the data's underlying probability distribution. The x and y-axis labels are +hidden to focus solely on the data distribution. + +###### Signs of High Risk + +- The dataset lacks a column with a datetime type index. +- The specified columns do not exist within the dataset. +- High skewness or kurtosis in the data distribution, indicating potential bias. +- Presence of significant outliers in the data distribution. + +###### Strengths + +- Serves as a visual diagnostic tool for understanding data behavior and distribution trends. +- Effective for analyzing both single and multiple time-series data. +- KDE line provides a smooth estimate of the overall trend in data distribution. + +###### Limitations + +- Provides a high-level view without specific numeric measures such as skewness or kurtosis. +- The histogram loses some detail due to binning of data values. +- Cannot handle non-numeric data columns. +- Histogram shape may be sensitive to the number of bins used. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd new file mode 100644 index 000000000..194d113a9 --- /dev/null +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -0,0 +1,59 @@ +--- +title: TimeSeriesLinePlot +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TimeSeriesLinePlot + +Generates and analyses time-series data through line plots revealing trends, patterns, anomalies over time. + +###### Purpose + +The TimeSeriesLinePlot metric is designed to generate and analyze time series data through the creation of line +plots. This assists in the initial inspection of the data by providing a visual representation of patterns, trends, +seasonality, irregularity, and anomalies that may be present in the dataset over a period of time. + +###### Test Mechanism + +The mechanism for this Python class involves extracting the column names from the provided dataset and subsequently +generating line plots for each column using the Plotly Python library. For every column in the dataset, a +time-series line plot is created where the values are plotted against the dataset's datetime index. It is important +to note that indexes that are not of datetime type will result in a ValueError. + +###### Signs of High Risk + +- Presence of time-series data that does not have datetime indices. +- Provided columns do not exist in the provided dataset. +- The detection of anomalous patterns or irregularities in the time-series plots, indicating potential high model +instability or probable predictive error. + +###### Strengths + +- The visual representation of complex time series data, which simplifies understanding and helps in recognizing +temporal trends, patterns, and anomalies. +- The adaptability of the metric, which allows it to effectively work with multiple time series within the same +dataset. +- Enables the identification of anomalies and irregular patterns through visual inspection, assisting in spotting +potential data or model performance problems. + +###### Limitations + +- The effectiveness of the metric is heavily reliant on the quality and patterns of the provided time series data. +- Exclusively a visual tool, it lacks the capability to provide quantitative measurements, making it less effective +for comparing and ranking multiple models or when specific numerical diagnostics are needed. +- The metric necessitates that the time-specific data has been transformed into a datetime index, with the data +formatted correctly. +- The metric has an inherent limitation in that it cannot extract deeper statistical insights from the time series +data, which can limit its efficacy with complex data structures and phenomena. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd new file mode 100644 index 000000000..7eff046d4 --- /dev/null +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -0,0 +1,56 @@ +--- +title: TimeSeriesMissingValues +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TimeSeriesMissingValues + +Validates time-series data quality by confirming the count of missing values is below a certain threshold. + +###### Purpose + +This test is designed to validate the quality of a historical time-series dataset by verifying that the number of +missing values is below a specified threshold. As time-series models greatly depend on the continuity and +temporality of data points, missing values could compromise the model's performance. Consequently, this test aims +to ensure data quality and readiness for the machine learning model, safeguarding its predictive capacity. + +###### Test Mechanism + +The test method commences by validating if the dataset has a datetime index; if not, an error is raised. It +establishes a lower limit threshold for missing values and performs a missing values check on each column of the +dataset. An object for the test result is created stating whether the number of missing values is within the +specified threshold. Additionally, the test calculates the percentage of missing values alongside the raw count. + +###### Signs of High Risk + +- The number of missing values in any column of the dataset surpasses the threshold, marking a failure and a +high-risk scenario. The reasons could range from incomplete data collection, faulty sensors to data preprocessing +errors. + +###### Strengths + +- Effectively identifies missing values which could adversely affect the model’s performance. +- Applicable and customizable through the threshold parameter across different data sets. +- Goes beyond raw numbers by calculating the percentage of missing values, offering a more relative understanding +of data scarcity. + +###### Limitations + +- Although it identifies missing values, the test does not provide solutions to handle them. +- The test demands that the dataset should have a datetime index, hence limiting its use only to time series +analysis. +- The test's sensitivity to the 'min_threshold' parameter may raise false alarms if set too strictly or may +overlook problematic data if set too loosely. +- Solely focuses on the 'missingness' of the data and might fall short in addressing other aspects of data quality. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd new file mode 100644 index 000000000..921071795 --- /dev/null +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -0,0 +1,60 @@ +--- +title: TimeSeriesOutliers +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TimeSeriesOutliers + +Identifies and visualizes outliers in time-series data using the z-score method. + +###### Purpose + +This test is designed to identify outliers in time-series data using the z-score method. It's vital for ensuring +data quality before modeling, as outliers can skew predictive models and significantly impact their overall +performance. + +###### Test Mechanism + +The test processes a given dataset which must have datetime indexing, checks if a 'zscore_threshold' parameter has +been supplied, and identifies columns with numeric data types. After finding numeric columns, the implementer then +applies the z-score method to each numeric column, identifying outliers based on the threshold provided. Each +outlier is listed together with their variable name, z-score, timestamp, and relative threshold in a dictionary and +converted to a DataFrame for convenient output. Additionally, it produces visual plots for each time series +illustrating outliers in the context of the broader dataset. The 'zscore_threshold' parameter sets the limit beyond +which a data point will be labeled as an outlier. The default threshold is set at 3, indicating that any data point +that falls 3 standard deviations away from the mean will be marked as an outlier. + +###### Signs of High Risk + +- Many or substantial outliers are present within the dataset, indicating significant anomalies. +- Data points with z-scores higher than the set threshold. +- Potential impact on the performance of machine learning models if outliers are not properly addressed. + +###### Strengths + +- The z-score method is a popular and robust method for identifying outliers in a dataset. +- Simplifies time series maintenance by requiring a datetime index. +- Identifies outliers for each numeric feature individually. +- Provides an elaborate report showing variables, dates, z-scores, and pass/fail tests. +- Offers visual inspection for detected outliers through plots. + +###### Limitations + +- The test only identifies outliers in numeric columns, not in categorical variables. +- The utility and accuracy of z-scores can be limited if the data doesn't follow a normal distribution. +- The method relies on a subjective z-score threshold for deciding what constitutes an outlier, which might not +always be suitable depending on the dataset and use case. +- It does not address possible ways to handle identified outliers in the data. +- The requirement for a datetime index could limit its application. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd new file mode 100644 index 000000000..d9a9af183 --- /dev/null +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -0,0 +1,68 @@ +--- +title: TooManyZeroValues +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TooManyZeroValues + +Identifies numerical columns in a dataset that contain an excessive number of zero values, defined by a threshold +percentage. + +###### Purpose + +The 'TooManyZeroValues' test is utilized to identify numerical columns in the dataset that may present a quantity +of zero values considered excessive. The aim is to detect situations where these may implicate data sparsity or a +lack of variation, limiting their effectiveness within a machine learning model. The definition of 'too many' is +quantified as a percentage of total values, with a default set to 3%. + +###### Test Mechanism + +This test is conducted by looping through each column in the dataset and categorizing those that pertain to +numerical data. On identifying a numerical column, the function computes the total quantity of zero values and +their ratio to the total row count. Should the proportion exceed a pre-set threshold parameter, set by default at +0.03 or 3%, the column is considered to have failed the test. The results for each column are summarized and +reported, indicating the count and percentage of zero values for each numerical column, alongside a status +indicating whether the column has passed or failed the test. + +###### Signs of High Risk + +- Numerical columns showing a high ratio of zero values when compared to the total count of rows (exceeding the +predetermined threshold). +- Columns characterized by zero values across the board suggest a complete lack of data variation, signifying high +risk. + +###### Strengths + +- Assists in highlighting columns featuring an excess of zero values that could otherwise go unnoticed within a +large dataset. +- Provides the flexibility to alter the threshold that determines when the quantity of zero values becomes 'too +many', thus catering to specific needs of a particular analysis or model. +- Offers feedback in the form of both counts and percentages of zero values, which allows a closer inspection of +the distribution and proportion of zeros within a column. +- Targets specifically numerical data, thereby avoiding inappropriate application to non-numerical columns and +mitigating the risk of false test failures. + +###### Limitations + +- Is exclusively designed to check for zero values and doesn’t assess the potential impact of other values that +could affect the dataset, such as extremely high or low figures, missing values, or outliers. +- Lacks the ability to detect a repetitive pattern of zeros, which could be significant in time-series or +longitudinal data. +- Zero values can actually be meaningful in some contexts; therefore, tagging them as 'too many' could potentially +misinterpret the data to some extent. +- This test does not take into consideration the context of the dataset, and fails to recognize that within certain +columns, a high number of zero values could be quite normal and not necessarily an indicator of poor data quality. +- Cannot evaluate non-numerical or categorical columns, which might bring with them different types of concerns or +issues. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd new file mode 100644 index 000000000..09cbdaae5 --- /dev/null +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -0,0 +1,58 @@ +--- +title: UniqueRows +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### UniqueRows + +Verifies the diversity of the dataset by ensuring that the count of unique rows exceeds a prescribed threshold. + +###### Purpose + +The UniqueRows test is designed to gauge the quality of the data supplied to the machine learning model by +verifying that the count of distinct rows in the dataset exceeds a specific threshold, thereby ensuring a varied +collection of data. Diversity in data is essential for training an unbiased and robust model that excels when faced +with novel data. + +###### Test Mechanism + +The testing process starts with calculating the total number of rows in the dataset. Subsequently, the count of +unique rows is determined for each column in the dataset. If the percentage of unique rows (calculated as the ratio +of unique rows to the overall row count) is less than the prescribed minimum percentage threshold given as a +function parameter, the test passes. The results are cached and a final pass or fail verdict is given based on +whether all columns have successfully passed the test. + +###### Signs of High Risk + +- A lack of diversity in data columns, demonstrated by a count of unique rows that falls short of the preset +minimum percentage threshold, is indicative of high risk. +- This lack of variety in the data signals potential issues with data quality, possibly leading to overfitting in +the model and issues with generalization, thus posing a significant risk. + +###### Strengths + +- The UniqueRows test is efficient in evaluating the data's diversity across each information column in the dataset. +- This test provides a quick, systematic method to assess data quality based on uniqueness, which can be pivotal in +developing effective and unbiased machine learning models. + +###### Limitations + +- A limitation of the UniqueRows test is its assumption that the data's quality is directly proportionate to its +uniqueness, which may not always hold true. There might be contexts where certain non-unique rows are essential and +should not be overlooked. +- The test does not consider the relative 'importance' of each column in predicting the output, treating all +columns equally. +- This test may not be suitable or useful for categorical variables, where the count of unique categories is +inherently limited. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd new file mode 100644 index 000000000..53c747b45 --- /dev/null +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -0,0 +1,64 @@ +--- +title: WOEBinPlots +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### WOEBinPlots + +Generates visualizations of Weight of Evidence (WoE) and Information Value (IV) for understanding predictive power +of categorical variables in a data set. + +###### Purpose + +This test is designed to visualize the Weight of Evidence (WoE) and Information Value (IV) for categorical +variables in a provided dataset. By showcasing the data distribution across different categories of each feature, +it aids in understanding each variable's predictive power in the context of a classification-based machine learning +model. Commonly used in credit scoring models, WoE and IV are robust statistical methods for evaluating a +variable's predictive power. + +###### Test Mechanism + +The test implementation follows defined steps. Initially, it selects non-numeric columns from the dataset and +changes them to string type, paving the way for accurate binning. It then performs an automated WoE binning +operation on these selected features, effectively categorizing the potential values of a variable into distinct +bins. After the binning process, the function generates two separate visualizations (a scatter chart for WoE values +and a bar chart for IV) for each variable. These visual presentations are formed according to the spread of each +metric across various categories of each feature. + +###### Signs of High Risk + +- Errors occurring during the binning process. +- Challenges in converting non-numeric columns into string data type. +- Misbalance in the distribution of WoE and IV, with certain bins overtaking others conspicuously. This could +denote that the model is disproportionately dependent on certain variables or categories for predictions, an +indication of potential risks to its robustness and generalizability. + +###### Strengths + +- Provides a detailed visual representation of the relationship between feature categories and the target variable. +This grants an intuitive understanding of each feature's contribution to the model. +- Allows for easy identification of features with high impact, facilitating feature selection and enhancing +comprehension of the model's decision logic. +- WoE conversions are monotonic, upholding the rank ordering of the original data points, which simplifies analysis. + +###### Limitations + +- The method is largely reliant on the binning process, and an inappropriate binning threshold or bin number choice +might result in a misrepresentation of the variable's distribution. +- While excellent for categorical data, the encoding of continuous variables into categorical can sometimes lead to +information loss. +- Extreme or outlier values can dramatically affect the computation of WoE and IV, skewing results. +- The method requires a sufficient number of events per bin to generate a reliable information value and weight of +evidence. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd new file mode 100644 index 000000000..c786f6b22 --- /dev/null +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -0,0 +1,55 @@ +--- +title: WOEBinTable +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### WOEBinTable + +Assesses the Weight of Evidence (WoE) and Information Value (IV) of each feature to evaluate its predictive power +in a binary classification model. + +###### Purpose + +The Weight of Evidence (WoE) and Information Value (IV) test is designed to evaluate the predictive power of each +feature in a machine learning model. This test generates binned groups of values from each feature, computes the +WoE and IV for each bin, and provides insights into the relationship between each feature and the target variable, +illustrating their contribution to the model's predictive capabilities. + +###### Test Mechanism + +The test uses the `scorecardpy.woebin` method to perform automatic binning of the dataset based on WoE. The method +accepts a list of break points for binning numeric variables through the parameter `breaks_adj`. If no breaks are +provided, it uses default binning. The bins are then used to calculate the WoE and IV values, effectively creating +a dataframe that includes the bin boundaries, WoE, and IV values for each feature. A target variable is required +in the dataset to perform this analysis. + +###### Signs of High Risk + +- High IV values, indicating variables with excessive predictive power which might lead to overfitting. +- Errors during the binning process, potentially due to inappropriate data types or poorly defined bins. + +###### Strengths + +- Highly effective for feature selection in binary classification problems, as it quantifies the predictive +information within each feature concerning the binary outcome. +- The WoE transformation creates a monotonic relationship between the target and independent variables. + +###### Limitations + +- Primarily designed for binary classification tasks, making it less applicable or reliable for multi-class +classification or regression tasks. +- Potential difficulties if the dataset has many features, non-binnable features, or non-numeric features. +- The metric does not help in distinguishing whether the observed predictive factor is due to data randomness or a +true phenomenon. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd new file mode 100644 index 000000000..0ce99fac6 --- /dev/null +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -0,0 +1,55 @@ +--- +title: ZivotAndrewsArch +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ZivotAndrewsArch + +Evaluates the order of integration and stationarity of time series data using the Zivot-Andrews unit root test. + +###### Purpose + +The Zivot-Andrews Arch metric is used to evaluate the order of integration for time series data in a machine +learning model. It's designed to test for stationarity, a crucial aspect of time series analysis, where data points +are independent of time. Stationarity means that the statistical properties such as mean, variance, and +autocorrelation are constant over time. + +###### Test Mechanism + +The Zivot-Andrews unit root test is performed on each feature in the dataset using the `ZivotAndrews` function from +the `arch.unitroot` module. This function returns several metrics for each feature, including the statistical +value, p-value (probability value), the number of lags used, and the number of observations. The p-value is used to +decide on the null hypothesis (the time series has a unit root and is non-stationary) based on a chosen level of +significance. + +###### Signs of High Risk + +- A high p-value suggests high risk, indicating insufficient evidence to reject the null hypothesis, implying that +the time series has a unit root and is non-stationary. +- Non-stationary time series data can lead to misleading statistics and unreliable machine learning models. + +###### Strengths + +- Dynamically tests for stationarity against structural breaks in time series data, offering robust evaluation of +stationarity in features. +- Especially beneficial with financial, economic, or other time-series data where data observations lack a +consistent pattern and structural breaks may occur. + +###### Limitations + +- Assumes data is derived from a single-equation, autoregressive model, making it less appropriate for multivariate +time series data or data not aligning with this model. +- May not account for unexpected shocks or changes in the series trend, both of which can significantly impact data +stationarity. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/nlp.qmd b/docs/validmind/tests/data_validation/nlp.qmd new file mode 100644 index 000000000..801db56be --- /dev/null +++ b/docs/validmind/tests/data_validation/nlp.qmd @@ -0,0 +1,21 @@ +--- +title: nlp +toc-depth: 3 +toc-expand: 3 +--- + + + + + +- [CommonWords](nlp/CommonWords.qmd) +- [Hashtags](nlp/Hashtags.qmd) +- [LanguageDetection](nlp/LanguageDetection.qmd) +- [Mentions](nlp/Mentions.qmd) +- [PolarityAndSubjectivity](nlp/PolarityAndSubjectivity.qmd) +- [Punctuations](nlp/Punctuations.qmd) +- [Sentiment](nlp/Sentiment.qmd) +- [StopWords](nlp/StopWords.qmd) +- [TextDescription](nlp/TextDescription.qmd) +- [Toxicity](nlp/Toxicity.qmd) + diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd new file mode 100644 index 000000000..fd015eedb --- /dev/null +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -0,0 +1,56 @@ +--- +title: CommonWords +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### CommonWords + +Assesses the most frequent non-stopwords in a text column for identifying prevalent language patterns. + +###### Purpose + +The CommonWords metric is used to identify and visualize the most prevalent words within a specified text column of +a dataset. This provides insights into the prevalent language patterns and vocabulary, especially useful in Natural +Language Processing (NLP) tasks such as text classification and text summarization. + +###### Test Mechanism + +The test methodology involves splitting the specified text column's entries into words, collating them into a +corpus, and then counting the frequency of each word using the Counter. The forty most frequently occurring +non-stopwords are then visualized in an interactive bar chart using Plotly, where the x-axis represents the words, +and the y-axis indicates their frequency of occurrence. + +###### Signs of High Risk + +- A lack of distinct words within the list, or the most common words being stopwords. +- Frequent occurrence of irrelevant or inappropriate words could point out a poorly curated or noisy dataset. +- An error returned due to the absence of a valid Dataset object, indicating high risk as the metric cannot be +effectively implemented without it. + +###### Strengths + +- The metric provides clear insights into the language features – specifically word frequency – of unstructured +text data. +- It can reveal prominent vocabulary and language patterns, which prove vital for feature extraction in NLP tasks. +- The interactive visualization helps in quickly capturing the patterns and understanding the data intuitively. + +###### Limitations + +- The test disregards semantic or context-related information as it solely focuses on word frequency. +- It intentionally ignores stopwords, which might carry necessary significance in certain scenarios. +- The applicability is limited to English-language text data as English stopwords are used for filtering, hence +cannot account for data in other languages. +- The metric requires a valid Dataset object, indicating a dependency condition that limits its broader +applicability. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd new file mode 100644 index 000000000..b3f20dd42 --- /dev/null +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -0,0 +1,59 @@ +--- +title: Hashtags +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### Hashtags + +Assesses hashtag frequency in a text column, highlighting usage trends and potential dataset bias or spam. + +###### Purpose + +The Hashtags test is designed to measure the frequency of hashtags used within a given text column in a dataset. It +is particularly useful for natural language processing tasks such as text classification and text summarization. +The goal is to identify common trends and patterns in the use of hashtags, which can serve as critical indicators +or features within a machine learning model. + +###### Test Mechanism + +The test implements a regular expression (regex) to extract all hashtags from the specified text column. For each +hashtag found, it makes a tally of its occurrences. It then outputs a list of the top N hashtags (default is 25, +but customizable), sorted by their counts in descending order. The results are also visualized in a bar plot, with +frequency counts on the y-axis and the corresponding hashtags on the x-axis. + +###### Signs of High Risk + +- A low diversity in the usage of hashtags, as indicated by a few hashtags being used disproportionately more than +others. +- Repeated usage of one or few hashtags can be indicative of spam or a biased dataset. +- If there are no or extremely few hashtags found in the dataset, it perhaps signifies that the text data does not +contain structured social media data. + +###### Strengths + +- Provides a concise visual representation of the frequency of hashtags, which can be critical for understanding +trends about a particular topic in text data. +- Instrumental in tasks specifically related to social media text analytics, such as opinion analysis and trend +discovery. +- Adaptable, allowing the flexibility to determine the number of top hashtags to be analyzed. + +###### Limitations + +- Assumes the presence of hashtags and therefore may not be applicable for text datasets that do not contain +hashtags (e.g., formal documents, scientific literature). +- Language-specific limitations of hashtag formulations are not taken into account. +- Does not account for typographical errors, variations, or synonyms in hashtags. +- Does not provide context or sentiment associated with the hashtags, so the information provided may have limited +utility on its own. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd new file mode 100644 index 000000000..15f2a6e01 --- /dev/null +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -0,0 +1,56 @@ +--- +title: LanguageDetection +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### LanguageDetection + +Assesses the diversity of languages in a textual dataset by detecting and visualizing the distribution of languages. + +###### Purpose + +The Language Detection test aims to identify and visualize the distribution of languages present within a textual +dataset. This test helps in understanding the diversity of languages in the data, which is crucial for developing +and validating multilingual models. + +###### Test Mechanism + +This test operates by: + +- Checking if the dataset has a specified text column. +- Using a language detection library to determine the language of each text entry in the dataset. +- Generating a histogram plot of the language distribution, with language codes on the x-axis and their frequencies +on the y-axis. + +If the text column is not specified, a ValueError is raised to ensure proper dataset configuration. + +###### Signs of High Risk + +- A high proportion of entries returning "Unknown" language codes. +- Detection of unexpectedly diverse or incorrect language codes, indicating potential data quality issues. +- Significant imbalance in language distribution, which might indicate potential biases in the dataset. + +###### Strengths + +- Provides a visual representation of language diversity within the dataset. +- Helps identify data quality issues related to incorrect or unknown language detection. +- Useful for ensuring that multilingual models have adequate and appropriate representation from various languages. + +###### Limitations + +- Dependency on the accuracy of the language detection library, which may not be perfect. +- Languages with similar structures or limited text length may be incorrectly classified. +- The test returns "Unknown" for entries where language detection fails, which might mask underlying issues with +certain languages or text formats. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd new file mode 100644 index 000000000..38dbb3583 --- /dev/null +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -0,0 +1,57 @@ +--- +title: Mentions +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### Mentions + +Calculates and visualizes frequencies of '@' prefixed mentions in a text-based dataset for NLP model analysis. + +###### Purpose + +The "Mentions" test is designed to gauge the quality of data in a Natural Language Processing (NLP) or text-focused +Machine Learning model. The primary objective is to identify and calculate the frequency of 'mentions' within a +chosen text column of a dataset. A 'mention' in this context refers to individual text elements that are prefixed +by '@'. The output of this test reveals the most frequently mentioned entities or usernames, which can be integral +for applications such as social media analyses or customer sentiment analyses. + +###### Test Mechanism + +The test first verifies the existence of a text column in the provided dataset. It then employs a regular +expression pattern to extract mentions from the text. Subsequently, the frequency of each unique mention is +calculated. The test selects the most frequent mentions based on default or user-defined parameters, the default +being the top 25, for representation. This process of thresholding forms the core of the test. A treemap plot +visualizes the test results, where the size of each rectangle corresponds to the frequency of a particular mention. + +###### Signs of High Risk + +- The lack of a valid text column in the dataset, which would result in the failure of the test execution. +- The absence of any mentions within the text data, indicating that there might not be any text associated with +'@'. This situation could point toward sparse or poor-quality data, thereby hampering the model's generalization or +learning capabilities. + +###### Strengths + +- The test is specifically optimized for text-based datasets which gives it distinct power in the context of NLP. +- It enables quick identification and visually appealing representation of the predominant elements or mentions. +- It can provide crucial insights about the most frequently mentioned entities or usernames. + +###### Limitations + +- The test only recognizes mentions that are prefixed by '@', hence useful textual aspects not preceded by '@' +might be ignored. +- This test isn't suited for datasets devoid of textual data. +- It does not provide insights on less frequently occurring data or outliers, which means potentially significant +patterns could be overlooked. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd new file mode 100644 index 000000000..add3bf42e --- /dev/null +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -0,0 +1,54 @@ +--- +title: PolarityAndSubjectivity +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### PolarityAndSubjectivity + +Analyzes the polarity and subjectivity of text data within a given dataset to visualize the sentiment distribution. + +###### Purpose + +The Polarity and Subjectivity test is designed to evaluate the sentiment expressed in textual data. By analyzing +these aspects, it helps to identify the emotional tone and subjectivity of the dataset, which could be crucial in +understanding customer feedback, social media sentiments, or other text-related data. + +###### Test Mechanism + +This test uses TextBlob to compute the polarity and subjectivity scores of textual data in a given dataset. The +mechanism includes: + +- Iterating through each text entry in the specified column of the dataset. +- Applying the TextBlob library to compute the polarity (ranging from -1 for negative sentiment to +1 for positive +sentiment) and subjectivity (ranging from 0 for objective to 1 for subjective) for each entry. +- Creating a scatter plot using Plotly to visualize the relationship between polarity and subjectivity. + +###### Signs of High Risk + +- High concentration of negative polarity values indicating prevalent negative sentiments. +- High subjectivity scores suggesting the text data is largely opinion-based rather than factual. +- Disproportionate clusters of extreme scores (e.g., many points near -1 or +1 polarity). + +###### Strengths + +- Quantifies sentiment and subjectivity which can provide actionable insights. +- Visualizes sentiment distribution, aiding in easy interpretation. +- Utilizes well-established TextBlob library for sentiment analysis. + +###### Limitations + +- Polarity and subjectivity calculations may oversimplify nuanced text sentiments. +- Reliance on TextBlob which may not be accurate for all domains or contexts. +- Visualization could become cluttered with very large datasets, making interpretation difficult. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd new file mode 100644 index 000000000..cc9c5e077 --- /dev/null +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -0,0 +1,59 @@ +--- +title: Punctuations +toc-depth: 3 +toc-expand: 3 +--- + +Metrics functions for any Pandas-compatible datasets + + + + + + + + + + +#### Punctuations + +Analyzes and visualizes the frequency distribution of punctuation usage in a given text dataset. + +###### Purpose + +The Punctuations Metric's primary purpose is to analyze the frequency of punctuation usage within a given text +dataset. This is often used in Natural Language Processing tasks, such as text classification and text +summarization. + +###### Test Mechanism + +The test begins by verifying that the input "dataset" is of the type VMDataset. The count_mode parameter must be +either "token" (counts punctuation marks as individual tokens) or "word" (counts punctuation marks within words). +Following that, a corpus is created from the dataset by splitting its text on spaces. Each unique punctuation +character in the text corpus is then tallied. The frequency distribution of each punctuation symbol is visualized +as a bar graph, with these results being stored as Figures and associated with the main Punctuations object. + +###### Signs of High Risk + +- Excessive or unusual frequency of specific punctuation marks, potentially denoting dubious quality, data +corruption, or skewed data. + +###### Strengths + +- Provides valuable insights into the distribution of punctuation usage in a text dataset. +- Important in validating the quality, consistency, and nature of the data. +- Can provide hints about the style or tonality of the text corpus, such as informal and emotional context +indicated by frequent exclamation marks. + +###### Limitations + +- Focuses solely on punctuation usage, potentially missing other important textual characteristics. +- General cultural or tonality assumptions based on punctuation distribution can be misguiding, as these vary +across different languages and contexts. +- Less effective with languages that use non-standard or different punctuation. +- Visualization may lack interpretability when there are many unique punctuation marks in the dataset. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd new file mode 100644 index 000000000..16f38efa1 --- /dev/null +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -0,0 +1,50 @@ +--- +title: Sentiment +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### Sentiment + +Analyzes the sentiment of text data within a dataset using the VADER sentiment analysis tool. + +###### Purpose + +The Sentiment test evaluates the overall sentiment of text data within a dataset. By analyzing sentiment scores, it +aims to ensure that the model is interpreting text data accurately and is not biased towards a particular sentiment. + +###### Test Mechanism + +This test uses the VADER (Valence Aware Dictionary and sEntiment Reasoner) SentimentIntensityAnalyzer. It processes +each text entry in a specified column of the dataset to calculate the compound sentiment score, which represents +the overall sentiment polarity. The distribution of these sentiment scores is then visualized using a KDE (Kernel +Density Estimation) plot, highlighting any skewness or concentration in sentiment. + +###### Signs of High Risk + +- Extreme polarity in sentiment scores, indicating potential bias. +- Unusual concentration of sentiment scores in a specific range. +- Significant deviation from expected sentiment distribution for the given text data. + +###### Strengths + +- Provides a clear visual representation of sentiment distribution. +- Uses a well-established sentiment analysis tool (VADER). +- Can handle a wide range of text data, making it flexible for various applications. + +###### Limitations + +- May not capture nuanced or context-specific sentiments. +- Relies heavily on the accuracy of the VADER sentiment analysis tool. +- Visualization alone may not provide comprehensive insights into underlying causes of sentiment distribution. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd new file mode 100644 index 000000000..2df75e1c7 --- /dev/null +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -0,0 +1,69 @@ +--- +title: StopWords +toc-depth: 3 +toc-expand: 3 +--- + +Threshold based tests + + + + + + + + + + +#### StopWords + +Evaluates and visualizes the frequency of English stop words in a text dataset against a defined threshold. + +###### Purpose + +The StopWords threshold test is a tool designed for assessing the quality of text data in an ML model. It focuses +on the identification and analysis of "stop words" in a given dataset. Stop words are frequent, common, yet +semantically insignificant words (for example**: "the", "and", "is") in a language. This test evaluates the +proportion of stop words to the total word count in the dataset, in essence, scrutinizing the frequency of stop +word usage. The core objective is to highlight the prevalent stop words based on their usage frequency, which can +be instrumental in cleaning the data from noise and improving ML model performance. + +###### Test Mechanism + +The StopWords test initiates on receiving an input of a 'VMDataset' object. Absence of such an object will trigger +an error. The methodology involves inspection of the text column of the VMDataset to create a 'corpus' (a +collection of written texts). Leveraging the Natural Language Toolkit's (NLTK) stop word repository, the test +screens the corpus for any stop words and documents their frequency. It further calculates the percentage usage of +each stop word compared to the total word count in the corpus. This percentage is evaluated against a predefined +'min_percent_threshold'. If this threshold is breached, the test returns a failed output. Top prevailing stop words +along with their usage percentages are returned, facilitated by a bar chart visualization of these stop words and +their frequency. + +###### Signs of High Risk + +- A percentage of any stop words exceeding the predefined 'min_percent_threshold'. +- High frequency of stop words in the dataset which may adversely affect the application's analytical performance +due to noise creation. + +###### Strengths + +- The ability to scrutinize and quantify the usage of stop words. +- Provides insights into potential noise in the text data due to stop words. +- Directly aids in enhancing model training efficiency. +- Includes a bar chart visualization feature to easily interpret and action upon the stop words frequency +information. + +###### Limitations + +- The test only supports English stop words, making it less effective with datasets of other languages. +- The 'min_percent_threshold' parameter may require fine-tuning for different datasets, impacting the overall +effectiveness of the test. +- Contextual use of the stop words within the dataset is not considered, potentially overlooking their significance +in certain contexts. +- The test focuses specifically on the frequency of stop words, not providing direct measures of model performance +or predictive accuracy. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd new file mode 100644 index 000000000..3af4431dc --- /dev/null +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -0,0 +1,63 @@ +--- +title: TextDescription +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### create_metrics_df + + +#### TextDescription + +Conducts comprehensive textual analysis on a dataset using NLTK to evaluate various parameters and generate +visualizations. + +###### Purpose + +The TextDescription test aims to conduct a thorough textual analysis of a dataset using the NLTK (Natural Language +Toolkit) library. It evaluates various metrics such as total words, total sentences, average sentence length, total +paragraphs, total unique words, most common words, total punctuations, and lexical diversity. The goal is to +understand the nature of the text and anticipate challenges machine learning models might face in text processing, +language understanding, or summarization tasks. + +###### Test Mechanism + +The test works by: + +- Parsing the dataset and tokenizing the text into words, sentences, and paragraphs using NLTK. +- Removing stopwords and unwanted tokens. +- Calculating parameters like total words, total sentences, average sentence length, total paragraphs, total unique +words, total punctuations, and lexical diversity. +- Generating scatter plots to visualize correlations between various metrics (e.g., Total Words vs Total Sentences). + +###### Signs of High Risk + +- Anomalies or increased complexity in lexical diversity. +- Longer sentences and paragraphs. +- High uniqueness of words. +- Large number of unwanted tokens. +- Missing or erroneous visualizations. + +###### Strengths + +- Essential for pre-processing text data in machine learning models. +- Provides a comprehensive breakdown of text data, aiding in understanding its complexity. +- Generates visualizations to help comprehend text structure and complexity. + +###### Limitations + +- Highly dependent on the NLTK library, limiting the test to supported languages. +- Limited customization for removing undesirable tokens and stop words. +- Does not consider semantic or grammatical complexities. +- Assumes well-structured documents, which may result in inaccuracies with poorly formatted text. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd new file mode 100644 index 000000000..1303357d9 --- /dev/null +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -0,0 +1,54 @@ +--- +title: Toxicity +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### Toxicity + +Assesses the toxicity of text data within a dataset to visualize the distribution of toxicity scores. + +###### Purpose + +The Toxicity test aims to evaluate the level of toxic content present in a text dataset by leveraging a pre-trained +toxicity model. It helps in identifying potentially harmful or offensive language that may negatively impact users +or stakeholders. + +###### Test Mechanism + +This test uses a pre-trained toxicity evaluation model and applies it to each text entry in the specified column of +a dataset’s dataframe. The procedure involves: + +- Loading a pre-trained toxicity model. +- Extracting the text from the specified column in the dataset. +- Computing toxicity scores for each text entry. +- Generating a KDE (Kernel Density Estimate) plot to visualize the distribution of these toxicity scores. + +###### Signs of High Risk + +- High concentration of high toxicity scores in the KDE plot. +- A significant proportion of text entries with toxicity scores above a predefined threshold. +- Wide distribution of toxicity scores, indicating inconsistency in content quality. + +###### Strengths + +- Provides a visual representation of toxicity distribution, making it easier to identify outliers. +- Uses a robust pre-trained model for toxicity evaluation. +- Can process large text datasets efficiently. + +###### Limitations + +- Depends on the accuracy and bias of the pre-trained toxicity model. +- Does not provide context-specific insights, which may be necessary for nuanced understanding. +- May not capture all forms of subtle or indirect toxic language. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation.qmd b/docs/validmind/tests/model_validation.qmd new file mode 100644 index 000000000..d601632b5 --- /dev/null +++ b/docs/validmind/tests/model_validation.qmd @@ -0,0 +1,29 @@ +--- +title: model_validation +toc-depth: 3 +toc-expand: 3 +--- + + + + + +- [BertScore](model_validation/BertScore.qmd) +- [BleuScore](model_validation/BleuScore.qmd) +- [ClusterSizeDistribution](model_validation/ClusterSizeDistribution.qmd) +- [ContextualRecall](model_validation/ContextualRecall.qmd) +- [FeaturesAUC](model_validation/FeaturesAUC.qmd) +- [MeteorScore](model_validation/MeteorScore.qmd) +- [ModelMetadata](model_validation/ModelMetadata.qmd) +- [ModelPredictionResiduals](model_validation/ModelPredictionResiduals.qmd) +- [RegardScore](model_validation/RegardScore.qmd) +- [RegressionResidualsPlot](model_validation/RegressionResidualsPlot.qmd) +- [RougeScore](model_validation/RougeScore.qmd) +- [sklearn](model_validation/sklearn.qmd) +- [statsmodels](model_validation/statsmodels.qmd) +- [TimeSeriesPredictionsPlot](model_validation/TimeSeriesPredictionsPlot.qmd) +- [TimeSeriesPredictionWithCI](model_validation/TimeSeriesPredictionWithCI.qmd) +- [TimeSeriesR2SquareBySegments](model_validation/TimeSeriesR2SquareBySegments.qmd) +- [TokenDisparity](model_validation/TokenDisparity.qmd) +- [ToxicityScore](model_validation/ToxicityScore.qmd) + diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd new file mode 100644 index 000000000..20260e949 --- /dev/null +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -0,0 +1,64 @@ +--- +title: BertScore +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### BertScore + +Assesses the quality of machine-generated text using BERTScore metrics and visualizes results through histograms +and bar charts, alongside compiling a comprehensive table of descriptive statistics. + +###### Purpose + +This function is designed to assess the quality of text generated by machine learning models using BERTScore +metrics. BERTScore evaluates text generation models' performance by calculating precision, recall, and F1 score +based on BERT contextual embeddings. + +###### Test Mechanism + +The function starts by extracting the true and predicted values from the provided dataset and model. It then +initializes the BERTScore evaluator. For each pair of true and predicted texts, the function calculates the +BERTScore metrics and compiles them into a dataframe. Histograms and bar charts are generated for each BERTScore +metric (Precision, Recall, and F1 Score) to visualize their distribution. Additionally, a table of descriptive +statistics (mean, median, standard deviation, minimum, and maximum) is compiled for each metric, providing a +comprehensive summary of the model's performance. The test uses the `evaluation_model` param to specify the +huggingface model to use for evaluation. `microsoft/deberta-xlarge-mnli` is the best-performing model but is +very large and may be slow without a GPU. `microsoft/deberta-large-mnli` is a smaller model that is faster to +run and `distilbert-base-uncased` is much lighter and can run on a CPU but is less accurate. + +###### Signs of High Risk + +- Consistently low scores across BERTScore metrics could indicate poor quality in the generated text, suggesting +that the model fails to capture the essential content of the reference texts. +- Low precision scores might suggest that the generated text contains a lot of redundant or irrelevant information. +- Low recall scores may indicate that important information from the reference text is being omitted. +- An imbalanced performance between precision and recall, reflected by a low F1 Score, could signal issues in the +model's ability to balance informativeness and conciseness. + +###### Strengths + +- Provides a multifaceted evaluation of text quality through different BERTScore metrics, offering a detailed view +of model performance. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of the +scores. +- Descriptive statistics offer a concise summary of the model's strengths and weaknesses in generating text. + +###### Limitations + +- BERTScore relies on the contextual embeddings from BERT models, which may not fully capture all nuances of text +similarity. +- The evaluation relies on the availability of high-quality reference texts, which may not always be obtainable. +- While useful for comparison, BERTScore metrics alone do not provide a complete assessment of a model's +performance and should be supplemented with other metrics and qualitative analysis. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd new file mode 100644 index 000000000..f345e3738 --- /dev/null +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -0,0 +1,61 @@ +--- +title: BleuScore +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### BleuScore + +Evaluates the quality of machine-generated text using BLEU metrics and visualizes the results through histograms +and bar charts, alongside compiling a comprehensive table of descriptive statistics for BLEU scores. + +###### Purpose + +This function is designed to assess the quality of text generated by machine learning models using the BLEU metric. +BLEU, which stands for Bilingual Evaluation Understudy, is a metric used to evaluate the overlap of n-grams between +the machine-generated text and reference texts. This evaluation is crucial for tasks such as text summarization, +machine translation, and text generation, where the goal is to produce text that accurately reflects the content +and meaning of human-crafted references. + +###### Test Mechanism + +The function starts by extracting the true and predicted values from the provided dataset and model. It then +initializes the BLEU evaluator. For each pair of true and predicted texts, the function calculates the BLEU scores +and compiles them into a dataframe. Histograms and bar charts are generated for the BLEU scores to visualize their +distribution. Additionally, a table of descriptive statistics (mean, median, standard deviation, minimum, and +maximum) is compiled for the BLEU scores, providing a comprehensive summary of the model's performance. + +###### Signs of High Risk + +- Consistently low BLEU scores could indicate poor quality in the generated text, suggesting that the model fails +to capture the essential content of the reference texts. +- Low precision scores might suggest that the generated text contains a lot of redundant or irrelevant information. +- Low recall scores may indicate that important information from the reference text is being omitted. +- An imbalanced performance between precision and recall, reflected by a low BLEU score, could signal issues in the +model's ability to balance informativeness and conciseness. + +###### Strengths + +- Provides a straightforward and widely-used evaluation of text quality through BLEU scores. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of the +scores. +- Descriptive statistics offer a concise summary of the model's strengths and weaknesses in generating text. + +###### Limitations + +- BLEU metrics primarily focus on n-gram overlap and may not fully capture semantic coherence, fluency, or +grammatical quality of the text. +- The evaluation relies on the availability of high-quality reference texts, which may not always be obtainable. +- While useful for comparison, BLEU scores alone do not provide a complete assessment of a model's performance and +should be supplemented with other metrics and qualitative analysis. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd new file mode 100644 index 000000000..f54e92af8 --- /dev/null +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -0,0 +1,58 @@ +--- +title: ClusterSizeDistribution +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ClusterSizeDistribution + +Assesses the performance of clustering models by comparing the distribution of cluster sizes in model predictions +with the actual data. + +###### Purpose + +The Cluster Size Distribution test aims to assess the performance of clustering models by comparing the +distribution of cluster sizes in the model's predictions with the actual data. This comparison helps determine if +the clustering model's output aligns well with the true cluster distribution, providing insights into the model's +accuracy and performance. + +###### Test Mechanism + +The test mechanism involves the following steps: + +- Run the clustering model on the provided dataset to obtain predictions. +- Convert both the actual and predicted outputs into pandas dataframes. +- Use pandas built-in functions to derive the cluster size distributions from these dataframes. +- Construct two histograms**: one for the actual cluster size distribution and one for the predicted distribution. +- Plot the histograms side-by-side for visual comparison. + +###### Signs of High Risk + +- Discrepancies between the actual cluster size distribution and the predicted cluster size distribution. +- Irregular distribution of data across clusters in the predicted outcomes. +- High number of outlier clusters suggesting the model struggles to correctly group data. + +###### Strengths + +- Provides a visual and intuitive way to compare the clustering model's performance against actual data. +- Effectively reveals where the model may be over- or underestimating cluster sizes. +- Versatile as it works well with any clustering model. + +###### Limitations + +- Assumes that the actual cluster distribution is optimal, which may not always be the case. +- Relies heavily on visual comparison, which could be subjective and may not offer a precise numerical measure of +performance. +- May not fully capture other important aspects of clustering, such as cluster density, distances between clusters, +and the shape of clusters. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd new file mode 100644 index 000000000..dfbf29d63 --- /dev/null +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -0,0 +1,62 @@ +--- +title: ContextualRecall +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ContextualRecall + +Evaluates a Natural Language Generation model's ability to generate contextually relevant and factually correct +text, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of +descriptive statistics for contextual recall scores. + +###### Purpose + +The Contextual Recall metric is used to evaluate the ability of a natural language generation (NLG) model to +generate text that appropriately reflects the given context or prompt. It measures the model's capability to +remember and reproduce the main context in its resulting output. This metric is critical in natural language +processing tasks, as the coherency and contextuality of the generated text are essential. + +###### Test Mechanism + +The function starts by extracting the true and predicted values from the provided dataset and model. It then +tokenizes the reference and candidate texts into discernible words or tokens using NLTK. The token overlap between +the reference and candidate texts is identified, and the Contextual Recall score is computed by dividing the number +of overlapping tokens by the total number of tokens in the reference text. Scores are calculated for each test +dataset instance, resulting in an array of scores. These scores are visualized using a histogram and a bar chart to +show score variations across different rows. Additionally, a table of descriptive statistics (mean, median, +standard deviation, minimum, and maximum) is compiled for the contextual recall scores, providing a comprehensive +summary of the model's performance. + +###### Signs of High Risk + +- Low contextual recall scores could indicate that the model is not effectively reflecting the original context in +its output, leading to incoherent or contextually misaligned text. +- A consistent trend of low recall scores could suggest underperformance of the model. + +###### Strengths + +- Provides a quantifiable measure of a model's adherence to the context and factual elements of the generated +narrative. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of +contextual recall scores. +- Descriptive statistics offer a concise summary of the model's performance in generating contextually relevant +texts. + +###### Limitations + +- The focus on word overlap could result in high scores for texts that use many common words, even when these texts +lack coherence or meaningful context. +- This metric does not consider the order of words, which could lead to overestimated scores for scrambled outputs. +- Models that effectively use infrequent words might be undervalued, as these words might not overlap as often. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd new file mode 100644 index 000000000..36f256770 --- /dev/null +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -0,0 +1,56 @@ +--- +title: FeaturesAUC +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### FeaturesAUC + +Evaluates the discriminatory power of each individual feature within a binary classification model by calculating +the Area Under the Curve (AUC) for each feature separately. + +###### Purpose + +The central objective of this metric is to quantify how well each feature on its own can differentiate between the +two classes in a binary classification problem. It serves as a univariate analysis tool that can help in +pre-modeling feature selection or post-modeling interpretation. + +###### Test Mechanism + +For each feature, the metric treats the feature values as raw scores to compute the AUC against the actual binary +outcomes. It provides an AUC value for each feature, offering a simple yet powerful indication of each feature's +univariate classification strength. + +###### Signs of High Risk + +- A feature with a low AUC score may not be contributing significantly to the differentiation between the two +classes, which could be a concern if it is expected to be predictive. +- Conversely, a surprisingly high AUC for a feature not believed to be informative may suggest data leakage or +other issues with the data. + +###### Strengths + +- By isolating each feature, it highlights the individual contribution of features to the classification task +without the influence of other variables. +- Useful for both initial feature evaluation and for providing insights into the model's reliance on individual +features after model training. + +###### Limitations + +- Does not reflect the combined effects of features or any interaction between them, which can be critical in +certain models. +- The AUC values are calculated without considering the model's use of the features, which could lead to different +interpretations of feature importance when considering the model holistically. +- This metric is applicable only to binary classification tasks and cannot be directly extended to multiclass +classification or regression without modifications. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd new file mode 100644 index 000000000..373c4739f --- /dev/null +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -0,0 +1,65 @@ +--- +title: MeteorScore +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### MeteorScore + +Assesses the quality of machine-generated translations by comparing them to human-produced references using the +METEOR score, which evaluates precision, recall, and word order. + +###### Purpose + +The METEOR (Metric for Evaluation of Translation with Explicit ORdering) score is designed to evaluate the quality +of machine translations by comparing them against reference translations. It emphasizes both the accuracy and +fluency of translations, incorporating precision, recall, and word order into its assessment. + +###### Test Mechanism + +The function starts by extracting the true and predicted values from the provided dataset and model. The METEOR +score is computed for each pair of machine-generated translation (prediction) and its corresponding human-produced +reference. This is done by considering unigram matches between the translations, including matches based on surface +forms, stemmed forms, and synonyms. The score is a combination of unigram precision and recall, adjusted for word +order through a fragmentation penalty. Scores are compiled into a dataframe, and histograms and bar charts are +generated to visualize the distribution of METEOR scores. Additionally, a table of descriptive statistics (mean, +median, standard deviation, minimum, and maximum) is compiled for the METEOR scores, providing a comprehensive +summary of the model's performance. + +###### Signs of High Risk + +- Lower METEOR scores can indicate a lack of alignment between the machine-generated translations and their +human-produced references, highlighting potential deficiencies in both the accuracy and fluency of translations. +- Significant discrepancies in word order or an excessive fragmentation penalty could signal issues with how the +translation model processes and reconstructs sentence structures, potentially compromising the natural flow of +translated text. +- Persistent underperformance across a variety of text types or linguistic contexts might suggest a broader +inability of the model to adapt to the nuances of different languages or dialects, pointing towards gaps in its +training or inherent limitations. + +###### Strengths + +- Incorporates a balanced consideration of precision and recall, weighted towards recall to reflect the importance +of content coverage in translations. +- Directly accounts for word order, offering a nuanced evaluation of translation fluency beyond simple lexical +matching. +- Adapts to various forms of lexical similarity, including synonyms and stemmed forms, allowing for flexible +matching. + +###### Limitations + +- While comprehensive, the complexity of METEOR's calculation can make it computationally intensive, especially for +large datasets. +- The use of external resources for synonym and stemming matching may introduce variability based on the resources' +quality and relevance to the specific translation task. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd new file mode 100644 index 000000000..aa2d1e6d9 --- /dev/null +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -0,0 +1,41 @@ +--- +title: ModelMetadata +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ModelMetadata + +Compare metadata of different models and generate a summary table with the results. + +**Purpose****: The purpose of this function is to compare the metadata of different models, including information about their architecture, framework, framework version, and programming language. + +**Test Mechanism**: The function retrieves the metadata for each model using `get_model_info`, renames columns according to a predefined set of labels, and compiles this information into a summary table. + +**Signs of High Risk**: + +- Inconsistent or missing metadata across models can indicate potential issues in model documentation or management. +- Significant differences in framework versions or programming languages might pose challenges in model integration and deployment. + +**Strengths**: + +- Provides a clear comparison of essential model metadata. +- Standardizes metadata labels for easier interpretation and comparison. +- Helps identify potential compatibility or consistency issues across models. + +**Limitations**: + +- Assumes that the `get_model_info` function returns all necessary metadata fields. +- Relies on the correctness and completeness of the metadata provided by each model. +- Does not include detailed parameter information, focusing instead on high-level metadata. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd new file mode 100644 index 000000000..a4c41dd4f --- /dev/null +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -0,0 +1,49 @@ +--- +title: ModelPredictionResiduals +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ModelPredictionResiduals + +Assesses normality and behavior of residuals in regression models through visualization and statistical tests. + +###### Purpose + +The Model Prediction Residuals test aims to visualize the residuals of model predictions and assess their normality +using the Kolmogorov-Smirnov (KS) test. It helps to identify potential issues related to model assumptions and +effectiveness. + +###### Test Mechanism + +The function calculates residuals and generates +two figures**: one for the time series of residuals and one for the histogram of residuals. +It also calculates the KS test for normality and summarizes the results in a table. + +###### Signs of High Risk + +- Residuals are not normally distributed, indicating potential issues with model assumptions. +- High skewness or kurtosis in the residuals, which may suggest model misspecification. + +###### Strengths + +- Provides clear visualizations of residuals over time and their distribution. +- Includes statistical tests to assess the normality of residuals. +- Helps in identifying potential model misspecifications and assumption violations. + +###### Limitations + +- Assumes that the dataset is provided as a DataFrameDataset object with a .df attribute to access the pandas +DataFrame. +- Only generates plots for datasets with a datetime index, resulting in errors for other types of indices. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd new file mode 100644 index 000000000..59f20505b --- /dev/null +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -0,0 +1,56 @@ +--- +title: RegardScore +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### RegardScore + +Assesses the sentiment and potential biases in text generated by NLP models by computing and visualizing regard +scores. + +###### Purpose + +The `RegardScore` test aims to evaluate the levels of regard (positive, negative, neutral, or other) in texts +generated by NLP models. It helps in understanding the sentiment and bias present in the generated content. + +###### Test Mechanism + +This test extracts the true and predicted values from the provided dataset and model. It then computes the regard +scores for each text instance using a preloaded `regard` evaluation tool. The scores are compiled into dataframes, +and visualizations such as histograms and bar charts are generated to display the distribution of regard scores. +Additionally, descriptive statistics (mean, median, standard deviation, minimum, and maximum) are calculated for +the regard scores, providing a comprehensive overview of the model's performance. + +###### Signs of High Risk + +- Noticeable skewness in the histogram, especially when comparing the predicted regard scores with the target +regard scores, can indicate biases or inconsistencies in the model. +- Lack of neutral scores in the model's predictions, despite a balanced distribution in the target data, might +signal an issue. + +###### Strengths + +- Provides a clear evaluation of regard levels in generated texts, aiding in ensuring content appropriateness. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of +regard scores. +- Descriptive statistics offer a concise summary of the model's performance in generating texts with balanced +sentiments. + +###### Limitations + +- The accuracy of the regard scores is contingent upon the underlying `regard` tool. +- The scores provide a broad overview but do not specify which portions or tokens of the text are responsible for +high regard. +- Supplementary, in-depth analysis might be needed for granular insights. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd new file mode 100644 index 000000000..d4891511e --- /dev/null +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -0,0 +1,58 @@ +--- +title: RegressionResidualsPlot +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### RegressionResidualsPlot + +Evaluates regression model performance using residual distribution and actual vs. predicted plots. + +###### Purpose + +The `RegressionResidualsPlot` metric aims to evaluate the performance of regression models. By generating and +analyzing two plots – a distribution of residuals and a scatter plot of actual versus predicted values – this tool +helps to visually appraise how well the model predicts and the nature of errors it makes. + +###### Test Mechanism + +The process begins by extracting the true output values (`y_true`) and the model's predicted values (`y_pred`). +Residuals are computed by subtracting predicted from true values. These residuals are then visualized using a +histogram to display their distribution. Additionally, a scatter plot is derived to compare true values against +predicted values, together with a "Perfect Fit" line, which represents an ideal match (predicted values equal +actual values), facilitating the assessment of the model's predictive accuracy. + +###### Signs of High Risk + +- Residuals showing a non-normal distribution, especially those with frequent extreme values. +- Significant deviations of predicted values from actual values in the scatter plot. +- Sparse density of data points near the "Perfect Fit" line in the scatter plot, indicating poor prediction +accuracy. +- Visible patterns or trends in the residuals plot, suggesting the model's failure to capture the underlying data +structure adequately. + +###### Strengths + +- Provides a direct, visually intuitive assessment of a regression model’s accuracy and handling of data. +- Visual plots can highlight issues of underfitting or overfitting. +- Can reveal systematic deviations or trends that purely numerical metrics might miss. +- Applicable across various regression model types. + +###### Limitations + +- Relies on visual interpretation, which can be subjective and less precise than numerical evaluations. +- May be difficult to interpret in cases with multi-dimensional outputs due to the plots’ two-dimensional nature. +- Overlapping data points in the residuals plot can complicate interpretation efforts. +- Does not summarize model performance into a single quantifiable metric, which might be needed for comparative or +summary analyses. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd new file mode 100644 index 000000000..f09c046cc --- /dev/null +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -0,0 +1,63 @@ +--- +title: RougeScore +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### RougeScore + +Assesses the quality of machine-generated text using ROUGE metrics and visualizes the results to provide +comprehensive performance insights. + +###### Purpose + +The ROUGE Score test is designed to evaluate the quality of text generated by machine learning models using various +ROUGE metrics. ROUGE, which stands for Recall-Oriented Understudy for Gisting Evaluation, measures the overlap of +n-grams, word sequences, and word pairs between machine-generated text and reference texts. This evaluation is +crucial for tasks like text summarization, machine translation, and text generation, where the goal is to produce +text that accurately reflects the content and meaning of human-crafted references. + +###### Test Mechanism + +The test extracts the true and predicted values from the provided dataset and model. It initializes the ROUGE +evaluator with the specified metric (e.g., ROUGE-1). For each pair of true and predicted texts, it calculates the +ROUGE scores and compiles them into a dataframe. Histograms and bar charts are generated for each ROUGE metric +(Precision, Recall, and F1 Score) to visualize their distribution. Additionally, a table of descriptive statistics +(mean, median, standard deviation, minimum, and maximum) is compiled for each metric, providing a comprehensive +summary of the model's performance. + +###### Signs of High Risk + +- Consistently low scores across ROUGE metrics could indicate poor quality in the generated text, suggesting that +the model fails to capture the essential content of the reference texts. +- Low precision scores might suggest that the generated text contains a lot of redundant or irrelevant information. +- Low recall scores may indicate that important information from the reference text is being omitted. +- An imbalanced performance between precision and recall, reflected by a low F1 Score, could signal issues in the +model's ability to balance informativeness and conciseness. + +###### Strengths + +- Provides a multifaceted evaluation of text quality through different ROUGE metrics, offering a detailed view of +model performance. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of the +scores. +- Descriptive statistics offer a concise summary of the model's strengths and weaknesses in generating text. + +###### Limitations + +- ROUGE metrics primarily focus on n-gram overlap and may not fully capture semantic coherence, fluency, or +grammatical quality of the text. +- The evaluation relies on the availability of high-quality reference texts, which may not always be obtainable. +- While useful for comparison, ROUGE scores alone do not provide a complete assessment of a model's performance and +should be supplemented with other metrics and qualitative analysis. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd new file mode 100644 index 000000000..ca51879c8 --- /dev/null +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -0,0 +1,57 @@ +--- +title: TimeSeriesPredictionWithCI +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TimeSeriesPredictionWithCI + +Assesses predictive accuracy and uncertainty in time series models, highlighting breaches beyond confidence +intervals. + +###### Purpose + +The purpose of the Time Series Prediction with Confidence Intervals (CI) test is to visualize the actual versus +predicted values for time series data, including confidence intervals, and to compute and report the number of +breaches beyond these intervals. This helps in evaluating the reliability and accuracy of the model's predictions. + +###### Test Mechanism + +The function performs the following steps: + +- Calculates the standard deviation of prediction errors. +- Determines the confidence intervals using a specified confidence level, typically 95%. +- Counts the number of actual values that fall outside the confidence intervals, referred to as breaches. +- Generates a plot visualizing the actual values, predicted values, and confidence intervals. +- Returns a DataFrame summarizing the breach information, including the total breaches, upper breaches, and lower +breaches. + +###### Signs of High Risk + +- A high number of breaches indicates that the model's predictions are not reliable within the specified confidence +level. +- Significant deviations between actual and predicted values may highlight model inadequacies or issues with data +quality. + +###### Strengths + +- Provides a visual representation of prediction accuracy and the uncertainty around predictions. +- Includes a statistical measure of prediction reliability through confidence intervals. +- Computes and reports breaches, offering a quantitative assessment of prediction performance. + +###### Limitations + +- Assumes that the dataset is provided as a DataFrameDataset object with a datetime index. +- Requires that `dataset.y_pred(model)` returns the predicted values for the model. +- The calculation of confidence intervals assumes normally distributed errors, which may not hold for all datasets. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd new file mode 100644 index 000000000..76dc9e739 --- /dev/null +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -0,0 +1,43 @@ +--- +title: TimeSeriesPredictionsPlot +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TimeSeriesPredictionsPlot + +Plot actual vs predicted values for time series data and generate a visual comparison for the model. + +###### Purpose + +The purpose of this function is to visualize the actual versus predicted values for time +series data for a single model. + +###### Test Mechanism + +The function plots the actual values from the dataset and overlays the predicted +values from the model using Plotly for interactive visualization. + +- Large discrepancies between actual and predicted values indicate poor model performance. +- Systematic deviations in predicted values can highlight model bias or issues with data patterns. + +###### Strengths + +- Provides a clear visual comparison of model predictions against actual values. +- Uses Plotly for interactive and visually appealing plots. + +###### Limitations + +- Assumes that the dataset is provided as a DataFrameDataset object with a datetime index. +- Requires that `dataset.y_pred(model)` returns the predicted values for the model. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd new file mode 100644 index 000000000..a8a8ef972 --- /dev/null +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -0,0 +1,53 @@ +--- +title: TimeSeriesR2SquareBySegments +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TimeSeriesR2SquareBySegments + +Evaluates the R-Squared values of regression models over specified time segments in time series data to assess +segment-wise model performance. + +###### Purpose + +The TimeSeriesR2SquareBySegments test aims to evaluate the R-Squared values for several regression models across +different segments of time series data. This helps in determining how well the models explain the variability in +the data within each specific time segment. + +###### Test Mechanism +- Provides a visual representation of model performance across different time segments. +- Allows for identification of segments where the model performs poorly. +- Calculating the R-Squared values for each segment. +- Generating a bar chart to visually represent the R-Squared values across different models and segments. + +###### Signs of High Risk + +- Significantly low R-Squared values for certain time segments, indicating poor model performance in those periods. +- Large variability in R-Squared values across different segments for the same model, suggesting inconsistent +performance. + +###### Strengths + +- Provides a visual representation of how well models perform over different time periods. +- Helps identify time segments where models may need improvement or retraining. +- Facilitates comparison between multiple models in a straightforward manner. + +###### Limitations + +- Assumes datasets are provided as DataFrameDataset objects with the attributes `y`, `y_pred`, and +`feature_columns`. +- Requires that `dataset.y_pred(model)` returns predicted values for the model. +- Assumes that both `y_true` and `y_pred` are pandas Series with datetime indices, which may not always be the case. +- May not account for more nuanced temporal dependencies within the segments. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd new file mode 100644 index 000000000..84b0ee095 --- /dev/null +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -0,0 +1,54 @@ +--- +title: TokenDisparity +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TokenDisparity + +Evaluates the token disparity between reference and generated texts, visualizing the results through histograms and +bar charts, alongside compiling a comprehensive table of descriptive statistics for token counts. + +###### Purpose + +The Token Disparity test aims to assess the difference in the number of tokens between reference texts and texts +generated by the model. Understanding token disparity is essential for evaluating how well the generated content +matches the expected length and richness of the reference texts. + +###### Test Mechanism + +The test extracts true and predicted values from the dataset and model. It computes the number of tokens in each +reference and generated text. The results are visualized using histograms and bar charts to display the +distribution of token counts. Additionally, a table of descriptive statistics, including the mean, median, standard +deviation, minimum, and maximum token counts, is compiled to provide a detailed summary of token usage. + +###### Signs of High Risk + +- Significant disparity in token counts between reference and generated texts could indicate issues with text +generation quality, such as verbosity or lack of detail. +- Consistently low token counts in generated texts compared to references might suggest that the model is producing +incomplete or overly concise outputs. + +###### Strengths + +- Provides a simple yet effective evaluation of text length and token usage. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of +token counts. +- Descriptive statistics offer a concise summary of the model's performance in generating texts of appropriate +length. + +###### Limitations + +- Token counts alone do not provide a complete assessment of text quality and should be supplemented with other +metrics and qualitative analysis. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd new file mode 100644 index 000000000..1dbcd08b7 --- /dev/null +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -0,0 +1,54 @@ +--- +title: ToxicityScore +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ToxicityScore + +Assesses the toxicity levels of texts generated by NLP models to identify and mitigate harmful or offensive content. + +###### Purpose + +The ToxicityScore metric is designed to evaluate the toxicity levels of texts generated by models. This is crucial +for identifying and mitigating harmful or offensive content in machine-generated texts. + +###### Test Mechanism + +The function starts by extracting the input, true, and predicted values from the provided dataset and model. The +toxicity score is computed for each text using a preloaded `toxicity` evaluation tool. The scores are compiled into +dataframes, and histograms and bar charts are generated to visualize the distribution of toxicity scores. +Additionally, a table of descriptive statistics (mean, median, standard deviation, minimum, and maximum) is +compiled for the toxicity scores, providing a comprehensive summary of the model's performance. + +###### Signs of High Risk + +- Drastic spikes in toxicity scores indicate potentially toxic content within the associated text segment. +- Persistent high toxicity scores across multiple texts may suggest systemic issues in the model's text generation +process. + +###### Strengths + +- Provides a clear evaluation of toxicity levels in generated texts, helping to ensure content safety and +appropriateness. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of +toxicity scores. +- Descriptive statistics offer a concise summary of the model's performance in generating non-toxic texts. + +###### Limitations + +- The accuracy of the toxicity scores is contingent upon the underlying `toxicity` tool. +- The scores provide a broad overview but do not specify which portions or tokens of the text are responsible for +high toxicity. +- Supplementary, in-depth analysis might be needed for granular insights. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn.qmd b/docs/validmind/tests/model_validation/sklearn.qmd new file mode 100644 index 000000000..1ef978947 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn.qmd @@ -0,0 +1,47 @@ +--- +title: sklearn +toc-depth: 3 +toc-expand: 3 +--- + + + + + +- [AdjustedMutualInformation](sklearn/AdjustedMutualInformation.qmd) +- [AdjustedRandIndex](sklearn/AdjustedRandIndex.qmd) +- [CalibrationCurve](sklearn/CalibrationCurve.qmd) +- [ClassifierPerformance](sklearn/ClassifierPerformance.qmd) +- [ClassifierThresholdOptimization](sklearn/ClassifierThresholdOptimization.qmd) +- [ClusterCosineSimilarity](sklearn/ClusterCosineSimilarity.qmd) +- [ClusterPerformanceMetrics](sklearn/ClusterPerformanceMetrics.qmd) +- [CompletenessScore](sklearn/CompletenessScore.qmd) +- [ConfusionMatrix](sklearn/ConfusionMatrix.qmd) +- [FeatureImportance](sklearn/FeatureImportance.qmd) +- [FowlkesMallowsScore](sklearn/FowlkesMallowsScore.qmd) +- [HomogeneityScore](sklearn/HomogeneityScore.qmd) +- [HyperParametersTuning](sklearn/HyperParametersTuning.qmd) +- [KMeansClustersOptimization](sklearn/KMeansClustersOptimization.qmd) +- [MinimumAccuracy](sklearn/MinimumAccuracy.qmd) +- [MinimumF1Score](sklearn/MinimumF1Score.qmd) +- [MinimumROCAUCScore](sklearn/MinimumROCAUCScore.qmd) +- [ModelParameters](sklearn/ModelParameters.qmd) +- [ModelsPerformanceComparison](sklearn/ModelsPerformanceComparison.qmd) +- [OverfitDiagnosis](sklearn/OverfitDiagnosis.qmd) +- [PermutationFeatureImportance](sklearn/PermutationFeatureImportance.qmd) +- [PopulationStabilityIndex](sklearn/PopulationStabilityIndex.qmd) +- [PrecisionRecallCurve](sklearn/PrecisionRecallCurve.qmd) +- [RegressionErrors](sklearn/RegressionErrors.qmd) +- [RegressionErrorsComparison](sklearn/RegressionErrorsComparison.qmd) +- [RegressionPerformance](sklearn/RegressionPerformance.qmd) +- [RegressionR2Square](sklearn/RegressionR2Square.qmd) +- [RegressionR2SquareComparison](sklearn/RegressionR2SquareComparison.qmd) +- [RobustnessDiagnosis](sklearn/RobustnessDiagnosis.qmd) +- [ROCCurve](sklearn/ROCCurve.qmd) +- [ScoreProbabilityAlignment](sklearn/ScoreProbabilityAlignment.qmd) +- [SHAPGlobalImportance](sklearn/SHAPGlobalImportance.qmd) +- [SilhouettePlot](sklearn/SilhouettePlot.qmd) +- [TrainingTestDegradation](sklearn/TrainingTestDegradation.qmd) +- [VMeasure](sklearn/VMeasure.qmd) +- [WeakspotsDiagnosis](sklearn/WeakspotsDiagnosis.qmd) + diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd new file mode 100644 index 000000000..0b5acb6d3 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -0,0 +1,58 @@ +--- +title: AdjustedMutualInformation +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### AdjustedMutualInformation + +Evaluates clustering model performance by measuring mutual information between true and predicted labels, adjusting +for chance. + +###### Purpose + +The purpose of this metric (Adjusted Mutual Information) is to evaluate the performance of a machine learning +model, more specifically, a clustering model. It measures the mutual information between the true labels and the +ones predicted by the model, adjusting for chance. + +###### Test Mechanism + +The Adjusted Mutual Information (AMI) uses sklearn's `adjusted_mutual_info_score` function. This function +calculates the mutual information between the true labels and the ones predicted while correcting for the chance +correlation expected due to random label assignments. This test requires the model, the training dataset, and the +test dataset as inputs. + +###### Signs of High Risk + +- Low Adjusted Mutual Information Score**: This score ranges between 0 and 1. A low score (closer to 0) can indicate +poor model performance as the predicted labels do not align well with the true labels. +- In case of high-dimensional data, if the algorithm shows high scores, this could also be a potential risk as AMI +may not perform reliably. + +###### Strengths + +- The AMI metric takes into account the randomness of the predicted labels, which makes it more robust than the +simple Mutual Information. +- The scale of AMI is not dependent on the sizes of the clustering, allowing for comparability between different +datasets or models. +- Good for comparing the output of clustering algorithms where the number of clusters is not known a priori. + +###### Limitations + +- Adjusted Mutual Information does not take into account the continuous nature of some data. As a result, it may +not be the best choice for regression or other continuous types of tasks. +- AMI has the drawback of being biased towards clusterings with a higher number of clusters. +- In comparison to other metrics, AMI can be slower to compute. +- The interpretability of the score can be complex as it depends on the understanding of information theory +concepts. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd new file mode 100644 index 000000000..b56aa735b --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -0,0 +1,55 @@ +--- +title: AdjustedRandIndex +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### AdjustedRandIndex + +Measures the similarity between two data clusters using the Adjusted Rand Index (ARI) metric in clustering machine +learning models. + +###### Purpose + +The Adjusted Rand Index (ARI) metric is intended to measure the similarity between two data clusters. This metric +is specifically used for clustering machine learning models to quantify how well the model is clustering and +producing data groups. It involves comparing the model's produced clusters against the actual (true) clusters found +in the dataset. + +###### Test Mechanism + +The Adjusted Rand Index (ARI) is calculated using the `adjusted_rand_score` method from the `sklearn.metrics` +module in Python. The test requires inputs including the model itself and the model's training and test datasets. +The model's computed clusters and the true clusters are compared, and the similarities are measured to compute the +ARI. + +###### Signs of High Risk + +- If the ARI is close to zero, it signifies that the model's cluster assignments are random and do not match the +actual dataset clusters, indicating a high risk. +- An ARI of less than zero indicates that the model's clustering performance is worse than random. + +###### Strengths + +- ARI is normalized and provides a consistent metric between -1 and +1, irrespective of raw cluster sizes or +dataset size variations. +- It does not require a ground truth for computation, making it ideal for unsupervised learning model evaluations. +- It penalizes for false positives and false negatives, providing a robust measure of clustering quality. + +###### Limitations + +- In real-world situations, true clustering is often unknown, which can hinder the practical application of the ARI. +- The ARI requires all individual data instances to be independent, which may not always hold true. +- It may be difficult to interpret the implications of an ARI score without context or a benchmark, as it is +heavily dependent on the characteristics of the dataset used. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd new file mode 100644 index 000000000..10274f9fb --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -0,0 +1,70 @@ +--- +title: CalibrationCurve +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### CalibrationCurve + +Evaluates the calibration of probability estimates by comparing predicted probabilities against observed +frequencies. + +###### Purpose + +The Calibration Curve test assesses how well a model's predicted probabilities align with actual +observed frequencies. This is crucial for applications requiring accurate probability estimates, +such as risk assessment, decision-making systems, and cost-sensitive applications where probability +calibration directly impacts business decisions. + +###### Test Mechanism + +The test uses sklearn's calibration_curve function to: +1. Sort predictions into bins based on predicted probabilities +2. Calculate the mean predicted probability in each bin +3. Compare against the observed frequency of positive cases +4. Plot the results against the perfect calibration line (y=x) +The resulting curve shows how well the predicted probabilities match empirical probabilities. + +###### Signs of High Risk + +- Significant deviation from the perfect calibration line +- Systematic overconfidence (predictions too close to 0 or 1) +- Systematic underconfidence (predictions clustered around 0.5) +- Empty or sparse bins indicating poor probability coverage +- Sharp discontinuities in the calibration curve +- Different calibration patterns across different probability ranges +- Consistent over/under estimation in critical probability regions +- Large confidence intervals in certain probability ranges + +###### Strengths + +- Visual and intuitive interpretation of probability quality +- Identifies systematic biases in probability estimates +- Supports probability threshold selection +- Helps understand model confidence patterns +- Applicable across different classification models +- Enables comparison between different models +- Guides potential need for recalibration +- Critical for risk-sensitive applications + +###### Limitations + +- Sensitive to the number of bins chosen +- Requires sufficient samples in each bin for reliable estimates +- May mask local calibration issues within bins +- Does not account for feature-dependent calibration issues +- Limited to binary classification problems +- Cannot detect all forms of miscalibration +- Assumes bin boundaries are appropriate for the problem +- May be affected by class imbalance + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd new file mode 100644 index 000000000..b25b3fb1a --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -0,0 +1,57 @@ +--- +title: ClassifierPerformance +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ClassifierPerformance + +Evaluates performance of binary or multiclass classification models using precision, recall, F1-Score, accuracy, +and ROC AUC scores. + +###### Purpose + +The Classifier Performance test is designed to evaluate the performance of Machine Learning classification models. +It accomplishes this by computing precision, recall, F1-Score, and accuracy, as well as the ROC AUC (Receiver +operating characteristic - Area under the curve) scores, thereby providing a comprehensive analytic view of the +models' performance. The test is adaptable, handling binary and multiclass models equally effectively. + +###### Test Mechanism + +The test produces a report that includes precision, recall, F1-Score, and accuracy, by leveraging the +`classification_report` from scikit-learn's metrics module. For multiclass models, macro and weighted averages for +these scores are also calculated. Additionally, the ROC AUC scores are calculated and included in the report using +the `multiclass_roc_auc_score` function. The outcome of the test (report format) differs based on whether the model +is binary or multiclass. + +###### Signs of High Risk + +- Low values for precision, recall, F1-Score, accuracy, and ROC AUC, indicating poor performance. +- Imbalance in precision and recall scores. +- A low ROC AUC score, especially scores close to 0.5 or lower, suggesting a failing model. + +###### Strengths + +- Versatile, capable of assessing both binary and multiclass models. +- Utilizes a variety of commonly employed performance metrics, offering a comprehensive view of model performance. +- The use of ROC-AUC as a metric is beneficial for evaluating unbalanced datasets. + +###### Limitations + +- Assumes correctly identified labels for binary classification models. +- Specifically designed for classification models and not suitable for regression models. +- May provide limited insights if the test dataset does not represent real-world scenarios adequately. + + + + + +#### multiclass_roc_auc_score + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd new file mode 100644 index 000000000..7cfe20b19 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -0,0 +1,101 @@ +--- +title: ClassifierThresholdOptimization +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ClassifierThresholdOptimization + +Analyzes and visualizes different threshold optimization methods for binary classification models. + +###### Purpose + +The Classifier Threshold Optimization test identifies optimal decision thresholds using various +methods to balance different performance metrics. This helps adapt the model's decision boundary +to specific business requirements, such as minimizing false positives in fraud detection or +achieving target recall in medical diagnosis. + +###### Test Mechanism + +The test implements multiple threshold optimization methods: +1. Youden's J statistic (maximizing sensitivity + specificity - 1) +2. F1-score optimization (balancing precision and recall) +3. Precision-Recall equality point +4. Target recall achievement +5. Naive (0.5) threshold +For each method, it computes ROC and PR curves, identifies optimal points, and provides +comprehensive performance metrics at each threshold. + +###### Signs of High Risk + +- Large discrepancies between different optimization methods +- Optimal thresholds far from the default 0.5 +- Poor performance metrics across all thresholds +- Significant gap between achieved and target recall +- Unstable thresholds across different methods +- Extreme trade-offs between precision and recall +- Threshold optimization showing minimal impact +- Business metrics not improving with optimization + +###### Strengths + +- Multiple optimization strategies for different needs +- Visual and numerical results for comparison +- Support for business-driven optimization (target recall) +- Comprehensive performance metrics at each threshold +- Integration with ROC and PR curves +- Handles class imbalance through various metrics +- Enables informed threshold selection +- Supports cost-sensitive decision making + +###### Limitations + +- Assumes cost of false positives/negatives are known +- May need adjustment for highly imbalanced datasets +- Threshold might not be stable across different samples +- Cannot handle multi-class problems directly +- Optimization methods may conflict with business needs +- Requires sufficient validation data +- May not capture temporal changes in optimal threshold +- Single threshold may not be optimal for all subgroups + +**Arguments** + +- **dataset****: VMDataset containing features and target +- **model**: VMModel containing predictions +- **methods**: List of methods to compare (default: ['youden', 'f1', 'precision_recall']) +- **target_recall**: Target recall value if using 'target_recall' method + +**Returns** + +- **Dictionary containing**: - table: DataFrame comparing different threshold optimization methods (using weighted averages for precision, recall, and f1) - figure: Plotly figure showing ROC and PR curves with optimal thresholds + + + + + +#### find_optimal_threshold + +Find the optimal classification threshold using various methods. + +**Arguments** + +- **y_true****: True binary labels +- **y_prob**: Predicted probabilities +- **method**: Method to use for finding optimal threshold +- **target_recall**: Required if method='target_recall' + +**Returns** + +- **dict**: Dictionary containing threshold and metrics + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd new file mode 100644 index 000000000..d0b7fbb10 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -0,0 +1,60 @@ +--- +title: ClusterCosineSimilarity +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ClusterCosineSimilarity + +Measures the intra-cluster similarity of a clustering model using cosine similarity. + +###### Purpose + +The purpose of this metric is to measure how similar the data points within each cluster of a clustering model are. +This is done using cosine similarity, which compares the multi-dimensional direction (but not magnitude) of data +vectors. From a Model Risk Management perspective, this metric is used to quantitatively validate that clusters +formed by a model have high intra-cluster similarity. + +###### Test Mechanism + +This test works by first extracting the true and predicted clusters of the model's training data. Then, it computes +the centroid (average data point) of each cluster. Next, it calculates the cosine similarity between each data +point within a cluster and its respective centroid. Finally, it outputs the mean cosine similarity of each cluster, +highlighting how similar, on average, data points in a cluster are to the cluster's centroid. + +###### Signs of High Risk + +- Low mean cosine similarity for one or more clusters**: If the mean cosine similarity is low, the data points within +the respective cluster have high variance in their directions. This can be indicative of poor clustering, +suggesting that the model might not be suitably separating the data into distinct patterns. +- High disparity between mean cosine similarity values across clusters: If there's a significant difference in mean +cosine similarity across different clusters, this could indicate imbalance in how the model forms clusters. + +###### Strengths + +- Cosine similarity operates in a multi-dimensional space, making it effective for measuring similarity in high +dimensional datasets, typical for many machine learning problems. +- It provides an agnostic view of the cluster performance by only considering the direction (and not the magnitude) +of each vector. +- This metric is not dependent on the scale of the variables, making it equally effective on different scales. + +###### Limitations + +- Cosine similarity does not consider magnitudes (i.e. lengths) of vectors, only their direction. This means it may +overlook instances where clusters have been adequately separated in terms of magnitude. +- This method summarily assumes that centroids represent the average behavior of data points in each cluster. This +might not always be true, especially in clusters with high amounts of variance or non-spherical shapes. +- It primarily works with continuous variables and is not suitable for binary or categorical variables. +- Lastly, although rare, perfect perpendicular vectors (cosine similarity = 0) could be within the same cluster, +which may give an inaccurate representation of a 'bad' cluster due to low cosine similarity score. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd new file mode 100644 index 000000000..ca9ff1f44 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -0,0 +1,62 @@ +--- +title: ClusterPerformanceMetrics +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ClusterPerformanceMetrics + +Evaluates the performance of clustering machine learning models using multiple established metrics. + +###### Purpose + +The `ClusterPerformanceMetrics` test is used to assess the performance and validity of clustering machine learning +models. It evaluates homogeneity, completeness, V measure score, the Adjusted Rand Index, the Adjusted Mutual +Information, and the Fowlkes-Mallows score of the model. These metrics provide a holistic understanding of the +model's ability to accurately form clusters of the given dataset. + +###### Test Mechanism + +The `ClusterPerformanceMetrics` test runs a clustering ML model over a given dataset and then calculates six +metrics using the Scikit-learn metrics computation functions**: Homogeneity Score, Completeness Score, V Measure, +Adjusted Rand Index (ARI), Adjusted Mutual Information (AMI), and Fowlkes-Mallows Score. It then returns the result +as a summary, presenting the metric values for both training and testing datasets. + +###### Signs of High Risk + +- Low Homogeneity Score: Indicates that the clusters formed contain a variety of classes, resulting in less pure +clusters. +- Low Completeness Score: Suggests that class instances are scattered across multiple clusters rather than being +gathered in a single cluster. +- Low V Measure: Reports a low overall clustering performance. +- ARI close to 0 or Negative: Implies that clustering results are random or disagree with the true labels. +- AMI close to 0: Means that clustering labels are random compared with the true labels. +- Low Fowlkes-Mallows score: Signifies less precise and poor clustering performance in terms of precision and +recall. + +###### Strengths + +- Provides a comprehensive view of clustering model performance by examining multiple clustering metrics. +- Uses established and widely accepted metrics from scikit-learn, providing reliability in the results. +- Able to provide performance metrics for both training and testing datasets. +- Clearly defined and human-readable descriptions of each score make it easy to understand what each score +represents. + +###### Limitations + +- Only applies to clustering models; not suitable for other types of machine learning models. +- Does not test for overfitting or underfitting in the clustering model. +- All the scores rely on ground truth labels, the absence or inaccuracy of which can lead to misleading results. +- Does not consider aspects like computational efficiency of the model or its capability to handle high dimensional +data. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd new file mode 100644 index 000000000..f55315cff --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -0,0 +1,53 @@ +--- +title: CompletenessScore +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### CompletenessScore + +Evaluates a clustering model's capacity to categorize instances from a single class into the same cluster. + +###### Purpose + +The Completeness Score metric is used to assess the performance of clustering models. It measures the extent to +which all the data points that are members of a given class are elements of the same cluster. The aim is to +determine the capability of the model to categorize all instances from a single class into the same cluster. + +###### Test Mechanism + +This test takes three inputs, a model and its associated training and testing datasets. It invokes the +`completeness_score` function from the sklearn library on the labels predicted by the model. High scores indicate +that data points from the same class generally appear in the same cluster, while low scores suggest the opposite. + +###### Signs of High Risk + +- Low completeness score**: This suggests that the model struggles to group instances from the same class into one +cluster, indicating poor clustering performance. + +###### Strengths + +- The Completeness Score provides an effective method for assessing the performance of a clustering model, +specifically its ability to group class instances together. +- This test metric conveniently relies on the capabilities provided by the sklearn library, ensuring consistent and +reliable test results. + +###### Limitations + +- This metric only evaluates a specific aspect of clustering, meaning it may not provide a holistic or complete +view of the model's performance. +- It cannot assess the effectiveness of the model in differentiating between separate classes, as it is solely +focused on how well data points from the same class are grouped. +- The Completeness Score only applies to clustering models; it cannot be used for other types of machine learning +models. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd new file mode 100644 index 000000000..f952c3baa --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -0,0 +1,63 @@ +--- +title: ConfusionMatrix +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ConfusionMatrix + +Evaluates and visually represents the classification ML model's predictive performance using a Confusion Matrix +heatmap. + +###### Purpose + +The Confusion Matrix tester is designed to assess the performance of a classification Machine Learning model. This +performance is evaluated based on how well the model is able to correctly classify True Positives, True Negatives, +False Positives, and False Negatives - fundamental aspects of model accuracy. + +###### Test Mechanism + +The mechanism used involves taking the predicted results (`y_test_predict`) from the classification model and +comparing them against the actual values (`y_test_true`). A confusion matrix is built using the unique labels +extracted from `y_test_true`, employing scikit-learn's metrics. The matrix is then visually rendered with the help +of Plotly's `create_annotated_heatmap` function. A heatmap is created which provides a two-dimensional graphical +representation of the model's performance, showcasing distributions of True Positives (TP), True Negatives (TN), +False Positives (FP), and False Negatives (FN). + +###### Signs of High Risk + +- High numbers of False Positives (FP) and False Negatives (FN), depicting that the model is not effectively +classifying the values. +- Low numbers of True Positives (TP) and True Negatives (TN), implying that the model is struggling with correctly +identifying class labels. + +###### Strengths + +- It provides a simplified yet comprehensive visual snapshot of the classification model's predictive performance. +- It distinctly brings out True Positives (TP), True Negatives (TN), False Positives (FP), and False Negatives +(FN), thus making it easier to focus on potential areas of improvement. +- The matrix is beneficial in dealing with multi-class classification problems as it can provide a simple view of +complex model performances. +- It aids in understanding the different types of errors that the model could potentially make, as it provides +in-depth insights into Type-I and Type-II errors. + +###### Limitations + +- In cases of unbalanced classes, the effectiveness of the confusion matrix might be lessened. It may wrongly +interpret the accuracy of a model that is essentially just predicting the majority class. +- It does not provide a single unified statistic that could evaluate the overall performance of the model. +Different aspects of the model's performance are evaluated separately instead. +- It mainly serves as a descriptive tool and does not offer the capability for statistical hypothesis testing. +- Risks of misinterpretation exist because the matrix doesn't directly provide precision, recall, or F1-score data. +These metrics have to be computed separately. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd new file mode 100644 index 000000000..10aacc158 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -0,0 +1,57 @@ +--- +title: FeatureImportance +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### FeatureImportance + +Compute feature importance scores for a given model and generate a summary table +with the top important features. + +###### Purpose + +The Feature Importance Comparison test is designed to compare the feature importance scores for different models +when applied to various datasets. By doing so, it aims to identify the most impactful features and assess the +consistency of feature importance across models. + +###### Test Mechanism + +This test works by iterating through each dataset-model pair and calculating permutation feature importance (PFI) +scores. It then generates a summary table containing the top `num_features` important features for each model. The +process involves: + +- Extracting features and target data from each dataset. +- Computing PFI scores using `sklearn.inspection.permutation_importance`. +- Sorting and selecting the top features based on their importance scores. +- Compiling these features into a summary table for comparison. + +###### Signs of High Risk + +- Key features expected to be important are ranked low, indicating potential issues with model training or data +quality. +- High variance in feature importance scores across different models, suggesting instability in feature selection. + +###### Strengths + +- Provides a clear comparison of the most important features for each model. +- Uses permutation importance, which is a model-agnostic method and can be applied to any estimator. + +###### Limitations + +- Assumes that the dataset is provided as a DataFrameDataset object with `x_df` and `y_df` methods to access +feature and target data. +- Requires that `model.model` is compatible with `sklearn.inspection.permutation_importance`. +- The function's output is dependent on the number of features specified by `num_features`, which defaults to 3 but +can be adjusted. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd new file mode 100644 index 000000000..90bf896e5 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -0,0 +1,58 @@ +--- +title: FowlkesMallowsScore +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### FowlkesMallowsScore + +Evaluates the similarity between predicted and actual cluster assignments in a model using the Fowlkes-Mallows +score. + +###### Purpose + +The FowlkesMallowsScore is a performance metric used to validate clustering algorithms within machine learning +models. The score intends to evaluate the matching grade between two clusters. It measures the similarity between +the predicted and actual cluster assignments, thus gauging the accuracy of the model's clustering capability. + +###### Test Mechanism + +The FowlkesMallowsScore method applies the `fowlkes_mallows_score` function from the `sklearn` library to evaluate +the model's accuracy in clustering different types of data. The test fetches the datasets from the model's training +and testing datasets as inputs then compares the resulting clusters against the previously known clusters to obtain +a score. A high score indicates a better clustering performance by the model. + +###### Signs of High Risk + +- A low Fowlkes-Mallows score (near zero)**: This indicates that the model's clustering capability is poor and the +algorithm isn't properly grouping data. +- Inconsistently low scores across different datasets: This may indicate that the model's clustering performance is +not robust and the model may fail when applied to unseen data. + +###### Strengths + +- The Fowlkes-Mallows score is a simple and effective method for evaluating the performance of clustering +algorithms. +- This metric takes into account both precision and recall in its calculation, therefore providing a balanced and +comprehensive measure of model performance. +- The Fowlkes-Mallows score is non-biased meaning it treats False Positives and False Negatives equally. + +###### Limitations + +- As a pairwise-based method, this score can be computationally intensive for large datasets and can become +unfeasible as the size of the dataset increases. +- The Fowlkes-Mallows score works best with balanced distribution of samples across clusters. If this condition is +not met, the score can be skewed. +- It does not handle mismatching numbers of clusters between the true and predicted labels. As such, it may return +misleading results if the predicted labels suggest a different number of clusters than what is in the true labels. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd new file mode 100644 index 000000000..0902c8b8c --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -0,0 +1,56 @@ +--- +title: HomogeneityScore +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### HomogeneityScore + +Assesses clustering homogeneity by comparing true and predicted labels, scoring from 0 (heterogeneous) to 1 +(homogeneous). + +###### Purpose + +The Homogeneity Score encapsulated in this performance test is used to measure the homogeneity of the clusters +formed by a machine learning model. In simple terms, a clustering result satisfies homogeneity if all of its +clusters contain only points which are members of a single class. + +###### Test Mechanism + +This test uses the `homogeneity_score` function from the `sklearn.metrics` library to compare the ground truth +class labels of the training and testing sets with the labels predicted by the given model. The returned score is a +metric of the clustering accuracy, and ranges from 0.0 to 1.0, with 1.0 denoting the highest possible degree of +homogeneity. + +###### Signs of High Risk + +- A score close to 0**: This denotes that clusters are highly heterogenous and points within the same cluster might +not belong to the same class. +- A significantly lower score for testing data compared to the score for training data: This can indicate +overfitting, where the model has learned to perfectly match the training data but fails to perform well on unseen +data. + +###### Strengths + +- It provides a simple quantitative measure of the degree to which clusters contain points from only one class. +- Useful for validating clustering solutions where the ground truth — class membership of points — is known. +- It's agnostic to the absolute labels, and cares only that the points within the same cluster have the same class +label. + +###### Limitations + +- The Homogeneity Score is not useful for clustering solutions where the ground truth labels are not known. +- It doesn’t work well with differently sized clusters since it gives predominance to larger clusters. +- The score does not address the actual number of clusters formed, or the evenness of cluster sizes. It only checks +the homogeneity within the given clusters created by the model. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd new file mode 100644 index 000000000..d0e3e2709 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -0,0 +1,71 @@ +--- +title: HyperParametersTuning +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### custom_recall + + +#### HyperParametersTuning + +Performs exhaustive grid search over specified parameter ranges to find optimal model configurations +across different metrics and decision thresholds. + +###### Purpose + +The Hyperparameter Tuning test systematically explores the model's parameter space to identify optimal +configurations. It supports multiple optimization metrics and decision thresholds, providing a comprehensive +view of how different parameter combinations affect various aspects of model performance. + +###### Test Mechanism + +The test uses scikit-learn's GridSearchCV to perform cross-validation for each parameter combination. +For each specified threshold and optimization metric, it creates a scoring dictionary with +threshold-adjusted metrics, performs grid search with cross-validation, records best parameters and +corresponding scores, and combines results into a comparative table. This process is repeated for each +optimization metric to provide a comprehensive view of model performance under different configurations. + +###### Signs of High Risk + +- Large performance variations across different parameter combinations +- Significant discrepancies between different optimization metrics +- Best parameters at the edges of the parameter grid +- Unstable performance across different thresholds +- Overly complex model configurations (risk of overfitting) +- Very different optimal parameters for different metrics +- Cross-validation scores showing high variance +- Extreme parameter values in best configurations + +###### Strengths + +- Comprehensive exploration of parameter space +- Supports multiple optimization metrics +- Allows threshold optimization +- Provides comparative view across different configurations +- Uses cross-validation for robust evaluation +- Helps understand trade-offs between different metrics +- Enables systematic parameter selection +- Supports both classification and clustering tasks + +###### Limitations + +- Computationally expensive for large parameter grids +- May not find global optimum (limited to grid points) +- Cannot handle dependencies between parameters +- Memory intensive for large datasets +- Limited to scikit-learn compatible models +- Cross-validation splits may not preserve time series structure +- Grid search may miss optimal values between grid points +- Resource intensive for high-dimensional parameter spaces + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd new file mode 100644 index 000000000..6405c76fe --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -0,0 +1,63 @@ +--- +title: KMeansClustersOptimization +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### KMeansClustersOptimization + +Optimizes the number of clusters in K-means models using Elbow and Silhouette methods. + +###### Purpose + +This metric is used to optimize the number of clusters used in K-means clustering models. It intends to measure and +evaluate the optimal number of clusters by leveraging two methodologies, namely the Elbow method and the Silhouette +method. This is crucial as an inappropriate number of clusters can either overly simplify or overcomplicate the +structure of the data, thereby undermining the effectiveness of the model. + +###### Test Mechanism + +The test mechanism involves iterating over a predefined range of cluster numbers and applying both the Elbow method +and the Silhouette method. The Elbow method computes the sum of the minimum euclidean distances between data points +and their respective cluster centers (distortion). This value decreases as the number of clusters increases; the +optimal number is typically at the 'elbow' point where the decrease in distortion becomes less pronounced. +Meanwhile, the Silhouette method calculates the average silhouette score for each data point in the dataset, +providing a measure of how similar each item is to its own cluster compared to other clusters. The optimal number +of clusters under this method is the one that maximizes the average silhouette score. The results of both methods +are plotted for visual inspection. + +###### Signs of High Risk + +- A high distortion value or a low silhouette average score for the optimal number of clusters. +- No clear 'elbow' point or plateau observed in the distortion plot, or a uniformly low silhouette average score +across different numbers of clusters, suggesting the data is not amenable to clustering. +- An optimal cluster number that is unreasonably high or low, suggestive of overfitting or underfitting, +respectively. + +###### Strengths + +- Provides both a visual and quantitative method to determine the optimal number of clusters. +- Leverages two different methods (Elbow and Silhouette), thereby affording robustness and versatility in assessing +the data's clusterability. +- Facilitates improved model performance by allowing for an informed selection of the number of clusters. + +###### Limitations + +- Assumes that a suitable number of clusters exists in the data, which may not always be true, especially for +complex or noisy data. +- Both methods may fail to provide definitive answers when the data lacks clear cluster structures. +- Might not be straightforward to determine the 'elbow' point or maximize the silhouette average score, especially +in larger and complicated datasets. +- Assumes spherical clusters (due to using the Euclidean distance in the Elbow method), which might not align with +the actual structure of the data. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd new file mode 100644 index 000000000..db875c8ea --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -0,0 +1,53 @@ +--- +title: MinimumAccuracy +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### MinimumAccuracy + +Checks if the model's prediction accuracy meets or surpasses a specified threshold. + +###### Purpose + +The Minimum Accuracy test’s objective is to verify whether the model's prediction accuracy on a specific dataset +meets or surpasses a predetermined minimum threshold. Accuracy, which is simply the ratio of correct predictions to +total predictions, is a key metric for evaluating the model's performance. Considering binary as well as multiclass +classifications, accurate labeling becomes indispensable. + +###### Test Mechanism + +The test mechanism involves contrasting the model's accuracy score with a preset minimum threshold value, with the +default being 0.7. The accuracy score is computed utilizing sklearn’s `accuracy_score` method, where the true +labels `y_true` and predicted labels `class_pred` are compared. If the accuracy score is above the threshold, the +test receives a passing mark. The test returns the result along with the accuracy score and threshold used for the +test. + +###### Signs of High Risk + +- Model fails to achieve or surpass the predefined score threshold. +- Persistent scores below the threshold, indicating a high risk of inaccurate predictions. + +###### Strengths + +- Simplicity, presenting a straightforward measure of holistic model performance across all classes. +- Particularly advantageous when classes are balanced. +- Versatile, as it can be implemented on both binary and multiclass classification tasks. + +###### Limitations + +- Misleading accuracy scores when classes in the dataset are highly imbalanced. +- Favoritism towards the majority class, giving an inaccurate perception of model performance. +- Inability to measure the model's precision, recall, or capacity to manage false positives or false negatives. +- Focused on overall correctness and may not be sufficient for all types of model analytics. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd new file mode 100644 index 000000000..f18b1b9b8 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -0,0 +1,55 @@ +--- +title: MinimumF1Score +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### MinimumF1Score + +Assesses if the model's F1 score on the validation set meets a predefined minimum threshold, ensuring balanced +performance between precision and recall. + +###### Purpose + +The main objective of this test is to ensure that the F1 score, a balanced measure of precision and recall, of the +model meets or surpasses a predefined threshold on the validation dataset. The F1 score is highly useful for +gauging model performance in classification tasks, especially in cases where the distribution of positive and +negative classes is skewed. + +###### Test Mechanism + +The F1 score for the validation dataset is computed through scikit-learn's metrics in Python. The scoring mechanism +differs based on the classification problem**: for multi-class problems, macro averaging is used, and for binary +classification, the built-in `f1_score` calculation is used. The obtained F1 score is then assessed against the +predefined minimum F1 score that is expected from the model. + +###### Signs of High Risk + +- If a model returns an F1 score that is less than the established threshold, it is regarded as high risk. +- A low F1 score might suggest that the model is not finding an optimal balance between precision and recall, +failing to effectively identify positive classes while minimizing false positives. + +###### Strengths + +- Provides a balanced measure of a model's performance by accounting for both false positives and false negatives. +- Particularly advantageous in scenarios with imbalanced class distribution, where accuracy can be misleading. +- Flexibility in setting the threshold value allows tailored minimum acceptable performance standards. + +###### Limitations + +- May not be suitable for all types of models and machine learning tasks. +- The F1 score assumes an equal cost for false positives and false negatives, which may not be true in some +real-world scenarios. +- Practitioners might need to rely on other metrics such as precision, recall, or the ROC-AUC score that align more +closely with specific requirements. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd new file mode 100644 index 000000000..ef03d10c0 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -0,0 +1,58 @@ +--- +title: MinimumROCAUCScore +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### MinimumROCAUCScore + +Validates model by checking if the ROC AUC score meets or surpasses a specified threshold. + +###### Purpose + +The Minimum ROC AUC Score test is used to determine the model's performance by ensuring that the Receiver Operating +Characteristic Area Under the Curve (ROC AUC) score on the validation dataset meets or exceeds a predefined +threshold. The ROC AUC score indicates how well the model can distinguish between different classes, making it a +crucial measure in binary and multiclass classification tasks. + +###### Test Mechanism + +This test implementation calculates the multiclass ROC AUC score on the true target values and the model's +predictions. The test converts the multi-class target variables into binary format using `LabelBinarizer` before +computing the score. If this ROC AUC score is higher than the predefined threshold (defaulted to 0.5), the test +passes; otherwise, it fails. The results, including the ROC AUC score, the threshold, and whether the test passed +or failed, are then stored in a `ThresholdTestResult` object. + +###### Signs of High Risk + +- A high risk or failure in the model's performance as related to this metric would be represented by a low ROC AUC +score, specifically any score lower than the predefined minimum threshold. This suggests that the model is +struggling to distinguish between different classes effectively. + +###### Strengths + +- The test considers both the true positive rate and false positive rate, providing a comprehensive performance +measure. +- ROC AUC score is threshold-independent meaning it measures the model's quality across various classification +thresholds. +- Works robustly with binary as well as multi-class classification problems. + +###### Limitations + +- ROC AUC may not be useful if the class distribution is highly imbalanced; it could perform well in terms of AUC +but still fail to predict the minority class. +- The test does not provide insight into what specific aspects of the model are causing poor performance if the ROC +AUC score is unsatisfactory. +- The use of macro average for multiclass ROC AUC score implies equal weightage to each class, which might not be +appropriate if the classes are imbalanced. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd new file mode 100644 index 000000000..9c8194b8f --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -0,0 +1,59 @@ +--- +title: ModelParameters +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ModelParameters + +Extracts and displays model parameters in a structured format for transparency and reproducibility. + +###### Purpose + +The Model Parameters test is designed to provide transparency into model configuration and ensure +reproducibility of machine learning models. It accomplishes this by extracting and presenting all +relevant parameters that define the model's behavior, making it easier to audit, validate, and +reproduce model training. + +###### Test Mechanism + +The test leverages scikit-learn's API convention of get_params() to extract model parameters. It +produces a structured DataFrame containing parameter names and their corresponding values. For models +that follow scikit-learn's API (including XGBoost, RandomForest, and other estimators), all +parameters are automatically extracted and displayed. + +###### Signs of High Risk + +- Missing crucial parameters that should be explicitly set +- Extreme parameter values that could indicate overfitting (e.g., unlimited tree depth) +- Inconsistent parameters across different versions of the same model type +- Parameter combinations known to cause instability or poor performance +- Default values used for critical parameters that should be tuned + +###### Strengths + +- Universal compatibility with scikit-learn API-compliant models +- Ensures transparency in model configuration +- Facilitates model reproducibility and version control +- Enables systematic parameter auditing +- Supports both classification and regression models +- Helps identify potential configuration issues + +###### Limitations + +- Only works with models implementing scikit-learn's get_params() method +- Cannot capture dynamic parameters set during model training +- Does not validate parameter values for model-specific appropriateness +- Parameter meanings and impacts may vary across different model types +- Cannot detect indirect parameter interactions or their effects on model performance + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd new file mode 100644 index 000000000..7e44554c6 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -0,0 +1,59 @@ +--- +title: ModelsPerformanceComparison +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ModelsPerformanceComparison + +Evaluates and compares the performance of multiple Machine Learning models using various metrics like accuracy, +precision, recall, and F1 score. + +###### Purpose + +The Models Performance Comparison test aims to evaluate and compare the performance of various Machine Learning +models using test data. It employs multiple metrics such as accuracy, precision, recall, and the F1 score, among +others, to assess model performance and assist in selecting the most effective model for the designated task. + +###### Test Mechanism + +The test employs Scikit-learn’s performance metrics to evaluate each model's performance for both binary and +multiclass classification tasks. To compare performances, the test runs each model against the test dataset, then +produces a comprehensive classification report. This report includes metrics such as accuracy, precision, recall, +and the F1 score. Based on whether the task at hand is binary or multiclass classification, it calculates metrics +for all the classes and their weighted averages, macro averages, and per-class metrics. The test will be skipped if +no models are supplied. + +###### Signs of High Risk + +- Low scores in accuracy, precision, recall, and F1 metrics indicate a potentially high risk. +- A low area under the Receiver Operating Characteristic (ROC) curve (roc_auc score) is another possible indicator +of high risk. +- If the metrics scores are significantly lower than alternative models, this might suggest a high risk of failure. + +###### Strengths + +- Provides a simple way to compare the performance of multiple models, accommodating both binary and multiclass +classification tasks. +- Offers a holistic view of model performance through a comprehensive report of key performance metrics. +- The inclusion of the ROC AUC score is advantageous, as this robust performance metric can effectively handle +class imbalance issues. + +###### Limitations + +- May not be suitable for more complex performance evaluations that consider factors such as prediction speed, +computational cost, or business-specific constraints. +- The test's reliability depends on the provided test dataset; hence, the selected models' performance could vary +with unseen data or changes in the data distribution. +- The ROC AUC score might not be as meaningful or easily interpretable for multilabel/multiclass tasks. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd new file mode 100644 index 000000000..eb72992ba --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -0,0 +1,58 @@ +--- +title: OverfitDiagnosis +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### OverfitDiagnosis + +Assesses potential overfitting in a model's predictions, identifying regions where performance between training and +testing sets deviates significantly. + +###### Purpose + +The Overfit Diagnosis test aims to identify areas in a model's predictions where there is a significant difference +in performance between the training and testing sets. This test helps to pinpoint specific regions or feature +segments where the model may be overfitting. + +###### Test Mechanism + +This test compares the model's performance on training versus test data, grouped by feature columns. It calculates +the difference between the training and test performance for each group and identifies regions where this +difference exceeds a specified threshold: + +- The test works for both classification and regression models. +- It defaults to using the AUC metric for classification models and the MSE metric for regression models. +- The threshold for identifying overfitting regions is set to 0.04 by default. +- The test calculates the performance metrics for each feature segment and plots regions where the performance gap +exceeds the threshold. + +###### Signs of High Risk + +- Significant gaps between training and test performance metrics for specific feature segments. +- Multiple regions with performance gaps exceeding the defined threshold. +- Higher than expected differences in predicted versus actual values in the test set compared to the training set. + +###### Strengths + +- Identifies specific areas where overfitting occurs. +- Supports multiple performance metrics, providing flexibility. +- Applicable to both classification and regression models. +- Visualization of overfitting segments aids in better understanding and debugging. + +###### Limitations + +- The default threshold may not be suitable for all use cases and requires tuning. +- May not capture more subtle forms of overfitting that do not exceed the threshold. +- Assumes that the binning of features adequately represents the data segments. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd new file mode 100644 index 000000000..f18ae7c05 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -0,0 +1,56 @@ +--- +title: PermutationFeatureImportance +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### PermutationFeatureImportance + +Assesses the significance of each feature in a model by evaluating the impact on model performance when feature +values are randomly rearranged. + +###### Purpose + +The Permutation Feature Importance (PFI) metric aims to assess the importance of each feature used by the Machine +Learning model. The significance is measured by evaluating the decrease in the model's performance when the +feature's values are randomly arranged. + +###### Test Mechanism + +PFI is calculated via the `permutation_importance` method from the `sklearn.inspection` module. This method +shuffles the columns of the feature dataset and measures the impact on the model's performance. A significant +decrease in performance after permutating a feature's values deems the feature as important. On the other hand, if +performance remains the same, the feature is likely not important. The output of the PFI metric is a figure +illustrating the importance of each feature. + +###### Signs of High Risk + +- The model heavily relies on a feature with highly variable or easily permutable values, indicating instability. +- A feature deemed unimportant by the model but expected to have a significant effect on the outcome based on +domain knowledge is not influencing the model's predictions. + +###### Strengths + +- Provides insights into the importance of different features and may reveal underlying data structure. +- Can indicate overfitting if a particular feature or set of features overly impacts the model's predictions. +- Model-agnostic and can be used with any classifier that provides a measure of prediction accuracy before and +after feature permutation. + +###### Limitations + +- Does not imply causality; it only presents the amount of information that a feature provides for the prediction +task. +- Does not account for interactions between features. If features are correlated, the permutation importance may +allocate importance to one and not the other. +- Cannot interact with certain libraries like statsmodels, pytorch, catboost, etc., thus limiting its applicability. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd new file mode 100644 index 000000000..1b6132648 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -0,0 +1,76 @@ +--- +title: PopulationStabilityIndex +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### calculate_psi + +Taken from: +https://towardsdatascience.com/checking-model-stability-and-population-shift-with-psi-and-csi-6d12af008783 + + + + + +#### PopulationStabilityIndex + +Assesses the Population Stability Index (PSI) to quantify the stability of an ML model's predictions across +different datasets. + +###### Purpose + +The Population Stability Index (PSI) serves as a quantitative assessment for evaluating the stability of a machine +learning model's output distributions when comparing two different datasets. Typically, these would be a +development and a validation dataset or two datasets collected at different periods. The PSI provides a measurable +indication of any significant shift in the model's performance over time or noticeable changes in the +characteristics of the population the model is making predictions for. + +###### Test Mechanism + +The implementation of the PSI in this script involves calculating the PSI for each feature between the training and +test datasets. Data from both datasets is sorted and placed into either a predetermined number of bins or +quantiles. The boundaries for these bins are initially determined based on the distribution of the training data. +The contents of each bin are calculated and their respective proportions determined. Subsequently, the PSI is +derived for each bin through a logarithmic transformation of the ratio of the proportions of data for each feature +in the training and test datasets. The PSI, along with the proportions of data in each bin for both datasets, are +displayed in a summary table, a grouped bar chart, and a scatter plot. + +###### Signs of High Risk + +- A high PSI value is a clear indicator of high risk. Such a value suggests a significant shift in the model +predictions or severe changes in the characteristics of the underlying population. +- This ultimately suggests that the model may not be performing as well as expected and that it may be less +reliable for making future predictions. + +###### Strengths + +- The PSI provides a quantitative measure of the stability of a model over time or across different samples, making +it an invaluable tool for evaluating changes in a model's performance. +- It allows for direct comparisons across different features based on the PSI value. +- The calculation and interpretation of the PSI are straightforward, facilitating its use in model risk management. +- The use of visual aids such as tables and charts further simplifies the comprehension and interpretation of the +PSI. + +###### Limitations + +- The PSI test does not account for the interdependence between features**: features that are dependent on one +another may show similar shifts in their distributions, which in turn may result in similar PSI values. +- The PSI test does not inherently provide insights into why there are differences in distributions or why the PSI +values may have changed. +- The test may not handle features with significant outliers adequately. +- Additionally, the PSI test is performed on model predictions, not on the underlying data distributions which can +lead to misinterpretations. Any changes in PSI could be due to shifts in the model (model drift), changes in the +relationships between features and the target variable (concept drift), or both. However, distinguishing between +these causes is non-trivial. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd new file mode 100644 index 000000000..84054e37c --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -0,0 +1,57 @@ +--- +title: PrecisionRecallCurve +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### PrecisionRecallCurve + +Evaluates the precision-recall trade-off for binary classification models and visualizes the Precision-Recall curve. + +###### Purpose + +The Precision Recall Curve metric is intended to evaluate the trade-off between precision and recall in +classification models, particularly binary classification models. It assesses the model's capacity to produce +accurate results (high precision), as well as its ability to capture a majority of all positive instances (high +recall). + +###### Test Mechanism + +The test extracts ground truth labels and prediction probabilities from the model's test dataset. It applies the +`precision_recall_curve` method from the sklearn metrics module to these extracted labels and predictions, which +computes a precision-recall pair for each possible threshold. This calculation results in an array of precision and +recall scores that can be plotted against each other to form the Precision-Recall Curve. This curve is then +visually represented by using Plotly's scatter plot. + +###### Signs of High Risk + +- A lower area under the Precision-Recall Curve signifies high risk. +- This corresponds to a model yielding a high amount of false positives (low precision) and/or false negatives (low +recall). +- If the curve is closer to the bottom left of the plot, rather than being closer to the top right corner, it can +be a sign of high risk. + +###### Strengths + +- This metric aptly represents the balance between precision (minimizing false positives) and recall (minimizing +false negatives), which is especially critical in scenarios where both values are significant. +- Through the graphic representation, it enables an intuitive understanding of the model's performance across +different threshold levels. + +###### Limitations + +- This metric is only applicable to binary classification models - it raises errors for multiclass classification +models or Foundation models. +- It may not fully represent the overall accuracy of the model if the cost of false positives and false negatives +are extremely different, or if the dataset is heavily imbalanced. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd new file mode 100644 index 000000000..59668a3e1 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -0,0 +1,63 @@ +--- +title: ROCCurve +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ROCCurve + +Evaluates binary classification model performance by generating and plotting the Receiver Operating Characteristic +(ROC) curve and calculating the Area Under Curve (AUC) score. + +###### Purpose + +The Receiver Operating Characteristic (ROC) curve is designed to evaluate the performance of binary classification +models. This curve illustrates the balance between the True Positive Rate (TPR) and False Positive Rate (FPR) +across various threshold levels. In combination with the Area Under the Curve (AUC), the ROC curve aims to measure +the model's discrimination ability between the two defined classes in a binary classification problem (e.g., +default vs non-default). Ideally, a higher AUC score signifies superior model performance in accurately +distinguishing between the positive and negative classes. + +###### Test Mechanism + +First, this script selects the target model and datasets that require binary classification. It then calculates the +predicted probabilities for the test set, and uses this data, along with the true outcomes, to generate and plot +the ROC curve. Additionally, it includes a line signifying randomness (AUC of 0.5). The AUC score for the model's +ROC curve is also computed, presenting a numerical estimation of the model's performance. If any Infinite values +are detected in the ROC threshold, these are effectively eliminated. The resulting ROC curve, AUC score, and +thresholds are consequently saved for future reference. + +###### Signs of High Risk + +- A high risk is potentially linked to the model's performance if the AUC score drops below or nears 0.5. +- Another warning sign would be the ROC curve lying closer to the line of randomness, indicating no discriminative +ability. +- For the model to be deemed competent at its classification tasks, it is crucial that the AUC score is +significantly above 0.5. + +###### Strengths + +- The ROC Curve offers an inclusive visual depiction of a model's discriminative power throughout all conceivable +classification thresholds, unlike other metrics that solely disclose model performance at one fixed threshold. +- Despite the proportions of the dataset, the AUC Score, which represents the entire ROC curve as a single data +point, continues to be consistent, proving to be the ideal choice for such situations. + +###### Limitations + +- The primary limitation is that this test is exclusively structured for binary classification tasks, thus limiting +its application towards other model types. +- Furthermore, its performance might be subpar with models that output probabilities highly skewed towards 0 or 1. +- At the extreme, the ROC curve could reflect high performance even when the majority of classifications are +incorrect, provided that the model's ranking format is retained. This phenomenon is commonly termed the "Class +Imbalance Problem". + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd new file mode 100644 index 000000000..049bb5c28 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -0,0 +1,63 @@ +--- +title: RegressionErrors +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### RegressionErrors + +Assesses the performance and error distribution of a regression model using various error metrics. + +###### Purpose + +The purpose of the Regression Errors test is to measure the performance of a regression model by calculating +several error metrics. This evaluation helps determine the model's accuracy and potential issues like overfitting +or bias by analyzing differences in error metrics between the training and testing datasets. + +###### Test Mechanism + +The test computes the following error metrics: + +- **Mean Absolute Error (MAE)****: Average of the absolute differences between true values and predicted values. +- **Mean Squared Error (MSE)**: Average of the squared differences between true values and predicted values. +- **Root Mean Squared Error (RMSE)**: Square root of the mean squared error. +- **Mean Absolute Percentage Error (MAPE)**: Average of the absolute differences between true values and predicted +values, divided by the true values, and expressed as a percentage. +- **Mean Bias Deviation (MBD)**: Average bias between true values and predicted values. + +These metrics are calculated separately for the training and testing datasets and compared to identify +discrepancies. + +###### Signs of High Risk + +- High values for MAE, MSE, RMSE, or MAPE indicating poor model performance. +- Large differences in error metrics between the training and testing datasets, suggesting overfitting. +- Significant deviation of MBD from zero, indicating systematic bias in model predictions. + +###### Strengths + +- Provides a comprehensive overview of model performance through multiple error metrics. +- Individual metrics offer specific insights, e.g., MAE for interpretability, MSE for emphasizing larger errors. +- RMSE is useful for being in the same unit as the target variable. +- MAPE allows the error to be expressed as a percentage. +- MBD detects systematic bias in model predictions. + +###### Limitations + +- MAE and MSE are sensitive to outliers. +- RMSE heavily penalizes larger errors, which might not always be desirable. +- MAPE can be misleading when actual values are near zero. +- MBD may not be suitable if bias varies with the magnitude of actual values. +- These metrics may not capture all nuances of model performance and should be interpreted with domain-specific +context. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd new file mode 100644 index 000000000..d54a0e8b1 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -0,0 +1,54 @@ +--- +title: RegressionErrorsComparison +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### RegressionErrorsComparison + +Assesses multiple regression error metrics to compare model performance across different datasets, emphasizing +systematic overestimation or underestimation and large percentage errors. + +###### Purpose + +The purpose of this test is to compare regression errors for different models applied to various datasets. It aims +to examine model performance using multiple error metrics, thereby identifying areas where models may be +underperforming or exhibiting bias. + +###### Test Mechanism + +The function iterates through each dataset-model pair and calculates various error metrics, including Mean Absolute +Error (MAE), Mean Squared Error (MSE), Mean Absolute Percentage Error (MAPE), and Mean Bias Deviation (MBD). The +results are summarized in a table, which provides a comprehensive view of each model's performance on the datasets. + +###### Signs of High Risk + +- High Mean Absolute Error (MAE) or Mean Squared Error (MSE), indicating poor model performance. +- High Mean Absolute Percentage Error (MAPE), suggesting large percentage errors, especially problematic if the +true values are small. +- Mean Bias Deviation (MBD) significantly different from zero, indicating systematic overestimation or +underestimation by the model. + +###### Strengths + +- Provides multiple error metrics to assess model performance from different perspectives. +- Includes a check to avoid division by zero when calculating MAPE. + +###### Limitations + +- Assumes that the dataset is provided as a DataFrameDataset object with `y`, `y_pred`, and `feature_columns` +attributes. +- Relies on the `logger` from `validmind.logging` to warn about zero values in `y_true`, which should be correctly +implemented and imported. +- Requires that `dataset.y_pred(model)` returns the predicted values for the model. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd new file mode 100644 index 000000000..23812e9d0 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -0,0 +1,49 @@ +--- +title: RegressionPerformance +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### RegressionPerformance + +Evaluates the performance of a regression model using five different metrics**: MAE, MSE, RMSE, MAPE, and MBD. + +###### Purpose + +The Regression Models Performance Comparison metric is used to measure the performance of regression models. It +calculates multiple evaluation metrics, including Mean Absolute Error (MAE), Mean Squared Error (MSE), +Root Mean Squared Error (RMSE), Mean Absolute Percentage Error (MAPE), and Mean Bias Deviation (MBD), thereby +enabling a comprehensive view of model performance. + +###### Test Mechanism + +The test uses the sklearn library to calculate the MAE, MSE, RMSE, MAPE, and MBD. These calculations encapsulate both +the direction and the magnitude of error in predictions, thereby providing a multi-faceted view of model accuracy. + +###### Signs of High Risk + +- High values of MAE, MSE, RMSE, and MAPE, which indicate a high error rate and imply a larger departure of the +model's predictions from the true values. +- A large value of MBD, which shows a consistent bias in the model’s predictions. + +###### Strengths + +- The metric evaluates models on five different metrics offering a comprehensive analysis of model performance. +- It is designed to handle regression tasks and can be seamlessly integrated with libraries like sklearn. + +###### Limitations + +- The metric only evaluates regression models and does not evaluate classification models. +- The test assumes that the models have been trained and tested appropriately prior to evaluation. It does not +handle pre-processing, feature selection, or other stages in the model lifecycle. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd new file mode 100644 index 000000000..deb11ea20 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -0,0 +1,56 @@ +--- +title: RegressionR2Square +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### RegressionR2Square + +Assesses the overall goodness-of-fit of a regression model by evaluating R-squared (R2) and Adjusted R-squared (Adj +R2) scores to determine the model's explanatory power over the dependent variable. + +###### Purpose + +The purpose of the RegressionR2Square Metric test is to measure the overall goodness-of-fit of a regression model. +Specifically, this Python-based test evaluates the R-squared (R2) and Adjusted R-squared (Adj R2) scores, which are +statistical measures used to assess the strength of the relationship between the model's predictors and the +response variable. + +###### Test Mechanism + +The test deploys the `r2_score` method from the Scikit-learn metrics module to measure the R2 score on both +training and test sets. This score reflects the proportion of the variance in the dependent variable that is +predictable from the independent variables. The test also calculates the Adjusted R2 score, which accounts for the +number of predictors in the model to penalize model complexity and reduce overfitting. The Adjusted R2 score will +be smaller if unnecessary predictors are included in the model. + +###### Signs of High Risk + +- Low R2 or Adjusted R2 scores, suggesting that the model does not explain much variation in the dependent variable. +- Significant discrepancy between R2 scores on the training set and test set, indicating overfitting and poor +generalization to unseen data. + +###### Strengths + +- Widely-used measure in regression analysis, providing a sound general indication of model performance. +- Easy to interpret and understand, as it represents the proportion of the dependent variable's variance explained +by the independent variables. +- Adjusted R2 score helps control overfitting by penalizing unnecessary predictors. + +###### Limitations + +- Sensitive to the inclusion of unnecessary predictors even though Adjusted R2 penalizes complexity. +- Less reliable in cases of non-linear relationships or when the underlying assumptions of linear regression are +violated. +- Does not provide insight on whether the correct regression model was used or if key assumptions have been met. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd new file mode 100644 index 000000000..3fb45c9f8 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -0,0 +1,58 @@ +--- +title: RegressionR2SquareComparison +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### RegressionR2SquareComparison + +Compares R-Squared and Adjusted R-Squared values for different regression models across multiple datasets to assess +model performance and relevance of features. + +###### Purpose + +The Regression R2 Square Comparison test aims to compare the R-Squared and Adjusted R-Squared values for different +regression models across various datasets. It helps in assessing how well each model explains the variability in +the dataset, and whether the models include irrelevant features. + +###### Test Mechanism + +This test operates by: + +- Iterating through each dataset-model pair. +- Calculating the R-Squared values to measure how much of the variability in the dataset is explained by the model. +- Calculating the Adjusted R-Squared values, which adjust the R-Squared based on the number of predictors in the +model, making it more reliable when comparing models with different numbers of features. +- Generating a summary table containing these values for each combination of dataset and model. + +###### Signs of High Risk + +- If the R-Squared values are significantly low, it indicates the model isn't explaining much of the variability in +the dataset. +- A significant difference between R-Squared and Adjusted R-Squared values might indicate that the model includes +irrelevant features. + +###### Strengths + +- Provides a quantitative measure of model performance in terms of variance explained. +- Adjusted R-Squared accounts for the number of predictors, making it a more reliable measure when comparing models +with different numbers of features. +- Useful for time-series forecasting and regression tasks. + +###### Limitations + +- Assumes the dataset is provided as a DataFrameDataset object with `y`, `y_pred`, and `feature_columns` attributes. +- Relies on `adj_r2_score` from the `statsmodels.statsutils` module, which needs to be correctly implemented and +imported. +- Requires that `dataset.y_pred(model)` returns the predicted values for the model. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd new file mode 100644 index 000000000..c6808fb66 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -0,0 +1,54 @@ +--- +title: RobustnessDiagnosis +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### RobustnessDiagnosis + +Assesses the robustness of a machine learning model by evaluating performance decay under noisy conditions. + +###### Purpose + +The Robustness Diagnosis test aims to evaluate the resilience of a machine learning model when subjected to +perturbations or noise in its input data. This is essential for understanding the model's ability to handle +real-world scenarios where data may be imperfect or corrupted. + +###### Test Mechanism + +This test introduces Gaussian noise to the numeric input features of the datasets at varying scales of standard +deviation. The performance of the model is then measured using a specified metric. The process includes: + +- Adding Gaussian noise to numerical input features based on scaling factors. +- Evaluating the model's performance on the perturbed data using metrics like AUC for classification tasks and MSE +for regression tasks. +- Aggregating and plotting the results to visualize performance decay relative to perturbation size. + +###### Signs of High Risk + +- A significant drop in performance metrics with minimal noise. +- Performance decay values exceeding the specified threshold. +- Consistent failure to meet performance standards across multiple perturbation scales. + +###### Strengths + +- Provides insights into the model's robustness against noisy or corrupted data. +- Utilizes a variety of performance metrics suitable for both classification and regression tasks. +- Visualization helps in understanding the extent of performance degradation. + +###### Limitations + +- Gaussian noise might not adequately represent all types of real-world data perturbations. +- Performance thresholds are somewhat arbitrary and might need tuning. +- The test may not account for more complex or unstructured noise patterns that could affect model robustness. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd new file mode 100644 index 000000000..6be392de8 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -0,0 +1,103 @@ +--- +title: SHAPGlobalImportance +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### generate_shap_plot + +Plots two types of SHAP global importance (SHAP). + +**Arguments** + +- **type_****: The type of SHAP plot to generate. Must be "mean" or "summary". +- **shap_values**: The SHAP values to plot. +- **x_test**: The test data used to generate the SHAP values. + +**Returns** + +- The generated plot. + + + + + +#### select_shap_values + +Selects SHAP values for binary or multiclass classification. + +For regression models, returns the SHAP values directly as there are no classes. + +**Arguments** + +- **shap_values****: The SHAP values returned by the SHAP explainer. For multiclass classification, this will be a list where each element corresponds to a class. For regression, this will be a single array of SHAP values. +- **class_of_interest**: The class index for which to retrieve SHAP values. If None (default), the function will assume binary classification and use class 1 by default. + +**Returns** + +- The SHAP values for the specified class (classification) or for the regression +- output. + +**Raises** + +- **ValueError**: If class_of_interest is specified and is out of bounds for the number of classes. + + + + + +#### SHAPGlobalImportance + +Evaluates and visualizes global feature importance using SHAP values for model explanation and risk identification. + +###### Purpose + +The SHAP (SHapley Additive exPlanations) Global Importance metric aims to elucidate model outcomes by attributing +them to the contributing features. It assigns a quantifiable global importance to each feature via their respective +absolute Shapley values, thereby making it suitable for tasks like classification (both binary and multiclass). +This metric forms an essential part of model risk management. + +###### Test Mechanism + +The exam begins with the selection of a suitable explainer which aligns with the model's type. For tree-based +models like XGBClassifier, RandomForestClassifier, CatBoostClassifier, TreeExplainer is used whereas for linear +models like LogisticRegression, XGBRegressor, LinearRegression, it is the LinearExplainer. Once the explainer +calculates the Shapley values, these values are visualized using two specific graphical representations: + +1. Mean Importance Plot**: This graph portrays the significance of individual features based on their absolute +Shapley values. It calculates the average of these absolute Shapley values across all instances to highlight the +global importance of features. + +2. Summary Plot: This visual tool combines the feature importance with their effects. Every dot on this chart +represents a Shapley value for a certain feature in a specific case. The vertical axis is denoted by the feature +whereas the horizontal one corresponds to the Shapley value. A color gradient indicates the value of the feature, +gradually changing from low to high. Features are systematically organized in accordance with their importance. + +###### Signs of High Risk + +- Overemphasis on certain features in SHAP importance plots, thus hinting at the possibility of model overfitting +- Anomalies such as unexpected or illogical features showing high importance, which might suggest that the model's +decisions are rooted in incorrect or undesirable reasoning +- A SHAP summary plot filled with high variability or scattered data points, indicating a cause for concern + +###### Strengths + +- SHAP does more than just illustrating global feature significance, it offers a detailed perspective on how +different features shape the model's decision-making logic for each instance. +- It provides clear insights into model behavior. + +###### Limitations + +- High-dimensional data can convolute interpretations. +- Associating importance with tangible real-world impact still involves a certain degree of subjectivity. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd new file mode 100644 index 000000000..b9c0611c1 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -0,0 +1,67 @@ +--- +title: ScoreProbabilityAlignment +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ScoreProbabilityAlignment + +Analyzes the alignment between credit scores and predicted probabilities. + +###### Purpose + +The Score-Probability Alignment test evaluates how well credit scores align with +predicted default probabilities. This helps validate score scaling, identify potential +calibration issues, and ensure scores reflect risk appropriately. + +###### Test Mechanism + +The test: +1. Groups scores into bins +2. Calculates average predicted probability per bin +3. Tests monotonicity of relationship +4. Analyzes probability distribution within score bands + +###### Signs of High Risk + +- Non-monotonic relationship between scores and probabilities +- Large probability variations within score bands +- Unexpected probability jumps between adjacent bands +- Poor alignment with expected odds-to-score relationship +- Inconsistent probability patterns across score ranges +- Clustering of probabilities at extreme values +- Score bands with similar probability profiles +- Unstable probability estimates in key decision bands + +###### Strengths + +- Direct validation of score-to-probability relationship +- Identifies potential calibration issues +- Supports score band validation +- Helps understand model behavior +- Useful for policy setting +- Visual and numerical results +- Easy to interpret +- Supports regulatory documentation + +###### Limitations + +- Sensitive to bin selection +- Requires sufficient data per bin +- May mask within-bin variations +- Point-in-time analysis only +- Cannot detect all forms of miscalibration +- Assumes scores should align with probabilities +- May oversimplify complex relationships +- Limited to binary outcomes + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd new file mode 100644 index 000000000..b205ca782 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -0,0 +1,63 @@ +--- +title: SilhouettePlot +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### SilhouettePlot + +Calculates and visualizes Silhouette Score, assessing the degree of data point suitability to its cluster in ML +models. + +###### Purpose + +This test calculates the Silhouette Score, which is a model performance metric used in clustering applications. +Primarily, the Silhouette Score evaluates how similar a data point is to its own cluster compared to other +clusters. The metric ranges between -1 and 1, where a high value indicates that the object is well matched to its +own cluster and poorly matched to neighboring clusters. Thus, the goal is to achieve a high Silhouette Score, +implying well-separated clusters. + +###### Test Mechanism + +The test first extracts the true and predicted labels from the model's training data. The test runs the Silhouette +Score function, which takes as input the training dataset features and the predicted labels, subsequently +calculating the average score. This average Silhouette Score is printed for reference. The script then calculates +the silhouette coefficients for each data point, helping to form the Silhouette Plot. Each cluster is represented +in this plot, with color distinguishing between different clusters. A red dashed line indicates the average +Silhouette Score. The Silhouette Scores are also collected into a structured table, facilitating model performance +analysis and comparison. + +###### Signs of High Risk + +- A low Silhouette Score, potentially indicating that the clusters are not well separated and that data points may +not be fitting well to their respective clusters. +- A Silhouette Plot displaying overlapping clusters or the absence of clear distinctions between clusters visually +also suggests poor clustering performance. + +###### Strengths + +- The Silhouette Score provides a clear and quantitative measure of how well data points have been grouped into +clusters, offering insights into model performance. +- The Silhouette Plot provides an intuitive, graphical representation of the clustering mechanism, aiding visual +assessments of model performance. +- It does not require ground truth labels, so it's useful when true cluster assignments are not known. + +###### Limitations + +- The Silhouette Score may be susceptible to the influence of outliers, which could impact its accuracy and +reliability. +- It assumes the clusters are convex and isotropic, which might not be the case with complex datasets. +- Due to the average nature of the Silhouette Score, the metric does not account for individual data point +assignment nuances, so potentially relevant details may be omitted. +- Computationally expensive for large datasets, as it requires pairwise distance computations. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd new file mode 100644 index 000000000..cdd6d33fe --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -0,0 +1,58 @@ +--- +title: TrainingTestDegradation +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### TrainingTestDegradation + +Tests if model performance degradation between training and test datasets exceeds a predefined threshold. + +###### Purpose + +The `TrainingTestDegradation` class serves as a test to verify that the degradation in performance between the +training and test datasets does not exceed a predefined threshold. This test measures the model's ability to +generalize from its training data to unseen test data, assessing key classification metrics such as accuracy, +precision, recall, and f1 score to verify the model's robustness and reliability. + +###### Test Mechanism + +The code applies several predefined metrics, including accuracy, precision, recall, and f1 scores, to the model's +predictions for both the training and test datasets. It calculates the degradation as the difference between the +training score and test score divided by the training score. The test is considered successful if the degradation +for each metric is less than the preset maximum threshold of 10%. The results are summarized in a table showing +each metric's train score, test score, degradation percentage, and pass/fail status. + +###### Signs of High Risk + +- A degradation percentage that exceeds the maximum allowed threshold of 10% for any of the evaluated metrics. +- A high difference or gap between the metric scores on the training and the test datasets. +- The 'Pass/Fail' column displaying 'Fail' for any of the evaluated metrics. + +###### Strengths + +- Provides a quantitative measure of the model's ability to generalize to unseen data, which is key for predicting +its practical real-world performance. +- By evaluating multiple metrics, it takes into account different facets of model performance and enables a more +holistic evaluation. +- The use of a variable predefined threshold allows the flexibility to adjust the acceptability criteria for +different scenarios. + +###### Limitations + +- The test compares raw performance on training and test data but does not factor in the nature of the data. Areas +with less representation in the training set might still perform poorly on unseen data. +- It requires good coverage and balance in the test and training datasets to produce reliable results, which may +not always be available. +- The test is currently only designed for classification tasks. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd new file mode 100644 index 000000000..889f926ad --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -0,0 +1,54 @@ +--- +title: VMeasure +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### VMeasure + +Evaluates homogeneity and completeness of a clustering model using the V Measure Score. + +###### Purpose + +The purpose of this metric, V Measure Score (V Score), is to evaluate the performance of a clustering model. It +measures the homogeneity and completeness of a set of cluster labels, where homogeneity refers to each cluster +containing only members of a single class and completeness meaning all members of a given class are assigned to the +same cluster. + +###### Test Mechanism + +ClusterVMeasure is a class that inherits from another class, ClusterPerformance. It uses the `v_measure_score` +function from the sklearn module's metrics package. The required inputs to perform this metric are the model, train +dataset, and test dataset. The test is appropriate for models tasked with clustering. + +###### Signs of High Risk + +- Low V Measure Score**: A low V Measure Score indicates that the clustering model has poor homogeneity or +completeness, or both. This might signal that the model is failing to correctly cluster the data. + +###### Strengths + +- The V Measure Score is a harmonic mean between homogeneity and completeness. This ensures that both attributes +are taken into account when evaluating the model, providing an overall measure of its cluster validity. +- The metric does not require knowledge of the ground truth classes when measuring homogeneity and completeness, +making it applicable in instances where such information is unavailable. + +###### Limitations + +- The V Measure Score can be influenced by the number of clusters, which means that it might not always reflect the +quality of the clustering. Partitioning the data into many small clusters could lead to high homogeneity but low +completeness, leading to a low V Measure Score even if the clustering might be useful. +- It assumes equal importance of homogeneity and completeness. In some applications, one may be more important than +the other. The V Measure Score does not provide flexibility in assigning different weights to homogeneity and +completeness. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd new file mode 100644 index 000000000..09b7148b3 --- /dev/null +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -0,0 +1,66 @@ +--- +title: WeakspotsDiagnosis +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### WeakspotsDiagnosis + +Identifies and visualizes weak spots in a machine learning model's performance across various sections of the +feature space. + +###### Purpose + +The weak spots test is applied to evaluate the performance of a machine learning model within specific regions of +its feature space. This test slices the feature space into various sections, evaluating the model's outputs within +each section against specific performance metrics (e.g., accuracy, precision, recall, and F1 scores). The ultimate +aim is to identify areas where the model's performance falls below the set thresholds, thereby exposing its +possible weaknesses and limitations. + +###### Test Mechanism + +The test mechanism adopts an approach of dividing the feature space of the training dataset into numerous bins. The +model's performance metrics (accuracy, precision, recall, F1 scores) are then computed for each bin on both the +training and test datasets. A "weak spot" is identified if any of the performance metrics fall below a +predetermined threshold for a particular bin on the test dataset. The test results are visually plotted as bar +charts for each performance metric, indicating the bins which fail to meet the established threshold. + +###### Signs of High Risk + +- Any performance metric of the model dropping below the set thresholds. +- Significant disparity in performance between the training and test datasets within a bin could be an indication +of overfitting. +- Regions or slices with consistently low performance metrics. Such instances could mean that the model struggles +to handle specific types of input data adequately, resulting in potentially inaccurate predictions. + +###### Strengths + +- The test helps pinpoint precise regions of the feature space where the model's performance is below par, allowing +for more targeted improvements to the model. +- The graphical presentation of the performance metrics offers an intuitive way to understand the model's +performance across different feature areas. +- The test exhibits flexibility, letting users set different thresholds for various performance metrics according +to the specific requirements of the application. + +###### Limitations + +- The binning system utilized for the feature space in the test could over-simplify the model's behavior within +each bin. The granularity of this slicing depends on the chosen 'bins' parameter and can sometimes be arbitrary. +- The effectiveness of this test largely hinges on the selection of thresholds for the performance metrics, which +may not hold universally applicable and could be subjected to the specifications of a particular model and +application. +- The test is unable to handle datasets with a text column, limiting its application to numerical or categorical +data types only. +- Despite its usefulness in highlighting problematic regions, the test does not offer direct suggestions for model +improvement. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels.qmd b/docs/validmind/tests/model_validation/statsmodels.qmd new file mode 100644 index 000000000..196678419 --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels.qmd @@ -0,0 +1,27 @@ +--- +title: statsmodels +toc-depth: 3 +toc-expand: 3 +--- + + + + + +- [AutoARIMA](statsmodels/AutoARIMA.qmd) +- [CumulativePredictionProbabilities](statsmodels/CumulativePredictionProbabilities.qmd) +- [DurbinWatsonTest](statsmodels/DurbinWatsonTest.qmd) +- [GINITable](statsmodels/GINITable.qmd) +- [KolmogorovSmirnov](statsmodels/KolmogorovSmirnov.qmd) +- [Lilliefors](statsmodels/Lilliefors.qmd) +- [PredictionProbabilitiesHistogram](statsmodels/PredictionProbabilitiesHistogram.qmd) +- [RegressionCoeffs](statsmodels/RegressionCoeffs.qmd) +- [RegressionFeatureSignificance](statsmodels/RegressionFeatureSignificance.qmd) +- [RegressionModelForecastPlot](statsmodels/RegressionModelForecastPlot.qmd) +- [RegressionModelForecastPlotLevels](statsmodels/RegressionModelForecastPlotLevels.qmd) +- [RegressionModelSensitivityPlot](statsmodels/RegressionModelSensitivityPlot.qmd) +- [RegressionModelSummary](statsmodels/RegressionModelSummary.qmd) +- [RegressionPermutationFeatureImportance](statsmodels/RegressionPermutationFeatureImportance.qmd) +- [ScorecardHistogram](statsmodels/ScorecardHistogram.qmd) +- [statsutils](statsmodels/statsutils.qmd) + diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd new file mode 100644 index 000000000..8e04e42d6 --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -0,0 +1,66 @@ +--- +title: AutoARIMA +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### AutoARIMA + +Evaluates ARIMA models for time-series forecasting, ranking them using Bayesian and Akaike Information Criteria. + +###### Purpose + +The AutoARIMA validation test is designed to evaluate and rank AutoRegressive Integrated Moving Average (ARIMA) +models. These models are primarily used for forecasting time-series data. The validation test automatically fits +multiple ARIMA models, with varying parameters, to every variable within the given dataset. The models are then +ranked based on their Bayesian Information Criterion (BIC) and Akaike Information Criterion (AIC) values, which +provide a basis for the efficient model selection process. + +###### Test Mechanism + +This metric proceeds by generating an array of feasible combinations of ARIMA model parameters which are within a +prescribed limit. These limits include `max_p`, `max_d`, `max_q`; they represent the autoregressive, differencing, +and moving average components respectively. Upon applying these sets of parameters, the validation test fits each +ARIMA model to the time-series data provided. For each model, it subsequently proceeds to calculate and record both +the BIC and AIC values, which serve as performance indicators for the model fit. Prior to this parameter fitting +process, the Augmented Dickey-Fuller test for data stationarity is conducted on the data series. If a series is +found to be non-stationary, a warning message is sent out, given that ARIMA models necessitate input series to be +stationary. + +###### Signs of High Risk + +- If the p-value of the Augmented Dickey-Fuller test for a variable exceeds 0.05, a warning is logged. This warning +indicates that the series might not be stationary, leading to potentially inaccurate results. +- Consistent failure in fitting ARIMA models (as made evident through logged errors) might disclose issues with +either the data or model stability. + +###### Strengths + +- The AutoARIMA validation test simplifies the often complex task of selecting the most suitable ARIMA model based +on BIC and AIC criteria. +- The mechanism incorporates a check for non-stationarity within the data, which is a critical prerequisite for +ARIMA models. +- The exhaustive search through all possible combinations of model parameters enhances the likelihood of +identifying the best-fit model. + +###### Limitations + +- This validation test can be computationally costly as it involves creating and fitting multiple ARIMA models for +every variable. +- Although the test checks for non-stationarity and logs warnings where present, it does not apply any +transformations to the data to establish stationarity. +- The selection of models leans solely on BIC and AIC criteria, which may not yield the best predictive model in +all scenarios. +- The test is only applicable to regression tasks involving time-series data, and may not work effectively for +other types of machine learning tasks. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd new file mode 100644 index 000000000..dcf60fa73 --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -0,0 +1,63 @@ +--- +title: CumulativePredictionProbabilities +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### CumulativePredictionProbabilities + +Visualizes cumulative probabilities of positive and negative classes for both training and testing in classification models. + +###### Purpose + +This metric is utilized to evaluate the distribution of predicted probabilities for positive and negative classes +in a classification model. It provides a visual assessment of the model's behavior by plotting the cumulative +probabilities for positive and negative classes across both the training and test datasets. + +###### Test Mechanism + +The classification model is evaluated by first computing the predicted probabilities for each instance in both +the training and test datasets, which are then added as a new column in these sets. The cumulative probabilities +for positive and negative classes are subsequently calculated and sorted in ascending order. Cumulative +distributions of these probabilities are created for both positive and negative classes across both training and +test datasets. These cumulative probabilities are represented visually in a plot, containing two subplots - one for +the training data and the other for the test data, with lines representing cumulative distributions of positive and +negative classes. + +###### Signs of High Risk + +- Imbalanced distribution of probabilities for either positive or negative classes. +- Notable discrepancies or significant differences between the cumulative probability distributions for the +training data versus the test data. +- Marked discrepancies or large differences between the cumulative probability distributions for positive and +negative classes. + +###### Strengths + +- Provides a visual illustration of data, which enhances the ease of understanding and interpreting the model's +behavior. +- Allows for the comparison of model's behavior across training and testing datasets, providing insights about how +well the model is generalized. +- Differentiates between positive and negative classes and their respective distribution patterns, aiding in +problem diagnosis. + +###### Limitations + +- Exclusive to classification tasks and specifically to classification models. +- Graphical results necessitate human interpretation and may not be directly applicable for automated risk +detection. +- The method does not give a solitary quantifiable measure of model risk, instead, it offers a visual +representation and broad distributional information. +- If the training and test datasets are not representative of the overall data distribution, the metric could +provide misleading results. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd new file mode 100644 index 000000000..01dd32ebe --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -0,0 +1,54 @@ +--- +title: DurbinWatsonTest +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### DurbinWatsonTest + +Assesses autocorrelation in time series data features using the Durbin-Watson statistic. + +###### Purpose + +The Durbin-Watson Test metric detects autocorrelation in time series data (where a set of data values influences +their predecessors). Autocorrelation is a crucial factor for regression tasks as these often assume the +independence of residuals. A model with significant autocorrelation may give unreliable predictions. + +###### Test Mechanism + +Utilizing the `durbin_watson` function in the `statsmodels` Python library, the Durbin-Watson (DW) Test metric +generates a statistical value for each feature of the training dataset. The function is looped over all columns of +the dataset, calculating and caching the DW value for each column for further analysis. A DW metric value nearing 2 +indicates no autocorrelation. Conversely, values approaching 0 suggest positive autocorrelation, and those leaning +towards 4 imply negative autocorrelation. + +###### Signs of High Risk + +- If a feature's DW value significantly deviates from 2, it could signal a high risk due to potential +autocorrelation issues in the dataset. +- A value closer to 0 could imply positive autocorrelation, while a value nearer to 4 could point to negative +autocorrelation, both leading to potentially unreliable prediction models. + +###### Strengths + +- The metric specializes in identifying autocorrelation in prediction model residuals. +- Autocorrelation detection assists in diagnosing violation of various modeling technique assumptions, particularly +in regression analysis and time-series data modeling. + +###### Limitations + +- The Durbin-Watson Test mainly detects linear autocorrelation and could overlook other types of relationships. +- The metric is highly sensitive to data points order. Shuffling the order could lead to notably different results. +- The test only checks for first-order autocorrelation (between a variable and its immediate predecessor) and fails +to detect higher-order autocorrelation. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd new file mode 100644 index 000000000..aed2c4bb2 --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -0,0 +1,66 @@ +--- +title: GINITable +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### GINITable + +Evaluates classification model performance using AUC, GINI, and KS metrics for training and test datasets. + +###### Purpose + +The 'GINITable' metric is designed to evaluate the performance of a classification model by emphasizing its +discriminatory power. Specifically, it calculates and presents three important metrics - the Area under the ROC +Curve (AUC), the GINI coefficient, and the Kolmogorov-Smirnov (KS) statistic - for both training and test datasets. + +###### Test Mechanism + +Using a dictionary for storing performance metrics for both the training and test datasets, the 'GINITable' metric +calculates each of these metrics sequentially. The Area under the ROC Curve (AUC) is calculated via the +`roc_auc_score` function from the Scikit-Learn library. The GINI coefficient, a measure of statistical dispersion, +is then computed by doubling the AUC and subtracting 1. Finally, the Kolmogorov-Smirnov (KS) statistic is +calculated via the `roc_curve` function from Scikit-Learn, with the False Positive Rate (FPR) subtracted from the +True Positive Rate (TPR) and the maximum value taken from the resulting data. These metrics are then stored in a +pandas DataFrame for convenient visualization. + +###### Signs of High Risk + +- Low values for performance metrics may suggest a reduction in model performance, particularly a low AUC which +indicates poor classification performance, or a low GINI coefficient, which could suggest a decreased ability to +discriminate different classes. +- A high KS value may be an indicator of potential overfitting, as this generally signifies a substantial +divergence between positive and negative distributions. +- Significant discrepancies between the performance on the training dataset and the test dataset may present +another signal of high risk. + +###### Strengths + +- Offers three key performance metrics (AUC, GINI, and KS) in one test, providing a more comprehensive evaluation +of the model. +- Provides a direct comparison between the model's performance on training and testing datasets, which aids in +identifying potential underfitting or overfitting. +- The applied metrics are class-distribution invariant, thereby remaining effective for evaluating model +performance even when dealing with imbalanced datasets. +- Presents the metrics in a user-friendly table format for easy comprehension and analysis. + +###### Limitations + +- The GINI coefficient and KS statistic are both dependent on the AUC value. Therefore, any errors in the +calculation of the latter will adversely impact the former metrics too. +- Mainly suited for binary classification models and may require modifications for effective application in +multi-class scenarios. +- The metrics used are threshold-dependent and may exhibit high variability based on the chosen cut-off points. +- The test does not incorporate a method to efficiently handle missing or inefficiently processed data, which could +lead to inaccuracies in the metrics if the data is not appropriately preprocessed. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd new file mode 100644 index 000000000..28cf08e87 --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -0,0 +1,52 @@ +--- +title: KolmogorovSmirnov +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### KolmogorovSmirnov + +Assesses whether each feature in the dataset aligns with a normal distribution using the Kolmogorov-Smirnov test. + +###### Purpose + +The Kolmogorov-Smirnov (KS) test evaluates the distribution of features in a dataset to determine their alignment +with a normal distribution. This is important because many statistical methods and machine learning models assume +normality in the data distribution. + +###### Test Mechanism + +This test calculates the KS statistic and corresponding p-value for each feature in the dataset. It does so by +comparing the cumulative distribution function of the feature with an ideal normal distribution. The KS statistic +and p-value for each feature are then stored in a dictionary. The p-value threshold to reject the normal +distribution hypothesis is not preset, providing flexibility for different applications. + +###### Signs of High Risk + +- Elevated KS statistic for a feature combined with a low p-value, indicating a significant divergence from a +normal distribution. +- Features with notable deviations that could create problems if the model assumes normality in data distribution. + +###### Strengths + +- The KS test is sensitive to differences in the location and shape of empirical cumulative distribution functions. +- It is non-parametric and adaptable to various datasets, as it does not assume any specific data distribution. +- Provides detailed insights into the distribution of individual features. + +###### Limitations + +- The test's sensitivity to disparities in the tails of data distribution might cause false alarms about +non-normality. +- Less effective for multivariate distributions, as it is designed for univariate distributions. +- Does not identify specific types of non-normality, such as skewness or kurtosis, which could impact model fitting. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd new file mode 100644 index 000000000..731f2bd78 --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -0,0 +1,62 @@ +--- +title: Lilliefors +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### Lilliefors + +Assesses the normality of feature distributions in an ML model's training dataset using the Lilliefors test. + +###### Purpose + +The purpose of this metric is to utilize the Lilliefors test, named in honor of the Swedish statistician Hubert +Lilliefors, in order to assess whether the features of the machine learning model's training dataset conform to a +normal distribution. This is done because the assumption of normal distribution plays a vital role in numerous +statistical procedures as well as numerous machine learning models. Should the features fail to follow a normal +distribution, some model types may not operate at optimal efficiency. This can potentially lead to inaccurate +predictions. + +###### Test Mechanism + +The application of this test happens across all feature columns within the training dataset. For each feature, the +Lilliefors test returns a test statistic and p-value. The test statistic quantifies how far the feature's +distribution is from an ideal normal distribution, whereas the p-value aids in determining the statistical +relevance of this deviation. The final results are stored within a dictionary, the keys of which correspond to the +name of the feature column, and the values being another dictionary which houses the test statistic and p-value. + +###### Signs of High Risk + +- If the p-value corresponding to a specific feature sinks below a pre-established significance level, generally +set at 0.05, then it can be deduced that the distribution of that feature significantly deviates from a normal +distribution. This can present a high risk for models that assume normality, as these models may perform +inaccurately or inefficiently in the presence of such a feature. + +###### Strengths + +- One advantage of the Lilliefors test is its utility irrespective of whether the mean and variance of the normal +distribution are known in advance. This makes it a more robust option in real-world situations where these values +might not be known. +- The test has the ability to screen every feature column, offering a holistic view of the dataset. + +###### Limitations + +- Despite the practical applications of the Lilliefors test in validating normality, it does come with some +limitations. +- It is only capable of testing unidimensional data, thus rendering it ineffective for datasets with interactions +between features or multi-dimensional phenomena. +- The test might not be as sensitive as some other tests (like the Anderson-Darling test) in detecting deviations +from a normal distribution. +- Like any other statistical test, Lilliefors test may also produce false positives or negatives. Hence, banking +solely on this test, without considering other characteristics of the data, may give rise to risks. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd new file mode 100644 index 000000000..a1ee08730 --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -0,0 +1,58 @@ +--- +title: PredictionProbabilitiesHistogram +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### PredictionProbabilitiesHistogram + +Assesses the predictive probability distribution for binary classification to evaluate model performance and +potential overfitting or bias. + +###### Purpose + +The Prediction Probabilities Histogram test is designed to generate histograms displaying the Probability of +Default (PD) predictions for both positive and negative classes in training and testing datasets. This helps in +evaluating the performance of a classification model. + +###### Test Mechanism + +The metric follows these steps to execute the test: + +- Extracts the target column from both the train and test datasets. +- Uses the model's predict function to calculate probabilities. +- Adds these probabilities as a new column to the training and testing dataframes. +- Generates histograms for each class (0 or 1) within the training and testing datasets. +- Sets different opacities for the histograms to enhance visualization. +- Overlays the four histograms (two for training and two for testing) on two different subplot frames. +- Returns a plotly graph object displaying the visualization. + +###### Signs of High Risk + +- Significant discrepancies between the histograms of training and testing data. +- Large disparities between the histograms for the positive and negative classes. +- Potential overfitting or bias indicated by significant issues. +- Unevenly distributed probabilities suggesting inaccurate model predictions. + +###### Strengths + +- Offers a visual representation of the PD predictions made by the model, aiding in understanding its behavior. +- Assesses both the training and testing datasets, adding depth to model validation. +- Highlights disparities between classes, providing insights into class imbalance or data skewness. +- Effectively visualizes risk spread, which is particularly beneficial for credit risk prediction. + +###### Limitations + +- Specifically tailored for binary classification scenarios and not suited for multi-class classification tasks. +- Provides a robust visual representation but lacks a quantifiable measure to assess model performance. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd new file mode 100644 index 000000000..6b75765a5 --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -0,0 +1,61 @@ +--- +title: RegressionCoeffs +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### RegressionCoeffs + +Assesses the significance and uncertainty of predictor variables in a regression model through visualization of +coefficients and their 95% confidence intervals. + +###### Purpose + +The `RegressionCoeffs` metric visualizes the estimated regression coefficients alongside their 95% confidence intervals, +providing insights into the impact and significance of predictor variables on the response variable. This visualization +helps to understand the variability and uncertainty in the model's estimates, aiding in the evaluation of the +significance of each predictor. + +###### Test Mechanism + +The function operates by extracting the estimated coefficients and their standard errors from the regression model. +Using these, it calculates the confidence intervals at a 95% confidence level, which indicates the range within which +the true coefficient value is expected to fall 95% of the time. The confidence intervals are computed using the +Z-value associated with the 95% confidence level. The coefficients and their confidence intervals are then visualized +in a bar plot. The x-axis represents the predictor variables, the y-axis represents the estimated coefficients, and +the error bars depict the confidence intervals. + +###### Signs of High Risk + +- The confidence interval for a coefficient contains the zero value, suggesting that the predictor may not significantly +contribute to the model. +- Multiple coefficients with confidence intervals that include zero, potentially indicating issues with model reliability. +- Very wide confidence intervals, which may suggest high uncertainty in the coefficient estimates and potential model +instability. + +###### Strengths + +- Provides a clear visualization that allows for easy interpretation of the significance and impact of predictor +variables. +- Includes confidence intervals, which provide additional information about the uncertainty surrounding each coefficient +estimate. + +###### Limitations + +- The method assumes normality of residuals and independence of observations, assumptions that may not always hold true +in practice. +- It does not address issues related to multi-collinearity among predictor variables, which can affect the interpretation +of coefficients. +- This metric is limited to regression tasks using tabular data and is not applicable to other types of machine learning +tasks or data structures. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd new file mode 100644 index 000000000..0a1db1c25 --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -0,0 +1,56 @@ +--- +title: RegressionFeatureSignificance +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### RegressionFeatureSignificance + +Assesses and visualizes the statistical significance of features in a regression model. + +###### Purpose + +The Regression Feature Significance metric assesses the significance of each feature in a given set of regression +model. It creates a visualization displaying p-values for every feature of the model, assisting model developers +in understanding which features are most influential in their model. + +###### Test Mechanism + +The test mechanism involves extracting the model's coefficients and p-values for each feature, and then plotting these +values. The x-axis on the plot contains the p-values while the y-axis denotes the coefficients of each feature. A +vertical red line is drawn at the threshold for p-value significance, which is 0.05 by default. Any features with +p-values to the left of this line are considered statistically significant at the chosen level. + +###### Signs of High Risk + +- Any feature with a high p-value (greater than the threshold) is considered a potential high risk, as it suggests +the feature is not statistically significant and may not be reliably contributing to the model's predictions. +- A high number of such features may indicate problems with the model validation, variable selection, and overall +reliability of the model predictions. + +###### Strengths + +- Helps identify the features that significantly contribute to a model's prediction, providing insights into the +feature importance. +- Provides tangible, easy-to-understand visualizations to interpret the feature significance. + +###### Limitations + +- This metric assumes model features are independent, which may not always be the case. Multicollinearity (high +correlation amongst predictors) can cause high variance and unreliable statistical tests of significance. +- The p-value strategy for feature selection doesn't take into account the magnitude of the effect, focusing solely +on whether the feature is likely non-zero. +- This test is specific to regression models and wouldn't be suitable for other types of ML models. +- P-value thresholds are somewhat arbitrary and do not always indicate practical significance, only statistical +significance. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd new file mode 100644 index 000000000..89306e553 --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -0,0 +1,58 @@ +--- +title: RegressionModelForecastPlot +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### RegressionModelForecastPlot + +Generates plots to visually compare the forecasted outcomes of a regression model against actual observed values over +a specified date range. + +###### Purpose + +This metric is useful for time-series models or any model where the outcome changes over time, allowing direct +comparison of predicted vs actual values. It can help identify overfitting or underfitting situations as well as +general model performance. + +###### Test Mechanism + +This test generates a plot with the x-axis representing the date ranging from the specified "start_date" to the +"end_date", while the y-axis shows the value of the outcome variable. Two lines are plotted**: one representing the +forecasted values and the other representing the observed values. The "start_date" and "end_date" can be parameters +of this test; if these parameters are not provided, they are set to the minimum and maximum date available in the +dataset. + +###### Signs of High Risk + +- High risk or failure signs could be deduced visually from the plots if the forecasted line significantly deviates +from the observed line, indicating the model's predicted values are not matching actual outcomes. +- A model that struggles to handle the edge conditions like maximum and minimum data points could also be +considered a sign of risk. + +###### Strengths + +- Visualization: The plot provides an intuitive and clear illustration of how well the forecast matches the actual +values, making it straightforward even for non-technical stakeholders to interpret. +- Flexibility: It allows comparison for multiple models and for specified time periods. +- Model Evaluation: It can be useful in identifying overfitting or underfitting situations, as these will manifest +as discrepancies between the forecasted and observed values. + +###### Limitations + +- Interpretation Bias: Interpretation of the plot is subjective and can lead to different conclusions by different +evaluators. +- Lack of Precision: Visual representation might not provide precise values of the deviation. +- Inapplicability: Limited to cases where the order of data points (time-series) matters, it might not be of much +use in problems that are not related to time series prediction. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd new file mode 100644 index 000000000..72291adf4 --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -0,0 +1,56 @@ +--- +title: RegressionModelForecastPlotLevels +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### integrate_diff + + +#### RegressionModelForecastPlotLevels + +Assesses the alignment between forecasted and observed values in regression models through visual plots + +###### Purpose + +This test aims to visually assess the performance of a regression model by comparing its forecasted values against +the actual observed values for both the raw and transformed (integrated) data. This helps determine the accuracy +of the model and can help identify overfitting or underfitting. The integration is applied to highlight the trend +rather than the absolute level. + +###### Test Mechanism + +This test generates two plots: + +- Raw data vs forecast +- Transformed data vs forecast + +The transformed data is created by performing a cumulative sum on the raw data. + +###### Signs of High Risk + +- Significant deviation between forecasted and observed values. +- Patterns suggesting overfitting or underfitting. +- Large discrepancies in the plotted forecasts, indicating potential issues with model generalizability and +precision. + +###### Strengths + +- Provides an intuitive, visual way to assess multiple regression models, aiding in easier interpretation and +evaluation of forecast accuracy. + +###### Limitations + +- Relies heavily on visual interpretation, which may vary between individuals. +- Does not provide a numerical metric to quantify forecast accuracy, relying solely on visual assessment. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd new file mode 100644 index 000000000..b408e298a --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -0,0 +1,62 @@ +--- +title: RegressionModelSensitivityPlot +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### integrate_diff + + +#### RegressionModelSensitivityPlot + +Assesses the sensitivity of a regression model to changes in independent variables by applying shocks and +visualizing the impact. + +###### Purpose + +The Regression Sensitivity Plot test is designed to perform sensitivity analysis on regression models. This test +aims to measure the impact of slight changes (shocks) applied to individual variables on the system's outcome while +keeping all other variables constant. By doing so, it analyzes the effects of each independent variable on the +dependent variable within the regression model, helping identify significant risk factors that could substantially +influence the model's output. + +###### Test Mechanism + +This test operates by initially applying shocks of varying magnitudes, defined by specific parameters, to each of +the model's features, one at a time. With all other variables held constant, a new prediction is made for each +dataset subjected to shocks. Any changes in the model's predictions are directly attributed to the shocks applied. +If the transformation parameter is set to "integrate," initial predictions and target values undergo transformation +via an integration function before being plotted. Finally, a plot demonstrating observed values against predicted +values for each model is generated, showcasing a distinct line graph illustrating predictions for each shock. + +###### Signs of High Risk + +- Drastic alterations in model predictions due to minor shocks to an individual variable, indicating high +sensitivity and potential over-dependence on that variable. +- Unusually high or unpredictable shifts in response to shocks, suggesting potential model instability or +overfitting. + +###### Strengths + +- Helps identify variables that strongly influence model outcomes, aiding in understanding feature importance. +- Generates visual plots, making results easily interpretable even to non-technical stakeholders. +- Useful in identifying overfitting and detecting unstable models that react excessively to minor variable changes. + +###### Limitations + +- Operates on the assumption that all other variables remain unchanged during the application of a shock, which may +not reflect real-world interdependencies. +- Best compatible with linear models and may not effectively evaluate the sensitivity of non-linear models. +- Provides a visual representation without a numerical risk measure, potentially introducing subjectivity in +interpretation. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd new file mode 100644 index 000000000..5e51f4769 --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -0,0 +1,49 @@ +--- +title: RegressionModelSummary +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### RegressionModelSummary + +Evaluates regression model performance using metrics including R-Squared, Adjusted R-Squared, MSE, and RMSE. + +###### Purpose + +The Regression Model Summary test evaluates the performance of regression models by measuring their predictive +ability regarding dependent variables given changes in the independent variables. It uses conventional regression +metrics such as R-Squared, Adjusted R-Squared, Mean Squared Error (MSE), and Root Mean Squared Error (RMSE) to +assess the model's accuracy and fit. + +###### Test Mechanism + +This test uses the sklearn library to calculate the R-Squared, Adjusted R-Squared, MSE, and RMSE. It outputs a +table with the results of these metrics along with the feature columns used by the model. + +###### Signs of High Risk + +- Low R-Squared and Adjusted R-Squared values. +- High MSE and RMSE values. + +###### Strengths + +- Offers an extensive evaluation of regression models by combining four key measures of model accuracy and fit. +- Provides a comprehensive view of the model's performance. +- Both the R-Squared and Adjusted R-Squared measures are readily interpretable. + +###### Limitations + +- RMSE and MSE might be sensitive to outliers. +- A high R-Squared or Adjusted R-Squared may not necessarily indicate a good model, especially in cases of +overfitting. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd new file mode 100644 index 000000000..e62194323 --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -0,0 +1,53 @@ +--- +title: RegressionPermutationFeatureImportance +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### RegressionPermutationFeatureImportance + +Assesses the significance of each feature in a model by evaluating the impact on model performance when feature +values are randomly rearranged. + +###### Purpose + +The primary purpose of this metric is to determine which features significantly impact the performance of a +regression model developed using statsmodels. The metric measures how much the prediction accuracy deteriorates +when each feature's values are permuted. + +###### Test Mechanism + +This metric shuffles the values of each feature one at a time in the dataset, computes the model's performance +after each permutation, and compares it to the baseline performance. A significant decrease in performance +indicates the importance of the feature. + +###### Signs of High Risk + +- Significant reliance on a feature that, when permuted, leads to a substantial decrease in performance, suggesting +overfitting or high model dependency on that feature. +- Features identified as unimportant despite known impacts from domain knowledge, suggesting potential issues in +model training or data preprocessing. + +###### Strengths + +- Directly assesses the impact of each feature on model performance, providing clear insights into model +dependencies. +- Model-agnostic within the scope of statsmodels, applicable to any regression model that outputs predictions. + +###### Limitations + +- The metric is specific to statsmodels and cannot be used with other types of models without adaptation. +- It does not capture interactions between features, which can lead to underestimating the importance of correlated +features. +- Assumes independence of features when calculating importance, which might not always hold true. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd new file mode 100644 index 000000000..574eda508 --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -0,0 +1,62 @@ +--- +title: ScorecardHistogram +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### ScorecardHistogram + +The Scorecard Histogram test evaluates the distribution of credit scores between default and non-default instances, +providing critical insights into the performance and generalizability of credit-risk models. + +###### Purpose + +The Scorecard Histogram test metric provides a visual interpretation of the credit scores generated by a machine +learning model for credit-risk classification tasks. It aims to compare the alignment of the model's scoring +decisions with the actual outcomes of credit loan applications. It helps in identifying potential discrepancies +between the model's predictions and real-world risk levels. + +###### Test Mechanism + +This metric uses logistic regression to generate a histogram of credit scores for both default (negative class) and +non-default (positive class) instances. Using both training and test datasets, the metric calculates the credit +score of each instance with a scorecard method, considering the impact of different features on the likelihood of +default. It includes the default point to odds (PDO) scaling factor and predefined target score and odds settings. +Histograms for training and test sets are computed and plotted separately to offer insights into the model's +generalizability to unseen data. + +###### Signs of High Risk + +- Discrepancies between the distributions of training and testing data, indicating a model's poor generalization +ability +- Skewed distributions favoring specific scores or classes, representing potential bias + +###### Strengths + +- Provides a visual interpretation of the model's credit scoring system, enhancing comprehension of model behavior +- Enables a direct comparison between actual and predicted scores for both training and testing data +- Its intuitive visualization helps understand the model's ability to differentiate between positive and negative +classes +- Can unveil patterns or anomalies not easily discerned through numerical metrics alone + +###### Limitations + +- Despite its value for visual interpretation, it doesn't quantify the performance of the model and therefore may +lack precision for thorough model evaluation +- The quality of input data can strongly influence the metric, as bias or noise in the data will affect both the +score calculation and resultant histogram +- Its specificity to credit scoring models limits its applicability across a wider variety of machine learning +tasks and models +- The metric's effectiveness is somewhat tied to the subjective interpretation of the analyst, relying on their +judgment of the characteristics and implications of the plot. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd new file mode 100644 index 000000000..a815eb803 --- /dev/null +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -0,0 +1,20 @@ +--- +title: statsutils +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### adj_r2_score + +Adjusted R2 Score + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/prompt_validation.qmd b/docs/validmind/tests/prompt_validation.qmd new file mode 100644 index 000000000..442a5f143 --- /dev/null +++ b/docs/validmind/tests/prompt_validation.qmd @@ -0,0 +1,19 @@ +--- +title: prompt_validation +toc-depth: 3 +toc-expand: 3 +--- + + + + + +- [ai_powered_test](prompt_validation/ai_powered_test.qmd) +- [Bias](prompt_validation/Bias.qmd) +- [Clarity](prompt_validation/Clarity.qmd) +- [Conciseness](prompt_validation/Conciseness.qmd) +- [Delimitation](prompt_validation/Delimitation.qmd) +- [NegativeInstruction](prompt_validation/NegativeInstruction.qmd) +- [Robustness](prompt_validation/Robustness.qmd) +- [Specificity](prompt_validation/Specificity.qmd) + diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd new file mode 100644 index 000000000..ff66fb117 --- /dev/null +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -0,0 +1,65 @@ +--- +title: Bias +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### Bias + +Assesses potential bias in a Large Language Model by analyzing the distribution and order of exemplars in the +prompt. + +###### Purpose + +The Bias Evaluation test calculates if and how the order and distribution of exemplars (examples) in a few-shot +learning prompt affect the output of a Large Language Model (LLM). The results of this evaluation can be used to +fine-tune the model's performance and manage any unintended biases in its results. + +###### Test Mechanism + +This test uses two checks: + +1. **Distribution of Exemplars:** The number of positive vs. negative examples in a prompt is varied. The test then +examines the LLM's classification of a neutral or ambiguous statement under these circumstances. +2. **Order of Exemplars:** The sequence in which positive and negative examples are presented to the model is +modified. Their resultant effect on the LLM's response is studied. + +For each test case, the LLM grades the input prompt on a scale of 1 to 10. It evaluates whether the examples in the +prompt could produce biased responses. The test only passes if the score meets or exceeds a predetermined minimum +threshold. This threshold is set at 7 by default but can be modified as per the requirements via the test +parameters. + +###### Signs of High Risk + +- A skewed result favoring either positive or negative responses may suggest potential bias in the model. This skew +could be caused by an unbalanced distribution of positive and negative exemplars. +- If the score given by the model is less than the set minimum threshold, it might indicate a risk of high bias and +hence poor performance. + +###### Strengths + +- This test provides a quantitative measure of potential bias, offering clear guidelines for developers about +whether their Large Language Model (LLM) contains significant bias. +- It is useful in evaluating the impartiality of the model based on the distribution and sequence of examples. +- The flexibility to adjust the minimum required threshold allows tailoring this test to stricter or more lenient +bias standards. + +###### Limitations + +- The test may not pick up on more subtle forms of bias or biases that are not directly related to the distribution +or order of exemplars. +- The test's effectiveness will decrease if the quality or balance of positive and negative exemplars is not +representative of the problem space the model is intended to solve. +- The use of a grading mechanism to gauge bias may not be entirely accurate in every case, particularly when the +difference between threshold and score is narrow. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd new file mode 100644 index 000000000..d870ee3b0 --- /dev/null +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -0,0 +1,53 @@ +--- +title: Clarity +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### Clarity + +Evaluates and scores the clarity of prompts in a Large Language Model based on specified guidelines. + +###### Purpose + +The Clarity evaluation metric is used to assess how clear the prompts of a Large Language Model (LLM) are. This +assessment is particularly important because clear prompts assist the LLM in more accurately interpreting and +responding to instructions. + +###### Test Mechanism + +The evaluation uses an LLM to scrutinize the clarity of prompts, factoring in considerations such as the inclusion +of relevant details, persona adoption, step-by-step instructions, usage of examples, and specification of desired +output length. Each prompt is rated on a clarity scale of 1 to 10, and any prompt scoring at or above the preset +threshold (default of 7) will be marked as clear. It is important to note that this threshold can be adjusted via +test parameters, providing flexibility in the evaluation process. + +###### Signs of High Risk + +- Prompts that consistently score below the clarity threshold +- Repeated failure of prompts to adhere to guidelines for clarity, including detail inclusion, persona adoption, +explicit step-by-step instructions, use of examples, and specification of output length + +###### Strengths + +- Encourages the development of more effective prompts that aid the LLM in interpreting instructions accurately +- Applies a quantifiable measure (a score from 1 to 10) to evaluate the clarity of prompts +- Threshold for clarity is adjustable, allowing for flexible evaluation depending on the context + +###### Limitations + +- Scoring system is subjective and relies on the AI’s interpretation of 'clarity' +- The test assumes that all required factors (detail inclusion, persona adoption, step-by-step instructions, use of +examples, and specification of output length) contribute equally to clarity, which might not always be the case +- The evaluation may not be as effective if used on non-textual models + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd new file mode 100644 index 000000000..15ffb9681 --- /dev/null +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -0,0 +1,53 @@ +--- +title: Conciseness +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### Conciseness + +Analyzes and grades the conciseness of prompts provided to a Large Language Model. + +###### Purpose + +The Conciseness Assessment is designed to evaluate the brevity and succinctness of prompts provided to a Language +Learning Model (LLM). A concise prompt strikes a balance between offering clear instructions and eliminating +redundant or unnecessary information, ensuring that the LLM receives relevant input without being overwhelmed. + +###### Test Mechanism + +Using an LLM, this test conducts a conciseness analysis on input prompts. The analysis grades the prompt on a scale +from 1 to 10, where the grade reflects how well the prompt delivers clear instructions without being verbose. +Prompts that score equal to or above a predefined threshold (default set to 7) are deemed successfully concise. +This threshold can be adjusted to meet specific requirements. + +###### Signs of High Risk + +- Prompts that consistently score below the predefined threshold. +- Prompts that are overly wordy or contain unnecessary information. +- Prompts that create confusion or ambiguity due to excess or unnecessary information. + +###### Strengths + +- Ensures clarity and effectiveness of the prompts. +- Promotes brevity and preciseness in prompts without sacrificing essential information. +- Useful for models like LLMs, where input prompt length and clarity greatly influence model performance. +- Provides a quantifiable measure of prompt conciseness. + +###### Limitations + +- The conciseness score is based on an AI's assessment, which might not fully capture human interpretation of +conciseness. +- The predefined threshold for conciseness could be subjective and might need adjustment based on application. +- The test is dependent on the LLM’s understanding of conciseness, which might vary from model to model. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd new file mode 100644 index 000000000..d6fb54547 --- /dev/null +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -0,0 +1,54 @@ +--- +title: Delimitation +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### Delimitation + +Evaluates the proper use of delimiters in prompts provided to Large Language Models. + +###### Purpose + +The Delimitation Test aims to assess whether prompts provided to the Language Learning Model (LLM) correctly use +delimiters to mark different sections of the input. Well-delimited prompts help simplify the interpretation process +for the LLM, ensuring that the responses are precise and accurate. + +###### Test Mechanism + +The test employs an LLM to examine prompts for appropriate use of delimiters such as triple quotation marks, XML +tags, and section titles. Each prompt is assigned a score from 1 to 10 based on its delimitation integrity. Prompts +with scores equal to or above the preset threshold (which is 7 by default, although it can be adjusted as +necessary) pass the test. + +###### Signs of High Risk + +- Prompts missing, improperly placed, or incorrectly used delimiters, leading to misinterpretation by the LLM. +- High-risk scenarios with complex prompts involving multiple tasks or diverse data where correct delimitation is +crucial. +- Scores below the threshold, indicating a high risk. + +###### Strengths + +- Ensures clarity in demarcating different components of given prompts. +- Reduces ambiguity in understanding prompts, especially for complex tasks. +- Provides a quantified insight into the appropriateness of delimiter usage, aiding continuous improvement. + +###### Limitations + +- Only checks for the presence and placement of delimiters, not whether the correct delimiter type is used for the +specific data or task. +- May not fully reveal the impacts of poor delimitation on the LLM's final performance. +- The preset score threshold may not be refined enough for complex tasks and prompts, requiring regular manual +adjustment. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd new file mode 100644 index 000000000..d97ad58f4 --- /dev/null +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -0,0 +1,59 @@ +--- +title: NegativeInstruction +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### NegativeInstruction + +Evaluates and grades the use of affirmative, proactive language over negative instructions in LLM prompts. + +###### Purpose + +The Negative Instruction test is utilized to scrutinize the prompts given to a Large Language Model (LLM). The +objective is to ensure these prompts are expressed using proactive, affirmative language. The focus is on +instructions indicating what needs to be done rather than what needs to be avoided, thereby guiding the LLM more +efficiently towards the desired output. + +###### Test Mechanism + +An LLM is employed to evaluate each prompt. The prompt is graded based on its use of positive instructions with +scores ranging between 1-10. This grade reflects how effectively the prompt leverages affirmative language while +shying away from negative or restrictive instructions. A prompt that attains a grade equal to or above a +predetermined threshold (7 by default) is regarded as adhering effectively to the best practices of positive +instruction. This threshold can be custom-tailored through the test parameters. + +###### Signs of High Risk + +- Low score obtained from the LLM analysis, indicating heavy reliance on negative instructions in the prompts. +- Failure to surpass the preset minimum threshold. +- The LLM generates ambiguous or undesirable outputs as a consequence of the negative instructions used in the +prompt. + +###### Strengths + +- Encourages the usage of affirmative, proactive language in prompts, aiding in more accurate and advantageous +model responses. +- The test result provides a comprehensible score, helping to understand how well a prompt follows the positive +instruction best practices. + +###### Limitations + +- Despite an adequate score, a prompt could still be misleading or could lead to undesired responses due to factors +not covered by this test. +- The test necessitates an LLM for evaluation, which might not be available or feasible in certain scenarios. +- A numeric scoring system, while straightforward, may oversimplify complex issues related to prompt designing and +instruction clarity. +- The effectiveness of the test hinges significantly on the predetermined threshold level, which can be subjective +and may need to be adjusted according to specific use-cases. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd new file mode 100644 index 000000000..181c34d52 --- /dev/null +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -0,0 +1,57 @@ +--- +title: Robustness +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### Robustness + +Assesses the robustness of prompts provided to a Large Language Model under varying conditions and contexts. This test +specifically measures the model's ability to generate correct classifications with the given prompt even when the +inputs are edge cases or otherwise difficult to classify. + +###### Purpose + +The Robustness test is meant to evaluate the resilience and reliability of prompts provided to a Language Learning +Model (LLM). The aim of this test is to guarantee that the prompts consistently generate accurate and expected +outputs, even in diverse or challenging scenarios. This test is only applicable to LLM-powered text classification +tasks where the prompt has a single input variable. + +###### Test Mechanism + +The Robustness test appraises prompts under various conditions, alterations, and contexts to ascertain their +stability in producing consistent responses from the LLM. Factors evaluated include different phrasings, inclusion +of potential distracting elements, and various input complexities. By default, the test generates 10 inputs for a +prompt but can be adjusted according to test parameters. + +###### Signs of High Risk + +- If the output from the tests diverges extensively from the expected results, this indicates high risk. +- When the prompt doesn't give a consistent performance across various tests. +- A high risk is indicated when the prompt is susceptible to breaking, especially when the output is expected to be +of a specific type. + +###### Strengths + +- The robustness test helps to ensure stable performance of the LLM prompts and lowers the chances of generating +unexpected or off-target outputs. +- This test is vital for applications where predictability and reliability of the LLM’s output are crucial. + +###### Limitations + +- Currently, the test only supports single-variable prompts, which restricts its application to more complex models. +- When there are too many target classes (over 10), the test is skipped, which can leave potential vulnerabilities +unchecked in complex multi-class models. +- The test may not account for all potential conditions or alterations that could show up in practical use +scenarios. + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd new file mode 100644 index 000000000..1f6c247ef --- /dev/null +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -0,0 +1,55 @@ +--- +title: Specificity +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### Specificity + +Evaluates and scores the specificity of prompts provided to a Large Language Model (LLM), based on clarity, detail, +and relevance. + +###### Purpose + +The Specificity Test evaluates the clarity, precision, and effectiveness of the prompts provided to a Language +Model (LLM). It aims to ensure that the instructions embedded in a prompt are indisputably clear and relevant, +thereby helping to remove ambiguity and steer the LLM towards desired outputs. This level of specificity +significantly affects the accuracy and relevance of LLM outputs. + +###### Test Mechanism + +The Specificity Test employs an LLM to grade each prompt based on clarity, detail, and relevance parameters within +a specificity scale that extends from 1 to 10. On this scale, prompts scoring equal to or more than a predefined +threshold (set to 7 by default) pass the evaluation, while those scoring below this threshold fail it. Users can +adjust this threshold as per their requirements. + +###### Signs of High Risk + +- Prompts scoring consistently below the established threshold +- Vague or ambiguous prompts that do not provide clear direction to the LLM +- Overly verbose prompts that may confuse the LLM instead of providing clear guidance + +###### Strengths + +- Enables precise and clear communication with the LLM to achieve desired outputs +- Serves as a crucial means to measure the effectiveness of prompts +- Highly customizable, allowing users to set their threshold based on specific use cases + +###### Limitations + +- This test doesn't consider the content comprehension capability of the LLM +- High specificity score doesn't guarantee a high-quality response from the LLM, as the model's performance is also +dependent on various other factors +- Striking a balance between specificity and verbosity can be challenging, as overly detailed prompts might confuse +or mislead the model + + + + + \ No newline at end of file diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd new file mode 100644 index 000000000..72ae98c8e --- /dev/null +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -0,0 +1,44 @@ +--- +title: ai_powered_test +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### call_model + +Call LLM with the given prompts and return the response + + + + + +#### get_explanation + +Get just the explanation from the response string +- **TODO****: use json response mode instead of this + +- **e.g. "Score**: 8 +Explanation: " -> "" + + + + + +#### get_score + +Get just the score from the response string +- **TODO****: use json response mode instead of this + +- **e.g. "Score**: 8 +Explanation: " -> 8 + + + + + \ No newline at end of file diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd new file mode 100644 index 000000000..1a70bbbfe --- /dev/null +++ b/docs/validmind/unit_metrics.qmd @@ -0,0 +1,36 @@ +--- +title: unit_metrics +toc-depth: 3 +toc-expand: 3 +--- + + + + + + + +#### describe_metric + +Describe a metric + + + + + +#### list_metrics + +List all metrics + + + + + +#### run_metric + +Run a metric + + + + + \ No newline at end of file diff --git a/docs/validmind/validmind.qmd b/docs/validmind/validmind.qmd deleted file mode 100644 index c0f128f78..000000000 --- a/docs/validmind/validmind.qmd +++ /dev/null @@ -1,14394 +0,0 @@ ---- -title: ValidMind Library -toc-depth: 4 -toc-expand: 4 -toc-location: left -toc-title: "" ---- - -The ValidMind Library is a suite of developer tools and methods designed to automate the documentation and validation of your models. - -Designed to be model agnostic, the ValidMind Library provides all the standard functionality without requiring you to rewrite any functions as long as your model is built in Python. - -With a rich array of documentation tools and test suites, from documenting descriptions of your datasets to testing your models for weak spots and overfit areas, the ValidMind Library helps you automate model documentation by feeding the ValidMind Platform with documentation artifacts and test results. - -To install the ValidMind Library: - -```bash -pip install validmind -``` - -To initialize the ValidMind Library, paste the code snippet with the model identifier credentials directly into your development source code, replacing this example with your own: - -```python -import validmind as vm - -vm.init( - api_host = "https://api.dev.vm.validmind.ai/api/v1/tracking/tracking", - api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", - api_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", - project = "" -) -``` - -After you have pasted the code snippet into your development source code and executed the code, the Python Library API will register with ValidMind. You can now use the ValidMind Library to document and test your models, and to upload to the ValidMind Platform. - -## Python Library API - - -### RawData() - - -**Import Path**: `validmind.vm_models.result.RawData` - -### \_\_version\_\_ - -```python -2.8.0 -``` - - -### get_test_suite() - -```python -def get_test_suite( - test_suite_id: str = None, - section: str = None, - args = (), - kwargs = {} -) -> validmind.vm_models.TestSuite: -``` - -Gets a TestSuite object for the current project or a specific test suite - -This function provides an interface to retrieve the TestSuite instance for the -current project or a specific TestSuite instance identified by test_suite_id. -The project Test Suite will contain sections for every section in the project's -documentation template and these Test Suite Sections will contain all the tests -associated with that template section. - -**Arguments** - -- **test_suite_id (str, optional)****: The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. -- **section (str, optional)**: The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. -- **args**: Additional arguments to pass to the TestSuite -- **kwargs**: Additional keyword arguments to pass to the TestSuite - -### init() - -```python -def init( - project: Optional = None, - api_key: Optional = None, - api_secret: Optional = None, - api_host: Optional = None, - model: Optional = None, - monitoring: bool = False -) -``` - -Initializes the API client instances and calls the /ping endpoint to ensure -the provided credentials are valid and we can connect to the ValidMind API. - -If the API key and secret are not provided, the client will attempt to -retrieve them from the environment variables `VM_API_KEY` and `VM_API_SECRET`. - -**Arguments** - -- **project (str, optional)****: The project CUID. Alias for model. Defaults to None. ^[**Deprecation notice**
`project (str, optional)**` has been deprecated and will be removed in a future release.] -- **model (str, optional)**: The model CUID. Defaults to None. -- **api_key (str, optional)**: The API key. Defaults to None. -- **api_secret (str, optional)**: The API secret. Defaults to None. -- **api_host (str, optional)**: The API host. Defaults to None. -- **monitoring (bool)**: The ongoing monitoring flag. Defaults to False. - -**Raises** - -- **ValueError**: If the API key and secret are not provided - -### init_dataset() - -```python -def init_dataset( - dataset, - model = None, - index = None, - index_name: str = None, - date_time_index: bool = False, - columns: list = None, - text_column: str = None, - target_column: str = None, - feature_columns: list = None, - extra_columns: dict = None, - class_labels: dict = None, - type: str = None, - input_id: str = None, - __log = True -) -> validmind.vm_models.dataset.VMDataset: -``` - -Initializes a VM Dataset, which can then be passed to other functions -that can perform additional analysis and tests on the data. This function -also ensures we are reading a valid dataset type. - -The following dataset types are supported: - -- Pandas DataFrame -- Polars DataFrame -- Numpy ndarray -- Torch TensorDataset - -**Arguments** - -- **dataset ****: dataset from various python libraries -- **model (VMModel)**: ValidMind model object -- **targets (vm.vm.DatasetTargets)**: A list of target variables -- **target_column (str)**: The name of the target column in the dataset -- **feature_columns (list)**: A list of names of feature columns in the dataset -- **extra_columns (dictionary)**: A dictionary containing the names of the -- prediction_column and group_by_columns in the dataset -- **class_labels (dict)**: A list of class labels for classification problems -- **type (str)**: The type of dataset (one of DATASET_TYPES) -- **input_id (str)**: The input ID for the dataset (e.g. "my_dataset"). By default, this will be set to `dataset` but if you are passing this dataset as a test input using some other key than `dataset`, then you should set this to the same key. - -**Raises** - -- **ValueError**: If the dataset type is not supported - -**Returns** - -- **vm.vm.Dataset**: A VM Dataset instance - -### init_model() - -```python -def init_model( - model: object = None, - input_id: str = 'model', - attributes: dict = None, - predict_fn: callable = None, - __log = True, - kwargs = {} -) -> validmind.vm_models.model.VMModel: -``` - -Initializes a VM Model, which can then be passed to other functions -that can perform additional analysis and tests on the data. This function -also ensures we are creating a model supported libraries. - -**Arguments** - -- **model****: A trained model or VMModel instance -- **input_id (str)**: The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. -- **attributes (dict)**: A dictionary of model attributes -- **predict_fn (callable)**: A function that takes an input and returns a prediction -- ****kwargs**: Additional arguments to pass to the model - -**Raises** - -- **ValueError**: If the model type is not supported - -**Returns** - -- **vm.VMModel**: A VM Model instance - -### init_r_model() - -```python -def init_r_model( - model_path: str, - input_id: str = 'model' -) -> validmind.vm_models.model.VMModel: -``` - -Initializes a VM Model for an R model - -R models must be saved to disk and the filetype depends on the model type... -Currently we support the following model types: - -- LogisticRegression `glm` model in R**: saved as an RDS file with `saveRDS` -- LinearRegression `lm` model in R: saved as an RDS file with `saveRDS` -- XGBClassifier: saved as a .json or .bin file with `xgb.save` -- XGBRegressor: saved as a .json or .bin file with `xgb.save` - -LogisticRegression and LinearRegression models are converted to sklearn models by extracting -the coefficients and intercept from the R model. XGB models are loaded using the xgboost -since xgb models saved in .json or .bin format can be loaded directly with either Python or R - -**Arguments** - -- **model_path (str)**: The path to the R model saved as an RDS or XGB file -- **model_type (str)**: The type of the model (one of R_MODEL_TYPES) - -**Returns** - -- **vm.vm.Model**: A VM Model instance - -### log_metric() - -```python -def log_metric( - key: str, - value: float, - inputs: Optional = None, - params: Optional = None, - recorded_at: Optional = None, - thresholds: Optional = None -) -``` - -Logs a unit metric - -Unit metrics are key-value pairs where the key is the metric name and the value is -a scalar (int or float). These key-value pairs are associated with the currently -selected model (inventory model in the ValidMind Platform) and keys can be logged -to over time to create a history of the metric. On the ValidMind Platform, these metrics -will be used to create plots/visualizations for documentation and dashboards etc. - -**Arguments** - -- **key (str)****: The metric key -- **value (float)**: The metric value -- **inputs (list, optional)**: A list of input IDs that were used to compute the metric. -- **params (dict, optional)**: Dictionary of parameters used to compute the metric. -- **recorded_at (str, optional)**: The timestamp of the metric. Server will use current time if not provided. -- **thresholds (dict, optional)**: Dictionary of thresholds for the metric. - -### preview_template() - -```python -def preview_template() -``` - -Preview the documentation template for the current project - -This function will display the documentation template for the current project. If -the project has not been initialized, then an error will be raised. - -**Raises** - -- **ValueError****: If the project has not been initialized - -### print_env() - - -**Import Path**: `validmind.tests.run.print_env` - -### reload() - -```python -def reload() -``` - -Reconnect to the ValidMind API and reload the project configuration - -### run_documentation_tests() - -```python -def run_documentation_tests( - section = None, - send = True, - fail_fast = False, - inputs = None, - config = None, - kwargs = {} -) -``` - -Collect and run all the tests associated with a template - -This function will analyze the current project's documentation template and collect -all the tests associated with it into a test suite. It will then run the test -suite, log the results to the ValidMind API, and display them to the user. - -**Arguments** - -- **section (str or list, optional)****: The section(s) to preview. Defaults to None. -- **send (bool, optional)**: Whether to send the results to the ValidMind API. Defaults to True. -- **fail_fast (bool, optional)**: Whether to stop running tests after the first failure. Defaults to False. -- **inputs (dict, optional)**: A dictionary of test inputs to pass to the TestSuite -- **config**: A dictionary of test parameters to override the defaults -- ****kwargs**: backwards compatibility for passing in test inputs using keyword arguments - -**Returns** - -- **TestSuite or dict**: The completed TestSuite instance or a dictionary of TestSuites if section is a list. - -**Raises** - -- **ValueError**: If the project has not been initialized - -### run_test_suite() - -```python -def run_test_suite( - test_suite_id, - send = True, - fail_fast = False, - config = None, - inputs = None, - kwargs = {} -) -``` - -High Level function for running a test suite - -This function provides a high level interface for running a test suite. A test suite is -a collection of tests. This function will automatically find the correct test suite -class based on the test_suite_id, initialize each of the tests, and run them. - -**Arguments** - -- **test_suite_id (str)****: The test suite name (e.g. 'classifier_full_suite') -- **config (dict, optional)**: A dictionary of parameters to pass to the tests in the test suite. Defaults to None. -- **send (bool, optional)**: Whether to post the test results to the API. send=False is useful for testing. Defaults to True. -- **fail_fast (bool, optional)**: Whether to stop running tests after the first failure. Defaults to False. -- **inputs (dict, optional)**: A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` `models` etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. -- ****kwargs**: backwards compatibility for passing in test inputs using keyword arguments - -**Raises** - -- **ValueError**: If the test suite name is not found or if there is an error initializing the test suite - -**Returns** - -- **TestSuite**: the TestSuite instance - -### tags() - -```python -def tags(tags* = ()): -``` - - -Decorator for specifying tags for a test. - -**Arguments** - -- ***tags****: The tags to apply to the test. - - -### tasks() - -```python -def tasks(tasks* = ()): -``` - - -Decorator for specifying the task types that a test is designed for. - -**Arguments** - -- ***tasks****: The task types that the test is designed for. - - -### test() - -```python -def test(func_or_id): -``` - - -Decorator for creating and registering custom tests - -This decorator registers the function it wraps as a test function within ValidMind -under the provided ID. Once decorated, the function can be run using the -`validmind.tests.run_test` function. - -The function can take two different types of arguments: - -- Inputs**: ValidMind model or dataset (or list of models/datasets). These arguments - must use the following names: `model`, `models`, `dataset`, `datasets`. -- Parameters: Any additional keyword arguments of any type (must have a default - value) that can have any name. - -The function should return one of the following types: - -- Table: Either a list of dictionaries or a pandas DataFrame -- Plot: Either a matplotlib figure or a plotly figure -- Scalar: A single number (int or float) -- Boolean: A single boolean value indicating whether the test passed or failed - -The function may also include a docstring. This docstring will be used and logged -as the metric's description. - -**Arguments** - -- **func**: The function to decorate -- **test_id**: The identifier for the metric. If not provided, the function name is used. - -**Returns** - -- The decorated function. - - -## Submodules - - - - - - -### \_\_version\_\_ - - - - - - - - -### datasets - - -Example datasets that can be used with the ValidMind Library. - -### classification - - -Entrypoint for classification datasets. - - - - -#### customer_churn - - - - - - -####### get_demo_test_config() - -```python -def get_demo_test_config(test_suite = None) -``` - - -Returns input configuration for the default documentation -template assigned to this demo model - -The default documentation template uses the following inputs: - -- raw_dataset -- train_dataset -- test_dataset -- model - -We assign the following inputs depending on the input config expected -by each test: - -- When a test expects a "dataset" we use the raw_dataset -- When a tets expects "datasets" we use the train_dataset and test_dataset -- When a test expects a "model" we use the model -- When a test expects "model" and "dataset" we use the model and test_dataset -- The only exception is ClassifierPerformance since that runs twice**: once -- with the train_dataset (in sample) and once with the test_dataset (out of sample) - - - - -####### load_data() - -```python -def load_data(full_dataset = False) -``` - - - - - -####### preprocess() - -```python -def preprocess(df) -``` - - - - - - - - -#### taiwan_credit - - - - - - -####### load_data() - -```python -def load_data() -``` - - - - - -####### preprocess() - -```python -def preprocess(df) -``` - - - - - - - - - - - - -### credit_risk - - -Entrypoint for credit risk datasets. - - - - -#### lending_club - - - - - - -####### compute_scores() - -```python -def compute_scores(probabilities) -``` - - - - - -####### feature_engineering() - -```python -def feature_engineering(df, verbose = True) -``` - - - - - -####### get_demo_test_config() - -```python -def get_demo_test_config(x_test = None, y_test = None) -``` - - -Get demo test configuration. - -**Arguments** - -- **x_test****: Test features DataFrame -- **y_test**: Test target Series - -**Returns** - -- **dict**: Test configuration dictionary - - - - -####### init_vm_objects() - -```python -def init_vm_objects(scorecard) -``` - - - - - -####### load_data() - -```python -def load_data(source = 'online', verbose = True) -``` - - -Load data from either an online source or offline files, automatically dropping specified columns for offline data. - - -**Parameters** - -- **source**: 'online' for online data, 'offline' for offline files. Defaults to 'online'. - -**Returns** - -- DataFrame containing the loaded data. - - - - -####### load_scorecard() - -```python -def load_scorecard() -``` - - - - - -####### load_test_config() - -```python -def load_test_config(scorecard) -``` - - - - - -####### preprocess() - -```python -def preprocess(df, verbose = True) -``` - - - - - -####### split() - -```python -def split(df, validation_size = None, test_size = 0.2, add_constant = False, verbose = True) -``` - - -Split dataset into train, validation (optional), and test sets. - -**Arguments** - -- **df****: Input DataFrame -- **validation_split**: If None, returns train/test split. If float, returns train/val/test split -- **test_size**: Proportion of data for test set (default: 0.2) -- **add_constant**: Whether to add constant column for statsmodels (default: False) - -**Returns** - -- **If validation_size is None**: train_df, test_df -- **If validation_size is float**: train_df, validation_df, test_df - - - - -####### woe_encoding() - -```python -def woe_encoding(df, verbose = True) -``` - - - - - - - - -#### lending_club_bias - - - - - - -####### compute_scores() - -```python -def compute_scores(probabilities) -``` - - - - - -####### load_data() - -```python -def load_data() -``` - - -Load data from the specified CSV file. - -:return**: DataFrame containing the loaded data. - - - - -####### preprocess() - -```python -def preprocess(df) -``` - - - - - -####### split() - -```python -def split(df, test_size = 0.3) -``` - - - - - - - - - - - - -### nlp - - -Example datasets that can be used with the ValidMind Library. - - - - -#### cnn_dailymail - - - - - - -####### display_nice() - -```python -def display_nice(df, num_rows = None) -``` - - -Primary function to format and display a DataFrame. - - - - -####### load_data() - -```python -def load_data(source = 'online', dataset_size = None) -``` - - -Load data from either online source or offline files. - - -**Parameters** - -- **source**: 'online' for online data, 'offline' for offline data. Defaults to 'online'. - -**Parameters** - -- **dataset_size: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. - -**Returns** - -- DataFrame containing the loaded data. - - - - - - - -#### twitter_covid_19 - - - - - - -####### load_data() - -```python -def load_data(full_dataset = False) -``` - - - - - - - - - - - - -### regression - - -Entrypoint for regression datasets - - - - -#### california_housing - - - - - - -####### load_data() - -```python -def load_data(full_dataset = False) -``` - - - - - -####### preprocess() - -```python -def preprocess(df) -``` - - - - - - - - -#### fred - - - - - - -####### load_all_data() - -```python -def load_all_data() -``` - - - - - -####### load_data() - -```python -def load_data() -``` - - - - - -####### load_model() - -```python -def load_model(model_name) -``` - - - - - -####### load_processed_data() - -```python -def load_processed_data() -``` - - - - - -####### load_test_dataset() - -```python -def load_test_dataset(model_name) -``` - - - - - -####### load_train_dataset() - -```python -def load_train_dataset(model_path) -``` - - - - - -####### preprocess() - -```python -def preprocess(df, split_option = 'train_test_val', train_size = 0.6, test_size = 0.2) -``` - - -Split a time series DataFrame into train, validation, and test sets. - -Parameters: -- **df (pandas.DataFrame)****: The time series DataFrame to be split. -- **split_option (str)**: The split option to choose from: 'train_test_val' (default) or 'train_test'. -- **train_size (float)**: The proportion of the dataset to include in the training set. Default is 0.6. -- **test_size (float)**: The proportion of the dataset to include in the test set. Default is 0.2. - -**Returns** - -- **train_df (pandas.DataFrame)**: The training set. -- **validation_df (pandas.DataFrame)**: The validation set (only returned if split_option is 'train_test_val'). -- **test_df (pandas.DataFrame)**: The test set. - - - - -####### transform() - -```python -def transform(df, transform_func = 'diff') -``` - - - - - - - - -#### fred_timeseries - - - - - - -####### align_date_range() - -```python -def align_date_range(dfs, start_date, end_date) -``` - - - - - -####### convert_to_levels() - -```python -def convert_to_levels(diff_df, original_df, target_column) -``` - - -Convert differenced data back to original levels. - - - - -####### get_common_date_range() - -```python -def get_common_date_range(dfs) -``` - - - - - -####### get_demo_test_config() - -```python -def get_demo_test_config() -``` - - - - - -####### load_data() - -```python -def load_data() -``` - - - - - - - - - -###### identify_frequencies() - -```python -def identify_frequencies(df) -``` - - -Identify the frequency of each series in the DataFrame. - - -**Parameters** - -- **df**: Time-series DataFrame - -**Returns** - -- DataFrame with two columns: 'Variable' and 'Frequency' - - - -#### lending_club - - - - - - -####### load_data() - -```python -def load_data() -``` - - - - - -####### preprocess() - -```python -def preprocess(df, split_option = 'train_test_val', train_size = 0.6, test_size = 0.2) -``` - - -Split a time series DataFrame into train, validation, and test sets. - -Parameters: -- **df (pandas.DataFrame)****: The time series DataFrame to be split. -- **split_option (str)**: The split option to choose from: 'train_test_val' (default) or 'train_test'. -- **train_size (float)**: The proportion of the dataset to include in the training set. Default is 0.6. -- **test_size (float)**: The proportion of the dataset to include in the test set. Default is 0.2. - -**Returns** - -- **train_df (pandas.DataFrame)**: The training set. -- **validation_df (pandas.DataFrame)**: The validation set (only returned if split_option is 'train_test_val'). -- **test_df (pandas.DataFrame)**: The test set. - - - - -####### transform() - -```python -def transform(df, transform_func = 'diff') -``` - - - - - - - - - -###### resample_to_common_frequency() - -```python -def resample_to_common_frequency(df, common_frequency = 'MS') -``` - - - - - - - - - - - -### errors - - -This module contains all the custom errors that are used in the ValidMind Library. - -The following base errors are defined for others: -- BaseError -- APIRequestError - -#### class APIRequestError(BaseError) - -Generic error for API request errors that are not known. - - -#### class BaseError(Exception) - - - - - - -##### description() -```python -def description(self, args = (), kwargs = {}): -``` - - -##### message() -```python -def message(): -``` - -#### class GetTestSuiteError(BaseError) - -When the test suite could not be found. - - -#### class InitializeTestSuiteError(BaseError) - -When the test suite was found but could not be initialized. - - -#### class InvalidAPICredentialsError(APIRequestError) - - - - - - -##### description() -```python -def description(self, args = (), kwargs = {}): -``` - -#### class InvalidContentIdPrefixError(APIRequestError) - -When an invalid text content_id is sent to the API. - - -#### class InvalidInputError(BaseError) - -When an invalid input object. - - -#### class InvalidMetricResultsError(APIRequestError) - -When an invalid metric results object is sent to the API. - - -#### class InvalidProjectError(APIRequestError) - - - - - - -##### description() -```python -def description(self, args = (), kwargs = {}): -``` - -#### class InvalidRequestBodyError(APIRequestError) - -When a POST/PUT request is made with an invalid request body. - - -#### class InvalidTestParametersError(BaseError) - -When an invalid parameters for the test. - - -#### class InvalidTestResultsError(APIRequestError) - -When an invalid test results object is sent to the API. - - -#### class InvalidTextObjectError(APIRequestError) - -When an invalid Metadat (Text) object is sent to the API. - - -#### class InvalidValueFormatterError(BaseError) - -When an invalid value formatter is provided when serializing results. - - -#### class InvalidXGBoostTrainedModelError(BaseError) - -When an invalid XGBoost trained model is used when calling init_r_model. - - -#### class LoadTestError(BaseError) - -Exception raised when an error occurs while loading a test - - - - -##### original_error() -```python -def original_error(): -``` - -Exception raised when an error occurs while loading a test - -#### class MismatchingClassLabelsError(BaseError) - -When the class labels found in the dataset don't match the provided target labels. - - -#### class MissingAPICredentialsError(BaseError) - - - - - - -##### description() -```python -def description(self, args = (), kwargs = {}): -``` - -#### class MissingCacheResultsArgumentsError(BaseError) - -When the cache_results function is missing arguments. - - -#### class MissingClassLabelError(BaseError) - -When the one or more class labels are missing from provided dataset targets. - - -#### class MissingDependencyError(BaseError) - -When a required dependency is missing. - - - - -##### extra() -```python -def extra(): -``` - -When a required dependency is missing. - - -##### required_dependencies() -```python -def required_dependencies(): -``` - -When a required dependency is missing. - -#### class MissingDocumentationTemplate(BaseError) - -When the client config is missing the documentation template. - - -#### class MissingModelIdError(BaseError) - - - - - - -##### description() -```python -def description(self, args = (), kwargs = {}): -``` - -#### class MissingOrInvalidModelPredictFnError(BaseError) - -When the pytorch model is missing a predict function or its predict -method does not have the expected arguments. - - -#### class MissingRExtrasError(BaseError) - -When the R extras have not been installed. - - - - -##### description() -```python -def description(self, args = (), kwargs = {}): -``` - -When the R extras have not been installed. - -#### class MissingRequiredTestInputError(BaseError) - -When a required test context variable is missing. - - -#### class MissingTextContentIdError(APIRequestError) - -When a Text object is sent to the API without a content_id. - - -#### class MissingTextContentsError(APIRequestError) - -When a Text object is sent to the API without a "text" attribute. - - -#### class SkipTestError(BaseError) - -Useful error to throw when a test cannot be executed. - - -#### class TestInputInvalidDatasetError(BaseError) - -When an invalid dataset is used in a test context. - - -#### class UnsupportedColumnTypeError(BaseError) - -When an unsupported column type is found on a dataset. - - -#### class UnsupportedDatasetError(BaseError) - -When an unsupported dataset is used. - - -#### class UnsupportedFigureError(BaseError) - -When an unsupported figure object is constructed. - - -#### class UnsupportedModelError(BaseError) - -When an unsupported model is used. - - -#### class UnsupportedModelForSHAPError(BaseError) - -When an unsupported model is used for SHAP importance. - - -#### class UnsupportedRModelError(BaseError) - -When an unsupported R model is used. - - - -##### raise_api_error() - -```python -def raise_api_error(error_string) -``` - - -Safely try to parse JSON from the response message in case the API -returns a non-JSON string or if the API returns a non-standard error - - - - -##### should_raise_on_fail_fast() - -```python -def should_raise_on_fail_fast(error) -> bool -``` - - -Determine whether an error should be raised when fail_fast is True. - - - - - - - - - - - - - - - - - - - - - - - - - -### test_suites - - -Entrypoint for test suites. - -### classifier - - -Test suites for sklearn-compatible classifier models - -Ideal setup is to have the API client to read a -custom test suite from the project's configuration - - - - -##### class ClassifierDiagnosis(TestSuite) - -Test suite for sklearn classifier model diagnosis tests - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for sklearn classifier model diagnosis tests - - -###### tests() -```python -def tests(): -``` - -Test suite for sklearn classifier model diagnosis tests - -##### class ClassifierFullSuite(TestSuite) - -Full test suite for binary classification models. - - - - -###### suite_id() -```python -def suite_id(): -``` - -Full test suite for binary classification models. - - -###### tests() -```python -def tests(): -``` - -Full test suite for binary classification models. - -##### class ClassifierMetrics(TestSuite) - -Test suite for sklearn classifier metrics - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for sklearn classifier metrics - - -###### tests() -```python -def tests(): -``` - -Test suite for sklearn classifier metrics - -##### class ClassifierModelValidation(TestSuite) - -Test suite for binary classification models. - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for binary classification models. - - -###### tests() -```python -def tests(): -``` - -Test suite for binary classification models. - -##### class ClassifierPerformance(TestSuite) - -Test suite for sklearn classifier models - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for sklearn classifier models - - -###### tests() -```python -def tests(): -``` - -Test suite for sklearn classifier models - - - - - -### cluster - - -Test suites for sklearn-compatible clustering models - -Ideal setup is to have the API client to read a -custom test suite from the project's configuration - - - - -##### class ClusterFullSuite(TestSuite) - -Full test suite for clustering models. - - - - -###### suite_id() -```python -def suite_id(): -``` - -Full test suite for clustering models. - - -###### tests() -```python -def tests(): -``` - -Full test suite for clustering models. - -##### class ClusterMetrics(TestSuite) - -Test suite for sklearn clustering metrics - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for sklearn clustering metrics - - -###### tests() -```python -def tests(): -``` - -Test suite for sklearn clustering metrics - -##### class ClusterPerformance(TestSuite) - -Test suite for sklearn cluster performance - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for sklearn cluster performance - - -###### tests() -```python -def tests(): -``` - -Test suite for sklearn cluster performance - - - - - - -##### describe_suite() - -```python -def describe_suite(test_suite_id: str, verbose = False) -``` - - -Describes a Test Suite by ID - -**Arguments** - -- **test_suite_id****: Test Suite ID -- **verbose**: If True, describe all plans and tests in the Test Suite - -**Returns** - -- **pandas.DataFrame**: A formatted table with the Test Suite description - - - -### embeddings - - -Test suites for embeddings models - -Ideal setup is to have the API client to read a -custom test suite from the project's configuration - - - - -##### class EmbeddingsFullSuite(TestSuite) - -Full test suite for embeddings models. - - - - -###### suite_id() -```python -def suite_id(): -``` - -Full test suite for embeddings models. - - -###### tests() -```python -def tests(): -``` - -Full test suite for embeddings models. - -##### class EmbeddingsMetrics(TestSuite) - -Test suite for embeddings metrics - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for embeddings metrics - - -###### tests() -```python -def tests(): -``` - -Test suite for embeddings metrics - -##### class EmbeddingsPerformance(TestSuite) - -Test suite for embeddings model performance - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for embeddings model performance - - -###### tests() -```python -def tests(): -``` - -Test suite for embeddings model performance - - - - - - -##### get_by_id() - -```python -def get_by_id(test_suite_id: str) -``` - - -Returns the test suite by ID - - - - -##### list_suites() - -```python -def list_suites(pretty: bool = True) -``` - - -Returns a list of all available test suites - - - -### llm - - -Test suites for LLMs - - - - -##### class LLMClassifierFullSuite(TestSuite) - -Full test suite for LLM classification models. - - - - -###### suite_id() -```python -def suite_id(): -``` - -Full test suite for LLM classification models. - - -###### tests() -```python -def tests(): -``` - -Full test suite for LLM classification models. - -##### class PromptValidation(TestSuite) - -Test suite for prompt validation - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for prompt validation - - -###### tests() -```python -def tests(): -``` - -Test suite for prompt validation - - - - - -### nlp - - -Test suites for NLP models - - - - -##### class NLPClassifierFullSuite(TestSuite) - -Full test suite for NLP classification models. - - - - -###### suite_id() -```python -def suite_id(): -``` - -Full test suite for NLP classification models. - - -###### tests() -```python -def tests(): -``` - -Full test suite for NLP classification models. - - - - - -### parameters_optimization - - -Test suites for sklearn-compatible hyper parameters tunning - -Ideal setup is to have the API client to read a -custom test suite from the project's configuration - - - - -##### class KmeansParametersOptimization(TestSuite) - -Test suite for sklearn hyperparameters optimization - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for sklearn hyperparameters optimization - - -###### tests() -```python -def tests(): -``` - -Test suite for sklearn hyperparameters optimization - - - - - - -##### register_test_suite() - -```python -def register_test_suite(suite_id: str, suite: TestSuite) -``` - - -Registers a custom test suite - - - -### regression - - - - - -##### class RegressionFullSuite(TestSuite) - -Full test suite for regression models. - - - - -###### suite_id() -```python -def suite_id(): -``` - -Full test suite for regression models. - - -###### tests() -```python -def tests(): -``` - -Full test suite for regression models. - -##### class RegressionMetrics(TestSuite) - -Test suite for performance metrics of regression metrics - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for performance metrics of regression metrics - - -###### tests() -```python -def tests(): -``` - -Test suite for performance metrics of regression metrics - -##### class RegressionPerformance(TestSuite) - -Test suite for regression model performance - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for regression model performance - - -###### tests() -```python -def tests(): -``` - -Test suite for regression model performance - - - - - -### statsmodels_timeseries - - -Time Series Test Suites from statsmodels - - - - -##### class RegressionModelDescription(TestSuite) - -Test suite for performance metric of regression model of statsmodels library - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for performance metric of regression model of statsmodels library - - -###### tests() -```python -def tests(): -``` - -Test suite for performance metric of regression model of statsmodels library - -##### class RegressionModelsEvaluation(TestSuite) - -Test suite for metrics comparison of regression model of statsmodels library - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for metrics comparison of regression model of statsmodels library - - -###### tests() -```python -def tests(): -``` - -Test suite for metrics comparison of regression model of statsmodels library - - - - - -### summarization - - -Test suites for llm summarization models - - - - -##### class SummarizationMetrics(TestSuite) - -Test suite for Summarization metrics - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for Summarization metrics - - -###### tests() -```python -def tests(): -``` - -Test suite for Summarization metrics - - - - - -### tabular_datasets - - -Test suites for tabular datasets - - - - -##### class TabularDataQuality(TestSuite) - -Test suite for data quality on tabular datasets - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for data quality on tabular datasets - - -###### tests() -```python -def tests(): -``` - -Test suite for data quality on tabular datasets - -##### class TabularDataset(TestSuite) - -Test suite for tabular datasets. - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for tabular datasets. - - -###### tests() -```python -def tests(): -``` - -Test suite for tabular datasets. - -##### class TabularDatasetDescription(TestSuite) - -Test suite to extract metadata and descriptive -statistics from a tabular dataset - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite to extract metadata and descriptive -statistics from a tabular dataset - - -###### tests() -```python -def tests(): -``` - -Test suite to extract metadata and descriptive -statistics from a tabular dataset - - - - - -### text_data - - -Test suites for text datasets - - - - -##### class TextDataQuality(TestSuite) - -Test suite for data quality on text data - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for data quality on text data - - -###### tests() -```python -def tests(): -``` - -Test suite for data quality on text data - - - - - -### time_series - - -Time Series Test Suites - - - - -##### class TimeSeriesDataQuality(TestSuite) - -Test suite for data quality on time series datasets - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for data quality on time series datasets - - -###### tests() -```python -def tests(): -``` - -Test suite for data quality on time series datasets - -##### class TimeSeriesDataset(TestSuite) - -Test suite for time series datasets. - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for time series datasets. - - -###### tests() -```python -def tests(): -``` - -Test suite for time series datasets. - -##### class TimeSeriesModelValidation(TestSuite) - -Test suite for time series model validation. - - - - -###### suite_id() -```python -def suite_id(): -``` - -Test suite for time series model validation. - - -###### tests() -```python -def tests(): -``` - -Test suite for time series model validation. - -##### class TimeSeriesMultivariate(TestSuite) - -This test suite provides a preliminary understanding of the features -and relationship in multivariate dataset. It presents various -multivariate visualizations that can help identify patterns, trends, -and relationships between pairs of variables. The visualizations are -designed to explore the relationships between multiple features -simultaneously. They allow you to quickly identify any patterns or -trends in the data, as well as any potential outliers or anomalies. -The individual feature distribution can also be explored to provide -insight into the range and frequency of values observed in the data. -This multivariate analysis test suite aims to provide an overview of -the data structure and guide further exploration and modeling. - - - - -###### suite_id() -```python -def suite_id(): -``` - -This test suite provides a preliminary understanding of the features -and relationship in multivariate dataset. It presents various -multivariate visualizations that can help identify patterns, trends, -and relationships between pairs of variables. The visualizations are -designed to explore the relationships between multiple features -simultaneously. They allow you to quickly identify any patterns or -trends in the data, as well as any potential outliers or anomalies. -The individual feature distribution can also be explored to provide -insight into the range and frequency of values observed in the data. -This multivariate analysis test suite aims to provide an overview of -the data structure and guide further exploration and modeling. - - -###### tests() -```python -def tests(): -``` - -This test suite provides a preliminary understanding of the features -and relationship in multivariate dataset. It presents various -multivariate visualizations that can help identify patterns, trends, -and relationships between pairs of variables. The visualizations are -designed to explore the relationships between multiple features -simultaneously. They allow you to quickly identify any patterns or -trends in the data, as well as any potential outliers or anomalies. -The individual feature distribution can also be explored to provide -insight into the range and frequency of values observed in the data. -This multivariate analysis test suite aims to provide an overview of -the data structure and guide further exploration and modeling. - -##### class TimeSeriesUnivariate(TestSuite) - -This test suite provides a preliminary understanding of the target variable(s) -used in the time series dataset. It visualizations that present the raw time -series data and a histogram of the target variable(s). - -The raw time series data provides a visual inspection of the target variable's -behavior over time. This helps to identify any patterns or trends in the data, -as well as any potential outliers or anomalies. The histogram of the target -variable displays the distribution of values, providing insight into the range -and frequency of values observed in the data. - - - - -###### suite_id() -```python -def suite_id(): -``` - -This test suite provides a preliminary understanding of the target variable(s) -used in the time series dataset. It visualizations that present the raw time -series data and a histogram of the target variable(s). - -The raw time series data provides a visual inspection of the target variable's -behavior over time. This helps to identify any patterns or trends in the data, -as well as any potential outliers or anomalies. The histogram of the target -variable displays the distribution of values, providing insight into the range -and frequency of values observed in the data. - - -###### tests() -```python -def tests(): -``` - -This test suite provides a preliminary understanding of the target variable(s) -used in the time series dataset. It visualizations that present the raw time -series data and a histogram of the target variable(s). - -The raw time series data provides a visual inspection of the target variable's -behavior over time. This helps to identify any patterns or trends in the data, -as well as any potential outliers or anomalies. The histogram of the target -variable displays the distribution of values, providing insight into the range -and frequency of values observed in the data. - - - - - - - - -### tests - - -ValidMind Tests Module - -### comparison - - - - - - -###### combine_results() - -```python -def combine_results(results: List) -> Tuple[, , ] -``` - - -Combine multiple test results into a single set of outputs. - -**Arguments** - -- **results****: A list of TestResult objects to combine. - -**Returns** - -- **A tuple containing**: - A list of combined outputs (tables and figures). - A dictionary of inputs with lists of all values. - A dictionary of parameters with lists of all values. - - - - -###### get_comparison_test_configs() - -```python -def get_comparison_test_configs(input_grid: Union = None, param_grid: Union = None, inputs: Union = None, params: Union = None) -> List[] -``` - - -Generate test configurations based on input and parameter grids. - -Function inputs should be validated before calling this. - -**Arguments** - -- **input_grid****: A dictionary or list defining the grid of inputs. -- **param_grid**: A dictionary or list defining the grid of parameters. -- **inputs**: A dictionary of inputs. -- **params**: A dictionary of parameters. - -**Returns** - -- A list of test configurations. - - - - - - - -### data_validation - - - - - -#### ACFandPACFPlot - - - - - - -####### ACFandPACFPlot() - -```python -def ACFandPACFPlot(dataset: VMDataset) -``` - - -Analyzes time series data using Autocorrelation Function (ACF) and Partial Autocorrelation Function (PACF) plots to -reveal trends and correlations. - -###### Purpose - -The ACF (Autocorrelation Function) and PACF (Partial Autocorrelation Function) plot test is employed to analyze -time series data in machine learning models. It illuminates the correlation of the data over time by plotting the -correlation of the series with its own lags (ACF), and the correlations after removing effects already accounted -for by earlier lags (PACF). This information can identify trends, such as seasonality, degrees of autocorrelation, -and inform the selection of order parameters for AutoRegressive Integrated Moving Average (ARIMA) models. - -###### Test Mechanism - -The `ACFandPACFPlot` test accepts a dataset with a time-based index. It first confirms the index is of a datetime -type, then handles any NaN values. The test subsequently generates ACF and PACF plots for each column in the -dataset, producing a subplot for each. If the dataset doesn't include key columns, an error is returned. - -###### Signs of High Risk - -- Sudden drops in the correlation at a specific lag might signal a model at high risk. -- Consistent high correlation across multiple lags could also indicate non-stationarity in the data, which may -suggest that a model estimated on this data won't generalize well to future, unknown data. - -###### Strengths - -- ACF and PACF plots offer clear graphical representations of the correlations in time series data. -- These plots are effective at revealing important data characteristics such as seasonality, trends, and -correlation patterns. -- The insights from these plots aid in better model configuration, particularly in the selection of ARIMA model -parameters. - -###### Limitations - -- ACF and PACF plots are exclusively for time series data and hence, can't be applied to all ML models. -- These plots require large, consistent datasets as gaps could lead to misleading results. -- The plots can only represent linear correlations and fail to capture any non-linear relationships within the data. -- The plots might be difficult for non-experts to interpret and should not replace more advanced analyses. - - - - - - - -#### ADF - - - - - - -####### ADF() - -```python -def ADF(dataset: VMDataset) -``` - - -Assesses the stationarity of a time series dataset using the Augmented Dickey-Fuller (ADF) test. - -###### Purpose - -The Augmented Dickey-Fuller (ADF) test metric is used to determine the order of integration, i.e., the stationarity -of a given time series dataset. The stationary property of data is pivotal in many machine learning models as it -impacts the reliability and effectiveness of predictions and forecasts. - -###### Test Mechanism - -The ADF test is executed using the `adfuller` function from the `statsmodels` library on each feature of the -dataset. Multiple outputs are generated for each run, including the ADF test statistic and p-value, count of lags -used, the number of observations considered in the test, critical values at various confidence levels, and the -information criterion. These results are stored for each feature for subsequent analysis. - -###### Signs of High Risk - -- An inflated ADF statistic and high p-value (generally above 0.05) indicate a high risk to the model's performance -due to the presence of a unit root indicating non-stationarity. -- Non-stationarity might result in untrustworthy or insufficient forecasts. - -###### Strengths - -- The ADF test is robust to sophisticated correlations within the data, making it suitable for settings where data -displays complex stochastic behavior. -- It provides explicit outputs like test statistics, critical values, and information criterion, enhancing -understanding and transparency in the model validation process. - -###### Limitations - -- The ADF test might demonstrate low statistical power, making it challenging to differentiate between a unit root -and near-unit-root processes, potentially causing false negatives. -- It assumes the data follows an autoregressive process, which might not always be the case. -- The test struggles with time series data that have structural breaks. - - - - - - - -#### AutoAR - - - - - - -####### AutoAR() - -```python -def AutoAR(dataset: VMDataset, max_ar_order: int = 3) -``` - - -Automatically identifies the optimal Autoregressive (AR) order for a time series using BIC and AIC criteria. - -###### Purpose - -The AutoAR test is intended to automatically identify the Autoregressive (AR) order of a time series by utilizing -the Bayesian Information Criterion (BIC) and Akaike Information Criterion (AIC). AR order is crucial in forecasting -tasks as it dictates the quantity of prior terms in the sequence to use for predicting the current term. The -objective is to select the most fitting AR model that encapsulates the trend and seasonality in the time series -data. - -###### Test Mechanism - -The test mechanism operates by iterating through a possible range of AR orders up to a defined maximum. An AR model -is fitted for each order, and the corresponding BIC and AIC are computed. BIC and AIC statistical measures are -designed to penalize models for complexity, preferring simpler models that fit the data proficiently. To verify the -stationarity of the time series, the Augmented Dickey-Fuller test is executed. The AR order, BIC, and AIC findings -are compiled into a dataframe for effortless comparison. Then, the AR order with the smallest BIC is established as -the desirable order for each variable. - -###### Signs of High Risk - -- An augmented Dickey Fuller test p-value > 0.05, indicating the time series isn't stationary, may lead to -inaccurate results. -- Problems with the model fitting procedure, such as computational or convergence issues. -- Continuous selection of the maximum specified AR order may suggest an insufficient set limit. - -###### Strengths - -- The test independently pinpoints the optimal AR order, thereby reducing potential human bias. -- It strikes a balance between model simplicity and goodness-of-fit to avoid overfitting. -- Has the capability to account for stationarity in a time series, an essential aspect for dependable AR modeling. -- The results are aggregated into a comprehensive table, enabling an easy interpretation. - -###### Limitations - -- The tests need a stationary time series input. -- They presume a linear relationship between the series and its lags. -- The search for the best model is constrained by the maximum AR order supplied in the parameters. Therefore, a low -max_ar_order could result in subpar outcomes. -- AIC and BIC may not always agree on the selection of the best model. This potentially requires the user to juggle -interpretational choices. - - - - - - - -#### AutoMA - - - - - - -####### AutoMA() - -```python -def AutoMA(dataset: VMDataset, max_ma_order: int = 3) -``` - - -Automatically selects the optimal Moving Average (MA) order for each variable in a time series dataset based on -minimal BIC and AIC values. - -###### Purpose - -The `AutoMA` metric serves an essential role of automated decision-making for selecting the optimal Moving Average -(MA) order for every variable in a given time series dataset. The selection is dependent on the minimalization of -BIC (Bayesian Information Criterion) and AIC (Akaike Information Criterion); these are established statistical -tools used for model selection. Furthermore, prior to the commencement of the model fitting process, the algorithm -conducts a stationarity test (Augmented Dickey-Fuller test) on each series. - -###### Test Mechanism - -Starting off, the `AutoMA` algorithm checks whether the `max_ma_order` parameter has been provided. It consequently -loops through all variables in the dataset, carrying out the Dickey-Fuller test for stationarity. For each -stationary variable, it fits an ARIMA model for orders running from 0 to `max_ma_order`. The result is a list -showcasing the BIC and AIC values of the ARIMA models based on different orders. The MA order, which yields the -smallest BIC, is chosen as the 'best MA order' for every single variable. The final results include a table -summarizing the auto MA analysis and another table listing the best MA order for each variable. - -###### Signs of High Risk - -- When a series is non-stationary (p-value>0.05 in the Dickey-Fuller test), the produced result could be inaccurate. -- Any error that arises in the process of fitting the ARIMA models, especially with a higher MA order, can -potentially indicate risks and might need further investigation. - -###### Strengths - -- The metric facilitates automation in the process of selecting the MA order for time series forecasting. This -significantly saves time and reduces efforts conventionally necessary for manual hyperparameter tuning. -- The use of both BIC and AIC enhances the likelihood of selecting the most suitable model. -- The metric ascertains the stationarity of the series prior to model fitting, thus ensuring that the underlying -assumptions of the MA model are fulfilled. - -###### Limitations - -- If the time series fails to be stationary, the metric may yield inaccurate results. Consequently, it necessitates -pre-processing steps to stabilize the series before fitting the ARIMA model. -- The metric adopts a rudimentary model selection process based on BIC and doesn't consider other potential model -selection strategies. Depending on the specific dataset, other strategies could be more appropriate. -- The 'max_ma_order' parameter must be manually input which doesn't always guarantee optimal performance, -especially when configured too low. -- The computation time increases with the rise in `max_ma_order`, hence, the metric may become computationally -costly for larger values. - - - - - - - -#### AutoStationarity - - - - - - -####### AutoStationarity() - -```python -def AutoStationarity(dataset: VMDataset, max_order: int = 5, threshold: float = 0.05) -``` - - -Automates Augmented Dickey-Fuller test to assess stationarity across multiple time series in a DataFrame. - -###### Purpose - -The AutoStationarity metric is intended to automatically detect and evaluate the stationary nature of each time -series in a DataFrame. It incorporates the Augmented Dickey-Fuller (ADF) test, a statistical approach used to -assess stationarity. Stationarity is a fundamental property suggesting that statistic features like mean and -variance remain unchanged over time. This is necessary for many time-series models. - -###### Test Mechanism - -The mechanism for the AutoStationarity test involves applying the Augmented Dicky-Fuller test to each time series -within the given dataframe to assess if they are stationary. Every series in the dataframe is looped, using the ADF -test up to a defined maximum order (configurable and by default set to 5). The p-value resulting from the ADF test -is compared against a predetermined threshold (also configurable and by default set to 0.05). The time series is -deemed stationary at its current differencing order if the p-value is less than the threshold. - -###### Signs of High Risk - -- A significant number of series not achieving stationarity even at the maximum order of differencing can indicate -high risk or potential failure in the model. -- This could suggest the series may not be appropriately modeled by a stationary process, hence other modeling -approaches might be required. - -###### Strengths - -- The key strength in this metric lies in the automation of the ADF test, enabling mass stationarity analysis -across various time series and boosting the efficiency and credibility of the analysis. -- The utilization of the ADF test, a widely accepted method for testing stationarity, lends authenticity to the -results derived. -- The introduction of the max order and threshold parameters give users the autonomy to determine their preferred -levels of stringency in the tests. - -###### Limitations - -- The Augmented Dickey-Fuller test and the stationarity test are not without their limitations. These tests are -premised on the assumption that the series can be modeled by an autoregressive process, which may not always hold -true. -- The stationarity check is highly sensitive to the choice of threshold for the significance level; an extremely -high or low threshold could lead to incorrect results regarding the stationarity properties. -- There's also a risk of over-differencing if the maximum order is set too high, which could induce unnecessary -cycles. - - - - - - - -#### BivariateScatterPlots - - - - - - -####### BivariateScatterPlots() - -```python -def BivariateScatterPlots(dataset) -``` - - -Generates bivariate scatterplots to visually inspect relationships between pairs of numerical predictor variables -in machine learning classification tasks. - -###### Purpose - -This function is intended for visual inspection and monitoring of relationships between pairs of numerical -variables in a machine learning model targeting classification tasks. It helps in understanding how predictor -variables (features) interact with each other, which can inform feature selection, model-building strategies, and -identify potential biases or irregularities in the data. - -###### Test Mechanism - -The function creates scatter plots for each pair of numerical features in the dataset. It first filters out -non-numerical and binary features, ensuring the plots focus on meaningful numerical relationships. The resulting -scatterplots are color-coded uniformly to avoid visual distraction, and the function returns a tuple of Plotly -figure objects, each representing a scatter plot for a pair of features. - -###### Signs of High Risk - -- Visual patterns suggesting non-linear relationships, multicollinearity, clustering, or outlier points in the -scatter plots. -- Such issues could affect the assumptions and performance of certain models, especially those assuming linearity, -like logistic regression. - -###### Strengths - -- Scatterplots provide an intuitive and visual tool to explore relationships between two variables. -- They are useful for identifying outliers, variable associations, and trends, including non-linear patterns. -- Supports visualization of binary or multi-class classification datasets, focusing on numerical features. - -###### Limitations - -- Scatterplots are limited to bivariate analysis, showing relationships between only two variables at a time. -- Not ideal for very large datasets where overlapping points can reduce the clarity of the visualization. -- Scatterplots are exploratory tools and do not provide quantitative measures of model quality or performance. -- Interpretation is subjective and relies on the domain knowledge and judgment of the viewer. - - - - - - - -#### BoxPierce - - - - - - -####### BoxPierce() - -```python -def BoxPierce(dataset) -``` - - -Detects autocorrelation in time-series data through the Box-Pierce test to validate model performance. - -###### Purpose - -The Box-Pierce test is utilized to detect the presence of autocorrelation in a time-series dataset. -Autocorrelation, or serial correlation, refers to the degree of similarity between observations based on the -temporal spacing between them. This test is essential for affirming the quality of a time-series model by ensuring -that the error terms in the model are random and do not adhere to a specific pattern. - -###### Test Mechanism - -The implementation of the Box-Pierce test involves calculating a test statistic along with a corresponding p-value -derived from the dataset features. These quantities are used to test the null hypothesis that posits the data to be -independently distributed. This is achieved by iterating over every feature column in the time-series data and -applying the `acorr_ljungbox` function of the statsmodels library. The function yields the Box-Pierce test -statistic as well as the respective p-value, all of which are cached as test results. - -###### Signs of High Risk - -- A low p-value, typically under 0.05 as per statistical convention, throws the null hypothesis of independence -into question. This implies that the dataset potentially houses autocorrelations, thus indicating a high-risk -scenario concerning model performance. -- Large Box-Pierce test statistic values may indicate the presence of autocorrelation. - -###### Strengths - -- Detects patterns in data that are supposed to be random, thereby ensuring no underlying autocorrelation. -- Can be computed efficiently given its low computational complexity. -- Can be widely applied to most regression problems, making it very versatile. - -###### Limitations - -- Assumes homoscedasticity (constant variance) and normality of residuals, which may not always be the case in -real-world datasets. -- May exhibit reduced power for detecting complex autocorrelation schemes such as higher-order or negative -correlations. -- It only provides a general indication of the existence of autocorrelation, without providing specific insights -into the nature or patterns of the detected autocorrelation. -- In the presence of trends or seasonal patterns, the Box-Pierce test may yield misleading results. -- Applicability is limited to time-series data, which limits its overall utility. - - - - - - - -#### ChiSquaredFeaturesTable - - - - - - -####### ChiSquaredFeaturesTable() - -```python -def ChiSquaredFeaturesTable(dataset, p_threshold = 0.05) -``` - - -Assesses the statistical association between categorical features and a target variable using the Chi-Squared test. - -###### Purpose - -The `ChiSquaredFeaturesTable` function is designed to evaluate the relationship between categorical features and a -target variable in a dataset. It performs a Chi-Squared test of independence for each categorical feature to -determine whether a statistically significant association exists with the target variable. This is particularly -useful in Model Risk Management for understanding the relevance of features and identifying potential biases in a -classification model. - -###### Test Mechanism - -The function creates a contingency table for each categorical feature and the target variable, then applies the -Chi-Squared test to compute the Chi-squared statistic and the p-value. The results for each feature include the -variable name, Chi-squared statistic, p-value, p-value threshold, and a pass/fail status based on whether the -p-value is below the specified threshold. The output is a DataFrame summarizing these results, sorted by p-value to -highlight the most statistically significant associations. - -###### Signs of High Risk - -- High p-values (greater than the set threshold) indicate a lack of significant association between a feature and -the target variable, resulting in a 'Fail' status. -- Features with a 'Fail' status might not be relevant for the model, which could negatively impact model -performance. - -###### Strengths - -- Provides a clear, statistical assessment of the relationship between categorical features and the target variable. -- Produces an easily interpretable summary with a 'Pass/Fail' outcome for each feature, helping in feature -selection. -- The p-value threshold is adjustable, allowing for flexibility in statistical rigor. - -###### Limitations - -- Assumes the dataset is tabular and consists of categorical variables, which may not be suitable for all datasets. -- The test is designed for classification tasks and is not applicable to regression problems. -- As with all hypothesis tests, the Chi-Squared test can only detect associations, not causal relationships. -- The choice of p-value threshold can affect the interpretation of feature relevance, and different thresholds may -lead to different conclusions. - - - - - - - -#### ClassImbalance - - -Threshold based tests - - - - - -####### ClassImbalance() - -```python -def ClassImbalance(dataset: VMDataset, min_percent_threshold: int = 10) -> Tuple[, , bool] -``` - - -Evaluates and quantifies class distribution imbalance in a dataset used by a machine learning model. - -###### Purpose - -The Class Imbalance test is designed to evaluate the distribution of target classes in a dataset that's utilized by -a machine learning model. Specifically, it aims to ensure that the classes aren't overly skewed, which could lead -to bias in the model's predictions. It's crucial to have a balanced training dataset to avoid creating a model -that's biased with high accuracy for the majority class and low accuracy for the minority class. - -###### Test Mechanism - -This Class Imbalance test operates by calculating the frequency (expressed as a percentage) of each class in the -target column of the dataset. It then checks whether each class appears in at least a set minimum percentage of the -total records. This minimum percentage is a modifiable parameter, but the default value is set to 10%. - -###### Signs of High Risk - -- Any class that represents less than the pre-set minimum percentage threshold is marked as high risk, implying a -potential class imbalance. -- The function provides a pass/fail outcome for each class based on this criterion. -- Fundamentally, if any class fails this test, it's highly likely that the dataset possesses imbalanced class -distribution. - -###### Strengths - -- The test can spot under-represented classes that could affect the efficiency of a machine learning model. -- The calculation is straightforward and swift. -- The test is highly informative because it not only spots imbalance, but it also quantifies the degree of -imbalance. -- The adjustable threshold enables flexibility and adaptation to differing use-cases or domain-specific needs. -- The test creates a visually insightful plot showing the classes and their corresponding proportions, enhancing -interpretability and comprehension of the data. - -###### Limitations - -- The test might struggle to perform well or provide vital insights for datasets with a high number of classes. In -such cases, the imbalance could be inevitable due to the inherent class distribution. -- Sensitivity to the threshold value might result in faulty detection of imbalance if the threshold is set -excessively high. -- Regardless of the percentage threshold, it doesn't account for varying costs or impacts of misclassifying -different classes, which might fluctuate based on specific applications or domains. -- While it can identify imbalances in class distribution, it doesn't provide direct methods to address or correct -these imbalances. -- The test is only applicable for classification operations and unsuitable for regression or clustering tasks. - - - - - - - -#### DatasetDescription - - - - - - -####### DatasetDescription() - -```python -def DatasetDescription(dataset: VMDataset) -``` - - -Provides comprehensive analysis and statistical summaries of each column in a machine learning model's dataset. - -###### Purpose - -The test depicted in the script is meant to run a comprehensive analysis on a Machine Learning model's datasets. -The test or metric is implemented to obtain a complete summary of the columns in the dataset, including vital -statistics of each column such as count, distinct values, missing values, histograms for numerical, categorical, -boolean, and text columns. This summary gives a comprehensive overview of the dataset to better understand the -characteristics of the data that the model is trained on or evaluates. - -###### Test Mechanism - -The DatasetDescription class accomplishes the purpose as follows**: firstly, the test method "run" infers the data -type of each column in the dataset and stores the details (id, column type). For each column, the -"describe_column" method is invoked to collect statistical information about the column, including count, -missing value count and its proportion to the total, unique value count, and its proportion to the total. Depending -on the data type of a column, histograms are generated that reflect the distribution of data within the column. -Numerical columns use the "get_numerical_histograms" method to calculate histogram distribution, whereas for -categorical, boolean and text columns, a histogram is computed with frequencies of each unique value in the -datasets. For unsupported types, an error is raised. Lastly, a summary table is built to aggregate all the -statistical insights and histograms of the columns in a dataset. - -###### Signs of High Risk - -- High ratio of missing values to total values in one or more columns which may impact the quality of the -predictions. -- Unsupported data types in dataset columns. -- Large number of unique values in the dataset's columns which might make it harder for the model to establish -patterns. -- Extreme skewness or irregular distribution of data as reflected in the histograms. - -###### Strengths - -- Provides a detailed analysis of the dataset with versatile summaries like count, unique values, histograms, etc. -- Flexibility in handling different types of data: numerical, categorical, boolean, and text. -- Useful in detecting problems in the dataset like missing values, unsupported data types, irregular data -distribution, etc. -- The summary gives a comprehensive understanding of dataset features allowing developers to make informed -decisions. - -###### Limitations - -- The computation can be expensive from a resource standpoint, particularly for large datasets with numerous columns. -- The histograms use an arbitrary number of bins which may not be the optimal number of bins for specific data -distribution. -- Unsupported data types for columns will raise an error which may limit evaluating the dataset. -- Columns with all null or missing values are not included in histogram computation. -- This test only validates the quality of the dataset but doesn't address the model's performance directly. - - - - -####### describe_column() - -```python -def describe_column(df, column) -``` - - -Gets descriptive statistics for a single column in a Pandas DataFrame. - - - - -####### get_column_histograms() - -```python -def get_column_histograms(df, column, type_) -``` - - -Returns a collection of histograms for a numerical or categorical column. -We store different combinations of bin sizes to allow analyzing the data better - -Will be used in favor of _get_histogram in the future - - - - -####### get_numerical_histograms() - -```python -def get_numerical_histograms(df, column) -``` - - -Returns a collection of histograms for a numerical column, each one -with a different bin size - - - - -####### infer_datatypes() - -```python -def infer_datatypes(df) -``` - - - - - - - - -#### DatasetSplit - - - - - - -####### DatasetSplit() - -```python -def DatasetSplit(datasets: List) -``` - - -Evaluates and visualizes the distribution proportions among training, testing, and validation datasets of an ML -model. - -###### Purpose - -The DatasetSplit test is designed to evaluate and visualize the distribution of data among training, testing, and -validation datasets, if available, within a given machine learning model. The main purpose is to assess whether the -model's datasets are split appropriately, as an imbalanced split might affect the model's ability to learn from the -data and generalize to unseen data. - -###### Test Mechanism - -The DatasetSplit test first calculates the total size of all available datasets in the model. Then, for each -individual dataset, the methodology involves determining the size of the dataset and its proportion relative to the -total size. The results are then conveniently summarized in a table that shows dataset names, sizes, and -proportions. Absolute size and proportion of the total dataset size are displayed for each individual dataset. - -###### Signs of High Risk - -- A very small training dataset, which may result in the model not learning enough from the data. -- A very large training dataset and a small test dataset, which may lead to model overfitting and poor -generalization to unseen data. -- A small or non-existent validation dataset, which might complicate the model's performance assessment. - -###### Strengths - -- The DatasetSplit test provides a clear, understandable visualization of dataset split proportions, which can -highlight any potential imbalance in dataset splits quickly. -- It covers a wide range of task types including classification, regression, and text-related tasks. -- The metric is not tied to any specific data type and is applicable to tabular data, time series data, or text -data. - -###### Limitations - -- The DatasetSplit test does not provide any insight into the quality or diversity of the data within each split, -just the size and proportion. -- The test does not give any recommendations or adjustments for imbalanced datasets. -- Potential lack of compatibility with more complex modes of data splitting (for example, stratified or time-based -splits) could limit the applicability of this test. - - - - - - - -#### DescriptiveStatistics - - - - - - -####### DescriptiveStatistics() - -```python -def DescriptiveStatistics(dataset: VMDataset) -``` - - -Performs a detailed descriptive statistical analysis of both numerical and categorical data within a model's -dataset. - -###### Purpose - -The purpose of the Descriptive Statistics metric is to provide a comprehensive summary of both numerical and -categorical data within a dataset. This involves statistics such as count, mean, standard deviation, minimum and -maximum values for numerical data. For categorical data, it calculates the count, number of unique values, most -common value and its frequency, and the proportion of the most frequent value relative to the total. The goal is to -visualize the overall distribution of the variables in the dataset, aiding in understanding the model's behavior -and predicting its performance. - -###### Test Mechanism - -The testing mechanism utilizes two in-built functions of pandas dataframes**: `describe()` for numerical fields and -`value_counts()` for categorical fields. The `describe()` function pulls out several summary statistics, while -`value_counts()` accounts for unique values. The resulting data is formatted into two distinct tables, one for -numerical and another for categorical variable summaries. These tables provide a clear summary of the main -characteristics of the variables, which can be instrumental in assessing the model's performance. - -###### Signs of High Risk - -- Skewed data or significant outliers can represent high risk. For numerical data, this may be reflected via a -significant difference between the mean and median (50% percentile). -- For categorical data, a lack of diversity (low count of unique values), or overdominance of a single category -(high frequency of the top value) can indicate high risk. - -###### Strengths - -- Provides a comprehensive summary of the dataset, shedding light on the distribution and characteristics of the -variables under consideration. -- It is a versatile and robust method, applicable to both numerical and categorical data. -- Helps highlight crucial anomalies such as outliers, extreme skewness, or lack of diversity, which are vital in -understanding model behavior during testing and validation. - -###### Limitations - -- While this metric offers a high-level overview of the data, it may fail to detect subtle correlations or complex -patterns. -- Does not offer any insights on the relationship between variables. -- Alone, descriptive statistics cannot be used to infer properties about future unseen data. -- Should be used in conjunction with other statistical tests to provide a comprehensive understanding of the -model's data. - - - - -####### get_summary_statistics_categorical() - -```python -def get_summary_statistics_categorical(df, categorical_fields) -``` - - - - - -####### get_summary_statistics_numerical() - -```python -def get_summary_statistics_numerical(df, numerical_fields) -``` - - - - - - - - -#### DickeyFullerGLS - - - - - - -####### DickeyFullerGLS() - -```python -def DickeyFullerGLS(dataset: VMDataset) -``` - - -Assesses stationarity in time series data using the Dickey-Fuller GLS test to determine the order of integration. - -###### Purpose - -The Dickey-Fuller GLS (DFGLS) test is utilized to determine the order of integration in time series data. For -machine learning models dealing with time series and forecasting, this metric evaluates the existence of a unit -root, thereby checking whether a time series is non-stationary. This analysis is a crucial initial step when -dealing with time series data. - -###### Test Mechanism - -This code implements the Dickey-Fuller GLS unit root test on each attribute of the dataset. This process involves -iterating through every column of the dataset and applying the DFGLS test to assess the presence of a unit root. -The resulting information, including the test statistic ('stat'), the p-value ('pvalue'), the quantity of lagged -differences utilized in the regression ('usedlag'), and the number of observations ('nobs'), is subsequently stored. - -###### Signs of High Risk - -- A high p-value for the DFGLS test represents a high risk. Specifically, a p-value above a typical threshold of -0.05 suggests that the time series data is quite likely to be non-stationary, thus presenting a high risk for -generating unreliable forecasts. - -###### Strengths - -- The Dickey-Fuller GLS test is a potent tool for checking the stationarity of time series data. -- It helps to verify the assumptions of the models before the actual construction of the machine learning models -proceeds. -- The results produced by this metric offer a clear insight into whether the data is appropriate for specific -machine learning models, especially those demanding the stationarity of time series data. - -###### Limitations - -- Despite its benefits, the DFGLS test does present some drawbacks. It can potentially lead to inaccurate -conclusions if the time series data incorporates a structural break. -- If the time series tends to follow a trend while still being stationary, the test might misinterpret it, -necessitating further detrending. -- The test also presents challenges when dealing with shorter time series data or volatile data, not producing -reliable results in these cases. - - - - - - - -#### Duplicates - - - - - - -####### Duplicates() - -```python -def Duplicates(dataset, min_threshold = 1) -``` - - -Tests dataset for duplicate entries, ensuring model reliability via data quality verification. - -###### Purpose - -The 'Duplicates' test is designed to check for duplicate rows within the dataset provided to the model. It serves -as a measure of data quality, ensuring that the model isn't merely memorizing duplicate entries or being swayed by -redundant information. This is an important step in the pre-processing of data for both classification and -regression tasks. - -###### Test Mechanism - -This test operates by checking each row for duplicates in the dataset. If a text column is specified in the -dataset, the test is conducted on this column; if not, the test is run on all feature columns. The number and -percentage of duplicates are calculated and returned in a DataFrame. Additionally, a test is passed if the total -count of duplicates falls below a specified minimum threshold. - -###### Signs of High Risk - -- A high number of duplicate rows in the dataset, which can lead to overfitting where the model performs well on -the training data but poorly on unseen data. -- A high percentage of duplicate rows in the dataset, indicating potential problems with data collection or -processing. - -###### Strengths - -- Assists in improving the reliability of the model's training process by ensuring the training data is not -contaminated with duplicate entries, which can distort statistical analyses. -- Provides both absolute numbers and percentage values of duplicate rows, giving a thorough overview of data -quality. -- Highly customizable as it allows for setting a user-defined minimum threshold to determine if the test has been -passed. - -###### Limitations - -- Does not distinguish between benign duplicates (i.e., coincidental identical entries in different rows) and -problematic duplicates originating from data collection or processing errors. -- The test becomes more computationally intensive as the size of the dataset increases, which might not be suitable -for very large datasets. -- Can only check for exact duplicates and may miss semantically similar information packaged differently. - - - - - - - -#### EngleGrangerCoint - - - - - - -####### EngleGrangerCoint() - -```python -def EngleGrangerCoint(dataset: VMDataset, threshold: float = 0.05) -``` - - -Assesses the degree of co-movement between pairs of time series data using the Engle-Granger cointegration test. - -###### Purpose - -The intent of this Engle-Granger cointegration test is to explore and quantify the degree of co-movement between -pairs of time series variables in a dataset. This is particularly useful in enhancing the accuracy of predictive -regressions whenever the underlying variables are co-integrated, i.e., they move together over time. - -###### Test Mechanism - -The test first drops any non-applicable values from the input dataset and then iterates over each pair of variables -to apply the Engle-Granger cointegration test. The test generates a 'p' value, which is then compared against a -pre-specified threshold (0.05 by default). The pair is labeled as 'Cointegrated' if the 'p' value is less than or -equal to the threshold or 'Not cointegrated' otherwise. A summary table is returned by the metric showing -cointegration results for each variable pair. - -###### Signs of High Risk - -- A significant number of hypothesized cointegrated variables do not pass the test. -- A considerable number of 'p' values are close to the threshold, indicating minor data fluctuations can switch the -decision between 'Cointegrated' and 'Not cointegrated'. - -###### Strengths - -- Provides an effective way to analyze relationships between time series, particularly in contexts where it's -essential to check if variables move together in a statistically significant manner. -- Useful in various domains, especially finance or economics, where predictive models often hinge on understanding -how different variables move together over time. - -###### Limitations - -- Assumes that the time series are integrated of the same order, which isn't always true in multivariate time -series datasets. -- The presence of non-stationary characteristics in the series or structural breaks can result in falsely positive -or negative cointegration results. -- May not perform well for small sample sizes due to lack of statistical power and should be supplemented with -other predictive indicators for a more robust model evaluation. - - - - - - - -#### FeatureTargetCorrelationPlot - - - - - - -####### FeatureTargetCorrelationPlot() - -```python -def FeatureTargetCorrelationPlot(dataset, fig_height = 600) -``` - - -Visualizes the correlation between input features and the model's target output in a color-coded horizontal bar -plot. - -###### Purpose - -This test is designed to graphically illustrate the correlations between distinct input features and the target -output of a Machine Learning model. Understanding how each feature influences the model's predictions is crucial—a -higher correlation indicates a stronger influence of the feature on the target variable. This correlation study is -especially advantageous during feature selection and for comprehending the model's operation. - -###### Test Mechanism - -This FeatureTargetCorrelationPlot test computes and presents the correlations between the features and the target -variable using a specific dataset. These correlations are calculated and are then graphically represented in a -horizontal bar plot, color-coded based on the strength of the correlation. A hovering template can also be utilized -for informative tooltips. It is possible to specify the features to be analyzed and adjust the graph's height -according to need. - -###### Signs of High Risk - -- There are no strong correlations (either positive or negative) between features and the target variable. This -could suggest high risk as the supplied features do not appear to significantly impact the prediction output. -- The presence of duplicated correlation values might hint at redundancy in the feature set. - -###### Strengths - -- Provides visual assistance to interpreting correlations more effectively. -- Gives a clear and simple tour of how each feature affects the model's target variable. -- Beneficial for feature selection and grasping the model's prediction nature. -- Precise correlation values for each feature are offered by the hover template, contributing to a granular-level -comprehension. - -###### Limitations - -- The test only accepts numerical data, meaning variables of other types need to be prepared beforehand. -- The plot assumes all correlations to be linear, thus non-linear relationships might not be captured effectively. -- Not apt for models that employ complex feature interactions, like Decision Trees or Neural Networks, as the test -may not accurately reflect their importance. - - - - - - - -#### HighCardinality - - - - - - -####### HighCardinality() - -```python -def HighCardinality(dataset: VMDataset, num_threshold: int = 100, percent_threshold: float = 0.1, threshold_type: str = 'percent') -``` - - -Assesses the number of unique values in categorical columns to detect high cardinality and potential overfitting. - -###### Purpose - -The “High Cardinality” test is used to evaluate the number of unique values present in the categorical columns of a -dataset. In this context, high cardinality implies the presence of a large number of unique, non-repetitive values -in the dataset. - -###### Test Mechanism - -The test first infers the dataset's type and then calculates an initial numeric threshold based on the test -parameters. It only considers columns classified as "Categorical". For each of these columns, the number of -distinct values (n_distinct) and the percentage of distinct values (p_distinct) are calculated. The test will pass -if n_distinct is less than the calculated numeric threshold. Lastly, the results, which include details such as -column name, number of distinct values, and pass/fail status, are compiled into a table. - -###### Signs of High Risk - -- A large number of distinct values (high cardinality) in one or more categorical columns implies a high risk. -- A column failing the test (n_distinct >= num_threshold) is another indicator of high risk. - -###### Strengths - -- The High Cardinality test is effective in early detection of potential overfitting and unwanted noise. -- It aids in identifying potential outliers and inconsistencies, thereby improving data quality. -- The test can be applied to both classification and regression task types, demonstrating its versatility. - -###### Limitations - -- The test is restricted to only "Categorical" data types and is thus not suitable for numerical or continuous -features, limiting its scope. -- The test does not consider the relevance or importance of unique values in categorical features, potentially -causing it to overlook critical data points. -- The threshold (both number and percent) used for the test is static and may not be optimal for diverse datasets -and varied applications. Further mechanisms to adjust and refine this threshold could enhance its effectiveness. - - - - - - - -#### HighPearsonCorrelation - - - - - - -####### HighPearsonCorrelation() - -```python -def HighPearsonCorrelation(dataset: VMDataset, max_threshold: float = 0.3, top_n_correlations: int = 10, feature_columns: list = None) -``` - - -Identifies highly correlated feature pairs in a dataset suggesting feature redundancy or multicollinearity. - -###### Purpose - -The High Pearson Correlation test measures the linear relationship between features in a dataset, with the main -goal of identifying high correlations that might indicate feature redundancy or multicollinearity. Identification -of such issues allows developers and risk management teams to properly deal with potential impacts on the machine -learning model's performance and interpretability. - -###### Test Mechanism - -The test works by generating pairwise Pearson correlations for all features in the dataset, then sorting and -eliminating duplicate and self-correlations. It assigns a Pass or Fail based on whether the absolute value of the -correlation coefficient surpasses a pre-set threshold (defaulted at 0.3). It lastly returns the top n strongest -correlations regardless of passing or failing status (where n is 10 by default but can be configured by passing the -`top_n_correlations` parameter). - -###### Signs of High Risk - -- A high risk indication would be the presence of correlation coefficients exceeding the threshold. -- If the features share a strong linear relationship, this could lead to potential multicollinearity and model -overfitting. -- Redundancy of variables can undermine the interpretability of the model due to uncertainty over the authenticity -of individual variable's predictive power. - -###### Strengths - -- Provides a quick and simple means of identifying relationships between feature pairs. -- Generates a transparent output that displays pairs of correlated variables, the Pearson correlation coefficient, -and a Pass or Fail status for each. -- Aids in early identification of potential multicollinearity issues that may disrupt model training. - -###### Limitations - -- Can only delineate linear relationships, failing to shed light on nonlinear relationships or dependencies. -- Sensitive to outliers where a few outliers could notably affect the correlation coefficient. -- Limited to identifying redundancy only within feature pairs; may fail to spot more complex relationships among -three or more variables. - - - - - - - -#### IQROutliersBarPlot - - - - - - -####### IQROutliersBarPlot() - -```python -def IQROutliersBarPlot(dataset: VMDataset, threshold: float = 1.5, fig_width: int = 800) -``` - - -Visualizes outlier distribution across percentiles in numerical data using the Interquartile Range (IQR) method. - -###### Purpose - -The InterQuartile Range Outliers Bar Plot (IQROutliersBarPlot) metric aims to visually analyze and evaluate the -extent of outliers in numeric variables based on percentiles. Its primary purpose is to clarify the dataset's -distribution, flag possible abnormalities in it, and gauge potential risks associated with processing potentially -skewed data, which can affect the machine learning model's predictive prowess. - -###### Test Mechanism - -The examination invokes a series of steps: - -1. For every numeric feature in the dataset, the 25th percentile (Q1) and 75th percentile (Q3) are calculated -before deriving the Interquartile Range (IQR), the difference between Q1 and Q3. -2. Subsequently, the metric calculates the lower and upper thresholds by subtracting Q1 from the `threshold` times -IQR and adding Q3 to `threshold` times IQR, respectively. The default `threshold` is set at 1.5. -3. Any value in the feature that falls below the lower threshold or exceeds the upper threshold is labeled as an -outlier. -4. The number of outliers are tallied for different percentiles, such as [0-25], [25-50], [50-75], and [75-100]. -5. These counts are employed to construct a bar plot for the feature, showcasing the distribution of outliers -across different percentiles. - -###### Signs of High Risk - -- A prevalence of outliers in the data, potentially skewing its distribution. -- Outliers dominating higher percentiles (75-100) which implies the presence of extreme values, capable of severely -influencing the model's performance. -- Certain features harboring most of their values as outliers, which signifies that these features might not -contribute positively to the model's forecasting ability. - -###### Strengths - -- Effectively identifies outliers in the data through visual means, facilitating easier comprehension and offering -insights into the outliers' possible impact on the model. -- Provides flexibility by accommodating all numeric features or a chosen subset. -- Task-agnostic in nature; it is viable for both classification and regression tasks. -- Can handle large datasets as its operation does not hinge on computationally heavy operations. - -###### Limitations - -- Its application is limited to numerical variables and does not extend to categorical ones. -- Only reveals the presence and distribution of outliers and does not provide insights into how these outliers -might affect the model's predictive performance. -- The assumption that data is unimodal and symmetric may not always hold true. In cases with non-normal -distributions, the results can be misleading. - - - - -####### compute_outliers() - -```python -def compute_outliers(series, threshold) -``` - - - - - - - - -#### IQROutliersTable - - - - - - -####### IQROutliersTable() - -```python -def IQROutliersTable(dataset: VMDataset, threshold: float = 1.5) -``` - - -Determines and summarizes outliers in numerical features using the Interquartile Range method. - -###### Purpose - -The "Interquartile Range Outliers Table" (IQROutliersTable) metric is designed to identify and summarize outliers -within numerical features of a dataset using the Interquartile Range (IQR) method. This exercise is crucial in the -pre-processing of data because outliers can substantially distort statistical analysis and impact the performance -of machine learning models. - -###### Test Mechanism - -The IQR, which is the range separating the first quartile (25th percentile) from the third quartile (75th -percentile), is calculated for each numerical feature within the dataset. An outlier is defined as a data point -falling below the "Q1 - 1.5 * IQR" or above "Q3 + 1.5 * IQR" range. The test computes the number of outliers and -their summary statistics (minimum, 25th percentile, median, 75th percentile, and maximum values) for each numerical -feature. If no specific features are chosen, the test applies to all numerical features in the dataset. The default -outlier threshold is set to 1.5 but can be customized by the user. - -###### Signs of High Risk - -- A large number of outliers in multiple features. -- Outliers significantly distanced from the mean value of variables. -- Extremely high or low outlier values indicative of data entry errors or other data quality issues. - -###### Strengths - -- Provides a comprehensive summary of outliers for each numerical feature, helping pinpoint features with potential -quality issues. -- The IQR method is robust to extremely high or low outlier values as it is based on quartile calculations. -- Can be customized to work on selected features and set thresholds for outliers. - -###### Limitations - -- Might cause false positives if the variable deviates from a normal or near-normal distribution, especially for -skewed distributions. -- Does not provide interpretation or recommendations for addressing outliers, relying on further analysis by users -or data scientists. -- Only applicable to numerical features, not categorical data. -- Default thresholds may not be optimal for data with heavy pre-processing, manipulation, or inherently high -kurtosis (heavy tails). - - - - -####### compute_outliers() - -```python -def compute_outliers(series, threshold = 1.5) -``` - - - - - - - - -#### IsolationForestOutliers - - - - - - -####### IsolationForestOutliers() - -```python -def IsolationForestOutliers(dataset: VMDataset, random_state: int = 0, contamination: float = 0.1, feature_columns: list = None) -``` - - -Detects outliers in a dataset using the Isolation Forest algorithm and visualizes results through scatter plots. - -###### Purpose - -The IsolationForestOutliers test is designed to identify anomalies or outliers in the model's dataset using the -isolation forest algorithm. This algorithm assumes that anomalous data points can be isolated more quickly due to -their distinctive properties. By creating isolation trees and identifying instances with shorter average path -lengths, the test is able to pick out data points that differ from the majority. - -###### Test Mechanism - -The test uses the isolation forest algorithm, which builds an ensemble of isolation trees by randomly selecting -features and splitting the data based on random thresholds. It isolates anomalies rather than focusing on normal -data points. For each pair of variables, a scatter plot is generated which distinguishes the identified outliers -from the inliers. The results of the test can be visualized using these scatter plots, illustrating the distinction -between outliers and inliers. - -###### Signs of High Risk - -- The presence of high contamination, indicating a large number of anomalies -- Inability to detect clusters of anomalies that are close in the feature space -- Misclassifying normal instances as anomalies -- Failure to detect actual anomalies - -###### Strengths - -- Ability to handle large, high-dimensional datasets -- Efficiency in isolating anomalies instead of normal instances -- Insensitivity to the underlying distribution of data -- Ability to recognize anomalies even when they are not separated from the main data cloud through identifying -distinctive properties -- Visually presents the test results for better understanding and interpretability - -###### Limitations - -- Difficult to detect anomalies that are close to each other or prevalent in datasets -- Dependency on the contamination parameter which may need fine-tuning to be effective -- Potential failure in detecting collective anomalies if they behave similarly to normal data -- Potential lack of precision in identifying which features contribute most to the anomalous behavior - - - - - - - -#### JarqueBera - - - - - - -####### JarqueBera() - -```python -def JarqueBera(dataset) -``` - - -Assesses normality of dataset features in an ML model using the Jarque-Bera test. - -###### Purpose - -The purpose of the Jarque-Bera test as implemented in this metric is to determine if the features in the dataset of -a given Machine Learning model follow a normal distribution. This is crucial for understanding the distribution and -behavior of the model's features, as numerous statistical methods assume normal distribution of the data. - -###### Test Mechanism - -The test mechanism involves computing the Jarque-Bera statistic, p-value, skew, and kurtosis for each feature in -the dataset. It utilizes the 'jarque_bera' function from the 'statsmodels' library in Python, storing the results -in a dictionary. The test evaluates the skewness and kurtosis to ascertain whether the dataset follows a normal -distribution. A significant p-value (typically less than 0.05) implies that the data does not possess normal -distribution. - -###### Signs of High Risk - -- A high Jarque-Bera statistic and a low p-value (usually less than 0.05) indicate high-risk conditions. -- Such results suggest the data significantly deviates from a normal distribution. If a machine learning model -expects feature data to be normally distributed, these findings imply that it may not function as intended. - -###### Strengths - -- Provides insights into the shape of the data distribution, helping determine whether a given set of data follows -a normal distribution. -- Particularly useful for risk assessment for models that assume a normal distribution of data. -- By measuring skewness and kurtosis, it provides additional insights into the nature and magnitude of a -distribution's deviation. - -###### Limitations - -- Only checks for normality in the data distribution. It cannot provide insights into other types of distributions. -- Datasets that aren't normally distributed but follow some other distribution might lead to inaccurate risk -assessments. -- Highly sensitive to large sample sizes, often rejecting the null hypothesis (that data is normally distributed) -even for minor deviations in larger datasets. - - - - - - - -#### KPSS - - - - - - -####### KPSS() - -```python -def KPSS(dataset: VMDataset) -``` - - -Assesses the stationarity of time-series data in a machine learning model using the KPSS unit root test. - -###### Purpose - -The KPSS (Kwiatkowski-Phillips-Schmidt-Shin) unit root test is utilized to ensure the stationarity of data within a -machine learning model. It specifically works on time-series data to establish the order of integration, which is -essential for accurate forecasting. A fundamental requirement for any time series model is that the series should -be stationary. - -###### Test Mechanism - -This test calculates the KPSS score for each feature in the dataset. The KPSS score includes a statistic, a -p-value, a used lag, and critical values. The core principle behind the KPSS test is to evaluate the hypothesis -that an observable time series is stationary around a deterministic trend. If the computed statistic exceeds the -critical value, the null hypothesis (that the series is stationary) is rejected, indicating that the series is -non-stationary. - -###### Signs of High Risk - -- High KPSS score, particularly if the calculated statistic is higher than the critical value. -- Rejection of the null hypothesis, indicating that the series is recognized as non-stationary, can severely affect -the model's forecasting capability. - -###### Strengths - -- Directly measures the stationarity of a series, fulfilling a key prerequisite for many time-series models. -- The underlying logic of the test is intuitive and simple, making it easy to understand and accessible for both -developers and risk management teams. - -###### Limitations - -- Assumes the absence of a unit root in the series and doesn't differentiate between series that are stationary and -those border-lining stationarity. -- The test may have restricted power against certain alternatives. -- The reliability of the test is contingent on the number of lags selected, which introduces potential bias in the -measurement. - - - - - - - -#### LJungBox - - - - - - -####### LJungBox() - -```python -def LJungBox(dataset) -``` - - -Assesses autocorrelations in dataset features by performing a Ljung-Box test on each feature. - -###### Purpose - -The Ljung-Box test is a type of statistical test utilized to ascertain whether there are autocorrelations within a -given dataset that differ significantly from zero. In the context of a machine learning model, this test is -primarily used to evaluate data utilized in regression tasks, especially those involving time series and -forecasting. - -###### Test Mechanism - -The test operates by iterating over each feature within the dataset and applying the `acorr_ljungbox` -function from the `statsmodels.stats.diagnostic` library. This function calculates the Ljung-Box statistic and -p-value for each feature. These results are then stored in a pandas DataFrame where the columns are the feature names, -statistic, and p-value respectively. Generally, a lower p-value indicates a higher likelihood of significant -autocorrelations within the feature. - -###### Signs of High Risk - -- High Ljung-Box statistic values or low p-values. -- Presence of significant autocorrelations in the respective features. -- Potential for negative impact on model performance or bias if autocorrelations are not properly handled. - -###### Strengths - -- Powerful tool for detecting autocorrelations within datasets, especially in time series data. -- Provides quantitative measures (statistic and p-value) for precise evaluation. -- Helps avoid issues related to autoregressive residuals and other challenges in regression models. - -###### Limitations - -- Cannot detect all types of non-linearity or complex interrelationships among variables. -- Testing individual features may not fully encapsulate the dynamics of the data if features interact with each other. -- Designed more for traditional statistical models and may not be fully compatible with certain types of complex - machine learning models. - - - - - - - -#### LaggedCorrelationHeatmap - - - - - - -####### LaggedCorrelationHeatmap() - -```python -def LaggedCorrelationHeatmap(dataset: VMDataset, num_lags: int = 10) -``` - - -Assesses and visualizes correlation between target variable and lagged independent variables in a time-series -dataset. - -###### Purpose - -The LaggedCorrelationHeatmap metric is utilized to appraise and illustrate the correlation between the target -variable and delayed copies (lags) of independent variables in a time-series dataset. It assists in revealing -relationships in time-series data where the influence of an independent variable on the dependent variable is not -immediate but occurs after a period (lags). - -###### Test Mechanism - -To execute this test, Python's Pandas library pairs with Plotly to perform computations and present the -visualization in the form of a heatmap. The test begins by extracting the target variable and corresponding -independent variables from the dataset. Then, generation of lags of independent variables takes place, followed by -the calculation of correlation between these lagged variables and the target variable. The outcome is a correlation -matrix that gets recorded and illustrated as a heatmap, where different color intensities represent the strength of -the correlation, making patterns easier to identify. - -###### Signs of High Risk - -- Insignificant correlations across the heatmap, indicating a lack of noteworthy relationships between variables. -- Correlations that break intuition or previous understanding, suggesting potential issues with the dataset or the -model. - -###### Strengths - -- This metric serves as an exceptional tool for exploring and visualizing time-dependent relationships between -features and the target variable in a time-series dataset. -- It aids in identifying delayed effects that might go unnoticed with other correlation measures. -- The heatmap offers an intuitive visual representation of time-dependent correlations and influences. - -###### Limitations - -- The metric presumes linear relationships between variables, potentially ignoring non-linear relationships. -- The correlation considered is linear; therefore, intricate non-linear interactions might be overlooked. -- The metric is only applicable for time-series data, limiting its utility outside of this context. -- The number of lags chosen can significantly influence the results; too many lags can render the heatmap difficult -to interpret, while too few might overlook delayed effects. -- This metric does not take into account any causal relationships, but merely demonstrates correlation. - - - - - - - -#### MissingValues - - - - - - -####### MissingValues() - -```python -def MissingValues(dataset: VMDataset, min_threshold: int = 1) -``` - - -Evaluates dataset quality by ensuring missing value ratio across all features does not exceed a set threshold. - -###### Purpose - -The Missing Values test is designed to evaluate the quality of a dataset by measuring the number of missing values -across all features. The objective is to ensure that the ratio of missing data to total data is less than a -predefined threshold, defaulting to 1, in order to maintain the data quality necessary for reliable predictive -strength in a machine learning model. - -###### Test Mechanism - -The mechanism for this test involves iterating through each column of the dataset, counting missing values -(represented as NaNs), and calculating the percentage they represent against the total number of rows. The test -then checks if these missing value counts are less than the predefined `min_threshold`. The results are shown in a -table summarizing each column, the number of missing values, the percentage of missing values in each column, and a -Pass/Fail status based on the threshold comparison. - -###### Signs of High Risk - -- When the number of missing values in any column exceeds the `min_threshold` value. -- Presence of missing values across many columns, leading to multiple instances of failing the threshold. - -###### Strengths - -- Quick and granular identification of missing data across each feature in the dataset. -- Provides an effective and straightforward means of maintaining data quality, essential for constructing efficient -machine learning models. - -###### Limitations - -- Does not suggest the root causes of the missing values or recommend ways to impute or handle them. -- May overlook features with significant missing data but still less than the `min_threshold`, potentially -impacting the model. -- Does not account for data encoded as values like "-999" or "None," which might not technically classify as -missing but could bear similar implications. - - - - - - - -#### MissingValuesBarPlot - - - - - - -####### MissingValuesBarPlot() - -```python -def MissingValuesBarPlot(dataset: VMDataset, threshold: int = 80, fig_height: int = 600) -``` - - -Assesses the percentage and distribution of missing values in the dataset via a bar plot, with emphasis on -identifying high-risk columns based on a user-defined threshold. - -###### Purpose - -The 'MissingValuesBarPlot' metric provides a color-coded visual representation of the percentage of missing values -for each column in an ML model's dataset. The primary purpose of this metric is to easily identify and quantify -missing data, which are essential steps in data preprocessing. The presence of missing data can potentially skew -the model's predictions and decrease its accuracy. Additionally, this metric uses a pre-set threshold to categorize -various columns into ones that contain missing data above the threshold (high risk) and below the threshold (less -risky). - -###### Test Mechanism - -The test mechanism involves scanning each column in the input dataset and calculating the percentage of missing -values. It then compares each column's missing data percentage with the predefined threshold, categorizing columns -with missing data above the threshold as high-risk. The test generates a bar plot in which columns with missing -data are represented on the y-axis and their corresponding missing data percentages are displayed on the x-axis. -The color of each bar reflects the missing data percentage in relation to the threshold**: grey for values below the -threshold and light coral for those exceeding it. The user-defined threshold is represented by a red dashed line on -the plot. - -###### Signs of High Risk - -- Columns with higher percentages of missing values beyond the threshold are high-risk. These are visually -represented by light coral bars on the bar plot. - -###### Strengths - -- Helps in quickly identifying and quantifying missing data across all columns of the dataset. -- Facilitates pattern recognition through visual representation. -- Enables customization of the level of risk tolerance via a user-defined threshold. -- Supports both classification and regression tasks, sharing its versatility. - -###### Limitations - -- It only considers the quantity of missing values, not differentiating between different types of missingness -(Missing completely at random - MCAR, Missing at random - MAR, Not Missing at random - NMAR). -- It doesn't offer insights into potential approaches for handling missing entries, such as various imputation -strategies. -- The metric does not consider possible impacts of the missing data on the model's accuracy or precision. -- Interpretation of the findings and the next steps might require an expert understanding of the field. - - - - - - - -#### MutualInformation - - - - - - -####### MutualInformation() - -```python -def MutualInformation(dataset: VMDataset, min_threshold: float = 0.01, task: str = 'classification') -``` - - -Calculates mutual information scores between features and target variable to evaluate feature relevance. - -###### Purpose - -The Mutual Information test quantifies the predictive power of each feature by measuring its statistical -dependency with the target variable. This helps identify relevant features for model training and -detect potential redundant or irrelevant variables, supporting feature selection decisions and model -interpretability. - -###### Test Mechanism - -The test employs sklearn's mutual_info_classif/mutual_info_regression functions to compute mutual -information between each feature and the target. It produces a normalized score (0 to 1) for each -feature, where higher scores indicate stronger relationships. Results are presented in both tabular -format and visualized through a bar plot with a configurable threshold line. - -###### Signs of High Risk - -- Many features showing very low mutual information scores -- Key business features exhibiting unexpectedly low scores -- All features showing similar, low information content -- Large discrepancy between business importance and MI scores -- Highly skewed distribution of MI scores -- Critical features below the minimum threshold -- Unexpected zero or near-zero scores for known important features -- Inconsistent scores across different data samples - -###### Strengths - -- Captures non-linear relationships between features and target -- Scale-invariant measurement of feature relevance -- Works for both classification and regression tasks -- Provides interpretable scores (0 to 1 scale) -- Supports automated feature selection -- No assumptions about data distribution -- Handles numerical and categorical features -- Computationally efficient for most datasets - -###### Limitations - -- Requires sufficient data for reliable estimates -- May be computationally intensive for very large datasets -- Cannot detect redundant features (pairwise relationships) -- Sensitive to feature discretization for continuous variables -- Does not account for feature interactions -- May underestimate importance of rare but crucial events -- Cannot handle missing values directly -- May be affected by extreme class imbalance - - - - - - - -#### PearsonCorrelationMatrix - - - - - - -####### PearsonCorrelationMatrix() - -```python -def PearsonCorrelationMatrix(dataset) -``` - - -Evaluates linear dependency between numerical variables in a dataset via a Pearson Correlation coefficient heat map. - -###### Purpose - -This test is intended to evaluate the extent of linear dependency between all pairs of numerical variables in the -given dataset. It provides the Pearson Correlation coefficient, which reveals any high correlations present. The -purpose of doing this is to identify potential redundancy, as variables that are highly correlated can often be -removed to reduce the dimensionality of the dataset without significantly impacting the model's performance. - -###### Test Mechanism - -This metric test generates a correlation matrix for all numerical variables in the dataset using the Pearson -correlation formula. A heat map is subsequently created to visualize this matrix effectively. The color of each -point on the heat map corresponds to the magnitude and direction (positive or negative) of the correlation, with a -range from -1 (perfect negative correlation) to 1 (perfect positive correlation). Any correlation coefficients -higher than 0.7 (in absolute terms) are indicated in white in the heat map, suggesting a high degree of correlation. - -###### Signs of High Risk - -- A large number of variables in the dataset showing a high degree of correlation (coefficients approaching ±1). -This indicates redundancy within the dataset, suggesting that some variables may not be contributing new -information to the model. -- Potential risk of overfitting. - -###### Strengths - -- Detects and quantifies the linearity of relationships between variables, aiding in identifying redundant -variables to simplify models and potentially improve performance. -- The heatmap visualization provides an easy-to-understand overview of correlations, beneficial for users not -comfortable with numerical matrices. - -###### Limitations - -- Limited to detecting linear relationships, potentially missing non-linear relationships which impede -opportunities for dimensionality reduction. -- Measures only the degree of linear relationship, not the strength of one variable's effect on another. -- The 0.7 correlation threshold is arbitrary and might exclude valid dependencies with lower coefficients. - - - - - - - -#### PhillipsPerronArch - - - - - - -####### PhillipsPerronArch() - -```python -def PhillipsPerronArch(dataset: VMDataset) -``` - - -Assesses the stationarity of time series data in each feature of the ML model using the Phillips-Perron test. - -###### Purpose - -The Phillips-Perron (PP) test is used to determine the stationarity of time series data for each feature in a -dataset, which is crucial for forecasting tasks. It tests the null hypothesis that a time series is unit-root -non-stationary. This is vital for understanding the stochastic behavior of the data and ensuring the robustness and -validity of predictions generated by regression analysis models. - -###### Test Mechanism - -The PP test is conducted for each feature in the dataset as follows: - -- A data frame is created from the dataset. -- For each column, the Phillips-Perron method calculates the test statistic, p-value, lags used, and number of -observations. -- The results are then stored for each feature, providing a metric that indicates the stationarity of the time -series data. - -###### Signs of High Risk - -- A high p-value, indicating that the series has a unit root and is non-stationary. -- Test statistic values exceeding critical values, suggesting non-stationarity. -- High 'usedlag' value, pointing towards autocorrelation issues that may degrade model performance. - -###### Strengths - -- Resilience against heteroskedasticity in the error term. -- Effective for long time series data. -- Helps in determining whether the time series is stationary, aiding in the selection of suitable forecasting -models. - -###### Limitations - -- Applicable only within a univariate time series framework. -- Relies on asymptotic theory, which may reduce the test’s power for small sample sizes. -- Non-stationary time series must be converted to stationary series through differencing, potentially leading to -loss of important data points. - - - - - - - -#### ProtectedClassesCombination - - - - - - -####### ProtectedClassesCombination() - -```python -def ProtectedClassesCombination(dataset, model, protected_classes = None) -``` - - -Visualizes combinations of protected classes and their corresponding error metric differences. - -###### Purpose - -This test aims to provide insights into how different combinations of protected classes affect various error metrics, -particularly the false negative rate (FNR) and false positive rate (FPR). By visualizing these combinations, -it helps identify potential biases or disparities in model performance across different intersectional groups. - -###### Test Mechanism - -The test performs the following steps: -1. Combines the specified protected class columns to create a single multi-class category. -2. Calculates error metrics (FNR, FPR, etc.) for each combination of protected classes. -3. Generates visualizations showing the distribution of these metrics across all class combinations. - -###### Signs of High Risk - -- Large disparities in FNR or FPR across different protected class combinations. -- Consistent patterns of higher error rates for specific combinations of protected attributes. -- Unexpected or unexplainable variations in error metrics between similar group combinations. - -###### Strengths - -- Provides a comprehensive view of intersectional fairness across multiple protected attributes. -- Allows for easy identification of potentially problematic combinations of protected classes. -- Visualizations make it easier to spot patterns or outliers in model performance across groups. - -###### Limitations - -- May become complex and difficult to interpret with a large number of protected classes or combinations. -- Does not provide statistical significance of observed differences. -- Visualization alone may not capture all nuances of intersectional fairness. - - - - - - - -#### ProtectedClassesDescription - - - - - - -####### ProtectedClassesDescription() - -```python -def ProtectedClassesDescription(dataset, protected_classes = None) -``` - - -Visualizes the distribution of protected classes in the dataset relative to the target variable -and provides descriptive statistics. - -###### Purpose - -The ProtectedClassesDescription test aims to identify potential biases or significant differences in the -distribution of target outcomes across different protected classes. This visualization and statistical summary -help in understanding the relationship between protected attributes and the target variable, which is crucial -for assessing fairness in machine learning models. - -###### Test Mechanism - -The function creates interactive stacked bar charts for each specified protected class using Plotly. -Additionally, it generates a single table of descriptive statistics for all protected classes, including: - -- Protected class and category -- Count and percentage of each category within the protected class -- Mean, median, and mode of the target variable for each category -- Standard deviation of the target variable for each category -- Minimum and maximum values of the target variable for each category - -###### Signs of High Risk - -- Significant imbalances in the distribution of target outcomes across different categories of a protected class. -- Large disparities in mean, median, or mode of the target variable across categories. -- Underrepresentation or overrepresentation of certain groups within protected classes. -- High standard deviations in certain categories, indicating potential volatility or outliers. - -###### Strengths - -- Provides both visual and statistical representation of potential biases in the dataset. -- Allows for easy identification of imbalances in target variable distribution across protected classes. -- Interactive plots enable detailed exploration of the data. -- Consolidated statistical summary provides quantitative measures to complement visual analysis. -- Applicable to both classification and regression tasks. - -###### Limitations - -- Does not provide advanced statistical measures of bias or fairness. -- May become cluttered if there are many categories within a protected class or many unique target values. -- Interpretation may require domain expertise to understand the implications of observed disparities. -- Does not account for intersectionality or complex interactions between multiple protected attributes. - - - - - - - -#### ProtectedClassesDisparity - - - - - - -####### ProtectedClassesDisparity() - -```python -def ProtectedClassesDisparity(dataset, model, protected_classes = None, disparity_tolerance = 1.25, metrics = {'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}) -``` - - -Investigates disparities in model performance across different protected class segments. - -###### Purpose - -This test aims to identify and quantify potential biases in model outcomes by comparing various performance metrics -across different segments of protected classes. It helps in assessing whether the model produces discriminatory -outcomes for certain groups, which is crucial for ensuring fairness in machine learning models. - -###### Test Mechanism - -The test performs the following steps: -1. Calculates performance metrics (e.g., false negative rate, false positive rate, true positive rate) for each segment - of the specified protected classes. -2. Computes disparity ratios by comparing these metrics between different segments and a reference group. -3. Generates visualizations showing the disparities and their relation to a user-defined disparity tolerance threshold. -4. Produces a comprehensive table with various disparity metrics for detailed analysis. - -###### Signs of High Risk - -- Disparity ratios exceeding the specified disparity tolerance threshold. -- Consistent patterns of higher error rates or lower performance for specific protected class segments. -- Statistically significant differences in performance metrics across segments. - -###### Strengths - -- Provides a comprehensive view of model fairness across multiple protected attributes and metrics. -- Allows for easy identification of problematic disparities through visual and tabular representations. -- Customizable disparity tolerance threshold to align with specific use-case requirements. -- Applicable to various performance metrics, offering a multi-faceted analysis of model fairness. - -###### Limitations - -- Relies on a predefined reference group for each protected class, which may not always be the most appropriate choice. -- Does not account for intersectionality between different protected attributes. -- The interpretation of results may require domain expertise to understand the implications of observed disparities. - - - - - - - -#### ProtectedClassesThresholdOptimizer - - - - - - -####### ProtectedClassesThresholdOptimizer() - -```python -def ProtectedClassesThresholdOptimizer(dataset, pipeline = None, protected_classes = None, X_train = None, y_train = None) -``` - - -Obtains a classifier by applying group-specific thresholds to the provided estimator. - -###### Purpose - -This test aims to optimize the fairness of a machine learning model by applying different -classification thresholds for different protected groups. It helps in mitigating bias and -achieving more equitable outcomes across different demographic groups. - -###### Test Mechanism - -The test uses Fairlearn's ThresholdOptimizer to: -1. Fit an optimizer on the training data, considering protected classes. -2. Apply optimized thresholds to make predictions on the test data. -3. Calculate and report various fairness metrics. -4. Visualize the optimized thresholds. - -###### Signs of High Risk - -- Large disparities in fairness metrics (e.g., Demographic Parity Ratio, Equalized Odds Ratio) - across different protected groups. -- Significant differences in False Positive Rates (FPR) or True Positive Rates (TPR) between groups. -- Thresholds that vary widely across different protected groups. - -###### Strengths - -- Provides a post-processing method to improve model fairness without modifying the original model. -- Allows for balancing multiple fairness criteria simultaneously. -- Offers visual insights into the threshold optimization process. - -###### Limitations - -- May lead to a decrease in overall model performance while improving fairness. -- Requires access to protected attribute information at prediction time. -- The effectiveness can vary depending on the chosen fairness constraint and objective. - - - - -####### calculate_fairness_metrics() - -```python -def calculate_fairness_metrics(test_df, target, y_pred_opt, protected_classes) -``` - - - - - -####### calculate_group_metrics() - -```python -def calculate_group_metrics(test_df, target, y_pred_opt, protected_classes) -``` - - - - - -####### get_thresholds_by_group() - -```python -def get_thresholds_by_group(threshold_optimizer) -``` - - - - - -####### initialize_and_fit_optimizer() - -```python -def initialize_and_fit_optimizer(pipeline, X_train, y_train, protected_classes_df) -``` - - - - - -####### make_predictions() - -```python -def make_predictions(threshold_optimizer, test_df, protected_classes) -``` - - - - - -####### plot_thresholds() - -```python -def plot_thresholds(threshold_optimizer) -``` - - - - - - - - -#### RollingStatsPlot - - - - - - -####### RollingStatsPlot() - -```python -def RollingStatsPlot(dataset: VMDataset, window_size: int = 12) -``` - - -Evaluates the stationarity of time series data by plotting its rolling mean and standard deviation over a specified -window. - -###### Purpose - -The `RollingStatsPlot` metric is employed to gauge the stationarity of time series data in a given dataset. This -metric specifically evaluates the rolling mean and rolling standard deviation of the dataset over a pre-specified -window size. The rolling mean provides an understanding of the average trend in the data, while the rolling -standard deviation gauges the volatility of the data within the window. It is critical in preparing time series -data for modeling as it reveals key insights into data behavior across time. - -###### Test Mechanism - -This mechanism is comprised of two steps. Initially, the rolling mean and standard deviation for each of the -dataset's columns are calculated over a window size, which can be user-specified or by default set to 12 data -points. Then, the calculated rolling mean and standard deviation are visualized via separate plots, illustrating -the trends and volatility in the dataset. A straightforward check is conducted to ensure the existence of columns -in the dataset, and to verify that the given dataset has been indexed by its date and time—a necessary prerequisite -for time series analysis. - -###### Signs of High Risk - -- The presence of non-stationary patterns in either the rolling mean or the rolling standard deviation plots, which -could indicate trends or seasonality in the data that may affect the performance of time series models. -- Missing columns in the dataset, which would prevent the execution of this metric correctly. -- The detection of NaN values in the dataset, which may need to be addressed before the metric can proceed -successfully. - -###### Strengths - -- Offers visualizations of trending behavior and volatility within the data, facilitating a broader understanding -of the dataset's inherent characteristics. -- Checks of the dataset's integrity, such as the existence of all required columns and the availability of a -datetime index. -- Adjusts to accommodate various window sizes, thus allowing accurate analysis of data with differing temporal -granularities. -- Considers each column of the data individually, thereby accommodating multi-feature datasets. - -###### Limitations - -- For all columns, a fixed-size window is utilized. This may not accurately capture patterns in datasets where -different features may require different optimal window sizes. -- Requires the dataset to be indexed by date and time, hence it may not be usable for datasets without a timestamp -index. -- Primarily serves for data visualization as it does not facilitate any quantitative measures for stationarity, -such as through statistical tests. Therefore, the interpretation is subjective and depends heavily on modeler -discretion. - - - - -####### plot_rolling_statistics() - -```python -def plot_rolling_statistics(df, col, window_size) -``` - - - - - - - - -#### RunsTest - - - - - - -####### RunsTest() - -```python -def RunsTest(dataset) -``` - - -Executes Runs Test on ML model to detect non-random patterns in output data sequence. - -###### Purpose - -The Runs Test is a statistical procedure used to determine whether the sequence of data extracted from the ML model -behaves randomly or not. Specifically, it analyzes runs, sequences of consecutive positives or negatives, in the -data to check if there are more or fewer runs than expected under the assumption of randomness. This can be an -indication of some pattern, trend, or cycle in the model's output which may need attention. - -###### Test Mechanism - -The testing mechanism applies the Runs Test from the statsmodels module on each column of the training dataset. For -every feature in the dataset, a Runs Test is executed, whose output includes a Runs Statistic and P-value. A low -P-value suggests that data arrangement in the feature is not likely to be random. The results are stored in a -dictionary where the keys are the feature names, and the values are another dictionary storing the test statistic -and the P-value for each feature. - -###### Signs of High Risk - -- High risk is indicated when the P-value is close to zero. -- If the P-value is less than a predefined significance level (like 0.05), it suggests that the runs (series of -positive or negative values) in the model's output are not random and are longer or shorter than what is expected -under a random scenario. -- This would mean there's a high risk of non-random distribution of errors or model outcomes, suggesting potential -issues with the model. - -###### Strengths - -- Straightforward and fast for detecting non-random patterns in data sequence. -- Validates assumptions of randomness, which is valuable for checking error distributions in regression models, -trendless time series data, and ensuring a classifier doesn't favor one class over another. -- Can be applied to both classification and regression tasks, making it versatile. - -###### Limitations - -- Assumes that the data is independently and identically distributed (i.i.d.), which might not be the case for many -real-world datasets. -- The conclusion drawn from the low P-value indicating non-randomness does not provide information about the type -or the source of the detected pattern. -- Sensitive to extreme values (outliers), and overly large or small run sequences can influence the results. -- Does not provide model performance evaluation; it is used to detect patterns in the sequence of outputs only. - - - - - - - -#### ScatterPlot - - - - - - -####### ScatterPlot() - -```python -def ScatterPlot(dataset) -``` - - -Assesses visual relationships, patterns, and outliers among features in a dataset through scatter plot matrices. - -###### Purpose - -The ScatterPlot test aims to visually analyze a given dataset by constructing a scatter plot matrix of its -numerical features. The primary goal is to uncover relationships, patterns, and outliers across different features -to provide both quantitative and qualitative insights into multidimensional relationships within the dataset. This -visual assessment aids in understanding the efficacy of the chosen features for model training and their -suitability. - -###### Test Mechanism - -Using the Seaborn library, the ScatterPlot function creates the scatter plot matrix. The process involves -retrieving all numerical columns from the dataset and generating a scatter matrix for these columns. The resulting -scatter plot provides visual representations of feature relationships. The function also adjusts axis labels for -readability and returns the final plot as a Matplotlib Figure object for further analysis and visualization. - -###### Signs of High Risk - -- The emergence of non-linear or random patterns across different feature pairs, suggesting complex relationships -unsuitable for linear assumptions. -- Lack of clear patterns or clusters, indicating weak or non-existent correlations among features, which could -challenge certain model types. -- Presence of outliers, as visual outliers can adversely influence the model's performance. - -###### Strengths - -- Provides insight into the multidimensional relationships among multiple features. -- Assists in identifying trends, correlations, and outliers that could affect model performance. -- Validates assumptions made during model creation, such as linearity. -- Versatile for application in both regression and classification tasks. -- Using Seaborn facilitates an intuitive and detailed visual exploration of data. - -###### Limitations - -- Scatter plot matrices may become cluttered and hard to decipher as the number of features increases. -- Primarily reveals pairwise relationships and may fail to illuminate complex interactions involving three or more -features. -- Being a visual tool, precision in quantitative analysis might be compromised. -- Outliers not clearly visible in plots can be missed, affecting model performance. -- Assumes that the dataset can fit into the computer's memory, which might not be valid for extremely large -datasets. - - - - - - - -#### ScoreBandDefaultRates - - - - - - -####### ScoreBandDefaultRates() - -```python -def ScoreBandDefaultRates(dataset: VMDataset, model: VMModel, score_column: str = 'score', score_bands: list = None) -``` - - -Analyzes default rates and population distribution across credit score bands. - -###### Purpose - -The Score Band Default Rates test evaluates the discriminatory power of credit scores by analyzing -default rates across different score bands. This helps validate score effectiveness, supports -policy decisions, and provides insights into portfolio risk distribution. - -###### Test Mechanism - -The test segments the score distribution into bands and calculates key metrics for each band: -1. Population count and percentage in each band -2. Default rate within each band -3. Cumulative statistics across bands -The results show how well the scores separate good and bad accounts. - -###### Signs of High Risk - -- Non-monotonic default rates across score bands -- Insufficient population in critical score bands -- Unexpected default rates for score ranges -- High concentration in specific score bands -- Similar default rates across adjacent bands -- Unstable default rates in key decision bands -- Extreme population skewness -- Poor risk separation between bands - -###### Strengths - -- Clear view of score effectiveness -- Supports policy threshold decisions -- Easy to interpret and communicate -- Directly links to business decisions -- Shows risk segmentation power -- Identifies potential score issues -- Helps validate scoring model -- Supports portfolio monitoring - -###### Limitations - -- Sensitive to band definition choices -- May mask within-band variations -- Requires sufficient data in each band -- Cannot capture non-linear patterns -- Point-in-time analysis only -- No temporal trend information -- Assumes band boundaries are appropriate -- May oversimplify risk patterns - - - - - - - -#### SeasonalDecompose - - - - - - -####### SeasonalDecompose() - -```python -def SeasonalDecompose(dataset: VMDataset, seasonal_model: str = 'additive') -``` - - -Assesses patterns and seasonality in a time series dataset by decomposing its features into foundational components. - -###### Purpose - -The Seasonal Decompose test aims to decompose the features of a time series dataset into their fundamental -components**: observed, trend, seasonal, and residuals. By utilizing the Seasonal Decomposition of Time Series by -Loess (STL) method, the test identifies underlying patterns, predominantly seasonality, in the dataset's features. -This aids in developing a more comprehensive understanding of the dataset, which in turn facilitates more effective -model validation. - -###### Test Mechanism - -The testing process leverages the `seasonal_decompose` function from the `statsmodels.tsa.seasonal` library to -evaluate each feature in the dataset. It isolates each feature into four components—observed, trend, seasonal, and -residuals—and generates six subplot graphs per feature for visual interpretation. Prior to decomposition, the test -scrutinizes and removes any non-finite values, ensuring the reliability of the analysis. - -###### Signs of High Risk - -- **Non-Finiteness**: Datasets with a high number of non-finite values may flag as high risk since these values are -omitted before conducting the seasonal decomposition. -- **Frequent Warnings**: Chronic failure to infer the frequency for a scrutinized feature indicates high risk. -- **High Seasonality**: A significant seasonal component could potentially render forecasts unreliable due to -overwhelming seasonal variation. - -###### Strengths - -- **Seasonality Detection**: Accurately discerns hidden seasonality patterns in dataset features. -- **Visualization**: Facilitates interpretation and comprehension through graphical representations. -- **Unrestricted Usage**: Not confined to any specific regression model, promoting wide-ranging applicability. - -###### Limitations - -- **Dependence on Assumptions**: Assumes that dataset features are periodically distributed. Features with no -inferable frequency are excluded from the test. -- **Handling Non-Finite Values**: Disregards non-finite values during analysis, potentially resulting in an -incomplete understanding of the dataset. -- **Unreliability with Noisy Datasets**: Produces unreliable results when used with datasets that contain heavy -noise. - - - - - - - -#### ShapiroWilk - - - - - - -####### ShapiroWilk() - -```python -def ShapiroWilk(dataset) -``` - - -Evaluates feature-wise normality of training data using the Shapiro-Wilk test. - -###### Purpose - -The Shapiro-Wilk test is utilized to investigate whether a particular dataset conforms to the standard normal -distribution. This analysis is crucial in machine learning modeling because the normality of the data can -profoundly impact the performance of the model. This metric is especially useful in evaluating various features of -the dataset in both classification and regression tasks. - -###### Test Mechanism - -The Shapiro-Wilk test is conducted on each feature column of the training dataset to determine if the data -contained fall within the normal distribution. The test presents a statistic and a p-value, with the p-value -serving to validate or repudiate the null hypothesis, which is that the tested data is normally distributed. - -###### Signs of High Risk - -- A p-value that falls below 0.05 signifies a high risk as it discards the null hypothesis, indicating that the -data does not adhere to the normal distribution. -- For machine learning models built on the presumption of data normality, such an outcome could result in subpar -performance or incorrect predictions. - -###### Strengths - -- The Shapiro-Wilk test is esteemed for its level of accuracy, thereby making it particularly well-suited to -datasets of small to moderate sizes. -- It proves its versatility through its efficient functioning in both classification and regression tasks. -- By separately testing each feature column, the Shapiro-Wilk test can raise an alarm if a specific feature does -not comply with the normality. - -###### Limitations - -- The Shapiro-Wilk test's sensitivity can be a disadvantage as it often rejects the null hypothesis (i.e., data is -normally distributed), even for minor deviations, especially in large datasets. This may lead to unwarranted 'false -alarms' of high risk by deeming the data as not normally distributed even if it approximates normal distribution. -- Exceptional care must be taken in managing missing data or outliers prior to testing as these can greatly skew -the results. -- Lastly, the Shapiro-Wilk test is not optimally suited for processing data with pronounced skewness or kurtosis. - - - - - - - -#### Skewness - - - - - - -####### Skewness() - -```python -def Skewness(dataset, max_threshold = 1) -``` - - -Evaluates the skewness of numerical data in a dataset to check against a defined threshold, aiming to ensure data -quality and optimize model performance. - -###### Purpose - -The purpose of the Skewness test is to measure the asymmetry in the distribution of data within a predictive -machine learning model. Specifically, it evaluates the divergence of said distribution from a normal distribution. -Understanding the level of skewness helps identify data quality issues, which are crucial for optimizing the -performance of traditional machine learning models in both classification and regression settings. - -###### Test Mechanism - -This test calculates the skewness of numerical columns in the dataset, focusing specifically on numerical data -types. The calculated skewness value is then compared against a predetermined maximum threshold, which is set by -default to 1. If the skewness value is less than this maximum threshold, the test passes; otherwise, it fails. The -test results, along with the skewness values and column names, are then recorded for further analysis. - -###### Signs of High Risk - -- Substantial skewness levels that significantly exceed the maximum threshold. -- Persistent skewness in the data, indicating potential issues with the foundational assumptions of the machine -learning model. -- Subpar model performance, erroneous predictions, or biased inferences due to skewed data distributions. - -###### Strengths - -- Fast and efficient identification of unequal data distributions within a machine learning model. -- Adjustable maximum threshold parameter, allowing for customization based on user needs. -- Provides a clear quantitative measure to mitigate model risks related to data skewness. - -###### Limitations - -- Only evaluates numeric columns, potentially missing skewness or bias in non-numeric data. -- Assumes that data should follow a normal distribution, which may not always be applicable to real-world data. -- Subjective threshold for risk grading, requiring expert input and recurrent iterations for refinement. - - - - - - - -#### SpreadPlot - - - - - - -####### SpreadPlot() - -```python -def SpreadPlot(dataset: VMDataset) -``` - - -Assesses potential correlations between pairs of time series variables through visualization to enhance -understanding of their relationships. - -###### Purpose - -The SpreadPlot test aims to graphically illustrate and analyze the relationships between pairs of time series -variables within a given dataset. This facilitated understanding helps in identifying and assessing potential time -series correlations, such as cointegration, between the variables. - -###### Test Mechanism - -The SpreadPlot test computes and represents the spread between each pair of time series variables in the dataset. -Specifically, the difference between two variables is calculated and presented as a line graph. This process is -iterated for each unique pair of variables in the dataset, allowing for comprehensive visualization of their -relationships. - -###### Signs of High Risk - -- Large fluctuations in the spread over a given timespan. -- Unexpected patterns or trends that may signal potential risks in the underlying correlations between the -variables. -- Presence of significant missing data or extreme outlier values, which could potentially skew the spread and -indicate high risk. - -###### Strengths - -- Allows for thorough visual examination and interpretation of the correlations between time-series pairs. -- Aids in revealing complex relationships like cointegration. -- Enhances interpretability by visualizing the relationships, thereby helping in spotting outliers and trends. -- Capable of handling numerous variable pairs from the dataset through a versatile and adaptable process. - -###### Limitations - -- Primarily serves as a visualization tool and does not offer quantitative measurements or statistics to -objectively determine relationships. -- Heavily relies on the quality and granularity of the data—missing data or outliers can notably disturb the -interpretation of relationships. -- Can become inefficient or difficult to interpret with a high number of variables due to the profuse number of -plots. -- Might not completely capture intricate non-linear relationships between the variables. - - - - - - - -#### TabularCategoricalBarPlots - - - - - - -####### TabularCategoricalBarPlots() - -```python -def TabularCategoricalBarPlots(dataset: VMDataset) -``` - - -Generates and visualizes bar plots for each category in categorical features to evaluate the dataset's composition. - -###### Purpose - -The purpose of this metric is to visually analyze categorical data using bar plots. It is intended to evaluate the -dataset's composition by displaying the counts of each category in each categorical feature. - -###### Test Mechanism - -The provided dataset is first checked to determine if it contains any categorical variables. If no categorical -columns are found, the tool raises a ValueError. For each categorical variable in the dataset, a separate bar plot -is generated. The number of occurrences for each category is calculated and displayed on the plot. If a dataset -contains multiple categorical columns, multiple bar plots are produced. - -###### Signs of High Risk - -- High risk could occur if the categorical variables exhibit an extreme imbalance, with categories having very few -instances possibly being underrepresented in the model, which could affect the model's performance and its ability -to generalize. -- Another sign of risk is if there are too many categories in a single variable, which could lead to overfitting -and make the model complex. - -###### Strengths - -- Provides a visual and intuitively understandable representation of categorical data. -- Aids in the analysis of variable distributions. -- Helps in easily identifying imbalances or rare categories that could affect the model's performance. - -###### Limitations - -- This method only works with categorical data and won't apply to numerical variables. -- It does not provide informative value when there are too many categories, as the bar chart could become cluttered -and hard to interpret. -- Offers no insights into the model's performance or precision, but rather provides a descriptive analysis of the -input. - - - - - - - -#### TabularDateTimeHistograms - - - - - - -####### TabularDateTimeHistograms() - -```python -def TabularDateTimeHistograms(dataset: VMDataset) -``` - - -Generates histograms to provide graphical insight into the distribution of time intervals in a model's datetime -data. - -###### Purpose - -The `TabularDateTimeHistograms` metric is designed to provide graphical insight into the distribution of time -intervals in a machine learning model's datetime data. By plotting histograms of differences between consecutive -date entries in all datetime variables, it enables an examination of the underlying pattern of time series data and -identification of anomalies. - -###### Test Mechanism - -This test operates by first identifying all datetime columns and extracting them from the dataset. For each -datetime column, it next computes the differences (in days) between consecutive dates, excluding zero values, and -visualizes these differences in a histogram. The Plotly library's histogram function is used to generate -histograms, which are labeled appropriately and provide a graphical representation of the frequency of different -day intervals in the dataset. - -###### Signs of High Risk - -- If no datetime columns are detected in the dataset, this would lead to a ValueError. Hence, the absence of -datetime columns signifies a high risk. -- A severely skewed or irregular distribution depicted in the histogram may indicate possible complications with -the data, such as faulty timestamps or abnormalities. - -###### Strengths - -- The metric offers a visual overview of time interval frequencies within the dataset, supporting the recognition -of inherent patterns. -- Histogram plots can aid in the detection of potential outliers and data anomalies, contributing to an assessment -of data quality. -- The metric is versatile, compatible with a range of task types, including classification and regression, and can -work with multiple datetime variables if present. - -###### Limitations - -- A major weakness of this metric is its dependence on the visual examination of data, as it does not provide a -measurable evaluation of the model. -- The metric might overlook complex or multi-dimensional trends in the data. -- The test is only applicable to datasets containing datetime columns and will fail if such columns are unavailable. -- The interpretation of the histograms relies heavily on the domain expertise and experience of the reviewer. - - - - - - - -#### TabularDescriptionTables - - - - - - -####### TabularDescriptionTables() - -```python -def TabularDescriptionTables(dataset) -``` - - -Summarizes key descriptive statistics for numerical, categorical, and datetime variables in a dataset. - -###### Purpose - -The main purpose of this metric is to gather and present the descriptive statistics of numerical, categorical, and -datetime variables present in a dataset. The attributes it measures include the count, mean, minimum and maximum -values, percentage of missing values, data types of fields, and unique values for categorical fields, among others. - -###### Test Mechanism - -The test first segregates the variables in the dataset according to their data types (numerical, categorical, or -datetime). Then, it compiles summary statistics for each type of variable. The specifics of these statistics vary -depending on the type of variable: - -- For numerical variables, the metric extracts descriptors like count, mean, minimum and maximum values, count of -missing values, and data types. -- For categorical variables, it counts the number of unique values, displays unique values, counts missing values, -and identifies data types. -- For datetime variables, it counts the number of unique values, identifies the earliest and latest dates, counts -missing values, and identifies data types. - -###### Signs of High Risk - -- Masses of missing values in the descriptive statistics results could hint at high risk or failure, indicating -potential data collection, integrity, and quality issues. -- Detection of inappropriate distributions for numerical variables, like having negative values for variables that -are always supposed to be positive. -- Identifying inappropriate data types, like a continuous variable being encoded as a categorical type. - -###### Strengths - -- Provides a comprehensive overview of the dataset. -- Gives a snapshot into the essence of the numerical, categorical, and datetime fields. -- Identifies potential data quality issues such as missing values or inconsistencies crucial for building credible -machine learning models. -- The metadata, including the data type and missing value information, are vital for anyone including data -scientists dealing with the dataset before the modeling process. - -###### Limitations - -- It does not perform any deeper statistical analysis or tests on the data. -- It does not handle issues such as outliers, or relationships between variables. -- It offers no insights into potential correlations or possible interactions between variables. -- It does not investigate the potential impact of missing values on the performance of the machine learning models. -- It does not explore potential transformation requirements that may be necessary to enhance the performance of the -chosen algorithm. - - - - -####### get_categorical_columns() - -```python -def get_categorical_columns(dataset) -``` - - - - - -####### get_datetime_columns() - -```python -def get_datetime_columns(dataset) -``` - - - - - -####### get_numerical_columns() - -```python -def get_numerical_columns(dataset) -``` - - - - - -####### get_summary_statistics_categorical() - -```python -def get_summary_statistics_categorical(dataset, categorical_fields) -``` - - - - - -####### get_summary_statistics_datetime() - -```python -def get_summary_statistics_datetime(dataset, datetime_fields) -``` - - - - - -####### get_summary_statistics_numerical() - -```python -def get_summary_statistics_numerical(dataset, numerical_fields) -``` - - - - - - - - -#### TabularNumericalHistograms - - - - - - -####### TabularNumericalHistograms() - -```python -def TabularNumericalHistograms(dataset: VMDataset) -``` - - -Generates histograms for each numerical feature in a dataset to provide visual insights into data distribution and -detect potential issues. - -###### Purpose - -The purpose of this test is to provide visual analysis of numerical data through the generation of histograms for -each numerical feature in the dataset. Histograms aid in the exploratory analysis of data, offering insight into -the distribution of the data, skewness, presence of outliers, and central tendencies. It helps in understanding if -the inputs to the model are normally distributed, which is a common assumption in many machine learning algorithms. - -###### Test Mechanism - -This test scans the provided dataset and extracts all the numerical columns. For each numerical column, it -constructs a histogram using plotly, with 50 bins. The deployment of histograms offers a robust visual aid, -ensuring unruffled identification and understanding of numerical data distribution patterns. - -###### Signs of High Risk - -- A high degree of skewness -- Unexpected data distributions -- Existence of extreme outliers in the histograms - -These may indicate issues with the data that the model is receiving. If data for a numerical feature is expected to -follow a certain distribution (like a normal distribution) but does not, it could lead to sub-par performance by -the model. As such these instances should be treated as high-risk indicators. - -###### Strengths - -- Provides a simple, easy-to-interpret visualization of how data for each numerical attribute is distributed. -- Helps detect skewed values and outliers that could potentially harm the AI model's performance. -- Can be applied to large datasets and multiple numerical variables conveniently. - -###### Limitations - -- Only works with numerical data, thus ignoring non-numerical or categorical data. -- Does not analyze relationships between different features, only the individual feature distributions. -- Is a univariate analysis and may miss patterns or anomalies that only appear when considering multiple variables -together. -- Does not provide any insight into how these features affect the output of the model; it is purely an input -analysis tool. - - - - - - - -#### TargetRateBarPlots - - - - - - -####### TargetRateBarPlots() - -```python -def TargetRateBarPlots(dataset: VMDataset) -``` - - -Generates bar plots visualizing the default rates of categorical features for a classification machine learning -model. - -###### Purpose - -This test, implemented as a metric, is designed to provide an intuitive, graphical summary of the decision-making -patterns exhibited by a categorical classification machine learning model. The model's performance is evaluated -using bar plots depicting the ratio of target rates—meaning the proportion of positive classes—for different -categorical inputs. This allows for an easy, at-a-glance understanding of the model's accuracy. - -###### Test Mechanism - -The test involves creating a pair of bar plots for each categorical feature in the dataset. The first plot depicts -the frequency of each category in the dataset, with each category visually distinguished by its unique color. The -second plot shows the mean target rate of each category (sourced from the "default_column"). Plotly, a Python -library, is used to generate these plots, with distinct plots created for each feature. If no specific columns are -selected, the test will generate plots for each categorical column in the dataset. - -###### Signs of High Risk - -- Inconsistent or non-binary values in the "default_column" could complicate or render impossible the calculation -of average target rates. -- Particularly low or high target rates for a specific category might suggest that the model is misclassifying -instances of that category. - -###### Strengths - -- This test offers a visually interpretable breakdown of the model's decisions, providing an easy way to spot -irregularities, inconsistencies, or patterns. -- Its flexibility allows for the inspection of one or multiple columns, as needed. - -###### Limitations - -- The readability of the bar plots drops as the number of distinct categories increases in the dataset, which can -make them harder to understand and less useful. - - - - - - - -#### TimeSeriesDescription - - - - - - -####### TimeSeriesDescription() - -```python -def TimeSeriesDescription(dataset) -``` - - -Generates a detailed analysis for the provided time series dataset, summarizing key statistics to identify trends, -patterns, and data quality issues. - -###### Purpose - -The TimeSeriesDescription function aims to analyze an individual time series by providing a summary of key -statistics. This helps in understanding trends, patterns, and data quality issues within the time series. - -###### Test Mechanism - -The function extracts the time series data and provides a summary of key statistics. The dataset is expected to -have a datetime index. The function checks this and raises an error if the index is not in datetime format. For -each variable (column) in the dataset, appropriate statistics including start date, end date, frequency, number of -missing values, count, min, and max values are calculated. - -###### Signs of High Risk - -- If the index of the dataset is not in datetime format, it could lead to errors in time-series analysis. -- Inconsistent or missing data within the dataset might affect the analysis of trends and patterns. - -###### Strengths - -- Provides a comprehensive summary of key statistics for each variable, helping to identify data quality issues -such as missing values. -- Helps in understanding the distribution and range of the data by including min and max values. - -###### Limitations - -- Assumes that the dataset is provided as a DataFrameDataset object with a .df attribute to access the pandas -DataFrame. -- Only analyzes datasets with a datetime index and will raise an error for other types of indices. -- Does not handle large datasets efficiently; performance may degrade with very large datasets. - - - - - - - -#### TimeSeriesDescriptiveStatistics - - - - - - -####### TimeSeriesDescriptiveStatistics() - -```python -def TimeSeriesDescriptiveStatistics(dataset) -``` - - -Evaluates the descriptive statistics of a time series dataset to identify trends, patterns, and data quality issues. - -###### Purpose - -The purpose of the TimeSeriesDescriptiveStatistics function is to analyze an individual time series by providing a -summary of key descriptive statistics. This analysis helps in understanding trends, patterns, and data quality -issues within the time series dataset. - -###### Test Mechanism - -The function extracts the time series data and provides a summary of key descriptive statistics. The dataset is -expected to have a datetime index, and the function will check this and raise an error if the index is not in a -datetime format. For each variable (column) in the dataset, appropriate statistics, including start date, end date, -min, mean, max, skewness, kurtosis, and count, are calculated. - -###### Signs of High Risk - -- If the index of the dataset is not in datetime format, it could lead to errors in time-series analysis. -- Inconsistent or missing data within the dataset might affect the analysis of trends and patterns. - -###### Strengths - -- Provides a comprehensive summary of key descriptive statistics for each variable. -- Helps identify data quality issues and understand the distribution of the data. - -###### Limitations - -- Assumes the dataset is provided as a DataFrameDataset object with a .df attribute to access the pandas DataFrame. -- Only analyzes datasets with a datetime index and will raise an error for other types of indices. -- Does not handle large datasets efficiently, and performance may degrade with very large datasets. - - - - - - - -#### TimeSeriesFrequency - - - - - - -####### TimeSeriesFrequency() - -```python -def TimeSeriesFrequency(dataset: VMDataset) -``` - - -Evaluates consistency of time series data frequency and generates a frequency plot. - -###### Purpose - -The purpose of the TimeSeriesFrequency test is to evaluate the consistency in the frequency of data points in a -time-series dataset. This test inspects the intervals or duration between each data point to determine if a fixed -pattern (such as daily, weekly, or monthly) exists. The identification of such patterns is crucial to time-series -analysis as any irregularities could lead to erroneous results and hinder the model's capacity for identifying -trends and patterns. - -###### Test Mechanism - -Initially, the test checks if the dataframe index is in datetime format. Subsequently, it utilizes pandas' -`infer_freq` method to identify the frequency of each data series within the dataframe. The `infer_freq` method -attempts to establish the frequency of a time series and returns both the frequency string and a dictionary -relating these strings to their respective labels. The test compares the frequencies of all datasets. If they share -a common frequency, the test passes, but it fails if they do not. Additionally, Plotly is used to create a -frequency plot, offering a visual depiction of the time differences between consecutive entries in the dataframe -index. - -###### Signs of High Risk - -- The test fails, indicating multiple unique frequencies within the dataset. This failure could suggest irregular -intervals between observations, potentially interrupting pattern recognition or trend analysis. -- The presence of missing or null frequencies could be an indication of inconsistencies in data or gaps within the -data collection process. - -###### Strengths - -- This test uses a systematic approach to checking the consistency of data frequency within a time-series dataset. -- It increases the model's reliability by asserting the consistency of observations over time, an essential factor -in time-series analysis. -- The test generates a visual plot, providing an intuitive representation of the dataset's frequency distribution, -which caters to visual learners and aids in interpretation and explanation. - -###### Limitations - -- This test is only applicable to time-series datasets and hence not suitable for other types of datasets. -- The `infer_freq` method might not always correctly infer frequency when faced with missing or irregular data -points. -- Depending on context or the model under development, mixed frequencies might sometimes be acceptable, but this -test considers them a failing condition. - - - - - - - -#### TimeSeriesHistogram - - - - - - -####### TimeSeriesHistogram() - -```python -def TimeSeriesHistogram(dataset, nbins = 30) -``` - - -Visualizes distribution of time-series data using histograms and Kernel Density Estimation (KDE) lines. - -###### Purpose - -The TimeSeriesHistogram test aims to perform a histogram analysis on time-series data to assess the distribution of -values within a dataset over time. This test is useful for regression tasks and can be applied to various types of -data, such as internet traffic, stock prices, and weather data, providing insights into the probability -distribution, skewness, and kurtosis of the dataset. - -###### Test Mechanism - -This test operates on a specific column within the dataset that must have a datetime type index. For each column in -the dataset, a histogram is created using Plotly's histplot function. If the dataset includes more than one -time-series, a distinct histogram is plotted for each series. Additionally, a Kernel Density Estimate (KDE) line is -drawn for each histogram, visualizing the data's underlying probability distribution. The x and y-axis labels are -hidden to focus solely on the data distribution. - -###### Signs of High Risk - -- The dataset lacks a column with a datetime type index. -- The specified columns do not exist within the dataset. -- High skewness or kurtosis in the data distribution, indicating potential bias. -- Presence of significant outliers in the data distribution. - -###### Strengths - -- Serves as a visual diagnostic tool for understanding data behavior and distribution trends. -- Effective for analyzing both single and multiple time-series data. -- KDE line provides a smooth estimate of the overall trend in data distribution. - -###### Limitations - -- Provides a high-level view without specific numeric measures such as skewness or kurtosis. -- The histogram loses some detail due to binning of data values. -- Cannot handle non-numeric data columns. -- Histogram shape may be sensitive to the number of bins used. - - - - - - - -#### TimeSeriesLinePlot - - - - - - -####### TimeSeriesLinePlot() - -```python -def TimeSeriesLinePlot(dataset: VMDataset) -``` - - -Generates and analyses time-series data through line plots revealing trends, patterns, anomalies over time. - -###### Purpose - -The TimeSeriesLinePlot metric is designed to generate and analyze time series data through the creation of line -plots. This assists in the initial inspection of the data by providing a visual representation of patterns, trends, -seasonality, irregularity, and anomalies that may be present in the dataset over a period of time. - -###### Test Mechanism - -The mechanism for this Python class involves extracting the column names from the provided dataset and subsequently -generating line plots for each column using the Plotly Python library. For every column in the dataset, a -time-series line plot is created where the values are plotted against the dataset's datetime index. It is important -to note that indexes that are not of datetime type will result in a ValueError. - -###### Signs of High Risk - -- Presence of time-series data that does not have datetime indices. -- Provided columns do not exist in the provided dataset. -- The detection of anomalous patterns or irregularities in the time-series plots, indicating potential high model -instability or probable predictive error. - -###### Strengths - -- The visual representation of complex time series data, which simplifies understanding and helps in recognizing -temporal trends, patterns, and anomalies. -- The adaptability of the metric, which allows it to effectively work with multiple time series within the same -dataset. -- Enables the identification of anomalies and irregular patterns through visual inspection, assisting in spotting -potential data or model performance problems. - -###### Limitations - -- The effectiveness of the metric is heavily reliant on the quality and patterns of the provided time series data. -- Exclusively a visual tool, it lacks the capability to provide quantitative measurements, making it less effective -for comparing and ranking multiple models or when specific numerical diagnostics are needed. -- The metric necessitates that the time-specific data has been transformed into a datetime index, with the data -formatted correctly. -- The metric has an inherent limitation in that it cannot extract deeper statistical insights from the time series -data, which can limit its efficacy with complex data structures and phenomena. - - - - - - - -#### TimeSeriesMissingValues - - - - - - -####### TimeSeriesMissingValues() - -```python -def TimeSeriesMissingValues(dataset: VMDataset, min_threshold: int = 1) -``` - - -Validates time-series data quality by confirming the count of missing values is below a certain threshold. - -###### Purpose - -This test is designed to validate the quality of a historical time-series dataset by verifying that the number of -missing values is below a specified threshold. As time-series models greatly depend on the continuity and -temporality of data points, missing values could compromise the model's performance. Consequently, this test aims -to ensure data quality and readiness for the machine learning model, safeguarding its predictive capacity. - -###### Test Mechanism - -The test method commences by validating if the dataset has a datetime index; if not, an error is raised. It -establishes a lower limit threshold for missing values and performs a missing values check on each column of the -dataset. An object for the test result is created stating whether the number of missing values is within the -specified threshold. Additionally, the test calculates the percentage of missing values alongside the raw count. - -###### Signs of High Risk - -- The number of missing values in any column of the dataset surpasses the threshold, marking a failure and a -high-risk scenario. The reasons could range from incomplete data collection, faulty sensors to data preprocessing -errors. - -###### Strengths - -- Effectively identifies missing values which could adversely affect the model’s performance. -- Applicable and customizable through the threshold parameter across different data sets. -- Goes beyond raw numbers by calculating the percentage of missing values, offering a more relative understanding -of data scarcity. - -###### Limitations - -- Although it identifies missing values, the test does not provide solutions to handle them. -- The test demands that the dataset should have a datetime index, hence limiting its use only to time series -analysis. -- The test's sensitivity to the 'min_threshold' parameter may raise false alarms if set too strictly or may -overlook problematic data if set too loosely. -- Solely focuses on the 'missingness' of the data and might fall short in addressing other aspects of data quality. - - - - - - - -#### TimeSeriesOutliers - - - - - - -####### TimeSeriesOutliers() - -```python -def TimeSeriesOutliers(dataset: VMDataset, zscore_threshold: int = 3) -``` - - -Identifies and visualizes outliers in time-series data using the z-score method. - -###### Purpose - -This test is designed to identify outliers in time-series data using the z-score method. It's vital for ensuring -data quality before modeling, as outliers can skew predictive models and significantly impact their overall -performance. - -###### Test Mechanism - -The test processes a given dataset which must have datetime indexing, checks if a 'zscore_threshold' parameter has -been supplied, and identifies columns with numeric data types. After finding numeric columns, the implementer then -applies the z-score method to each numeric column, identifying outliers based on the threshold provided. Each -outlier is listed together with their variable name, z-score, timestamp, and relative threshold in a dictionary and -converted to a DataFrame for convenient output. Additionally, it produces visual plots for each time series -illustrating outliers in the context of the broader dataset. The 'zscore_threshold' parameter sets the limit beyond -which a data point will be labeled as an outlier. The default threshold is set at 3, indicating that any data point -that falls 3 standard deviations away from the mean will be marked as an outlier. - -###### Signs of High Risk - -- Many or substantial outliers are present within the dataset, indicating significant anomalies. -- Data points with z-scores higher than the set threshold. -- Potential impact on the performance of machine learning models if outliers are not properly addressed. - -###### Strengths - -- The z-score method is a popular and robust method for identifying outliers in a dataset. -- Simplifies time series maintenance by requiring a datetime index. -- Identifies outliers for each numeric feature individually. -- Provides an elaborate report showing variables, dates, z-scores, and pass/fail tests. -- Offers visual inspection for detected outliers through plots. - -###### Limitations - -- The test only identifies outliers in numeric columns, not in categorical variables. -- The utility and accuracy of z-scores can be limited if the data doesn't follow a normal distribution. -- The method relies on a subjective z-score threshold for deciding what constitutes an outlier, which might not -always be suitable depending on the dataset and use case. -- It does not address possible ways to handle identified outliers in the data. -- The requirement for a datetime index could limit its application. - - - - - - - -#### TooManyZeroValues - - - - - - -####### TooManyZeroValues() - -```python -def TooManyZeroValues(dataset: VMDataset, max_percent_threshold: float = 0.03) -``` - - -Identifies numerical columns in a dataset that contain an excessive number of zero values, defined by a threshold -percentage. - -###### Purpose - -The 'TooManyZeroValues' test is utilized to identify numerical columns in the dataset that may present a quantity -of zero values considered excessive. The aim is to detect situations where these may implicate data sparsity or a -lack of variation, limiting their effectiveness within a machine learning model. The definition of 'too many' is -quantified as a percentage of total values, with a default set to 3%. - -###### Test Mechanism - -This test is conducted by looping through each column in the dataset and categorizing those that pertain to -numerical data. On identifying a numerical column, the function computes the total quantity of zero values and -their ratio to the total row count. Should the proportion exceed a pre-set threshold parameter, set by default at -0.03 or 3%, the column is considered to have failed the test. The results for each column are summarized and -reported, indicating the count and percentage of zero values for each numerical column, alongside a status -indicating whether the column has passed or failed the test. - -###### Signs of High Risk - -- Numerical columns showing a high ratio of zero values when compared to the total count of rows (exceeding the -predetermined threshold). -- Columns characterized by zero values across the board suggest a complete lack of data variation, signifying high -risk. - -###### Strengths - -- Assists in highlighting columns featuring an excess of zero values that could otherwise go unnoticed within a -large dataset. -- Provides the flexibility to alter the threshold that determines when the quantity of zero values becomes 'too -many', thus catering to specific needs of a particular analysis or model. -- Offers feedback in the form of both counts and percentages of zero values, which allows a closer inspection of -the distribution and proportion of zeros within a column. -- Targets specifically numerical data, thereby avoiding inappropriate application to non-numerical columns and -mitigating the risk of false test failures. - -###### Limitations - -- Is exclusively designed to check for zero values and doesn’t assess the potential impact of other values that -could affect the dataset, such as extremely high or low figures, missing values, or outliers. -- Lacks the ability to detect a repetitive pattern of zeros, which could be significant in time-series or -longitudinal data. -- Zero values can actually be meaningful in some contexts; therefore, tagging them as 'too many' could potentially -misinterpret the data to some extent. -- This test does not take into consideration the context of the dataset, and fails to recognize that within certain -columns, a high number of zero values could be quite normal and not necessarily an indicator of poor data quality. -- Cannot evaluate non-numerical or categorical columns, which might bring with them different types of concerns or -issues. - - - - - - - -#### UniqueRows - - - - - - -####### UniqueRows() - -```python -def UniqueRows(dataset: VMDataset, min_percent_threshold: float = 1) -``` - - -Verifies the diversity of the dataset by ensuring that the count of unique rows exceeds a prescribed threshold. - -###### Purpose - -The UniqueRows test is designed to gauge the quality of the data supplied to the machine learning model by -verifying that the count of distinct rows in the dataset exceeds a specific threshold, thereby ensuring a varied -collection of data. Diversity in data is essential for training an unbiased and robust model that excels when faced -with novel data. - -###### Test Mechanism - -The testing process starts with calculating the total number of rows in the dataset. Subsequently, the count of -unique rows is determined for each column in the dataset. If the percentage of unique rows (calculated as the ratio -of unique rows to the overall row count) is less than the prescribed minimum percentage threshold given as a -function parameter, the test passes. The results are cached and a final pass or fail verdict is given based on -whether all columns have successfully passed the test. - -###### Signs of High Risk - -- A lack of diversity in data columns, demonstrated by a count of unique rows that falls short of the preset -minimum percentage threshold, is indicative of high risk. -- This lack of variety in the data signals potential issues with data quality, possibly leading to overfitting in -the model and issues with generalization, thus posing a significant risk. - -###### Strengths - -- The UniqueRows test is efficient in evaluating the data's diversity across each information column in the dataset. -- This test provides a quick, systematic method to assess data quality based on uniqueness, which can be pivotal in -developing effective and unbiased machine learning models. - -###### Limitations - -- A limitation of the UniqueRows test is its assumption that the data's quality is directly proportionate to its -uniqueness, which may not always hold true. There might be contexts where certain non-unique rows are essential and -should not be overlooked. -- The test does not consider the relative 'importance' of each column in predicting the output, treating all -columns equally. -- This test may not be suitable or useful for categorical variables, where the count of unique categories is -inherently limited. - - - - - - - -#### WOEBinPlots - - - - - - -####### WOEBinPlots() - -```python -def WOEBinPlots(dataset: VMDataset, breaks_adj: list = None, fig_height: int = 600, fig_width: int = 500) -``` - - -Generates visualizations of Weight of Evidence (WoE) and Information Value (IV) for understanding predictive power -of categorical variables in a data set. - -###### Purpose - -This test is designed to visualize the Weight of Evidence (WoE) and Information Value (IV) for categorical -variables in a provided dataset. By showcasing the data distribution across different categories of each feature, -it aids in understanding each variable's predictive power in the context of a classification-based machine learning -model. Commonly used in credit scoring models, WoE and IV are robust statistical methods for evaluating a -variable's predictive power. - -###### Test Mechanism - -The test implementation follows defined steps. Initially, it selects non-numeric columns from the dataset and -changes them to string type, paving the way for accurate binning. It then performs an automated WoE binning -operation on these selected features, effectively categorizing the potential values of a variable into distinct -bins. After the binning process, the function generates two separate visualizations (a scatter chart for WoE values -and a bar chart for IV) for each variable. These visual presentations are formed according to the spread of each -metric across various categories of each feature. - -###### Signs of High Risk - -- Errors occurring during the binning process. -- Challenges in converting non-numeric columns into string data type. -- Misbalance in the distribution of WoE and IV, with certain bins overtaking others conspicuously. This could -denote that the model is disproportionately dependent on certain variables or categories for predictions, an -indication of potential risks to its robustness and generalizability. - -###### Strengths - -- Provides a detailed visual representation of the relationship between feature categories and the target variable. -This grants an intuitive understanding of each feature's contribution to the model. -- Allows for easy identification of features with high impact, facilitating feature selection and enhancing -comprehension of the model's decision logic. -- WoE conversions are monotonic, upholding the rank ordering of the original data points, which simplifies analysis. - -###### Limitations - -- The method is largely reliant on the binning process, and an inappropriate binning threshold or bin number choice -might result in a misrepresentation of the variable's distribution. -- While excellent for categorical data, the encoding of continuous variables into categorical can sometimes lead to -information loss. -- Extreme or outlier values can dramatically affect the computation of WoE and IV, skewing results. -- The method requires a sufficient number of events per bin to generate a reliable information value and weight of -evidence. - - - - - - - -#### WOEBinTable - - - - - - -####### WOEBinTable() - -```python -def WOEBinTable(dataset: VMDataset, breaks_adj: list = None) -``` - - -Assesses the Weight of Evidence (WoE) and Information Value (IV) of each feature to evaluate its predictive power -in a binary classification model. - -###### Purpose - -The Weight of Evidence (WoE) and Information Value (IV) test is designed to evaluate the predictive power of each -feature in a machine learning model. This test generates binned groups of values from each feature, computes the -WoE and IV for each bin, and provides insights into the relationship between each feature and the target variable, -illustrating their contribution to the model's predictive capabilities. - -###### Test Mechanism - -The test uses the `scorecardpy.woebin` method to perform automatic binning of the dataset based on WoE. The method -accepts a list of break points for binning numeric variables through the parameter `breaks_adj`. If no breaks are -provided, it uses default binning. The bins are then used to calculate the WoE and IV values, effectively creating -a dataframe that includes the bin boundaries, WoE, and IV values for each feature. A target variable is required -in the dataset to perform this analysis. - -###### Signs of High Risk - -- High IV values, indicating variables with excessive predictive power which might lead to overfitting. -- Errors during the binning process, potentially due to inappropriate data types or poorly defined bins. - -###### Strengths - -- Highly effective for feature selection in binary classification problems, as it quantifies the predictive -information within each feature concerning the binary outcome. -- The WoE transformation creates a monotonic relationship between the target and independent variables. - -###### Limitations - -- Primarily designed for binary classification tasks, making it less applicable or reliable for multi-class -classification or regression tasks. -- Potential difficulties if the dataset has many features, non-binnable features, or non-numeric features. -- The metric does not help in distinguishing whether the observed predictive factor is due to data randomness or a -true phenomenon. - - - - - - - -#### ZivotAndrewsArch - - - - - - -####### ZivotAndrewsArch() - -```python -def ZivotAndrewsArch(dataset: VMDataset) -``` - - -Evaluates the order of integration and stationarity of time series data using the Zivot-Andrews unit root test. - -###### Purpose - -The Zivot-Andrews Arch metric is used to evaluate the order of integration for time series data in a machine -learning model. It's designed to test for stationarity, a crucial aspect of time series analysis, where data points -are independent of time. Stationarity means that the statistical properties such as mean, variance, and -autocorrelation are constant over time. - -###### Test Mechanism - -The Zivot-Andrews unit root test is performed on each feature in the dataset using the `ZivotAndrews` function from -the `arch.unitroot` module. This function returns several metrics for each feature, including the statistical -value, p-value (probability value), the number of lags used, and the number of observations. The p-value is used to -decide on the null hypothesis (the time series has a unit root and is non-stationary) based on a chosen level of -significance. - -###### Signs of High Risk - -- A high p-value suggests high risk, indicating insufficient evidence to reject the null hypothesis, implying that -the time series has a unit root and is non-stationary. -- Non-stationary time series data can lead to misleading statistics and unreliable machine learning models. - -###### Strengths - -- Dynamically tests for stationarity against structural breaks in time series data, offering robust evaluation of -stationarity in features. -- Especially beneficial with financial, economic, or other time-series data where data observations lack a -consistent pattern and structural breaks may occur. - -###### Limitations - -- Assumes data is derived from a single-equation, autoregressive model, making it less appropriate for multivariate -time series data or data not aligning with this model. -- May not account for unexpected shocks or changes in the series trend, both of which can significantly impact data -stationarity. - - - - - - - -#### nlp - - - - - -##### CommonWords - - - - - - -######## CommonWords() - -```python -def CommonWords(dataset: VMDataset) -``` - - -Assesses the most frequent non-stopwords in a text column for identifying prevalent language patterns. - -###### Purpose - -The CommonWords metric is used to identify and visualize the most prevalent words within a specified text column of -a dataset. This provides insights into the prevalent language patterns and vocabulary, especially useful in Natural -Language Processing (NLP) tasks such as text classification and text summarization. - -###### Test Mechanism - -The test methodology involves splitting the specified text column's entries into words, collating them into a -corpus, and then counting the frequency of each word using the Counter. The forty most frequently occurring -non-stopwords are then visualized in an interactive bar chart using Plotly, where the x-axis represents the words, -and the y-axis indicates their frequency of occurrence. - -###### Signs of High Risk - -- A lack of distinct words within the list, or the most common words being stopwords. -- Frequent occurrence of irrelevant or inappropriate words could point out a poorly curated or noisy dataset. -- An error returned due to the absence of a valid Dataset object, indicating high risk as the metric cannot be -effectively implemented without it. - -###### Strengths - -- The metric provides clear insights into the language features – specifically word frequency – of unstructured -text data. -- It can reveal prominent vocabulary and language patterns, which prove vital for feature extraction in NLP tasks. -- The interactive visualization helps in quickly capturing the patterns and understanding the data intuitively. - -###### Limitations - -- The test disregards semantic or context-related information as it solely focuses on word frequency. -- It intentionally ignores stopwords, which might carry necessary significance in certain scenarios. -- The applicability is limited to English-language text data as English stopwords are used for filtering, hence -cannot account for data in other languages. -- The metric requires a valid Dataset object, indicating a dependency condition that limits its broader -applicability. - - - - - - - -##### Hashtags - - - - - - -######## Hashtags() - -```python -def Hashtags(dataset: VMDataset, top_hashtags: int = 25) -``` - - -Assesses hashtag frequency in a text column, highlighting usage trends and potential dataset bias or spam. - -###### Purpose - -The Hashtags test is designed to measure the frequency of hashtags used within a given text column in a dataset. It -is particularly useful for natural language processing tasks such as text classification and text summarization. -The goal is to identify common trends and patterns in the use of hashtags, which can serve as critical indicators -or features within a machine learning model. - -###### Test Mechanism - -The test implements a regular expression (regex) to extract all hashtags from the specified text column. For each -hashtag found, it makes a tally of its occurrences. It then outputs a list of the top N hashtags (default is 25, -but customizable), sorted by their counts in descending order. The results are also visualized in a bar plot, with -frequency counts on the y-axis and the corresponding hashtags on the x-axis. - -###### Signs of High Risk - -- A low diversity in the usage of hashtags, as indicated by a few hashtags being used disproportionately more than -others. -- Repeated usage of one or few hashtags can be indicative of spam or a biased dataset. -- If there are no or extremely few hashtags found in the dataset, it perhaps signifies that the text data does not -contain structured social media data. - -###### Strengths - -- Provides a concise visual representation of the frequency of hashtags, which can be critical for understanding -trends about a particular topic in text data. -- Instrumental in tasks specifically related to social media text analytics, such as opinion analysis and trend -discovery. -- Adaptable, allowing the flexibility to determine the number of top hashtags to be analyzed. - -###### Limitations - -- Assumes the presence of hashtags and therefore may not be applicable for text datasets that do not contain -hashtags (e.g., formal documents, scientific literature). -- Language-specific limitations of hashtag formulations are not taken into account. -- Does not account for typographical errors, variations, or synonyms in hashtags. -- Does not provide context or sentiment associated with the hashtags, so the information provided may have limited -utility on its own. - - - - - - - -##### LanguageDetection - - - - - - -######## LanguageDetection() - -```python -def LanguageDetection(dataset) -``` - - -Assesses the diversity of languages in a textual dataset by detecting and visualizing the distribution of languages. - -###### Purpose - -The Language Detection test aims to identify and visualize the distribution of languages present within a textual -dataset. This test helps in understanding the diversity of languages in the data, which is crucial for developing -and validating multilingual models. - -###### Test Mechanism - -This test operates by: - -- Checking if the dataset has a specified text column. -- Using a language detection library to determine the language of each text entry in the dataset. -- Generating a histogram plot of the language distribution, with language codes on the x-axis and their frequencies -on the y-axis. - -If the text column is not specified, a ValueError is raised to ensure proper dataset configuration. - -###### Signs of High Risk - -- A high proportion of entries returning "Unknown" language codes. -- Detection of unexpectedly diverse or incorrect language codes, indicating potential data quality issues. -- Significant imbalance in language distribution, which might indicate potential biases in the dataset. - -###### Strengths - -- Provides a visual representation of language diversity within the dataset. -- Helps identify data quality issues related to incorrect or unknown language detection. -- Useful for ensuring that multilingual models have adequate and appropriate representation from various languages. - -###### Limitations - -- Dependency on the accuracy of the language detection library, which may not be perfect. -- Languages with similar structures or limited text length may be incorrectly classified. -- The test returns "Unknown" for entries where language detection fails, which might mask underlying issues with -certain languages or text formats. - - - - - - - -##### Mentions - - - - - - -######## Mentions() - -```python -def Mentions(dataset: VMDataset, top_mentions: int = 25) -``` - - -Calculates and visualizes frequencies of '@' prefixed mentions in a text-based dataset for NLP model analysis. - -###### Purpose - -The "Mentions" test is designed to gauge the quality of data in a Natural Language Processing (NLP) or text-focused -Machine Learning model. The primary objective is to identify and calculate the frequency of 'mentions' within a -chosen text column of a dataset. A 'mention' in this context refers to individual text elements that are prefixed -by '@'. The output of this test reveals the most frequently mentioned entities or usernames, which can be integral -for applications such as social media analyses or customer sentiment analyses. - -###### Test Mechanism - -The test first verifies the existence of a text column in the provided dataset. It then employs a regular -expression pattern to extract mentions from the text. Subsequently, the frequency of each unique mention is -calculated. The test selects the most frequent mentions based on default or user-defined parameters, the default -being the top 25, for representation. This process of thresholding forms the core of the test. A treemap plot -visualizes the test results, where the size of each rectangle corresponds to the frequency of a particular mention. - -###### Signs of High Risk - -- The lack of a valid text column in the dataset, which would result in the failure of the test execution. -- The absence of any mentions within the text data, indicating that there might not be any text associated with -'@'. This situation could point toward sparse or poor-quality data, thereby hampering the model's generalization or -learning capabilities. - -###### Strengths - -- The test is specifically optimized for text-based datasets which gives it distinct power in the context of NLP. -- It enables quick identification and visually appealing representation of the predominant elements or mentions. -- It can provide crucial insights about the most frequently mentioned entities or usernames. - -###### Limitations - -- The test only recognizes mentions that are prefixed by '@', hence useful textual aspects not preceded by '@' -might be ignored. -- This test isn't suited for datasets devoid of textual data. -- It does not provide insights on less frequently occurring data or outliers, which means potentially significant -patterns could be overlooked. - - - - - - - -##### PolarityAndSubjectivity - - - - - - -######## PolarityAndSubjectivity() - -```python -def PolarityAndSubjectivity(dataset, threshold_subjectivity = 0.5, threshold_polarity = 0) -``` - - -Analyzes the polarity and subjectivity of text data within a given dataset to visualize the sentiment distribution. - -###### Purpose - -The Polarity and Subjectivity test is designed to evaluate the sentiment expressed in textual data. By analyzing -these aspects, it helps to identify the emotional tone and subjectivity of the dataset, which could be crucial in -understanding customer feedback, social media sentiments, or other text-related data. - -###### Test Mechanism - -This test uses TextBlob to compute the polarity and subjectivity scores of textual data in a given dataset. The -mechanism includes: - -- Iterating through each text entry in the specified column of the dataset. -- Applying the TextBlob library to compute the polarity (ranging from -1 for negative sentiment to +1 for positive -sentiment) and subjectivity (ranging from 0 for objective to 1 for subjective) for each entry. -- Creating a scatter plot using Plotly to visualize the relationship between polarity and subjectivity. - -###### Signs of High Risk - -- High concentration of negative polarity values indicating prevalent negative sentiments. -- High subjectivity scores suggesting the text data is largely opinion-based rather than factual. -- Disproportionate clusters of extreme scores (e.g., many points near -1 or +1 polarity). - -###### Strengths - -- Quantifies sentiment and subjectivity which can provide actionable insights. -- Visualizes sentiment distribution, aiding in easy interpretation. -- Utilizes well-established TextBlob library for sentiment analysis. - -###### Limitations - -- Polarity and subjectivity calculations may oversimplify nuanced text sentiments. -- Reliance on TextBlob which may not be accurate for all domains or contexts. -- Visualization could become cluttered with very large datasets, making interpretation difficult. - - - - - - - -##### Punctuations - - -Metrics functions for any Pandas-compatible datasets - - - - - -######## Punctuations() - -```python -def Punctuations(dataset, count_mode = 'token') -``` - - -Analyzes and visualizes the frequency distribution of punctuation usage in a given text dataset. - -###### Purpose - -The Punctuations Metric's primary purpose is to analyze the frequency of punctuation usage within a given text -dataset. This is often used in Natural Language Processing tasks, such as text classification and text -summarization. - -###### Test Mechanism - -The test begins by verifying that the input "dataset" is of the type VMDataset. The count_mode parameter must be -either "token" (counts punctuation marks as individual tokens) or "word" (counts punctuation marks within words). -Following that, a corpus is created from the dataset by splitting its text on spaces. Each unique punctuation -character in the text corpus is then tallied. The frequency distribution of each punctuation symbol is visualized -as a bar graph, with these results being stored as Figures and associated with the main Punctuations object. - -###### Signs of High Risk - -- Excessive or unusual frequency of specific punctuation marks, potentially denoting dubious quality, data -corruption, or skewed data. - -###### Strengths - -- Provides valuable insights into the distribution of punctuation usage in a text dataset. -- Important in validating the quality, consistency, and nature of the data. -- Can provide hints about the style or tonality of the text corpus, such as informal and emotional context -indicated by frequent exclamation marks. - -###### Limitations - -- Focuses solely on punctuation usage, potentially missing other important textual characteristics. -- General cultural or tonality assumptions based on punctuation distribution can be misguiding, as these vary -across different languages and contexts. -- Less effective with languages that use non-standard or different punctuation. -- Visualization may lack interpretability when there are many unique punctuation marks in the dataset. - - - - - - - -##### Sentiment - - - - - - -######## Sentiment() - -```python -def Sentiment(dataset) -``` - - -Analyzes the sentiment of text data within a dataset using the VADER sentiment analysis tool. - -###### Purpose - -The Sentiment test evaluates the overall sentiment of text data within a dataset. By analyzing sentiment scores, it -aims to ensure that the model is interpreting text data accurately and is not biased towards a particular sentiment. - -###### Test Mechanism - -This test uses the VADER (Valence Aware Dictionary and sEntiment Reasoner) SentimentIntensityAnalyzer. It processes -each text entry in a specified column of the dataset to calculate the compound sentiment score, which represents -the overall sentiment polarity. The distribution of these sentiment scores is then visualized using a KDE (Kernel -Density Estimation) plot, highlighting any skewness or concentration in sentiment. - -###### Signs of High Risk - -- Extreme polarity in sentiment scores, indicating potential bias. -- Unusual concentration of sentiment scores in a specific range. -- Significant deviation from expected sentiment distribution for the given text data. - -###### Strengths - -- Provides a clear visual representation of sentiment distribution. -- Uses a well-established sentiment analysis tool (VADER). -- Can handle a wide range of text data, making it flexible for various applications. - -###### Limitations - -- May not capture nuanced or context-specific sentiments. -- Relies heavily on the accuracy of the VADER sentiment analysis tool. -- Visualization alone may not provide comprehensive insights into underlying causes of sentiment distribution. - - - - - - - -##### StopWords - - -Threshold based tests - - - - - -######## StopWords() - -```python -def StopWords(dataset: VMDataset, min_percent_threshold: float = 0.5, num_words: int = 25) -``` - - -Evaluates and visualizes the frequency of English stop words in a text dataset against a defined threshold. - -###### Purpose - -The StopWords threshold test is a tool designed for assessing the quality of text data in an ML model. It focuses -on the identification and analysis of "stop words" in a given dataset. Stop words are frequent, common, yet -semantically insignificant words (for example**: "the", "and", "is") in a language. This test evaluates the -proportion of stop words to the total word count in the dataset, in essence, scrutinizing the frequency of stop -word usage. The core objective is to highlight the prevalent stop words based on their usage frequency, which can -be instrumental in cleaning the data from noise and improving ML model performance. - -###### Test Mechanism - -The StopWords test initiates on receiving an input of a 'VMDataset' object. Absence of such an object will trigger -an error. The methodology involves inspection of the text column of the VMDataset to create a 'corpus' (a -collection of written texts). Leveraging the Natural Language Toolkit's (NLTK) stop word repository, the test -screens the corpus for any stop words and documents their frequency. It further calculates the percentage usage of -each stop word compared to the total word count in the corpus. This percentage is evaluated against a predefined -'min_percent_threshold'. If this threshold is breached, the test returns a failed output. Top prevailing stop words -along with their usage percentages are returned, facilitated by a bar chart visualization of these stop words and -their frequency. - -###### Signs of High Risk - -- A percentage of any stop words exceeding the predefined 'min_percent_threshold'. -- High frequency of stop words in the dataset which may adversely affect the application's analytical performance -due to noise creation. - -###### Strengths - -- The ability to scrutinize and quantify the usage of stop words. -- Provides insights into potential noise in the text data due to stop words. -- Directly aids in enhancing model training efficiency. -- Includes a bar chart visualization feature to easily interpret and action upon the stop words frequency -information. - -###### Limitations - -- The test only supports English stop words, making it less effective with datasets of other languages. -- The 'min_percent_threshold' parameter may require fine-tuning for different datasets, impacting the overall -effectiveness of the test. -- Contextual use of the stop words within the dataset is not considered, potentially overlooking their significance -in certain contexts. -- The test focuses specifically on the frequency of stop words, not providing direct measures of model performance -or predictive accuracy. - - - - - - - -##### TextDescription - - - - - - -######## TextDescription() - -```python -def TextDescription(dataset: VMDataset, unwanted_tokens: set = {'cls': 'ExprSet', 'elements': ["'s'", '"s\'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"\'s"', "' '", '"\'\'"', "'dollar'", "'us'", "'``'"]}, lang: str = 'english') -``` - - -Conducts comprehensive textual analysis on a dataset using NLTK to evaluate various parameters and generate -visualizations. - -###### Purpose - -The TextDescription test aims to conduct a thorough textual analysis of a dataset using the NLTK (Natural Language -Toolkit) library. It evaluates various metrics such as total words, total sentences, average sentence length, total -paragraphs, total unique words, most common words, total punctuations, and lexical diversity. The goal is to -understand the nature of the text and anticipate challenges machine learning models might face in text processing, -language understanding, or summarization tasks. - -###### Test Mechanism - -The test works by: - -- Parsing the dataset and tokenizing the text into words, sentences, and paragraphs using NLTK. -- Removing stopwords and unwanted tokens. -- Calculating parameters like total words, total sentences, average sentence length, total paragraphs, total unique -words, total punctuations, and lexical diversity. -- Generating scatter plots to visualize correlations between various metrics (e.g., Total Words vs Total Sentences). - -###### Signs of High Risk - -- Anomalies or increased complexity in lexical diversity. -- Longer sentences and paragraphs. -- High uniqueness of words. -- Large number of unwanted tokens. -- Missing or erroneous visualizations. - -###### Strengths - -- Essential for pre-processing text data in machine learning models. -- Provides a comprehensive breakdown of text data, aiding in understanding its complexity. -- Generates visualizations to help comprehend text structure and complexity. - -###### Limitations - -- Highly dependent on the NLTK library, limiting the test to supported languages. -- Limited customization for removing undesirable tokens and stop words. -- Does not consider semantic or grammatical complexities. -- Assumes well-structured documents, which may result in inaccuracies with poorly formatted text. - - - - -######## create_metrics_df() - -```python -def create_metrics_df(df, text_column, unwanted_tokens, lang) -``` - - - - - - - - -##### Toxicity - - - - - - -######## Toxicity() - -```python -def Toxicity(dataset) -``` - - -Assesses the toxicity of text data within a dataset to visualize the distribution of toxicity scores. - -###### Purpose - -The Toxicity test aims to evaluate the level of toxic content present in a text dataset by leveraging a pre-trained -toxicity model. It helps in identifying potentially harmful or offensive language that may negatively impact users -or stakeholders. - -###### Test Mechanism - -This test uses a pre-trained toxicity evaluation model and applies it to each text entry in the specified column of -a dataset’s dataframe. The procedure involves: - -- Loading a pre-trained toxicity model. -- Extracting the text from the specified column in the dataset. -- Computing toxicity scores for each text entry. -- Generating a KDE (Kernel Density Estimate) plot to visualize the distribution of these toxicity scores. - -###### Signs of High Risk - -- High concentration of high toxicity scores in the KDE plot. -- A significant proportion of text entries with toxicity scores above a predefined threshold. -- Wide distribution of toxicity scores, indicating inconsistency in content quality. - -###### Strengths - -- Provides a visual representation of toxicity distribution, making it easier to identify outliers. -- Uses a robust pre-trained model for toxicity evaluation. -- Can process large text datasets efficiently. - -###### Limitations - -- Depends on the accuracy and bias of the pre-trained toxicity model. -- Does not provide context-specific insights, which may be necessary for nuanced understanding. -- May not capture all forms of subtle or indirect toxic language. - - - - - - - - - - - - - - - -### decorator - - -Decorators for creating and registering tests with the ValidMind Library. - - - - - -###### tags() - -```python -def tags(tags = ()) -``` - - -Decorator for specifying tags for a test. - -**Arguments** - -- ***tags****: The tags to apply to the test. - - - - -###### tasks() - -```python -def tasks(tasks = ()) -``` - - -Decorator for specifying the task types that a test is designed for. - -**Arguments** - -- ***tasks****: The task types that the test is designed for. - - - - -###### test() - -```python -def test(func_or_id) -``` - - -Decorator for creating and registering custom tests - -This decorator registers the function it wraps as a test function within ValidMind -under the provided ID. Once decorated, the function can be run using the -`validmind.tests.run_test` function. - -The function can take two different types of arguments: - -- Inputs**: ValidMind model or dataset (or list of models/datasets). These arguments - must use the following names: `model`, `models`, `dataset`, `datasets`. -- Parameters: Any additional keyword arguments of any type (must have a default - value) that can have any name. - -The function should return one of the following types: - -- Table: Either a list of dictionaries or a pandas DataFrame -- Plot: Either a matplotlib figure or a plotly figure -- Scalar: A single number (int or float) -- Boolean: A single boolean value indicating whether the test passed or failed - -The function may also include a docstring. This docstring will be used and logged -as the metric's description. - -**Arguments** - -- **func**: The function to decorate -- **test_id**: The identifier for the metric. If not provided, the function name is used. - -**Returns** - -- The decorated function. - - - - - - - -### load - - -Module for listing and loading tests. - - - - - -###### describe_test() - -```python -def describe_test(test_id: TestID = None, raw: bool = False, show: bool = True) -``` - - -Get or show details about the test - -This function can be used to see test details including the test name, description, -required inputs and default params. It can also be used to get a dictionary of the -above information for programmatic use. - -**Arguments** - -- **test_id (str, optional)****: The test ID. Defaults to None. -- **raw (bool, optional)**: If True, returns a dictionary with the test details. Defaults to False. - - - - -###### list_tags() - -```python -def list_tags() -``` - - -List unique tags from all test classes. - - - - -###### list_tasks() - -```python -def list_tasks() -``` - - -List unique tasks from all test classes. - - - - -###### list_tasks_and_tags() - -```python -def list_tasks_and_tags(as_json = False) -``` - - -List all task types and their associated tags, with one row per task type and -all tags for a task type in one row. - -**Returns** - -- **pandas.DataFrame****: A DataFrame with 'Task Type' and concatenated 'Tags'. - - - - -###### list_tests() - -```python -def list_tests(filter = None, task = None, tags = None, pretty = True, truncate = True) -``` - - -List all tests in the tests directory. - -**Arguments** - -- **filter (str, optional)****: Find tests where the ID, tasks or tags match the filter string. Defaults to None. -- **task (str, optional)**: Find tests that match the task. Can be used to narrow down matches from the filter string. Defaults to None. -- **tags (list, optional)**: Find tests that match list of tags. Can be used to narrow down matches from the filter string. Defaults to None. -- **pretty (bool, optional)**: If True, returns a pandas DataFrame with a formatted table. Defaults to True. -- **truncate (bool, optional)**: If True, truncates the test description to the first line. Defaults to True. (only used if pretty=True) - -**Returns** - -- **list or pandas.DataFrame**: A list of all tests or a formatted table. - - - - -###### load_test() - -```python -def load_test(test_id: str, test_func: callable = None, reload: bool = False) -``` - - -Load a test by test ID - -Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. -The tag is optional and is used to distinguish between multiple results from the -same test. - -**Arguments** - -- **test_id (str)****: The test ID in the format `namespace.path_to_module.TestName[:tag]` -- **test_func (callable, optional)**: The test function to load. If not provided, the test will be loaded from the test provider. Defaults to None. - - - - - - - -### model_validation - - - - - -#### BertScore - - - - - - -####### BertScore() - -```python -def BertScore(dataset, model, evaluation_model = 'distilbert-base-uncased') -``` - - -Assesses the quality of machine-generated text using BERTScore metrics and visualizes results through histograms -and bar charts, alongside compiling a comprehensive table of descriptive statistics. - -###### Purpose - -This function is designed to assess the quality of text generated by machine learning models using BERTScore -metrics. BERTScore evaluates text generation models' performance by calculating precision, recall, and F1 score -based on BERT contextual embeddings. - -###### Test Mechanism - -The function starts by extracting the true and predicted values from the provided dataset and model. It then -initializes the BERTScore evaluator. For each pair of true and predicted texts, the function calculates the -BERTScore metrics and compiles them into a dataframe. Histograms and bar charts are generated for each BERTScore -metric (Precision, Recall, and F1 Score) to visualize their distribution. Additionally, a table of descriptive -statistics (mean, median, standard deviation, minimum, and maximum) is compiled for each metric, providing a -comprehensive summary of the model's performance. The test uses the `evaluation_model` param to specify the -huggingface model to use for evaluation. `microsoft/deberta-xlarge-mnli` is the best-performing model but is -very large and may be slow without a GPU. `microsoft/deberta-large-mnli` is a smaller model that is faster to -run and `distilbert-base-uncased` is much lighter and can run on a CPU but is less accurate. - -###### Signs of High Risk - -- Consistently low scores across BERTScore metrics could indicate poor quality in the generated text, suggesting -that the model fails to capture the essential content of the reference texts. -- Low precision scores might suggest that the generated text contains a lot of redundant or irrelevant information. -- Low recall scores may indicate that important information from the reference text is being omitted. -- An imbalanced performance between precision and recall, reflected by a low F1 Score, could signal issues in the -model's ability to balance informativeness and conciseness. - -###### Strengths - -- Provides a multifaceted evaluation of text quality through different BERTScore metrics, offering a detailed view -of model performance. -- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of the -scores. -- Descriptive statistics offer a concise summary of the model's strengths and weaknesses in generating text. - -###### Limitations - -- BERTScore relies on the contextual embeddings from BERT models, which may not fully capture all nuances of text -similarity. -- The evaluation relies on the availability of high-quality reference texts, which may not always be obtainable. -- While useful for comparison, BERTScore metrics alone do not provide a complete assessment of a model's -performance and should be supplemented with other metrics and qualitative analysis. - - - - - - - -#### BleuScore - - - - - - -####### BleuScore() - -```python -def BleuScore(dataset, model) -``` - - -Evaluates the quality of machine-generated text using BLEU metrics and visualizes the results through histograms -and bar charts, alongside compiling a comprehensive table of descriptive statistics for BLEU scores. - -###### Purpose - -This function is designed to assess the quality of text generated by machine learning models using the BLEU metric. -BLEU, which stands for Bilingual Evaluation Understudy, is a metric used to evaluate the overlap of n-grams between -the machine-generated text and reference texts. This evaluation is crucial for tasks such as text summarization, -machine translation, and text generation, where the goal is to produce text that accurately reflects the content -and meaning of human-crafted references. - -###### Test Mechanism - -The function starts by extracting the true and predicted values from the provided dataset and model. It then -initializes the BLEU evaluator. For each pair of true and predicted texts, the function calculates the BLEU scores -and compiles them into a dataframe. Histograms and bar charts are generated for the BLEU scores to visualize their -distribution. Additionally, a table of descriptive statistics (mean, median, standard deviation, minimum, and -maximum) is compiled for the BLEU scores, providing a comprehensive summary of the model's performance. - -###### Signs of High Risk - -- Consistently low BLEU scores could indicate poor quality in the generated text, suggesting that the model fails -to capture the essential content of the reference texts. -- Low precision scores might suggest that the generated text contains a lot of redundant or irrelevant information. -- Low recall scores may indicate that important information from the reference text is being omitted. -- An imbalanced performance between precision and recall, reflected by a low BLEU score, could signal issues in the -model's ability to balance informativeness and conciseness. - -###### Strengths - -- Provides a straightforward and widely-used evaluation of text quality through BLEU scores. -- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of the -scores. -- Descriptive statistics offer a concise summary of the model's strengths and weaknesses in generating text. - -###### Limitations - -- BLEU metrics primarily focus on n-gram overlap and may not fully capture semantic coherence, fluency, or -grammatical quality of the text. -- The evaluation relies on the availability of high-quality reference texts, which may not always be obtainable. -- While useful for comparison, BLEU scores alone do not provide a complete assessment of a model's performance and -should be supplemented with other metrics and qualitative analysis. - - - - - - - -#### ClusterSizeDistribution - - - - - - -####### ClusterSizeDistribution() - -```python -def ClusterSizeDistribution(dataset: VMDataset, model: VMModel) -``` - - -Assesses the performance of clustering models by comparing the distribution of cluster sizes in model predictions -with the actual data. - -###### Purpose - -The Cluster Size Distribution test aims to assess the performance of clustering models by comparing the -distribution of cluster sizes in the model's predictions with the actual data. This comparison helps determine if -the clustering model's output aligns well with the true cluster distribution, providing insights into the model's -accuracy and performance. - -###### Test Mechanism - -The test mechanism involves the following steps: - -- Run the clustering model on the provided dataset to obtain predictions. -- Convert both the actual and predicted outputs into pandas dataframes. -- Use pandas built-in functions to derive the cluster size distributions from these dataframes. -- Construct two histograms**: one for the actual cluster size distribution and one for the predicted distribution. -- Plot the histograms side-by-side for visual comparison. - -###### Signs of High Risk - -- Discrepancies between the actual cluster size distribution and the predicted cluster size distribution. -- Irregular distribution of data across clusters in the predicted outcomes. -- High number of outlier clusters suggesting the model struggles to correctly group data. - -###### Strengths - -- Provides a visual and intuitive way to compare the clustering model's performance against actual data. -- Effectively reveals where the model may be over- or underestimating cluster sizes. -- Versatile as it works well with any clustering model. - -###### Limitations - -- Assumes that the actual cluster distribution is optimal, which may not always be the case. -- Relies heavily on visual comparison, which could be subjective and may not offer a precise numerical measure of -performance. -- May not fully capture other important aspects of clustering, such as cluster density, distances between clusters, -and the shape of clusters. - - - - - - - -#### ContextualRecall - - - - - - -####### ContextualRecall() - -```python -def ContextualRecall(dataset, model) -``` - - -Evaluates a Natural Language Generation model's ability to generate contextually relevant and factually correct -text, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of -descriptive statistics for contextual recall scores. - -###### Purpose - -The Contextual Recall metric is used to evaluate the ability of a natural language generation (NLG) model to -generate text that appropriately reflects the given context or prompt. It measures the model's capability to -remember and reproduce the main context in its resulting output. This metric is critical in natural language -processing tasks, as the coherency and contextuality of the generated text are essential. - -###### Test Mechanism - -The function starts by extracting the true and predicted values from the provided dataset and model. It then -tokenizes the reference and candidate texts into discernible words or tokens using NLTK. The token overlap between -the reference and candidate texts is identified, and the Contextual Recall score is computed by dividing the number -of overlapping tokens by the total number of tokens in the reference text. Scores are calculated for each test -dataset instance, resulting in an array of scores. These scores are visualized using a histogram and a bar chart to -show score variations across different rows. Additionally, a table of descriptive statistics (mean, median, -standard deviation, minimum, and maximum) is compiled for the contextual recall scores, providing a comprehensive -summary of the model's performance. - -###### Signs of High Risk - -- Low contextual recall scores could indicate that the model is not effectively reflecting the original context in -its output, leading to incoherent or contextually misaligned text. -- A consistent trend of low recall scores could suggest underperformance of the model. - -###### Strengths - -- Provides a quantifiable measure of a model's adherence to the context and factual elements of the generated -narrative. -- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of -contextual recall scores. -- Descriptive statistics offer a concise summary of the model's performance in generating contextually relevant -texts. - -###### Limitations - -- The focus on word overlap could result in high scores for texts that use many common words, even when these texts -lack coherence or meaningful context. -- This metric does not consider the order of words, which could lead to overestimated scores for scrambled outputs. -- Models that effectively use infrequent words might be undervalued, as these words might not overlap as often. - - - - - - - -#### FeaturesAUC - - - - - - -####### FeaturesAUC() - -```python -def FeaturesAUC(dataset: VMDataset, fontsize: int = 12, figure_height: int = 500) -``` - - -Evaluates the discriminatory power of each individual feature within a binary classification model by calculating -the Area Under the Curve (AUC) for each feature separately. - -###### Purpose - -The central objective of this metric is to quantify how well each feature on its own can differentiate between the -two classes in a binary classification problem. It serves as a univariate analysis tool that can help in -pre-modeling feature selection or post-modeling interpretation. - -###### Test Mechanism - -For each feature, the metric treats the feature values as raw scores to compute the AUC against the actual binary -outcomes. It provides an AUC value for each feature, offering a simple yet powerful indication of each feature's -univariate classification strength. - -###### Signs of High Risk - -- A feature with a low AUC score may not be contributing significantly to the differentiation between the two -classes, which could be a concern if it is expected to be predictive. -- Conversely, a surprisingly high AUC for a feature not believed to be informative may suggest data leakage or -other issues with the data. - -###### Strengths - -- By isolating each feature, it highlights the individual contribution of features to the classification task -without the influence of other variables. -- Useful for both initial feature evaluation and for providing insights into the model's reliance on individual -features after model training. - -###### Limitations - -- Does not reflect the combined effects of features or any interaction between them, which can be critical in -certain models. -- The AUC values are calculated without considering the model's use of the features, which could lead to different -interpretations of feature importance when considering the model holistically. -- This metric is applicable only to binary classification tasks and cannot be directly extended to multiclass -classification or regression without modifications. - - - - - - - -#### MeteorScore - - - - - - -####### MeteorScore() - -```python -def MeteorScore(dataset, model) -``` - - -Assesses the quality of machine-generated translations by comparing them to human-produced references using the -METEOR score, which evaluates precision, recall, and word order. - -###### Purpose - -The METEOR (Metric for Evaluation of Translation with Explicit ORdering) score is designed to evaluate the quality -of machine translations by comparing them against reference translations. It emphasizes both the accuracy and -fluency of translations, incorporating precision, recall, and word order into its assessment. - -###### Test Mechanism - -The function starts by extracting the true and predicted values from the provided dataset and model. The METEOR -score is computed for each pair of machine-generated translation (prediction) and its corresponding human-produced -reference. This is done by considering unigram matches between the translations, including matches based on surface -forms, stemmed forms, and synonyms. The score is a combination of unigram precision and recall, adjusted for word -order through a fragmentation penalty. Scores are compiled into a dataframe, and histograms and bar charts are -generated to visualize the distribution of METEOR scores. Additionally, a table of descriptive statistics (mean, -median, standard deviation, minimum, and maximum) is compiled for the METEOR scores, providing a comprehensive -summary of the model's performance. - -###### Signs of High Risk - -- Lower METEOR scores can indicate a lack of alignment between the machine-generated translations and their -human-produced references, highlighting potential deficiencies in both the accuracy and fluency of translations. -- Significant discrepancies in word order or an excessive fragmentation penalty could signal issues with how the -translation model processes and reconstructs sentence structures, potentially compromising the natural flow of -translated text. -- Persistent underperformance across a variety of text types or linguistic contexts might suggest a broader -inability of the model to adapt to the nuances of different languages or dialects, pointing towards gaps in its -training or inherent limitations. - -###### Strengths - -- Incorporates a balanced consideration of precision and recall, weighted towards recall to reflect the importance -of content coverage in translations. -- Directly accounts for word order, offering a nuanced evaluation of translation fluency beyond simple lexical -matching. -- Adapts to various forms of lexical similarity, including synonyms and stemmed forms, allowing for flexible -matching. - -###### Limitations - -- While comprehensive, the complexity of METEOR's calculation can make it computationally intensive, especially for -large datasets. -- The use of external resources for synonym and stemming matching may introduce variability based on the resources' -quality and relevance to the specific translation task. - - - - - - - -#### ModelMetadata - - - - - - -####### ModelMetadata() - -```python -def ModelMetadata(model) -``` - - -Compare metadata of different models and generate a summary table with the results. - -**Purpose****: The purpose of this function is to compare the metadata of different models, including information about their architecture, framework, framework version, and programming language. - -**Test Mechanism**: The function retrieves the metadata for each model using `get_model_info`, renames columns according to a predefined set of labels, and compiles this information into a summary table. - -**Signs of High Risk**: - -- Inconsistent or missing metadata across models can indicate potential issues in model documentation or management. -- Significant differences in framework versions or programming languages might pose challenges in model integration and deployment. - -**Strengths**: - -- Provides a clear comparison of essential model metadata. -- Standardizes metadata labels for easier interpretation and comparison. -- Helps identify potential compatibility or consistency issues across models. - -**Limitations**: - -- Assumes that the `get_model_info` function returns all necessary metadata fields. -- Relies on the correctness and completeness of the metadata provided by each model. -- Does not include detailed parameter information, focusing instead on high-level metadata. - - - - - - - -#### ModelPredictionResiduals - - - - - - -####### ModelPredictionResiduals() - -```python -def ModelPredictionResiduals(dataset, model, nbins = 100, p_value_threshold = 0.05, start_date = None, end_date = None) -``` - - -Assesses normality and behavior of residuals in regression models through visualization and statistical tests. - -###### Purpose - -The Model Prediction Residuals test aims to visualize the residuals of model predictions and assess their normality -using the Kolmogorov-Smirnov (KS) test. It helps to identify potential issues related to model assumptions and -effectiveness. - -###### Test Mechanism - -The function calculates residuals and generates -two figures**: one for the time series of residuals and one for the histogram of residuals. -It also calculates the KS test for normality and summarizes the results in a table. - -###### Signs of High Risk - -- Residuals are not normally distributed, indicating potential issues with model assumptions. -- High skewness or kurtosis in the residuals, which may suggest model misspecification. - -###### Strengths - -- Provides clear visualizations of residuals over time and their distribution. -- Includes statistical tests to assess the normality of residuals. -- Helps in identifying potential model misspecifications and assumption violations. - -###### Limitations - -- Assumes that the dataset is provided as a DataFrameDataset object with a .df attribute to access the pandas -DataFrame. -- Only generates plots for datasets with a datetime index, resulting in errors for other types of indices. - - - - - - - -#### RegardScore - - - - - - -####### RegardScore() - -```python -def RegardScore(dataset, model) -``` - - -Assesses the sentiment and potential biases in text generated by NLP models by computing and visualizing regard -scores. - -###### Purpose - -The `RegardScore` test aims to evaluate the levels of regard (positive, negative, neutral, or other) in texts -generated by NLP models. It helps in understanding the sentiment and bias present in the generated content. - -###### Test Mechanism - -This test extracts the true and predicted values from the provided dataset and model. It then computes the regard -scores for each text instance using a preloaded `regard` evaluation tool. The scores are compiled into dataframes, -and visualizations such as histograms and bar charts are generated to display the distribution of regard scores. -Additionally, descriptive statistics (mean, median, standard deviation, minimum, and maximum) are calculated for -the regard scores, providing a comprehensive overview of the model's performance. - -###### Signs of High Risk - -- Noticeable skewness in the histogram, especially when comparing the predicted regard scores with the target -regard scores, can indicate biases or inconsistencies in the model. -- Lack of neutral scores in the model's predictions, despite a balanced distribution in the target data, might -signal an issue. - -###### Strengths - -- Provides a clear evaluation of regard levels in generated texts, aiding in ensuring content appropriateness. -- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of -regard scores. -- Descriptive statistics offer a concise summary of the model's performance in generating texts with balanced -sentiments. - -###### Limitations - -- The accuracy of the regard scores is contingent upon the underlying `regard` tool. -- The scores provide a broad overview but do not specify which portions or tokens of the text are responsible for -high regard. -- Supplementary, in-depth analysis might be needed for granular insights. - - - - - - - -#### RegressionResidualsPlot - - - - - - -####### RegressionResidualsPlot() - -```python -def RegressionResidualsPlot(model: VMModel, dataset: VMDataset, bin_size: float = 0.1) -``` - - -Evaluates regression model performance using residual distribution and actual vs. predicted plots. - -###### Purpose - -The `RegressionResidualsPlot` metric aims to evaluate the performance of regression models. By generating and -analyzing two plots – a distribution of residuals and a scatter plot of actual versus predicted values – this tool -helps to visually appraise how well the model predicts and the nature of errors it makes. - -###### Test Mechanism - -The process begins by extracting the true output values (`y_true`) and the model's predicted values (`y_pred`). -Residuals are computed by subtracting predicted from true values. These residuals are then visualized using a -histogram to display their distribution. Additionally, a scatter plot is derived to compare true values against -predicted values, together with a "Perfect Fit" line, which represents an ideal match (predicted values equal -actual values), facilitating the assessment of the model's predictive accuracy. - -###### Signs of High Risk - -- Residuals showing a non-normal distribution, especially those with frequent extreme values. -- Significant deviations of predicted values from actual values in the scatter plot. -- Sparse density of data points near the "Perfect Fit" line in the scatter plot, indicating poor prediction -accuracy. -- Visible patterns or trends in the residuals plot, suggesting the model's failure to capture the underlying data -structure adequately. - -###### Strengths - -- Provides a direct, visually intuitive assessment of a regression model’s accuracy and handling of data. -- Visual plots can highlight issues of underfitting or overfitting. -- Can reveal systematic deviations or trends that purely numerical metrics might miss. -- Applicable across various regression model types. - -###### Limitations - -- Relies on visual interpretation, which can be subjective and less precise than numerical evaluations. -- May be difficult to interpret in cases with multi-dimensional outputs due to the plots’ two-dimensional nature. -- Overlapping data points in the residuals plot can complicate interpretation efforts. -- Does not summarize model performance into a single quantifiable metric, which might be needed for comparative or -summary analyses. - - - - - - - -#### RougeScore - - - - - - -####### RougeScore() - -```python -def RougeScore(dataset, model, metric = 'rouge-1') -``` - - -Assesses the quality of machine-generated text using ROUGE metrics and visualizes the results to provide -comprehensive performance insights. - -###### Purpose - -The ROUGE Score test is designed to evaluate the quality of text generated by machine learning models using various -ROUGE metrics. ROUGE, which stands for Recall-Oriented Understudy for Gisting Evaluation, measures the overlap of -n-grams, word sequences, and word pairs between machine-generated text and reference texts. This evaluation is -crucial for tasks like text summarization, machine translation, and text generation, where the goal is to produce -text that accurately reflects the content and meaning of human-crafted references. - -###### Test Mechanism - -The test extracts the true and predicted values from the provided dataset and model. It initializes the ROUGE -evaluator with the specified metric (e.g., ROUGE-1). For each pair of true and predicted texts, it calculates the -ROUGE scores and compiles them into a dataframe. Histograms and bar charts are generated for each ROUGE metric -(Precision, Recall, and F1 Score) to visualize their distribution. Additionally, a table of descriptive statistics -(mean, median, standard deviation, minimum, and maximum) is compiled for each metric, providing a comprehensive -summary of the model's performance. - -###### Signs of High Risk - -- Consistently low scores across ROUGE metrics could indicate poor quality in the generated text, suggesting that -the model fails to capture the essential content of the reference texts. -- Low precision scores might suggest that the generated text contains a lot of redundant or irrelevant information. -- Low recall scores may indicate that important information from the reference text is being omitted. -- An imbalanced performance between precision and recall, reflected by a low F1 Score, could signal issues in the -model's ability to balance informativeness and conciseness. - -###### Strengths - -- Provides a multifaceted evaluation of text quality through different ROUGE metrics, offering a detailed view of -model performance. -- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of the -scores. -- Descriptive statistics offer a concise summary of the model's strengths and weaknesses in generating text. - -###### Limitations - -- ROUGE metrics primarily focus on n-gram overlap and may not fully capture semantic coherence, fluency, or -grammatical quality of the text. -- The evaluation relies on the availability of high-quality reference texts, which may not always be obtainable. -- While useful for comparison, ROUGE scores alone do not provide a complete assessment of a model's performance and -should be supplemented with other metrics and qualitative analysis. - - - - - - - -#### TimeSeriesPredictionWithCI - - - - - - -####### TimeSeriesPredictionWithCI() - -```python -def TimeSeriesPredictionWithCI(dataset, model, confidence = 0.95) -``` - - -Assesses predictive accuracy and uncertainty in time series models, highlighting breaches beyond confidence -intervals. - -###### Purpose - -The purpose of the Time Series Prediction with Confidence Intervals (CI) test is to visualize the actual versus -predicted values for time series data, including confidence intervals, and to compute and report the number of -breaches beyond these intervals. This helps in evaluating the reliability and accuracy of the model's predictions. - -###### Test Mechanism - -The function performs the following steps: - -- Calculates the standard deviation of prediction errors. -- Determines the confidence intervals using a specified confidence level, typically 95%. -- Counts the number of actual values that fall outside the confidence intervals, referred to as breaches. -- Generates a plot visualizing the actual values, predicted values, and confidence intervals. -- Returns a DataFrame summarizing the breach information, including the total breaches, upper breaches, and lower -breaches. - -###### Signs of High Risk - -- A high number of breaches indicates that the model's predictions are not reliable within the specified confidence -level. -- Significant deviations between actual and predicted values may highlight model inadequacies or issues with data -quality. - -###### Strengths - -- Provides a visual representation of prediction accuracy and the uncertainty around predictions. -- Includes a statistical measure of prediction reliability through confidence intervals. -- Computes and reports breaches, offering a quantitative assessment of prediction performance. - -###### Limitations - -- Assumes that the dataset is provided as a DataFrameDataset object with a datetime index. -- Requires that `dataset.y_pred(model)` returns the predicted values for the model. -- The calculation of confidence intervals assumes normally distributed errors, which may not hold for all datasets. - - - - - - - -#### TimeSeriesPredictionsPlot - - - - - - -####### TimeSeriesPredictionsPlot() - -```python -def TimeSeriesPredictionsPlot(dataset, model) -``` - - -Plot actual vs predicted values for time series data and generate a visual comparison for the model. - -###### Purpose - -The purpose of this function is to visualize the actual versus predicted values for time -series data for a single model. - -###### Test Mechanism - -The function plots the actual values from the dataset and overlays the predicted -values from the model using Plotly for interactive visualization. - -- Large discrepancies between actual and predicted values indicate poor model performance. -- Systematic deviations in predicted values can highlight model bias or issues with data patterns. - -###### Strengths - -- Provides a clear visual comparison of model predictions against actual values. -- Uses Plotly for interactive and visually appealing plots. - -###### Limitations - -- Assumes that the dataset is provided as a DataFrameDataset object with a datetime index. -- Requires that `dataset.y_pred(model)` returns the predicted values for the model. - - - - - - - -#### TimeSeriesR2SquareBySegments - - - - - - -####### TimeSeriesR2SquareBySegments() - -```python -def TimeSeriesR2SquareBySegments(dataset, model, segments = None) -``` - - -Evaluates the R-Squared values of regression models over specified time segments in time series data to assess -segment-wise model performance. - -###### Purpose - -The TimeSeriesR2SquareBySegments test aims to evaluate the R-Squared values for several regression models across -different segments of time series data. This helps in determining how well the models explain the variability in -the data within each specific time segment. - -###### Test Mechanism -- Provides a visual representation of model performance across different time segments. -- Allows for identification of segments where the model performs poorly. -- Calculating the R-Squared values for each segment. -- Generating a bar chart to visually represent the R-Squared values across different models and segments. - -###### Signs of High Risk - -- Significantly low R-Squared values for certain time segments, indicating poor model performance in those periods. -- Large variability in R-Squared values across different segments for the same model, suggesting inconsistent -performance. - -###### Strengths - -- Provides a visual representation of how well models perform over different time periods. -- Helps identify time segments where models may need improvement or retraining. -- Facilitates comparison between multiple models in a straightforward manner. - -###### Limitations - -- Assumes datasets are provided as DataFrameDataset objects with the attributes `y`, `y_pred`, and -`feature_columns`. -- Requires that `dataset.y_pred(model)` returns predicted values for the model. -- Assumes that both `y_true` and `y_pred` are pandas Series with datetime indices, which may not always be the case. -- May not account for more nuanced temporal dependencies within the segments. - - - - - - - -#### TokenDisparity - - - - - - -####### TokenDisparity() - -```python -def TokenDisparity(dataset, model) -``` - - -Evaluates the token disparity between reference and generated texts, visualizing the results through histograms and -bar charts, alongside compiling a comprehensive table of descriptive statistics for token counts. - -###### Purpose - -The Token Disparity test aims to assess the difference in the number of tokens between reference texts and texts -generated by the model. Understanding token disparity is essential for evaluating how well the generated content -matches the expected length and richness of the reference texts. - -###### Test Mechanism - -The test extracts true and predicted values from the dataset and model. It computes the number of tokens in each -reference and generated text. The results are visualized using histograms and bar charts to display the -distribution of token counts. Additionally, a table of descriptive statistics, including the mean, median, standard -deviation, minimum, and maximum token counts, is compiled to provide a detailed summary of token usage. - -###### Signs of High Risk - -- Significant disparity in token counts between reference and generated texts could indicate issues with text -generation quality, such as verbosity or lack of detail. -- Consistently low token counts in generated texts compared to references might suggest that the model is producing -incomplete or overly concise outputs. - -###### Strengths - -- Provides a simple yet effective evaluation of text length and token usage. -- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of -token counts. -- Descriptive statistics offer a concise summary of the model's performance in generating texts of appropriate -length. - -###### Limitations - -- Token counts alone do not provide a complete assessment of text quality and should be supplemented with other -metrics and qualitative analysis. - - - - - - - -#### ToxicityScore - - - - - - -####### ToxicityScore() - -```python -def ToxicityScore(dataset, model) -``` - - -Assesses the toxicity levels of texts generated by NLP models to identify and mitigate harmful or offensive content. - -###### Purpose - -The ToxicityScore metric is designed to evaluate the toxicity levels of texts generated by models. This is crucial -for identifying and mitigating harmful or offensive content in machine-generated texts. - -###### Test Mechanism - -The function starts by extracting the input, true, and predicted values from the provided dataset and model. The -toxicity score is computed for each text using a preloaded `toxicity` evaluation tool. The scores are compiled into -dataframes, and histograms and bar charts are generated to visualize the distribution of toxicity scores. -Additionally, a table of descriptive statistics (mean, median, standard deviation, minimum, and maximum) is -compiled for the toxicity scores, providing a comprehensive summary of the model's performance. - -###### Signs of High Risk - -- Drastic spikes in toxicity scores indicate potentially toxic content within the associated text segment. -- Persistent high toxicity scores across multiple texts may suggest systemic issues in the model's text generation -process. - -###### Strengths - -- Provides a clear evaluation of toxicity levels in generated texts, helping to ensure content safety and -appropriateness. -- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of -toxicity scores. -- Descriptive statistics offer a concise summary of the model's performance in generating non-toxic texts. - -###### Limitations - -- The accuracy of the toxicity scores is contingent upon the underlying `toxicity` tool. -- The scores provide a broad overview but do not specify which portions or tokens of the text are responsible for -high toxicity. -- Supplementary, in-depth analysis might be needed for granular insights. - - - - - - - -#### sklearn - - - - - -##### AdjustedMutualInformation - - - - - - -######## AdjustedMutualInformation() - -```python -def AdjustedMutualInformation(model: VMModel, dataset: VMDataset) -``` - - -Evaluates clustering model performance by measuring mutual information between true and predicted labels, adjusting -for chance. - -###### Purpose - -The purpose of this metric (Adjusted Mutual Information) is to evaluate the performance of a machine learning -model, more specifically, a clustering model. It measures the mutual information between the true labels and the -ones predicted by the model, adjusting for chance. - -###### Test Mechanism - -The Adjusted Mutual Information (AMI) uses sklearn's `adjusted_mutual_info_score` function. This function -calculates the mutual information between the true labels and the ones predicted while correcting for the chance -correlation expected due to random label assignments. This test requires the model, the training dataset, and the -test dataset as inputs. - -###### Signs of High Risk - -- Low Adjusted Mutual Information Score**: This score ranges between 0 and 1. A low score (closer to 0) can indicate -poor model performance as the predicted labels do not align well with the true labels. -- In case of high-dimensional data, if the algorithm shows high scores, this could also be a potential risk as AMI -may not perform reliably. - -###### Strengths - -- The AMI metric takes into account the randomness of the predicted labels, which makes it more robust than the -simple Mutual Information. -- The scale of AMI is not dependent on the sizes of the clustering, allowing for comparability between different -datasets or models. -- Good for comparing the output of clustering algorithms where the number of clusters is not known a priori. - -###### Limitations - -- Adjusted Mutual Information does not take into account the continuous nature of some data. As a result, it may -not be the best choice for regression or other continuous types of tasks. -- AMI has the drawback of being biased towards clusterings with a higher number of clusters. -- In comparison to other metrics, AMI can be slower to compute. -- The interpretability of the score can be complex as it depends on the understanding of information theory -concepts. - - - - - - - -##### AdjustedRandIndex - - - - - - -######## AdjustedRandIndex() - -```python -def AdjustedRandIndex(model: VMModel, dataset: VMDataset) -``` - - -Measures the similarity between two data clusters using the Adjusted Rand Index (ARI) metric in clustering machine -learning models. - -###### Purpose - -The Adjusted Rand Index (ARI) metric is intended to measure the similarity between two data clusters. This metric -is specifically used for clustering machine learning models to quantify how well the model is clustering and -producing data groups. It involves comparing the model's produced clusters against the actual (true) clusters found -in the dataset. - -###### Test Mechanism - -The Adjusted Rand Index (ARI) is calculated using the `adjusted_rand_score` method from the `sklearn.metrics` -module in Python. The test requires inputs including the model itself and the model's training and test datasets. -The model's computed clusters and the true clusters are compared, and the similarities are measured to compute the -ARI. - -###### Signs of High Risk - -- If the ARI is close to zero, it signifies that the model's cluster assignments are random and do not match the -actual dataset clusters, indicating a high risk. -- An ARI of less than zero indicates that the model's clustering performance is worse than random. - -###### Strengths - -- ARI is normalized and provides a consistent metric between -1 and +1, irrespective of raw cluster sizes or -dataset size variations. -- It does not require a ground truth for computation, making it ideal for unsupervised learning model evaluations. -- It penalizes for false positives and false negatives, providing a robust measure of clustering quality. - -###### Limitations - -- In real-world situations, true clustering is often unknown, which can hinder the practical application of the ARI. -- The ARI requires all individual data instances to be independent, which may not always hold true. -- It may be difficult to interpret the implications of an ARI score without context or a benchmark, as it is -heavily dependent on the characteristics of the dataset used. - - - - - - - -##### CalibrationCurve - - - - - - -######## CalibrationCurve() - -```python -def CalibrationCurve(model: VMModel, dataset: VMDataset, n_bins: int = 10) -``` - - -Evaluates the calibration of probability estimates by comparing predicted probabilities against observed -frequencies. - -###### Purpose - -The Calibration Curve test assesses how well a model's predicted probabilities align with actual -observed frequencies. This is crucial for applications requiring accurate probability estimates, -such as risk assessment, decision-making systems, and cost-sensitive applications where probability -calibration directly impacts business decisions. - -###### Test Mechanism - -The test uses sklearn's calibration_curve function to: -1. Sort predictions into bins based on predicted probabilities -2. Calculate the mean predicted probability in each bin -3. Compare against the observed frequency of positive cases -4. Plot the results against the perfect calibration line (y=x) -The resulting curve shows how well the predicted probabilities match empirical probabilities. - -###### Signs of High Risk - -- Significant deviation from the perfect calibration line -- Systematic overconfidence (predictions too close to 0 or 1) -- Systematic underconfidence (predictions clustered around 0.5) -- Empty or sparse bins indicating poor probability coverage -- Sharp discontinuities in the calibration curve -- Different calibration patterns across different probability ranges -- Consistent over/under estimation in critical probability regions -- Large confidence intervals in certain probability ranges - -###### Strengths - -- Visual and intuitive interpretation of probability quality -- Identifies systematic biases in probability estimates -- Supports probability threshold selection -- Helps understand model confidence patterns -- Applicable across different classification models -- Enables comparison between different models -- Guides potential need for recalibration -- Critical for risk-sensitive applications - -###### Limitations - -- Sensitive to the number of bins chosen -- Requires sufficient samples in each bin for reliable estimates -- May mask local calibration issues within bins -- Does not account for feature-dependent calibration issues -- Limited to binary classification problems -- Cannot detect all forms of miscalibration -- Assumes bin boundaries are appropriate for the problem -- May be affected by class imbalance - - - - - - - -##### ClassifierPerformance - - - - - - -######## ClassifierPerformance() - -```python -def ClassifierPerformance(dataset: VMDataset, model: VMModel, average: str = 'macro') -``` - - -Evaluates performance of binary or multiclass classification models using precision, recall, F1-Score, accuracy, -and ROC AUC scores. - -###### Purpose - -The Classifier Performance test is designed to evaluate the performance of Machine Learning classification models. -It accomplishes this by computing precision, recall, F1-Score, and accuracy, as well as the ROC AUC (Receiver -operating characteristic - Area under the curve) scores, thereby providing a comprehensive analytic view of the -models' performance. The test is adaptable, handling binary and multiclass models equally effectively. - -###### Test Mechanism - -The test produces a report that includes precision, recall, F1-Score, and accuracy, by leveraging the -`classification_report` from scikit-learn's metrics module. For multiclass models, macro and weighted averages for -these scores are also calculated. Additionally, the ROC AUC scores are calculated and included in the report using -the `multiclass_roc_auc_score` function. The outcome of the test (report format) differs based on whether the model -is binary or multiclass. - -###### Signs of High Risk - -- Low values for precision, recall, F1-Score, accuracy, and ROC AUC, indicating poor performance. -- Imbalance in precision and recall scores. -- A low ROC AUC score, especially scores close to 0.5 or lower, suggesting a failing model. - -###### Strengths - -- Versatile, capable of assessing both binary and multiclass models. -- Utilizes a variety of commonly employed performance metrics, offering a comprehensive view of model performance. -- The use of ROC-AUC as a metric is beneficial for evaluating unbalanced datasets. - -###### Limitations - -- Assumes correctly identified labels for binary classification models. -- Specifically designed for classification models and not suitable for regression models. -- May provide limited insights if the test dataset does not represent real-world scenarios adequately. - - - - -######## multiclass_roc_auc_score() - -```python -def multiclass_roc_auc_score(y_test, y_pred, average = 'macro') -``` - - - - - - - - -##### ClassifierThresholdOptimization - - - - - - -######## ClassifierThresholdOptimization() - -```python -def ClassifierThresholdOptimization(dataset: VMDataset, model: VMModel, methods = None, target_recall = None) -``` - - -Analyzes and visualizes different threshold optimization methods for binary classification models. - -###### Purpose - -The Classifier Threshold Optimization test identifies optimal decision thresholds using various -methods to balance different performance metrics. This helps adapt the model's decision boundary -to specific business requirements, such as minimizing false positives in fraud detection or -achieving target recall in medical diagnosis. - -###### Test Mechanism - -The test implements multiple threshold optimization methods: -1. Youden's J statistic (maximizing sensitivity + specificity - 1) -2. F1-score optimization (balancing precision and recall) -3. Precision-Recall equality point -4. Target recall achievement -5. Naive (0.5) threshold -For each method, it computes ROC and PR curves, identifies optimal points, and provides -comprehensive performance metrics at each threshold. - -###### Signs of High Risk - -- Large discrepancies between different optimization methods -- Optimal thresholds far from the default 0.5 -- Poor performance metrics across all thresholds -- Significant gap between achieved and target recall -- Unstable thresholds across different methods -- Extreme trade-offs between precision and recall -- Threshold optimization showing minimal impact -- Business metrics not improving with optimization - -###### Strengths - -- Multiple optimization strategies for different needs -- Visual and numerical results for comparison -- Support for business-driven optimization (target recall) -- Comprehensive performance metrics at each threshold -- Integration with ROC and PR curves -- Handles class imbalance through various metrics -- Enables informed threshold selection -- Supports cost-sensitive decision making - -###### Limitations - -- Assumes cost of false positives/negatives are known -- May need adjustment for highly imbalanced datasets -- Threshold might not be stable across different samples -- Cannot handle multi-class problems directly -- Optimization methods may conflict with business needs -- Requires sufficient validation data -- May not capture temporal changes in optimal threshold -- Single threshold may not be optimal for all subgroups - -**Arguments** - -- **dataset****: VMDataset containing features and target -- **model**: VMModel containing predictions -- **methods**: List of methods to compare (default: ['youden', 'f1', 'precision_recall']) -- **target_recall**: Target recall value if using 'target_recall' method - -**Returns** - -- **Dictionary containing**: - table: DataFrame comparing different threshold optimization methods (using weighted averages for precision, recall, and f1) - figure: Plotly figure showing ROC and PR curves with optimal thresholds - - - - -######## find_optimal_threshold() - -```python -def find_optimal_threshold(y_true, y_prob, method = 'youden', target_recall = None) -``` - - -Find the optimal classification threshold using various methods. - -**Arguments** - -- **y_true****: True binary labels -- **y_prob**: Predicted probabilities -- **method**: Method to use for finding optimal threshold -- **target_recall**: Required if method='target_recall' - -**Returns** - -- **dict**: Dictionary containing threshold and metrics - - - - - - - -##### ClusterCosineSimilarity - - - - - - -######## ClusterCosineSimilarity() - -```python -def ClusterCosineSimilarity(model: VMModel, dataset: VMDataset) -``` - - -Measures the intra-cluster similarity of a clustering model using cosine similarity. - -###### Purpose - -The purpose of this metric is to measure how similar the data points within each cluster of a clustering model are. -This is done using cosine similarity, which compares the multi-dimensional direction (but not magnitude) of data -vectors. From a Model Risk Management perspective, this metric is used to quantitatively validate that clusters -formed by a model have high intra-cluster similarity. - -###### Test Mechanism - -This test works by first extracting the true and predicted clusters of the model's training data. Then, it computes -the centroid (average data point) of each cluster. Next, it calculates the cosine similarity between each data -point within a cluster and its respective centroid. Finally, it outputs the mean cosine similarity of each cluster, -highlighting how similar, on average, data points in a cluster are to the cluster's centroid. - -###### Signs of High Risk - -- Low mean cosine similarity for one or more clusters**: If the mean cosine similarity is low, the data points within -the respective cluster have high variance in their directions. This can be indicative of poor clustering, -suggesting that the model might not be suitably separating the data into distinct patterns. -- High disparity between mean cosine similarity values across clusters: If there's a significant difference in mean -cosine similarity across different clusters, this could indicate imbalance in how the model forms clusters. - -###### Strengths - -- Cosine similarity operates in a multi-dimensional space, making it effective for measuring similarity in high -dimensional datasets, typical for many machine learning problems. -- It provides an agnostic view of the cluster performance by only considering the direction (and not the magnitude) -of each vector. -- This metric is not dependent on the scale of the variables, making it equally effective on different scales. - -###### Limitations - -- Cosine similarity does not consider magnitudes (i.e. lengths) of vectors, only their direction. This means it may -overlook instances where clusters have been adequately separated in terms of magnitude. -- This method summarily assumes that centroids represent the average behavior of data points in each cluster. This -might not always be true, especially in clusters with high amounts of variance or non-spherical shapes. -- It primarily works with continuous variables and is not suitable for binary or categorical variables. -- Lastly, although rare, perfect perpendicular vectors (cosine similarity = 0) could be within the same cluster, -which may give an inaccurate representation of a 'bad' cluster due to low cosine similarity score. - - - - - - - -##### ClusterPerformanceMetrics - - - - - - -######## ClusterPerformanceMetrics() - -```python -def ClusterPerformanceMetrics(model: VMModel, dataset: VMDataset) -``` - - -Evaluates the performance of clustering machine learning models using multiple established metrics. - -###### Purpose - -The `ClusterPerformanceMetrics` test is used to assess the performance and validity of clustering machine learning -models. It evaluates homogeneity, completeness, V measure score, the Adjusted Rand Index, the Adjusted Mutual -Information, and the Fowlkes-Mallows score of the model. These metrics provide a holistic understanding of the -model's ability to accurately form clusters of the given dataset. - -###### Test Mechanism - -The `ClusterPerformanceMetrics` test runs a clustering ML model over a given dataset and then calculates six -metrics using the Scikit-learn metrics computation functions**: Homogeneity Score, Completeness Score, V Measure, -Adjusted Rand Index (ARI), Adjusted Mutual Information (AMI), and Fowlkes-Mallows Score. It then returns the result -as a summary, presenting the metric values for both training and testing datasets. - -###### Signs of High Risk - -- Low Homogeneity Score: Indicates that the clusters formed contain a variety of classes, resulting in less pure -clusters. -- Low Completeness Score: Suggests that class instances are scattered across multiple clusters rather than being -gathered in a single cluster. -- Low V Measure: Reports a low overall clustering performance. -- ARI close to 0 or Negative: Implies that clustering results are random or disagree with the true labels. -- AMI close to 0: Means that clustering labels are random compared with the true labels. -- Low Fowlkes-Mallows score: Signifies less precise and poor clustering performance in terms of precision and -recall. - -###### Strengths - -- Provides a comprehensive view of clustering model performance by examining multiple clustering metrics. -- Uses established and widely accepted metrics from scikit-learn, providing reliability in the results. -- Able to provide performance metrics for both training and testing datasets. -- Clearly defined and human-readable descriptions of each score make it easy to understand what each score -represents. - -###### Limitations - -- Only applies to clustering models; not suitable for other types of machine learning models. -- Does not test for overfitting or underfitting in the clustering model. -- All the scores rely on ground truth labels, the absence or inaccuracy of which can lead to misleading results. -- Does not consider aspects like computational efficiency of the model or its capability to handle high dimensional -data. - - - - - - - -##### CompletenessScore - - - - - - -######## CompletenessScore() - -```python -def CompletenessScore(model: VMModel, dataset: VMDataset) -``` - - -Evaluates a clustering model's capacity to categorize instances from a single class into the same cluster. - -###### Purpose - -The Completeness Score metric is used to assess the performance of clustering models. It measures the extent to -which all the data points that are members of a given class are elements of the same cluster. The aim is to -determine the capability of the model to categorize all instances from a single class into the same cluster. - -###### Test Mechanism - -This test takes three inputs, a model and its associated training and testing datasets. It invokes the -`completeness_score` function from the sklearn library on the labels predicted by the model. High scores indicate -that data points from the same class generally appear in the same cluster, while low scores suggest the opposite. - -###### Signs of High Risk - -- Low completeness score**: This suggests that the model struggles to group instances from the same class into one -cluster, indicating poor clustering performance. - -###### Strengths - -- The Completeness Score provides an effective method for assessing the performance of a clustering model, -specifically its ability to group class instances together. -- This test metric conveniently relies on the capabilities provided by the sklearn library, ensuring consistent and -reliable test results. - -###### Limitations - -- This metric only evaluates a specific aspect of clustering, meaning it may not provide a holistic or complete -view of the model's performance. -- It cannot assess the effectiveness of the model in differentiating between separate classes, as it is solely -focused on how well data points from the same class are grouped. -- The Completeness Score only applies to clustering models; it cannot be used for other types of machine learning -models. - - - - - - - -##### ConfusionMatrix - - - - - - -######## ConfusionMatrix() - -```python -def ConfusionMatrix(dataset: VMDataset, model: VMModel) -``` - - -Evaluates and visually represents the classification ML model's predictive performance using a Confusion Matrix -heatmap. - -###### Purpose - -The Confusion Matrix tester is designed to assess the performance of a classification Machine Learning model. This -performance is evaluated based on how well the model is able to correctly classify True Positives, True Negatives, -False Positives, and False Negatives - fundamental aspects of model accuracy. - -###### Test Mechanism - -The mechanism used involves taking the predicted results (`y_test_predict`) from the classification model and -comparing them against the actual values (`y_test_true`). A confusion matrix is built using the unique labels -extracted from `y_test_true`, employing scikit-learn's metrics. The matrix is then visually rendered with the help -of Plotly's `create_annotated_heatmap` function. A heatmap is created which provides a two-dimensional graphical -representation of the model's performance, showcasing distributions of True Positives (TP), True Negatives (TN), -False Positives (FP), and False Negatives (FN). - -###### Signs of High Risk - -- High numbers of False Positives (FP) and False Negatives (FN), depicting that the model is not effectively -classifying the values. -- Low numbers of True Positives (TP) and True Negatives (TN), implying that the model is struggling with correctly -identifying class labels. - -###### Strengths - -- It provides a simplified yet comprehensive visual snapshot of the classification model's predictive performance. -- It distinctly brings out True Positives (TP), True Negatives (TN), False Positives (FP), and False Negatives -(FN), thus making it easier to focus on potential areas of improvement. -- The matrix is beneficial in dealing with multi-class classification problems as it can provide a simple view of -complex model performances. -- It aids in understanding the different types of errors that the model could potentially make, as it provides -in-depth insights into Type-I and Type-II errors. - -###### Limitations - -- In cases of unbalanced classes, the effectiveness of the confusion matrix might be lessened. It may wrongly -interpret the accuracy of a model that is essentially just predicting the majority class. -- It does not provide a single unified statistic that could evaluate the overall performance of the model. -Different aspects of the model's performance are evaluated separately instead. -- It mainly serves as a descriptive tool and does not offer the capability for statistical hypothesis testing. -- Risks of misinterpretation exist because the matrix doesn't directly provide precision, recall, or F1-score data. -These metrics have to be computed separately. - - - - - - - -##### FeatureImportance - - - - - - -######## FeatureImportance() - -```python -def FeatureImportance(dataset: VMDataset, model: VMModel, num_features: int = 3) -``` - - -Compute feature importance scores for a given model and generate a summary table -with the top important features. - -###### Purpose - -The Feature Importance Comparison test is designed to compare the feature importance scores for different models -when applied to various datasets. By doing so, it aims to identify the most impactful features and assess the -consistency of feature importance across models. - -###### Test Mechanism - -This test works by iterating through each dataset-model pair and calculating permutation feature importance (PFI) -scores. It then generates a summary table containing the top `num_features` important features for each model. The -process involves: - -- Extracting features and target data from each dataset. -- Computing PFI scores using `sklearn.inspection.permutation_importance`. -- Sorting and selecting the top features based on their importance scores. -- Compiling these features into a summary table for comparison. - -###### Signs of High Risk - -- Key features expected to be important are ranked low, indicating potential issues with model training or data -quality. -- High variance in feature importance scores across different models, suggesting instability in feature selection. - -###### Strengths - -- Provides a clear comparison of the most important features for each model. -- Uses permutation importance, which is a model-agnostic method and can be applied to any estimator. - -###### Limitations - -- Assumes that the dataset is provided as a DataFrameDataset object with `x_df` and `y_df` methods to access -feature and target data. -- Requires that `model.model` is compatible with `sklearn.inspection.permutation_importance`. -- The function's output is dependent on the number of features specified by `num_features`, which defaults to 3 but -can be adjusted. - - - - - - - -##### FowlkesMallowsScore - - - - - - -######## FowlkesMallowsScore() - -```python -def FowlkesMallowsScore(dataset: VMDataset, model: VMModel) -``` - - -Evaluates the similarity between predicted and actual cluster assignments in a model using the Fowlkes-Mallows -score. - -###### Purpose - -The FowlkesMallowsScore is a performance metric used to validate clustering algorithms within machine learning -models. The score intends to evaluate the matching grade between two clusters. It measures the similarity between -the predicted and actual cluster assignments, thus gauging the accuracy of the model's clustering capability. - -###### Test Mechanism - -The FowlkesMallowsScore method applies the `fowlkes_mallows_score` function from the `sklearn` library to evaluate -the model's accuracy in clustering different types of data. The test fetches the datasets from the model's training -and testing datasets as inputs then compares the resulting clusters against the previously known clusters to obtain -a score. A high score indicates a better clustering performance by the model. - -###### Signs of High Risk - -- A low Fowlkes-Mallows score (near zero)**: This indicates that the model's clustering capability is poor and the -algorithm isn't properly grouping data. -- Inconsistently low scores across different datasets: This may indicate that the model's clustering performance is -not robust and the model may fail when applied to unseen data. - -###### Strengths - -- The Fowlkes-Mallows score is a simple and effective method for evaluating the performance of clustering -algorithms. -- This metric takes into account both precision and recall in its calculation, therefore providing a balanced and -comprehensive measure of model performance. -- The Fowlkes-Mallows score is non-biased meaning it treats False Positives and False Negatives equally. - -###### Limitations - -- As a pairwise-based method, this score can be computationally intensive for large datasets and can become -unfeasible as the size of the dataset increases. -- The Fowlkes-Mallows score works best with balanced distribution of samples across clusters. If this condition is -not met, the score can be skewed. -- It does not handle mismatching numbers of clusters between the true and predicted labels. As such, it may return -misleading results if the predicted labels suggest a different number of clusters than what is in the true labels. - - - - - - - -##### HomogeneityScore - - - - - - -######## HomogeneityScore() - -```python -def HomogeneityScore(dataset: VMDataset, model: VMModel) -``` - - -Assesses clustering homogeneity by comparing true and predicted labels, scoring from 0 (heterogeneous) to 1 -(homogeneous). - -###### Purpose - -The Homogeneity Score encapsulated in this performance test is used to measure the homogeneity of the clusters -formed by a machine learning model. In simple terms, a clustering result satisfies homogeneity if all of its -clusters contain only points which are members of a single class. - -###### Test Mechanism - -This test uses the `homogeneity_score` function from the `sklearn.metrics` library to compare the ground truth -class labels of the training and testing sets with the labels predicted by the given model. The returned score is a -metric of the clustering accuracy, and ranges from 0.0 to 1.0, with 1.0 denoting the highest possible degree of -homogeneity. - -###### Signs of High Risk - -- A score close to 0**: This denotes that clusters are highly heterogenous and points within the same cluster might -not belong to the same class. -- A significantly lower score for testing data compared to the score for training data: This can indicate -overfitting, where the model has learned to perfectly match the training data but fails to perform well on unseen -data. - -###### Strengths - -- It provides a simple quantitative measure of the degree to which clusters contain points from only one class. -- Useful for validating clustering solutions where the ground truth — class membership of points — is known. -- It's agnostic to the absolute labels, and cares only that the points within the same cluster have the same class -label. - -###### Limitations - -- The Homogeneity Score is not useful for clustering solutions where the ground truth labels are not known. -- It doesn’t work well with differently sized clusters since it gives predominance to larger clusters. -- The score does not address the actual number of clusters formed, or the evenness of cluster sizes. It only checks -the homogeneity within the given clusters created by the model. - - - - - - - -##### HyperParametersTuning - - - - - - -######## HyperParametersTuning() - -```python -def HyperParametersTuning(model: VMModel, dataset: VMDataset, param_grid: dict, scoring: Union = None, thresholds: Union = None, fit_params: dict = None) -``` - - -Performs exhaustive grid search over specified parameter ranges to find optimal model configurations -across different metrics and decision thresholds. - -###### Purpose - -The Hyperparameter Tuning test systematically explores the model's parameter space to identify optimal -configurations. It supports multiple optimization metrics and decision thresholds, providing a comprehensive -view of how different parameter combinations affect various aspects of model performance. - -###### Test Mechanism - -The test uses scikit-learn's GridSearchCV to perform cross-validation for each parameter combination. -For each specified threshold and optimization metric, it creates a scoring dictionary with -threshold-adjusted metrics, performs grid search with cross-validation, records best parameters and -corresponding scores, and combines results into a comparative table. This process is repeated for each -optimization metric to provide a comprehensive view of model performance under different configurations. - -###### Signs of High Risk - -- Large performance variations across different parameter combinations -- Significant discrepancies between different optimization metrics -- Best parameters at the edges of the parameter grid -- Unstable performance across different thresholds -- Overly complex model configurations (risk of overfitting) -- Very different optimal parameters for different metrics -- Cross-validation scores showing high variance -- Extreme parameter values in best configurations - -###### Strengths - -- Comprehensive exploration of parameter space -- Supports multiple optimization metrics -- Allows threshold optimization -- Provides comparative view across different configurations -- Uses cross-validation for robust evaluation -- Helps understand trade-offs between different metrics -- Enables systematic parameter selection -- Supports both classification and clustering tasks - -###### Limitations - -- Computationally expensive for large parameter grids -- May not find global optimum (limited to grid points) -- Cannot handle dependencies between parameters -- Memory intensive for large datasets -- Limited to scikit-learn compatible models -- Cross-validation splits may not preserve time series structure -- Grid search may miss optimal values between grid points -- Resource intensive for high-dimensional parameter spaces - - - - -######## custom_recall() - -```python -def custom_recall(y_true, y_pred_proba, threshold = 0.5) -``` - - - - - - - - -##### KMeansClustersOptimization - - - - - - -######## KMeansClustersOptimization() - -```python -def KMeansClustersOptimization(model: VMModel, dataset: VMDataset, n_clusters: Union = None) -``` - - -Optimizes the number of clusters in K-means models using Elbow and Silhouette methods. - -###### Purpose - -This metric is used to optimize the number of clusters used in K-means clustering models. It intends to measure and -evaluate the optimal number of clusters by leveraging two methodologies, namely the Elbow method and the Silhouette -method. This is crucial as an inappropriate number of clusters can either overly simplify or overcomplicate the -structure of the data, thereby undermining the effectiveness of the model. - -###### Test Mechanism - -The test mechanism involves iterating over a predefined range of cluster numbers and applying both the Elbow method -and the Silhouette method. The Elbow method computes the sum of the minimum euclidean distances between data points -and their respective cluster centers (distortion). This value decreases as the number of clusters increases; the -optimal number is typically at the 'elbow' point where the decrease in distortion becomes less pronounced. -Meanwhile, the Silhouette method calculates the average silhouette score for each data point in the dataset, -providing a measure of how similar each item is to its own cluster compared to other clusters. The optimal number -of clusters under this method is the one that maximizes the average silhouette score. The results of both methods -are plotted for visual inspection. - -###### Signs of High Risk - -- A high distortion value or a low silhouette average score for the optimal number of clusters. -- No clear 'elbow' point or plateau observed in the distortion plot, or a uniformly low silhouette average score -across different numbers of clusters, suggesting the data is not amenable to clustering. -- An optimal cluster number that is unreasonably high or low, suggestive of overfitting or underfitting, -respectively. - -###### Strengths - -- Provides both a visual and quantitative method to determine the optimal number of clusters. -- Leverages two different methods (Elbow and Silhouette), thereby affording robustness and versatility in assessing -the data's clusterability. -- Facilitates improved model performance by allowing for an informed selection of the number of clusters. - -###### Limitations - -- Assumes that a suitable number of clusters exists in the data, which may not always be true, especially for -complex or noisy data. -- Both methods may fail to provide definitive answers when the data lacks clear cluster structures. -- Might not be straightforward to determine the 'elbow' point or maximize the silhouette average score, especially -in larger and complicated datasets. -- Assumes spherical clusters (due to using the Euclidean distance in the Elbow method), which might not align with -the actual structure of the data. - - - - - - - -##### MinimumAccuracy - - - - - - -######## MinimumAccuracy() - -```python -def MinimumAccuracy(dataset: VMDataset, model: VMModel, min_threshold: float = 0.7) -``` - - -Checks if the model's prediction accuracy meets or surpasses a specified threshold. - -###### Purpose - -The Minimum Accuracy test’s objective is to verify whether the model's prediction accuracy on a specific dataset -meets or surpasses a predetermined minimum threshold. Accuracy, which is simply the ratio of correct predictions to -total predictions, is a key metric for evaluating the model's performance. Considering binary as well as multiclass -classifications, accurate labeling becomes indispensable. - -###### Test Mechanism - -The test mechanism involves contrasting the model's accuracy score with a preset minimum threshold value, with the -default being 0.7. The accuracy score is computed utilizing sklearn’s `accuracy_score` method, where the true -labels `y_true` and predicted labels `class_pred` are compared. If the accuracy score is above the threshold, the -test receives a passing mark. The test returns the result along with the accuracy score and threshold used for the -test. - -###### Signs of High Risk - -- Model fails to achieve or surpass the predefined score threshold. -- Persistent scores below the threshold, indicating a high risk of inaccurate predictions. - -###### Strengths - -- Simplicity, presenting a straightforward measure of holistic model performance across all classes. -- Particularly advantageous when classes are balanced. -- Versatile, as it can be implemented on both binary and multiclass classification tasks. - -###### Limitations - -- Misleading accuracy scores when classes in the dataset are highly imbalanced. -- Favoritism towards the majority class, giving an inaccurate perception of model performance. -- Inability to measure the model's precision, recall, or capacity to manage false positives or false negatives. -- Focused on overall correctness and may not be sufficient for all types of model analytics. - - - - - - - -##### MinimumF1Score - - - - - - -######## MinimumF1Score() - -```python -def MinimumF1Score(dataset: VMDataset, model: VMModel, min_threshold: float = 0.5) -``` - - -Assesses if the model's F1 score on the validation set meets a predefined minimum threshold, ensuring balanced -performance between precision and recall. - -###### Purpose - -The main objective of this test is to ensure that the F1 score, a balanced measure of precision and recall, of the -model meets or surpasses a predefined threshold on the validation dataset. The F1 score is highly useful for -gauging model performance in classification tasks, especially in cases where the distribution of positive and -negative classes is skewed. - -###### Test Mechanism - -The F1 score for the validation dataset is computed through scikit-learn's metrics in Python. The scoring mechanism -differs based on the classification problem**: for multi-class problems, macro averaging is used, and for binary -classification, the built-in `f1_score` calculation is used. The obtained F1 score is then assessed against the -predefined minimum F1 score that is expected from the model. - -###### Signs of High Risk - -- If a model returns an F1 score that is less than the established threshold, it is regarded as high risk. -- A low F1 score might suggest that the model is not finding an optimal balance between precision and recall, -failing to effectively identify positive classes while minimizing false positives. - -###### Strengths - -- Provides a balanced measure of a model's performance by accounting for both false positives and false negatives. -- Particularly advantageous in scenarios with imbalanced class distribution, where accuracy can be misleading. -- Flexibility in setting the threshold value allows tailored minimum acceptable performance standards. - -###### Limitations - -- May not be suitable for all types of models and machine learning tasks. -- The F1 score assumes an equal cost for false positives and false negatives, which may not be true in some -real-world scenarios. -- Practitioners might need to rely on other metrics such as precision, recall, or the ROC-AUC score that align more -closely with specific requirements. - - - - - - - -##### MinimumROCAUCScore - - - - - - -######## MinimumROCAUCScore() - -```python -def MinimumROCAUCScore(dataset: VMDataset, model: VMModel, min_threshold: float = 0.5) -``` - - -Validates model by checking if the ROC AUC score meets or surpasses a specified threshold. - -###### Purpose - -The Minimum ROC AUC Score test is used to determine the model's performance by ensuring that the Receiver Operating -Characteristic Area Under the Curve (ROC AUC) score on the validation dataset meets or exceeds a predefined -threshold. The ROC AUC score indicates how well the model can distinguish between different classes, making it a -crucial measure in binary and multiclass classification tasks. - -###### Test Mechanism - -This test implementation calculates the multiclass ROC AUC score on the true target values and the model's -predictions. The test converts the multi-class target variables into binary format using `LabelBinarizer` before -computing the score. If this ROC AUC score is higher than the predefined threshold (defaulted to 0.5), the test -passes; otherwise, it fails. The results, including the ROC AUC score, the threshold, and whether the test passed -or failed, are then stored in a `ThresholdTestResult` object. - -###### Signs of High Risk - -- A high risk or failure in the model's performance as related to this metric would be represented by a low ROC AUC -score, specifically any score lower than the predefined minimum threshold. This suggests that the model is -struggling to distinguish between different classes effectively. - -###### Strengths - -- The test considers both the true positive rate and false positive rate, providing a comprehensive performance -measure. -- ROC AUC score is threshold-independent meaning it measures the model's quality across various classification -thresholds. -- Works robustly with binary as well as multi-class classification problems. - -###### Limitations - -- ROC AUC may not be useful if the class distribution is highly imbalanced; it could perform well in terms of AUC -but still fail to predict the minority class. -- The test does not provide insight into what specific aspects of the model are causing poor performance if the ROC -AUC score is unsatisfactory. -- The use of macro average for multiclass ROC AUC score implies equal weightage to each class, which might not be -appropriate if the classes are imbalanced. - - - - - - - -##### ModelParameters - - - - - - -######## ModelParameters() - -```python -def ModelParameters(model, model_params = None) -``` - - -Extracts and displays model parameters in a structured format for transparency and reproducibility. - -###### Purpose - -The Model Parameters test is designed to provide transparency into model configuration and ensure -reproducibility of machine learning models. It accomplishes this by extracting and presenting all -relevant parameters that define the model's behavior, making it easier to audit, validate, and -reproduce model training. - -###### Test Mechanism - -The test leverages scikit-learn's API convention of get_params() to extract model parameters. It -produces a structured DataFrame containing parameter names and their corresponding values. For models -that follow scikit-learn's API (including XGBoost, RandomForest, and other estimators), all -parameters are automatically extracted and displayed. - -###### Signs of High Risk - -- Missing crucial parameters that should be explicitly set -- Extreme parameter values that could indicate overfitting (e.g., unlimited tree depth) -- Inconsistent parameters across different versions of the same model type -- Parameter combinations known to cause instability or poor performance -- Default values used for critical parameters that should be tuned - -###### Strengths - -- Universal compatibility with scikit-learn API-compliant models -- Ensures transparency in model configuration -- Facilitates model reproducibility and version control -- Enables systematic parameter auditing -- Supports both classification and regression models -- Helps identify potential configuration issues - -###### Limitations - -- Only works with models implementing scikit-learn's get_params() method -- Cannot capture dynamic parameters set during model training -- Does not validate parameter values for model-specific appropriateness -- Parameter meanings and impacts may vary across different model types -- Cannot detect indirect parameter interactions or their effects on model performance - - - - - - - -##### ModelsPerformanceComparison - - - - - - -######## ModelsPerformanceComparison() - -```python -def ModelsPerformanceComparison(dataset: VMDataset, models: list) -``` - - -Evaluates and compares the performance of multiple Machine Learning models using various metrics like accuracy, -precision, recall, and F1 score. - -###### Purpose - -The Models Performance Comparison test aims to evaluate and compare the performance of various Machine Learning -models using test data. It employs multiple metrics such as accuracy, precision, recall, and the F1 score, among -others, to assess model performance and assist in selecting the most effective model for the designated task. - -###### Test Mechanism - -The test employs Scikit-learn’s performance metrics to evaluate each model's performance for both binary and -multiclass classification tasks. To compare performances, the test runs each model against the test dataset, then -produces a comprehensive classification report. This report includes metrics such as accuracy, precision, recall, -and the F1 score. Based on whether the task at hand is binary or multiclass classification, it calculates metrics -for all the classes and their weighted averages, macro averages, and per-class metrics. The test will be skipped if -no models are supplied. - -###### Signs of High Risk - -- Low scores in accuracy, precision, recall, and F1 metrics indicate a potentially high risk. -- A low area under the Receiver Operating Characteristic (ROC) curve (roc_auc score) is another possible indicator -of high risk. -- If the metrics scores are significantly lower than alternative models, this might suggest a high risk of failure. - -###### Strengths - -- Provides a simple way to compare the performance of multiple models, accommodating both binary and multiclass -classification tasks. -- Offers a holistic view of model performance through a comprehensive report of key performance metrics. -- The inclusion of the ROC AUC score is advantageous, as this robust performance metric can effectively handle -class imbalance issues. - -###### Limitations - -- May not be suitable for more complex performance evaluations that consider factors such as prediction speed, -computational cost, or business-specific constraints. -- The test's reliability depends on the provided test dataset; hence, the selected models' performance could vary -with unseen data or changes in the data distribution. -- The ROC AUC score might not be as meaningful or easily interpretable for multilabel/multiclass tasks. - - - - - - - -##### OverfitDiagnosis - - - - - - -######## OverfitDiagnosis() - -```python -def OverfitDiagnosis(model: VMModel, datasets: List, metric: str = None, cut_off_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}) -``` - - -Assesses potential overfitting in a model's predictions, identifying regions where performance between training and -testing sets deviates significantly. - -###### Purpose - -The Overfit Diagnosis test aims to identify areas in a model's predictions where there is a significant difference -in performance between the training and testing sets. This test helps to pinpoint specific regions or feature -segments where the model may be overfitting. - -###### Test Mechanism - -This test compares the model's performance on training versus test data, grouped by feature columns. It calculates -the difference between the training and test performance for each group and identifies regions where this -difference exceeds a specified threshold: - -- The test works for both classification and regression models. -- It defaults to using the AUC metric for classification models and the MSE metric for regression models. -- The threshold for identifying overfitting regions is set to 0.04 by default. -- The test calculates the performance metrics for each feature segment and plots regions where the performance gap -exceeds the threshold. - -###### Signs of High Risk - -- Significant gaps between training and test performance metrics for specific feature segments. -- Multiple regions with performance gaps exceeding the defined threshold. -- Higher than expected differences in predicted versus actual values in the test set compared to the training set. - -###### Strengths - -- Identifies specific areas where overfitting occurs. -- Supports multiple performance metrics, providing flexibility. -- Applicable to both classification and regression models. -- Visualization of overfitting segments aids in better understanding and debugging. - -###### Limitations - -- The default threshold may not be suitable for all use cases and requires tuning. -- May not capture more subtle forms of overfitting that do not exceed the threshold. -- Assumes that the binning of features adequately represents the data segments. - - - - - - - -##### PermutationFeatureImportance - - - - - - -######## PermutationFeatureImportance() - -```python -def PermutationFeatureImportance(model: VMModel, dataset: VMDataset, fontsize: Union = None, figure_height: Union = None) -``` - - -Assesses the significance of each feature in a model by evaluating the impact on model performance when feature -values are randomly rearranged. - -###### Purpose - -The Permutation Feature Importance (PFI) metric aims to assess the importance of each feature used by the Machine -Learning model. The significance is measured by evaluating the decrease in the model's performance when the -feature's values are randomly arranged. - -###### Test Mechanism - -PFI is calculated via the `permutation_importance` method from the `sklearn.inspection` module. This method -shuffles the columns of the feature dataset and measures the impact on the model's performance. A significant -decrease in performance after permutating a feature's values deems the feature as important. On the other hand, if -performance remains the same, the feature is likely not important. The output of the PFI metric is a figure -illustrating the importance of each feature. - -###### Signs of High Risk - -- The model heavily relies on a feature with highly variable or easily permutable values, indicating instability. -- A feature deemed unimportant by the model but expected to have a significant effect on the outcome based on -domain knowledge is not influencing the model's predictions. - -###### Strengths - -- Provides insights into the importance of different features and may reveal underlying data structure. -- Can indicate overfitting if a particular feature or set of features overly impacts the model's predictions. -- Model-agnostic and can be used with any classifier that provides a measure of prediction accuracy before and -after feature permutation. - -###### Limitations - -- Does not imply causality; it only presents the amount of information that a feature provides for the prediction -task. -- Does not account for interactions between features. If features are correlated, the permutation importance may -allocate importance to one and not the other. -- Cannot interact with certain libraries like statsmodels, pytorch, catboost, etc., thus limiting its applicability. - - - - - - - -##### PopulationStabilityIndex - - - - - - -######## PopulationStabilityIndex() - -```python -def PopulationStabilityIndex(datasets: List, model: VMModel, num_bins: int = 10, mode: str = 'fixed') -``` - - -Assesses the Population Stability Index (PSI) to quantify the stability of an ML model's predictions across -different datasets. - -###### Purpose - -The Population Stability Index (PSI) serves as a quantitative assessment for evaluating the stability of a machine -learning model's output distributions when comparing two different datasets. Typically, these would be a -development and a validation dataset or two datasets collected at different periods. The PSI provides a measurable -indication of any significant shift in the model's performance over time or noticeable changes in the -characteristics of the population the model is making predictions for. - -###### Test Mechanism - -The implementation of the PSI in this script involves calculating the PSI for each feature between the training and -test datasets. Data from both datasets is sorted and placed into either a predetermined number of bins or -quantiles. The boundaries for these bins are initially determined based on the distribution of the training data. -The contents of each bin are calculated and their respective proportions determined. Subsequently, the PSI is -derived for each bin through a logarithmic transformation of the ratio of the proportions of data for each feature -in the training and test datasets. The PSI, along with the proportions of data in each bin for both datasets, are -displayed in a summary table, a grouped bar chart, and a scatter plot. - -###### Signs of High Risk - -- A high PSI value is a clear indicator of high risk. Such a value suggests a significant shift in the model -predictions or severe changes in the characteristics of the underlying population. -- This ultimately suggests that the model may not be performing as well as expected and that it may be less -reliable for making future predictions. - -###### Strengths - -- The PSI provides a quantitative measure of the stability of a model over time or across different samples, making -it an invaluable tool for evaluating changes in a model's performance. -- It allows for direct comparisons across different features based on the PSI value. -- The calculation and interpretation of the PSI are straightforward, facilitating its use in model risk management. -- The use of visual aids such as tables and charts further simplifies the comprehension and interpretation of the -PSI. - -###### Limitations - -- The PSI test does not account for the interdependence between features**: features that are dependent on one -another may show similar shifts in their distributions, which in turn may result in similar PSI values. -- The PSI test does not inherently provide insights into why there are differences in distributions or why the PSI -values may have changed. -- The test may not handle features with significant outliers adequately. -- Additionally, the PSI test is performed on model predictions, not on the underlying data distributions which can -lead to misinterpretations. Any changes in PSI could be due to shifts in the model (model drift), changes in the -relationships between features and the target variable (concept drift), or both. However, distinguishing between -these causes is non-trivial. - - - - -######## calculate_psi() - -```python -def calculate_psi(score_initial, score_new, num_bins = 10, mode = 'fixed') -``` - - -Taken from: -https://towardsdatascience.com/checking-model-stability-and-population-shift-with-psi-and-csi-6d12af008783 - - - - - - - -##### PrecisionRecallCurve - - - - - - -######## PrecisionRecallCurve() - -```python -def PrecisionRecallCurve(model: VMModel, dataset: VMDataset) -``` - - -Evaluates the precision-recall trade-off for binary classification models and visualizes the Precision-Recall curve. - -###### Purpose - -The Precision Recall Curve metric is intended to evaluate the trade-off between precision and recall in -classification models, particularly binary classification models. It assesses the model's capacity to produce -accurate results (high precision), as well as its ability to capture a majority of all positive instances (high -recall). - -###### Test Mechanism - -The test extracts ground truth labels and prediction probabilities from the model's test dataset. It applies the -`precision_recall_curve` method from the sklearn metrics module to these extracted labels and predictions, which -computes a precision-recall pair for each possible threshold. This calculation results in an array of precision and -recall scores that can be plotted against each other to form the Precision-Recall Curve. This curve is then -visually represented by using Plotly's scatter plot. - -###### Signs of High Risk - -- A lower area under the Precision-Recall Curve signifies high risk. -- This corresponds to a model yielding a high amount of false positives (low precision) and/or false negatives (low -recall). -- If the curve is closer to the bottom left of the plot, rather than being closer to the top right corner, it can -be a sign of high risk. - -###### Strengths - -- This metric aptly represents the balance between precision (minimizing false positives) and recall (minimizing -false negatives), which is especially critical in scenarios where both values are significant. -- Through the graphic representation, it enables an intuitive understanding of the model's performance across -different threshold levels. - -###### Limitations - -- This metric is only applicable to binary classification models - it raises errors for multiclass classification -models or Foundation models. -- It may not fully represent the overall accuracy of the model if the cost of false positives and false negatives -are extremely different, or if the dataset is heavily imbalanced. - - - - - - - -##### ROCCurve - - - - - - -######## ROCCurve() - -```python -def ROCCurve(model: VMModel, dataset: VMDataset) -``` - - -Evaluates binary classification model performance by generating and plotting the Receiver Operating Characteristic -(ROC) curve and calculating the Area Under Curve (AUC) score. - -###### Purpose - -The Receiver Operating Characteristic (ROC) curve is designed to evaluate the performance of binary classification -models. This curve illustrates the balance between the True Positive Rate (TPR) and False Positive Rate (FPR) -across various threshold levels. In combination with the Area Under the Curve (AUC), the ROC curve aims to measure -the model's discrimination ability between the two defined classes in a binary classification problem (e.g., -default vs non-default). Ideally, a higher AUC score signifies superior model performance in accurately -distinguishing between the positive and negative classes. - -###### Test Mechanism - -First, this script selects the target model and datasets that require binary classification. It then calculates the -predicted probabilities for the test set, and uses this data, along with the true outcomes, to generate and plot -the ROC curve. Additionally, it includes a line signifying randomness (AUC of 0.5). The AUC score for the model's -ROC curve is also computed, presenting a numerical estimation of the model's performance. If any Infinite values -are detected in the ROC threshold, these are effectively eliminated. The resulting ROC curve, AUC score, and -thresholds are consequently saved for future reference. - -###### Signs of High Risk - -- A high risk is potentially linked to the model's performance if the AUC score drops below or nears 0.5. -- Another warning sign would be the ROC curve lying closer to the line of randomness, indicating no discriminative -ability. -- For the model to be deemed competent at its classification tasks, it is crucial that the AUC score is -significantly above 0.5. - -###### Strengths - -- The ROC Curve offers an inclusive visual depiction of a model's discriminative power throughout all conceivable -classification thresholds, unlike other metrics that solely disclose model performance at one fixed threshold. -- Despite the proportions of the dataset, the AUC Score, which represents the entire ROC curve as a single data -point, continues to be consistent, proving to be the ideal choice for such situations. - -###### Limitations - -- The primary limitation is that this test is exclusively structured for binary classification tasks, thus limiting -its application towards other model types. -- Furthermore, its performance might be subpar with models that output probabilities highly skewed towards 0 or 1. -- At the extreme, the ROC curve could reflect high performance even when the majority of classifications are -incorrect, provided that the model's ranking format is retained. This phenomenon is commonly termed the "Class -Imbalance Problem". - - - - - - - -##### RegressionErrors - - - - - - -######## RegressionErrors() - -```python -def RegressionErrors(model, dataset) -``` - - -Assesses the performance and error distribution of a regression model using various error metrics. - -###### Purpose - -The purpose of the Regression Errors test is to measure the performance of a regression model by calculating -several error metrics. This evaluation helps determine the model's accuracy and potential issues like overfitting -or bias by analyzing differences in error metrics between the training and testing datasets. - -###### Test Mechanism - -The test computes the following error metrics: - -- **Mean Absolute Error (MAE)****: Average of the absolute differences between true values and predicted values. -- **Mean Squared Error (MSE)**: Average of the squared differences between true values and predicted values. -- **Root Mean Squared Error (RMSE)**: Square root of the mean squared error. -- **Mean Absolute Percentage Error (MAPE)**: Average of the absolute differences between true values and predicted -values, divided by the true values, and expressed as a percentage. -- **Mean Bias Deviation (MBD)**: Average bias between true values and predicted values. - -These metrics are calculated separately for the training and testing datasets and compared to identify -discrepancies. - -###### Signs of High Risk - -- High values for MAE, MSE, RMSE, or MAPE indicating poor model performance. -- Large differences in error metrics between the training and testing datasets, suggesting overfitting. -- Significant deviation of MBD from zero, indicating systematic bias in model predictions. - -###### Strengths - -- Provides a comprehensive overview of model performance through multiple error metrics. -- Individual metrics offer specific insights, e.g., MAE for interpretability, MSE for emphasizing larger errors. -- RMSE is useful for being in the same unit as the target variable. -- MAPE allows the error to be expressed as a percentage. -- MBD detects systematic bias in model predictions. - -###### Limitations - -- MAE and MSE are sensitive to outliers. -- RMSE heavily penalizes larger errors, which might not always be desirable. -- MAPE can be misleading when actual values are near zero. -- MBD may not be suitable if bias varies with the magnitude of actual values. -- These metrics may not capture all nuances of model performance and should be interpreted with domain-specific -context. - - - - - - - -##### RegressionErrorsComparison - - - - - - -######## RegressionErrorsComparison() - -```python -def RegressionErrorsComparison(datasets, models) -``` - - -Assesses multiple regression error metrics to compare model performance across different datasets, emphasizing -systematic overestimation or underestimation and large percentage errors. - -###### Purpose - -The purpose of this test is to compare regression errors for different models applied to various datasets. It aims -to examine model performance using multiple error metrics, thereby identifying areas where models may be -underperforming or exhibiting bias. - -###### Test Mechanism - -The function iterates through each dataset-model pair and calculates various error metrics, including Mean Absolute -Error (MAE), Mean Squared Error (MSE), Mean Absolute Percentage Error (MAPE), and Mean Bias Deviation (MBD). The -results are summarized in a table, which provides a comprehensive view of each model's performance on the datasets. - -###### Signs of High Risk - -- High Mean Absolute Error (MAE) or Mean Squared Error (MSE), indicating poor model performance. -- High Mean Absolute Percentage Error (MAPE), suggesting large percentage errors, especially problematic if the -true values are small. -- Mean Bias Deviation (MBD) significantly different from zero, indicating systematic overestimation or -underestimation by the model. - -###### Strengths - -- Provides multiple error metrics to assess model performance from different perspectives. -- Includes a check to avoid division by zero when calculating MAPE. - -###### Limitations - -- Assumes that the dataset is provided as a DataFrameDataset object with `y`, `y_pred`, and `feature_columns` -attributes. -- Relies on the `logger` from `validmind.logging` to warn about zero values in `y_true`, which should be correctly -implemented and imported. -- Requires that `dataset.y_pred(model)` returns the predicted values for the model. - - - - - - - -##### RegressionPerformance - - - - - - -######## RegressionPerformance() - -```python -def RegressionPerformance(model: VMModel, dataset: VMDataset) -``` - - -Evaluates the performance of a regression model using five different metrics**: MAE, MSE, RMSE, MAPE, and MBD. - -###### Purpose - -The Regression Models Performance Comparison metric is used to measure the performance of regression models. It -calculates multiple evaluation metrics, including Mean Absolute Error (MAE), Mean Squared Error (MSE), -Root Mean Squared Error (RMSE), Mean Absolute Percentage Error (MAPE), and Mean Bias Deviation (MBD), thereby -enabling a comprehensive view of model performance. - -###### Test Mechanism - -The test uses the sklearn library to calculate the MAE, MSE, RMSE, MAPE, and MBD. These calculations encapsulate both -the direction and the magnitude of error in predictions, thereby providing a multi-faceted view of model accuracy. - -###### Signs of High Risk - -- High values of MAE, MSE, RMSE, and MAPE, which indicate a high error rate and imply a larger departure of the -model's predictions from the true values. -- A large value of MBD, which shows a consistent bias in the model’s predictions. - -###### Strengths - -- The metric evaluates models on five different metrics offering a comprehensive analysis of model performance. -- It is designed to handle regression tasks and can be seamlessly integrated with libraries like sklearn. - -###### Limitations - -- The metric only evaluates regression models and does not evaluate classification models. -- The test assumes that the models have been trained and tested appropriately prior to evaluation. It does not -handle pre-processing, feature selection, or other stages in the model lifecycle. - - - - - - - -##### RegressionR2Square - - - - - - -######## RegressionR2Square() - -```python -def RegressionR2Square(dataset, model) -``` - - -Assesses the overall goodness-of-fit of a regression model by evaluating R-squared (R2) and Adjusted R-squared (Adj -R2) scores to determine the model's explanatory power over the dependent variable. - -###### Purpose - -The purpose of the RegressionR2Square Metric test is to measure the overall goodness-of-fit of a regression model. -Specifically, this Python-based test evaluates the R-squared (R2) and Adjusted R-squared (Adj R2) scores, which are -statistical measures used to assess the strength of the relationship between the model's predictors and the -response variable. - -###### Test Mechanism - -The test deploys the `r2_score` method from the Scikit-learn metrics module to measure the R2 score on both -training and test sets. This score reflects the proportion of the variance in the dependent variable that is -predictable from the independent variables. The test also calculates the Adjusted R2 score, which accounts for the -number of predictors in the model to penalize model complexity and reduce overfitting. The Adjusted R2 score will -be smaller if unnecessary predictors are included in the model. - -###### Signs of High Risk - -- Low R2 or Adjusted R2 scores, suggesting that the model does not explain much variation in the dependent variable. -- Significant discrepancy between R2 scores on the training set and test set, indicating overfitting and poor -generalization to unseen data. - -###### Strengths - -- Widely-used measure in regression analysis, providing a sound general indication of model performance. -- Easy to interpret and understand, as it represents the proportion of the dependent variable's variance explained -by the independent variables. -- Adjusted R2 score helps control overfitting by penalizing unnecessary predictors. - -###### Limitations - -- Sensitive to the inclusion of unnecessary predictors even though Adjusted R2 penalizes complexity. -- Less reliable in cases of non-linear relationships or when the underlying assumptions of linear regression are -violated. -- Does not provide insight on whether the correct regression model was used or if key assumptions have been met. - - - - - - - -##### RegressionR2SquareComparison - - - - - - -######## RegressionR2SquareComparison() - -```python -def RegressionR2SquareComparison(datasets, models) -``` - - -Compares R-Squared and Adjusted R-Squared values for different regression models across multiple datasets to assess -model performance and relevance of features. - -###### Purpose - -The Regression R2 Square Comparison test aims to compare the R-Squared and Adjusted R-Squared values for different -regression models across various datasets. It helps in assessing how well each model explains the variability in -the dataset, and whether the models include irrelevant features. - -###### Test Mechanism - -This test operates by: - -- Iterating through each dataset-model pair. -- Calculating the R-Squared values to measure how much of the variability in the dataset is explained by the model. -- Calculating the Adjusted R-Squared values, which adjust the R-Squared based on the number of predictors in the -model, making it more reliable when comparing models with different numbers of features. -- Generating a summary table containing these values for each combination of dataset and model. - -###### Signs of High Risk - -- If the R-Squared values are significantly low, it indicates the model isn't explaining much of the variability in -the dataset. -- A significant difference between R-Squared and Adjusted R-Squared values might indicate that the model includes -irrelevant features. - -###### Strengths - -- Provides a quantitative measure of model performance in terms of variance explained. -- Adjusted R-Squared accounts for the number of predictors, making it a more reliable measure when comparing models -with different numbers of features. -- Useful for time-series forecasting and regression tasks. - -###### Limitations - -- Assumes the dataset is provided as a DataFrameDataset object with `y`, `y_pred`, and `feature_columns` attributes. -- Relies on `adj_r2_score` from the `statsmodels.statsutils` module, which needs to be correctly implemented and -imported. -- Requires that `dataset.y_pred(model)` returns the predicted values for the model. - - - - - - - -##### RobustnessDiagnosis - - - - - - -######## RobustnessDiagnosis() - -```python -def RobustnessDiagnosis(datasets: List, model: VMModel, metric: str = None, scaling_factor_std_dev_list: List = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'}, performance_decay_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}) -``` - - -Assesses the robustness of a machine learning model by evaluating performance decay under noisy conditions. - -###### Purpose - -The Robustness Diagnosis test aims to evaluate the resilience of a machine learning model when subjected to -perturbations or noise in its input data. This is essential for understanding the model's ability to handle -real-world scenarios where data may be imperfect or corrupted. - -###### Test Mechanism - -This test introduces Gaussian noise to the numeric input features of the datasets at varying scales of standard -deviation. The performance of the model is then measured using a specified metric. The process includes: - -- Adding Gaussian noise to numerical input features based on scaling factors. -- Evaluating the model's performance on the perturbed data using metrics like AUC for classification tasks and MSE -for regression tasks. -- Aggregating and plotting the results to visualize performance decay relative to perturbation size. - -###### Signs of High Risk - -- A significant drop in performance metrics with minimal noise. -- Performance decay values exceeding the specified threshold. -- Consistent failure to meet performance standards across multiple perturbation scales. - -###### Strengths - -- Provides insights into the model's robustness against noisy or corrupted data. -- Utilizes a variety of performance metrics suitable for both classification and regression tasks. -- Visualization helps in understanding the extent of performance degradation. - -###### Limitations - -- Gaussian noise might not adequately represent all types of real-world data perturbations. -- Performance thresholds are somewhat arbitrary and might need tuning. -- The test may not account for more complex or unstructured noise patterns that could affect model robustness. - - - - - - - -##### SHAPGlobalImportance - - - - - - -######## SHAPGlobalImportance() - -```python -def SHAPGlobalImportance(model: VMModel, dataset: VMDataset, kernel_explainer_samples: int = 10, tree_or_linear_explainer_samples: int = 200, class_of_interest: int = None) -``` - - -Evaluates and visualizes global feature importance using SHAP values for model explanation and risk identification. - -###### Purpose - -The SHAP (SHapley Additive exPlanations) Global Importance metric aims to elucidate model outcomes by attributing -them to the contributing features. It assigns a quantifiable global importance to each feature via their respective -absolute Shapley values, thereby making it suitable for tasks like classification (both binary and multiclass). -This metric forms an essential part of model risk management. - -###### Test Mechanism - -The exam begins with the selection of a suitable explainer which aligns with the model's type. For tree-based -models like XGBClassifier, RandomForestClassifier, CatBoostClassifier, TreeExplainer is used whereas for linear -models like LogisticRegression, XGBRegressor, LinearRegression, it is the LinearExplainer. Once the explainer -calculates the Shapley values, these values are visualized using two specific graphical representations: - -1. Mean Importance Plot**: This graph portrays the significance of individual features based on their absolute -Shapley values. It calculates the average of these absolute Shapley values across all instances to highlight the -global importance of features. - -2. Summary Plot: This visual tool combines the feature importance with their effects. Every dot on this chart -represents a Shapley value for a certain feature in a specific case. The vertical axis is denoted by the feature -whereas the horizontal one corresponds to the Shapley value. A color gradient indicates the value of the feature, -gradually changing from low to high. Features are systematically organized in accordance with their importance. - -###### Signs of High Risk - -- Overemphasis on certain features in SHAP importance plots, thus hinting at the possibility of model overfitting -- Anomalies such as unexpected or illogical features showing high importance, which might suggest that the model's -decisions are rooted in incorrect or undesirable reasoning -- A SHAP summary plot filled with high variability or scattered data points, indicating a cause for concern - -###### Strengths - -- SHAP does more than just illustrating global feature significance, it offers a detailed perspective on how -different features shape the model's decision-making logic for each instance. -- It provides clear insights into model behavior. - -###### Limitations - -- High-dimensional data can convolute interpretations. -- Associating importance with tangible real-world impact still involves a certain degree of subjectivity. - - - - -######## generate_shap_plot() - -```python -def generate_shap_plot(type_, shap_values, x_test) -``` - - -Plots two types of SHAP global importance (SHAP). - -**Arguments** - -- **type_****: The type of SHAP plot to generate. Must be "mean" or "summary". -- **shap_values**: The SHAP values to plot. -- **x_test**: The test data used to generate the SHAP values. - -**Returns** - -- The generated plot. - - - - -######## select_shap_values() - -```python -def select_shap_values(shap_values, class_of_interest) -``` - - -Selects SHAP values for binary or multiclass classification. - -For regression models, returns the SHAP values directly as there are no classes. - -**Arguments** - -- **shap_values****: The SHAP values returned by the SHAP explainer. For multiclass classification, this will be a list where each element corresponds to a class. For regression, this will be a single array of SHAP values. -- **class_of_interest**: The class index for which to retrieve SHAP values. If None (default), the function will assume binary classification and use class 1 by default. - -**Returns** - -- The SHAP values for the specified class (classification) or for the regression -- output. - -**Raises** - -- **ValueError**: If class_of_interest is specified and is out of bounds for the number of classes. - - - - - - - -##### ScoreProbabilityAlignment - - - - - - -######## ScoreProbabilityAlignment() - -```python -def ScoreProbabilityAlignment(model: VMModel, dataset: VMDataset, score_column: str = 'score', n_bins: int = 10) -``` - - -Analyzes the alignment between credit scores and predicted probabilities. - -###### Purpose - -The Score-Probability Alignment test evaluates how well credit scores align with -predicted default probabilities. This helps validate score scaling, identify potential -calibration issues, and ensure scores reflect risk appropriately. - -###### Test Mechanism - -The test: -1. Groups scores into bins -2. Calculates average predicted probability per bin -3. Tests monotonicity of relationship -4. Analyzes probability distribution within score bands - -###### Signs of High Risk - -- Non-monotonic relationship between scores and probabilities -- Large probability variations within score bands -- Unexpected probability jumps between adjacent bands -- Poor alignment with expected odds-to-score relationship -- Inconsistent probability patterns across score ranges -- Clustering of probabilities at extreme values -- Score bands with similar probability profiles -- Unstable probability estimates in key decision bands - -###### Strengths - -- Direct validation of score-to-probability relationship -- Identifies potential calibration issues -- Supports score band validation -- Helps understand model behavior -- Useful for policy setting -- Visual and numerical results -- Easy to interpret -- Supports regulatory documentation - -###### Limitations - -- Sensitive to bin selection -- Requires sufficient data per bin -- May mask within-bin variations -- Point-in-time analysis only -- Cannot detect all forms of miscalibration -- Assumes scores should align with probabilities -- May oversimplify complex relationships -- Limited to binary outcomes - - - - - - - -##### SilhouettePlot - - - - - - -######## SilhouettePlot() - -```python -def SilhouettePlot(model: VMModel, dataset: VMDataset) -``` - - -Calculates and visualizes Silhouette Score, assessing the degree of data point suitability to its cluster in ML -models. - -###### Purpose - -This test calculates the Silhouette Score, which is a model performance metric used in clustering applications. -Primarily, the Silhouette Score evaluates how similar a data point is to its own cluster compared to other -clusters. The metric ranges between -1 and 1, where a high value indicates that the object is well matched to its -own cluster and poorly matched to neighboring clusters. Thus, the goal is to achieve a high Silhouette Score, -implying well-separated clusters. - -###### Test Mechanism - -The test first extracts the true and predicted labels from the model's training data. The test runs the Silhouette -Score function, which takes as input the training dataset features and the predicted labels, subsequently -calculating the average score. This average Silhouette Score is printed for reference. The script then calculates -the silhouette coefficients for each data point, helping to form the Silhouette Plot. Each cluster is represented -in this plot, with color distinguishing between different clusters. A red dashed line indicates the average -Silhouette Score. The Silhouette Scores are also collected into a structured table, facilitating model performance -analysis and comparison. - -###### Signs of High Risk - -- A low Silhouette Score, potentially indicating that the clusters are not well separated and that data points may -not be fitting well to their respective clusters. -- A Silhouette Plot displaying overlapping clusters or the absence of clear distinctions between clusters visually -also suggests poor clustering performance. - -###### Strengths - -- The Silhouette Score provides a clear and quantitative measure of how well data points have been grouped into -clusters, offering insights into model performance. -- The Silhouette Plot provides an intuitive, graphical representation of the clustering mechanism, aiding visual -assessments of model performance. -- It does not require ground truth labels, so it's useful when true cluster assignments are not known. - -###### Limitations - -- The Silhouette Score may be susceptible to the influence of outliers, which could impact its accuracy and -reliability. -- It assumes the clusters are convex and isotropic, which might not be the case with complex datasets. -- Due to the average nature of the Silhouette Score, the metric does not account for individual data point -assignment nuances, so potentially relevant details may be omitted. -- Computationally expensive for large datasets, as it requires pairwise distance computations. - - - - - - - -##### TrainingTestDegradation - - - - - - -######## TrainingTestDegradation() - -```python -def TrainingTestDegradation(datasets: List, model: VMModel, max_threshold: float = 0.1) -``` - - -Tests if model performance degradation between training and test datasets exceeds a predefined threshold. - -###### Purpose - -The `TrainingTestDegradation` class serves as a test to verify that the degradation in performance between the -training and test datasets does not exceed a predefined threshold. This test measures the model's ability to -generalize from its training data to unseen test data, assessing key classification metrics such as accuracy, -precision, recall, and f1 score to verify the model's robustness and reliability. - -###### Test Mechanism - -The code applies several predefined metrics, including accuracy, precision, recall, and f1 scores, to the model's -predictions for both the training and test datasets. It calculates the degradation as the difference between the -training score and test score divided by the training score. The test is considered successful if the degradation -for each metric is less than the preset maximum threshold of 10%. The results are summarized in a table showing -each metric's train score, test score, degradation percentage, and pass/fail status. - -###### Signs of High Risk - -- A degradation percentage that exceeds the maximum allowed threshold of 10% for any of the evaluated metrics. -- A high difference or gap between the metric scores on the training and the test datasets. -- The 'Pass/Fail' column displaying 'Fail' for any of the evaluated metrics. - -###### Strengths - -- Provides a quantitative measure of the model's ability to generalize to unseen data, which is key for predicting -its practical real-world performance. -- By evaluating multiple metrics, it takes into account different facets of model performance and enables a more -holistic evaluation. -- The use of a variable predefined threshold allows the flexibility to adjust the acceptability criteria for -different scenarios. - -###### Limitations - -- The test compares raw performance on training and test data but does not factor in the nature of the data. Areas -with less representation in the training set might still perform poorly on unseen data. -- It requires good coverage and balance in the test and training datasets to produce reliable results, which may -not always be available. -- The test is currently only designed for classification tasks. - - - - - - - -##### VMeasure - - - - - - -######## VMeasure() - -```python -def VMeasure(dataset: VMDataset, model: VMModel) -``` - - -Evaluates homogeneity and completeness of a clustering model using the V Measure Score. - -###### Purpose - -The purpose of this metric, V Measure Score (V Score), is to evaluate the performance of a clustering model. It -measures the homogeneity and completeness of a set of cluster labels, where homogeneity refers to each cluster -containing only members of a single class and completeness meaning all members of a given class are assigned to the -same cluster. - -###### Test Mechanism - -ClusterVMeasure is a class that inherits from another class, ClusterPerformance. It uses the `v_measure_score` -function from the sklearn module's metrics package. The required inputs to perform this metric are the model, train -dataset, and test dataset. The test is appropriate for models tasked with clustering. - -###### Signs of High Risk - -- Low V Measure Score**: A low V Measure Score indicates that the clustering model has poor homogeneity or -completeness, or both. This might signal that the model is failing to correctly cluster the data. - -###### Strengths - -- The V Measure Score is a harmonic mean between homogeneity and completeness. This ensures that both attributes -are taken into account when evaluating the model, providing an overall measure of its cluster validity. -- The metric does not require knowledge of the ground truth classes when measuring homogeneity and completeness, -making it applicable in instances where such information is unavailable. - -###### Limitations - -- The V Measure Score can be influenced by the number of clusters, which means that it might not always reflect the -quality of the clustering. Partitioning the data into many small clusters could lead to high homogeneity but low -completeness, leading to a low V Measure Score even if the clustering might be useful. -- It assumes equal importance of homogeneity and completeness. In some applications, one may be more important than -the other. The V Measure Score does not provide flexibility in assigning different weights to homogeneity and -completeness. - - - - - - - -##### WeakspotsDiagnosis - - - - - - -######## WeakspotsDiagnosis() - -```python -def WeakspotsDiagnosis(datasets: List, model: VMModel, features_columns: Union = None, metrics: Union = None, thresholds: Union = None) -``` - - -Identifies and visualizes weak spots in a machine learning model's performance across various sections of the -feature space. - -###### Purpose - -The weak spots test is applied to evaluate the performance of a machine learning model within specific regions of -its feature space. This test slices the feature space into various sections, evaluating the model's outputs within -each section against specific performance metrics (e.g., accuracy, precision, recall, and F1 scores). The ultimate -aim is to identify areas where the model's performance falls below the set thresholds, thereby exposing its -possible weaknesses and limitations. - -###### Test Mechanism - -The test mechanism adopts an approach of dividing the feature space of the training dataset into numerous bins. The -model's performance metrics (accuracy, precision, recall, F1 scores) are then computed for each bin on both the -training and test datasets. A "weak spot" is identified if any of the performance metrics fall below a -predetermined threshold for a particular bin on the test dataset. The test results are visually plotted as bar -charts for each performance metric, indicating the bins which fail to meet the established threshold. - -###### Signs of High Risk - -- Any performance metric of the model dropping below the set thresholds. -- Significant disparity in performance between the training and test datasets within a bin could be an indication -of overfitting. -- Regions or slices with consistently low performance metrics. Such instances could mean that the model struggles -to handle specific types of input data adequately, resulting in potentially inaccurate predictions. - -###### Strengths - -- The test helps pinpoint precise regions of the feature space where the model's performance is below par, allowing -for more targeted improvements to the model. -- The graphical presentation of the performance metrics offers an intuitive way to understand the model's -performance across different feature areas. -- The test exhibits flexibility, letting users set different thresholds for various performance metrics according -to the specific requirements of the application. - -###### Limitations - -- The binning system utilized for the feature space in the test could over-simplify the model's behavior within -each bin. The granularity of this slicing depends on the chosen 'bins' parameter and can sometimes be arbitrary. -- The effectiveness of this test largely hinges on the selection of thresholds for the performance metrics, which -may not hold universally applicable and could be subjected to the specifications of a particular model and -application. -- The test is unable to handle datasets with a text column, limiting its application to numerical or categorical -data types only. -- Despite its usefulness in highlighting problematic regions, the test does not offer direct suggestions for model -improvement. - - - - - - - - - - - -#### statsmodels - - - - - -##### AutoARIMA - - - - - - -######## AutoARIMA() - -```python -def AutoARIMA(model: VMModel, dataset: VMDataset) -``` - - -Evaluates ARIMA models for time-series forecasting, ranking them using Bayesian and Akaike Information Criteria. - -###### Purpose - -The AutoARIMA validation test is designed to evaluate and rank AutoRegressive Integrated Moving Average (ARIMA) -models. These models are primarily used for forecasting time-series data. The validation test automatically fits -multiple ARIMA models, with varying parameters, to every variable within the given dataset. The models are then -ranked based on their Bayesian Information Criterion (BIC) and Akaike Information Criterion (AIC) values, which -provide a basis for the efficient model selection process. - -###### Test Mechanism - -This metric proceeds by generating an array of feasible combinations of ARIMA model parameters which are within a -prescribed limit. These limits include `max_p`, `max_d`, `max_q`; they represent the autoregressive, differencing, -and moving average components respectively. Upon applying these sets of parameters, the validation test fits each -ARIMA model to the time-series data provided. For each model, it subsequently proceeds to calculate and record both -the BIC and AIC values, which serve as performance indicators for the model fit. Prior to this parameter fitting -process, the Augmented Dickey-Fuller test for data stationarity is conducted on the data series. If a series is -found to be non-stationary, a warning message is sent out, given that ARIMA models necessitate input series to be -stationary. - -###### Signs of High Risk - -- If the p-value of the Augmented Dickey-Fuller test for a variable exceeds 0.05, a warning is logged. This warning -indicates that the series might not be stationary, leading to potentially inaccurate results. -- Consistent failure in fitting ARIMA models (as made evident through logged errors) might disclose issues with -either the data or model stability. - -###### Strengths - -- The AutoARIMA validation test simplifies the often complex task of selecting the most suitable ARIMA model based -on BIC and AIC criteria. -- The mechanism incorporates a check for non-stationarity within the data, which is a critical prerequisite for -ARIMA models. -- The exhaustive search through all possible combinations of model parameters enhances the likelihood of -identifying the best-fit model. - -###### Limitations - -- This validation test can be computationally costly as it involves creating and fitting multiple ARIMA models for -every variable. -- Although the test checks for non-stationarity and logs warnings where present, it does not apply any -transformations to the data to establish stationarity. -- The selection of models leans solely on BIC and AIC criteria, which may not yield the best predictive model in -all scenarios. -- The test is only applicable to regression tasks involving time-series data, and may not work effectively for -other types of machine learning tasks. - - - - - - - -##### CumulativePredictionProbabilities - - - - - - -######## CumulativePredictionProbabilities() - -```python -def CumulativePredictionProbabilities(dataset, model, title = 'Cumulative Probabilities') -``` - - -Visualizes cumulative probabilities of positive and negative classes for both training and testing in classification models. - -###### Purpose - -This metric is utilized to evaluate the distribution of predicted probabilities for positive and negative classes -in a classification model. It provides a visual assessment of the model's behavior by plotting the cumulative -probabilities for positive and negative classes across both the training and test datasets. - -###### Test Mechanism - -The classification model is evaluated by first computing the predicted probabilities for each instance in both -the training and test datasets, which are then added as a new column in these sets. The cumulative probabilities -for positive and negative classes are subsequently calculated and sorted in ascending order. Cumulative -distributions of these probabilities are created for both positive and negative classes across both training and -test datasets. These cumulative probabilities are represented visually in a plot, containing two subplots - one for -the training data and the other for the test data, with lines representing cumulative distributions of positive and -negative classes. - -###### Signs of High Risk - -- Imbalanced distribution of probabilities for either positive or negative classes. -- Notable discrepancies or significant differences between the cumulative probability distributions for the -training data versus the test data. -- Marked discrepancies or large differences between the cumulative probability distributions for positive and -negative classes. - -###### Strengths - -- Provides a visual illustration of data, which enhances the ease of understanding and interpreting the model's -behavior. -- Allows for the comparison of model's behavior across training and testing datasets, providing insights about how -well the model is generalized. -- Differentiates between positive and negative classes and their respective distribution patterns, aiding in -problem diagnosis. - -###### Limitations - -- Exclusive to classification tasks and specifically to classification models. -- Graphical results necessitate human interpretation and may not be directly applicable for automated risk -detection. -- The method does not give a solitary quantifiable measure of model risk, instead, it offers a visual -representation and broad distributional information. -- If the training and test datasets are not representative of the overall data distribution, the metric could -provide misleading results. - - - - - - - -##### DurbinWatsonTest - - - - - - -######## DurbinWatsonTest() - -```python -def DurbinWatsonTest(dataset, model, threshold = {'cls': 'ExprList', 'elements': ['1.5', '2.5']}) -``` - - -Assesses autocorrelation in time series data features using the Durbin-Watson statistic. - -###### Purpose - -The Durbin-Watson Test metric detects autocorrelation in time series data (where a set of data values influences -their predecessors). Autocorrelation is a crucial factor for regression tasks as these often assume the -independence of residuals. A model with significant autocorrelation may give unreliable predictions. - -###### Test Mechanism - -Utilizing the `durbin_watson` function in the `statsmodels` Python library, the Durbin-Watson (DW) Test metric -generates a statistical value for each feature of the training dataset. The function is looped over all columns of -the dataset, calculating and caching the DW value for each column for further analysis. A DW metric value nearing 2 -indicates no autocorrelation. Conversely, values approaching 0 suggest positive autocorrelation, and those leaning -towards 4 imply negative autocorrelation. - -###### Signs of High Risk - -- If a feature's DW value significantly deviates from 2, it could signal a high risk due to potential -autocorrelation issues in the dataset. -- A value closer to 0 could imply positive autocorrelation, while a value nearer to 4 could point to negative -autocorrelation, both leading to potentially unreliable prediction models. - -###### Strengths - -- The metric specializes in identifying autocorrelation in prediction model residuals. -- Autocorrelation detection assists in diagnosing violation of various modeling technique assumptions, particularly -in regression analysis and time-series data modeling. - -###### Limitations - -- The Durbin-Watson Test mainly detects linear autocorrelation and could overlook other types of relationships. -- The metric is highly sensitive to data points order. Shuffling the order could lead to notably different results. -- The test only checks for first-order autocorrelation (between a variable and its immediate predecessor) and fails -to detect higher-order autocorrelation. - - - - - - - -##### GINITable - - - - - - -######## GINITable() - -```python -def GINITable(dataset, model) -``` - - -Evaluates classification model performance using AUC, GINI, and KS metrics for training and test datasets. - -###### Purpose - -The 'GINITable' metric is designed to evaluate the performance of a classification model by emphasizing its -discriminatory power. Specifically, it calculates and presents three important metrics - the Area under the ROC -Curve (AUC), the GINI coefficient, and the Kolmogorov-Smirnov (KS) statistic - for both training and test datasets. - -###### Test Mechanism - -Using a dictionary for storing performance metrics for both the training and test datasets, the 'GINITable' metric -calculates each of these metrics sequentially. The Area under the ROC Curve (AUC) is calculated via the -`roc_auc_score` function from the Scikit-Learn library. The GINI coefficient, a measure of statistical dispersion, -is then computed by doubling the AUC and subtracting 1. Finally, the Kolmogorov-Smirnov (KS) statistic is -calculated via the `roc_curve` function from Scikit-Learn, with the False Positive Rate (FPR) subtracted from the -True Positive Rate (TPR) and the maximum value taken from the resulting data. These metrics are then stored in a -pandas DataFrame for convenient visualization. - -###### Signs of High Risk - -- Low values for performance metrics may suggest a reduction in model performance, particularly a low AUC which -indicates poor classification performance, or a low GINI coefficient, which could suggest a decreased ability to -discriminate different classes. -- A high KS value may be an indicator of potential overfitting, as this generally signifies a substantial -divergence between positive and negative distributions. -- Significant discrepancies between the performance on the training dataset and the test dataset may present -another signal of high risk. - -###### Strengths - -- Offers three key performance metrics (AUC, GINI, and KS) in one test, providing a more comprehensive evaluation -of the model. -- Provides a direct comparison between the model's performance on training and testing datasets, which aids in -identifying potential underfitting or overfitting. -- The applied metrics are class-distribution invariant, thereby remaining effective for evaluating model -performance even when dealing with imbalanced datasets. -- Presents the metrics in a user-friendly table format for easy comprehension and analysis. - -###### Limitations - -- The GINI coefficient and KS statistic are both dependent on the AUC value. Therefore, any errors in the -calculation of the latter will adversely impact the former metrics too. -- Mainly suited for binary classification models and may require modifications for effective application in -multi-class scenarios. -- The metrics used are threshold-dependent and may exhibit high variability based on the chosen cut-off points. -- The test does not incorporate a method to efficiently handle missing or inefficiently processed data, which could -lead to inaccuracies in the metrics if the data is not appropriately preprocessed. - - - - - - - -##### KolmogorovSmirnov - - - - - - -######## KolmogorovSmirnov() - -```python -def KolmogorovSmirnov(model: VMModel, dataset: VMDataset, dist: str = 'norm') -``` - - -Assesses whether each feature in the dataset aligns with a normal distribution using the Kolmogorov-Smirnov test. - -###### Purpose - -The Kolmogorov-Smirnov (KS) test evaluates the distribution of features in a dataset to determine their alignment -with a normal distribution. This is important because many statistical methods and machine learning models assume -normality in the data distribution. - -###### Test Mechanism - -This test calculates the KS statistic and corresponding p-value for each feature in the dataset. It does so by -comparing the cumulative distribution function of the feature with an ideal normal distribution. The KS statistic -and p-value for each feature are then stored in a dictionary. The p-value threshold to reject the normal -distribution hypothesis is not preset, providing flexibility for different applications. - -###### Signs of High Risk - -- Elevated KS statistic for a feature combined with a low p-value, indicating a significant divergence from a -normal distribution. -- Features with notable deviations that could create problems if the model assumes normality in data distribution. - -###### Strengths - -- The KS test is sensitive to differences in the location and shape of empirical cumulative distribution functions. -- It is non-parametric and adaptable to various datasets, as it does not assume any specific data distribution. -- Provides detailed insights into the distribution of individual features. - -###### Limitations - -- The test's sensitivity to disparities in the tails of data distribution might cause false alarms about -non-normality. -- Less effective for multivariate distributions, as it is designed for univariate distributions. -- Does not identify specific types of non-normality, such as skewness or kurtosis, which could impact model fitting. - - - - - - - -##### Lilliefors - - - - - - -######## Lilliefors() - -```python -def Lilliefors(dataset: VMDataset) -``` - - -Assesses the normality of feature distributions in an ML model's training dataset using the Lilliefors test. - -###### Purpose - -The purpose of this metric is to utilize the Lilliefors test, named in honor of the Swedish statistician Hubert -Lilliefors, in order to assess whether the features of the machine learning model's training dataset conform to a -normal distribution. This is done because the assumption of normal distribution plays a vital role in numerous -statistical procedures as well as numerous machine learning models. Should the features fail to follow a normal -distribution, some model types may not operate at optimal efficiency. This can potentially lead to inaccurate -predictions. - -###### Test Mechanism - -The application of this test happens across all feature columns within the training dataset. For each feature, the -Lilliefors test returns a test statistic and p-value. The test statistic quantifies how far the feature's -distribution is from an ideal normal distribution, whereas the p-value aids in determining the statistical -relevance of this deviation. The final results are stored within a dictionary, the keys of which correspond to the -name of the feature column, and the values being another dictionary which houses the test statistic and p-value. - -###### Signs of High Risk - -- If the p-value corresponding to a specific feature sinks below a pre-established significance level, generally -set at 0.05, then it can be deduced that the distribution of that feature significantly deviates from a normal -distribution. This can present a high risk for models that assume normality, as these models may perform -inaccurately or inefficiently in the presence of such a feature. - -###### Strengths - -- One advantage of the Lilliefors test is its utility irrespective of whether the mean and variance of the normal -distribution are known in advance. This makes it a more robust option in real-world situations where these values -might not be known. -- The test has the ability to screen every feature column, offering a holistic view of the dataset. - -###### Limitations - -- Despite the practical applications of the Lilliefors test in validating normality, it does come with some -limitations. -- It is only capable of testing unidimensional data, thus rendering it ineffective for datasets with interactions -between features or multi-dimensional phenomena. -- The test might not be as sensitive as some other tests (like the Anderson-Darling test) in detecting deviations -from a normal distribution. -- Like any other statistical test, Lilliefors test may also produce false positives or negatives. Hence, banking -solely on this test, without considering other characteristics of the data, may give rise to risks. - - - - - - - -##### PredictionProbabilitiesHistogram - - - - - - -######## PredictionProbabilitiesHistogram() - -```python -def PredictionProbabilitiesHistogram(dataset, model, title = 'Histogram of Predictive Probabilities') -``` - - -Assesses the predictive probability distribution for binary classification to evaluate model performance and -potential overfitting or bias. - -###### Purpose - -The Prediction Probabilities Histogram test is designed to generate histograms displaying the Probability of -Default (PD) predictions for both positive and negative classes in training and testing datasets. This helps in -evaluating the performance of a classification model. - -###### Test Mechanism - -The metric follows these steps to execute the test: - -- Extracts the target column from both the train and test datasets. -- Uses the model's predict function to calculate probabilities. -- Adds these probabilities as a new column to the training and testing dataframes. -- Generates histograms for each class (0 or 1) within the training and testing datasets. -- Sets different opacities for the histograms to enhance visualization. -- Overlays the four histograms (two for training and two for testing) on two different subplot frames. -- Returns a plotly graph object displaying the visualization. - -###### Signs of High Risk - -- Significant discrepancies between the histograms of training and testing data. -- Large disparities between the histograms for the positive and negative classes. -- Potential overfitting or bias indicated by significant issues. -- Unevenly distributed probabilities suggesting inaccurate model predictions. - -###### Strengths - -- Offers a visual representation of the PD predictions made by the model, aiding in understanding its behavior. -- Assesses both the training and testing datasets, adding depth to model validation. -- Highlights disparities between classes, providing insights into class imbalance or data skewness. -- Effectively visualizes risk spread, which is particularly beneficial for credit risk prediction. - -###### Limitations - -- Specifically tailored for binary classification scenarios and not suited for multi-class classification tasks. -- Provides a robust visual representation but lacks a quantifiable measure to assess model performance. - - - - - - - -##### RegressionCoeffs - - - - - - -######## RegressionCoeffs() - -```python -def RegressionCoeffs(model) -``` - - -Assesses the significance and uncertainty of predictor variables in a regression model through visualization of -coefficients and their 95% confidence intervals. - -###### Purpose - -The `RegressionCoeffs` metric visualizes the estimated regression coefficients alongside their 95% confidence intervals, -providing insights into the impact and significance of predictor variables on the response variable. This visualization -helps to understand the variability and uncertainty in the model's estimates, aiding in the evaluation of the -significance of each predictor. - -###### Test Mechanism - -The function operates by extracting the estimated coefficients and their standard errors from the regression model. -Using these, it calculates the confidence intervals at a 95% confidence level, which indicates the range within which -the true coefficient value is expected to fall 95% of the time. The confidence intervals are computed using the -Z-value associated with the 95% confidence level. The coefficients and their confidence intervals are then visualized -in a bar plot. The x-axis represents the predictor variables, the y-axis represents the estimated coefficients, and -the error bars depict the confidence intervals. - -###### Signs of High Risk - -- The confidence interval for a coefficient contains the zero value, suggesting that the predictor may not significantly -contribute to the model. -- Multiple coefficients with confidence intervals that include zero, potentially indicating issues with model reliability. -- Very wide confidence intervals, which may suggest high uncertainty in the coefficient estimates and potential model -instability. - -###### Strengths - -- Provides a clear visualization that allows for easy interpretation of the significance and impact of predictor -variables. -- Includes confidence intervals, which provide additional information about the uncertainty surrounding each coefficient -estimate. - -###### Limitations - -- The method assumes normality of residuals and independence of observations, assumptions that may not always hold true -in practice. -- It does not address issues related to multi-collinearity among predictor variables, which can affect the interpretation -of coefficients. -- This metric is limited to regression tasks using tabular data and is not applicable to other types of machine learning -tasks or data structures. - - - - - - - -##### RegressionFeatureSignificance - - - - - - -######## RegressionFeatureSignificance() - -```python -def RegressionFeatureSignificance(model: VMModel, fontsize: int = 10, p_threshold: float = 0.05) -``` - - -Assesses and visualizes the statistical significance of features in a regression model. - -###### Purpose - -The Regression Feature Significance metric assesses the significance of each feature in a given set of regression -model. It creates a visualization displaying p-values for every feature of the model, assisting model developers -in understanding which features are most influential in their model. - -###### Test Mechanism - -The test mechanism involves extracting the model's coefficients and p-values for each feature, and then plotting these -values. The x-axis on the plot contains the p-values while the y-axis denotes the coefficients of each feature. A -vertical red line is drawn at the threshold for p-value significance, which is 0.05 by default. Any features with -p-values to the left of this line are considered statistically significant at the chosen level. - -###### Signs of High Risk - -- Any feature with a high p-value (greater than the threshold) is considered a potential high risk, as it suggests -the feature is not statistically significant and may not be reliably contributing to the model's predictions. -- A high number of such features may indicate problems with the model validation, variable selection, and overall -reliability of the model predictions. - -###### Strengths - -- Helps identify the features that significantly contribute to a model's prediction, providing insights into the -feature importance. -- Provides tangible, easy-to-understand visualizations to interpret the feature significance. - -###### Limitations - -- This metric assumes model features are independent, which may not always be the case. Multicollinearity (high -correlation amongst predictors) can cause high variance and unreliable statistical tests of significance. -- The p-value strategy for feature selection doesn't take into account the magnitude of the effect, focusing solely -on whether the feature is likely non-zero. -- This test is specific to regression models and wouldn't be suitable for other types of ML models. -- P-value thresholds are somewhat arbitrary and do not always indicate practical significance, only statistical -significance. - - - - - - - -##### RegressionModelForecastPlot - - - - - - -######## RegressionModelForecastPlot() - -```python -def RegressionModelForecastPlot(model: VMModel, dataset: VMDataset, start_date: Union = None, end_date: Union = None) -``` - - -Generates plots to visually compare the forecasted outcomes of a regression model against actual observed values over -a specified date range. - -###### Purpose - -This metric is useful for time-series models or any model where the outcome changes over time, allowing direct -comparison of predicted vs actual values. It can help identify overfitting or underfitting situations as well as -general model performance. - -###### Test Mechanism - -This test generates a plot with the x-axis representing the date ranging from the specified "start_date" to the -"end_date", while the y-axis shows the value of the outcome variable. Two lines are plotted**: one representing the -forecasted values and the other representing the observed values. The "start_date" and "end_date" can be parameters -of this test; if these parameters are not provided, they are set to the minimum and maximum date available in the -dataset. - -###### Signs of High Risk - -- High risk or failure signs could be deduced visually from the plots if the forecasted line significantly deviates -from the observed line, indicating the model's predicted values are not matching actual outcomes. -- A model that struggles to handle the edge conditions like maximum and minimum data points could also be -considered a sign of risk. - -###### Strengths - -- Visualization: The plot provides an intuitive and clear illustration of how well the forecast matches the actual -values, making it straightforward even for non-technical stakeholders to interpret. -- Flexibility: It allows comparison for multiple models and for specified time periods. -- Model Evaluation: It can be useful in identifying overfitting or underfitting situations, as these will manifest -as discrepancies between the forecasted and observed values. - -###### Limitations - -- Interpretation Bias: Interpretation of the plot is subjective and can lead to different conclusions by different -evaluators. -- Lack of Precision: Visual representation might not provide precise values of the deviation. -- Inapplicability: Limited to cases where the order of data points (time-series) matters, it might not be of much -use in problems that are not related to time series prediction. - - - - - - - -##### RegressionModelForecastPlotLevels - - - - - - -######## RegressionModelForecastPlotLevels() - -```python -def RegressionModelForecastPlotLevels(model: VMModel, dataset: VMDataset) -``` - - -Assesses the alignment between forecasted and observed values in regression models through visual plots - -###### Purpose - -This test aims to visually assess the performance of a regression model by comparing its forecasted values against -the actual observed values for both the raw and transformed (integrated) data. This helps determine the accuracy -of the model and can help identify overfitting or underfitting. The integration is applied to highlight the trend -rather than the absolute level. - -###### Test Mechanism - -This test generates two plots: - -- Raw data vs forecast -- Transformed data vs forecast - -The transformed data is created by performing a cumulative sum on the raw data. - -###### Signs of High Risk - -- Significant deviation between forecasted and observed values. -- Patterns suggesting overfitting or underfitting. -- Large discrepancies in the plotted forecasts, indicating potential issues with model generalizability and -precision. - -###### Strengths - -- Provides an intuitive, visual way to assess multiple regression models, aiding in easier interpretation and -evaluation of forecast accuracy. - -###### Limitations - -- Relies heavily on visual interpretation, which may vary between individuals. -- Does not provide a numerical metric to quantify forecast accuracy, relying solely on visual assessment. - - - - -######## integrate_diff() - -```python -def integrate_diff(series_diff, start_value) -``` - - - - - - - - -##### RegressionModelSensitivityPlot - - - - - - -######## RegressionModelSensitivityPlot() - -```python -def RegressionModelSensitivityPlot(dataset: VMDataset, model: VMModel, shocks: List = {'cls': 'ExprList', 'elements': ['0.1']}, transformation: Union = None) -``` - - -Assesses the sensitivity of a regression model to changes in independent variables by applying shocks and -visualizing the impact. - -###### Purpose - -The Regression Sensitivity Plot test is designed to perform sensitivity analysis on regression models. This test -aims to measure the impact of slight changes (shocks) applied to individual variables on the system's outcome while -keeping all other variables constant. By doing so, it analyzes the effects of each independent variable on the -dependent variable within the regression model, helping identify significant risk factors that could substantially -influence the model's output. - -###### Test Mechanism - -This test operates by initially applying shocks of varying magnitudes, defined by specific parameters, to each of -the model's features, one at a time. With all other variables held constant, a new prediction is made for each -dataset subjected to shocks. Any changes in the model's predictions are directly attributed to the shocks applied. -If the transformation parameter is set to "integrate," initial predictions and target values undergo transformation -via an integration function before being plotted. Finally, a plot demonstrating observed values against predicted -values for each model is generated, showcasing a distinct line graph illustrating predictions for each shock. - -###### Signs of High Risk - -- Drastic alterations in model predictions due to minor shocks to an individual variable, indicating high -sensitivity and potential over-dependence on that variable. -- Unusually high or unpredictable shifts in response to shocks, suggesting potential model instability or -overfitting. - -###### Strengths - -- Helps identify variables that strongly influence model outcomes, aiding in understanding feature importance. -- Generates visual plots, making results easily interpretable even to non-technical stakeholders. -- Useful in identifying overfitting and detecting unstable models that react excessively to minor variable changes. - -###### Limitations - -- Operates on the assumption that all other variables remain unchanged during the application of a shock, which may -not reflect real-world interdependencies. -- Best compatible with linear models and may not effectively evaluate the sensitivity of non-linear models. -- Provides a visual representation without a numerical risk measure, potentially introducing subjectivity in -interpretation. - - - - -######## integrate_diff() - -```python -def integrate_diff(series_diff, start_value) -``` - - - - - - - - -##### RegressionModelSummary - - - - - - -######## RegressionModelSummary() - -```python -def RegressionModelSummary(dataset: VMDataset, model: VMModel) -``` - - -Evaluates regression model performance using metrics including R-Squared, Adjusted R-Squared, MSE, and RMSE. - -###### Purpose - -The Regression Model Summary test evaluates the performance of regression models by measuring their predictive -ability regarding dependent variables given changes in the independent variables. It uses conventional regression -metrics such as R-Squared, Adjusted R-Squared, Mean Squared Error (MSE), and Root Mean Squared Error (RMSE) to -assess the model's accuracy and fit. - -###### Test Mechanism - -This test uses the sklearn library to calculate the R-Squared, Adjusted R-Squared, MSE, and RMSE. It outputs a -table with the results of these metrics along with the feature columns used by the model. - -###### Signs of High Risk - -- Low R-Squared and Adjusted R-Squared values. -- High MSE and RMSE values. - -###### Strengths - -- Offers an extensive evaluation of regression models by combining four key measures of model accuracy and fit. -- Provides a comprehensive view of the model's performance. -- Both the R-Squared and Adjusted R-Squared measures are readily interpretable. - -###### Limitations - -- RMSE and MSE might be sensitive to outliers. -- A high R-Squared or Adjusted R-Squared may not necessarily indicate a good model, especially in cases of -overfitting. - - - - - - - -##### RegressionPermutationFeatureImportance - - - - - - -######## RegressionPermutationFeatureImportance() - -```python -def RegressionPermutationFeatureImportance(dataset: VMDataset, model: VMModel, fontsize: int = 12, figure_height: int = 500) -``` - - -Assesses the significance of each feature in a model by evaluating the impact on model performance when feature -values are randomly rearranged. - -###### Purpose - -The primary purpose of this metric is to determine which features significantly impact the performance of a -regression model developed using statsmodels. The metric measures how much the prediction accuracy deteriorates -when each feature's values are permuted. - -###### Test Mechanism - -This metric shuffles the values of each feature one at a time in the dataset, computes the model's performance -after each permutation, and compares it to the baseline performance. A significant decrease in performance -indicates the importance of the feature. - -###### Signs of High Risk - -- Significant reliance on a feature that, when permuted, leads to a substantial decrease in performance, suggesting -overfitting or high model dependency on that feature. -- Features identified as unimportant despite known impacts from domain knowledge, suggesting potential issues in -model training or data preprocessing. - -###### Strengths - -- Directly assesses the impact of each feature on model performance, providing clear insights into model -dependencies. -- Model-agnostic within the scope of statsmodels, applicable to any regression model that outputs predictions. - -###### Limitations - -- The metric is specific to statsmodels and cannot be used with other types of models without adaptation. -- It does not capture interactions between features, which can lead to underestimating the importance of correlated -features. -- Assumes independence of features when calculating importance, which might not always hold true. - - - - - - - -##### ScorecardHistogram - - - - - - -######## ScorecardHistogram() - -```python -def ScorecardHistogram(dataset, title = 'Histogram of Scores', score_column = 'score') -``` - - -The Scorecard Histogram test evaluates the distribution of credit scores between default and non-default instances, -providing critical insights into the performance and generalizability of credit-risk models. - -###### Purpose - -The Scorecard Histogram test metric provides a visual interpretation of the credit scores generated by a machine -learning model for credit-risk classification tasks. It aims to compare the alignment of the model's scoring -decisions with the actual outcomes of credit loan applications. It helps in identifying potential discrepancies -between the model's predictions and real-world risk levels. - -###### Test Mechanism - -This metric uses logistic regression to generate a histogram of credit scores for both default (negative class) and -non-default (positive class) instances. Using both training and test datasets, the metric calculates the credit -score of each instance with a scorecard method, considering the impact of different features on the likelihood of -default. It includes the default point to odds (PDO) scaling factor and predefined target score and odds settings. -Histograms for training and test sets are computed and plotted separately to offer insights into the model's -generalizability to unseen data. - -###### Signs of High Risk - -- Discrepancies between the distributions of training and testing data, indicating a model's poor generalization -ability -- Skewed distributions favoring specific scores or classes, representing potential bias - -###### Strengths - -- Provides a visual interpretation of the model's credit scoring system, enhancing comprehension of model behavior -- Enables a direct comparison between actual and predicted scores for both training and testing data -- Its intuitive visualization helps understand the model's ability to differentiate between positive and negative -classes -- Can unveil patterns or anomalies not easily discerned through numerical metrics alone - -###### Limitations - -- Despite its value for visual interpretation, it doesn't quantify the performance of the model and therefore may -lack precision for thorough model evaluation -- The quality of input data can strongly influence the metric, as bias or noise in the data will affect both the -score calculation and resultant histogram -- Its specificity to credit scoring models limits its applicability across a wider variety of machine learning -tasks and models -- The metric's effectiveness is somewhat tied to the subjective interpretation of the analyst, relying on their -judgment of the characteristics and implications of the plot. - - - - - - - -##### statsutils - - - - - - -######## adj_r2_score() - -```python -def adj_r2_score(actual: , predicted: , rowcount: int, featurecount: int) -``` - - -Adjusted R2 Score - - - - - - - - - - - - - - - -### output - - - - - -##### class BooleanOutputHandler(OutputHandler) - - - - - - -###### can_handle() -```python -def can_handle(self, item): -``` - - -###### process() -```python -def process(self, item, result): -``` - -##### class FigureOutputHandler(OutputHandler) - - - - - - -###### can_handle() -```python -def can_handle(self, item): -``` - - -###### process() -```python -def process(self, item, result): -``` - -##### class MetricOutputHandler(OutputHandler) - - - - - - -###### can_handle() -```python -def can_handle(self, item): -``` - - -###### process() -```python -def process(self, item, result): -``` - -##### class OutputHandler(ABC) - -Base class for handling different types of test outputs - - - - -###### can_handle() -```python -def can_handle(self, item): -``` - -Base class for handling different types of test outputs - - -###### process() -```python -def process(self, item, result): -``` - -Base class for handling different types of test outputs - -##### class RawDataOutputHandler(OutputHandler) - - - - - - -###### can_handle() -```python -def can_handle(self, item): -``` - - -###### process() -```python -def process(self, item, result): -``` - -##### class TableOutputHandler(OutputHandler) - - - - - - -###### can_handle() -```python -def can_handle(self, item): -``` - - -###### process() -```python -def process(self, item, result): -``` - - -###### process_output() - -```python -def process_output(item: Any, result: TestResult) -> None -``` - - -Process a single test output item and update the TestResult. - - - - - - - -### prompt_validation - - - - - -#### Bias - - - - - - -####### Bias() - -```python -def Bias(model, min_threshold = 7) -``` - - -Assesses potential bias in a Large Language Model by analyzing the distribution and order of exemplars in the -prompt. - -###### Purpose - -The Bias Evaluation test calculates if and how the order and distribution of exemplars (examples) in a few-shot -learning prompt affect the output of a Large Language Model (LLM). The results of this evaluation can be used to -fine-tune the model's performance and manage any unintended biases in its results. - -###### Test Mechanism - -This test uses two checks: - -1. **Distribution of Exemplars:** The number of positive vs. negative examples in a prompt is varied. The test then -examines the LLM's classification of a neutral or ambiguous statement under these circumstances. -2. **Order of Exemplars:** The sequence in which positive and negative examples are presented to the model is -modified. Their resultant effect on the LLM's response is studied. - -For each test case, the LLM grades the input prompt on a scale of 1 to 10. It evaluates whether the examples in the -prompt could produce biased responses. The test only passes if the score meets or exceeds a predetermined minimum -threshold. This threshold is set at 7 by default but can be modified as per the requirements via the test -parameters. - -###### Signs of High Risk - -- A skewed result favoring either positive or negative responses may suggest potential bias in the model. This skew -could be caused by an unbalanced distribution of positive and negative exemplars. -- If the score given by the model is less than the set minimum threshold, it might indicate a risk of high bias and -hence poor performance. - -###### Strengths - -- This test provides a quantitative measure of potential bias, offering clear guidelines for developers about -whether their Large Language Model (LLM) contains significant bias. -- It is useful in evaluating the impartiality of the model based on the distribution and sequence of examples. -- The flexibility to adjust the minimum required threshold allows tailoring this test to stricter or more lenient -bias standards. - -###### Limitations - -- The test may not pick up on more subtle forms of bias or biases that are not directly related to the distribution -or order of exemplars. -- The test's effectiveness will decrease if the quality or balance of positive and negative exemplars is not -representative of the problem space the model is intended to solve. -- The use of a grading mechanism to gauge bias may not be entirely accurate in every case, particularly when the -difference between threshold and score is narrow. - - - - - - - -#### Clarity - - - - - - -####### Clarity() - -```python -def Clarity(model, min_threshold = 7) -``` - - -Evaluates and scores the clarity of prompts in a Large Language Model based on specified guidelines. - -###### Purpose - -The Clarity evaluation metric is used to assess how clear the prompts of a Large Language Model (LLM) are. This -assessment is particularly important because clear prompts assist the LLM in more accurately interpreting and -responding to instructions. - -###### Test Mechanism - -The evaluation uses an LLM to scrutinize the clarity of prompts, factoring in considerations such as the inclusion -of relevant details, persona adoption, step-by-step instructions, usage of examples, and specification of desired -output length. Each prompt is rated on a clarity scale of 1 to 10, and any prompt scoring at or above the preset -threshold (default of 7) will be marked as clear. It is important to note that this threshold can be adjusted via -test parameters, providing flexibility in the evaluation process. - -###### Signs of High Risk - -- Prompts that consistently score below the clarity threshold -- Repeated failure of prompts to adhere to guidelines for clarity, including detail inclusion, persona adoption, -explicit step-by-step instructions, use of examples, and specification of output length - -###### Strengths - -- Encourages the development of more effective prompts that aid the LLM in interpreting instructions accurately -- Applies a quantifiable measure (a score from 1 to 10) to evaluate the clarity of prompts -- Threshold for clarity is adjustable, allowing for flexible evaluation depending on the context - -###### Limitations - -- Scoring system is subjective and relies on the AI’s interpretation of 'clarity' -- The test assumes that all required factors (detail inclusion, persona adoption, step-by-step instructions, use of -examples, and specification of output length) contribute equally to clarity, which might not always be the case -- The evaluation may not be as effective if used on non-textual models - - - - - - - -#### Conciseness - - - - - - -####### Conciseness() - -```python -def Conciseness(model, min_threshold = 7) -``` - - -Analyzes and grades the conciseness of prompts provided to a Large Language Model. - -###### Purpose - -The Conciseness Assessment is designed to evaluate the brevity and succinctness of prompts provided to a Language -Learning Model (LLM). A concise prompt strikes a balance between offering clear instructions and eliminating -redundant or unnecessary information, ensuring that the LLM receives relevant input without being overwhelmed. - -###### Test Mechanism - -Using an LLM, this test conducts a conciseness analysis on input prompts. The analysis grades the prompt on a scale -from 1 to 10, where the grade reflects how well the prompt delivers clear instructions without being verbose. -Prompts that score equal to or above a predefined threshold (default set to 7) are deemed successfully concise. -This threshold can be adjusted to meet specific requirements. - -###### Signs of High Risk - -- Prompts that consistently score below the predefined threshold. -- Prompts that are overly wordy or contain unnecessary information. -- Prompts that create confusion or ambiguity due to excess or unnecessary information. - -###### Strengths - -- Ensures clarity and effectiveness of the prompts. -- Promotes brevity and preciseness in prompts without sacrificing essential information. -- Useful for models like LLMs, where input prompt length and clarity greatly influence model performance. -- Provides a quantifiable measure of prompt conciseness. - -###### Limitations - -- The conciseness score is based on an AI's assessment, which might not fully capture human interpretation of -conciseness. -- The predefined threshold for conciseness could be subjective and might need adjustment based on application. -- The test is dependent on the LLM’s understanding of conciseness, which might vary from model to model. - - - - - - - -#### Delimitation - - - - - - -####### Delimitation() - -```python -def Delimitation(model, min_threshold = 7) -``` - - -Evaluates the proper use of delimiters in prompts provided to Large Language Models. - -###### Purpose - -The Delimitation Test aims to assess whether prompts provided to the Language Learning Model (LLM) correctly use -delimiters to mark different sections of the input. Well-delimited prompts help simplify the interpretation process -for the LLM, ensuring that the responses are precise and accurate. - -###### Test Mechanism - -The test employs an LLM to examine prompts for appropriate use of delimiters such as triple quotation marks, XML -tags, and section titles. Each prompt is assigned a score from 1 to 10 based on its delimitation integrity. Prompts -with scores equal to or above the preset threshold (which is 7 by default, although it can be adjusted as -necessary) pass the test. - -###### Signs of High Risk - -- Prompts missing, improperly placed, or incorrectly used delimiters, leading to misinterpretation by the LLM. -- High-risk scenarios with complex prompts involving multiple tasks or diverse data where correct delimitation is -crucial. -- Scores below the threshold, indicating a high risk. - -###### Strengths - -- Ensures clarity in demarcating different components of given prompts. -- Reduces ambiguity in understanding prompts, especially for complex tasks. -- Provides a quantified insight into the appropriateness of delimiter usage, aiding continuous improvement. - -###### Limitations - -- Only checks for the presence and placement of delimiters, not whether the correct delimiter type is used for the -specific data or task. -- May not fully reveal the impacts of poor delimitation on the LLM's final performance. -- The preset score threshold may not be refined enough for complex tasks and prompts, requiring regular manual -adjustment. - - - - - - - -#### NegativeInstruction - - - - - - -####### NegativeInstruction() - -```python -def NegativeInstruction(model, min_threshold = 7) -``` - - -Evaluates and grades the use of affirmative, proactive language over negative instructions in LLM prompts. - -###### Purpose - -The Negative Instruction test is utilized to scrutinize the prompts given to a Large Language Model (LLM). The -objective is to ensure these prompts are expressed using proactive, affirmative language. The focus is on -instructions indicating what needs to be done rather than what needs to be avoided, thereby guiding the LLM more -efficiently towards the desired output. - -###### Test Mechanism - -An LLM is employed to evaluate each prompt. The prompt is graded based on its use of positive instructions with -scores ranging between 1-10. This grade reflects how effectively the prompt leverages affirmative language while -shying away from negative or restrictive instructions. A prompt that attains a grade equal to or above a -predetermined threshold (7 by default) is regarded as adhering effectively to the best practices of positive -instruction. This threshold can be custom-tailored through the test parameters. - -###### Signs of High Risk - -- Low score obtained from the LLM analysis, indicating heavy reliance on negative instructions in the prompts. -- Failure to surpass the preset minimum threshold. -- The LLM generates ambiguous or undesirable outputs as a consequence of the negative instructions used in the -prompt. - -###### Strengths - -- Encourages the usage of affirmative, proactive language in prompts, aiding in more accurate and advantageous -model responses. -- The test result provides a comprehensible score, helping to understand how well a prompt follows the positive -instruction best practices. - -###### Limitations - -- Despite an adequate score, a prompt could still be misleading or could lead to undesired responses due to factors -not covered by this test. -- The test necessitates an LLM for evaluation, which might not be available or feasible in certain scenarios. -- A numeric scoring system, while straightforward, may oversimplify complex issues related to prompt designing and -instruction clarity. -- The effectiveness of the test hinges significantly on the predetermined threshold level, which can be subjective -and may need to be adjusted according to specific use-cases. - - - - - - - -#### Robustness - - - - - - -####### Robustness() - -```python -def Robustness(model, dataset, num_tests = 10) -``` - - -Assesses the robustness of prompts provided to a Large Language Model under varying conditions and contexts. This test -specifically measures the model's ability to generate correct classifications with the given prompt even when the -inputs are edge cases or otherwise difficult to classify. - -###### Purpose - -The Robustness test is meant to evaluate the resilience and reliability of prompts provided to a Language Learning -Model (LLM). The aim of this test is to guarantee that the prompts consistently generate accurate and expected -outputs, even in diverse or challenging scenarios. This test is only applicable to LLM-powered text classification -tasks where the prompt has a single input variable. - -###### Test Mechanism - -The Robustness test appraises prompts under various conditions, alterations, and contexts to ascertain their -stability in producing consistent responses from the LLM. Factors evaluated include different phrasings, inclusion -of potential distracting elements, and various input complexities. By default, the test generates 10 inputs for a -prompt but can be adjusted according to test parameters. - -###### Signs of High Risk - -- If the output from the tests diverges extensively from the expected results, this indicates high risk. -- When the prompt doesn't give a consistent performance across various tests. -- A high risk is indicated when the prompt is susceptible to breaking, especially when the output is expected to be -of a specific type. - -###### Strengths - -- The robustness test helps to ensure stable performance of the LLM prompts and lowers the chances of generating -unexpected or off-target outputs. -- This test is vital for applications where predictability and reliability of the LLM’s output are crucial. - -###### Limitations - -- Currently, the test only supports single-variable prompts, which restricts its application to more complex models. -- When there are too many target classes (over 10), the test is skipped, which can leave potential vulnerabilities -unchecked in complex multi-class models. -- The test may not account for all potential conditions or alterations that could show up in practical use -scenarios. - - - - - - - -#### Specificity - - - - - - -####### Specificity() - -```python -def Specificity(model, min_threshold = 7) -``` - - -Evaluates and scores the specificity of prompts provided to a Large Language Model (LLM), based on clarity, detail, -and relevance. - -###### Purpose - -The Specificity Test evaluates the clarity, precision, and effectiveness of the prompts provided to a Language -Model (LLM). It aims to ensure that the instructions embedded in a prompt are indisputably clear and relevant, -thereby helping to remove ambiguity and steer the LLM towards desired outputs. This level of specificity -significantly affects the accuracy and relevance of LLM outputs. - -###### Test Mechanism - -The Specificity Test employs an LLM to grade each prompt based on clarity, detail, and relevance parameters within -a specificity scale that extends from 1 to 10. On this scale, prompts scoring equal to or more than a predefined -threshold (set to 7 by default) pass the evaluation, while those scoring below this threshold fail it. Users can -adjust this threshold as per their requirements. - -###### Signs of High Risk - -- Prompts scoring consistently below the established threshold -- Vague or ambiguous prompts that do not provide clear direction to the LLM -- Overly verbose prompts that may confuse the LLM instead of providing clear guidance - -###### Strengths - -- Enables precise and clear communication with the LLM to achieve desired outputs -- Serves as a crucial means to measure the effectiveness of prompts -- Highly customizable, allowing users to set their threshold based on specific use cases - -###### Limitations - -- This test doesn't consider the content comprehension capability of the LLM -- High specificity score doesn't guarantee a high-quality response from the LLM, as the model's performance is also -dependent on various other factors -- Striking a balance between specificity and verbosity can be challenging, as overly detailed prompts might confuse -or mislead the model - - - - - - - -#### ai_powered_test - - - - - - -####### call_model() - -```python -def call_model(system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42) -``` - - -Call LLM with the given prompts and return the response - - - - -####### get_explanation() - -```python -def get_explanation(response: str) -``` - - -Get just the explanation from the response string -- **TODO****: use json response mode instead of this - -- **e.g. "Score**: 8 -Explanation: " -> "" - - - - -####### get_score() - -```python -def get_score(response: str) -``` - - -Get just the score from the response string -- **TODO****: use json response mode instead of this - -- **e.g. "Score**: 8 -Explanation: " -> 8 - - - - - - - - - - - - -##### register_test_provider() - -```python -def register_test_provider(namespace: str, test_provider: TestProvider) -> None -``` - - -Register an external test provider - -**Arguments** - -- **namespace (str)****: The namespace of the test provider -- **test_provider (TestProvider)**: The test provider - - - -### run - - - - - - -###### build_test_result() - -```python -def build_test_result(outputs: Union, test_id: str, test_doc: str, inputs: Dict, params: Union, title: Optional = None) -``` - - -Build a TestResult object from a set of raw test function outputs - - - - -###### print_env() - -```python -def print_env() -``` - - - - - -###### run_test() - -```python -def run_test(test_id: Union = None, name: Union = None, unit_metrics: Union = None, inputs: Union = None, input_grid: Union = None, params: Union = None, param_grid: Union = None, show: bool = True, generate_description: bool = True, title: Optional = None, post_process_fn: Union = None, kwargs = {}) -> TestResult -``` - - -Run a ValidMind or custom test - -This function is the main entry point for running tests. It can run simple unit metrics, -ValidMind and custom tests, composite tests made up of multiple unit metrics and comparison -tests made up of multiple tests. - -**Arguments** - -- **test_id (TestID, optional)****: Test ID to run. Not required if `name` and `unit_metrics` provided. -- **params (dict, optional)**: Parameters to customize test behavior. See test details for available parameters. -- **param_grid (Union[Dict[str, List[Any]], List[Dict[str, Any]]], optional)**: For comparison tests, either: - Dict mapping parameter names to lists of values (creates Cartesian product) - List of parameter dictionaries to test -- **inputs (Dict[str, Any], optional)**: Test inputs (models/datasets initialized with vm.init_model/dataset) -- **input_grid (Union[Dict[str, List[Any]], List[Dict[str, Any]]], optional)**: For comparison tests, either: - Dict mapping input names to lists of values (creates Cartesian product) - List of input dictionaries to test -- **name (str, optional)**: Test name (required for composite metrics) -- **unit_metrics (list, optional)**: Unit metric IDs to run as composite metric -- **show (bool, optional)**: Whether to display results. Defaults to True. -- **generate_description (bool, optional)**: Whether to generate a description. Defaults to True. -- **title (str, optional)**: Custom title for the test result -- **post_process_fn (Callable[[TestResult], None], optional)**: Function to post-process the test result - -**Returns** - -- **TestResult**: A TestResult object containing the test results - -**Raises** - -- **ValueError**: If the test inputs are invalid -- **LoadTestError**: If the test class fails to load - - - - - - - -### test_providers - - - - - -##### class LocalTestProvider - -Test providers in ValidMind are responsible for loading tests from different sources, -such as local files, databases, or remote services. The LocalTestProvider specifically -loads tests from the local file system. - -To use the LocalTestProvider, you need to provide the root_folder, which is the -root directory for local tests. The test_id is a combination of the namespace (set -when registering the test provider) and the path to the test class module, where -slashes are replaced by dots and the .py extension is left out. - -Example usage: - -``` -# Create an instance of LocalTestProvider with the root folder -test_provider = LocalTestProvider("/path/to/tests/folder") - -# Register the test provider with a namespace -register_test_provider("my_namespace", test_provider) - -# List all tests in the namespace (returns a list of test IDs) -test_provider.list_tests() -# this is used by the validmind.tests.list_tests() function to aggregate all tests -# from all test providers - -# Load a test using the test_id (namespace + path to test class module) -test = test_provider.load_test("my_namespace.my_test_class") -# full path to the test class module is /path/to/tests/folder/my_test_class.py -``` - -Attributes: - root_folder (str): The root directory for local tests. - - - - -###### list_tests() -```python -def list_tests(self): -``` - -Test providers in ValidMind are responsible for loading tests from different sources, -such as local files, databases, or remote services. The LocalTestProvider specifically -loads tests from the local file system. - -To use the LocalTestProvider, you need to provide the root_folder, which is the -root directory for local tests. The test_id is a combination of the namespace (set -when registering the test provider) and the path to the test class module, where -slashes are replaced by dots and the .py extension is left out. - -Example usage: - -``` -# Create an instance of LocalTestProvider with the root folder -test_provider = LocalTestProvider("/path/to/tests/folder") - -# Register the test provider with a namespace -register_test_provider("my_namespace", test_provider) - -# List all tests in the namespace (returns a list of test IDs) -test_provider.list_tests() -# this is used by the validmind.tests.list_tests() function to aggregate all tests -# from all test providers - -# Load a test using the test_id (namespace + path to test class module) -test = test_provider.load_test("my_namespace.my_test_class") -# full path to the test class module is /path/to/tests/folder/my_test_class.py -``` - -**Attributes** - -- **root_folder (str)****: The root directory for local tests. - - -###### load_test() -```python -def load_test(self, test_id): -``` - -Test providers in ValidMind are responsible for loading tests from different sources, -such as local files, databases, or remote services. The LocalTestProvider specifically -loads tests from the local file system. - -To use the LocalTestProvider, you need to provide the root_folder, which is the -root directory for local tests. The test_id is a combination of the namespace (set -when registering the test provider) and the path to the test class module, where -slashes are replaced by dots and the .py extension is left out. - -Example usage: - -``` -# Create an instance of LocalTestProvider with the root folder -test_provider = LocalTestProvider("/path/to/tests/folder") - -# Register the test provider with a namespace -register_test_provider("my_namespace", test_provider) - -# List all tests in the namespace (returns a list of test IDs) -test_provider.list_tests() -# this is used by the validmind.tests.list_tests() function to aggregate all tests -# from all test providers - -# Load a test using the test_id (namespace + path to test class module) -test = test_provider.load_test("my_namespace.my_test_class") -# full path to the test class module is /path/to/tests/folder/my_test_class.py -``` - -**Attributes** - -- **root_folder (str)****: The root directory for local tests. - - -###### root_folder() -```python -def root_folder(): -``` - -Test providers in ValidMind are responsible for loading tests from different sources, -such as local files, databases, or remote services. The LocalTestProvider specifically -loads tests from the local file system. - -To use the LocalTestProvider, you need to provide the root_folder, which is the -root directory for local tests. The test_id is a combination of the namespace (set -when registering the test provider) and the path to the test class module, where -slashes are replaced by dots and the .py extension is left out. - -Example usage: - -``` -# Create an instance of LocalTestProvider with the root folder -test_provider = LocalTestProvider("/path/to/tests/folder") - -# Register the test provider with a namespace -register_test_provider("my_namespace", test_provider) - -# List all tests in the namespace (returns a list of test IDs) -test_provider.list_tests() -# this is used by the validmind.tests.list_tests() function to aggregate all tests -# from all test providers - -# Load a test using the test_id (namespace + path to test class module) -test = test_provider.load_test("my_namespace.my_test_class") -# full path to the test class module is /path/to/tests/folder/my_test_class.py -``` - -**Attributes** - -- **root_folder (str)****: The root directory for local tests. - -##### class TestProvider(Protocol) - -Protocol for user-defined test providers - - - - -###### list_tests() -```python -def list_tests(self): -``` - -Protocol for user-defined test providers - - -###### load_test() -```python -def load_test(self, test_id): -``` - -Protocol for user-defined test providers - -##### class ValidMindTestProvider - -Test provider for ValidMind tests - - - - -###### list_tests() -```python -def list_tests(self): -``` - -Test provider for ValidMind tests - - -###### load_test() -```python -def load_test(self, test_id): -``` - -Test provider for ValidMind tests - - -###### metrics_provider() -```python -def metrics_provider(): -``` - -Test provider for ValidMind tests - - -###### tests_provider() -```python -def tests_provider(): -``` - -Test provider for ValidMind tests - - - - - -### utils - - -Test Module Utils - - - - - -###### ensure_equal_lengths() - -```python -def ensure_equal_lengths(y_true, y_pred, dataset_id = None) -``` - - -Check if true and predicted values have matching lengths, log warning if they don't, -and truncate to the shorter length if necessary. Also removes any NaN/None values. - -**Arguments** - -- **y_true****: List or array of true values -- **y_pred**: List or array of predicted values -- **dataset_id**: Optional identifier for the dataset (for logging) - -**Returns** - -- **tuple**: (cleaned_y_true, cleaned_y_pred) - - - - -###### remove_nan_pairs() - -```python -def remove_nan_pairs(y_true, y_pred, dataset_id = None) -``` - - -Remove pairs where either true or predicted values are NaN/None. -**Arguments** - -- **y_true****: List or array of true values -- **y_pred**: List or array of predicted values -- **dataset_id**: Optional identifier for the dataset (for logging) -**Returns** - -- **tuple**: (cleaned_y_true, cleaned_y_pred) - - - - -###### test_description() - -```python -def test_description(test_class, truncate = True) -``` - - - - - -###### validate_prediction() - -```python -def validate_prediction(y_true, y_pred, dataset_id = None) -``` - - -Comprehensive validation of true and predicted value pairs. -Handles NaN/None values and length mismatches. - -**Arguments** - -- **y_true****: List or array of true values -- **y_pred**: List or array of predicted values -- **dataset_id**: Optional identifier for the dataset (for logging) - -**Returns** - -- **tuple**: (cleaned_y_true, cleaned_y_pred) with matching lengths and no NaN values - -Example: -- >>> y_true, y_pred = validate_prediction_pairs(dataset.y, model.predict(dataset.X), dataset.input_id) - - - - - - - - - - -### unit_metrics - - - -##### describe_metric() - -```python -def describe_metric(metric_id: str, kwargs = {}) -``` - - -Describe a metric - - - - -##### list_metrics() - -```python -def list_metrics(kwargs = {}) -``` - - -List all metrics - - - - -##### run_metric() - -```python -def run_metric(metric_id: str, kwargs = {}) -``` - - -Run a metric - - - - - - - -### vm_models - - -Models entrypoint - -### dataset - - - - - -#### dataset - - -Dataset class wrapper - - - - -###### class DataFrameDataset(VMDataset) - -VM dataset implementation for pandas DataFrame. - - - -###### class PolarsDataset(VMDataset) - -VM dataset implementation for Polars DataFrame. - - - -###### class TorchDataset(VMDataset) - -VM dataset implementation for PyTorch Datasets. - - - -###### class VMDataset(VMInput) - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -Attributes: - raw_dataset (np.ndarray): The raw dataset as a NumPy array. - input_id (str): Identifier for the dataset. - index (np.ndarray): The raw dataset index as a NumPy array. - columns (Set[str]): The column names of the dataset. - target_column (str): The target column name of the dataset. - feature_columns (List[str]): The feature column names of the dataset. - feature_columns_numeric (List[str]): The numeric feature column names of the dataset. - feature_columns_categorical (List[str]): The categorical feature column names of the dataset. - text_column (str): The text column name of the dataset for NLP tasks. - target_class_labels (Dict): The class labels for the target columns. - df (pd.DataFrame): The dataset as a pandas DataFrame. - extra_columns (Dict): Extra columns to include in the dataset. - - - - -####### add_extra_column() -```python -def add_extra_column(self, column_name, column_values = None): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### assign_predictions() -```python -def assign_predictions(self, model, prediction_column = None, prediction_values = None, probability_column = None, probability_values = None, prediction_probabilities = None, kwargs = {}): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### column_aliases() -```python -def column_aliases(): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### columns() -```python -def columns(): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### df() -```python -def df(): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### extra_columns() -```python -def extra_columns(): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### index() -```python -def index(): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### input_id() -```python -def input_id(): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### prediction_column() -```python -def prediction_column(self, model, column_name = None): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### probability_column() -```python -def probability_column(self, model, column_name = None): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### target_class_labels() -```python -def target_class_labels(): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### target_classes() -```python -def target_classes(self): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### target_column() -```python -def target_column(): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### text_column() -```python -def text_column(): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### with_options() -```python -def with_options(self, kwargs = {}): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### x() -```python -def x(): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### x_df() -```python -def x_df(self): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### y() -```python -def y(): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### y_df() -```python -def y_df(self): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### y_pred() -```python -def y_pred(self, model): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### y_pred_df() -```python -def y_pred_df(self, model): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### y_prob() -```python -def y_prob(self, model): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - -####### y_prob_df() -```python -def y_prob_df(self, model): -``` - -Base class for VM datasets - -Child classes should be used to support new dataset types (tensor, polars etc) -by converting the user's dataset into a numpy array collecting metadata like -column names and then call this (parent) class `__init__` method. - -This way we can support multiple dataset types but under the hood we only -need to work with numpy arrays and pandas dataframes in this class. - -**Attributes** - -- **raw_dataset (np.ndarray)****: The raw dataset as a NumPy array. -- **input_id (str)**: Identifier for the dataset. -- **index (np.ndarray)**: The raw dataset index as a NumPy array. -- **columns (Set[str])**: The column names of the dataset. -- **target_column (str)**: The target column name of the dataset. -- **feature_columns (List[str])**: The feature column names of the dataset. -- **feature_columns_numeric (List[str])**: The numeric feature column names of the dataset. -- **feature_columns_categorical (List[str])**: The categorical feature column names of the dataset. -- **text_column (str)**: The text column name of the dataset for NLP tasks. -- **target_class_labels (Dict)**: The class labels for the target columns. -- **df (pd.DataFrame)**: The dataset as a pandas DataFrame. -- **extra_columns (Dict)**: Extra columns to include in the dataset. - - - - - -#### utils - - - - - -###### class ExtraColumns - -Extra columns for the dataset. - - - - -####### add_extra() -```python -def add_extra(self, column_name): -``` - -Extra columns for the dataset. - - -####### extras() -```python -def extras(): -``` - -Extra columns for the dataset. - - -####### flatten() -```python -def flatten(self): -``` - -Extra columns for the dataset. - - -####### from_dict() -```python -def from_dict(cls, data): -``` - -Extra columns for the dataset. - - -####### group_by_column() -```python -def group_by_column(): -``` - -Extra columns for the dataset. - - -####### prediction_column() -```python -def prediction_column(self, model, column_name = None): -``` - -Extra columns for the dataset. - - -####### prediction_columns() -```python -def prediction_columns(): -``` - -Extra columns for the dataset. - - -####### probability_column() -```python -def probability_column(self, model, column_name = None): -``` - -Extra columns for the dataset. - - -####### probability_columns() -```python -def probability_columns(): -``` - -Extra columns for the dataset. - - -####### as_df() - -```python -def as_df(series_or_frame: Union) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} -``` - - - - - -####### compute_predictions() - -```python -def compute_predictions(model, X, kwargs = {}) -> tuple -``` - - - - - -####### convert_index_to_datetime() - -```python -def convert_index_to_datetime(df) -``` - - -Attempts to convert the index of the dataset to a datetime index -and leaves the index unchanged if it fails. - - - - - - - - - - - -### figure - - -Figure objects track the figure schema supported by the ValidMind API - - - - -##### class Figure - -Figure objects track the schema supported by the ValidMind API - - - - -###### figure() -```python -def figure(): -``` - -Figure objects track the schema supported by the ValidMind API - - -###### key() -```python -def key(): -``` - -Figure objects track the schema supported by the ValidMind API - - -###### ref_id() -```python -def ref_id(): -``` - -Figure objects track the schema supported by the ValidMind API - - -###### serialize() -```python -def serialize(self): -``` - -Figure objects track the schema supported by the ValidMind API - - -###### serialize_files() -```python -def serialize_files(self): -``` - -Figure objects track the schema supported by the ValidMind API - - -###### to_widget() -```python -def to_widget(self): -``` - -Figure objects track the schema supported by the ValidMind API - - -###### create_figure() - -```python -def create_figure(figure: Union, key: str, ref_id: str) -> Figure -``` - - -Create a VM Figure object from a raw figure object - - - - -###### is_matplotlib_figure() - -```python -def is_matplotlib_figure(figure) -> bool -``` - - - - - -###### is_plotly_figure() - -```python -def is_plotly_figure(figure) -> bool -``` - - - - - -###### is_png_image() - -```python -def is_png_image(figure) -> bool -``` - - - - - - - - -### input - - -Base class for ValidMind Input types - - - - -##### class VMInput(ABC) - -Base class for ValidMind Input types - - - - -###### with_options() -```python -def with_options(self, kwargs = {}): -``` - -Base class for ValidMind Input types - - - - - -### model - - -Model class wrapper module - - - - -##### class ModelAttributes - -Model attributes definition - - - - -###### architecture() -```python -def architecture(): -``` - -Model attributes definition - - -###### framework() -```python -def framework(): -``` - -Model attributes definition - - -###### framework_version() -```python -def framework_version(): -``` - -Model attributes definition - - -###### from_dict() -```python -def from_dict(cls, data): -``` - -Model attributes definition - - -###### language() -```python -def language(): -``` - -Model attributes definition - - -###### task() -```python -def task(): -``` - -Model attributes definition - -##### class ModelPipeline - -Helper class for chaining models together - -This shouldn't be used directly, it just gets used when chaining models with the -`|` operator since you can't use a list directly - you must use a type that -overloads the `|` operator. - - - - -###### models() -```python -def models(): -``` - -Helper class for chaining models together - -This shouldn't be used directly, it just gets used when chaining models with the -`|` operator since you can't use a list directly - you must use a type that -overloads the `|` operator. - -##### class ModelTask(Enum) - -Model task enums - - - - -###### CLASSIFICATION() -```python -def CLASSIFICATION(): -``` - -Model task enums - - -###### REGRESSION() -```python -def REGRESSION(): -``` - -Model task enums - -##### class VMModel(VMInput) - -An base class that wraps a trained model instance and its associated data. - -Attributes: - model (object, optional): The trained model instance. Defaults to None. - input_id (str, optional): The input ID for the model. Defaults to None. - attributes (ModelAttributes, optional): The attributes of the model. Defaults to None. - name (str, optional): The name of the model. Defaults to the class name. - - - - -###### attributes() -```python -def attributes(): -``` - -An base class that wraps a trained model instance and its associated data. - -**Attributes** - -- **model (object, optional)****: The trained model instance. Defaults to None. -- **input_id (str, optional)**: The input ID for the model. Defaults to None. -- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. -- **name (str, optional)**: The name of the model. Defaults to the class name. - - -###### class_() -```python -def class_(): -``` - -An base class that wraps a trained model instance and its associated data. - -**Attributes** - -- **model (object, optional)****: The trained model instance. Defaults to None. -- **input_id (str, optional)**: The input ID for the model. Defaults to None. -- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. -- **name (str, optional)**: The name of the model. Defaults to the class name. - - -###### input_id() -```python -def input_id(): -``` - -An base class that wraps a trained model instance and its associated data. - -**Attributes** - -- **model (object, optional)****: The trained model instance. Defaults to None. -- **input_id (str, optional)**: The input ID for the model. Defaults to None. -- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. -- **name (str, optional)**: The name of the model. Defaults to the class name. - - -###### language() -```python -def language(): -``` - -An base class that wraps a trained model instance and its associated data. - -**Attributes** - -- **model (object, optional)****: The trained model instance. Defaults to None. -- **input_id (str, optional)**: The input ID for the model. Defaults to None. -- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. -- **name (str, optional)**: The name of the model. Defaults to the class name. - - -###### library() -```python -def library(): -``` - -An base class that wraps a trained model instance and its associated data. - -**Attributes** - -- **model (object, optional)****: The trained model instance. Defaults to None. -- **input_id (str, optional)**: The input ID for the model. Defaults to None. -- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. -- **name (str, optional)**: The name of the model. Defaults to the class name. - - -###### library_version() -```python -def library_version(): -``` - -An base class that wraps a trained model instance and its associated data. - -**Attributes** - -- **model (object, optional)****: The trained model instance. Defaults to None. -- **input_id (str, optional)**: The input ID for the model. Defaults to None. -- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. -- **name (str, optional)**: The name of the model. Defaults to the class name. - - -###### model() -```python -def model(): -``` - -An base class that wraps a trained model instance and its associated data. - -**Attributes** - -- **model (object, optional)****: The trained model instance. Defaults to None. -- **input_id (str, optional)**: The input ID for the model. Defaults to None. -- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. -- **name (str, optional)**: The name of the model. Defaults to the class name. - - -###### name() -```python -def name(): -``` - -An base class that wraps a trained model instance and its associated data. - -**Attributes** - -- **model (object, optional)****: The trained model instance. Defaults to None. -- **input_id (str, optional)**: The input ID for the model. Defaults to None. -- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. -- **name (str, optional)**: The name of the model. Defaults to the class name. - - -###### predict() -```python -def predict(self, args = (), kwargs = {}): -``` - -An base class that wraps a trained model instance and its associated data. - -**Attributes** - -- **model (object, optional)****: The trained model instance. Defaults to None. -- **input_id (str, optional)**: The input ID for the model. Defaults to None. -- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. -- **name (str, optional)**: The name of the model. Defaults to the class name. - - -###### predict_proba() -```python -def predict_proba(self, args = (), kwargs = {}): -``` - -An base class that wraps a trained model instance and its associated data. - -**Attributes** - -- **model (object, optional)****: The trained model instance. Defaults to None. -- **input_id (str, optional)**: The input ID for the model. Defaults to None. -- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. -- **name (str, optional)**: The name of the model. Defaults to the class name. - - -###### serialize() -```python -def serialize(self): -``` - -An base class that wraps a trained model instance and its associated data. - -**Attributes** - -- **model (object, optional)****: The trained model instance. Defaults to None. -- **input_id (str, optional)**: The input ID for the model. Defaults to None. -- **attributes (ModelAttributes, optional)**: The attributes of the model. Defaults to None. -- **name (str, optional)**: The name of the model. Defaults to the class name. - - -###### get_model_class() - -```python -def get_model_class(model, predict_fn = None) -``` - - - - - -###### has_method_with_arguments() - -```python -def has_method_with_arguments(cls, method_name, n_args) -``` - - - - - -###### is_model_metadata() - -```python -def is_model_metadata(model) -``` - - -Checks if the model is a dictionary containing metadata about a model. -We want to check if the metadata dictionary contains at least the following keys: - -- architecture -- language - - - - -###### is_pytorch_model() - -```python -def is_pytorch_model(model) -``` - - -Checks if the model is a PyTorch model. Need to extend this -method to check for all ways a PyTorch model can be created - - - - -###### model_module() - -```python -def model_module(model) -``` - - - - - - - - -### result - - - - - -#### result - - -Result Objects for test results - - - - -###### class ErrorResult(Result) - -Result for test suites that fail to load or run properly - - - - -####### error() -```python -def error(): -``` - -Result for test suites that fail to load or run properly - - -####### log_async() -```python -def log_async(self): -``` - -Result for test suites that fail to load or run properly - - -####### message() -```python -def message(): -``` - -Result for test suites that fail to load or run properly - - -####### name() -```python -def name(): -``` - -Result for test suites that fail to load or run properly - - -####### to_widget() -```python -def to_widget(self): -``` - -Result for test suites that fail to load or run properly - -###### class RawData - -Holds raw data for a test result - - - - -####### inspect() -```python -def inspect(self, show = True): -``` - -Holds raw data for a test result - - -####### log() -```python -def log(): -``` - -Holds raw data for a test result - - -####### serialize() -```python -def serialize(self): -``` - -Holds raw data for a test result - -###### class Result - -Base Class for test suite results - - - - -####### log() -```python -def log(self): -``` - -Base Class for test suite results - - -####### name() -```python -def name(): -``` - -Base Class for test suite results - - -####### result_id() -```python -def result_id(): -``` - -Base Class for test suite results - - -####### show() -```python -def show(self): -``` - -Base Class for test suite results - - -####### to_widget() -```python -def to_widget(self): -``` - -Base Class for test suite results - -###### class ResultTable - -A dataclass that holds the table summary of result - - - - -####### data() -```python -def data(): -``` - -A dataclass that holds the table summary of result - - -####### serialize() -```python -def serialize(self): -``` - -A dataclass that holds the table summary of result - - -####### title() -```python -def title(): -``` - -A dataclass that holds the table summary of result - -###### class TestResult(Result) - -Test result - - - - -####### add_figure() -```python -def add_figure(self, figure): -``` - -Test result - - -####### add_table() -```python -def add_table(self, table, title = None): -``` - -Test result - - -####### description() -```python -def description(): -``` - -Test result - - -####### doc() -```python -def doc(): -``` - -Test result - - -####### figures() -```python -def figures(): -``` - -Test result - - -####### inputs() -```python -def inputs(): -``` - -Test result - - -####### log() -```python -def log(self, section_id = None, position = None, unsafe = False): -``` - -Test result - - -####### log_async() -```python -def log_async(self, section_id = None, position = None, unsafe = False): -``` - -Test result - - -####### metadata() -```python -def metadata(): -``` - -Test result - - -####### metric() -```python -def metric(): -``` - -Test result - - -####### name() -```python -def name(): -``` - -Test result - - -####### params() -```python -def params(): -``` - -Test result - - -####### passed() -```python -def passed(): -``` - -Test result - - -####### raw_data() -```python -def raw_data(): -``` - -Test result - - -####### ref_id() -```python -def ref_id(): -``` - -Test result - - -####### remove_figure() -```python -def remove_figure(self, index = 0): -``` - -Test result - - -####### remove_table() -```python -def remove_table(self, index): -``` - -Test result - - -####### serialize() -```python -def serialize(self): -``` - -Test result - - -####### tables() -```python -def tables(): -``` - -Test result - - -####### test_name() -```python -def test_name(): -``` - -Test result - - -####### title() -```python -def title(): -``` - -Test result - - -####### to_widget() -```python -def to_widget(self): -``` - -Test result - - - - - -#### utils - - - - - - -####### check_for_sensitive_data() - -```python -def check_for_sensitive_data(data: , inputs: List) -``` - - -Check if a table contains raw data from input datasets - - - - -####### figures_to_widgets() - -```python -def figures_to_widgets(figures: List) -> list -``` - - -Plot figures to a ipywidgets GridBox - - - - -####### get_result_template() - -```python -def get_result_template() -``` - - -Get the jinja html template for rendering test results - - - - -####### tables_to_widgets() - -```python -def tables_to_widgets(tables: List) -``` - - -Convert summary (list of json tables) into a list of ipywidgets - - - - -####### update_metadata() - -```python -def update_metadata(content_id: str, text: str, _json: Union = None) -``` - - -Create or Update a Metadata Object - - - - - - - - - - - - - - - -#### Module Hierarchy##### api_client - -* [api_client](api_client.qmd) - -ValidMind API client - -Note that this takes advantage of the fact that python modules are singletons to store and share -the configuration and session across the entire project regardless of where the client is imported. - -##### client - -* [client](client.qmd) - -Client interface for all data and model validation functions - -##### client_config - -* [client_config](client_config.qmd) - -Central class to track configuration of the ValidMind Library -client against the ValidMind API - -##### datasets - -* [datasets](datasets.qmd) - -Example datasets that can be used with the ValidMind Library. - -###### classification - -* [classification](datasets/classification.qmd) - -Entrypoint for classification datasets. - -###### credit_risk - -* [credit_risk](datasets/credit_risk.qmd) - -Entrypoint for credit risk datasets. - -###### nlp - -* [nlp](datasets/nlp.qmd) - -Example datasets that can be used with the ValidMind Library. - -###### regression - -* [regression](datasets/regression.qmd) - -Entrypoint for regression datasets - -##### errors - -* [errors](errors.qmd) - -This module contains all the custom errors that are used in the ValidMind Library. - -The following base errors are defined for others: -- BaseError -- APIRequestError - -##### html_templates - -* [html_templates](html_templates.qmd) -###### content_blocks - -* [content_blocks](html_templates/content_blocks.qmd) -##### input_registry - -* [input_registry](input_registry.qmd) - -Central class to register inputs - -##### logging - -* [logging](logging.qmd) - -ValidMind logging module. - -##### models - -* [models](models.qmd) -###### foundation - -* [foundation](models/foundation.qmd) -###### function - -* [function](models/function.qmd) -###### huggingface - -* [huggingface](models/huggingface.qmd) -###### metadata - -* [metadata](models/metadata.qmd) -###### pipeline - -* [pipeline](models/pipeline.qmd) -###### pytorch - -* [pytorch](models/pytorch.qmd) -###### r_model - -* [r_model](models/r_model.qmd) -###### sklearn - -* [sklearn](models/sklearn.qmd) -##### template - -* [template](template.qmd) -##### test_suites - -* [test_suites](test_suites.qmd) - -Entrypoint for test suites. - -###### classifier - -* [classifier](test_suites/classifier.qmd) - -Test suites for sklearn-compatible classifier models - -Ideal setup is to have the API client to read a -custom test suite from the project's configuration - -###### cluster - -* [cluster](test_suites/cluster.qmd) - -Test suites for sklearn-compatible clustering models - -Ideal setup is to have the API client to read a -custom test suite from the project's configuration - -###### embeddings - -* [embeddings](test_suites/embeddings.qmd) - -Test suites for embeddings models - -Ideal setup is to have the API client to read a -custom test suite from the project's configuration - -###### llm - -* [llm](test_suites/llm.qmd) - -Test suites for LLMs - -###### nlp - -* [nlp](test_suites/nlp.qmd) - -Test suites for NLP models - -###### parameters_optimization - -* [parameters_optimization](test_suites/parameters_optimization.qmd) - -Test suites for sklearn-compatible hyper parameters tunning - -Ideal setup is to have the API client to read a -custom test suite from the project's configuration - -###### regression - -* [regression](test_suites/regression.qmd) -###### statsmodels_timeseries - -* [statsmodels_timeseries](test_suites/statsmodels_timeseries.qmd) - -Time Series Test Suites from statsmodels - -###### summarization - -* [summarization](test_suites/summarization.qmd) - -Test suites for llm summarization models - -###### tabular_datasets - -* [tabular_datasets](test_suites/tabular_datasets.qmd) - -Test suites for tabular datasets - -###### text_data - -* [text_data](test_suites/text_data.qmd) - -Test suites for text datasets - -###### time_series - -* [time_series](test_suites/time_series.qmd) - -Time Series Test Suites - -##### tests - -* [tests](tests.qmd) - -ValidMind Tests Module - -###### comparison - -* [comparison](tests/comparison.qmd) -###### data_validation - -* [data_validation](tests/data_validation.qmd) -###### decorator - -* [decorator](tests/decorator.qmd) - -Decorators for creating and registering tests with the ValidMind Library. - -###### load - -* [load](tests/load.qmd) - -Module for listing and loading tests. - -###### model_validation - -* [model_validation](tests/model_validation.qmd) -###### output - -* [output](tests/output.qmd) -###### prompt_validation - -* [prompt_validation](tests/prompt_validation.qmd) -###### run - -* [run](tests/run.qmd) -###### test_providers - -* [test_providers](tests/test_providers.qmd) -###### utils - -* [utils](tests/utils.qmd) - -Test Module Utils - -##### unit_metrics - -* [unit_metrics](unit_metrics.qmd) -##### utils - -* [utils](utils.qmd) -##### vm_models - -* [vm_models](vm_models.qmd) - -Models entrypoint - -###### dataset - -* [dataset](vm_models/dataset.qmd) -###### figure - -* [figure](vm_models/figure.qmd) - -Figure objects track the figure schema supported by the ValidMind API - -###### input - -* [input](vm_models/input.qmd) - -Base class for ValidMind Input types - -###### model - -* [model](vm_models/model.qmd) - -Model class wrapper module - -###### result - -* [result](vm_models/result.qmd) - diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd new file mode 100644 index 000000000..74a548889 --- /dev/null +++ b/docs/validmind/vm_models.qmd @@ -0,0 +1,17 @@ +--- +title: vm_models +toc-depth: 3 +toc-expand: 3 +--- + +Models entrypoint + + + + + + + + + + \ No newline at end of file diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py new file mode 100644 index 000000000..3059a3a05 --- /dev/null +++ b/scripts/generate_quarto_docs.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +import json +import os +from pathlib import Path +from typing import Any, Dict, Set +from jinja2 import Environment, FileSystemLoader + +def resolve_alias(member: Dict[str, Any], data: Dict[str, Any]) -> Dict[str, Any]: + """Resolve an alias to its target member.""" + if member.get('kind') == 'alias' and member.get('target_path'): + path_parts = member['target_path'].split('.') + # Skip resolution if it's not in our codebase + if path_parts[0] != 'validmind': + return member + current = data[path_parts[0]] # Start at validmind + for part in path_parts[1:]: + if part in current.get('members', {}): + current = current['members'][part] + else: + return member + return current + return member + +def get_all_members(members: Dict[str, Any]) -> Set[str]: + """Extract the __all__ list from a module's members if present.""" + if '__all__' in members: + all_elements = members['__all__'].get('value', {}).get('elements', []) + return {elem.strip("'") for elem in all_elements} + return set() + +def sort_members(members): + """Sort members by kind and name.""" + if isinstance(members, dict): + members = members.values() + + def get_sort_key(member): + name = str(member.get('name', '')) # Ensure string for sorting + kind = member.get('kind', '') + + # Special case: __version__ should be first + if name == "__version__": + return (0, name) + + # Order: aliases, functions, modules, others + if kind == 'alias': + return (1, name.lower()) # Case-insensitive natural sort + elif kind == 'function': + return (2, name.lower()) + elif kind == 'module': + return (3, name.lower()) + else: + return (4, name.lower()) + + return sorted(members, key=get_sort_key) + +def is_public(member: Dict[str, Any], module: Dict[str, Any], full_data: Dict[str, Any], is_root: bool = False) -> bool: + """Check if a member should be included in public documentation.""" + name = member.get('name', '') + + # Skip private members except __init__ and __post_init__ + if name.startswith('_') and name not in {'__init__', '__post_init__'}: + return False + + # At root level, only show items from __all__ + if is_root: + root_all = get_all_members(full_data['validmind'].get('members', {})) + return name in root_all + + # If module has __all__, only include members listed there + if module and '__all__' in module.get('members', {}): + module_all = get_all_members(module.get('members', {})) + return name in module_all + + return True + +def ensure_dir(path): + """Create directory if it doesn't exist.""" + Path(path).mkdir(parents=True, exist_ok=True) + +def process_module(module: Dict[str, Any], path: list, env: Environment, data: Dict[str, Any]): + """Process a module and its members.""" + module_dir = os.path.join('docs', *path[:-1]) + ensure_dir(module_dir) + + # Get module template + module_template = env.get_template('module.qmd.jinja2') + + # Generate module documentation + output = module_template.render( + module=module, + full_data=data, + is_root=(len(path) <= 1), + resolve_alias=resolve_alias + ) + + # Write output + filename = f"{path[-1]}.qmd" + output_path = os.path.join(module_dir, filename) + with open(output_path, 'w') as f: + f.write(output) + + # Process submodules + members = module.get('members', {}) + for name, member in members.items(): + if member.get('kind') == 'module': + if is_public(member, module, data, is_root=len(path) <= 1): + process_module(member, path + [name], env, data) + +def generate_docs(json_path: str, template_dir: str, output_dir: str): + """Generate documentation from JSON data using templates.""" + # Load JSON data + with open(json_path) as f: + data = json.load(f) + + # Set up Jinja environment + env = Environment( + loader=FileSystemLoader(template_dir), + trim_blocks=True, + lstrip_blocks=True + ) + + # Add custom filters and globals + env.filters['sort_members'] = sort_members + env.globals['is_public'] = is_public + env.globals['resolve_alias'] = resolve_alias + env.globals['get_all_members'] = get_all_members + + # Start processing from root module + if 'validmind' in data: + process_module(data['validmind'], ['validmind'], env, data) + else: + print("Error: No 'validmind' module found in JSON") + +if __name__ == '__main__': + generate_docs( + json_path='docs/validmind.json', + template_dir='docs/templates', + output_dir='docs' + ) \ No newline at end of file From 0ff82948a0763fcbadb4c82600698c5672438249 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 26 Jan 2025 20:49:50 -0800 Subject: [PATCH 010/207] Re-add more content, fix markup issues, and create sidebar template --- docs/_sidebar.yml | 56 +++++++++++++++++++++++++++++++ docs/templates/sidebar.qmd.jinja2 | 35 +++++++++++++++++++ scripts/generate_quarto_docs.py | 15 +++++++++ 3 files changed, 106 insertions(+) create mode 100644 docs/_sidebar.yml create mode 100644 docs/templates/sidebar.qmd.jinja2 diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml new file mode 100644 index 000000000..5dd087e4e --- /dev/null +++ b/docs/_sidebar.yml @@ -0,0 +1,56 @@ +website: + sidebar: + - contents: + # Root level functions from validmind.qmd + - text: "Python API" + file: validmind.qmd#python-api + - text: "__version__" + file: validmind.qmd#__version__ + - text: "get_test_suite()" + file: validmind.qmd#get_test_suite + - text: "init()" + file: validmind.qmd#init + - text: "init_dataset()" + file: validmind.qmd#init_dataset + - text: "init_model()" + file: validmind.qmd#init_model + - text: "init_r_model()" + file: validmind.qmd#init_r_model + - text: "log_metric()" + file: validmind.qmd#log_metric + - text: "preview_template()" + file: validmind.qmd#preview_template + - text: "reload()" + file: validmind.qmd#reload + - text: "run_documentation_tests()" + file: validmind.qmd#run_documentation_tests + - text: "run_test_suite()" + file: validmind.qmd#run_test_suite + - text: "tags()" + file: validmind.qmd#tags + - text: "tasks()" + file: validmind.qmd#tasks + - text: "test()" + file: validmind.qmd#test + + # All module documentation pages + - text: "Submodules" + - text: "datasets" + file: validmind/datasets.qmd + contents: + - text: "errors" + file: validmind/errors.qmd + contents: + - text: "test_suites" + file: validmind/test_suites.qmd + contents: + - text: "tests" + file: validmind/tests.qmd + contents: + - text: "unit_metrics" + file: validmind/unit_metrics.qmd + contents: + - text: "vm_models" + file: validmind/vm_models.qmd + contents: + \ No newline at end of file diff --git a/docs/templates/sidebar.qmd.jinja2 b/docs/templates/sidebar.qmd.jinja2 new file mode 100644 index 000000000..5df38ba33 --- /dev/null +++ b/docs/templates/sidebar.qmd.jinja2 @@ -0,0 +1,35 @@ +website: + sidebar: + - contents: + # Root level functions from validmind.qmd + - text: "Python API" + file: validmind.qmd#python-api + {% if module.members.__version__ %} + - text: "__version__" + file: validmind.qmd#__version__ + {% endif %} + {% for member in module.members | sort_members %} + {% if is_public(member, module, full_data, is_root) and member.kind == "alias" %} + {% set target = resolve_alias(member, full_data) %} + {% if target and target.docstring %} + - text: "{{ member.name }}()" + file: validmind.qmd#{{ member.name }} + {% endif %} + {% endif %} + {% endfor %} + + # All module documentation pages + - text: "Submodules" + {% for member in module.members | sort_members %} + {% if is_public(member, module, full_data, is_root) and member.kind == "module" %} + - text: "{{ member.name }}" + file: validmind/{{ member.name }}.qmd + contents: + {% for submember in member.members | sort_members %} + {% if is_public(submember, member, full_data, is_root) and submember.kind == "module" %} + - text: "{{ submember.name }}" + file: validmind/{{ member.name }}/{{ submember.name }}.qmd + {% endif %} + {% endfor %} + {% endif %} + {% endfor %} \ No newline at end of file diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 3059a3a05..13de2fcb3 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -127,7 +127,22 @@ def generate_docs(json_path: str, template_dir: str, output_dir: str): # Start processing from root module if 'validmind' in data: + # Generate module documentation process_module(data['validmind'], ['validmind'], env, data) + + # Generate sidebar + sidebar_template = env.get_template('sidebar.qmd.jinja2') + sidebar_output = sidebar_template.render( + module=data['validmind'], + full_data=data, + is_root=True, + resolve_alias=resolve_alias + ) + + # Write sidebar + sidebar_path = os.path.join(output_dir, '_sidebar.yml') + with open(sidebar_path, 'w') as f: + f.write(sidebar_output) else: print("Error: No 'validmind' module found in JSON") From eb8bd9a78fe879173f8582659ac6f4023a0276a2 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 26 Jan 2025 21:35:56 -0800 Subject: [PATCH 011/207] Save point --- docs/_sidebar.yml | 2 -- docs/templates/module.qmd.jinja2 | 7 ++----- docs/templates/sidebar.qmd.jinja2 | 2 -- docs/validmind.qmd | 9 --------- docs/validmind/datasets.qmd | 1 - docs/validmind/datasets/classification.qmd | 1 - .../validmind/datasets/classification/customer_churn.qmd | 1 - docs/validmind/datasets/classification/taiwan_credit.qmd | 1 - docs/validmind/datasets/credit_risk.qmd | 1 - docs/validmind/datasets/credit_risk/lending_club.qmd | 1 - .../validmind/datasets/credit_risk/lending_club_bias.qmd | 1 - docs/validmind/datasets/nlp.qmd | 1 - docs/validmind/datasets/nlp/cnn_dailymail.qmd | 1 - docs/validmind/datasets/nlp/twitter_covid_19.qmd | 1 - docs/validmind/datasets/regression.qmd | 1 - docs/validmind/datasets/regression/fred.qmd | 1 - docs/validmind/datasets/regression/lending_club.qmd | 1 - docs/validmind/errors.qmd | 1 - docs/validmind/test_suites.qmd | 1 - docs/validmind/test_suites/classifier.qmd | 1 - docs/validmind/test_suites/cluster.qmd | 1 - docs/validmind/test_suites/embeddings.qmd | 1 - docs/validmind/test_suites/llm.qmd | 1 - docs/validmind/test_suites/nlp.qmd | 1 - docs/validmind/test_suites/parameters_optimization.qmd | 1 - docs/validmind/test_suites/regression.qmd | 1 - docs/validmind/test_suites/statsmodels_timeseries.qmd | 1 - docs/validmind/test_suites/summarization.qmd | 1 - docs/validmind/test_suites/tabular_datasets.qmd | 1 - docs/validmind/test_suites/text_data.qmd | 1 - docs/validmind/test_suites/time_series.qmd | 1 - docs/validmind/tests.qmd | 1 - docs/validmind/tests/data_validation.qmd | 1 - docs/validmind/tests/data_validation/ACFandPACFPlot.qmd | 1 - docs/validmind/tests/data_validation/ADF.qmd | 1 - docs/validmind/tests/data_validation/AutoAR.qmd | 1 - docs/validmind/tests/data_validation/AutoMA.qmd | 1 - .../validmind/tests/data_validation/AutoStationarity.qmd | 1 - .../tests/data_validation/BivariateScatterPlots.qmd | 1 - docs/validmind/tests/data_validation/BoxPierce.qmd | 1 - .../tests/data_validation/ChiSquaredFeaturesTable.qmd | 1 - docs/validmind/tests/data_validation/ClassImbalance.qmd | 1 - .../tests/data_validation/DatasetDescription.qmd | 1 - docs/validmind/tests/data_validation/DatasetSplit.qmd | 1 - .../tests/data_validation/DescriptiveStatistics.qmd | 1 - docs/validmind/tests/data_validation/DickeyFullerGLS.qmd | 1 - docs/validmind/tests/data_validation/Duplicates.qmd | 1 - .../tests/data_validation/EngleGrangerCoint.qmd | 1 - .../data_validation/FeatureTargetCorrelationPlot.qmd | 1 - docs/validmind/tests/data_validation/HighCardinality.qmd | 1 - .../tests/data_validation/HighPearsonCorrelation.qmd | 1 - .../tests/data_validation/IQROutliersBarPlot.qmd | 1 - .../validmind/tests/data_validation/IQROutliersTable.qmd | 1 - .../tests/data_validation/IsolationForestOutliers.qmd | 1 - docs/validmind/tests/data_validation/JarqueBera.qmd | 1 - docs/validmind/tests/data_validation/KPSS.qmd | 1 - docs/validmind/tests/data_validation/LJungBox.qmd | 1 - .../tests/data_validation/LaggedCorrelationHeatmap.qmd | 1 - docs/validmind/tests/data_validation/MissingValues.qmd | 1 - .../tests/data_validation/MissingValuesBarPlot.qmd | 1 - .../tests/data_validation/MutualInformation.qmd | 1 - .../tests/data_validation/PearsonCorrelationMatrix.qmd | 1 - .../tests/data_validation/PhillipsPerronArch.qmd | 1 - .../data_validation/ProtectedClassesCombination.qmd | 1 - .../data_validation/ProtectedClassesDescription.qmd | 1 - .../tests/data_validation/ProtectedClassesDisparity.qmd | 1 - .../ProtectedClassesThresholdOptimizer.qmd | 1 - .../validmind/tests/data_validation/RollingStatsPlot.qmd | 1 - docs/validmind/tests/data_validation/RunsTest.qmd | 1 - docs/validmind/tests/data_validation/ScatterPlot.qmd | 1 - .../tests/data_validation/ScoreBandDefaultRates.qmd | 1 - .../tests/data_validation/SeasonalDecompose.qmd | 1 - docs/validmind/tests/data_validation/ShapiroWilk.qmd | 1 - docs/validmind/tests/data_validation/Skewness.qmd | 1 - docs/validmind/tests/data_validation/SpreadPlot.qmd | 1 - .../tests/data_validation/TabularCategoricalBarPlots.qmd | 1 - .../tests/data_validation/TabularDateTimeHistograms.qmd | 1 - .../tests/data_validation/TabularDescriptionTables.qmd | 1 - .../tests/data_validation/TabularNumericalHistograms.qmd | 1 - .../tests/data_validation/TargetRateBarPlots.qmd | 1 - .../tests/data_validation/TimeSeriesDescription.qmd | 1 - .../data_validation/TimeSeriesDescriptiveStatistics.qmd | 1 - .../tests/data_validation/TimeSeriesFrequency.qmd | 1 - .../tests/data_validation/TimeSeriesHistogram.qmd | 1 - .../tests/data_validation/TimeSeriesLinePlot.qmd | 1 - .../tests/data_validation/TimeSeriesMissingValues.qmd | 1 - .../tests/data_validation/TimeSeriesOutliers.qmd | 1 - .../tests/data_validation/TooManyZeroValues.qmd | 1 - docs/validmind/tests/data_validation/UniqueRows.qmd | 1 - docs/validmind/tests/data_validation/WOEBinPlots.qmd | 1 - docs/validmind/tests/data_validation/WOEBinTable.qmd | 1 - .../validmind/tests/data_validation/ZivotAndrewsArch.qmd | 1 - docs/validmind/tests/data_validation/nlp.qmd | 1 - docs/validmind/tests/data_validation/nlp/CommonWords.qmd | 1 - docs/validmind/tests/data_validation/nlp/Hashtags.qmd | 1 - .../tests/data_validation/nlp/LanguageDetection.qmd | 1 - docs/validmind/tests/data_validation/nlp/Mentions.qmd | 1 - .../data_validation/nlp/PolarityAndSubjectivity.qmd | 1 - .../validmind/tests/data_validation/nlp/Punctuations.qmd | 1 - docs/validmind/tests/data_validation/nlp/Sentiment.qmd | 1 - docs/validmind/tests/data_validation/nlp/StopWords.qmd | 1 - .../tests/data_validation/nlp/TextDescription.qmd | 1 - docs/validmind/tests/data_validation/nlp/Toxicity.qmd | 1 - docs/validmind/tests/model_validation.qmd | 1 - docs/validmind/tests/model_validation/BertScore.qmd | 1 - docs/validmind/tests/model_validation/BleuScore.qmd | 1 - .../tests/model_validation/ClusterSizeDistribution.qmd | 1 - .../tests/model_validation/ContextualRecall.qmd | 1 - docs/validmind/tests/model_validation/FeaturesAUC.qmd | 1 - docs/validmind/tests/model_validation/MeteorScore.qmd | 1 - docs/validmind/tests/model_validation/ModelMetadata.qmd | 1 - .../tests/model_validation/ModelPredictionResiduals.qmd | 1 - docs/validmind/tests/model_validation/RegardScore.qmd | 1 - .../tests/model_validation/RegressionResidualsPlot.qmd | 1 - docs/validmind/tests/model_validation/RougeScore.qmd | 1 - .../model_validation/TimeSeriesPredictionWithCI.qmd | 1 - .../tests/model_validation/TimeSeriesPredictionsPlot.qmd | 1 - .../model_validation/TimeSeriesR2SquareBySegments.qmd | 1 - docs/validmind/tests/model_validation/TokenDisparity.qmd | 1 - docs/validmind/tests/model_validation/ToxicityScore.qmd | 1 - docs/validmind/tests/model_validation/sklearn.qmd | 1 - .../sklearn/AdjustedMutualInformation.qmd | 1 - .../tests/model_validation/sklearn/AdjustedRandIndex.qmd | 1 - .../tests/model_validation/sklearn/CalibrationCurve.qmd | 1 - .../model_validation/sklearn/ClassifierPerformance.qmd | 1 - .../sklearn/ClassifierThresholdOptimization.qmd | 1 - .../model_validation/sklearn/ClusterCosineSimilarity.qmd | 1 - .../sklearn/ClusterPerformanceMetrics.qmd | 1 - .../tests/model_validation/sklearn/CompletenessScore.qmd | 1 - .../tests/model_validation/sklearn/ConfusionMatrix.qmd | 1 - .../tests/model_validation/sklearn/FeatureImportance.qmd | 1 - .../model_validation/sklearn/FowlkesMallowsScore.qmd | 1 - .../tests/model_validation/sklearn/HomogeneityScore.qmd | 1 - .../model_validation/sklearn/HyperParametersTuning.qmd | 1 - .../sklearn/KMeansClustersOptimization.qmd | 1 - .../tests/model_validation/sklearn/MinimumAccuracy.qmd | 1 - .../tests/model_validation/sklearn/MinimumF1Score.qmd | 1 - .../model_validation/sklearn/MinimumROCAUCScore.qmd | 1 - .../tests/model_validation/sklearn/ModelParameters.qmd | 1 - .../sklearn/ModelsPerformanceComparison.qmd | 1 - .../tests/model_validation/sklearn/OverfitDiagnosis.qmd | 1 - .../sklearn/PermutationFeatureImportance.qmd | 1 - .../sklearn/PopulationStabilityIndex.qmd | 1 - .../model_validation/sklearn/PrecisionRecallCurve.qmd | 1 - .../tests/model_validation/sklearn/ROCCurve.qmd | 1 - .../tests/model_validation/sklearn/RegressionErrors.qmd | 1 - .../sklearn/RegressionErrorsComparison.qmd | 1 - .../model_validation/sklearn/RegressionPerformance.qmd | 1 - .../model_validation/sklearn/RegressionR2Square.qmd | 1 - .../sklearn/RegressionR2SquareComparison.qmd | 1 - .../model_validation/sklearn/RobustnessDiagnosis.qmd | 1 - .../model_validation/sklearn/SHAPGlobalImportance.qmd | 1 - .../sklearn/ScoreProbabilityAlignment.qmd | 1 - .../tests/model_validation/sklearn/SilhouettePlot.qmd | 1 - .../model_validation/sklearn/TrainingTestDegradation.qmd | 1 - .../tests/model_validation/sklearn/VMeasure.qmd | 1 - .../model_validation/sklearn/WeakspotsDiagnosis.qmd | 1 - docs/validmind/tests/model_validation/statsmodels.qmd | 1 - .../tests/model_validation/statsmodels/AutoARIMA.qmd | 1 - .../statsmodels/CumulativePredictionProbabilities.qmd | 1 - .../model_validation/statsmodels/DurbinWatsonTest.qmd | 1 - .../tests/model_validation/statsmodels/GINITable.qmd | 1 - .../model_validation/statsmodels/KolmogorovSmirnov.qmd | 1 - .../tests/model_validation/statsmodels/Lilliefors.qmd | 1 - .../statsmodels/PredictionProbabilitiesHistogram.qmd | 1 - .../model_validation/statsmodels/RegressionCoeffs.qmd | 1 - .../statsmodels/RegressionFeatureSignificance.qmd | 1 - .../statsmodels/RegressionModelForecastPlot.qmd | 1 - .../statsmodels/RegressionModelForecastPlotLevels.qmd | 1 - .../statsmodels/RegressionModelSensitivityPlot.qmd | 1 - .../statsmodels/RegressionModelSummary.qmd | 1 - .../RegressionPermutationFeatureImportance.qmd | 1 - .../model_validation/statsmodels/ScorecardHistogram.qmd | 1 - .../tests/model_validation/statsmodels/statsutils.qmd | 1 - docs/validmind/tests/prompt_validation.qmd | 1 - docs/validmind/tests/prompt_validation/Bias.qmd | 1 - docs/validmind/tests/prompt_validation/Clarity.qmd | 1 - docs/validmind/tests/prompt_validation/Conciseness.qmd | 1 - docs/validmind/tests/prompt_validation/Delimitation.qmd | 1 - .../tests/prompt_validation/NegativeInstruction.qmd | 1 - docs/validmind/tests/prompt_validation/Robustness.qmd | 1 - docs/validmind/tests/prompt_validation/Specificity.qmd | 1 - .../tests/prompt_validation/ai_powered_test.qmd | 1 - docs/validmind/unit_metrics.qmd | 1 - docs/validmind/vm_models.qmd | 1 - 185 files changed, 2 insertions(+), 199 deletions(-) diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml index 5dd087e4e..b2eef1113 100644 --- a/docs/_sidebar.yml +++ b/docs/_sidebar.yml @@ -2,8 +2,6 @@ website: sidebar: - contents: # Root level functions from validmind.qmd - - text: "Python API" - file: validmind.qmd#python-api - text: "__version__" file: validmind.qmd#__version__ - text: "get_test_suite()" diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index 30dcdcc37..5598e0b2e 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -59,16 +59,13 @@ def {{ member.name }}( {% endif %} {% endfor %} -{% if has_modules.value and module.name == "validmind" %} -## Submodules - -{% endif %} - +{% if not is_root %} {% for member in module.members | sort_members %} {% if is_public(member, module, full_data, is_root) and member.kind == "module" %} - [{{ member.name }}]({{ module.name }}/{{ member.name }}.qmd) {% endif %} {% endfor %} +{% endif %} {# List classes and functions #} {% for member in module.members | sort_members %} diff --git a/docs/templates/sidebar.qmd.jinja2 b/docs/templates/sidebar.qmd.jinja2 index 5df38ba33..ef4fcc25c 100644 --- a/docs/templates/sidebar.qmd.jinja2 +++ b/docs/templates/sidebar.qmd.jinja2 @@ -2,8 +2,6 @@ website: sidebar: - contents: # Root level functions from validmind.qmd - - text: "Python API" - file: validmind.qmd#python-api {% if module.members.__version__ %} - text: "__version__" file: validmind.qmd#__version__ diff --git a/docs/validmind.qmd b/docs/validmind.qmd index e9610415a..b8651387b 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -446,14 +446,5 @@ as the metric's description. -## Submodules - - -- [datasets](validmind/datasets.qmd) -- [errors](validmind/errors.qmd) -- [test_suites](validmind/test_suites.qmd) -- [tests](validmind/tests.qmd) -- [unit_metrics](validmind/unit_metrics.qmd) -- [vm_models](validmind/vm_models.qmd) \ No newline at end of file diff --git a/docs/validmind/datasets.qmd b/docs/validmind/datasets.qmd index 31d92e519..31d421de7 100644 --- a/docs/validmind/datasets.qmd +++ b/docs/validmind/datasets.qmd @@ -12,7 +12,6 @@ Example datasets that can be used with the ValidMind Library. - - [classification](datasets/classification.qmd) - [credit_risk](datasets/credit_risk.qmd) - [nlp](datasets/nlp.qmd) diff --git a/docs/validmind/datasets/classification.qmd b/docs/validmind/datasets/classification.qmd index 4809d587c..b2e4ca3c8 100644 --- a/docs/validmind/datasets/classification.qmd +++ b/docs/validmind/datasets/classification.qmd @@ -12,7 +12,6 @@ Entrypoint for classification datasets. - - [customer_churn](classification/customer_churn.qmd) - [taiwan_credit](classification/taiwan_credit.qmd) diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index 8570b7b90..14cc6a9b6 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### get_demo_test_config diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index 2a7600e8e..055ef52a1 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### load_data diff --git a/docs/validmind/datasets/credit_risk.qmd b/docs/validmind/datasets/credit_risk.qmd index be844f42b..b1f9cf0f5 100644 --- a/docs/validmind/datasets/credit_risk.qmd +++ b/docs/validmind/datasets/credit_risk.qmd @@ -12,7 +12,6 @@ Entrypoint for credit risk datasets. - - [lending_club](credit_risk/lending_club.qmd) - [lending_club_bias](credit_risk/lending_club_bias.qmd) diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index f092213e0..597d9b56e 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### compute_scores diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 6b26244a1..df2ed96af 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### compute_scores diff --git a/docs/validmind/datasets/nlp.qmd b/docs/validmind/datasets/nlp.qmd index 2264d70fa..9e567160b 100644 --- a/docs/validmind/datasets/nlp.qmd +++ b/docs/validmind/datasets/nlp.qmd @@ -12,7 +12,6 @@ Example datasets that can be used with the ValidMind Library. - - [cnn_dailymail](nlp/cnn_dailymail.qmd) - [twitter_covid_19](nlp/twitter_covid_19.qmd) diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index 09ac0fa7a..048cf1757 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### display_nice Primary function to format and display a DataFrame. diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index 88c409013..cda838843 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### load_data \ No newline at end of file diff --git a/docs/validmind/datasets/regression.qmd b/docs/validmind/datasets/regression.qmd index aefd059fd..debd4a605 100644 --- a/docs/validmind/datasets/regression.qmd +++ b/docs/validmind/datasets/regression.qmd @@ -12,7 +12,6 @@ Entrypoint for regression datasets - - [fred](regression/fred.qmd) - [lending_club](regression/lending_club.qmd) diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index 0e99a666a..6fdb1f455 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### load_all_data diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 387fd6a33..2a5a35f7e 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### load_data diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index 3f6c66e7c..bd4a51009 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -19,7 +19,6 @@ The following base errors are defined for others: - #### raise_api_error Safely try to parse JSON from the response message in case the API diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index f0dee525a..24015a392 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -12,7 +12,6 @@ Entrypoint for test suites. - - [classifier](test_suites/classifier.qmd) - [cluster](test_suites/cluster.qmd) - [embeddings](test_suites/embeddings.qmd) diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index 08d6f6740..432763fed 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -16,7 +16,6 @@ custom test suite from the project's configuration - ### Class: ClassifierDiagnosis diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index b682d2fbd..e6ddc7afb 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -16,7 +16,6 @@ custom test suite from the project's configuration - ### Class: ClusterFullSuite diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index 71dd73a3a..5068bd1db 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -17,7 +17,6 @@ custom test suite from the project's configuration - ### Class: EmbeddingsFullSuite Full test suite for embeddings models. diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index a74c005b4..9c3ca234c 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -13,7 +13,6 @@ Test suites for LLMs - ### Class: LLMClassifierFullSuite diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index e61d1a767..d7297d2b9 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -13,7 +13,6 @@ Test suites for NLP models - ### Class: NLPClassifierFullSuite diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index c7b290552..f6cce669a 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -17,7 +17,6 @@ custom test suite from the project's configuration - ### Class: KmeansParametersOptimization Test suite for sklearn hyperparameters optimization diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index 83305745d..d1f24012f 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - ### Class: RegressionFullSuite diff --git a/docs/validmind/test_suites/statsmodels_timeseries.qmd b/docs/validmind/test_suites/statsmodels_timeseries.qmd index 1e8ed79bd..a622693b0 100644 --- a/docs/validmind/test_suites/statsmodels_timeseries.qmd +++ b/docs/validmind/test_suites/statsmodels_timeseries.qmd @@ -14,7 +14,6 @@ Time Series Test Suites from statsmodels - ### Class: RegressionModelDescription Test suite for performance metric of regression model of statsmodels library diff --git a/docs/validmind/test_suites/summarization.qmd b/docs/validmind/test_suites/summarization.qmd index d3f5d2605..61b60eed5 100644 --- a/docs/validmind/test_suites/summarization.qmd +++ b/docs/validmind/test_suites/summarization.qmd @@ -14,7 +14,6 @@ Test suites for llm summarization models - ### Class: SummarizationMetrics Test suite for Summarization metrics diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd index 0f0d8e0d4..f44004435 100644 --- a/docs/validmind/test_suites/tabular_datasets.qmd +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -14,7 +14,6 @@ Test suites for tabular datasets - ### Class: TabularDataQuality Test suite for data quality on tabular datasets diff --git a/docs/validmind/test_suites/text_data.qmd b/docs/validmind/test_suites/text_data.qmd index d6273c441..2a5157acb 100644 --- a/docs/validmind/test_suites/text_data.qmd +++ b/docs/validmind/test_suites/text_data.qmd @@ -14,7 +14,6 @@ Test suites for text datasets - ### Class: TextDataQuality Test suite for data quality on text data diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index e5d48a9ad..095abc2da 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -13,7 +13,6 @@ Time Series Test Suites - ### Class: TimeSeriesDataQuality diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 725909b7b..6c9a82efc 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -12,7 +12,6 @@ ValidMind Tests Module - - [data_validation](tests/data_validation.qmd) - [model_validation](tests/model_validation.qmd) - [prompt_validation](tests/prompt_validation.qmd) diff --git a/docs/validmind/tests/data_validation.qmd b/docs/validmind/tests/data_validation.qmd index 27e2d42fd..4bc8891db 100644 --- a/docs/validmind/tests/data_validation.qmd +++ b/docs/validmind/tests/data_validation.qmd @@ -7,7 +7,6 @@ toc-expand: 3 - - [ACFandPACFPlot](data_validation/ACFandPACFPlot.qmd) - [ADF](data_validation/ADF.qmd) - [AutoAR](data_validation/AutoAR.qmd) diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 0b8dce1ee..ea5a768dc 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### ACFandPACFPlot Analyzes time series data using Autocorrelation Function (ACF) and Partial Autocorrelation Function (PACF) plots to diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 06454d25d..6d61c6388 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### ADF diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 3eba578db..f47cddc1b 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### AutoAR diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index efd993384..0f2c2a729 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### AutoMA diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 0761ecebe..97e500fe6 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### AutoStationarity Automates Augmented Dickey-Fuller test to assess stationarity across multiple time series in a DataFrame. diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 7632f2804..2762fc5e0 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### BivariateScatterPlots Generates bivariate scatterplots to visually inspect relationships between pairs of numerical predictor variables diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index 159b5f0d6..b0d914fbf 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### BoxPierce Detects autocorrelation in time-series data through the Box-Pierce test to validate model performance. diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 04445f626..0a277449e 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### ChiSquaredFeaturesTable diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 3046e9fb9..d3f7c2778 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -13,7 +13,6 @@ Threshold based tests - #### ClassImbalance diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index f86b1981b..401c02587 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### DatasetDescription diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index e34784f17..7a9890877 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### DatasetSplit Evaluates and visualizes the distribution proportions among training, testing, and validation datasets of an ML diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 4bf91fda1..fa1288777 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### DescriptiveStatistics diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 3f2088685..e80f2e0b8 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### DickeyFullerGLS diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 5f15517eb..d8bcea60c 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### Duplicates Tests dataset for duplicate entries, ensuring model reliability via data quality verification. diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 7faee8613..4811154cf 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### EngleGrangerCoint diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 52d83f76a..bf44879cd 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### FeatureTargetCorrelationPlot Visualizes the correlation between input features and the model's target output in a color-coded horizontal bar diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 0f0dd3bd1..894a84954 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### HighCardinality Assesses the number of unique values in categorical columns to detect high cardinality and potential overfitting. diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index f99428452..abd740061 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### HighPearsonCorrelation Identifies highly correlated feature pairs in a dataset suggesting feature redundancy or multicollinearity. diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 8f65694bf..0e6bb2112 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### compute_outliers diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index fa9291ab3..527425301 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### compute_outliers diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index 2f7dd7d0d..e9c624070 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### IsolationForestOutliers Detects outliers in a dataset using the Isolation Forest algorithm and visualizes results through scatter plots. diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index eb06d740a..4ca41b5c1 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### JarqueBera Assesses normality of dataset features in an ML model using the Jarque-Bera test. diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index b760bc7e0..3d9c0b0c8 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### KPSS diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 346c6efae..31e26122c 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### LJungBox Assesses autocorrelations in dataset features by performing a Ljung-Box test on each feature. diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index 0df76c3a0..9679dcdd5 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### LaggedCorrelationHeatmap Assesses and visualizes correlation between target variable and lagged independent variables in a time-series diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index d38126d49..9698ebfc2 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### MissingValues Evaluates dataset quality by ensuring missing value ratio across all features does not exceed a set threshold. diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 20541f15f..a357b03ba 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### MissingValuesBarPlot Assesses the percentage and distribution of missing values in the dataset via a bar plot, with emphasis on diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index c4fbbe305..50db462a2 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### MutualInformation Calculates mutual information scores between features and target variable to evaluate feature relevance. diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index 459fea14d..db7a7afd4 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### PearsonCorrelationMatrix Evaluates linear dependency between numerical variables in a dataset via a Pearson Correlation coefficient heat map. diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index bce49f563..330df447d 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### PhillipsPerronArch diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 82110988c..6cc8cdde5 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### ProtectedClassesCombination diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index 629646290..edf96154c 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### ProtectedClassesDescription diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 54f0302ed..1c79ed106 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### ProtectedClassesDisparity diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 41160a780..771c05359 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### calculate_fairness_metrics diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 419669205..f32ba9822 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### plot_rolling_statistics diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 6f140676a..5393ac7fb 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### RunsTest Executes Runs Test on ML model to detect non-random patterns in output data sequence. diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 997084d33..71b8ea593 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### ScatterPlot Assesses visual relationships, patterns, and outliers among features in a dataset through scatter plot matrices. diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 91363aeb6..e1ef6550f 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### ScoreBandDefaultRates Analyzes default rates and population distribution across credit score bands. diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 594c9ed0f..70a952885 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### SeasonalDecompose diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 5ebbd0495..01655b8d4 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### ShapiroWilk Evaluates feature-wise normality of training data using the Shapiro-Wilk test. diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index 2c30f0873..dc1a76afe 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### Skewness Evaluates the skewness of numerical data in a dataset to check against a defined threshold, aiming to ensure data diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 460a49074..5fa844594 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### SpreadPlot diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 78a13b58f..21f58379f 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### TabularCategoricalBarPlots diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index d5e4469e1..23ccf74a0 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### TabularDateTimeHistograms diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 19c901596..0e2622b19 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### get_categorical_columns diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 0e3babf0e..dc99711fa 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### TabularNumericalHistograms Generates histograms for each numerical feature in a dataset to provide visual insights into data distribution and diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 844ddefde..99c93f45d 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### TargetRateBarPlots diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index dbad2b87e..6eeaa248f 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### TimeSeriesDescription Generates a detailed analysis for the provided time series dataset, summarizing key statistics to identify trends, diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index d81f1a083..abb695874 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### TimeSeriesDescriptiveStatistics Evaluates the descriptive statistics of a time series dataset to identify trends, patterns, and data quality issues. diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index d56a3fd01..183ac6091 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### TimeSeriesFrequency diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index ee4fd6f11..5d24e92c8 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### TimeSeriesHistogram diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 194d113a9..34e544381 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### TimeSeriesLinePlot diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 7eff046d4..f5e56962e 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### TimeSeriesMissingValues diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 921071795..a3d7dabeb 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### TimeSeriesOutliers diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index d9a9af183..5cf75ff1a 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### TooManyZeroValues Identifies numerical columns in a dataset that contain an excessive number of zero values, defined by a threshold diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 09cbdaae5..750b954fe 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### UniqueRows Verifies the diversity of the dataset by ensuring that the count of unique rows exceeds a prescribed threshold. diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 53c747b45..895f6e5cc 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### WOEBinPlots diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index c786f6b22..e1f7e6331 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### WOEBinTable diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 0ce99fac6..51ddaf4d0 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### ZivotAndrewsArch diff --git a/docs/validmind/tests/data_validation/nlp.qmd b/docs/validmind/tests/data_validation/nlp.qmd index 801db56be..0be8e581a 100644 --- a/docs/validmind/tests/data_validation/nlp.qmd +++ b/docs/validmind/tests/data_validation/nlp.qmd @@ -7,7 +7,6 @@ toc-expand: 3 - - [CommonWords](nlp/CommonWords.qmd) - [Hashtags](nlp/Hashtags.qmd) - [LanguageDetection](nlp/LanguageDetection.qmd) diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index fd015eedb..c11f0ede2 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### CommonWords Assesses the most frequent non-stopwords in a text column for identifying prevalent language patterns. diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index b3f20dd42..b0c89d39d 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### Hashtags diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 15f2a6e01..1f8c33e68 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### LanguageDetection Assesses the diversity of languages in a textual dataset by detecting and visualizing the distribution of languages. diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 38dbb3583..6b3d7cbc0 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### Mentions diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index add3bf42e..0d0e948cb 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### PolarityAndSubjectivity Analyzes the polarity and subjectivity of text data within a given dataset to visualize the sentiment distribution. diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index cc9c5e077..bc9665d9f 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -14,7 +14,6 @@ Metrics functions for any Pandas-compatible datasets - #### Punctuations Analyzes and visualizes the frequency distribution of punctuation usage in a given text dataset. diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index 16f38efa1..4487f09b9 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### Sentiment Analyzes the sentiment of text data within a dataset using the VADER sentiment analysis tool. diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index 2df75e1c7..ed9596c6b 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -14,7 +14,6 @@ Threshold based tests - #### StopWords Evaluates and visualizes the frequency of English stop words in a text dataset against a defined threshold. diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 3af4431dc..ede40f805 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### create_metrics_df diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index 1303357d9..16eb268cd 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### Toxicity Assesses the toxicity of text data within a dataset to visualize the distribution of toxicity scores. diff --git a/docs/validmind/tests/model_validation.qmd b/docs/validmind/tests/model_validation.qmd index d601632b5..9ac235ec6 100644 --- a/docs/validmind/tests/model_validation.qmd +++ b/docs/validmind/tests/model_validation.qmd @@ -7,7 +7,6 @@ toc-expand: 3 - - [BertScore](model_validation/BertScore.qmd) - [BleuScore](model_validation/BleuScore.qmd) - [ClusterSizeDistribution](model_validation/ClusterSizeDistribution.qmd) diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 20260e949..308b7d855 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### BertScore diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index f345e3738..1debd1662 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### BleuScore diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index f54e92af8..a538d0b18 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### ClusterSizeDistribution Assesses the performance of clustering models by comparing the distribution of cluster sizes in model predictions diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index dfbf29d63..8d5b8d226 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### ContextualRecall diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 36f256770..ba77efe79 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### FeaturesAUC diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 373c4739f..6d4d3d0a6 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### MeteorScore diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index aa2d1e6d9..e64531bb4 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### ModelMetadata diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index a4c41dd4f..8233194a2 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### ModelPredictionResiduals Assesses normality and behavior of residuals in regression models through visualization and statistical tests. diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 59f20505b..8283888a8 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### RegardScore diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index d4891511e..3ca74aac3 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### RegressionResidualsPlot Evaluates regression model performance using residual distribution and actual vs. predicted plots. diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index f09c046cc..c7118e1a3 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### RougeScore Assesses the quality of machine-generated text using ROUGE metrics and visualizes the results to provide diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index ca51879c8..a36e01b84 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### TimeSeriesPredictionWithCI Assesses predictive accuracy and uncertainty in time series models, highlighting breaches beyond confidence diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index 76dc9e739..6b7b0ae11 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### TimeSeriesPredictionsPlot Plot actual vs predicted values for time series data and generate a visual comparison for the model. diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index a8a8ef972..a44764a9c 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### TimeSeriesR2SquareBySegments Evaluates the R-Squared values of regression models over specified time segments in time series data to assess diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index 84b0ee095..2c87e361f 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### TokenDisparity Evaluates the token disparity between reference and generated texts, visualizing the results through histograms and diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index 1dbcd08b7..948f5b7ca 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### ToxicityScore Assesses the toxicity levels of texts generated by NLP models to identify and mitigate harmful or offensive content. diff --git a/docs/validmind/tests/model_validation/sklearn.qmd b/docs/validmind/tests/model_validation/sklearn.qmd index 1ef978947..7d7b14374 100644 --- a/docs/validmind/tests/model_validation/sklearn.qmd +++ b/docs/validmind/tests/model_validation/sklearn.qmd @@ -7,7 +7,6 @@ toc-expand: 3 - - [AdjustedMutualInformation](sklearn/AdjustedMutualInformation.qmd) - [AdjustedRandIndex](sklearn/AdjustedRandIndex.qmd) - [CalibrationCurve](sklearn/CalibrationCurve.qmd) diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 0b5acb6d3..4de26dcb3 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### AdjustedMutualInformation Evaluates clustering model performance by measuring mutual information between true and predicted labels, adjusting diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index b56aa735b..cd65924ff 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### AdjustedRandIndex Measures the similarity between two data clusters using the Adjusted Rand Index (ARI) metric in clustering machine diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 10274f9fb..53c4effae 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### CalibrationCurve Evaluates the calibration of probability estimates by comparing predicted probabilities against observed diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index b25b3fb1a..aeaec3b40 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### ClassifierPerformance Evaluates performance of binary or multiclass classification models using precision, recall, F1-Score, accuracy, diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 7cfe20b19..0d3c14699 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### ClassifierThresholdOptimization Analyzes and visualizes different threshold optimization methods for binary classification models. diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index d0b7fbb10..cd4dd927e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### ClusterCosineSimilarity diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index ca9ff1f44..89cca65de 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### ClusterPerformanceMetrics Evaluates the performance of clustering machine learning models using multiple established metrics. diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index f55315cff..30d77f339 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### CompletenessScore Evaluates a clustering model's capacity to categorize instances from a single class into the same cluster. diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index f952c3baa..849035b19 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### ConfusionMatrix Evaluates and visually represents the classification ML model's predictive performance using a Confusion Matrix diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 10aacc158..acd32db62 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### FeatureImportance Compute feature importance scores for a given model and generate a summary table diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 90bf896e5..b8a2c83c1 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### FowlkesMallowsScore Evaluates the similarity between predicted and actual cluster assignments in a model using the Fowlkes-Mallows diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 0902c8b8c..78aeeb23a 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### HomogeneityScore Assesses clustering homogeneity by comparing true and predicted labels, scoring from 0 (heterogeneous) to 1 diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index d0e3e2709..9dd233063 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### custom_recall diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 6405c76fe..0989e402b 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### KMeansClustersOptimization diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index db875c8ea..4b4013246 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### MinimumAccuracy Checks if the model's prediction accuracy meets or surpasses a specified threshold. diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index f18b1b9b8..6c9823efc 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### MinimumF1Score Assesses if the model's F1 score on the validation set meets a predefined minimum threshold, ensuring balanced diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index ef03d10c0..8dd2b562b 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### MinimumROCAUCScore Validates model by checking if the ROC AUC score meets or surpasses a specified threshold. diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 9c8194b8f..8381bfdfc 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### ModelParameters Extracts and displays model parameters in a structured format for transparency and reproducibility. diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 7e44554c6..58877b565 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### ModelsPerformanceComparison diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index eb72992ba..8b184569c 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### OverfitDiagnosis diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index f18ae7c05..71b2aa6e2 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### PermutationFeatureImportance diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 1b6132648..19f79474f 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### calculate_psi diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 84054e37c..d776d7bf5 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### PrecisionRecallCurve diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 59668a3e1..56023e841 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### ROCCurve diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index 049bb5c28..d229ac0dc 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### RegressionErrors Assesses the performance and error distribution of a regression model using various error metrics. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index d54a0e8b1..ac2e97862 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### RegressionErrorsComparison diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 23812e9d0..12bacfbf5 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### RegressionPerformance diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index deb11ea20..733696e39 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### RegressionR2Square diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 3fb45c9f8..c8e8e2ce9 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### RegressionR2SquareComparison diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index c6808fb66..e9bf9904f 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### RobustnessDiagnosis diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 6be392de8..757573c1b 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### generate_shap_plot diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index b9c0611c1..9f0b4b495 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### ScoreProbabilityAlignment Analyzes the alignment between credit scores and predicted probabilities. diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index b205ca782..3b7fb9bc3 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### SilhouettePlot Calculates and visualizes Silhouette Score, assessing the degree of data point suitability to its cluster in ML diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index cdd6d33fe..cb97cb9d2 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### TrainingTestDegradation Tests if model performance degradation between training and test datasets exceeds a predefined threshold. diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 889f926ad..025e62a55 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### VMeasure Evaluates homogeneity and completeness of a clustering model using the V Measure Score. diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 09b7148b3..f37272032 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### WeakspotsDiagnosis Identifies and visualizes weak spots in a machine learning model's performance across various sections of the diff --git a/docs/validmind/tests/model_validation/statsmodels.qmd b/docs/validmind/tests/model_validation/statsmodels.qmd index 196678419..e640e5540 100644 --- a/docs/validmind/tests/model_validation/statsmodels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels.qmd @@ -7,7 +7,6 @@ toc-expand: 3 - - [AutoARIMA](statsmodels/AutoARIMA.qmd) - [CumulativePredictionProbabilities](statsmodels/CumulativePredictionProbabilities.qmd) - [DurbinWatsonTest](statsmodels/DurbinWatsonTest.qmd) diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 8e04e42d6..c3c5f2447 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### AutoARIMA diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index dcf60fa73..08cb3426b 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### CumulativePredictionProbabilities Visualizes cumulative probabilities of positive and negative classes for both training and testing in classification models. diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 01dd32ebe..133bf3aa7 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### DurbinWatsonTest Assesses autocorrelation in time series data features using the Durbin-Watson statistic. diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index aed2c4bb2..4f0e02cdd 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### GINITable Evaluates classification model performance using AUC, GINI, and KS metrics for training and test datasets. diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 28cf08e87..6d7863cb2 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### KolmogorovSmirnov diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 731f2bd78..8312f5b2d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### Lilliefors Assesses the normality of feature distributions in an ML model's training dataset using the Lilliefors test. diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index a1ee08730..4d52c026c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### PredictionProbabilitiesHistogram Assesses the predictive probability distribution for binary classification to evaluate model performance and diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 6b75765a5..0c93d0b89 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### RegressionCoeffs diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 0a1db1c25..e7f59f083 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### RegressionFeatureSignificance diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 89306e553..5a64016c3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### RegressionModelForecastPlot diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 72291adf4..3e531f48c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### integrate_diff diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index b408e298a..96ec87bad 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### integrate_diff diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 5e51f4769..d2c528ec1 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### RegressionModelSummary diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index e62194323..8e434cb70 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### RegressionPermutationFeatureImportance diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index 574eda508..fa82bf820 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### ScorecardHistogram The Scorecard Histogram test evaluates the distribution of credit scores between default and non-default instances, diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index a815eb803..1dfd8b3c4 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### adj_r2_score Adjusted R2 Score diff --git a/docs/validmind/tests/prompt_validation.qmd b/docs/validmind/tests/prompt_validation.qmd index 442a5f143..3b88e88ea 100644 --- a/docs/validmind/tests/prompt_validation.qmd +++ b/docs/validmind/tests/prompt_validation.qmd @@ -7,7 +7,6 @@ toc-expand: 3 - - [ai_powered_test](prompt_validation/ai_powered_test.qmd) - [Bias](prompt_validation/Bias.qmd) - [Clarity](prompt_validation/Clarity.qmd) diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index ff66fb117..ee3da7cec 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### Bias diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index d870ee3b0..e004412ed 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### Clarity diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 15ffb9681..2469ee5b6 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### Conciseness diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index d6fb54547..dde1d56af 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### Delimitation diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index d97ad58f4..f583243e0 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### NegativeInstruction diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 181c34d52..963b62e03 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### Robustness diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 1f6c247ef..2caa578ad 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -8,7 +8,6 @@ toc-expand: 3 - #### Specificity diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index 72ae98c8e..a12f2301d 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### call_model Call LLM with the given prompts and return the response diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 1a70bbbfe..419f66214 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -9,7 +9,6 @@ toc-expand: 3 - #### describe_metric Describe a metric diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 74a548889..7b160b2e6 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -13,5 +13,4 @@ Models entrypoint - \ No newline at end of file From c728bcfe9c28966e1a064b0b7073371d437a36f0 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Mon, 27 Jan 2025 07:27:10 -0800 Subject: [PATCH 012/207] Partially fix nested sidebar entries --- docs/_sidebar.yml | 198 ++++++++++++++++++ docs/templates/function.qmd.jinja2 | 15 +- docs/templates/sidebar.qmd.jinja2 | 39 +++- .../classification/customer_churn.qmd | 15 ++ .../datasets/classification/taiwan_credit.qmd | 10 + .../datasets/credit_risk/lending_club.qmd | 59 ++++++ .../credit_risk/lending_club_bias.qmd | 21 ++ docs/validmind/datasets/nlp/cnn_dailymail.qmd | 12 ++ .../datasets/nlp/twitter_covid_19.qmd | 5 + docs/validmind/datasets/regression/fred.qmd | 44 ++++ .../datasets/regression/lending_club.qmd | 19 ++ docs/validmind/errors.qmd | 12 +- docs/validmind/test_suites.qmd | 22 ++ docs/validmind/tests.qmd | 8 +- .../tests/data_validation/ACFandPACFPlot.qmd | 5 + docs/validmind/tests/data_validation/ADF.qmd | 5 + .../tests/data_validation/AutoAR.qmd | 6 + .../tests/data_validation/AutoMA.qmd | 6 + .../data_validation/AutoStationarity.qmd | 7 + .../data_validation/BivariateScatterPlots.qmd | 5 + .../tests/data_validation/BoxPierce.qmd | 5 + .../ChiSquaredFeaturesTable.qmd | 6 + .../tests/data_validation/ClassImbalance.qmd | 8 +- .../data_validation/DatasetDescription.qmd | 29 +++ .../tests/data_validation/DatasetSplit.qmd | 5 + .../data_validation/DescriptiveStatistics.qmd | 17 ++ .../tests/data_validation/DickeyFullerGLS.qmd | 5 + .../tests/data_validation/Duplicates.qmd | 6 + .../data_validation/EngleGrangerCoint.qmd | 6 + .../FeatureTargetCorrelationPlot.qmd | 6 + .../tests/data_validation/HighCardinality.qmd | 8 + .../HighPearsonCorrelation.qmd | 8 + .../data_validation/IQROutliersBarPlot.qmd | 13 ++ .../data_validation/IQROutliersTable.qmd | 12 ++ .../IsolationForestOutliers.qmd | 8 + .../tests/data_validation/JarqueBera.qmd | 5 + docs/validmind/tests/data_validation/KPSS.qmd | 5 + .../tests/data_validation/LJungBox.qmd | 5 + .../LaggedCorrelationHeatmap.qmd | 6 + .../tests/data_validation/MissingValues.qmd | 6 + .../data_validation/MissingValuesBarPlot.qmd | 7 + .../data_validation/MutualInformation.qmd | 7 + .../PearsonCorrelationMatrix.qmd | 5 + .../data_validation/PhillipsPerronArch.qmd | 5 + .../ProtectedClassesCombination.qmd | 7 + .../ProtectedClassesDescription.qmd | 6 + .../ProtectedClassesDisparity.qmd | 9 + .../ProtectedClassesThresholdOptimizer.qmd | 50 +++++ .../data_validation/RollingStatsPlot.qmd | 13 ++ .../tests/data_validation/RunsTest.qmd | 5 + .../tests/data_validation/ScatterPlot.qmd | 5 + .../data_validation/ScoreBandDefaultRates.qmd | 8 + .../data_validation/SeasonalDecompose.qmd | 6 + .../tests/data_validation/ShapiroWilk.qmd | 5 + .../tests/data_validation/Skewness.qmd | 6 + .../tests/data_validation/SpreadPlot.qmd | 5 + .../TabularCategoricalBarPlots.qmd | 5 + .../TabularDateTimeHistograms.qmd | 5 + .../TabularDescriptionTables.qmd | 38 ++++ .../TabularNumericalHistograms.qmd | 5 + .../data_validation/TargetRateBarPlots.qmd | 5 + .../data_validation/TimeSeriesDescription.qmd | 5 + .../TimeSeriesDescriptiveStatistics.qmd | 5 + .../data_validation/TimeSeriesFrequency.qmd | 5 + .../data_validation/TimeSeriesHistogram.qmd | 6 + .../data_validation/TimeSeriesLinePlot.qmd | 5 + .../TimeSeriesMissingValues.qmd | 6 + .../data_validation/TimeSeriesOutliers.qmd | 6 + .../data_validation/TooManyZeroValues.qmd | 6 + .../tests/data_validation/UniqueRows.qmd | 6 + .../tests/data_validation/WOEBinPlots.qmd | 8 + .../tests/data_validation/WOEBinTable.qmd | 6 + .../data_validation/ZivotAndrewsArch.qmd | 5 + .../tests/data_validation/nlp/CommonWords.qmd | 5 + .../tests/data_validation/nlp/Hashtags.qmd | 6 + .../data_validation/nlp/LanguageDetection.qmd | 5 + .../tests/data_validation/nlp/Mentions.qmd | 6 + .../nlp/PolarityAndSubjectivity.qmd | 7 + .../data_validation/nlp/Punctuations.qmd | 6 + .../tests/data_validation/nlp/Sentiment.qmd | 5 + .../tests/data_validation/nlp/StopWords.qmd | 7 + .../data_validation/nlp/TextDescription.qmd | 15 ++ .../tests/data_validation/nlp/Toxicity.qmd | 5 + .../tests/model_validation/BertScore.qmd | 7 + .../tests/model_validation/BleuScore.qmd | 6 + .../ClusterSizeDistribution.qmd | 6 + .../model_validation/ContextualRecall.qmd | 6 + .../tests/model_validation/FeaturesAUC.qmd | 7 + .../tests/model_validation/MeteorScore.qmd | 6 + .../tests/model_validation/ModelMetadata.qmd | 5 + .../ModelPredictionResiduals.qmd | 10 + .../tests/model_validation/RegardScore.qmd | 6 + .../RegressionResidualsPlot.qmd | 7 + .../tests/model_validation/RougeScore.qmd | 7 + .../TimeSeriesPredictionWithCI.qmd | 7 + .../TimeSeriesPredictionsPlot.qmd | 6 + .../TimeSeriesR2SquareBySegments.qmd | 7 + .../tests/model_validation/TokenDisparity.qmd | 6 + .../tests/model_validation/ToxicityScore.qmd | 6 + .../sklearn/AdjustedMutualInformation.qmd | 6 + .../sklearn/AdjustedRandIndex.qmd | 6 + .../sklearn/CalibrationCurve.qmd | 7 + .../sklearn/ClassifierPerformance.qmd | 14 ++ .../ClassifierThresholdOptimization.qmd | 16 ++ .../sklearn/ClusterCosineSimilarity.qmd | 6 + .../sklearn/ClusterPerformanceMetrics.qmd | 6 + .../sklearn/CompletenessScore.qmd | 6 + .../sklearn/ConfusionMatrix.qmd | 6 + .../sklearn/FeatureImportance.qmd | 7 + .../sklearn/FowlkesMallowsScore.qmd | 6 + .../sklearn/HomogeneityScore.qmd | 6 + .../sklearn/HyperParametersTuning.qmd | 17 ++ .../sklearn/KMeansClustersOptimization.qmd | 7 + .../sklearn/MinimumAccuracy.qmd | 7 + .../sklearn/MinimumF1Score.qmd | 7 + .../sklearn/MinimumROCAUCScore.qmd | 7 + .../sklearn/ModelParameters.qmd | 6 + .../sklearn/ModelsPerformanceComparison.qmd | 6 + .../sklearn/OverfitDiagnosis.qmd | 8 + .../sklearn/PermutationFeatureImportance.qmd | 8 + .../sklearn/PopulationStabilityIndex.qmd | 16 ++ .../sklearn/PrecisionRecallCurve.qmd | 6 + .../model_validation/sklearn/ROCCurve.qmd | 6 + .../sklearn/RegressionErrors.qmd | 6 + .../sklearn/RegressionErrorsComparison.qmd | 6 + .../sklearn/RegressionPerformance.qmd | 6 + .../sklearn/RegressionR2Square.qmd | 6 + .../sklearn/RegressionR2SquareComparison.qmd | 6 + .../sklearn/RobustnessDiagnosis.qmd | 9 + .../sklearn/SHAPGlobalImportance.qmd | 22 ++ .../sklearn/ScoreProbabilityAlignment.qmd | 8 + .../sklearn/SilhouettePlot.qmd | 6 + .../sklearn/TrainingTestDegradation.qmd | 7 + .../model_validation/sklearn/VMeasure.qmd | 6 + .../sklearn/WeakspotsDiagnosis.qmd | 9 + .../statsmodels/AutoARIMA.qmd | 6 + .../CumulativePredictionProbabilities.qmd | 7 + .../statsmodels/DurbinWatsonTest.qmd | 7 + .../statsmodels/GINITable.qmd | 6 + .../statsmodels/KolmogorovSmirnov.qmd | 7 + .../statsmodels/Lilliefors.qmd | 5 + .../PredictionProbabilitiesHistogram.qmd | 7 + .../statsmodels/RegressionCoeffs.qmd | 5 + .../RegressionFeatureSignificance.qmd | 7 + .../RegressionModelForecastPlot.qmd | 8 + .../RegressionModelForecastPlotLevels.qmd | 12 ++ .../RegressionModelSensitivityPlot.qmd | 14 ++ .../statsmodels/RegressionModelSummary.qmd | 6 + ...RegressionPermutationFeatureImportance.qmd | 8 + .../statsmodels/ScorecardHistogram.qmd | 7 + .../statsmodels/statsutils.qmd | 8 + .../tests/prompt_validation/Bias.qmd | 6 + .../tests/prompt_validation/Clarity.qmd | 6 + .../tests/prompt_validation/Conciseness.qmd | 6 + .../tests/prompt_validation/Delimitation.qmd | 6 + .../prompt_validation/NegativeInstruction.qmd | 6 + .../tests/prompt_validation/Robustness.qmd | 7 + .../tests/prompt_validation/Specificity.qmd | 6 + .../prompt_validation/ai_powered_test.qmd | 18 ++ docs/validmind/unit_metrics.qmd | 17 ++ scripts/generate_quarto_docs.py | 72 ++++++- 161 files changed, 1666 insertions(+), 24 deletions(-) diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml index b2eef1113..c0c38f597 100644 --- a/docs/_sidebar.yml +++ b/docs/_sidebar.yml @@ -39,16 +39,214 @@ website: - text: "errors" file: validmind/errors.qmd contents: + - text: "raise_api_error()" + file: validmind/errors.qmd#raise_api_error + - text: "should_raise_on_fail_fast()" + file: validmind/errors.qmd#should_raise_on_fail_fast + - text: "APIRequestError" + file: validmind/errors.qmd#APIRequestError + - text: "BaseError" + file: validmind/errors.qmd#BaseError + - text: "GetTestSuiteError" + file: validmind/errors.qmd#GetTestSuiteError + - text: "InitializeTestSuiteError" + file: validmind/errors.qmd#InitializeTestSuiteError + - text: "InvalidAPICredentialsError" + file: validmind/errors.qmd#InvalidAPICredentialsError + - text: "InvalidContentIdPrefixError" + file: validmind/errors.qmd#InvalidContentIdPrefixError + - text: "InvalidInputError" + file: validmind/errors.qmd#InvalidInputError + - text: "InvalidMetricResultsError" + file: validmind/errors.qmd#InvalidMetricResultsError + - text: "InvalidProjectError" + file: validmind/errors.qmd#InvalidProjectError + - text: "InvalidRequestBodyError" + file: validmind/errors.qmd#InvalidRequestBodyError + - text: "InvalidTestParametersError" + file: validmind/errors.qmd#InvalidTestParametersError + - text: "InvalidTestResultsError" + file: validmind/errors.qmd#InvalidTestResultsError + - text: "InvalidTextObjectError" + file: validmind/errors.qmd#InvalidTextObjectError + - text: "InvalidValueFormatterError" + file: validmind/errors.qmd#InvalidValueFormatterError + - text: "InvalidXGBoostTrainedModelError" + file: validmind/errors.qmd#InvalidXGBoostTrainedModelError + - text: "LoadTestError" + file: validmind/errors.qmd#LoadTestError + - text: "MismatchingClassLabelsError" + file: validmind/errors.qmd#MismatchingClassLabelsError + - text: "MissingAPICredentialsError" + file: validmind/errors.qmd#MissingAPICredentialsError + - text: "MissingCacheResultsArgumentsError" + file: validmind/errors.qmd#MissingCacheResultsArgumentsError + - text: "MissingClassLabelError" + file: validmind/errors.qmd#MissingClassLabelError + - text: "MissingDependencyError" + file: validmind/errors.qmd#MissingDependencyError + - text: "MissingDocumentationTemplate" + file: validmind/errors.qmd#MissingDocumentationTemplate + - text: "MissingModelIdError" + file: validmind/errors.qmd#MissingModelIdError + - text: "MissingOrInvalidModelPredictFnError" + file: validmind/errors.qmd#MissingOrInvalidModelPredictFnError + - text: "MissingRequiredTestInputError" + file: validmind/errors.qmd#MissingRequiredTestInputError + - text: "MissingRExtrasError" + file: validmind/errors.qmd#MissingRExtrasError + - text: "MissingTextContentIdError" + file: validmind/errors.qmd#MissingTextContentIdError + - text: "MissingTextContentsError" + file: validmind/errors.qmd#MissingTextContentsError + - text: "SkipTestError" + file: validmind/errors.qmd#SkipTestError + - text: "TestInputInvalidDatasetError" + file: validmind/errors.qmd#TestInputInvalidDatasetError + - text: "UnsupportedColumnTypeError" + file: validmind/errors.qmd#UnsupportedColumnTypeError + - text: "UnsupportedDatasetError" + file: validmind/errors.qmd#UnsupportedDatasetError + - text: "UnsupportedFigureError" + file: validmind/errors.qmd#UnsupportedFigureError + - text: "UnsupportedModelError" + file: validmind/errors.qmd#UnsupportedModelError + - text: "UnsupportedModelForSHAPError" + file: validmind/errors.qmd#UnsupportedModelForSHAPError + - text: "UnsupportedRModelError" + file: validmind/errors.qmd#UnsupportedRModelError - text: "test_suites" file: validmind/test_suites.qmd contents: + - text: "ClassifierDiagnosis()" + file: validmind/test_suites.qmd#ClassifierDiagnosis + - text: "ClassifierFullSuite()" + file: validmind/test_suites.qmd#ClassifierFullSuite + - text: "ClassifierMetrics()" + file: validmind/test_suites.qmd#ClassifierMetrics + - text: "ClassifierModelValidation()" + file: validmind/test_suites.qmd#ClassifierModelValidation + - text: "ClassifierPerformance()" + file: validmind/test_suites.qmd#ClassifierPerformance + - text: "ClusterFullSuite()" + file: validmind/test_suites.qmd#ClusterFullSuite + - text: "ClusterMetrics()" + file: validmind/test_suites.qmd#ClusterMetrics + - text: "ClusterPerformance()" + file: validmind/test_suites.qmd#ClusterPerformance + - text: "EmbeddingsFullSuite()" + file: validmind/test_suites.qmd#EmbeddingsFullSuite + - text: "EmbeddingsMetrics()" + file: validmind/test_suites.qmd#EmbeddingsMetrics + - text: "EmbeddingsPerformance()" + file: validmind/test_suites.qmd#EmbeddingsPerformance + - text: "format_dataframe()" + file: validmind/test_suites.qmd#format_dataframe + - text: "get_logger()" + file: validmind/test_suites.qmd#get_logger + - text: "KmeansParametersOptimization()" + file: validmind/test_suites.qmd#KmeansParametersOptimization + - text: "LLMClassifierFullSuite()" + file: validmind/test_suites.qmd#LLMClassifierFullSuite + - text: "NLPClassifierFullSuite()" + file: validmind/test_suites.qmd#NLPClassifierFullSuite + - text: "PromptValidation()" + file: validmind/test_suites.qmd#PromptValidation + - text: "RegressionFullSuite()" + file: validmind/test_suites.qmd#RegressionFullSuite + - text: "RegressionMetrics()" + file: validmind/test_suites.qmd#RegressionMetrics + - text: "RegressionModelDescription()" + file: validmind/test_suites.qmd#RegressionModelDescription + - text: "RegressionModelsEvaluation()" + file: validmind/test_suites.qmd#RegressionModelsEvaluation + - text: "RegressionPerformance()" + file: validmind/test_suites.qmd#RegressionPerformance + - text: "SummarizationMetrics()" + file: validmind/test_suites.qmd#SummarizationMetrics + - text: "TabularDataQuality()" + file: validmind/test_suites.qmd#TabularDataQuality + - text: "TabularDataset()" + file: validmind/test_suites.qmd#TabularDataset + - text: "TabularDatasetDescription()" + file: validmind/test_suites.qmd#TabularDatasetDescription + - text: "test_id_to_name()" + file: validmind/test_suites.qmd#test_id_to_name + - text: "TextDataQuality()" + file: validmind/test_suites.qmd#TextDataQuality + - text: "TimeSeriesDataQuality()" + file: validmind/test_suites.qmd#TimeSeriesDataQuality + - text: "TimeSeriesDataset()" + file: validmind/test_suites.qmd#TimeSeriesDataset + - text: "TimeSeriesModelValidation()" + file: validmind/test_suites.qmd#TimeSeriesModelValidation + - text: "TimeSeriesMultivariate()" + file: validmind/test_suites.qmd#TimeSeriesMultivariate + - text: "TimeSeriesUnivariate()" + file: validmind/test_suites.qmd#TimeSeriesUnivariate + - text: "describe_suite()" + file: validmind/test_suites.qmd#describe_suite + - text: "get_by_id()" + file: validmind/test_suites.qmd#get_by_id + - text: "list_suites()" + file: validmind/test_suites.qmd#list_suites + - text: "register_test_suite()" + file: validmind/test_suites.qmd#register_test_suite - text: "tests" file: validmind/tests.qmd contents: + - text: "describe_test()" + file: validmind/tests.qmd#describe_test + - text: "list_tags()" + file: validmind/tests.qmd#list_tags + - text: "list_tasks()" + file: validmind/tests.qmd#list_tasks + - text: "list_tasks_and_tags()" + file: validmind/tests.qmd#list_tasks_and_tags + - text: "list_tests()" + file: validmind/tests.qmd#list_tests + - text: "load_test()" + file: validmind/tests.qmd#load_test + - text: "LoadTestError()" + file: validmind/tests.qmd#LoadTestError + - text: "LocalTestProvider()" + file: validmind/tests.qmd#LocalTestProvider + - text: "run_test()" + file: validmind/tests.qmd#run_test + - text: "tags()" + file: validmind/tests.qmd#tags + - text: "tasks()" + file: validmind/tests.qmd#tasks + - text: "test()" + file: validmind/tests.qmd#test + - text: "TestProvider()" + file: validmind/tests.qmd#TestProvider + - text: "register_test_provider()" + file: validmind/tests.qmd#register_test_provider - text: "unit_metrics" file: validmind/unit_metrics.qmd contents: + - text: "describe_metric()" + file: validmind/unit_metrics.qmd#describe_metric + - text: "list_metrics()" + file: validmind/unit_metrics.qmd#list_metrics + - text: "run_metric()" + file: validmind/unit_metrics.qmd#run_metric - text: "vm_models" file: validmind/vm_models.qmd contents: + - text: "Figure()" + file: validmind/vm_models.qmd#Figure + - text: "ModelAttributes()" + file: validmind/vm_models.qmd#ModelAttributes + - text: "TestSuite()" + file: validmind/vm_models.qmd#TestSuite + - text: "TestSuiteRunner()" + file: validmind/vm_models.qmd#TestSuiteRunner + - text: "VMDataset()" + file: validmind/vm_models.qmd#VMDataset + - text: "VMInput()" + file: validmind/vm_models.qmd#VMInput + - text: "VMModel()" + file: validmind/vm_models.qmd#VMModel \ No newline at end of file diff --git a/docs/templates/function.qmd.jinja2 b/docs/templates/function.qmd.jinja2 index b61c5a3cd..4385f152f 100644 --- a/docs/templates/function.qmd.jinja2 +++ b/docs/templates/function.qmd.jinja2 @@ -2,13 +2,16 @@ #### {{ member.name }} +```python +{% if member.labels and "async" in member.labels %}async {% endif %}def {{ member.name }}( +{% for param in member.parameters %} + {{ '**' if param.kind == 'variadic keyword' else '*' if param.kind == 'variadic positional' else '' }}{{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation.left.name if param.annotation.cls == "ExprSubscript" else "" }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %}, +{% endif %} +{%- endfor %} +){% if member.returns %} -> {{ types.format_module_return_type(member.returns, module, full_data) }}{% endif %}: +``` + {% if member.docstring %} {{ doc.format_docstring(member.docstring) }} {% endif %} -{% if member.signature %} -**Signature:** `{{ member.signature }}` -{% endif %} -{% if member.returns %} -**Returns:** {{ types.format_type(member.returns) }} -{% endif %} {% endif %} \ No newline at end of file diff --git a/docs/templates/sidebar.qmd.jinja2 b/docs/templates/sidebar.qmd.jinja2 index ef4fcc25c..278f088db 100644 --- a/docs/templates/sidebar.qmd.jinja2 +++ b/docs/templates/sidebar.qmd.jinja2 @@ -6,15 +6,12 @@ website: - text: "__version__" file: validmind.qmd#__version__ {% endif %} - {% for member in module.members | sort_members %} - {% if is_public(member, module, full_data, is_root) and member.kind == "alias" %} - {% set target = resolve_alias(member, full_data) %} - {% if target and target.docstring %} - - text: "{{ member.name }}()" - file: validmind.qmd#{{ member.name }} - {% endif %} - {% endif %} + {% if documented_items.get('root') %} + {% for item in documented_items['root'] %} + - text: "{{ item.text }}" + file: {{ item.file }} {% endfor %} + {% endif %} # All module documentation pages - text: "Submodules" @@ -23,10 +20,36 @@ website: - text: "{{ member.name }}" file: validmind/{{ member.name }}.qmd contents: + {% if member.name in documented_items %} + {% for item in documented_items[member.name] %} + - text: "{{ item.text }}" + file: {{ item.file }} + {% endfor %} + {% endif %} {% for submember in member.members | sort_members %} {% if is_public(submember, member, full_data, is_root) and submember.kind == "module" %} - text: "{{ submember.name }}" file: validmind/{{ member.name }}/{{ submember.name }}.qmd + contents: + {% if submember.name in documented_items %} + {% for item in documented_items[submember.name] %} + - text: "{{ item.text }}" + file: {{ item.file }} + {% endfor %} + {% endif %} + {% for subsubmember in submember.members | sort_members %} + {% if is_public(subsubmember, submember, full_data, is_root) and subsubmember.kind == "module" %} + - text: "{{ subsubmember.name }}" + file: validmind/{{ member.name }}/{{ submember.name }}/{{ subsubmember.name }}.qmd + {% if subsubmember.name in documented_items %} + contents: + {% for item in documented_items[subsubmember.name] %} + - text: "{{ item.text }}" + file: {{ item.file }} + {% endfor %} + {% endif %} + {% endif %} + {% endfor %} {% endif %} {% endfor %} {% endif %} diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index 14cc6a9b6..40cf90982 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### get_demo_test_config +```python +def get_demo_test_config( + test_suite = None): +``` + Returns input configuration for the default documentation template assigned to this demo model @@ -37,7 +42,17 @@ by each test: #### load_data +```python +def load_data( + full_dataset = False): +``` + #### preprocess +```python +def preprocess( + df): +``` + \ No newline at end of file diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index 055ef52a1..ec0a5087b 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -11,7 +11,17 @@ toc-expand: 3 #### load_data +```python +def load_data( +): +``` + #### preprocess +```python +def preprocess( + df): +``` + \ No newline at end of file diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index 597d9b56e..d5b1403e8 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -11,12 +11,29 @@ toc-expand: 3 #### compute_scores +```python +def compute_scores( + probabilities): +``` + #### feature_engineering +```python +def feature_engineering( + df, + verbose = True): +``` + #### get_demo_test_config +```python +def get_demo_test_config( + x_test = None, + y_test = None): +``` + Get demo test configuration. **Arguments** @@ -34,9 +51,20 @@ Get demo test configuration. #### init_vm_objects +```python +def init_vm_objects( + scorecard): +``` + #### load_data +```python +def load_data( + source = 'online', + verbose = True): +``` + Load data from either an online source or offline files, automatically dropping specified columns for offline data. @@ -54,15 +82,40 @@ Load data from either an online source or offline files, automatically dropping #### load_scorecard +```python +def load_scorecard( +): +``` + #### load_test_config +```python +def load_test_config( + scorecard): +``` + #### preprocess +```python +def preprocess( + df, + verbose = True): +``` + #### split +```python +def split( + df, + validation_size = None, + test_size = 0.2, + add_constant = False, + verbose = True): +``` + Split dataset into train, validation (optional), and test sets. **Arguments** @@ -83,4 +136,10 @@ Split dataset into train, validation (optional), and test sets. #### woe_encoding +```python +def woe_encoding( + df, + verbose = True): +``` + \ No newline at end of file diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index df2ed96af..552c489e0 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -11,9 +11,19 @@ toc-expand: 3 #### compute_scores +```python +def compute_scores( + probabilities): +``` + #### load_data +```python +def load_data( +): +``` + Load data from the specified CSV file. :return**: DataFrame containing the loaded data. @@ -24,7 +34,18 @@ Load data from the specified CSV file. #### preprocess +```python +def preprocess( + df): +``` + #### split +```python +def split( + df, + test_size = 0.3): +``` + \ No newline at end of file diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index 048cf1757..f5aea4fea 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### display_nice +```python +def display_nice( + df, + num_rows = None): +``` + Primary function to format and display a DataFrame. @@ -19,6 +25,12 @@ Primary function to format and display a DataFrame. #### load_data +```python +def load_data( + source = 'online', + dataset_size = None): +``` + Load data from either online source or offline files. diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index cda838843..bbd120daa 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -11,4 +11,9 @@ toc-expand: 3 #### load_data +```python +def load_data( + full_dataset = False): +``` + \ No newline at end of file diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index 6fdb1f455..b23557b80 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -11,24 +11,62 @@ toc-expand: 3 #### load_all_data +```python +def load_all_data( +): +``` + #### load_data +```python +def load_data( +): +``` + #### load_model +```python +def load_model( + model_name): +``` + #### load_processed_data +```python +def load_processed_data( +): +``` + #### load_test_dataset +```python +def load_test_dataset( + model_name): +``` + #### load_train_dataset +```python +def load_train_dataset( + model_path): +``` + #### preprocess +```python +def preprocess( + df, + split_option = 'train_test_val', + train_size = 0.6, + test_size = 0.2): +``` + Split a time series DataFrame into train, validation, and test sets. Parameters: @@ -49,4 +87,10 @@ Parameters: #### transform +```python +def transform( + df, + transform_func = 'diff'): +``` + \ No newline at end of file diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 2a5a35f7e..e474bb1e2 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -11,9 +11,22 @@ toc-expand: 3 #### load_data +```python +def load_data( +): +``` + #### preprocess +```python +def preprocess( + df, + split_option = 'train_test_val', + train_size = 0.6, + test_size = 0.2): +``` + Split a time series DataFrame into train, validation, and test sets. Parameters: @@ -34,4 +47,10 @@ Parameters: #### transform +```python +def transform( + df, + transform_func = 'diff'): +``` + \ No newline at end of file diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index bd4a51009..533d73a01 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -21,6 +21,11 @@ The following base errors are defined for others: #### raise_api_error +```python +def raise_api_error( + error_string): +``` + Safely try to parse JSON from the response message in case the API returns a non-JSON string or if the API returns a non-standard error @@ -30,12 +35,15 @@ returns a non-JSON string or if the API returns a non-standard error #### should_raise_on_fail_fast -Determine whether an error should be raised when fail_fast is True. +```python +def should_raise_on_fail_fast( + error) -> bool: +``` +Determine whether an error should be raised when fail_fast is True. -**Returns:** bool ### Class: APIRequestError diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 24015a392..642313c3c 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -28,6 +28,12 @@ Entrypoint for test suites. #### describe_suite +```python +def describe_suite( + test_suite_id: str, + verbose = False): +``` + Describes a Test Suite by ID **Arguments** @@ -45,6 +51,11 @@ Describes a Test Suite by ID #### get_by_id +```python +def get_by_id( + test_suite_id: str): +``` + Returns the test suite by ID @@ -53,6 +64,11 @@ Returns the test suite by ID #### list_suites +```python +def list_suites( + pretty: bool = True): +``` + Returns a list of all available test suites @@ -61,6 +77,12 @@ Returns a list of all available test suites #### register_test_suite +```python +def register_test_suite( + suite_id: str, + suite: TestSuite): +``` + Registers a custom test suite diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 6c9a82efc..281582ee8 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -19,6 +19,12 @@ ValidMind Tests Module #### register_test_provider +```python +def register_test_provider( + namespace: str, + test_provider: TestProvider) -> None: +``` + Register an external test provider **Arguments** @@ -29,6 +35,4 @@ Register an external test provider -**Returns:** None - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index ea5a768dc..b0b01719f 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### ACFandPACFPlot +```python +def ACFandPACFPlot( + dataset: VMDataset): +``` + Analyzes time series data using Autocorrelation Function (ACF) and Partial Autocorrelation Function (PACF) plots to reveal trends and correlations. diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 6d61c6388..d597cae95 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### ADF +```python +def ADF( + dataset: VMDataset): +``` + Assesses the stationarity of a time series dataset using the Augmented Dickey-Fuller (ADF) test. ###### Purpose diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index f47cddc1b..0dc509463 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### AutoAR +```python +def AutoAR( + dataset: VMDataset, + max_ar_order: int = 3): +``` + Automatically identifies the optimal Autoregressive (AR) order for a time series using BIC and AIC criteria. ###### Purpose diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index 0f2c2a729..a7b4ac0f3 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### AutoMA +```python +def AutoMA( + dataset: VMDataset, + max_ma_order: int = 3): +``` + Automatically selects the optimal Moving Average (MA) order for each variable in a time series dataset based on minimal BIC and AIC values. diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 97e500fe6..8d6a11b51 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### AutoStationarity +```python +def AutoStationarity( + dataset: VMDataset, + max_order: int = 5, + threshold: float = 0.05): +``` + Automates Augmented Dickey-Fuller test to assess stationarity across multiple time series in a DataFrame. ###### Purpose diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 2762fc5e0..37d00c421 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### BivariateScatterPlots +```python +def BivariateScatterPlots( + dataset): +``` + Generates bivariate scatterplots to visually inspect relationships between pairs of numerical predictor variables in machine learning classification tasks. diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index b0d914fbf..53c96866e 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### BoxPierce +```python +def BoxPierce( + dataset): +``` + Detects autocorrelation in time-series data through the Box-Pierce test to validate model performance. ###### Purpose diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 0a277449e..9d077db9f 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### ChiSquaredFeaturesTable +```python +def ChiSquaredFeaturesTable( + dataset, + p_threshold = 0.05): +``` + Assesses the statistical association between categorical features and a target variable using the Chi-Squared test. ###### Purpose diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index d3f7c2778..dd5532556 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -16,6 +16,12 @@ Threshold based tests #### ClassImbalance +```python +def ClassImbalance( + dataset: VMDataset, + min_percent_threshold: int = 10) -> Tuple[, , bool]: +``` + Evaluates and quantifies class distribution imbalance in a dataset used by a machine learning model. ###### Purpose @@ -64,6 +70,4 @@ these imbalances. -**Returns:** - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 401c02587..55a345b7b 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### DatasetDescription +```python +def DatasetDescription( + dataset: VMDataset): +``` + Provides comprehensive analysis and statistical summaries of each column in a machine learning model's dataset. ###### Purpose @@ -66,6 +71,12 @@ distribution. #### describe_column +```python +def describe_column( + df, + column): +``` + Gets descriptive statistics for a single column in a Pandas DataFrame. @@ -74,6 +85,13 @@ Gets descriptive statistics for a single column in a Pandas DataFrame. #### get_column_histograms +```python +def get_column_histograms( + df, + column, + type_): +``` + Returns a collection of histograms for a numerical or categorical column. We store different combinations of bin sizes to allow analyzing the data better @@ -85,6 +103,12 @@ Will be used in favor of _get_histogram in the future #### get_numerical_histograms +```python +def get_numerical_histograms( + df, + column): +``` + Returns a collection of histograms for a numerical column, each one with a different bin size @@ -94,4 +118,9 @@ with a different bin size #### infer_datatypes +```python +def infer_datatypes( + df): +``` + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 7a9890877..ba0056697 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### DatasetSplit +```python +def DatasetSplit( + datasets: List): +``` + Evaluates and visualizes the distribution proportions among training, testing, and validation datasets of an ML model. diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index fa1288777..d84624eec 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### DescriptiveStatistics +```python +def DescriptiveStatistics( + dataset: VMDataset): +``` + Performs a detailed descriptive statistical analysis of both numerical and categorical data within a model's dataset. @@ -61,7 +66,19 @@ model's data. #### get_summary_statistics_categorical +```python +def get_summary_statistics_categorical( + df, + categorical_fields): +``` + #### get_summary_statistics_numerical +```python +def get_summary_statistics_numerical( + df, + numerical_fields): +``` + \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index e80f2e0b8..7b0900a8e 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### DickeyFullerGLS +```python +def DickeyFullerGLS( + dataset: VMDataset): +``` + Assesses stationarity in time series data using the Dickey-Fuller GLS test to determine the order of integration. ###### Purpose diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index d8bcea60c..4e9850ba0 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### Duplicates +```python +def Duplicates( + dataset, + min_threshold = 1): +``` + Tests dataset for duplicate entries, ensuring model reliability via data quality verification. ###### Purpose diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 4811154cf..4556c0202 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### EngleGrangerCoint +```python +def EngleGrangerCoint( + dataset: VMDataset, + threshold: float = 0.05): +``` + Assesses the degree of co-movement between pairs of time series data using the Engle-Granger cointegration test. ###### Purpose diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index bf44879cd..e62fab239 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### FeatureTargetCorrelationPlot +```python +def FeatureTargetCorrelationPlot( + dataset, + fig_height = 600): +``` + Visualizes the correlation between input features and the model's target output in a color-coded horizontal bar plot. diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 894a84954..2f6acf279 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -11,6 +11,14 @@ toc-expand: 3 #### HighCardinality +```python +def HighCardinality( + dataset: VMDataset, + num_threshold: int = 100, + percent_threshold: float = 0.1, + threshold_type: str = 'percent'): +``` + Assesses the number of unique values in categorical columns to detect high cardinality and potential overfitting. ###### Purpose diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index abd740061..68bb52335 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -11,6 +11,14 @@ toc-expand: 3 #### HighPearsonCorrelation +```python +def HighPearsonCorrelation( + dataset: VMDataset, + max_threshold: float = 0.3, + top_n_correlations: int = 10, + feature_columns: list = None): +``` + Identifies highly correlated feature pairs in a dataset suggesting feature redundancy or multicollinearity. ###### Purpose diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 0e6bb2112..53c5d863e 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -11,9 +11,22 @@ toc-expand: 3 #### compute_outliers +```python +def compute_outliers( + series, + threshold): +``` + #### IQROutliersBarPlot +```python +def IQROutliersBarPlot( + dataset: VMDataset, + threshold: float = 1.5, + fig_width: int = 800): +``` + Visualizes outlier distribution across percentiles in numerical data using the Interquartile Range (IQR) method. ###### Purpose diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 527425301..3cdc3cc33 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -11,9 +11,21 @@ toc-expand: 3 #### compute_outliers +```python +def compute_outliers( + series, + threshold = 1.5): +``` + #### IQROutliersTable +```python +def IQROutliersTable( + dataset: VMDataset, + threshold: float = 1.5): +``` + Determines and summarizes outliers in numerical features using the Interquartile Range method. ###### Purpose diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index e9c624070..cd431b881 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -11,6 +11,14 @@ toc-expand: 3 #### IsolationForestOutliers +```python +def IsolationForestOutliers( + dataset: VMDataset, + random_state: int = 0, + contamination: float = 0.1, + feature_columns: list = None): +``` + Detects outliers in a dataset using the Isolation Forest algorithm and visualizes results through scatter plots. ###### Purpose diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index 4ca41b5c1..94b5a1952 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### JarqueBera +```python +def JarqueBera( + dataset): +``` + Assesses normality of dataset features in an ML model using the Jarque-Bera test. ###### Purpose diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 3d9c0b0c8..55ac52b28 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### KPSS +```python +def KPSS( + dataset: VMDataset): +``` + Assesses the stationarity of time-series data in a machine learning model using the KPSS unit root test. ###### Purpose diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 31e26122c..5af885ed8 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### LJungBox +```python +def LJungBox( + dataset): +``` + Assesses autocorrelations in dataset features by performing a Ljung-Box test on each feature. ###### Purpose diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index 9679dcdd5..dbf4060c0 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### LaggedCorrelationHeatmap +```python +def LaggedCorrelationHeatmap( + dataset: VMDataset, + num_lags: int = 10): +``` + Assesses and visualizes correlation between target variable and lagged independent variables in a time-series dataset. diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 9698ebfc2..b2c5ab2dc 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### MissingValues +```python +def MissingValues( + dataset: VMDataset, + min_threshold: int = 1): +``` + Evaluates dataset quality by ensuring missing value ratio across all features does not exceed a set threshold. ###### Purpose diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index a357b03ba..ce4299fba 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### MissingValuesBarPlot +```python +def MissingValuesBarPlot( + dataset: VMDataset, + threshold: int = 80, + fig_height: int = 600): +``` + Assesses the percentage and distribution of missing values in the dataset via a bar plot, with emphasis on identifying high-risk columns based on a user-defined threshold. diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 50db462a2..f5297d632 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### MutualInformation +```python +def MutualInformation( + dataset: VMDataset, + min_threshold: float = 0.01, + task: str = 'classification'): +``` + Calculates mutual information scores between features and target variable to evaluate feature relevance. ###### Purpose diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index db7a7afd4..76a601991 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### PearsonCorrelationMatrix +```python +def PearsonCorrelationMatrix( + dataset): +``` + Evaluates linear dependency between numerical variables in a dataset via a Pearson Correlation coefficient heat map. ###### Purpose diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 330df447d..95ea34a5e 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### PhillipsPerronArch +```python +def PhillipsPerronArch( + dataset: VMDataset): +``` + Assesses the stationarity of time series data in each feature of the ML model using the Phillips-Perron test. ###### Purpose diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 6cc8cdde5..ad5ced91f 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### ProtectedClassesCombination +```python +def ProtectedClassesCombination( + dataset, + model, + protected_classes = None): +``` + Visualizes combinations of protected classes and their corresponding error metric differences. ###### Purpose diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index edf96154c..3a1e2e417 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### ProtectedClassesDescription +```python +def ProtectedClassesDescription( + dataset, + protected_classes = None): +``` + Visualizes the distribution of protected classes in the dataset relative to the target variable and provides descriptive statistics. diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 1c79ed106..a3fd18274 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -11,6 +11,15 @@ toc-expand: 3 #### ProtectedClassesDisparity +```python +def ProtectedClassesDisparity( + dataset, + model, + protected_classes = None, + disparity_tolerance = 1.25, + metrics = {'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}): +``` + Investigates disparities in model performance across different protected class segments. ###### Purpose diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 771c05359..a993b60aa 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -11,24 +11,74 @@ toc-expand: 3 #### calculate_fairness_metrics +```python +def calculate_fairness_metrics( + test_df, + target, + y_pred_opt, + protected_classes): +``` + #### calculate_group_metrics +```python +def calculate_group_metrics( + test_df, + target, + y_pred_opt, + protected_classes): +``` + #### get_thresholds_by_group +```python +def get_thresholds_by_group( + threshold_optimizer): +``` + #### initialize_and_fit_optimizer +```python +def initialize_and_fit_optimizer( + pipeline, + X_train, + y_train, + protected_classes_df): +``` + #### make_predictions +```python +def make_predictions( + threshold_optimizer, + test_df, + protected_classes): +``` + #### plot_thresholds +```python +def plot_thresholds( + threshold_optimizer): +``` + #### ProtectedClassesThresholdOptimizer +```python +def ProtectedClassesThresholdOptimizer( + dataset, + pipeline = None, + protected_classes = None, + X_train = None, + y_train = None): +``` + Obtains a classifier by applying group-specific thresholds to the provided estimator. ###### Purpose diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index f32ba9822..c944dd6ac 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -11,9 +11,22 @@ toc-expand: 3 #### plot_rolling_statistics +```python +def plot_rolling_statistics( + df, + col, + window_size): +``` + #### RollingStatsPlot +```python +def RollingStatsPlot( + dataset: VMDataset, + window_size: int = 12): +``` + Evaluates the stationarity of time series data by plotting its rolling mean and standard deviation over a specified window. diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 5393ac7fb..b792be1e5 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### RunsTest +```python +def RunsTest( + dataset): +``` + Executes Runs Test on ML model to detect non-random patterns in output data sequence. ###### Purpose diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 71b8ea593..b4dca995a 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### ScatterPlot +```python +def ScatterPlot( + dataset): +``` + Assesses visual relationships, patterns, and outliers among features in a dataset through scatter plot matrices. ###### Purpose diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index e1ef6550f..e4b627ce5 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -11,6 +11,14 @@ toc-expand: 3 #### ScoreBandDefaultRates +```python +def ScoreBandDefaultRates( + dataset: VMDataset, + model: VMModel, + score_column: str = 'score', + score_bands: list = None): +``` + Analyzes default rates and population distribution across credit score bands. ###### Purpose diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 70a952885..c3cd9ea02 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### SeasonalDecompose +```python +def SeasonalDecompose( + dataset: VMDataset, + seasonal_model: str = 'additive'): +``` + Assesses patterns and seasonality in a time series dataset by decomposing its features into foundational components. ###### Purpose diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 01655b8d4..ae7f7b742 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### ShapiroWilk +```python +def ShapiroWilk( + dataset): +``` + Evaluates feature-wise normality of training data using the Shapiro-Wilk test. ###### Purpose diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index dc1a76afe..bf86dcc23 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### Skewness +```python +def Skewness( + dataset, + max_threshold = 1): +``` + Evaluates the skewness of numerical data in a dataset to check against a defined threshold, aiming to ensure data quality and optimize model performance. diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 5fa844594..4c0e9d6b5 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### SpreadPlot +```python +def SpreadPlot( + dataset: VMDataset): +``` + Assesses potential correlations between pairs of time series variables through visualization to enhance understanding of their relationships. diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 21f58379f..303bdf131 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### TabularCategoricalBarPlots +```python +def TabularCategoricalBarPlots( + dataset: VMDataset): +``` + Generates and visualizes bar plots for each category in categorical features to evaluate the dataset's composition. ###### Purpose diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 23ccf74a0..38ae5accd 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### TabularDateTimeHistograms +```python +def TabularDateTimeHistograms( + dataset: VMDataset): +``` + Generates histograms to provide graphical insight into the distribution of time intervals in a model's datetime data. diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 0e2622b19..1c7734f71 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -11,24 +11,62 @@ toc-expand: 3 #### get_categorical_columns +```python +def get_categorical_columns( + dataset): +``` + #### get_datetime_columns +```python +def get_datetime_columns( + dataset): +``` + #### get_numerical_columns +```python +def get_numerical_columns( + dataset): +``` + #### get_summary_statistics_categorical +```python +def get_summary_statistics_categorical( + dataset, + categorical_fields): +``` + #### get_summary_statistics_datetime +```python +def get_summary_statistics_datetime( + dataset, + datetime_fields): +``` + #### get_summary_statistics_numerical +```python +def get_summary_statistics_numerical( + dataset, + numerical_fields): +``` + #### TabularDescriptionTables +```python +def TabularDescriptionTables( + dataset): +``` + Summarizes key descriptive statistics for numerical, categorical, and datetime variables in a dataset. ###### Purpose diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index dc99711fa..d068dd38c 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### TabularNumericalHistograms +```python +def TabularNumericalHistograms( + dataset: VMDataset): +``` + Generates histograms for each numerical feature in a dataset to provide visual insights into data distribution and detect potential issues. diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 99c93f45d..a5c5314a5 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### TargetRateBarPlots +```python +def TargetRateBarPlots( + dataset: VMDataset): +``` + Generates bar plots visualizing the default rates of categorical features for a classification machine learning model. diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 6eeaa248f..46485b530 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### TimeSeriesDescription +```python +def TimeSeriesDescription( + dataset): +``` + Generates a detailed analysis for the provided time series dataset, summarizing key statistics to identify trends, patterns, and data quality issues. diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index abb695874..41cfc1ac4 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### TimeSeriesDescriptiveStatistics +```python +def TimeSeriesDescriptiveStatistics( + dataset): +``` + Evaluates the descriptive statistics of a time series dataset to identify trends, patterns, and data quality issues. ###### Purpose diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 183ac6091..0ef4fa0db 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### TimeSeriesFrequency +```python +def TimeSeriesFrequency( + dataset: VMDataset): +``` + Evaluates consistency of time series data frequency and generates a frequency plot. ###### Purpose diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 5d24e92c8..9f1e03570 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### TimeSeriesHistogram +```python +def TimeSeriesHistogram( + dataset, + nbins = 30): +``` + Visualizes distribution of time-series data using histograms and Kernel Density Estimation (KDE) lines. ###### Purpose diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 34e544381..1fe748d00 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### TimeSeriesLinePlot +```python +def TimeSeriesLinePlot( + dataset: VMDataset): +``` + Generates and analyses time-series data through line plots revealing trends, patterns, anomalies over time. ###### Purpose diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index f5e56962e..50bd09c98 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### TimeSeriesMissingValues +```python +def TimeSeriesMissingValues( + dataset: VMDataset, + min_threshold: int = 1): +``` + Validates time-series data quality by confirming the count of missing values is below a certain threshold. ###### Purpose diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index a3d7dabeb..a20e3c30a 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### TimeSeriesOutliers +```python +def TimeSeriesOutliers( + dataset: VMDataset, + zscore_threshold: int = 3): +``` + Identifies and visualizes outliers in time-series data using the z-score method. ###### Purpose diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 5cf75ff1a..4bdbded39 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### TooManyZeroValues +```python +def TooManyZeroValues( + dataset: VMDataset, + max_percent_threshold: float = 0.03): +``` + Identifies numerical columns in a dataset that contain an excessive number of zero values, defined by a threshold percentage. diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 750b954fe..77fc345dd 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### UniqueRows +```python +def UniqueRows( + dataset: VMDataset, + min_percent_threshold: float = 1): +``` + Verifies the diversity of the dataset by ensuring that the count of unique rows exceeds a prescribed threshold. ###### Purpose diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 895f6e5cc..e0ca55da6 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -11,6 +11,14 @@ toc-expand: 3 #### WOEBinPlots +```python +def WOEBinPlots( + dataset: VMDataset, + breaks_adj: list = None, + fig_height: int = 600, + fig_width: int = 500): +``` + Generates visualizations of Weight of Evidence (WoE) and Information Value (IV) for understanding predictive power of categorical variables in a data set. diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index e1f7e6331..96c020af3 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### WOEBinTable +```python +def WOEBinTable( + dataset: VMDataset, + breaks_adj: list = None): +``` + Assesses the Weight of Evidence (WoE) and Information Value (IV) of each feature to evaluate its predictive power in a binary classification model. diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 51ddaf4d0..660d033d1 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### ZivotAndrewsArch +```python +def ZivotAndrewsArch( + dataset: VMDataset): +``` + Evaluates the order of integration and stationarity of time series data using the Zivot-Andrews unit root test. ###### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index c11f0ede2..bfa4bc422 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### CommonWords +```python +def CommonWords( + dataset: VMDataset): +``` + Assesses the most frequent non-stopwords in a text column for identifying prevalent language patterns. ###### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index b0c89d39d..714b41bdc 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### Hashtags +```python +def Hashtags( + dataset: VMDataset, + top_hashtags: int = 25): +``` + Assesses hashtag frequency in a text column, highlighting usage trends and potential dataset bias or spam. ###### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 1f8c33e68..87086c43a 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### LanguageDetection +```python +def LanguageDetection( + dataset): +``` + Assesses the diversity of languages in a textual dataset by detecting and visualizing the distribution of languages. ###### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 6b3d7cbc0..b7a23bb78 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### Mentions +```python +def Mentions( + dataset: VMDataset, + top_mentions: int = 25): +``` + Calculates and visualizes frequencies of '@' prefixed mentions in a text-based dataset for NLP model analysis. ###### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index 0d0e948cb..3960d5a5c 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### PolarityAndSubjectivity +```python +def PolarityAndSubjectivity( + dataset, + threshold_subjectivity = 0.5, + threshold_polarity = 0): +``` + Analyzes the polarity and subjectivity of text data within a given dataset to visualize the sentiment distribution. ###### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index bc9665d9f..af0c4aaf7 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -16,6 +16,12 @@ Metrics functions for any Pandas-compatible datasets #### Punctuations +```python +def Punctuations( + dataset, + count_mode = 'token'): +``` + Analyzes and visualizes the frequency distribution of punctuation usage in a given text dataset. ###### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index 4487f09b9..a00bc2c88 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### Sentiment +```python +def Sentiment( + dataset): +``` + Analyzes the sentiment of text data within a dataset using the VADER sentiment analysis tool. ###### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index ed9596c6b..a0b7de3ff 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -16,6 +16,13 @@ Threshold based tests #### StopWords +```python +def StopWords( + dataset: VMDataset, + min_percent_threshold: float = 0.5, + num_words: int = 25): +``` + Evaluates and visualizes the frequency of English stop words in a text dataset against a defined threshold. ###### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index ede40f805..3e0d8e7c6 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -11,9 +11,24 @@ toc-expand: 3 #### create_metrics_df +```python +def create_metrics_df( + df, + text_column, + unwanted_tokens, + lang): +``` + #### TextDescription +```python +def TextDescription( + dataset: VMDataset, + unwanted_tokens: set = {'cls': 'ExprSet', 'elements': ["'s'", '"s\'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"\'s"', "' '", '"\'\'"', "'dollar'", "'us'", "'``'"]}, + lang: str = 'english'): +``` + Conducts comprehensive textual analysis on a dataset using NLTK to evaluate various parameters and generate visualizations. diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index 16eb268cd..0eca0c3cb 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### Toxicity +```python +def Toxicity( + dataset): +``` + Assesses the toxicity of text data within a dataset to visualize the distribution of toxicity scores. ###### Purpose diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 308b7d855..4fdc1bf6e 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### BertScore +```python +def BertScore( + dataset, + model, + evaluation_model = 'distilbert-base-uncased'): +``` + Assesses the quality of machine-generated text using BERTScore metrics and visualizes results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics. diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 1debd1662..21ef99d4e 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### BleuScore +```python +def BleuScore( + dataset, + model): +``` + Evaluates the quality of machine-generated text using BLEU metrics and visualizes the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for BLEU scores. diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index a538d0b18..69b07143a 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### ClusterSizeDistribution +```python +def ClusterSizeDistribution( + dataset: VMDataset, + model: VMModel): +``` + Assesses the performance of clustering models by comparing the distribution of cluster sizes in model predictions with the actual data. diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 8d5b8d226..43967f680 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### ContextualRecall +```python +def ContextualRecall( + dataset, + model): +``` + Evaluates a Natural Language Generation model's ability to generate contextually relevant and factually correct text, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for contextual recall scores. diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index ba77efe79..e53b7498a 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### FeaturesAUC +```python +def FeaturesAUC( + dataset: VMDataset, + fontsize: int = 12, + figure_height: int = 500): +``` + Evaluates the discriminatory power of each individual feature within a binary classification model by calculating the Area Under the Curve (AUC) for each feature separately. diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 6d4d3d0a6..16e4d8df6 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### MeteorScore +```python +def MeteorScore( + dataset, + model): +``` + Assesses the quality of machine-generated translations by comparing them to human-produced references using the METEOR score, which evaluates precision, recall, and word order. diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index e64531bb4..9e7cc76a3 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### ModelMetadata +```python +def ModelMetadata( + model): +``` + Compare metadata of different models and generate a summary table with the results. **Purpose****: The purpose of this function is to compare the metadata of different models, including information about their architecture, framework, framework version, and programming language. diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index 8233194a2..8a4159828 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -11,6 +11,16 @@ toc-expand: 3 #### ModelPredictionResiduals +```python +def ModelPredictionResiduals( + dataset, + model, + nbins = 100, + p_value_threshold = 0.05, + start_date = None, + end_date = None): +``` + Assesses normality and behavior of residuals in regression models through visualization and statistical tests. ###### Purpose diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 8283888a8..7e8e9a178 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### RegardScore +```python +def RegardScore( + dataset, + model): +``` + Assesses the sentiment and potential biases in text generated by NLP models by computing and visualizing regard scores. diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 3ca74aac3..90e16cf37 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### RegressionResidualsPlot +```python +def RegressionResidualsPlot( + model: VMModel, + dataset: VMDataset, + bin_size: float = 0.1): +``` + Evaluates regression model performance using residual distribution and actual vs. predicted plots. ###### Purpose diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index c7118e1a3..30a317ad1 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### RougeScore +```python +def RougeScore( + dataset, + model, + metric = 'rouge-1'): +``` + Assesses the quality of machine-generated text using ROUGE metrics and visualizes the results to provide comprehensive performance insights. diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index a36e01b84..b587ea851 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### TimeSeriesPredictionWithCI +```python +def TimeSeriesPredictionWithCI( + dataset, + model, + confidence = 0.95): +``` + Assesses predictive accuracy and uncertainty in time series models, highlighting breaches beyond confidence intervals. diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index 6b7b0ae11..59db06bf0 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### TimeSeriesPredictionsPlot +```python +def TimeSeriesPredictionsPlot( + dataset, + model): +``` + Plot actual vs predicted values for time series data and generate a visual comparison for the model. ###### Purpose diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index a44764a9c..3a518af98 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### TimeSeriesR2SquareBySegments +```python +def TimeSeriesR2SquareBySegments( + dataset, + model, + segments = None): +``` + Evaluates the R-Squared values of regression models over specified time segments in time series data to assess segment-wise model performance. diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index 2c87e361f..83c4b2002 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### TokenDisparity +```python +def TokenDisparity( + dataset, + model): +``` + Evaluates the token disparity between reference and generated texts, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for token counts. diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index 948f5b7ca..e308ecc7d 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### ToxicityScore +```python +def ToxicityScore( + dataset, + model): +``` + Assesses the toxicity levels of texts generated by NLP models to identify and mitigate harmful or offensive content. ###### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 4de26dcb3..a85c5b0d1 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### AdjustedMutualInformation +```python +def AdjustedMutualInformation( + model: VMModel, + dataset: VMDataset): +``` + Evaluates clustering model performance by measuring mutual information between true and predicted labels, adjusting for chance. diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index cd65924ff..49f804712 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### AdjustedRandIndex +```python +def AdjustedRandIndex( + model: VMModel, + dataset: VMDataset): +``` + Measures the similarity between two data clusters using the Adjusted Rand Index (ARI) metric in clustering machine learning models. diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 53c4effae..1da732b0f 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### CalibrationCurve +```python +def CalibrationCurve( + model: VMModel, + dataset: VMDataset, + n_bins: int = 10): +``` + Evaluates the calibration of probability estimates by comparing predicted probabilities against observed frequencies. diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index aeaec3b40..1b9351f1d 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### ClassifierPerformance +```python +def ClassifierPerformance( + dataset: VMDataset, + model: VMModel, + average: str = 'macro'): +``` + Evaluates performance of binary or multiclass classification models using precision, recall, F1-Score, accuracy, and ROC AUC scores. @@ -53,4 +60,11 @@ is binary or multiclass. #### multiclass_roc_auc_score +```python +def multiclass_roc_auc_score( + y_test, + y_pred, + average = 'macro'): +``` + \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 0d3c14699..6a88510a6 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -11,6 +11,14 @@ toc-expand: 3 #### ClassifierThresholdOptimization +```python +def ClassifierThresholdOptimization( + dataset: VMDataset, + model: VMModel, + methods = None, + target_recall = None): +``` + Analyzes and visualizes different threshold optimization methods for binary classification models. ###### Purpose @@ -81,6 +89,14 @@ comprehensive performance metrics at each threshold. #### find_optimal_threshold +```python +def find_optimal_threshold( + y_true, + y_prob, + method = 'youden', + target_recall = None): +``` + Find the optimal classification threshold using various methods. **Arguments** diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index cd4dd927e..8b06ed2a5 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### ClusterCosineSimilarity +```python +def ClusterCosineSimilarity( + model: VMModel, + dataset: VMDataset): +``` + Measures the intra-cluster similarity of a clustering model using cosine similarity. ###### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 89cca65de..1782a2478 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### ClusterPerformanceMetrics +```python +def ClusterPerformanceMetrics( + model: VMModel, + dataset: VMDataset): +``` + Evaluates the performance of clustering machine learning models using multiple established metrics. ###### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 30d77f339..9b1f47a77 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### CompletenessScore +```python +def CompletenessScore( + model: VMModel, + dataset: VMDataset): +``` + Evaluates a clustering model's capacity to categorize instances from a single class into the same cluster. ###### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 849035b19..1cb8b1f1a 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### ConfusionMatrix +```python +def ConfusionMatrix( + dataset: VMDataset, + model: VMModel): +``` + Evaluates and visually represents the classification ML model's predictive performance using a Confusion Matrix heatmap. diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index acd32db62..29639d7a3 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### FeatureImportance +```python +def FeatureImportance( + dataset: VMDataset, + model: VMModel, + num_features: int = 3): +``` + Compute feature importance scores for a given model and generate a summary table with the top important features. diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index b8a2c83c1..244d63fa3 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### FowlkesMallowsScore +```python +def FowlkesMallowsScore( + dataset: VMDataset, + model: VMModel): +``` + Evaluates the similarity between predicted and actual cluster assignments in a model using the Fowlkes-Mallows score. diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 78aeeb23a..fc3caa367 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### HomogeneityScore +```python +def HomogeneityScore( + dataset: VMDataset, + model: VMModel): +``` + Assesses clustering homogeneity by comparing true and predicted labels, scoring from 0 (heterogeneous) to 1 (homogeneous). diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 9dd233063..8754ee4e7 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -11,9 +11,26 @@ toc-expand: 3 #### custom_recall +```python +def custom_recall( + y_true, + y_pred_proba, + threshold = 0.5): +``` + #### HyperParametersTuning +```python +def HyperParametersTuning( + model: VMModel, + dataset: VMDataset, + param_grid: dict, + scoring: Union = None, + thresholds: Union = None, + fit_params: dict = None): +``` + Performs exhaustive grid search over specified parameter ranges to find optimal model configurations across different metrics and decision thresholds. diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 0989e402b..1c5c3e761 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### KMeansClustersOptimization +```python +def KMeansClustersOptimization( + model: VMModel, + dataset: VMDataset, + n_clusters: Union = None): +``` + Optimizes the number of clusters in K-means models using Elbow and Silhouette methods. ###### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 4b4013246..98ea1d0d3 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### MinimumAccuracy +```python +def MinimumAccuracy( + dataset: VMDataset, + model: VMModel, + min_threshold: float = 0.7): +``` + Checks if the model's prediction accuracy meets or surpasses a specified threshold. ###### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 6c9823efc..471ceb8a6 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### MinimumF1Score +```python +def MinimumF1Score( + dataset: VMDataset, + model: VMModel, + min_threshold: float = 0.5): +``` + Assesses if the model's F1 score on the validation set meets a predefined minimum threshold, ensuring balanced performance between precision and recall. diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 8dd2b562b..a2bc9714f 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### MinimumROCAUCScore +```python +def MinimumROCAUCScore( + dataset: VMDataset, + model: VMModel, + min_threshold: float = 0.5): +``` + Validates model by checking if the ROC AUC score meets or surpasses a specified threshold. ###### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 8381bfdfc..13d951ff6 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### ModelParameters +```python +def ModelParameters( + model, + model_params = None): +``` + Extracts and displays model parameters in a structured format for transparency and reproducibility. ###### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 58877b565..d2d13c63d 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### ModelsPerformanceComparison +```python +def ModelsPerformanceComparison( + dataset: VMDataset, + models: list): +``` + Evaluates and compares the performance of multiple Machine Learning models using various metrics like accuracy, precision, recall, and F1 score. diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 8b184569c..78a5d9f67 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -11,6 +11,14 @@ toc-expand: 3 #### OverfitDiagnosis +```python +def OverfitDiagnosis( + model: VMModel, + datasets: List, + metric: str = None, + cut_off_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): +``` + Assesses potential overfitting in a model's predictions, identifying regions where performance between training and testing sets deviates significantly. diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 71b2aa6e2..675868f63 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -11,6 +11,14 @@ toc-expand: 3 #### PermutationFeatureImportance +```python +def PermutationFeatureImportance( + model: VMModel, + dataset: VMDataset, + fontsize: Union = None, + figure_height: Union = None): +``` + Assesses the significance of each feature in a model by evaluating the impact on model performance when feature values are randomly rearranged. diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 19f79474f..c8617535b 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -11,6 +11,14 @@ toc-expand: 3 #### calculate_psi +```python +def calculate_psi( + score_initial, + score_new, + num_bins = 10, + mode = 'fixed'): +``` + Taken from: https://towardsdatascience.com/checking-model-stability-and-population-shift-with-psi-and-csi-6d12af008783 @@ -20,6 +28,14 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit #### PopulationStabilityIndex +```python +def PopulationStabilityIndex( + datasets: List, + model: VMModel, + num_bins: int = 10, + mode: str = 'fixed'): +``` + Assesses the Population Stability Index (PSI) to quantify the stability of an ML model's predictions across different datasets. diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index d776d7bf5..9eff2e5d4 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### PrecisionRecallCurve +```python +def PrecisionRecallCurve( + model: VMModel, + dataset: VMDataset): +``` + Evaluates the precision-recall trade-off for binary classification models and visualizes the Precision-Recall curve. ###### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 56023e841..455d16204 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### ROCCurve +```python +def ROCCurve( + model: VMModel, + dataset: VMDataset): +``` + Evaluates binary classification model performance by generating and plotting the Receiver Operating Characteristic (ROC) curve and calculating the Area Under Curve (AUC) score. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index d229ac0dc..fdb183d2b 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### RegressionErrors +```python +def RegressionErrors( + model, + dataset): +``` + Assesses the performance and error distribution of a regression model using various error metrics. ###### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index ac2e97862..b1c67735e 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### RegressionErrorsComparison +```python +def RegressionErrorsComparison( + datasets, + models): +``` + Assesses multiple regression error metrics to compare model performance across different datasets, emphasizing systematic overestimation or underestimation and large percentage errors. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 12bacfbf5..dde2428ee 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### RegressionPerformance +```python +def RegressionPerformance( + model: VMModel, + dataset: VMDataset): +``` + Evaluates the performance of a regression model using five different metrics**: MAE, MSE, RMSE, MAPE, and MBD. ###### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 733696e39..8a9f18444 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### RegressionR2Square +```python +def RegressionR2Square( + dataset, + model): +``` + Assesses the overall goodness-of-fit of a regression model by evaluating R-squared (R2) and Adjusted R-squared (Adj R2) scores to determine the model's explanatory power over the dependent variable. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index c8e8e2ce9..6949872e2 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### RegressionR2SquareComparison +```python +def RegressionR2SquareComparison( + datasets, + models): +``` + Compares R-Squared and Adjusted R-Squared values for different regression models across multiple datasets to assess model performance and relevance of features. diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index e9bf9904f..4ff547414 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -11,6 +11,15 @@ toc-expand: 3 #### RobustnessDiagnosis +```python +def RobustnessDiagnosis( + datasets: List, + model: VMModel, + metric: str = None, + scaling_factor_std_dev_list: List = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'}, + performance_decay_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): +``` + Assesses the robustness of a machine learning model by evaluating performance decay under noisy conditions. ###### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 757573c1b..7da86ddc8 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### generate_shap_plot +```python +def generate_shap_plot( + type_, + shap_values, + x_test): +``` + Plots two types of SHAP global importance (SHAP). **Arguments** @@ -29,6 +36,12 @@ Plots two types of SHAP global importance (SHAP). #### select_shap_values +```python +def select_shap_values( + shap_values, + class_of_interest): +``` + Selects SHAP values for binary or multiclass classification. For regression models, returns the SHAP values directly as there are no classes. @@ -53,6 +66,15 @@ For regression models, returns the SHAP values directly as there are no classes. #### SHAPGlobalImportance +```python +def SHAPGlobalImportance( + model: VMModel, + dataset: VMDataset, + kernel_explainer_samples: int = 10, + tree_or_linear_explainer_samples: int = 200, + class_of_interest: int = None): +``` + Evaluates and visualizes global feature importance using SHAP values for model explanation and risk identification. ###### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 9f0b4b495..d394cefcb 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -11,6 +11,14 @@ toc-expand: 3 #### ScoreProbabilityAlignment +```python +def ScoreProbabilityAlignment( + model: VMModel, + dataset: VMDataset, + score_column: str = 'score', + n_bins: int = 10): +``` + Analyzes the alignment between credit scores and predicted probabilities. ###### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 3b7fb9bc3..5a81689ba 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### SilhouettePlot +```python +def SilhouettePlot( + model: VMModel, + dataset: VMDataset): +``` + Calculates and visualizes Silhouette Score, assessing the degree of data point suitability to its cluster in ML models. diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index cb97cb9d2..e87ec64e9 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### TrainingTestDegradation +```python +def TrainingTestDegradation( + datasets: List, + model: VMModel, + max_threshold: float = 0.1): +``` + Tests if model performance degradation between training and test datasets exceeds a predefined threshold. ###### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 025e62a55..6902db905 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### VMeasure +```python +def VMeasure( + dataset: VMDataset, + model: VMModel): +``` + Evaluates homogeneity and completeness of a clustering model using the V Measure Score. ###### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index f37272032..d41af8671 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -11,6 +11,15 @@ toc-expand: 3 #### WeakspotsDiagnosis +```python +def WeakspotsDiagnosis( + datasets: List, + model: VMModel, + features_columns: Union = None, + metrics: Union = None, + thresholds: Union = None): +``` + Identifies and visualizes weak spots in a machine learning model's performance across various sections of the feature space. diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index c3c5f2447..544447332 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### AutoARIMA +```python +def AutoARIMA( + model: VMModel, + dataset: VMDataset): +``` + Evaluates ARIMA models for time-series forecasting, ranking them using Bayesian and Akaike Information Criteria. ###### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 08cb3426b..5a86ace41 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### CumulativePredictionProbabilities +```python +def CumulativePredictionProbabilities( + dataset, + model, + title = 'Cumulative Probabilities'): +``` + Visualizes cumulative probabilities of positive and negative classes for both training and testing in classification models. ###### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 133bf3aa7..a1f13714b 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### DurbinWatsonTest +```python +def DurbinWatsonTest( + dataset, + model, + threshold = {'cls': 'ExprList', 'elements': ['1.5', '2.5']}): +``` + Assesses autocorrelation in time series data features using the Durbin-Watson statistic. ###### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index 4f0e02cdd..78a839134 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### GINITable +```python +def GINITable( + dataset, + model): +``` + Evaluates classification model performance using AUC, GINI, and KS metrics for training and test datasets. ###### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 6d7863cb2..824510e7a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### KolmogorovSmirnov +```python +def KolmogorovSmirnov( + model: VMModel, + dataset: VMDataset, + dist: str = 'norm'): +``` + Assesses whether each feature in the dataset aligns with a normal distribution using the Kolmogorov-Smirnov test. ###### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 8312f5b2d..0ab949927 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### Lilliefors +```python +def Lilliefors( + dataset: VMDataset): +``` + Assesses the normality of feature distributions in an ML model's training dataset using the Lilliefors test. ###### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index 4d52c026c..828940b0c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### PredictionProbabilitiesHistogram +```python +def PredictionProbabilitiesHistogram( + dataset, + model, + title = 'Histogram of Predictive Probabilities'): +``` + Assesses the predictive probability distribution for binary classification to evaluate model performance and potential overfitting or bias. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 0c93d0b89..1c968fee3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -11,6 +11,11 @@ toc-expand: 3 #### RegressionCoeffs +```python +def RegressionCoeffs( + model): +``` + Assesses the significance and uncertainty of predictor variables in a regression model through visualization of coefficients and their 95% confidence intervals. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index e7f59f083..93cc22a3f 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### RegressionFeatureSignificance +```python +def RegressionFeatureSignificance( + model: VMModel, + fontsize: int = 10, + p_threshold: float = 0.05): +``` + Assesses and visualizes the statistical significance of features in a regression model. ###### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 5a64016c3..71894fc32 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -11,6 +11,14 @@ toc-expand: 3 #### RegressionModelForecastPlot +```python +def RegressionModelForecastPlot( + model: VMModel, + dataset: VMDataset, + start_date: Union = None, + end_date: Union = None): +``` + Generates plots to visually compare the forecasted outcomes of a regression model against actual observed values over a specified date range. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 3e531f48c..fd4de08c1 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -11,9 +11,21 @@ toc-expand: 3 #### integrate_diff +```python +def integrate_diff( + series_diff, + start_value): +``` + #### RegressionModelForecastPlotLevels +```python +def RegressionModelForecastPlotLevels( + model: VMModel, + dataset: VMDataset): +``` + Assesses the alignment between forecasted and observed values in regression models through visual plots ###### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 96ec87bad..2685d7ef0 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -11,9 +11,23 @@ toc-expand: 3 #### integrate_diff +```python +def integrate_diff( + series_diff, + start_value): +``` + #### RegressionModelSensitivityPlot +```python +def RegressionModelSensitivityPlot( + dataset: VMDataset, + model: VMModel, + shocks: List = {'cls': 'ExprList', 'elements': ['0.1']}, + transformation: Union = None): +``` + Assesses the sensitivity of a regression model to changes in independent variables by applying shocks and visualizing the impact. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index d2c528ec1..6f84587a8 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### RegressionModelSummary +```python +def RegressionModelSummary( + dataset: VMDataset, + model: VMModel): +``` + Evaluates regression model performance using metrics including R-Squared, Adjusted R-Squared, MSE, and RMSE. ###### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 8e434cb70..049fc2ebe 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -11,6 +11,14 @@ toc-expand: 3 #### RegressionPermutationFeatureImportance +```python +def RegressionPermutationFeatureImportance( + dataset: VMDataset, + model: VMModel, + fontsize: int = 12, + figure_height: int = 500): +``` + Assesses the significance of each feature in a model by evaluating the impact on model performance when feature values are randomly rearranged. diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index fa82bf820..43469ad4c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### ScorecardHistogram +```python +def ScorecardHistogram( + dataset, + title = 'Histogram of Scores', + score_column = 'score'): +``` + The Scorecard Histogram test evaluates the distribution of credit scores between default and non-default instances, providing critical insights into the performance and generalizability of credit-risk models. diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 1dfd8b3c4..1c59226aa 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -11,6 +11,14 @@ toc-expand: 3 #### adj_r2_score +```python +def adj_r2_score( + actual: , + predicted: , + rowcount: int, + featurecount: int): +``` + Adjusted R2 Score diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index ee3da7cec..9752db8dc 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### Bias +```python +def Bias( + model, + min_threshold = 7): +``` + Assesses potential bias in a Large Language Model by analyzing the distribution and order of exemplars in the prompt. diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index e004412ed..2fbf83d62 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### Clarity +```python +def Clarity( + model, + min_threshold = 7): +``` + Evaluates and scores the clarity of prompts in a Large Language Model based on specified guidelines. ###### Purpose diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 2469ee5b6..1b9d5fa8c 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### Conciseness +```python +def Conciseness( + model, + min_threshold = 7): +``` + Analyzes and grades the conciseness of prompts provided to a Large Language Model. ###### Purpose diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index dde1d56af..dc2a020a2 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### Delimitation +```python +def Delimitation( + model, + min_threshold = 7): +``` + Evaluates the proper use of delimiters in prompts provided to Large Language Models. ###### Purpose diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index f583243e0..025b92699 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### NegativeInstruction +```python +def NegativeInstruction( + model, + min_threshold = 7): +``` + Evaluates and grades the use of affirmative, proactive language over negative instructions in LLM prompts. ###### Purpose diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 963b62e03..978463966 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -11,6 +11,13 @@ toc-expand: 3 #### Robustness +```python +def Robustness( + model, + dataset, + num_tests = 10): +``` + Assesses the robustness of prompts provided to a Large Language Model under varying conditions and contexts. This test specifically measures the model's ability to generate correct classifications with the given prompt even when the inputs are edge cases or otherwise difficult to classify. diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 2caa578ad..eca27f2e1 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### Specificity +```python +def Specificity( + model, + min_threshold = 7): +``` + Evaluates and scores the specificity of prompts provided to a Large Language Model (LLM), based on clarity, detail, and relevance. diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index a12f2301d..ae432840a 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -11,6 +11,14 @@ toc-expand: 3 #### call_model +```python +def call_model( + system_prompt: str, + user_prompt: str, + temperature: float = 0.0, + seed: int = 42): +``` + Call LLM with the given prompts and return the response @@ -19,6 +27,11 @@ Call LLM with the given prompts and return the response #### get_explanation +```python +def get_explanation( + response: str): +``` + Get just the explanation from the response string - **TODO****: use json response mode instead of this @@ -31,6 +44,11 @@ Explanation: " -> "" #### get_score +```python +def get_score( + response: str): +``` + Get just the score from the response string - **TODO****: use json response mode instead of this diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 419f66214..ca41e6105 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -11,6 +11,12 @@ toc-expand: 3 #### describe_metric +```python +def describe_metric( + metric_id: str, + **kwargs = {}): +``` + Describe a metric @@ -19,6 +25,11 @@ Describe a metric #### list_metrics +```python +def list_metrics( + **kwargs = {}): +``` + List all metrics @@ -27,6 +38,12 @@ List all metrics #### run_metric +```python +def run_metric( + metric_id: str, + **kwargs = {}): +``` + Run a metric diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 13de2fcb3..3c1f5b9e6 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -2,7 +2,7 @@ import json import os from pathlib import Path -from typing import Any, Dict, Set +from typing import Any, Dict, Set, List from jinja2 import Environment, FileSystemLoader def resolve_alias(member: Dict[str, Any], data: Dict[str, Any]) -> Dict[str, Any]: @@ -77,6 +77,61 @@ def ensure_dir(path): """Create directory if it doesn't exist.""" Path(path).mkdir(parents=True, exist_ok=True) +def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: Dict[str, Any], is_root: bool = False) -> Dict[str, List[Dict[str, str]]]: + """Collect all documented items from a module and its submodules.""" + result = {} + + # Skip if no members + if not module.get('members'): + return result + + # Build the current file path + file_path = '/'.join(path) + module_name = module.get('name', 'root') + + # Collect items from this module + module_items = [] + for member in sort_members(module['members']): + if not is_public(member, module, full_data, is_root): + continue + + if member['kind'] in ('function', 'class'): + module_items.append({ + 'text': f"{member['name']}()" if member['kind'] == 'function' else member['name'], + 'file': f"{file_path}.qmd#{member['name']}" + }) + elif member['kind'] == 'alias': + target = resolve_alias(member, full_data) + if target and target.get('docstring'): + module_items.append({ + 'text': f"{member['name']}()", + 'file': f"{file_path}.qmd#{member['name']}" + }) + + if module_items: + # For root module, store under 'root' key + if is_root: + result['root'] = module_items + else: + result[module_name] = module_items + + # Recursively collect from submodules + for member in sort_members(module['members']): + if member['kind'] == 'module' and is_public(member, module, full_data, is_root): + submodule_path = path + [member['name']] + submodule_items = collect_documented_items(member, submodule_path, full_data, False) + result.update(submodule_items) + + # Also check for nested modules in the submodule + if member.get('members'): + for submember in sort_members(member['members']): + if submember['kind'] == 'module' and is_public(submember, member, full_data, False): + subsubmodule_path = submodule_path + [submember['name']] + subsubmodule_items = collect_documented_items(submember, subsubmodule_path, full_data, False) + result.update(subsubmodule_items) + + return result + def process_module(module: Dict[str, Any], path: list, env: Environment, data: Dict[str, Any]): """Process a module and its members.""" module_dir = os.path.join('docs', *path[:-1]) @@ -127,16 +182,25 @@ def generate_docs(json_path: str, template_dir: str, output_dir: str): # Start processing from root module if 'validmind' in data: - # Generate module documentation + # First pass: Generate module documentation process_module(data['validmind'], ['validmind'], env, data) - # Generate sidebar + # Second pass: Collect all documented items + documented_items = collect_documented_items( + module=data['validmind'], + path=['validmind'], + full_data=data, + is_root=True + ) + + # Generate sidebar with collected items sidebar_template = env.get_template('sidebar.qmd.jinja2') sidebar_output = sidebar_template.render( module=data['validmind'], full_data=data, is_root=True, - resolve_alias=resolve_alias + resolve_alias=resolve_alias, + documented_items=documented_items ) # Write sidebar From 52cfcc1ed97d771e70d90ea3f97a6e18d3f3ff9c Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Mon, 27 Jan 2025 10:13:19 -0800 Subject: [PATCH 013/207] Save point --- docs/templates/function.qmd.jinja2 | 4 +- docs/templates/macros/docstring.jinja2 | 98 +++----- docs/validmind.qmd | 237 +++--------------- docs/validmind/datasets.qmd | 7 - docs/validmind/datasets/classification.qmd | 7 - .../classification/customer_churn.qmd | 27 +- .../datasets/classification/taiwan_credit.qmd | 12 +- docs/validmind/datasets/credit_risk.qmd | 7 - .../datasets/credit_risk/lending_club.qmd | 75 ++---- .../credit_risk/lending_club_bias.qmd | 23 +- docs/validmind/datasets/nlp.qmd | 7 - docs/validmind/datasets/nlp/cnn_dailymail.qmd | 31 +-- .../datasets/nlp/twitter_covid_19.qmd | 9 +- docs/validmind/datasets/regression.qmd | 7 - docs/validmind/datasets/regression/fred.qmd | 45 +--- .../datasets/regression/lending_club.qmd | 30 +-- docs/validmind/errors.qmd | 187 +------------- docs/validmind/test_suites.qmd | 41 +-- docs/validmind/test_suites/classifier.qmd | 37 +-- docs/validmind/test_suites/cluster.qmd | 27 +- docs/validmind/test_suites/embeddings.qmd | 27 +- docs/validmind/test_suites/llm.qmd | 19 -- docs/validmind/test_suites/nlp.qmd | 14 -- .../test_suites/parameters_optimization.qmd | 17 +- docs/validmind/test_suites/regression.qmd | 21 -- .../test_suites/statsmodels_timeseries.qmd | 19 -- docs/validmind/test_suites/summarization.qmd | 14 -- .../test_suites/tabular_datasets.qmd | 27 +- docs/validmind/test_suites/text_data.qmd | 14 -- docs/validmind/test_suites/time_series.qmd | 56 +---- docs/validmind/tests.qmd | 19 +- docs/validmind/tests/data_validation.qmd | 4 - .../tests/data_validation/ACFandPACFPlot.qmd | 44 +--- docs/validmind/tests/data_validation/ADF.qmd | 43 +--- .../tests/data_validation/AutoAR.qmd | 44 +--- .../tests/data_validation/AutoMA.qmd | 59 ++--- .../data_validation/AutoStationarity.qmd | 58 ++--- .../data_validation/BivariateScatterPlots.qmd | 41 +-- .../tests/data_validation/BoxPierce.qmd | 46 +--- .../ChiSquaredFeaturesTable.qmd | 46 +--- .../tests/data_validation/ClassImbalance.qmd | 58 ++--- .../data_validation/DatasetDescription.qmd | 82 ++---- .../tests/data_validation/DatasetSplit.qmd | 50 ++-- .../data_validation/DescriptiveStatistics.qmd | 62 ++--- .../tests/data_validation/DickeyFullerGLS.qmd | 51 ++-- .../tests/data_validation/Duplicates.qmd | 53 ++-- .../data_validation/EngleGrangerCoint.qmd | 50 ++-- .../FeatureTargetCorrelationPlot.qmd | 45 +--- .../tests/data_validation/HighCardinality.qmd | 41 +-- .../HighPearsonCorrelation.qmd | 45 +--- .../data_validation/IQROutliersBarPlot.qmd | 59 ++--- .../data_validation/IQROutliersTable.qmd | 49 +--- .../IsolationForestOutliers.qmd | 36 +-- .../tests/data_validation/JarqueBera.qmd | 47 +--- docs/validmind/tests/data_validation/KPSS.qmd | 45 +--- .../tests/data_validation/LJungBox.qmd | 36 +-- .../LaggedCorrelationHeatmap.qmd | 46 +--- .../tests/data_validation/MissingValues.qmd | 42 +--- .../data_validation/MissingValuesBarPlot.qmd | 49 +--- .../data_validation/MutualInformation.qmd | 32 +-- .../PearsonCorrelationMatrix.qmd | 46 +--- .../data_validation/PhillipsPerronArch.qmd | 39 +-- .../ProtectedClassesCombination.qmd | 31 +-- .../ProtectedClassesDescription.qmd | 33 +-- .../ProtectedClassesDisparity.qmd | 36 +-- .../ProtectedClassesThresholdOptimizer.qmd | 54 ++-- .../data_validation/RollingStatsPlot.qmd | 66 ++--- .../tests/data_validation/RunsTest.qmd | 49 +--- .../tests/data_validation/ScatterPlot.qmd | 45 +--- .../data_validation/ScoreBandDefaultRates.qmd | 32 +-- .../data_validation/SeasonalDecompose.qmd | 48 +--- .../tests/data_validation/ShapiroWilk.qmd | 50 ++-- .../tests/data_validation/Skewness.qmd | 38 +-- .../tests/data_validation/SpreadPlot.qmd | 49 ++-- .../TabularCategoricalBarPlots.qmd | 43 +--- .../TabularDateTimeHistograms.qmd | 54 ++-- .../TabularDescriptionTables.qmd | 72 ++---- .../TabularNumericalHistograms.qmd | 44 +--- .../data_validation/TargetRateBarPlots.qmd | 48 +--- .../data_validation/TimeSeriesDescription.qmd | 39 +-- .../TimeSeriesDescriptiveStatistics.qmd | 31 +-- .../data_validation/TimeSeriesFrequency.qmd | 54 ++-- .../data_validation/TimeSeriesHistogram.qmd | 33 +-- .../data_validation/TimeSeriesLinePlot.qmd | 52 ++-- .../TimeSeriesMissingValues.qmd | 45 +--- .../data_validation/TimeSeriesOutliers.qmd | 38 +-- .../data_validation/TooManyZeroValues.qmd | 70 ++---- .../tests/data_validation/UniqueRows.qmd | 52 ++-- .../tests/data_validation/WOEBinPlots.qmd | 57 ++--- .../tests/data_validation/WOEBinTable.qmd | 45 +--- .../data_validation/ZivotAndrewsArch.qmd | 48 +--- docs/validmind/tests/data_validation/nlp.qmd | 4 - .../tests/data_validation/nlp/CommonWords.qmd | 43 +--- .../tests/data_validation/nlp/Hashtags.qmd | 50 ++-- .../data_validation/nlp/LanguageDetection.qmd | 32 +-- .../tests/data_validation/nlp/Mentions.qmd | 44 +--- .../nlp/PolarityAndSubjectivity.qmd | 32 +-- .../data_validation/nlp/Punctuations.qmd | 44 +--- .../tests/data_validation/nlp/Sentiment.qmd | 30 +-- .../tests/data_validation/nlp/StopWords.qmd | 56 +---- .../data_validation/nlp/TextDescription.qmd | 37 +-- .../tests/data_validation/nlp/Toxicity.qmd | 29 +-- docs/validmind/tests/model_validation.qmd | 4 - .../tests/model_validation/BertScore.qmd | 57 ++--- .../tests/model_validation/BleuScore.qmd | 52 ++-- .../ClusterSizeDistribution.qmd | 38 +-- .../model_validation/ContextualRecall.qmd | 55 ++-- .../tests/model_validation/FeaturesAUC.qmd | 54 ++-- .../tests/model_validation/MeteorScore.qmd | 64 ++--- .../tests/model_validation/ModelMetadata.qmd | 14 +- .../ModelPredictionResiduals.qmd | 33 +-- .../tests/model_validation/RegardScore.qmd | 49 ++-- .../RegressionResidualsPlot.qmd | 41 +-- .../tests/model_validation/RougeScore.qmd | 56 ++--- .../TimeSeriesPredictionWithCI.qmd | 38 +-- .../TimeSeriesPredictionsPlot.qmd | 26 +- .../TimeSeriesR2SquareBySegments.qmd | 36 +-- .../tests/model_validation/TokenDisparity.qmd | 49 ++-- .../tests/model_validation/ToxicityScore.qmd | 43 +--- .../tests/model_validation/sklearn.qmd | 4 - .../sklearn/AdjustedMutualInformation.qmd | 52 ++-- .../sklearn/AdjustedRandIndex.qmd | 44 +--- .../sklearn/CalibrationCurve.qmd | 38 +-- .../sklearn/ClassifierPerformance.qmd | 39 +-- .../ClassifierThresholdOptimization.qmd | 66 ++--- .../sklearn/ClusterCosineSimilarity.qmd | 54 ++-- .../sklearn/ClusterPerformanceMetrics.qmd | 47 +--- .../sklearn/CompletenessScore.qmd | 48 ++-- .../sklearn/ConfusionMatrix.qmd | 60 ++--- .../sklearn/FeatureImportance.qmd | 42 +--- .../sklearn/FowlkesMallowsScore.qmd | 55 ++-- .../sklearn/HomogeneityScore.qmd | 47 +--- .../sklearn/HyperParametersTuning.qmd | 38 +-- .../sklearn/KMeansClustersOptimization.qmd | 54 ++-- .../sklearn/MinimumAccuracy.qmd | 33 +-- .../sklearn/MinimumF1Score.qmd | 44 +--- .../sklearn/MinimumROCAUCScore.qmd | 52 ++-- .../sklearn/ModelParameters.qmd | 32 +-- .../sklearn/ModelsPerformanceComparison.qmd | 51 ++-- .../sklearn/OverfitDiagnosis.qmd | 36 +-- .../sklearn/PermutationFeatureImportance.qmd | 47 +--- .../sklearn/PopulationStabilityIndex.qmd | 71 ++---- .../sklearn/PrecisionRecallCurve.qmd | 51 ++-- .../model_validation/sklearn/ROCCurve.qmd | 58 ++--- .../sklearn/RegressionErrors.qmd | 37 +-- .../sklearn/RegressionErrorsComparison.qmd | 45 +--- .../sklearn/RegressionPerformance.qmd | 38 +-- .../sklearn/RegressionR2Square.qmd | 45 +--- .../sklearn/RegressionR2SquareComparison.qmd | 44 +--- .../sklearn/RobustnessDiagnosis.qmd | 32 +-- .../sklearn/SHAPGlobalImportance.qmd | 83 ++---- .../sklearn/ScoreProbabilityAlignment.qmd | 33 +-- .../sklearn/SilhouettePlot.qmd | 57 ++--- .../sklearn/TrainingTestDegradation.qmd | 48 +--- .../model_validation/sklearn/VMeasure.qmd | 48 +--- .../sklearn/WeakspotsDiagnosis.qmd | 65 ++--- .../tests/model_validation/statsmodels.qmd | 4 - .../statsmodels/AutoARIMA.qmd | 64 ++--- .../CumulativePredictionProbabilities.qmd | 58 ++--- .../statsmodels/DurbinWatsonTest.qmd | 44 +--- .../statsmodels/GINITable.qmd | 62 ++--- .../statsmodels/KolmogorovSmirnov.qmd | 37 +-- .../statsmodels/Lilliefors.qmd | 56 ++--- .../PredictionProbabilitiesHistogram.qmd | 29 +-- .../statsmodels/RegressionCoeffs.qmd | 58 ++--- .../RegressionFeatureSignificance.qmd | 49 ++-- .../RegressionModelForecastPlot.qmd | 53 ++-- .../RegressionModelForecastPlotLevels.qmd | 36 +-- .../RegressionModelSensitivityPlot.qmd | 53 ++-- .../statsmodels/RegressionModelSummary.qmd | 33 +-- ...RegressionPermutationFeatureImportance.qmd | 45 +--- .../statsmodels/ScorecardHistogram.qmd | 55 ++-- .../statsmodels/statsutils.qmd | 12 +- docs/validmind/tests/prompt_validation.qmd | 4 - .../tests/prompt_validation/Bias.qmd | 61 ++--- .../tests/prompt_validation/Clarity.qmd | 38 +-- .../tests/prompt_validation/Conciseness.qmd | 34 +-- .../tests/prompt_validation/Delimitation.qmd | 40 +-- .../prompt_validation/NegativeInstruction.qmd | 51 ++-- .../tests/prompt_validation/Robustness.qmd | 48 +--- .../tests/prompt_validation/Specificity.qmd | 41 +-- .../prompt_validation/ai_powered_test.qmd | 40 +-- docs/validmind/unit_metrics.qmd | 24 +- docs/validmind/vm_models.qmd | 9 - scripts/generate_quarto_docs.py | 107 ++++++++ 185 files changed, 2096 insertions(+), 5966 deletions(-) diff --git a/docs/templates/function.qmd.jinja2 b/docs/templates/function.qmd.jinja2 index 4385f152f..35b45638e 100644 --- a/docs/templates/function.qmd.jinja2 +++ b/docs/templates/function.qmd.jinja2 @@ -1,6 +1,6 @@ -{%- if member.kind == "function" %} +{% if member.kind == "function" %} -#### {{ member.name }} +## {{ member.name }}[()]{.muted} ```python {% if member.labels and "async" in member.labels %}async {% endif %}def {{ member.name }}( diff --git a/docs/templates/macros/docstring.jinja2 b/docs/templates/macros/docstring.jinja2 index ddf65f93e..b31a7df28 100644 --- a/docs/templates/macros/docstring.jinja2 +++ b/docs/templates/macros/docstring.jinja2 @@ -1,66 +1,50 @@ {% macro format_docstring(docstring) %} {% if docstring is mapping %} - {%- set content = docstring.value -%} - {%- set content = content.replace(':\n-', ':\n\n-') -%} - {%- set content = content.replace('\n ', ' ') -%} - {%- set content = content.replace(':param ', '\n**Parameters**\n\n- **') -%} - {%- set content = content.replace(': ', '**: ', 1) -%} - {%- set content = content.replace(':return: ', '\n**Returns**\n\n- ') -%} - {%- set lines = content.split('\n') -%} - {%- set formatted_lines = [] -%} - {%- for line in lines -%} - {%- if line.startswith('### ') -%} - {%- set line = line.replace('### ', '###### ') -%} - {%- elif line.strip() == 'Args:' -%} - {%- set line = '**Arguments**\n' -%} - {%- elif line.strip() == 'Attributes:' -%} - {%- set line = '**Attributes**\n' -%} - {%- elif line.strip() == 'Raises:' -%} - {%- set line = '**Raises**\n' -%} - {%- elif line.strip() == 'Returns:' -%} - {%- set line = '**Returns**\n' -%} - {%- elif line.startswith(' ') -%} - {%- set trimmed = line.strip() -%} - {%- if ':' in trimmed -%} - {%- set parts = trimmed.split(':', 1) -%} - {%- set param = parts[0].strip() -%} - {%- set desc = parts[1].strip() -%} - {%- if '[DEPRECATED]' in desc -%} - {%- set desc = desc.replace('[DEPRECATED]', '') ~ '^[**Deprecation notice**
`' ~ param ~ '` has been deprecated and will be removed in a future release.]' -%} - {%- endif -%} - {%- set line = '- **' ~ param ~ '**: ' ~ desc -%} - {%- else -%} - {%- set line = '- ' ~ trimmed -%} - {%- endif -%} + {%- if docstring.parsed is defined and docstring.parsed is not none -%} + {# Try to use docstring-parser output #} + {%- set sections = [] -%} + + {# Main description #} + {%- if docstring.parsed.short_description -%} + {%- set _ = sections.append(docstring.parsed.short_description) -%} {%- endif -%} - {%- if line.strip() or line.startswith(' ') -%} - {%- set _ = formatted_lines.append(line) -%} + {%- if docstring.parsed.long_description -%} + {%- set _ = sections.append(docstring.parsed.long_description) -%} + {%- endif -%} + + {# Parameters #} + {%- if docstring.parsed.params -%} + {%- set _ = sections.append("**Parameters**\n") -%} + {%- for param in docstring.parsed.params -%} + {%- set _ = sections.append("- **" ~ param.arg_name ~ "**: " ~ param.description) -%} + {%- endfor -%} + {%- endif -%} + + {# Returns #} + {%- if docstring.parsed.returns -%} + {%- set _ = sections.append("**Returns**\n") -%} + {%- set _ = sections.append("- " ~ docstring.parsed.returns.description) -%} + {%- endif -%} + + {# Raises #} + {%- if docstring.parsed.raises -%} + {%- set _ = sections.append("**Raises**\n") -%} + {%- for raises in docstring.parsed.raises -%} + {%- set _ = sections.append("- **" ~ raises.type_name ~ "**: " ~ raises.description) -%} + {%- endfor -%} + {%- endif -%} + + {# If we got any sections, join them, otherwise fall back to value #} + {%- if sections -%} + {{ sections | join('\n\n') }} {%- else -%} - {%- set _ = formatted_lines.append('') -%} + {{ docstring.value }} {%- endif -%} - {%- endfor -%} -{{ formatted_lines | join('\n') }} - -{% if docstring.params %} -**Parameters:** -{% for param in docstring.params %} - `{{ param.name }}`: {{ param.description }} -{% endfor %} -{% endif %} - -{% if docstring.returns %} -**Returns:** -{{ docstring.returns }} -{% endif %} - -{% if docstring.raises %} -**Raises:** -{% for error in docstring.raises %} - `{{ error.type }}`: {{ error.description }} -{% endfor %} -{% endif %} + {%- else -%} + {# Always fall back to value if no parsed content #} + {{ docstring.value }} + {%- endif -%} {% else %} {{ docstring }} - {% endif %} {% endmacro %} \ No newline at end of file diff --git a/docs/validmind.qmd b/docs/validmind.qmd index b8651387b..a263a5381 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -33,10 +33,6 @@ vm.init( After you have pasted the code snippet into your development source code and executed the code, the Python Library API will register with ValidMind. You can now use the ValidMind Library to document and test your models, and to upload to the ValidMind Platform. - - - - ## Python API ### __version__ @@ -57,21 +53,9 @@ def get_test_suite( Gets a TestSuite object for the current project or a specific test suite -This function provides an interface to retrieve the TestSuite instance for the -current project or a specific TestSuite instance identified by test_suite_id. -The project Test Suite will contain sections for every section in the project's -documentation template and these Test Suite Sections will contain all the tests -associated with that template section. - -**Arguments** - -- **test_suite_id (str, optional)****: The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. -- **section (str, optional)**: The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. -- **args**: Additional arguments to pass to the TestSuite -- **kwargs**: Additional keyword arguments to pass to the TestSuite - - +This function provides an interface to retrieve the TestSuite instance for the current project or a specific TestSuite instance identified by test_suite_id. The project Test Suite will contain sections for every section in the project's documentation template and these Test Suite Sections will contain all the tests associated with that template section. +Args: test_suite_id (str, optional): The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. section (str, optional): The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. args: Additional arguments to pass to the TestSuite kwargs: Additional keyword arguments to pass to the TestSuite ### init[()]{.muted} @@ -85,27 +69,13 @@ def init( monitoring: bool = False): ``` -Initializes the API client instances and calls the /ping endpoint to ensure -the provided credentials are valid and we can connect to the ValidMind API. - -If the API key and secret are not provided, the client will attempt to -retrieve them from the environment variables `VM_API_KEY` and `VM_API_SECRET`. - -**Arguments** - -- **project (str, optional)****: The project CUID. Alias for model. Defaults to None. ^[**Deprecation notice**
`project (str, optional)**` has been deprecated and will be removed in a future release.] -- **model (str, optional)**: The model CUID. Defaults to None. -- **api_key (str, optional)**: The API key. Defaults to None. -- **api_secret (str, optional)**: The API secret. Defaults to None. -- **api_host (str, optional)**: The API host. Defaults to None. -- **monitoring (bool)**: The ongoing monitoring flag. Defaults to False. - -**Raises** - -- **ValueError**: If the API key and secret are not provided +Initializes the API client instances and calls the /ping endpoint to ensure the provided credentials are valid and we can connect to the ValidMind API. +If the API key and secret are not provided, the client will attempt to retrieve them from the environment variables `VM_API_KEY` and `VM_API_SECRET`. +Args: project (str, optional): The project CUID. Alias for model. Defaults to None. [DEPRECATED] model (str, optional): The model CUID. Defaults to None. api_key (str, optional): The API key. Defaults to None. api_secret (str, optional): The API secret. Defaults to None. api_host (str, optional): The API host. Defaults to None. monitoring (bool): The ongoing monitoring flag. Defaults to False. +Raises: ValueError: If the API key and secret are not provided ### init_dataset[()]{.muted} @@ -127,9 +97,7 @@ def init_dataset( __log = True) -> VMDataset: ``` -Initializes a VM Dataset, which can then be passed to other functions -that can perform additional analysis and tests on the data. This function -also ensures we are reading a valid dataset type. +Initializes a VM Dataset, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are reading a valid dataset type. The following dataset types are supported: @@ -138,29 +106,11 @@ The following dataset types are supported: - Numpy ndarray - Torch TensorDataset -**Arguments** - -- **dataset ****: dataset from various python libraries -- **model (VMModel)**: ValidMind model object -- **targets (vm.vm.DatasetTargets)**: A list of target variables -- **target_column (str)**: The name of the target column in the dataset -- **feature_columns (list)**: A list of names of feature columns in the dataset -- **extra_columns (dictionary)**: A dictionary containing the names of the -- prediction_column and group_by_columns in the dataset -- **class_labels (dict)**: A list of class labels for classification problems -- **type (str)**: The type of dataset (one of DATASET_TYPES) -- **input_id (str)**: The input ID for the dataset (e.g. "my_dataset"). By default, this will be set to `dataset` but if you are passing this dataset as a test input using some other key than `dataset`, then you should set this to the same key. - -**Raises** - -- **ValueError**: If the dataset type is not supported - -**Returns** - -- **vm.vm.Dataset**: A VM Dataset instance - +Args: dataset : dataset from various python libraries model (VMModel): ValidMind model object targets (vm.vm.DatasetTargets): A list of target variables target_column (str): The name of the target column in the dataset feature_columns (list): A list of names of feature columns in the dataset extra_columns (dictionary): A dictionary containing the names of the prediction_column and group_by_columns in the dataset class_labels (dict): A list of class labels for classification problems type (str): The type of dataset (one of DATASET_TYPES) input_id (str): The input ID for the dataset (e.g. "my_dataset"). By default, this will be set to `dataset` but if you are passing this dataset as a test input using some other key than `dataset`, then you should set this to the same key. +Raises: ValueError: If the dataset type is not supported +Returns: vm.vm.Dataset: A VM Dataset instance ### init_model[()]{.muted} @@ -174,28 +124,13 @@ def init_model( **kwargs = {}) -> VMModel: ``` -Initializes a VM Model, which can then be passed to other functions -that can perform additional analysis and tests on the data. This function -also ensures we are creating a model supported libraries. - -**Arguments** - -- **model****: A trained model or VMModel instance -- **input_id (str)**: The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. -- **attributes (dict)**: A dictionary of model attributes -- **predict_fn (callable)**: A function that takes an input and returns a prediction -- ****kwargs**: Additional arguments to pass to the model - -**Raises** - -- **ValueError**: If the model type is not supported - -**Returns** - -- **vm.VMModel**: A VM Model instance +Initializes a VM Model, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are creating a model supported libraries. +Args: model: A trained model or VMModel instance input_id (str): The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. attributes (dict): A dictionary of model attributes predict_fn (callable): A function that takes an input and returns a prediction \*\*kwargs: Additional arguments to pass to the model +Raises: ValueError: If the model type is not supported +Returns: vm.VMModel: A VM Model instance ### init_r_model[()]{.muted} @@ -207,29 +142,18 @@ def init_r_model( Initializes a VM Model for an R model -R models must be saved to disk and the filetype depends on the model type... -Currently we support the following model types: +R models must be saved to disk and the filetype depends on the model type... Currently we support the following model types: -- LogisticRegression `glm` model in R**: saved as an RDS file with `saveRDS` +- LogisticRegression `glm` model in R: saved as an RDS file with `saveRDS` - LinearRegression `lm` model in R: saved as an RDS file with `saveRDS` - XGBClassifier: saved as a .json or .bin file with `xgb.save` - XGBRegressor: saved as a .json or .bin file with `xgb.save` -LogisticRegression and LinearRegression models are converted to sklearn models by extracting -the coefficients and intercept from the R model. XGB models are loaded using the xgboost -since xgb models saved in .json or .bin format can be loaded directly with either Python or R - -**Arguments** - -- **model_path (str)**: The path to the R model saved as an RDS or XGB file -- **model_type (str)**: The type of the model (one of R_MODEL_TYPES) - -**Returns** - -- **vm.vm.Model**: A VM Model instance - +LogisticRegression and LinearRegression models are converted to sklearn models by extracting the coefficients and intercept from the R model. XGB models are loaded using the xgboost since xgb models saved in .json or .bin format can be loaded directly with either Python or R +Args: model_path (str): The path to the R model saved as an RDS or XGB file model_type (str): The type of the model (one of R_MODEL_TYPES) +Returns: vm.vm.Model: A VM Model instance ### log_metric[()]{.muted} @@ -245,23 +169,9 @@ def log_metric( Logs a unit metric -Unit metrics are key-value pairs where the key is the metric name and the value is -a scalar (int or float). These key-value pairs are associated with the currently -selected model (inventory model in the ValidMind Platform) and keys can be logged -to over time to create a history of the metric. On the ValidMind Platform, these metrics -will be used to create plots/visualizations for documentation and dashboards etc. - -**Arguments** - -- **key (str)****: The metric key -- **value (float)**: The metric value -- **inputs (list, optional)**: A list of input IDs that were used to compute the metric. -- **params (dict, optional)**: Dictionary of parameters used to compute the metric. -- **recorded_at (str, optional)**: The timestamp of the metric. Server will use current time if not provided. -- **thresholds (dict, optional)**: Dictionary of thresholds for the metric. - - +Unit metrics are key-value pairs where the key is the metric name and the value is a scalar (int or float). These key-value pairs are associated with the currently selected model (inventory model in the ValidMind Platform) and keys can be logged to over time to create a history of the metric. On the ValidMind Platform, these metrics will be used to create plots/visualizations for documentation and dashboards etc. +Args: key (str): The metric key value (float): The metric value inputs (list, optional): A list of input IDs that were used to compute the metric. params (dict, optional): Dictionary of parameters used to compute the metric. recorded_at (str, optional): The timestamp of the metric. Server will use current time if not provided. thresholds (dict, optional): Dictionary of thresholds for the metric. ### preview_template[()]{.muted} @@ -272,15 +182,9 @@ def preview_template( Preview the documentation template for the current project -This function will display the documentation template for the current project. If -the project has not been initialized, then an error will be raised. - -**Raises** - -- **ValueError****: If the project has not been initialized - - +This function will display the documentation template for the current project. If the project has not been initialized, then an error will be raised. +Raises: ValueError: If the project has not been initialized ### reload[()]{.muted} @@ -291,9 +195,6 @@ def reload( Reconnect to the ValidMind API and reload the project configuration - - - ### run_documentation_tests[()]{.muted} ```python @@ -308,29 +209,13 @@ def run_documentation_tests( Collect and run all the tests associated with a template -This function will analyze the current project's documentation template and collect -all the tests associated with it into a test suite. It will then run the test -suite, log the results to the ValidMind API, and display them to the user. - -**Arguments** - -- **section (str or list, optional)****: The section(s) to preview. Defaults to None. -- **send (bool, optional)**: Whether to send the results to the ValidMind API. Defaults to True. -- **fail_fast (bool, optional)**: Whether to stop running tests after the first failure. Defaults to False. -- **inputs (dict, optional)**: A dictionary of test inputs to pass to the TestSuite -- **config**: A dictionary of test parameters to override the defaults -- ****kwargs**: backwards compatibility for passing in test inputs using keyword arguments - -**Returns** - -- **TestSuite or dict**: The completed TestSuite instance or a dictionary of TestSuites if section is a list. - -**Raises** - -- **ValueError**: If the project has not been initialized +This function will analyze the current project's documentation template and collect all the tests associated with it into a test suite. It will then run the test suite, log the results to the ValidMind API, and display them to the user. +Args: section (str or list, optional): The section(s) to preview. Defaults to None. send (bool, optional): Whether to send the results to the ValidMind API. Defaults to True. fail_fast (bool, optional): Whether to stop running tests after the first failure. Defaults to False. inputs (dict, optional): A dictionary of test inputs to pass to the TestSuite config: A dictionary of test parameters to override the defaults \*\*kwargs: backwards compatibility for passing in test inputs using keyword arguments +Returns: TestSuite or dict: The completed TestSuite instance or a dictionary of TestSuites if section is a list. +Raises: ValueError: If the project has not been initialized ### run_test_suite[()]{.muted} @@ -346,29 +231,13 @@ def run_test_suite( High Level function for running a test suite -This function provides a high level interface for running a test suite. A test suite is -a collection of tests. This function will automatically find the correct test suite -class based on the test_suite_id, initialize each of the tests, and run them. - -**Arguments** - -- **test_suite_id (str)****: The test suite name (e.g. 'classifier_full_suite') -- **config (dict, optional)**: A dictionary of parameters to pass to the tests in the test suite. Defaults to None. -- **send (bool, optional)**: Whether to post the test results to the API. send=False is useful for testing. Defaults to True. -- **fail_fast (bool, optional)**: Whether to stop running tests after the first failure. Defaults to False. -- **inputs (dict, optional)**: A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` `models` etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. -- ****kwargs**: backwards compatibility for passing in test inputs using keyword arguments - -**Raises** - -- **ValueError**: If the test suite name is not found or if there is an error initializing the test suite - -**Returns** - -- **TestSuite**: the TestSuite instance +This function provides a high level interface for running a test suite. A test suite is a collection of tests. This function will automatically find the correct test suite class based on the test_suite_id, initialize each of the tests, and run them. +Args: test_suite_id (str): The test suite name (e.g. 'classifier_full_suite') config (dict, optional): A dictionary of parameters to pass to the tests in the test suite. Defaults to None. send (bool, optional): Whether to post the test results to the API. send=False is useful for testing. Defaults to True. fail_fast (bool, optional): Whether to stop running tests after the first failure. Defaults to False. inputs (dict, optional): A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` `models` etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. \*\*kwargs: backwards compatibility for passing in test inputs using keyword arguments +Raises: ValueError: If the test suite name is not found or if there is an error initializing the test suite +Returns: TestSuite: the TestSuite instance ### tags[()]{.muted} @@ -379,12 +248,7 @@ def tags( Decorator for specifying tags for a test. -**Arguments** - -- ***tags****: The tags to apply to the test. - - - +Args: \*tags: The tags to apply to the test. ### tasks[()]{.muted} @@ -395,12 +259,7 @@ def tasks( Decorator for specifying the task types that a test is designed for. -**Arguments** - -- ***tasks****: The task types that the test is designed for. - - - +Args: \*tasks: The task types that the test is designed for. ### test[()]{.muted} @@ -411,16 +270,12 @@ def test( Decorator for creating and registering custom tests -This decorator registers the function it wraps as a test function within ValidMind -under the provided ID. Once decorated, the function can be run using the -`validmind.tests.run_test` function. +This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. The function can take two different types of arguments: -- Inputs**: ValidMind model or dataset (or list of models/datasets). These arguments - must use the following names: `model`, `models`, `dataset`, `datasets`. -- Parameters: Any additional keyword arguments of any type (must have a default - value) that can have any name. +- Inputs: ValidMind model or dataset (or list of models/datasets). These arguments must use the following names: `model`, `models`, `dataset`, `datasets`. +- Parameters: Any additional keyword arguments of any type (must have a default value) that can have any name. The function should return one of the following types: @@ -429,22 +284,8 @@ The function should return one of the following types: - Scalar: A single number (int or float) - Boolean: A single boolean value indicating whether the test passed or failed -The function may also include a docstring. This docstring will be used and logged -as the metric's description. - -**Arguments** - -- **func**: The function to decorate -- **test_id**: The identifier for the metric. If not provided, the function name is used. - -**Returns** - -- The decorated function. - - - - - +The function may also include a docstring. This docstring will be used and logged as the metric's description. +Args: func: The function to decorate test_id: The identifier for the metric. If not provided, the function name is used. - \ No newline at end of file +Returns: The decorated function. diff --git a/docs/validmind/datasets.qmd b/docs/validmind/datasets.qmd index 31d421de7..cd5a57ab5 100644 --- a/docs/validmind/datasets.qmd +++ b/docs/validmind/datasets.qmd @@ -6,14 +6,7 @@ toc-expand: 3 Example datasets that can be used with the ValidMind Library. - - - - - - - [classification](datasets/classification.qmd) - [credit_risk](datasets/credit_risk.qmd) - [nlp](datasets/nlp.qmd) - [regression](datasets/regression.qmd) - diff --git a/docs/validmind/datasets/classification.qmd b/docs/validmind/datasets/classification.qmd index b2e4ca3c8..af7cb044a 100644 --- a/docs/validmind/datasets/classification.qmd +++ b/docs/validmind/datasets/classification.qmd @@ -6,12 +6,5 @@ toc-expand: 3 Entrypoint for classification datasets. - - - - - - - [customer_churn](classification/customer_churn.qmd) - [taiwan_credit](classification/taiwan_credit.qmd) - diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index 40cf90982..f934eb06a 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -4,20 +4,14 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### get_demo_test_config +## get_demo_test_config[()]{.muted} ```python def get_demo_test_config( test_suite = None): ``` -Returns input configuration for the default documentation -template assigned to this demo model +Returns input configuration for the default documentation template assigned to this demo model The default documentation template uses the following inputs: @@ -26,33 +20,24 @@ The default documentation template uses the following inputs: - test_dataset - model -We assign the following inputs depending on the input config expected -by each test: +We assign the following inputs depending on the input config expected by each test: - When a test expects a "dataset" we use the raw_dataset - When a tets expects "datasets" we use the train_dataset and test_dataset - When a test expects a "model" we use the model - When a test expects "model" and "dataset" we use the model and test_dataset -- The only exception is ClassifierPerformance since that runs twice**: once -- with the train_dataset (in sample) and once with the test_dataset (out of sample) +- The only exception is ClassifierPerformance since that runs twice: once with the train_dataset (in sample) and once with the test_dataset (out of sample) - - - - -#### load_data +## load_data[()]{.muted} ```python def load_data( full_dataset = False): ``` - -#### preprocess +## preprocess[()]{.muted} ```python def preprocess( df): ``` - - \ No newline at end of file diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index ec0a5087b..e9f640e0e 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -4,24 +4,16 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### load_data +## load_data[()]{.muted} ```python def load_data( ): ``` - -#### preprocess +## preprocess[()]{.muted} ```python def preprocess( df): ``` - - \ No newline at end of file diff --git a/docs/validmind/datasets/credit_risk.qmd b/docs/validmind/datasets/credit_risk.qmd index b1f9cf0f5..dd3e77d77 100644 --- a/docs/validmind/datasets/credit_risk.qmd +++ b/docs/validmind/datasets/credit_risk.qmd @@ -6,12 +6,5 @@ toc-expand: 3 Entrypoint for credit risk datasets. - - - - - - - [lending_club](credit_risk/lending_club.qmd) - [lending_club_bias](credit_risk/lending_club_bias.qmd) - diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index d5b1403e8..a0886433f 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -4,20 +4,14 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### compute_scores +## compute_scores[()]{.muted} ```python def compute_scores( probabilities): ``` - -#### feature_engineering +## feature_engineering[()]{.muted} ```python def feature_engineering( @@ -25,8 +19,7 @@ def feature_engineering( verbose = True): ``` - -#### get_demo_test_config +## get_demo_test_config[()]{.muted} ```python def get_demo_test_config( @@ -36,28 +29,18 @@ def get_demo_test_config( Get demo test configuration. -**Arguments** - -- **x_test****: Test features DataFrame -- **y_test**: Test target Series +Args: x_test: Test features DataFrame y_test: Test target Series -**Returns** +Returns: dict: Test configuration dictionary -- **dict**: Test configuration dictionary - - - - - -#### init_vm_objects +## init_vm_objects[()]{.muted} ```python def init_vm_objects( scorecard): ``` - -#### load_data +## load_data[()]{.muted} ```python def load_data( @@ -67,36 +50,23 @@ def load_data( Load data from either an online source or offline files, automatically dropping specified columns for offline data. +:param source: 'online' for online data, 'offline' for offline files. Defaults to 'online'. :return: DataFrame containing the loaded data. -**Parameters** - -- **source**: 'online' for online data, 'offline' for offline files. Defaults to 'online'. - -**Returns** - -- DataFrame containing the loaded data. - - - - - -#### load_scorecard +## load_scorecard[()]{.muted} ```python def load_scorecard( ): ``` - -#### load_test_config +## load_test_config[()]{.muted} ```python def load_test_config( scorecard): ``` - -#### preprocess +## preprocess[()]{.muted} ```python def preprocess( @@ -104,8 +74,7 @@ def preprocess( verbose = True): ``` - -#### split +## split[()]{.muted} ```python def split( @@ -118,28 +87,14 @@ def split( Split dataset into train, validation (optional), and test sets. -**Arguments** - -- **df****: Input DataFrame -- **validation_split**: If None, returns train/test split. If float, returns train/val/test split -- **test_size**: Proportion of data for test set (default: 0.2) -- **add_constant**: Whether to add constant column for statsmodels (default: False) +Args: df: Input DataFrame validation_split: If None, returns train/test split. If float, returns train/val/test split test_size: Proportion of data for test set (default: 0.2) add_constant: Whether to add constant column for statsmodels (default: False) -**Returns** +Returns: If validation_size is None: train_df, test_df If validation_size is float: train_df, validation_df, test_df -- **If validation_size is None**: train_df, test_df -- **If validation_size is float**: train_df, validation_df, test_df - - - - - -#### woe_encoding +## woe_encoding[()]{.muted} ```python def woe_encoding( df, verbose = True): ``` - - \ No newline at end of file diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 552c489e0..9722a479d 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -4,20 +4,14 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### compute_scores +## compute_scores[()]{.muted} ```python def compute_scores( probabilities): ``` - -#### load_data +## load_data[()]{.muted} ```python def load_data( @@ -26,26 +20,19 @@ def load_data( Load data from the specified CSV file. -:return**: DataFrame containing the loaded data. +:return: DataFrame containing the loaded data. - - - - -#### preprocess +## preprocess[()]{.muted} ```python def preprocess( df): ``` - -#### split +## split[()]{.muted} ```python def split( df, test_size = 0.3): ``` - - \ No newline at end of file diff --git a/docs/validmind/datasets/nlp.qmd b/docs/validmind/datasets/nlp.qmd index 9e567160b..0835a2569 100644 --- a/docs/validmind/datasets/nlp.qmd +++ b/docs/validmind/datasets/nlp.qmd @@ -6,12 +6,5 @@ toc-expand: 3 Example datasets that can be used with the ValidMind Library. - - - - - - - [cnn_dailymail](nlp/cnn_dailymail.qmd) - [twitter_covid_19](nlp/twitter_covid_19.qmd) - diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index f5aea4fea..a6347c5ec 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### display_nice +## display_nice[()]{.muted} ```python def display_nice( @@ -19,11 +14,7 @@ def display_nice( Primary function to format and display a DataFrame. - - - - -#### load_data +## load_data[()]{.muted} ```python def load_data( @@ -33,20 +24,4 @@ def load_data( Load data from either online source or offline files. - -**Parameters** - -- **source**: 'online' for online data, 'offline' for offline data. Defaults to 'online'. - -**Parameters** - -- **dataset_size: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. - -**Returns** - -- DataFrame containing the loaded data. - - - - - \ No newline at end of file +:param source: 'online' for online data, 'offline' for offline data. Defaults to 'online'. :param dataset_size: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. :return: DataFrame containing the loaded data. diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index bbd120daa..c7f58ff40 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -4,16 +4,9 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### load_data +## load_data[()]{.muted} ```python def load_data( full_dataset = False): ``` - - \ No newline at end of file diff --git a/docs/validmind/datasets/regression.qmd b/docs/validmind/datasets/regression.qmd index debd4a605..7755b0df2 100644 --- a/docs/validmind/datasets/regression.qmd +++ b/docs/validmind/datasets/regression.qmd @@ -6,12 +6,5 @@ toc-expand: 3 Entrypoint for regression datasets - - - - - - - [fred](regression/fred.qmd) - [lending_club](regression/lending_club.qmd) - diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index b23557b80..99118f06f 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -4,60 +4,49 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### load_all_data +## load_all_data[()]{.muted} ```python def load_all_data( ): ``` - -#### load_data +## load_data[()]{.muted} ```python def load_data( ): ``` - -#### load_model +## load_model[()]{.muted} ```python def load_model( model_name): ``` - -#### load_processed_data +## load_processed_data[()]{.muted} ```python def load_processed_data( ): ``` - -#### load_test_dataset +## load_test_dataset[()]{.muted} ```python def load_test_dataset( model_name): ``` - -#### load_train_dataset +## load_train_dataset[()]{.muted} ```python def load_train_dataset( model_path): ``` - -#### preprocess +## preprocess[()]{.muted} ```python def preprocess( @@ -69,28 +58,14 @@ def preprocess( Split a time series DataFrame into train, validation, and test sets. -Parameters: -- **df (pandas.DataFrame)****: The time series DataFrame to be split. -- **split_option (str)**: The split option to choose from: 'train_test_val' (default) or 'train_test'. -- **train_size (float)**: The proportion of the dataset to include in the training set. Default is 0.6. -- **test_size (float)**: The proportion of the dataset to include in the test set. Default is 0.2. +Parameters: df (pandas.DataFrame): The time series DataFrame to be split. split_option (str): The split option to choose from: 'train_test_val' (default) or 'train_test'. train_size (float): The proportion of the dataset to include in the training set. Default is 0.6. test_size (float): The proportion of the dataset to include in the test set. Default is 0.2. -**Returns** +Returns: train_df (pandas.DataFrame): The training set. validation_df (pandas.DataFrame): The validation set (only returned if split_option is 'train_test_val'). test_df (pandas.DataFrame): The test set. -- **train_df (pandas.DataFrame)**: The training set. -- **validation_df (pandas.DataFrame)**: The validation set (only returned if split_option is 'train_test_val'). -- **test_df (pandas.DataFrame)**: The test set. - - - - - -#### transform +## transform[()]{.muted} ```python def transform( df, transform_func = 'diff'): ``` - - \ No newline at end of file diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index e474bb1e2..7ef1bd2b1 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -4,20 +4,14 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### load_data +## load_data[()]{.muted} ```python def load_data( ): ``` - -#### preprocess +## preprocess[()]{.muted} ```python def preprocess( @@ -29,28 +23,14 @@ def preprocess( Split a time series DataFrame into train, validation, and test sets. -Parameters: -- **df (pandas.DataFrame)****: The time series DataFrame to be split. -- **split_option (str)**: The split option to choose from: 'train_test_val' (default) or 'train_test'. -- **train_size (float)**: The proportion of the dataset to include in the training set. Default is 0.6. -- **test_size (float)**: The proportion of the dataset to include in the test set. Default is 0.2. +Parameters: df (pandas.DataFrame): The time series DataFrame to be split. split_option (str): The split option to choose from: 'train_test_val' (default) or 'train_test'. train_size (float): The proportion of the dataset to include in the training set. Default is 0.6. test_size (float): The proportion of the dataset to include in the test set. Default is 0.2. -**Returns** +Returns: train_df (pandas.DataFrame): The training set. validation_df (pandas.DataFrame): The validation set (only returned if split_option is 'train_test_val'). test_df (pandas.DataFrame): The test set. -- **train_df (pandas.DataFrame)**: The training set. -- **validation_df (pandas.DataFrame)**: The validation set (only returned if split_option is 'train_test_val'). -- **test_df (pandas.DataFrame)**: The test set. - - - - - -#### transform +## transform[()]{.muted} ```python def transform( df, transform_func = 'diff'): ``` - - \ No newline at end of file diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index 533d73a01..b51807307 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -11,29 +11,16 @@ The following base errors are defined for others: - BaseError - APIRequestError - - - - - - - - -#### raise_api_error +## raise_api_error[()]{.muted} ```python def raise_api_error( error_string): ``` -Safely try to parse JSON from the response message in case the API -returns a non-JSON string or if the API returns a non-standard error - +Safely try to parse JSON from the response message in case the API returns a non-JSON string or if the API returns a non-standard error - - - -#### should_raise_on_fail_fast +## should_raise_on_fail_fast[()]{.muted} ```python def should_raise_on_fail_fast( @@ -42,390 +29,224 @@ def should_raise_on_fail_fast( Determine whether an error should be raised when fail_fast is True. - - - - ### Class: APIRequestError Generic error for API request errors that are not known. - - - - **Bases:** BaseError - ### Class: BaseError **Bases:** Exception #### Methods - ### Class: GetTestSuiteError When the test suite could not be found. - - - - **Bases:** BaseError - ### Class: InitializeTestSuiteError When the test suite was found but could not be initialized. - - - - **Bases:** BaseError - ### Class: InvalidAPICredentialsError **Bases:** APIRequestError #### Methods - ### Class: InvalidContentIdPrefixError When an invalid text content_id is sent to the API. - - - - **Bases:** APIRequestError - ### Class: InvalidInputError When an invalid input object. - - - - **Bases:** BaseError - ### Class: InvalidMetricResultsError When an invalid metric results object is sent to the API. - - - - **Bases:** APIRequestError - ### Class: InvalidProjectError **Bases:** APIRequestError #### Methods - ### Class: InvalidRequestBodyError When a POST/PUT request is made with an invalid request body. - - - - **Bases:** APIRequestError - ### Class: InvalidTestParametersError When an invalid parameters for the test. - - - - **Bases:** BaseError - ### Class: InvalidTestResultsError When an invalid test results object is sent to the API. - - - - **Bases:** APIRequestError - ### Class: InvalidTextObjectError When an invalid Metadat (Text) object is sent to the API. - - - - **Bases:** APIRequestError - ### Class: InvalidValueFormatterError When an invalid value formatter is provided when serializing results. - - - - **Bases:** BaseError - ### Class: InvalidXGBoostTrainedModelError When an invalid XGBoost trained model is used when calling init_r_model. - - - - **Bases:** BaseError - ### Class: LoadTestError Exception raised when an error occurs while loading a test - - - - **Bases:** BaseError #### Methods - ### Class: MismatchingClassLabelsError When the class labels found in the dataset don't match the provided target labels. - - - - **Bases:** BaseError - ### Class: MissingAPICredentialsError **Bases:** BaseError #### Methods - ### Class: MissingCacheResultsArgumentsError When the cache_results function is missing arguments. - - - - **Bases:** BaseError - ### Class: MissingClassLabelError When the one or more class labels are missing from provided dataset targets. - - - - **Bases:** BaseError - ### Class: MissingDependencyError When a required dependency is missing. - - - - **Bases:** BaseError #### Methods - ### Class: MissingDocumentationTemplate When the client config is missing the documentation template. - - - - **Bases:** BaseError - ### Class: MissingModelIdError **Bases:** BaseError #### Methods - ### Class: MissingOrInvalidModelPredictFnError -When the pytorch model is missing a predict function or its predict -method does not have the expected arguments. - - - - +When the pytorch model is missing a predict function or its predict method does not have the expected arguments. **Bases:** BaseError - ### Class: MissingRequiredTestInputError When a required test context variable is missing. - - - - **Bases:** BaseError - ### Class: MissingRExtrasError When the R extras have not been installed. - - - - **Bases:** BaseError #### Methods - ### Class: MissingTextContentIdError When a Text object is sent to the API without a content_id. - - - - **Bases:** APIRequestError - ### Class: MissingTextContentsError When a Text object is sent to the API without a "text" attribute. - - - - **Bases:** APIRequestError - ### Class: SkipTestError Useful error to throw when a test cannot be executed. - - - - **Bases:** BaseError - ### Class: TestInputInvalidDatasetError When an invalid dataset is used in a test context. - - - - **Bases:** BaseError - ### Class: UnsupportedColumnTypeError When an unsupported column type is found on a dataset. - - - - **Bases:** BaseError - ### Class: UnsupportedDatasetError When an unsupported dataset is used. - - - - **Bases:** BaseError - ### Class: UnsupportedFigureError When an unsupported figure object is constructed. - - - - **Bases:** BaseError - ### Class: UnsupportedModelError When an unsupported model is used. - - - - **Bases:** BaseError - ### Class: UnsupportedModelForSHAPError When an unsupported model is used for SHAP importance. - - - - **Bases:** BaseError - ### Class: UnsupportedRModelError When an unsupported R model is used. - - - - **Bases:** BaseError - - \ No newline at end of file diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 642313c3c..793ada67e 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -6,12 +6,6 @@ toc-expand: 3 Entrypoint for test suites. - - - - - - - [classifier](test_suites/classifier.qmd) - [cluster](test_suites/cluster.qmd) - [embeddings](test_suites/embeddings.qmd) @@ -25,8 +19,7 @@ Entrypoint for test suites. - [text_data](test_suites/text_data.qmd) - [time_series](test_suites/time_series.qmd) - -#### describe_suite +## describe_suite[()]{.muted} ```python def describe_suite( @@ -36,20 +29,11 @@ def describe_suite( Describes a Test Suite by ID -**Arguments** - -- **test_suite_id****: Test Suite ID -- **verbose**: If True, describe all plans and tests in the Test Suite - -**Returns** - -- **pandas.DataFrame**: A formatted table with the Test Suite description - - +Args: test_suite_id: Test Suite ID verbose: If True, describe all plans and tests in the Test Suite +Returns: pandas.DataFrame: A formatted table with the Test Suite description - -#### get_by_id +## get_by_id[()]{.muted} ```python def get_by_id( @@ -58,11 +42,7 @@ def get_by_id( Returns the test suite by ID - - - - -#### list_suites +## list_suites[()]{.muted} ```python def list_suites( @@ -71,11 +51,7 @@ def list_suites( Returns a list of all available test suites - - - - -#### register_test_suite +## register_test_suite[()]{.muted} ```python def register_test_suite( @@ -84,8 +60,3 @@ def register_test_suite( ``` Registers a custom test suite - - - - - \ No newline at end of file diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index 432763fed..026df46d7 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -6,79 +6,44 @@ toc-expand: 3 Test suites for sklearn-compatible classifier models -Ideal setup is to have the API client to read a -custom test suite from the project's configuration +Ideal setup is to have the API client to read a custom test suite from the project's configuration - - - - - - - - ### Class: ClassifierDiagnosis Test suite for sklearn classifier model diagnosis tests - - - - **Bases:** TestSuite #### Methods - ### Class: ClassifierFullSuite Full test suite for binary classification models. - - - - **Bases:** TestSuite #### Methods - ### Class: ClassifierMetrics Test suite for sklearn classifier metrics - - - - **Bases:** TestSuite #### Methods - ### Class: ClassifierModelValidation Test suite for binary classification models. - - - - **Bases:** TestSuite #### Methods - ### Class: ClassifierPerformance Test suite for sklearn classifier models - - - - **Bases:** TestSuite #### Methods - - \ No newline at end of file diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index e6ddc7afb..a421854c2 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -6,53 +6,28 @@ toc-expand: 3 Test suites for sklearn-compatible clustering models -Ideal setup is to have the API client to read a -custom test suite from the project's configuration +Ideal setup is to have the API client to read a custom test suite from the project's configuration - - - - - - - - ### Class: ClusterFullSuite Full test suite for clustering models. - - - - **Bases:** TestSuite #### Methods - ### Class: ClusterMetrics Test suite for sklearn clustering metrics - - - - **Bases:** TestSuite #### Methods - ### Class: ClusterPerformance Test suite for sklearn cluster performance - - - - **Bases:** TestSuite #### Methods - - \ No newline at end of file diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index 5068bd1db..a01b13af5 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -6,53 +6,28 @@ toc-expand: 3 Test suites for embeddings models -Ideal setup is to have the API client to read a -custom test suite from the project's configuration - - - - - - - - +Ideal setup is to have the API client to read a custom test suite from the project's configuration ### Class: EmbeddingsFullSuite Full test suite for embeddings models. - - - - **Bases:** TestSuite #### Methods - ### Class: EmbeddingsMetrics Test suite for embeddings metrics - - - - **Bases:** TestSuite #### Methods - ### Class: EmbeddingsPerformance Test suite for embeddings model performance - - - - **Bases:** TestSuite #### Methods - - \ No newline at end of file diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index 9c3ca234c..ef5306a2d 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -6,37 +6,18 @@ toc-expand: 3 Test suites for LLMs - - - - - - - - ### Class: LLMClassifierFullSuite Full test suite for LLM classification models. - - - - **Bases:** TestSuite #### Methods - ### Class: PromptValidation Test suite for prompt validation - - - - **Bases:** TestSuite #### Methods - - \ No newline at end of file diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index d7297d2b9..ac6887a24 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -6,24 +6,10 @@ toc-expand: 3 Test suites for NLP models - - - - - - - - ### Class: NLPClassifierFullSuite Full test suite for NLP classification models. - - - - **Bases:** TestSuite #### Methods - - \ No newline at end of file diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index f6cce669a..f3d95e38e 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -6,27 +6,12 @@ toc-expand: 3 Test suites for sklearn-compatible hyper parameters tunning -Ideal setup is to have the API client to read a -custom test suite from the project's configuration - - - - - - - - +Ideal setup is to have the API client to read a custom test suite from the project's configuration ### Class: KmeansParametersOptimization Test suite for sklearn hyperparameters optimization - - - - **Bases:** TestSuite #### Methods - - \ No newline at end of file diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index d1f24012f..24cb6b992 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -4,47 +4,26 @@ toc-depth: 3 toc-expand: 3 --- - - - - - ### Class: RegressionFullSuite Full test suite for regression models. - - - - **Bases:** TestSuite #### Methods - ### Class: RegressionMetrics Test suite for performance metrics of regression metrics - - - - **Bases:** TestSuite #### Methods - ### Class: RegressionPerformance Test suite for regression model performance - - - - **Bases:** TestSuite #### Methods - - \ No newline at end of file diff --git a/docs/validmind/test_suites/statsmodels_timeseries.qmd b/docs/validmind/test_suites/statsmodels_timeseries.qmd index a622693b0..04a6e6d82 100644 --- a/docs/validmind/test_suites/statsmodels_timeseries.qmd +++ b/docs/validmind/test_suites/statsmodels_timeseries.qmd @@ -6,37 +6,18 @@ toc-expand: 3 Time Series Test Suites from statsmodels - - - - - - - - ### Class: RegressionModelDescription Test suite for performance metric of regression model of statsmodels library - - - - **Bases:** TestSuite #### Methods - ### Class: RegressionModelsEvaluation Test suite for metrics comparison of regression model of statsmodels library - - - - **Bases:** TestSuite #### Methods - - \ No newline at end of file diff --git a/docs/validmind/test_suites/summarization.qmd b/docs/validmind/test_suites/summarization.qmd index 61b60eed5..4e6e1f1f9 100644 --- a/docs/validmind/test_suites/summarization.qmd +++ b/docs/validmind/test_suites/summarization.qmd @@ -6,24 +6,10 @@ toc-expand: 3 Test suites for llm summarization models - - - - - - - - ### Class: SummarizationMetrics Test suite for Summarization metrics - - - - **Bases:** TestSuite #### Methods - - \ No newline at end of file diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd index f44004435..dd318b945 100644 --- a/docs/validmind/test_suites/tabular_datasets.qmd +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -6,51 +6,26 @@ toc-expand: 3 Test suites for tabular datasets - - - - - - - - ### Class: TabularDataQuality Test suite for data quality on tabular datasets - - - - **Bases:** TestSuite #### Methods - ### Class: TabularDataset Test suite for tabular datasets. - - - - **Bases:** TestSuite #### Methods - ### Class: TabularDatasetDescription -Test suite to extract metadata and descriptive -statistics from a tabular dataset - - - - +Test suite to extract metadata and descriptive statistics from a tabular dataset **Bases:** TestSuite #### Methods - - \ No newline at end of file diff --git a/docs/validmind/test_suites/text_data.qmd b/docs/validmind/test_suites/text_data.qmd index 2a5157acb..ac2d44314 100644 --- a/docs/validmind/test_suites/text_data.qmd +++ b/docs/validmind/test_suites/text_data.qmd @@ -6,24 +6,10 @@ toc-expand: 3 Test suites for text datasets - - - - - - - - ### Class: TextDataQuality Test suite for data quality on text data - - - - **Bases:** TestSuite #### Methods - - \ No newline at end of file diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index 095abc2da..ce76d4a68 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -6,94 +6,44 @@ toc-expand: 3 Time Series Test Suites - - - - - - - - ### Class: TimeSeriesDataQuality Test suite for data quality on time series datasets - - - - **Bases:** TestSuite #### Methods - ### Class: TimeSeriesDataset Test suite for time series datasets. - - - - **Bases:** TestSuite #### Methods - ### Class: TimeSeriesModelValidation Test suite for time series model validation. - - - - **Bases:** TestSuite #### Methods - ### Class: TimeSeriesMultivariate -This test suite provides a preliminary understanding of the features -and relationship in multivariate dataset. It presents various -multivariate visualizations that can help identify patterns, trends, -and relationships between pairs of variables. The visualizations are -designed to explore the relationships between multiple features -simultaneously. They allow you to quickly identify any patterns or -trends in the data, as well as any potential outliers or anomalies. -The individual feature distribution can also be explored to provide -insight into the range and frequency of values observed in the data. -This multivariate analysis test suite aims to provide an overview of -the data structure and guide further exploration and modeling. - - - - +This test suite provides a preliminary understanding of the features and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. **Bases:** TestSuite #### Methods - ### Class: TimeSeriesUnivariate -This test suite provides a preliminary understanding of the target variable(s) -used in the time series dataset. It visualizations that present the raw time -series data and a histogram of the target variable(s). - -The raw time series data provides a visual inspection of the target variable's -behavior over time. This helps to identify any patterns or trends in the data, -as well as any potential outliers or anomalies. The histogram of the target -variable displays the distribution of values, providing insight into the range -and frequency of values observed in the data. - - - +This test suite provides a preliminary understanding of the target variable(s) used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). +The raw time series data provides a visual inspection of the target variable's behavior over time. This helps to identify any patterns or trends in the data, as well as any potential outliers or anomalies. The histogram of the target variable displays the distribution of values, providing insight into the range and frequency of values observed in the data. **Bases:** TestSuite #### Methods - - \ No newline at end of file diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 281582ee8..bd2b2e94c 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -6,18 +6,11 @@ toc-expand: 3 ValidMind Tests Module - - - - - - - [data_validation](tests/data_validation.qmd) - [model_validation](tests/model_validation.qmd) - [prompt_validation](tests/prompt_validation.qmd) - -#### register_test_provider +## register_test_provider[()]{.muted} ```python def register_test_provider( @@ -27,12 +20,4 @@ def register_test_provider( Register an external test provider -**Arguments** - -- **namespace (str)****: The namespace of the test provider -- **test_provider (TestProvider)**: The test provider - - - - - \ No newline at end of file +Args: namespace (str): The namespace of the test provider test_provider (TestProvider): The test provider diff --git a/docs/validmind/tests/data_validation.qmd b/docs/validmind/tests/data_validation.qmd index 4bc8891db..21cd9413c 100644 --- a/docs/validmind/tests/data_validation.qmd +++ b/docs/validmind/tests/data_validation.qmd @@ -4,9 +4,6 @@ toc-depth: 3 toc-expand: 3 --- - - - - [ACFandPACFPlot](data_validation/ACFandPACFPlot.qmd) - [ADF](data_validation/ADF.qmd) - [AutoAR](data_validation/AutoAR.qmd) @@ -67,4 +64,3 @@ toc-expand: 3 - [WOEBinPlots](data_validation/WOEBinPlots.qmd) - [WOEBinTable](data_validation/WOEBinTable.qmd) - [ZivotAndrewsArch](data_validation/ZivotAndrewsArch.qmd) - diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index b0b01719f..bde3f6208 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -4,57 +4,37 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ACFandPACFPlot +## ACFandPACFPlot[()]{.muted} ```python def ACFandPACFPlot( dataset: VMDataset): ``` -Analyzes time series data using Autocorrelation Function (ACF) and Partial Autocorrelation Function (PACF) plots to -reveal trends and correlations. +Analyzes time series data using Autocorrelation Function (ACF) and Partial Autocorrelation Function (PACF) plots to reveal trends and correlations. -###### Purpose +### Purpose -The ACF (Autocorrelation Function) and PACF (Partial Autocorrelation Function) plot test is employed to analyze -time series data in machine learning models. It illuminates the correlation of the data over time by plotting the -correlation of the series with its own lags (ACF), and the correlations after removing effects already accounted -for by earlier lags (PACF). This information can identify trends, such as seasonality, degrees of autocorrelation, -and inform the selection of order parameters for AutoRegressive Integrated Moving Average (ARIMA) models. +The ACF (Autocorrelation Function) and PACF (Partial Autocorrelation Function) plot test is employed to analyze time series data in machine learning models. It illuminates the correlation of the data over time by plotting the correlation of the series with its own lags (ACF), and the correlations after removing effects already accounted for by earlier lags (PACF). This information can identify trends, such as seasonality, degrees of autocorrelation, and inform the selection of order parameters for AutoRegressive Integrated Moving Average (ARIMA) models. -###### Test Mechanism +### Test Mechanism -The `ACFandPACFPlot` test accepts a dataset with a time-based index. It first confirms the index is of a datetime -type, then handles any NaN values. The test subsequently generates ACF and PACF plots for each column in the -dataset, producing a subplot for each. If the dataset doesn't include key columns, an error is returned. +The `ACFandPACFPlot` test accepts a dataset with a time-based index. It first confirms the index is of a datetime type, then handles any NaN values. The test subsequently generates ACF and PACF plots for each column in the dataset, producing a subplot for each. If the dataset doesn't include key columns, an error is returned. -###### Signs of High Risk +### Signs of High Risk - Sudden drops in the correlation at a specific lag might signal a model at high risk. -- Consistent high correlation across multiple lags could also indicate non-stationarity in the data, which may -suggest that a model estimated on this data won't generalize well to future, unknown data. +- Consistent high correlation across multiple lags could also indicate non-stationarity in the data, which may suggest that a model estimated on this data won't generalize well to future, unknown data. -###### Strengths +### Strengths - ACF and PACF plots offer clear graphical representations of the correlations in time series data. -- These plots are effective at revealing important data characteristics such as seasonality, trends, and -correlation patterns. -- The insights from these plots aid in better model configuration, particularly in the selection of ARIMA model -parameters. +- These plots are effective at revealing important data characteristics such as seasonality, trends, and correlation patterns. +- The insights from these plots aid in better model configuration, particularly in the selection of ARIMA model parameters. -###### Limitations +### Limitations - ACF and PACF plots are exclusively for time series data and hence, can't be applied to all ML models. - These plots require large, consistent datasets as gaps could lead to misleading results. - The plots can only represent linear correlations and fail to capture any non-linear relationships within the data. - The plots might be difficult for non-experts to interpret and should not replace more advanced analyses. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index d597cae95..455136d2d 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ADF +## ADF[()]{.muted} ```python def ADF( @@ -18,40 +13,26 @@ def ADF( Assesses the stationarity of a time series dataset using the Augmented Dickey-Fuller (ADF) test. -###### Purpose +### Purpose -The Augmented Dickey-Fuller (ADF) test metric is used to determine the order of integration, i.e., the stationarity -of a given time series dataset. The stationary property of data is pivotal in many machine learning models as it -impacts the reliability and effectiveness of predictions and forecasts. +The Augmented Dickey-Fuller (ADF) test metric is used to determine the order of integration, i.e., the stationarity of a given time series dataset. The stationary property of data is pivotal in many machine learning models as it impacts the reliability and effectiveness of predictions and forecasts. -###### Test Mechanism +### Test Mechanism -The ADF test is executed using the `adfuller` function from the `statsmodels` library on each feature of the -dataset. Multiple outputs are generated for each run, including the ADF test statistic and p-value, count of lags -used, the number of observations considered in the test, critical values at various confidence levels, and the -information criterion. These results are stored for each feature for subsequent analysis. +The ADF test is executed using the `adfuller` function from the `statsmodels` library on each feature of the dataset. Multiple outputs are generated for each run, including the ADF test statistic and p-value, count of lags used, the number of observations considered in the test, critical values at various confidence levels, and the information criterion. These results are stored for each feature for subsequent analysis. -###### Signs of High Risk +### Signs of High Risk -- An inflated ADF statistic and high p-value (generally above 0.05) indicate a high risk to the model's performance -due to the presence of a unit root indicating non-stationarity. +- An inflated ADF statistic and high p-value (generally above 0.05) indicate a high risk to the model's performance due to the presence of a unit root indicating non-stationarity. - Non-stationarity might result in untrustworthy or insufficient forecasts. -###### Strengths +### Strengths -- The ADF test is robust to sophisticated correlations within the data, making it suitable for settings where data -displays complex stochastic behavior. -- It provides explicit outputs like test statistics, critical values, and information criterion, enhancing -understanding and transparency in the model validation process. +- The ADF test is robust to sophisticated correlations within the data, making it suitable for settings where data displays complex stochastic behavior. +- It provides explicit outputs like test statistics, critical values, and information criterion, enhancing understanding and transparency in the model validation process. -###### Limitations +### Limitations -- The ADF test might demonstrate low statistical power, making it challenging to differentiate between a unit root -and near-unit-root processes, potentially causing false negatives. +- The ADF test might demonstrate low statistical power, making it challenging to differentiate between a unit root and near-unit-root processes, potentially causing false negatives. - It assumes the data follows an autoregressive process, which might not always be the case. - The test struggles with time series data that have structural breaks. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 0dc509463..718f42280 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### AutoAR +## AutoAR[()]{.muted} ```python def AutoAR( @@ -19,47 +14,30 @@ def AutoAR( Automatically identifies the optimal Autoregressive (AR) order for a time series using BIC and AIC criteria. -###### Purpose +### Purpose -The AutoAR test is intended to automatically identify the Autoregressive (AR) order of a time series by utilizing -the Bayesian Information Criterion (BIC) and Akaike Information Criterion (AIC). AR order is crucial in forecasting -tasks as it dictates the quantity of prior terms in the sequence to use for predicting the current term. The -objective is to select the most fitting AR model that encapsulates the trend and seasonality in the time series -data. +The AutoAR test is intended to automatically identify the Autoregressive (AR) order of a time series by utilizing the Bayesian Information Criterion (BIC) and Akaike Information Criterion (AIC). AR order is crucial in forecasting tasks as it dictates the quantity of prior terms in the sequence to use for predicting the current term. The objective is to select the most fitting AR model that encapsulates the trend and seasonality in the time series data. -###### Test Mechanism +### Test Mechanism -The test mechanism operates by iterating through a possible range of AR orders up to a defined maximum. An AR model -is fitted for each order, and the corresponding BIC and AIC are computed. BIC and AIC statistical measures are -designed to penalize models for complexity, preferring simpler models that fit the data proficiently. To verify the -stationarity of the time series, the Augmented Dickey-Fuller test is executed. The AR order, BIC, and AIC findings -are compiled into a dataframe for effortless comparison. Then, the AR order with the smallest BIC is established as -the desirable order for each variable. +The test mechanism operates by iterating through a possible range of AR orders up to a defined maximum. An AR model is fitted for each order, and the corresponding BIC and AIC are computed. BIC and AIC statistical measures are designed to penalize models for complexity, preferring simpler models that fit the data proficiently. To verify the stationarity of the time series, the Augmented Dickey-Fuller test is executed. The AR order, BIC, and AIC findings are compiled into a dataframe for effortless comparison. Then, the AR order with the smallest BIC is established as the desirable order for each variable. -###### Signs of High Risk +### Signs of High Risk -- An augmented Dickey Fuller test p-value > 0.05, indicating the time series isn't stationary, may lead to -inaccurate results. +- An augmented Dickey Fuller test p-value > 0.05, indicating the time series isn't stationary, may lead to inaccurate results. - Problems with the model fitting procedure, such as computational or convergence issues. - Continuous selection of the maximum specified AR order may suggest an insufficient set limit. -###### Strengths +### Strengths - The test independently pinpoints the optimal AR order, thereby reducing potential human bias. - It strikes a balance between model simplicity and goodness-of-fit to avoid overfitting. - Has the capability to account for stationarity in a time series, an essential aspect for dependable AR modeling. - The results are aggregated into a comprehensive table, enabling an easy interpretation. -###### Limitations +### Limitations - The tests need a stationary time series input. - They presume a linear relationship between the series and its lags. -- The search for the best model is constrained by the maximum AR order supplied in the parameters. Therefore, a low -max_ar_order could result in subpar outcomes. -- AIC and BIC may not always agree on the selection of the best model. This potentially requires the user to juggle -interpretational choices. - - - - - \ No newline at end of file +- The search for the best model is constrained by the maximum AR order supplied in the parameters. Therefore, a low max_ar_order could result in subpar outcomes. +- AIC and BIC may not always agree on the selection of the best model. This potentially requires the user to juggle interpretational choices. diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index a7b4ac0f3..e27910d89 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### AutoMA +## AutoMA[()]{.muted} ```python def AutoMA( @@ -17,52 +12,30 @@ def AutoMA( max_ma_order: int = 3): ``` -Automatically selects the optimal Moving Average (MA) order for each variable in a time series dataset based on -minimal BIC and AIC values. +Automatically selects the optimal Moving Average (MA) order for each variable in a time series dataset based on minimal BIC and AIC values. -###### Purpose +### Purpose -The `AutoMA` metric serves an essential role of automated decision-making for selecting the optimal Moving Average -(MA) order for every variable in a given time series dataset. The selection is dependent on the minimalization of -BIC (Bayesian Information Criterion) and AIC (Akaike Information Criterion); these are established statistical -tools used for model selection. Furthermore, prior to the commencement of the model fitting process, the algorithm -conducts a stationarity test (Augmented Dickey-Fuller test) on each series. +The `AutoMA` metric serves an essential role of automated decision-making for selecting the optimal Moving Average (MA) order for every variable in a given time series dataset. The selection is dependent on the minimalization of BIC (Bayesian Information Criterion) and AIC (Akaike Information Criterion); these are established statistical tools used for model selection. Furthermore, prior to the commencement of the model fitting process, the algorithm conducts a stationarity test (Augmented Dickey-Fuller test) on each series. -###### Test Mechanism +### Test Mechanism -Starting off, the `AutoMA` algorithm checks whether the `max_ma_order` parameter has been provided. It consequently -loops through all variables in the dataset, carrying out the Dickey-Fuller test for stationarity. For each -stationary variable, it fits an ARIMA model for orders running from 0 to `max_ma_order`. The result is a list -showcasing the BIC and AIC values of the ARIMA models based on different orders. The MA order, which yields the -smallest BIC, is chosen as the 'best MA order' for every single variable. The final results include a table -summarizing the auto MA analysis and another table listing the best MA order for each variable. +Starting off, the `AutoMA` algorithm checks whether the `max_ma_order` parameter has been provided. It consequently loops through all variables in the dataset, carrying out the Dickey-Fuller test for stationarity. For each stationary variable, it fits an ARIMA model for orders running from 0 to `max_ma_order`. The result is a list showcasing the BIC and AIC values of the ARIMA models based on different orders. The MA order, which yields the smallest BIC, is chosen as the 'best MA order' for every single variable. The final results include a table summarizing the auto MA analysis and another table listing the best MA order for each variable. -###### Signs of High Risk +### Signs of High Risk - When a series is non-stationary (p-value>0.05 in the Dickey-Fuller test), the produced result could be inaccurate. -- Any error that arises in the process of fitting the ARIMA models, especially with a higher MA order, can -potentially indicate risks and might need further investigation. +- Any error that arises in the process of fitting the ARIMA models, especially with a higher MA order, can potentially indicate risks and might need further investigation. -###### Strengths +### Strengths -- The metric facilitates automation in the process of selecting the MA order for time series forecasting. This -significantly saves time and reduces efforts conventionally necessary for manual hyperparameter tuning. +- The metric facilitates automation in the process of selecting the MA order for time series forecasting. This significantly saves time and reduces efforts conventionally necessary for manual hyperparameter tuning. - The use of both BIC and AIC enhances the likelihood of selecting the most suitable model. -- The metric ascertains the stationarity of the series prior to model fitting, thus ensuring that the underlying -assumptions of the MA model are fulfilled. - -###### Limitations - -- If the time series fails to be stationary, the metric may yield inaccurate results. Consequently, it necessitates -pre-processing steps to stabilize the series before fitting the ARIMA model. -- The metric adopts a rudimentary model selection process based on BIC and doesn't consider other potential model -selection strategies. Depending on the specific dataset, other strategies could be more appropriate. -- The 'max_ma_order' parameter must be manually input which doesn't always guarantee optimal performance, -especially when configured too low. -- The computation time increases with the rise in `max_ma_order`, hence, the metric may become computationally -costly for larger values. - - +- The metric ascertains the stationarity of the series prior to model fitting, thus ensuring that the underlying assumptions of the MA model are fulfilled. +### Limitations - \ No newline at end of file +- If the time series fails to be stationary, the metric may yield inaccurate results. Consequently, it necessitates pre-processing steps to stabilize the series before fitting the ARIMA model. +- The metric adopts a rudimentary model selection process based on BIC and doesn't consider other potential model selection strategies. Depending on the specific dataset, other strategies could be more appropriate. +- The 'max_ma_order' parameter must be manually input which doesn't always guarantee optimal performance, especially when configured too low. +- The computation time increases with the rise in `max_ma_order`, hence, the metric may become computationally costly for larger values. diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 8d6a11b51..d2264535d 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### AutoStationarity +## AutoStationarity[()]{.muted} ```python def AutoStationarity( @@ -20,48 +15,27 @@ def AutoStationarity( Automates Augmented Dickey-Fuller test to assess stationarity across multiple time series in a DataFrame. -###### Purpose - -The AutoStationarity metric is intended to automatically detect and evaluate the stationary nature of each time -series in a DataFrame. It incorporates the Augmented Dickey-Fuller (ADF) test, a statistical approach used to -assess stationarity. Stationarity is a fundamental property suggesting that statistic features like mean and -variance remain unchanged over time. This is necessary for many time-series models. - -###### Test Mechanism - -The mechanism for the AutoStationarity test involves applying the Augmented Dicky-Fuller test to each time series -within the given dataframe to assess if they are stationary. Every series in the dataframe is looped, using the ADF -test up to a defined maximum order (configurable and by default set to 5). The p-value resulting from the ADF test -is compared against a predetermined threshold (also configurable and by default set to 0.05). The time series is -deemed stationary at its current differencing order if the p-value is less than the threshold. - -###### Signs of High Risk +### Purpose -- A significant number of series not achieving stationarity even at the maximum order of differencing can indicate -high risk or potential failure in the model. -- This could suggest the series may not be appropriately modeled by a stationary process, hence other modeling -approaches might be required. +The AutoStationarity metric is intended to automatically detect and evaluate the stationary nature of each time series in a DataFrame. It incorporates the Augmented Dickey-Fuller (ADF) test, a statistical approach used to assess stationarity. Stationarity is a fundamental property suggesting that statistic features like mean and variance remain unchanged over time. This is necessary for many time-series models. -###### Strengths +### Test Mechanism -- The key strength in this metric lies in the automation of the ADF test, enabling mass stationarity analysis -across various time series and boosting the efficiency and credibility of the analysis. -- The utilization of the ADF test, a widely accepted method for testing stationarity, lends authenticity to the -results derived. -- The introduction of the max order and threshold parameters give users the autonomy to determine their preferred -levels of stringency in the tests. +The mechanism for the AutoStationarity test involves applying the Augmented Dicky-Fuller test to each time series within the given dataframe to assess if they are stationary. Every series in the dataframe is looped, using the ADF test up to a defined maximum order (configurable and by default set to 5). The p-value resulting from the ADF test is compared against a predetermined threshold (also configurable and by default set to 0.05). The time series is deemed stationary at its current differencing order if the p-value is less than the threshold. -###### Limitations +### Signs of High Risk -- The Augmented Dickey-Fuller test and the stationarity test are not without their limitations. These tests are -premised on the assumption that the series can be modeled by an autoregressive process, which may not always hold -true. -- The stationarity check is highly sensitive to the choice of threshold for the significance level; an extremely -high or low threshold could lead to incorrect results regarding the stationarity properties. -- There's also a risk of over-differencing if the maximum order is set too high, which could induce unnecessary -cycles. +- A significant number of series not achieving stationarity even at the maximum order of differencing can indicate high risk or potential failure in the model. +- This could suggest the series may not be appropriately modeled by a stationary process, hence other modeling approaches might be required. +### Strengths +- The key strength in this metric lies in the automation of the ADF test, enabling mass stationarity analysis across various time series and boosting the efficiency and credibility of the analysis. +- The utilization of the ADF test, a widely accepted method for testing stationarity, lends authenticity to the results derived. +- The introduction of the max order and threshold parameters give users the autonomy to determine their preferred levels of stringency in the tests. +### Limitations - \ No newline at end of file +- The Augmented Dickey-Fuller test and the stationarity test are not without their limitations. These tests are premised on the assumption that the series can be modeled by an autoregressive process, which may not always hold true. +- The stationarity check is highly sensitive to the choice of threshold for the significance level; an extremely high or low threshold could lead to incorrect results regarding the stationarity properties. +- There's also a risk of over-differencing if the maximum order is set too high, which could induce unnecessary cycles. diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 37d00c421..e00ee8505 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -4,56 +4,37 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### BivariateScatterPlots +## BivariateScatterPlots[()]{.muted} ```python def BivariateScatterPlots( dataset): ``` -Generates bivariate scatterplots to visually inspect relationships between pairs of numerical predictor variables -in machine learning classification tasks. +Generates bivariate scatterplots to visually inspect relationships between pairs of numerical predictor variables in machine learning classification tasks. -###### Purpose +### Purpose -This function is intended for visual inspection and monitoring of relationships between pairs of numerical -variables in a machine learning model targeting classification tasks. It helps in understanding how predictor -variables (features) interact with each other, which can inform feature selection, model-building strategies, and -identify potential biases or irregularities in the data. +This function is intended for visual inspection and monitoring of relationships between pairs of numerical variables in a machine learning model targeting classification tasks. It helps in understanding how predictor variables (features) interact with each other, which can inform feature selection, model-building strategies, and identify potential biases or irregularities in the data. -###### Test Mechanism +### Test Mechanism -The function creates scatter plots for each pair of numerical features in the dataset. It first filters out -non-numerical and binary features, ensuring the plots focus on meaningful numerical relationships. The resulting -scatterplots are color-coded uniformly to avoid visual distraction, and the function returns a tuple of Plotly -figure objects, each representing a scatter plot for a pair of features. +The function creates scatter plots for each pair of numerical features in the dataset. It first filters out non-numerical and binary features, ensuring the plots focus on meaningful numerical relationships. The resulting scatterplots are color-coded uniformly to avoid visual distraction, and the function returns a tuple of Plotly figure objects, each representing a scatter plot for a pair of features. -###### Signs of High Risk +### Signs of High Risk -- Visual patterns suggesting non-linear relationships, multicollinearity, clustering, or outlier points in the -scatter plots. -- Such issues could affect the assumptions and performance of certain models, especially those assuming linearity, -like logistic regression. +- Visual patterns suggesting non-linear relationships, multicollinearity, clustering, or outlier points in the scatter plots. +- Such issues could affect the assumptions and performance of certain models, especially those assuming linearity, like logistic regression. -###### Strengths +### Strengths - Scatterplots provide an intuitive and visual tool to explore relationships between two variables. - They are useful for identifying outliers, variable associations, and trends, including non-linear patterns. - Supports visualization of binary or multi-class classification datasets, focusing on numerical features. -###### Limitations +### Limitations - Scatterplots are limited to bivariate analysis, showing relationships between only two variables at a time. - Not ideal for very large datasets where overlapping points can reduce the clarity of the visualization. - Scatterplots are exploratory tools and do not provide quantitative measures of model quality or performance. - Interpretation is subjective and relies on the domain knowledge and judgment of the viewer. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index 53c96866e..b79968ef3 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### BoxPierce +## BoxPierce[()]{.muted} ```python def BoxPierce( @@ -18,46 +13,29 @@ def BoxPierce( Detects autocorrelation in time-series data through the Box-Pierce test to validate model performance. -###### Purpose +### Purpose -The Box-Pierce test is utilized to detect the presence of autocorrelation in a time-series dataset. -Autocorrelation, or serial correlation, refers to the degree of similarity between observations based on the -temporal spacing between them. This test is essential for affirming the quality of a time-series model by ensuring -that the error terms in the model are random and do not adhere to a specific pattern. +The Box-Pierce test is utilized to detect the presence of autocorrelation in a time-series dataset. Autocorrelation, or serial correlation, refers to the degree of similarity between observations based on the temporal spacing between them. This test is essential for affirming the quality of a time-series model by ensuring that the error terms in the model are random and do not adhere to a specific pattern. -###### Test Mechanism +### Test Mechanism -The implementation of the Box-Pierce test involves calculating a test statistic along with a corresponding p-value -derived from the dataset features. These quantities are used to test the null hypothesis that posits the data to be -independently distributed. This is achieved by iterating over every feature column in the time-series data and -applying the `acorr_ljungbox` function of the statsmodels library. The function yields the Box-Pierce test -statistic as well as the respective p-value, all of which are cached as test results. +The implementation of the Box-Pierce test involves calculating a test statistic along with a corresponding p-value derived from the dataset features. These quantities are used to test the null hypothesis that posits the data to be independently distributed. This is achieved by iterating over every feature column in the time-series data and applying the `acorr_ljungbox` function of the statsmodels library. The function yields the Box-Pierce test statistic as well as the respective p-value, all of which are cached as test results. -###### Signs of High Risk +### Signs of High Risk -- A low p-value, typically under 0.05 as per statistical convention, throws the null hypothesis of independence -into question. This implies that the dataset potentially houses autocorrelations, thus indicating a high-risk -scenario concerning model performance. +- A low p-value, typically under 0.05 as per statistical convention, throws the null hypothesis of independence into question. This implies that the dataset potentially houses autocorrelations, thus indicating a high-risk scenario concerning model performance. - Large Box-Pierce test statistic values may indicate the presence of autocorrelation. -###### Strengths +### Strengths - Detects patterns in data that are supposed to be random, thereby ensuring no underlying autocorrelation. - Can be computed efficiently given its low computational complexity. - Can be widely applied to most regression problems, making it very versatile. -###### Limitations +### Limitations -- Assumes homoscedasticity (constant variance) and normality of residuals, which may not always be the case in -real-world datasets. -- May exhibit reduced power for detecting complex autocorrelation schemes such as higher-order or negative -correlations. -- It only provides a general indication of the existence of autocorrelation, without providing specific insights -into the nature or patterns of the detected autocorrelation. +- Assumes homoscedasticity (constant variance) and normality of residuals, which may not always be the case in real-world datasets. +- May exhibit reduced power for detecting complex autocorrelation schemes such as higher-order or negative correlations. +- It only provides a general indication of the existence of autocorrelation, without providing specific insights into the nature or patterns of the detected autocorrelation. - In the presence of trends or seasonal patterns, the Box-Pierce test may yield misleading results. - Applicability is limited to time-series data, which limits its overall utility. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 9d077db9f..624d8db2f 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ChiSquaredFeaturesTable +## ChiSquaredFeaturesTable[()]{.muted} ```python def ChiSquaredFeaturesTable( @@ -19,45 +14,28 @@ def ChiSquaredFeaturesTable( Assesses the statistical association between categorical features and a target variable using the Chi-Squared test. -###### Purpose +### Purpose -The `ChiSquaredFeaturesTable` function is designed to evaluate the relationship between categorical features and a -target variable in a dataset. It performs a Chi-Squared test of independence for each categorical feature to -determine whether a statistically significant association exists with the target variable. This is particularly -useful in Model Risk Management for understanding the relevance of features and identifying potential biases in a -classification model. +The `ChiSquaredFeaturesTable` function is designed to evaluate the relationship between categorical features and a target variable in a dataset. It performs a Chi-Squared test of independence for each categorical feature to determine whether a statistically significant association exists with the target variable. This is particularly useful in Model Risk Management for understanding the relevance of features and identifying potential biases in a classification model. -###### Test Mechanism +### Test Mechanism -The function creates a contingency table for each categorical feature and the target variable, then applies the -Chi-Squared test to compute the Chi-squared statistic and the p-value. The results for each feature include the -variable name, Chi-squared statistic, p-value, p-value threshold, and a pass/fail status based on whether the -p-value is below the specified threshold. The output is a DataFrame summarizing these results, sorted by p-value to -highlight the most statistically significant associations. +The function creates a contingency table for each categorical feature and the target variable, then applies the Chi-Squared test to compute the Chi-squared statistic and the p-value. The results for each feature include the variable name, Chi-squared statistic, p-value, p-value threshold, and a pass/fail status based on whether the p-value is below the specified threshold. The output is a DataFrame summarizing these results, sorted by p-value to highlight the most statistically significant associations. -###### Signs of High Risk +### Signs of High Risk -- High p-values (greater than the set threshold) indicate a lack of significant association between a feature and -the target variable, resulting in a 'Fail' status. -- Features with a 'Fail' status might not be relevant for the model, which could negatively impact model -performance. +- High p-values (greater than the set threshold) indicate a lack of significant association between a feature and the target variable, resulting in a 'Fail' status. +- Features with a 'Fail' status might not be relevant for the model, which could negatively impact model performance. -###### Strengths +### Strengths - Provides a clear, statistical assessment of the relationship between categorical features and the target variable. -- Produces an easily interpretable summary with a 'Pass/Fail' outcome for each feature, helping in feature -selection. +- Produces an easily interpretable summary with a 'Pass/Fail' outcome for each feature, helping in feature selection. - The p-value threshold is adjustable, allowing for flexibility in statistical rigor. -###### Limitations +### Limitations - Assumes the dataset is tabular and consists of categorical variables, which may not be suitable for all datasets. - The test is designed for classification tasks and is not applicable to regression problems. - As with all hypothesis tests, the Chi-Squared test can only detect associations, not causal relationships. -- The choice of p-value threshold can affect the interpretation of feature relevance, and different thresholds may -lead to different conclusions. - - - - - \ No newline at end of file +- The choice of p-value threshold can affect the interpretation of feature relevance, and different thresholds may lead to different conclusions. diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index dd5532556..29a1eccda 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -6,15 +6,7 @@ toc-expand: 3 Threshold based tests - - - - - - - - -#### ClassImbalance +## ClassImbalance[()]{.muted} ```python def ClassImbalance( @@ -24,50 +16,32 @@ def ClassImbalance( Evaluates and quantifies class distribution imbalance in a dataset used by a machine learning model. -###### Purpose +### Purpose -The Class Imbalance test is designed to evaluate the distribution of target classes in a dataset that's utilized by -a machine learning model. Specifically, it aims to ensure that the classes aren't overly skewed, which could lead -to bias in the model's predictions. It's crucial to have a balanced training dataset to avoid creating a model -that's biased with high accuracy for the majority class and low accuracy for the minority class. +The Class Imbalance test is designed to evaluate the distribution of target classes in a dataset that's utilized by a machine learning model. Specifically, it aims to ensure that the classes aren't overly skewed, which could lead to bias in the model's predictions. It's crucial to have a balanced training dataset to avoid creating a model that's biased with high accuracy for the majority class and low accuracy for the minority class. -###### Test Mechanism +### Test Mechanism -This Class Imbalance test operates by calculating the frequency (expressed as a percentage) of each class in the -target column of the dataset. It then checks whether each class appears in at least a set minimum percentage of the -total records. This minimum percentage is a modifiable parameter, but the default value is set to 10%. +This Class Imbalance test operates by calculating the frequency (expressed as a percentage) of each class in the target column of the dataset. It then checks whether each class appears in at least a set minimum percentage of the total records. This minimum percentage is a modifiable parameter, but the default value is set to 10%. -###### Signs of High Risk +### Signs of High Risk -- Any class that represents less than the pre-set minimum percentage threshold is marked as high risk, implying a -potential class imbalance. +- Any class that represents less than the pre-set minimum percentage threshold is marked as high risk, implying a potential class imbalance. - The function provides a pass/fail outcome for each class based on this criterion. -- Fundamentally, if any class fails this test, it's highly likely that the dataset possesses imbalanced class -distribution. +- Fundamentally, if any class fails this test, it's highly likely that the dataset possesses imbalanced class distribution. -###### Strengths +### Strengths - The test can spot under-represented classes that could affect the efficiency of a machine learning model. - The calculation is straightforward and swift. -- The test is highly informative because it not only spots imbalance, but it also quantifies the degree of -imbalance. +- The test is highly informative because it not only spots imbalance, but it also quantifies the degree of imbalance. - The adjustable threshold enables flexibility and adaptation to differing use-cases or domain-specific needs. -- The test creates a visually insightful plot showing the classes and their corresponding proportions, enhancing -interpretability and comprehension of the data. +- The test creates a visually insightful plot showing the classes and their corresponding proportions, enhancing interpretability and comprehension of the data. -###### Limitations +### Limitations -- The test might struggle to perform well or provide vital insights for datasets with a high number of classes. In -such cases, the imbalance could be inevitable due to the inherent class distribution. -- Sensitivity to the threshold value might result in faulty detection of imbalance if the threshold is set -excessively high. -- Regardless of the percentage threshold, it doesn't account for varying costs or impacts of misclassifying -different classes, which might fluctuate based on specific applications or domains. -- While it can identify imbalances in class distribution, it doesn't provide direct methods to address or correct -these imbalances. +- The test might struggle to perform well or provide vital insights for datasets with a high number of classes. In such cases, the imbalance could be inevitable due to the inherent class distribution. +- Sensitivity to the threshold value might result in faulty detection of imbalance if the threshold is set excessively high. +- Regardless of the percentage threshold, it doesn't account for varying costs or impacts of misclassifying different classes, which might fluctuate based on specific applications or domains. +- While it can identify imbalances in class distribution, it doesn't provide direct methods to address or correct these imbalances. - The test is only applicable for classification operations and unsuitable for regression or clustering tasks. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 55a345b7b..d25eb868a 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### DatasetDescription +## DatasetDescription[()]{.muted} ```python def DatasetDescription( @@ -18,58 +13,37 @@ def DatasetDescription( Provides comprehensive analysis and statistical summaries of each column in a machine learning model's dataset. -###### Purpose +### Purpose -The test depicted in the script is meant to run a comprehensive analysis on a Machine Learning model's datasets. -The test or metric is implemented to obtain a complete summary of the columns in the dataset, including vital -statistics of each column such as count, distinct values, missing values, histograms for numerical, categorical, -boolean, and text columns. This summary gives a comprehensive overview of the dataset to better understand the -characteristics of the data that the model is trained on or evaluates. +The test depicted in the script is meant to run a comprehensive analysis on a Machine Learning model's datasets. The test or metric is implemented to obtain a complete summary of the columns in the dataset, including vital statistics of each column such as count, distinct values, missing values, histograms for numerical, categorical, boolean, and text columns. This summary gives a comprehensive overview of the dataset to better understand the characteristics of the data that the model is trained on or evaluates. -###### Test Mechanism +### Test Mechanism -The DatasetDescription class accomplishes the purpose as follows**: firstly, the test method "run" infers the data -type of each column in the dataset and stores the details (id, column type). For each column, the -"describe_column" method is invoked to collect statistical information about the column, including count, -missing value count and its proportion to the total, unique value count, and its proportion to the total. Depending -on the data type of a column, histograms are generated that reflect the distribution of data within the column. -Numerical columns use the "get_numerical_histograms" method to calculate histogram distribution, whereas for -categorical, boolean and text columns, a histogram is computed with frequencies of each unique value in the -datasets. For unsupported types, an error is raised. Lastly, a summary table is built to aggregate all the -statistical insights and histograms of the columns in a dataset. +The DatasetDescription class accomplishes the purpose as follows: firstly, the test method "run" infers the data type of each column in the dataset and stores the details (id, column type). For each column, the "describe_column" method is invoked to collect statistical information about the column, including count, missing value count and its proportion to the total, unique value count, and its proportion to the total. Depending on the data type of a column, histograms are generated that reflect the distribution of data within the column. Numerical columns use the "get_numerical_histograms" method to calculate histogram distribution, whereas for categorical, boolean and text columns, a histogram is computed with frequencies of each unique value in the datasets. For unsupported types, an error is raised. Lastly, a summary table is built to aggregate all the statistical insights and histograms of the columns in a dataset. -###### Signs of High Risk +### Signs of High Risk -- High ratio of missing values to total values in one or more columns which may impact the quality of the -predictions. +- High ratio of missing values to total values in one or more columns which may impact the quality of the predictions. - Unsupported data types in dataset columns. -- Large number of unique values in the dataset's columns which might make it harder for the model to establish -patterns. +- Large number of unique values in the dataset's columns which might make it harder for the model to establish patterns. - Extreme skewness or irregular distribution of data as reflected in the histograms. -###### Strengths +### Strengths - Provides a detailed analysis of the dataset with versatile summaries like count, unique values, histograms, etc. - Flexibility in handling different types of data: numerical, categorical, boolean, and text. -- Useful in detecting problems in the dataset like missing values, unsupported data types, irregular data -distribution, etc. -- The summary gives a comprehensive understanding of dataset features allowing developers to make informed -decisions. +- Useful in detecting problems in the dataset like missing values, unsupported data types, irregular data distribution, etc. +- The summary gives a comprehensive understanding of dataset features allowing developers to make informed decisions. -###### Limitations +### Limitations - The computation can be expensive from a resource standpoint, particularly for large datasets with numerous columns. -- The histograms use an arbitrary number of bins which may not be the optimal number of bins for specific data -distribution. +- The histograms use an arbitrary number of bins which may not be the optimal number of bins for specific data distribution. - Unsupported data types for columns will raise an error which may limit evaluating the dataset. - Columns with all null or missing values are not included in histogram computation. - This test only validates the quality of the dataset but doesn't address the model's performance directly. - - - - -#### describe_column +## describe_column[()]{.muted} ```python def describe_column( @@ -79,11 +53,7 @@ def describe_column( Gets descriptive statistics for a single column in a Pandas DataFrame. - - - - -#### get_column_histograms +## get_column_histograms[()]{.muted} ```python def get_column_histograms( @@ -92,16 +62,11 @@ def get_column_histograms( type_): ``` -Returns a collection of histograms for a numerical or categorical column. -We store different combinations of bin sizes to allow analyzing the data better - -Will be used in favor of _get_histogram in the future - - +Returns a collection of histograms for a numerical or categorical column. We store different combinations of bin sizes to allow analyzing the data better +Will be used in favor of \_get_histogram in the future - -#### get_numerical_histograms +## get_numerical_histograms[()]{.muted} ```python def get_numerical_histograms( @@ -109,18 +74,11 @@ def get_numerical_histograms( column): ``` -Returns a collection of histograms for a numerical column, each one -with a different bin size +Returns a collection of histograms for a numerical column, each one with a different bin size - - - - -#### infer_datatypes +## infer_datatypes[()]{.muted} ```python def infer_datatypes( df): ``` - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index ba0056697..963ce497f 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -4,59 +4,37 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### DatasetSplit +## DatasetSplit[()]{.muted} ```python def DatasetSplit( datasets: List): ``` -Evaluates and visualizes the distribution proportions among training, testing, and validation datasets of an ML -model. +Evaluates and visualizes the distribution proportions among training, testing, and validation datasets of an ML model. -###### Purpose +### Purpose -The DatasetSplit test is designed to evaluate and visualize the distribution of data among training, testing, and -validation datasets, if available, within a given machine learning model. The main purpose is to assess whether the -model's datasets are split appropriately, as an imbalanced split might affect the model's ability to learn from the -data and generalize to unseen data. +The DatasetSplit test is designed to evaluate and visualize the distribution of data among training, testing, and validation datasets, if available, within a given machine learning model. The main purpose is to assess whether the model's datasets are split appropriately, as an imbalanced split might affect the model's ability to learn from the data and generalize to unseen data. -###### Test Mechanism +### Test Mechanism -The DatasetSplit test first calculates the total size of all available datasets in the model. Then, for each -individual dataset, the methodology involves determining the size of the dataset and its proportion relative to the -total size. The results are then conveniently summarized in a table that shows dataset names, sizes, and -proportions. Absolute size and proportion of the total dataset size are displayed for each individual dataset. +The DatasetSplit test first calculates the total size of all available datasets in the model. Then, for each individual dataset, the methodology involves determining the size of the dataset and its proportion relative to the total size. The results are then conveniently summarized in a table that shows dataset names, sizes, and proportions. Absolute size and proportion of the total dataset size are displayed for each individual dataset. -###### Signs of High Risk +### Signs of High Risk - A very small training dataset, which may result in the model not learning enough from the data. -- A very large training dataset and a small test dataset, which may lead to model overfitting and poor -generalization to unseen data. +- A very large training dataset and a small test dataset, which may lead to model overfitting and poor generalization to unseen data. - A small or non-existent validation dataset, which might complicate the model's performance assessment. -###### Strengths +### Strengths -- The DatasetSplit test provides a clear, understandable visualization of dataset split proportions, which can -highlight any potential imbalance in dataset splits quickly. +- The DatasetSplit test provides a clear, understandable visualization of dataset split proportions, which can highlight any potential imbalance in dataset splits quickly. - It covers a wide range of task types including classification, regression, and text-related tasks. -- The metric is not tied to any specific data type and is applicable to tabular data, time series data, or text -data. +- The metric is not tied to any specific data type and is applicable to tabular data, time series data, or text data. -###### Limitations +### Limitations -- The DatasetSplit test does not provide any insight into the quality or diversity of the data within each split, -just the size and proportion. +- The DatasetSplit test does not provide any insight into the quality or diversity of the data within each split, just the size and proportion. - The test does not give any recommendations or adjustments for imbalanced datasets. -- Potential lack of compatibility with more complex modes of data splitting (for example, stratified or time-based -splits) could limit the applicability of this test. - - - - - \ No newline at end of file +- Potential lack of compatibility with more complex modes of data splitting (for example, stratified or time-based splits) could limit the applicability of this test. diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index d84624eec..09ceec015 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -4,67 +4,42 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### DescriptiveStatistics +## DescriptiveStatistics[()]{.muted} ```python def DescriptiveStatistics( dataset: VMDataset): ``` -Performs a detailed descriptive statistical analysis of both numerical and categorical data within a model's -dataset. +Performs a detailed descriptive statistical analysis of both numerical and categorical data within a model's dataset. -###### Purpose +### Purpose -The purpose of the Descriptive Statistics metric is to provide a comprehensive summary of both numerical and -categorical data within a dataset. This involves statistics such as count, mean, standard deviation, minimum and -maximum values for numerical data. For categorical data, it calculates the count, number of unique values, most -common value and its frequency, and the proportion of the most frequent value relative to the total. The goal is to -visualize the overall distribution of the variables in the dataset, aiding in understanding the model's behavior -and predicting its performance. +The purpose of the Descriptive Statistics metric is to provide a comprehensive summary of both numerical and categorical data within a dataset. This involves statistics such as count, mean, standard deviation, minimum and maximum values for numerical data. For categorical data, it calculates the count, number of unique values, most common value and its frequency, and the proportion of the most frequent value relative to the total. The goal is to visualize the overall distribution of the variables in the dataset, aiding in understanding the model's behavior and predicting its performance. -###### Test Mechanism +### Test Mechanism -The testing mechanism utilizes two in-built functions of pandas dataframes**: `describe()` for numerical fields and -`value_counts()` for categorical fields. The `describe()` function pulls out several summary statistics, while -`value_counts()` accounts for unique values. The resulting data is formatted into two distinct tables, one for -numerical and another for categorical variable summaries. These tables provide a clear summary of the main -characteristics of the variables, which can be instrumental in assessing the model's performance. +The testing mechanism utilizes two in-built functions of pandas dataframes: `describe()` for numerical fields and `value_counts()` for categorical fields. The `describe()` function pulls out several summary statistics, while `value_counts()` accounts for unique values. The resulting data is formatted into two distinct tables, one for numerical and another for categorical variable summaries. These tables provide a clear summary of the main characteristics of the variables, which can be instrumental in assessing the model's performance. -###### Signs of High Risk +### Signs of High Risk -- Skewed data or significant outliers can represent high risk. For numerical data, this may be reflected via a -significant difference between the mean and median (50% percentile). -- For categorical data, a lack of diversity (low count of unique values), or overdominance of a single category -(high frequency of the top value) can indicate high risk. +- Skewed data or significant outliers can represent high risk. For numerical data, this may be reflected via a significant difference between the mean and median (50% percentile). +- For categorical data, a lack of diversity (low count of unique values), or overdominance of a single category (high frequency of the top value) can indicate high risk. -###### Strengths +### Strengths -- Provides a comprehensive summary of the dataset, shedding light on the distribution and characteristics of the -variables under consideration. +- Provides a comprehensive summary of the dataset, shedding light on the distribution and characteristics of the variables under consideration. - It is a versatile and robust method, applicable to both numerical and categorical data. -- Helps highlight crucial anomalies such as outliers, extreme skewness, or lack of diversity, which are vital in -understanding model behavior during testing and validation. +- Helps highlight crucial anomalies such as outliers, extreme skewness, or lack of diversity, which are vital in understanding model behavior during testing and validation. -###### Limitations +### Limitations -- While this metric offers a high-level overview of the data, it may fail to detect subtle correlations or complex -patterns. +- While this metric offers a high-level overview of the data, it may fail to detect subtle correlations or complex patterns. - Does not offer any insights on the relationship between variables. - Alone, descriptive statistics cannot be used to infer properties about future unseen data. -- Should be used in conjunction with other statistical tests to provide a comprehensive understanding of the -model's data. +- Should be used in conjunction with other statistical tests to provide a comprehensive understanding of the model's data. - - - - -#### get_summary_statistics_categorical +## get_summary_statistics_categorical[()]{.muted} ```python def get_summary_statistics_categorical( @@ -72,13 +47,10 @@ def get_summary_statistics_categorical( categorical_fields): ``` - -#### get_summary_statistics_numerical +## get_summary_statistics_numerical[()]{.muted} ```python def get_summary_statistics_numerical( df, numerical_fields): ``` - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 7b0900a8e..6e5ed37bc 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### DickeyFullerGLS +## DickeyFullerGLS[()]{.muted} ```python def DickeyFullerGLS( @@ -18,44 +13,26 @@ def DickeyFullerGLS( Assesses stationarity in time series data using the Dickey-Fuller GLS test to determine the order of integration. -###### Purpose +### Purpose -The Dickey-Fuller GLS (DFGLS) test is utilized to determine the order of integration in time series data. For -machine learning models dealing with time series and forecasting, this metric evaluates the existence of a unit -root, thereby checking whether a time series is non-stationary. This analysis is a crucial initial step when -dealing with time series data. +The Dickey-Fuller GLS (DFGLS) test is utilized to determine the order of integration in time series data. For machine learning models dealing with time series and forecasting, this metric evaluates the existence of a unit root, thereby checking whether a time series is non-stationary. This analysis is a crucial initial step when dealing with time series data. -###### Test Mechanism +### Test Mechanism -This code implements the Dickey-Fuller GLS unit root test on each attribute of the dataset. This process involves -iterating through every column of the dataset and applying the DFGLS test to assess the presence of a unit root. -The resulting information, including the test statistic ('stat'), the p-value ('pvalue'), the quantity of lagged -differences utilized in the regression ('usedlag'), and the number of observations ('nobs'), is subsequently stored. +This code implements the Dickey-Fuller GLS unit root test on each attribute of the dataset. This process involves iterating through every column of the dataset and applying the DFGLS test to assess the presence of a unit root. The resulting information, including the test statistic ('stat'), the p-value ('pvalue'), the quantity of lagged differences utilized in the regression ('usedlag'), and the number of observations ('nobs'), is subsequently stored. -###### Signs of High Risk +### Signs of High Risk -- A high p-value for the DFGLS test represents a high risk. Specifically, a p-value above a typical threshold of -0.05 suggests that the time series data is quite likely to be non-stationary, thus presenting a high risk for -generating unreliable forecasts. +- A high p-value for the DFGLS test represents a high risk. Specifically, a p-value above a typical threshold of 0.05 suggests that the time series data is quite likely to be non-stationary, thus presenting a high risk for generating unreliable forecasts. -###### Strengths +### Strengths - The Dickey-Fuller GLS test is a potent tool for checking the stationarity of time series data. -- It helps to verify the assumptions of the models before the actual construction of the machine learning models -proceeds. -- The results produced by this metric offer a clear insight into whether the data is appropriate for specific -machine learning models, especially those demanding the stationarity of time series data. - -###### Limitations - -- Despite its benefits, the DFGLS test does present some drawbacks. It can potentially lead to inaccurate -conclusions if the time series data incorporates a structural break. -- If the time series tends to follow a trend while still being stationary, the test might misinterpret it, -necessitating further detrending. -- The test also presents challenges when dealing with shorter time series data or volatile data, not producing -reliable results in these cases. - - +- It helps to verify the assumptions of the models before the actual construction of the machine learning models proceeds. +- The results produced by this metric offer a clear insight into whether the data is appropriate for specific machine learning models, especially those demanding the stationarity of time series data. +### Limitations - \ No newline at end of file +- Despite its benefits, the DFGLS test does present some drawbacks. It can potentially lead to inaccurate conclusions if the time series data incorporates a structural break. +- If the time series tends to follow a trend while still being stationary, the test might misinterpret it, necessitating further detrending. +- The test also presents challenges when dealing with shorter time series data or volatile data, not producing reliable results in these cases. diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 4e9850ba0..f2801e09c 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### Duplicates +## Duplicates[()]{.muted} ```python def Duplicates( @@ -19,45 +14,27 @@ def Duplicates( Tests dataset for duplicate entries, ensuring model reliability via data quality verification. -###### Purpose +### Purpose -The 'Duplicates' test is designed to check for duplicate rows within the dataset provided to the model. It serves -as a measure of data quality, ensuring that the model isn't merely memorizing duplicate entries or being swayed by -redundant information. This is an important step in the pre-processing of data for both classification and -regression tasks. +The 'Duplicates' test is designed to check for duplicate rows within the dataset provided to the model. It serves as a measure of data quality, ensuring that the model isn't merely memorizing duplicate entries or being swayed by redundant information. This is an important step in the pre-processing of data for both classification and regression tasks. -###### Test Mechanism +### Test Mechanism -This test operates by checking each row for duplicates in the dataset. If a text column is specified in the -dataset, the test is conducted on this column; if not, the test is run on all feature columns. The number and -percentage of duplicates are calculated and returned in a DataFrame. Additionally, a test is passed if the total -count of duplicates falls below a specified minimum threshold. +This test operates by checking each row for duplicates in the dataset. If a text column is specified in the dataset, the test is conducted on this column; if not, the test is run on all feature columns. The number and percentage of duplicates are calculated and returned in a DataFrame. Additionally, a test is passed if the total count of duplicates falls below a specified minimum threshold. -###### Signs of High Risk +### Signs of High Risk -- A high number of duplicate rows in the dataset, which can lead to overfitting where the model performs well on -the training data but poorly on unseen data. -- A high percentage of duplicate rows in the dataset, indicating potential problems with data collection or -processing. +- A high number of duplicate rows in the dataset, which can lead to overfitting where the model performs well on the training data but poorly on unseen data. +- A high percentage of duplicate rows in the dataset, indicating potential problems with data collection or processing. -###### Strengths +### Strengths -- Assists in improving the reliability of the model's training process by ensuring the training data is not -contaminated with duplicate entries, which can distort statistical analyses. -- Provides both absolute numbers and percentage values of duplicate rows, giving a thorough overview of data -quality. -- Highly customizable as it allows for setting a user-defined minimum threshold to determine if the test has been -passed. +- Assists in improving the reliability of the model's training process by ensuring the training data is not contaminated with duplicate entries, which can distort statistical analyses. +- Provides both absolute numbers and percentage values of duplicate rows, giving a thorough overview of data quality. +- Highly customizable as it allows for setting a user-defined minimum threshold to determine if the test has been passed. -###### Limitations +### Limitations -- Does not distinguish between benign duplicates (i.e., coincidental identical entries in different rows) and -problematic duplicates originating from data collection or processing errors. -- The test becomes more computationally intensive as the size of the dataset increases, which might not be suitable -for very large datasets. +- Does not distinguish between benign duplicates (i.e., coincidental identical entries in different rows) and problematic duplicates originating from data collection or processing errors. +- The test becomes more computationally intensive as the size of the dataset increases, which might not be suitable for very large datasets. - Can only check for exact duplicates and may miss semantically similar information packaged differently. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 4556c0202..ebde93a3a 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### EngleGrangerCoint +## EngleGrangerCoint[()]{.muted} ```python def EngleGrangerCoint( @@ -19,43 +14,26 @@ def EngleGrangerCoint( Assesses the degree of co-movement between pairs of time series data using the Engle-Granger cointegration test. -###### Purpose +### Purpose -The intent of this Engle-Granger cointegration test is to explore and quantify the degree of co-movement between -pairs of time series variables in a dataset. This is particularly useful in enhancing the accuracy of predictive -regressions whenever the underlying variables are co-integrated, i.e., they move together over time. +The intent of this Engle-Granger cointegration test is to explore and quantify the degree of co-movement between pairs of time series variables in a dataset. This is particularly useful in enhancing the accuracy of predictive regressions whenever the underlying variables are co-integrated, i.e., they move together over time. -###### Test Mechanism +### Test Mechanism -The test first drops any non-applicable values from the input dataset and then iterates over each pair of variables -to apply the Engle-Granger cointegration test. The test generates a 'p' value, which is then compared against a -pre-specified threshold (0.05 by default). The pair is labeled as 'Cointegrated' if the 'p' value is less than or -equal to the threshold or 'Not cointegrated' otherwise. A summary table is returned by the metric showing -cointegration results for each variable pair. +The test first drops any non-applicable values from the input dataset and then iterates over each pair of variables to apply the Engle-Granger cointegration test. The test generates a 'p' value, which is then compared against a pre-specified threshold (0.05 by default). The pair is labeled as 'Cointegrated' if the 'p' value is less than or equal to the threshold or 'Not cointegrated' otherwise. A summary table is returned by the metric showing cointegration results for each variable pair. -###### Signs of High Risk +### Signs of High Risk - A significant number of hypothesized cointegrated variables do not pass the test. -- A considerable number of 'p' values are close to the threshold, indicating minor data fluctuations can switch the -decision between 'Cointegrated' and 'Not cointegrated'. - -###### Strengths - -- Provides an effective way to analyze relationships between time series, particularly in contexts where it's -essential to check if variables move together in a statistically significant manner. -- Useful in various domains, especially finance or economics, where predictive models often hinge on understanding -how different variables move together over time. - -###### Limitations - -- Assumes that the time series are integrated of the same order, which isn't always true in multivariate time -series datasets. -- The presence of non-stationary characteristics in the series or structural breaks can result in falsely positive -or negative cointegration results. -- May not perform well for small sample sizes due to lack of statistical power and should be supplemented with -other predictive indicators for a more robust model evaluation. +- A considerable number of 'p' values are close to the threshold, indicating minor data fluctuations can switch the decision between 'Cointegrated' and 'Not cointegrated'. +### Strengths +- Provides an effective way to analyze relationships between time series, particularly in contexts where it's essential to check if variables move together in a statistically significant manner. +- Useful in various domains, especially finance or economics, where predictive models often hinge on understanding how different variables move together over time. +### Limitations - \ No newline at end of file +- Assumes that the time series are integrated of the same order, which isn't always true in multivariate time series datasets. +- The presence of non-stationary characteristics in the series or structural breaks can result in falsely positive or negative cointegration results. +- May not perform well for small sample sizes due to lack of statistical power and should be supplemented with other predictive indicators for a more robust model evaluation. diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index e62fab239..6aec5e592 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### FeatureTargetCorrelationPlot +## FeatureTargetCorrelationPlot[()]{.muted} ```python def FeatureTargetCorrelationPlot( @@ -17,46 +12,30 @@ def FeatureTargetCorrelationPlot( fig_height = 600): ``` -Visualizes the correlation between input features and the model's target output in a color-coded horizontal bar -plot. +Visualizes the correlation between input features and the model's target output in a color-coded horizontal bar plot. -###### Purpose +### Purpose -This test is designed to graphically illustrate the correlations between distinct input features and the target -output of a Machine Learning model. Understanding how each feature influences the model's predictions is crucial—a -higher correlation indicates a stronger influence of the feature on the target variable. This correlation study is -especially advantageous during feature selection and for comprehending the model's operation. +This test is designed to graphically illustrate the correlations between distinct input features and the target output of a Machine Learning model. Understanding how each feature influences the model's predictions is crucial—a higher correlation indicates a stronger influence of the feature on the target variable. This correlation study is especially advantageous during feature selection and for comprehending the model's operation. -###### Test Mechanism +### Test Mechanism -This FeatureTargetCorrelationPlot test computes and presents the correlations between the features and the target -variable using a specific dataset. These correlations are calculated and are then graphically represented in a -horizontal bar plot, color-coded based on the strength of the correlation. A hovering template can also be utilized -for informative tooltips. It is possible to specify the features to be analyzed and adjust the graph's height -according to need. +This FeatureTargetCorrelationPlot test computes and presents the correlations between the features and the target variable using a specific dataset. These correlations are calculated and are then graphically represented in a horizontal bar plot, color-coded based on the strength of the correlation. A hovering template can also be utilized for informative tooltips. It is possible to specify the features to be analyzed and adjust the graph's height according to need. -###### Signs of High Risk +### Signs of High Risk -- There are no strong correlations (either positive or negative) between features and the target variable. This -could suggest high risk as the supplied features do not appear to significantly impact the prediction output. +- There are no strong correlations (either positive or negative) between features and the target variable. This could suggest high risk as the supplied features do not appear to significantly impact the prediction output. - The presence of duplicated correlation values might hint at redundancy in the feature set. -###### Strengths +### Strengths - Provides visual assistance to interpreting correlations more effectively. - Gives a clear and simple tour of how each feature affects the model's target variable. - Beneficial for feature selection and grasping the model's prediction nature. -- Precise correlation values for each feature are offered by the hover template, contributing to a granular-level -comprehension. +- Precise correlation values for each feature are offered by the hover template, contributing to a granular-level comprehension. -###### Limitations +### Limitations - The test only accepts numerical data, meaning variables of other types need to be prepared beforehand. - The plot assumes all correlations to be linear, thus non-linear relationships might not be captured effectively. -- Not apt for models that employ complex feature interactions, like Decision Trees or Neural Networks, as the test -may not accurately reflect their importance. - - - - - \ No newline at end of file +- Not apt for models that employ complex feature interactions, like Decision Trees or Neural Networks, as the test may not accurately reflect their importance. diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 2f6acf279..577a61bfc 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### HighCardinality +## HighCardinality[()]{.muted} ```python def HighCardinality( @@ -21,41 +16,27 @@ def HighCardinality( Assesses the number of unique values in categorical columns to detect high cardinality and potential overfitting. -###### Purpose +### Purpose -The “High Cardinality” test is used to evaluate the number of unique values present in the categorical columns of a -dataset. In this context, high cardinality implies the presence of a large number of unique, non-repetitive values -in the dataset. +The “High Cardinality” test is used to evaluate the number of unique values present in the categorical columns of a dataset. In this context, high cardinality implies the presence of a large number of unique, non-repetitive values in the dataset. -###### Test Mechanism +### Test Mechanism -The test first infers the dataset's type and then calculates an initial numeric threshold based on the test -parameters. It only considers columns classified as "Categorical". For each of these columns, the number of -distinct values (n_distinct) and the percentage of distinct values (p_distinct) are calculated. The test will pass -if n_distinct is less than the calculated numeric threshold. Lastly, the results, which include details such as -column name, number of distinct values, and pass/fail status, are compiled into a table. +The test first infers the dataset's type and then calculates an initial numeric threshold based on the test parameters. It only considers columns classified as "Categorical". For each of these columns, the number of distinct values (n_distinct) and the percentage of distinct values (p_distinct) are calculated. The test will pass if n_distinct is less than the calculated numeric threshold. Lastly, the results, which include details such as column name, number of distinct values, and pass/fail status, are compiled into a table. -###### Signs of High Risk +### Signs of High Risk - A large number of distinct values (high cardinality) in one or more categorical columns implies a high risk. - A column failing the test (n_distinct >= num_threshold) is another indicator of high risk. -###### Strengths +### Strengths - The High Cardinality test is effective in early detection of potential overfitting and unwanted noise. - It aids in identifying potential outliers and inconsistencies, thereby improving data quality. - The test can be applied to both classification and regression task types, demonstrating its versatility. -###### Limitations - -- The test is restricted to only "Categorical" data types and is thus not suitable for numerical or continuous -features, limiting its scope. -- The test does not consider the relevance or importance of unique values in categorical features, potentially -causing it to overlook critical data points. -- The threshold (both number and percent) used for the test is static and may not be optimal for diverse datasets -and varied applications. Further mechanisms to adjust and refine this threshold could enhance its effectiveness. - - - +### Limitations - \ No newline at end of file +- The test is restricted to only "Categorical" data types and is thus not suitable for numerical or continuous features, limiting its scope. +- The test does not consider the relevance or importance of unique values in categorical features, potentially causing it to overlook critical data points. +- The threshold (both number and percent) used for the test is static and may not be optimal for diverse datasets and varied applications. Further mechanisms to adjust and refine this threshold could enhance its effectiveness. diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 68bb52335..eeac7282c 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### HighPearsonCorrelation +## HighPearsonCorrelation[()]{.muted} ```python def HighPearsonCorrelation( @@ -21,44 +16,28 @@ def HighPearsonCorrelation( Identifies highly correlated feature pairs in a dataset suggesting feature redundancy or multicollinearity. -###### Purpose +### Purpose -The High Pearson Correlation test measures the linear relationship between features in a dataset, with the main -goal of identifying high correlations that might indicate feature redundancy or multicollinearity. Identification -of such issues allows developers and risk management teams to properly deal with potential impacts on the machine -learning model's performance and interpretability. +The High Pearson Correlation test measures the linear relationship between features in a dataset, with the main goal of identifying high correlations that might indicate feature redundancy or multicollinearity. Identification of such issues allows developers and risk management teams to properly deal with potential impacts on the machine learning model's performance and interpretability. -###### Test Mechanism +### Test Mechanism -The test works by generating pairwise Pearson correlations for all features in the dataset, then sorting and -eliminating duplicate and self-correlations. It assigns a Pass or Fail based on whether the absolute value of the -correlation coefficient surpasses a pre-set threshold (defaulted at 0.3). It lastly returns the top n strongest -correlations regardless of passing or failing status (where n is 10 by default but can be configured by passing the -`top_n_correlations` parameter). +The test works by generating pairwise Pearson correlations for all features in the dataset, then sorting and eliminating duplicate and self-correlations. It assigns a Pass or Fail based on whether the absolute value of the correlation coefficient surpasses a pre-set threshold (defaulted at 0.3). It lastly returns the top n strongest correlations regardless of passing or failing status (where n is 10 by default but can be configured by passing the `top_n_correlations` parameter). -###### Signs of High Risk +### Signs of High Risk - A high risk indication would be the presence of correlation coefficients exceeding the threshold. -- If the features share a strong linear relationship, this could lead to potential multicollinearity and model -overfitting. -- Redundancy of variables can undermine the interpretability of the model due to uncertainty over the authenticity -of individual variable's predictive power. +- If the features share a strong linear relationship, this could lead to potential multicollinearity and model overfitting. +- Redundancy of variables can undermine the interpretability of the model due to uncertainty over the authenticity of individual variable's predictive power. -###### Strengths +### Strengths - Provides a quick and simple means of identifying relationships between feature pairs. -- Generates a transparent output that displays pairs of correlated variables, the Pearson correlation coefficient, -and a Pass or Fail status for each. +- Generates a transparent output that displays pairs of correlated variables, the Pearson correlation coefficient, and a Pass or Fail status for each. - Aids in early identification of potential multicollinearity issues that may disrupt model training. -###### Limitations +### Limitations - Can only delineate linear relationships, failing to shed light on nonlinear relationships or dependencies. - Sensitive to outliers where a few outliers could notably affect the correlation coefficient. -- Limited to identifying redundancy only within feature pairs; may fail to spot more complex relationships among -three or more variables. - - - - - \ No newline at end of file +- Limited to identifying redundancy only within feature pairs; may fail to spot more complex relationships among three or more variables. diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 53c5d863e..c3854427f 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### compute_outliers +## compute_outliers[()]{.muted} ```python def compute_outliers( @@ -17,8 +12,7 @@ def compute_outliers( threshold): ``` - -#### IQROutliersBarPlot +## IQROutliersBarPlot[()]{.muted} ```python def IQROutliersBarPlot( @@ -29,52 +23,35 @@ def IQROutliersBarPlot( Visualizes outlier distribution across percentiles in numerical data using the Interquartile Range (IQR) method. -###### Purpose +### Purpose -The InterQuartile Range Outliers Bar Plot (IQROutliersBarPlot) metric aims to visually analyze and evaluate the -extent of outliers in numeric variables based on percentiles. Its primary purpose is to clarify the dataset's -distribution, flag possible abnormalities in it, and gauge potential risks associated with processing potentially -skewed data, which can affect the machine learning model's predictive prowess. +The InterQuartile Range Outliers Bar Plot (IQROutliersBarPlot) metric aims to visually analyze and evaluate the extent of outliers in numeric variables based on percentiles. Its primary purpose is to clarify the dataset's distribution, flag possible abnormalities in it, and gauge potential risks associated with processing potentially skewed data, which can affect the machine learning model's predictive prowess. -###### Test Mechanism +### Test Mechanism The examination invokes a series of steps: -1. For every numeric feature in the dataset, the 25th percentile (Q1) and 75th percentile (Q3) are calculated -before deriving the Interquartile Range (IQR), the difference between Q1 and Q3. -2. Subsequently, the metric calculates the lower and upper thresholds by subtracting Q1 from the `threshold` times -IQR and adding Q3 to `threshold` times IQR, respectively. The default `threshold` is set at 1.5. -3. Any value in the feature that falls below the lower threshold or exceeds the upper threshold is labeled as an -outlier. -4. The number of outliers are tallied for different percentiles, such as [0-25], [25-50], [50-75], and [75-100]. -5. These counts are employed to construct a bar plot for the feature, showcasing the distribution of outliers -across different percentiles. +1. For every numeric feature in the dataset, the 25th percentile (Q1) and 75th percentile (Q3) are calculated before deriving the Interquartile Range (IQR), the difference between Q1 and Q3. +1. Subsequently, the metric calculates the lower and upper thresholds by subtracting Q1 from the `threshold` times IQR and adding Q3 to `threshold` times IQR, respectively. The default `threshold` is set at 1.5. +1. Any value in the feature that falls below the lower threshold or exceeds the upper threshold is labeled as an outlier. +1. The number of outliers are tallied for different percentiles, such as [0-25], [25-50], [50-75], and [75-100]. +1. These counts are employed to construct a bar plot for the feature, showcasing the distribution of outliers across different percentiles. -###### Signs of High Risk +### Signs of High Risk - A prevalence of outliers in the data, potentially skewing its distribution. -- Outliers dominating higher percentiles (75-100) which implies the presence of extreme values, capable of severely -influencing the model's performance. -- Certain features harboring most of their values as outliers, which signifies that these features might not -contribute positively to the model's forecasting ability. +- Outliers dominating higher percentiles (75-100) which implies the presence of extreme values, capable of severely influencing the model's performance. +- Certain features harboring most of their values as outliers, which signifies that these features might not contribute positively to the model's forecasting ability. -###### Strengths +### Strengths -- Effectively identifies outliers in the data through visual means, facilitating easier comprehension and offering -insights into the outliers' possible impact on the model. +- Effectively identifies outliers in the data through visual means, facilitating easier comprehension and offering insights into the outliers' possible impact on the model. - Provides flexibility by accommodating all numeric features or a chosen subset. - Task-agnostic in nature; it is viable for both classification and regression tasks. - Can handle large datasets as its operation does not hinge on computationally heavy operations. -###### Limitations +### Limitations - Its application is limited to numerical variables and does not extend to categorical ones. -- Only reveals the presence and distribution of outliers and does not provide insights into how these outliers -might affect the model's predictive performance. -- The assumption that data is unimodal and symmetric may not always hold true. In cases with non-normal -distributions, the results can be misleading. - - - - - \ No newline at end of file +- Only reveals the presence and distribution of outliers and does not provide insights into how these outliers might affect the model's predictive performance. +- The assumption that data is unimodal and symmetric may not always hold true. In cases with non-normal distributions, the results can be misleading. diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 3cdc3cc33..a6fa48f42 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### compute_outliers +## compute_outliers[()]{.muted} ```python def compute_outliers( @@ -17,8 +12,7 @@ def compute_outliers( threshold = 1.5): ``` - -#### IQROutliersTable +## IQROutliersTable[()]{.muted} ```python def IQROutliersTable( @@ -28,46 +22,29 @@ def IQROutliersTable( Determines and summarizes outliers in numerical features using the Interquartile Range method. -###### Purpose +### Purpose -The "Interquartile Range Outliers Table" (IQROutliersTable) metric is designed to identify and summarize outliers -within numerical features of a dataset using the Interquartile Range (IQR) method. This exercise is crucial in the -pre-processing of data because outliers can substantially distort statistical analysis and impact the performance -of machine learning models. +The "Interquartile Range Outliers Table" (IQROutliersTable) metric is designed to identify and summarize outliers within numerical features of a dataset using the Interquartile Range (IQR) method. This exercise is crucial in the pre-processing of data because outliers can substantially distort statistical analysis and impact the performance of machine learning models. -###### Test Mechanism +### Test Mechanism -The IQR, which is the range separating the first quartile (25th percentile) from the third quartile (75th -percentile), is calculated for each numerical feature within the dataset. An outlier is defined as a data point -falling below the "Q1 - 1.5 * IQR" or above "Q3 + 1.5 * IQR" range. The test computes the number of outliers and -their summary statistics (minimum, 25th percentile, median, 75th percentile, and maximum values) for each numerical -feature. If no specific features are chosen, the test applies to all numerical features in the dataset. The default -outlier threshold is set to 1.5 but can be customized by the user. +The IQR, which is the range separating the first quartile (25th percentile) from the third quartile (75th percentile), is calculated for each numerical feature within the dataset. An outlier is defined as a data point falling below the "Q1 - 1.5 * IQR" or above "Q3 + 1.5 * IQR" range. The test computes the number of outliers and their summary statistics (minimum, 25th percentile, median, 75th percentile, and maximum values) for each numerical feature. If no specific features are chosen, the test applies to all numerical features in the dataset. The default outlier threshold is set to 1.5 but can be customized by the user. -###### Signs of High Risk +### Signs of High Risk - A large number of outliers in multiple features. - Outliers significantly distanced from the mean value of variables. - Extremely high or low outlier values indicative of data entry errors or other data quality issues. -###### Strengths +### Strengths -- Provides a comprehensive summary of outliers for each numerical feature, helping pinpoint features with potential -quality issues. +- Provides a comprehensive summary of outliers for each numerical feature, helping pinpoint features with potential quality issues. - The IQR method is robust to extremely high or low outlier values as it is based on quartile calculations. - Can be customized to work on selected features and set thresholds for outliers. -###### Limitations +### Limitations -- Might cause false positives if the variable deviates from a normal or near-normal distribution, especially for -skewed distributions. -- Does not provide interpretation or recommendations for addressing outliers, relying on further analysis by users -or data scientists. +- Might cause false positives if the variable deviates from a normal or near-normal distribution, especially for skewed distributions. +- Does not provide interpretation or recommendations for addressing outliers, relying on further analysis by users or data scientists. - Only applicable to numerical features, not categorical data. -- Default thresholds may not be optimal for data with heavy pre-processing, manipulation, or inherently high -kurtosis (heavy tails). - - - - - \ No newline at end of file +- Default thresholds may not be optimal for data with heavy pre-processing, manipulation, or inherently high kurtosis (heavy tails). diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index cd431b881..ed6403100 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### IsolationForestOutliers +## IsolationForestOutliers[()]{.muted} ```python def IsolationForestOutliers( @@ -21,45 +16,32 @@ def IsolationForestOutliers( Detects outliers in a dataset using the Isolation Forest algorithm and visualizes results through scatter plots. -###### Purpose +### Purpose -The IsolationForestOutliers test is designed to identify anomalies or outliers in the model's dataset using the -isolation forest algorithm. This algorithm assumes that anomalous data points can be isolated more quickly due to -their distinctive properties. By creating isolation trees and identifying instances with shorter average path -lengths, the test is able to pick out data points that differ from the majority. +The IsolationForestOutliers test is designed to identify anomalies or outliers in the model's dataset using the isolation forest algorithm. This algorithm assumes that anomalous data points can be isolated more quickly due to their distinctive properties. By creating isolation trees and identifying instances with shorter average path lengths, the test is able to pick out data points that differ from the majority. -###### Test Mechanism +### Test Mechanism -The test uses the isolation forest algorithm, which builds an ensemble of isolation trees by randomly selecting -features and splitting the data based on random thresholds. It isolates anomalies rather than focusing on normal -data points. For each pair of variables, a scatter plot is generated which distinguishes the identified outliers -from the inliers. The results of the test can be visualized using these scatter plots, illustrating the distinction -between outliers and inliers. +The test uses the isolation forest algorithm, which builds an ensemble of isolation trees by randomly selecting features and splitting the data based on random thresholds. It isolates anomalies rather than focusing on normal data points. For each pair of variables, a scatter plot is generated which distinguishes the identified outliers from the inliers. The results of the test can be visualized using these scatter plots, illustrating the distinction between outliers and inliers. -###### Signs of High Risk +### Signs of High Risk - The presence of high contamination, indicating a large number of anomalies - Inability to detect clusters of anomalies that are close in the feature space - Misclassifying normal instances as anomalies - Failure to detect actual anomalies -###### Strengths +### Strengths - Ability to handle large, high-dimensional datasets - Efficiency in isolating anomalies instead of normal instances - Insensitivity to the underlying distribution of data -- Ability to recognize anomalies even when they are not separated from the main data cloud through identifying -distinctive properties +- Ability to recognize anomalies even when they are not separated from the main data cloud through identifying distinctive properties - Visually presents the test results for better understanding and interpretability -###### Limitations +### Limitations - Difficult to detect anomalies that are close to each other or prevalent in datasets - Dependency on the contamination parameter which may need fine-tuning to be effective - Potential failure in detecting collective anomalies if they behave similarly to normal data - Potential lack of precision in identifying which features contribute most to the anomalous behavior - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index 94b5a1952..badb0c52e 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### JarqueBera +## JarqueBera[()]{.muted} ```python def JarqueBera( @@ -18,43 +13,27 @@ def JarqueBera( Assesses normality of dataset features in an ML model using the Jarque-Bera test. -###### Purpose +### Purpose -The purpose of the Jarque-Bera test as implemented in this metric is to determine if the features in the dataset of -a given Machine Learning model follow a normal distribution. This is crucial for understanding the distribution and -behavior of the model's features, as numerous statistical methods assume normal distribution of the data. +The purpose of the Jarque-Bera test as implemented in this metric is to determine if the features in the dataset of a given Machine Learning model follow a normal distribution. This is crucial for understanding the distribution and behavior of the model's features, as numerous statistical methods assume normal distribution of the data. -###### Test Mechanism +### Test Mechanism -The test mechanism involves computing the Jarque-Bera statistic, p-value, skew, and kurtosis for each feature in -the dataset. It utilizes the 'jarque_bera' function from the 'statsmodels' library in Python, storing the results -in a dictionary. The test evaluates the skewness and kurtosis to ascertain whether the dataset follows a normal -distribution. A significant p-value (typically less than 0.05) implies that the data does not possess normal -distribution. +The test mechanism involves computing the Jarque-Bera statistic, p-value, skew, and kurtosis for each feature in the dataset. It utilizes the 'jarque_bera' function from the 'statsmodels' library in Python, storing the results in a dictionary. The test evaluates the skewness and kurtosis to ascertain whether the dataset follows a normal distribution. A significant p-value (typically less than 0.05) implies that the data does not possess normal distribution. -###### Signs of High Risk +### Signs of High Risk - A high Jarque-Bera statistic and a low p-value (usually less than 0.05) indicate high-risk conditions. -- Such results suggest the data significantly deviates from a normal distribution. If a machine learning model -expects feature data to be normally distributed, these findings imply that it may not function as intended. +- Such results suggest the data significantly deviates from a normal distribution. If a machine learning model expects feature data to be normally distributed, these findings imply that it may not function as intended. -###### Strengths +### Strengths -- Provides insights into the shape of the data distribution, helping determine whether a given set of data follows -a normal distribution. +- Provides insights into the shape of the data distribution, helping determine whether a given set of data follows a normal distribution. - Particularly useful for risk assessment for models that assume a normal distribution of data. -- By measuring skewness and kurtosis, it provides additional insights into the nature and magnitude of a -distribution's deviation. +- By measuring skewness and kurtosis, it provides additional insights into the nature and magnitude of a distribution's deviation. -###### Limitations +### Limitations - Only checks for normality in the data distribution. It cannot provide insights into other types of distributions. -- Datasets that aren't normally distributed but follow some other distribution might lead to inaccurate risk -assessments. -- Highly sensitive to large sample sizes, often rejecting the null hypothesis (that data is normally distributed) -even for minor deviations in larger datasets. - - - - - \ No newline at end of file +- Datasets that aren't normally distributed but follow some other distribution might lead to inaccurate risk assessments. +- Highly sensitive to large sample sizes, often rejecting the null hypothesis (that data is normally distributed) even for minor deviations in larger datasets. diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 55ac52b28..613d7d7e2 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### KPSS +## KPSS[()]{.muted} ```python def KPSS( @@ -18,42 +13,26 @@ def KPSS( Assesses the stationarity of time-series data in a machine learning model using the KPSS unit root test. -###### Purpose +### Purpose -The KPSS (Kwiatkowski-Phillips-Schmidt-Shin) unit root test is utilized to ensure the stationarity of data within a -machine learning model. It specifically works on time-series data to establish the order of integration, which is -essential for accurate forecasting. A fundamental requirement for any time series model is that the series should -be stationary. +The KPSS (Kwiatkowski-Phillips-Schmidt-Shin) unit root test is utilized to ensure the stationarity of data within a machine learning model. It specifically works on time-series data to establish the order of integration, which is essential for accurate forecasting. A fundamental requirement for any time series model is that the series should be stationary. -###### Test Mechanism +### Test Mechanism -This test calculates the KPSS score for each feature in the dataset. The KPSS score includes a statistic, a -p-value, a used lag, and critical values. The core principle behind the KPSS test is to evaluate the hypothesis -that an observable time series is stationary around a deterministic trend. If the computed statistic exceeds the -critical value, the null hypothesis (that the series is stationary) is rejected, indicating that the series is -non-stationary. +This test calculates the KPSS score for each feature in the dataset. The KPSS score includes a statistic, a p-value, a used lag, and critical values. The core principle behind the KPSS test is to evaluate the hypothesis that an observable time series is stationary around a deterministic trend. If the computed statistic exceeds the critical value, the null hypothesis (that the series is stationary) is rejected, indicating that the series is non-stationary. -###### Signs of High Risk +### Signs of High Risk - High KPSS score, particularly if the calculated statistic is higher than the critical value. -- Rejection of the null hypothesis, indicating that the series is recognized as non-stationary, can severely affect -the model's forecasting capability. +- Rejection of the null hypothesis, indicating that the series is recognized as non-stationary, can severely affect the model's forecasting capability. -###### Strengths +### Strengths - Directly measures the stationarity of a series, fulfilling a key prerequisite for many time-series models. -- The underlying logic of the test is intuitive and simple, making it easy to understand and accessible for both -developers and risk management teams. +- The underlying logic of the test is intuitive and simple, making it easy to understand and accessible for both developers and risk management teams. -###### Limitations +### Limitations -- Assumes the absence of a unit root in the series and doesn't differentiate between series that are stationary and -those border-lining stationarity. +- Assumes the absence of a unit root in the series and doesn't differentiate between series that are stationary and those border-lining stationarity. - The test may have restricted power against certain alternatives. -- The reliability of the test is contingent on the number of lags selected, which introduces potential bias in the -measurement. - - - - - \ No newline at end of file +- The reliability of the test is contingent on the number of lags selected, which introduces potential bias in the measurement. diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 5af885ed8..7c22880b7 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### LJungBox +## LJungBox[()]{.muted} ```python def LJungBox( @@ -18,41 +13,28 @@ def LJungBox( Assesses autocorrelations in dataset features by performing a Ljung-Box test on each feature. -###### Purpose +### Purpose -The Ljung-Box test is a type of statistical test utilized to ascertain whether there are autocorrelations within a -given dataset that differ significantly from zero. In the context of a machine learning model, this test is -primarily used to evaluate data utilized in regression tasks, especially those involving time series and -forecasting. +The Ljung-Box test is a type of statistical test utilized to ascertain whether there are autocorrelations within a given dataset that differ significantly from zero. In the context of a machine learning model, this test is primarily used to evaluate data utilized in regression tasks, especially those involving time series and forecasting. -###### Test Mechanism +### Test Mechanism -The test operates by iterating over each feature within the dataset and applying the `acorr_ljungbox` -function from the `statsmodels.stats.diagnostic` library. This function calculates the Ljung-Box statistic and -p-value for each feature. These results are then stored in a pandas DataFrame where the columns are the feature names, -statistic, and p-value respectively. Generally, a lower p-value indicates a higher likelihood of significant -autocorrelations within the feature. +The test operates by iterating over each feature within the dataset and applying the `acorr_ljungbox` function from the `statsmodels.stats.diagnostic` library. This function calculates the Ljung-Box statistic and p-value for each feature. These results are then stored in a pandas DataFrame where the columns are the feature names, statistic, and p-value respectively. Generally, a lower p-value indicates a higher likelihood of significant autocorrelations within the feature. -###### Signs of High Risk +### Signs of High Risk - High Ljung-Box statistic values or low p-values. - Presence of significant autocorrelations in the respective features. - Potential for negative impact on model performance or bias if autocorrelations are not properly handled. -###### Strengths +### Strengths - Powerful tool for detecting autocorrelations within datasets, especially in time series data. - Provides quantitative measures (statistic and p-value) for precise evaluation. - Helps avoid issues related to autoregressive residuals and other challenges in regression models. -###### Limitations +### Limitations - Cannot detect all types of non-linearity or complex interrelationships among variables. - Testing individual features may not fully encapsulate the dynamics of the data if features interact with each other. -- Designed more for traditional statistical models and may not be fully compatible with certain types of complex - machine learning models. - - - - - \ No newline at end of file +- Designed more for traditional statistical models and may not be fully compatible with certain types of complex machine learning models. diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index dbf4060c0..436db31fa 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### LaggedCorrelationHeatmap +## LaggedCorrelationHeatmap[()]{.muted} ```python def LaggedCorrelationHeatmap( @@ -17,48 +12,31 @@ def LaggedCorrelationHeatmap( num_lags: int = 10): ``` -Assesses and visualizes correlation between target variable and lagged independent variables in a time-series -dataset. +Assesses and visualizes correlation between target variable and lagged independent variables in a time-series dataset. -###### Purpose +### Purpose -The LaggedCorrelationHeatmap metric is utilized to appraise and illustrate the correlation between the target -variable and delayed copies (lags) of independent variables in a time-series dataset. It assists in revealing -relationships in time-series data where the influence of an independent variable on the dependent variable is not -immediate but occurs after a period (lags). +The LaggedCorrelationHeatmap metric is utilized to appraise and illustrate the correlation between the target variable and delayed copies (lags) of independent variables in a time-series dataset. It assists in revealing relationships in time-series data where the influence of an independent variable on the dependent variable is not immediate but occurs after a period (lags). -###### Test Mechanism +### Test Mechanism -To execute this test, Python's Pandas library pairs with Plotly to perform computations and present the -visualization in the form of a heatmap. The test begins by extracting the target variable and corresponding -independent variables from the dataset. Then, generation of lags of independent variables takes place, followed by -the calculation of correlation between these lagged variables and the target variable. The outcome is a correlation -matrix that gets recorded and illustrated as a heatmap, where different color intensities represent the strength of -the correlation, making patterns easier to identify. +To execute this test, Python's Pandas library pairs with Plotly to perform computations and present the visualization in the form of a heatmap. The test begins by extracting the target variable and corresponding independent variables from the dataset. Then, generation of lags of independent variables takes place, followed by the calculation of correlation between these lagged variables and the target variable. The outcome is a correlation matrix that gets recorded and illustrated as a heatmap, where different color intensities represent the strength of the correlation, making patterns easier to identify. -###### Signs of High Risk +### Signs of High Risk - Insignificant correlations across the heatmap, indicating a lack of noteworthy relationships between variables. -- Correlations that break intuition or previous understanding, suggesting potential issues with the dataset or the -model. +- Correlations that break intuition or previous understanding, suggesting potential issues with the dataset or the model. -###### Strengths +### Strengths -- This metric serves as an exceptional tool for exploring and visualizing time-dependent relationships between -features and the target variable in a time-series dataset. +- This metric serves as an exceptional tool for exploring and visualizing time-dependent relationships between features and the target variable in a time-series dataset. - It aids in identifying delayed effects that might go unnoticed with other correlation measures. - The heatmap offers an intuitive visual representation of time-dependent correlations and influences. -###### Limitations +### Limitations - The metric presumes linear relationships between variables, potentially ignoring non-linear relationships. - The correlation considered is linear; therefore, intricate non-linear interactions might be overlooked. - The metric is only applicable for time-series data, limiting its utility outside of this context. -- The number of lags chosen can significantly influence the results; too many lags can render the heatmap difficult -to interpret, while too few might overlook delayed effects. +- The number of lags chosen can significantly influence the results; too many lags can render the heatmap difficult to interpret, while too few might overlook delayed effects. - This metric does not take into account any causal relationships, but merely demonstrates correlation. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index b2c5ab2dc..1b60b9db1 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### MissingValues +## MissingValues[()]{.muted} ```python def MissingValues( @@ -19,41 +14,26 @@ def MissingValues( Evaluates dataset quality by ensuring missing value ratio across all features does not exceed a set threshold. -###### Purpose +### Purpose -The Missing Values test is designed to evaluate the quality of a dataset by measuring the number of missing values -across all features. The objective is to ensure that the ratio of missing data to total data is less than a -predefined threshold, defaulting to 1, in order to maintain the data quality necessary for reliable predictive -strength in a machine learning model. +The Missing Values test is designed to evaluate the quality of a dataset by measuring the number of missing values across all features. The objective is to ensure that the ratio of missing data to total data is less than a predefined threshold, defaulting to 1, in order to maintain the data quality necessary for reliable predictive strength in a machine learning model. -###### Test Mechanism +### Test Mechanism -The mechanism for this test involves iterating through each column of the dataset, counting missing values -(represented as NaNs), and calculating the percentage they represent against the total number of rows. The test -then checks if these missing value counts are less than the predefined `min_threshold`. The results are shown in a -table summarizing each column, the number of missing values, the percentage of missing values in each column, and a -Pass/Fail status based on the threshold comparison. +The mechanism for this test involves iterating through each column of the dataset, counting missing values (represented as NaNs), and calculating the percentage they represent against the total number of rows. The test then checks if these missing value counts are less than the predefined `min_threshold`. The results are shown in a table summarizing each column, the number of missing values, the percentage of missing values in each column, and a Pass/Fail status based on the threshold comparison. -###### Signs of High Risk +### Signs of High Risk - When the number of missing values in any column exceeds the `min_threshold` value. - Presence of missing values across many columns, leading to multiple instances of failing the threshold. -###### Strengths +### Strengths - Quick and granular identification of missing data across each feature in the dataset. -- Provides an effective and straightforward means of maintaining data quality, essential for constructing efficient -machine learning models. +- Provides an effective and straightforward means of maintaining data quality, essential for constructing efficient machine learning models. -###### Limitations +### Limitations - Does not suggest the root causes of the missing values or recommend ways to impute or handle them. -- May overlook features with significant missing data but still less than the `min_threshold`, potentially -impacting the model. -- Does not account for data encoded as values like "-999" or "None," which might not technically classify as -missing but could bear similar implications. - - - - - \ No newline at end of file +- May overlook features with significant missing data but still less than the `min_threshold`, potentially impacting the model. +- Does not account for data encoded as values like "-999" or "None," which might not technically classify as missing but could bear similar implications. diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index ce4299fba..293d65a1b 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### MissingValuesBarPlot +## MissingValuesBarPlot[()]{.muted} ```python def MissingValuesBarPlot( @@ -18,50 +13,30 @@ def MissingValuesBarPlot( fig_height: int = 600): ``` -Assesses the percentage and distribution of missing values in the dataset via a bar plot, with emphasis on -identifying high-risk columns based on a user-defined threshold. +Assesses the percentage and distribution of missing values in the dataset via a bar plot, with emphasis on identifying high-risk columns based on a user-defined threshold. -###### Purpose +### Purpose -The 'MissingValuesBarPlot' metric provides a color-coded visual representation of the percentage of missing values -for each column in an ML model's dataset. The primary purpose of this metric is to easily identify and quantify -missing data, which are essential steps in data preprocessing. The presence of missing data can potentially skew -the model's predictions and decrease its accuracy. Additionally, this metric uses a pre-set threshold to categorize -various columns into ones that contain missing data above the threshold (high risk) and below the threshold (less -risky). +The 'MissingValuesBarPlot' metric provides a color-coded visual representation of the percentage of missing values for each column in an ML model's dataset. The primary purpose of this metric is to easily identify and quantify missing data, which are essential steps in data preprocessing. The presence of missing data can potentially skew the model's predictions and decrease its accuracy. Additionally, this metric uses a pre-set threshold to categorize various columns into ones that contain missing data above the threshold (high risk) and below the threshold (less risky). -###### Test Mechanism +### Test Mechanism -The test mechanism involves scanning each column in the input dataset and calculating the percentage of missing -values. It then compares each column's missing data percentage with the predefined threshold, categorizing columns -with missing data above the threshold as high-risk. The test generates a bar plot in which columns with missing -data are represented on the y-axis and their corresponding missing data percentages are displayed on the x-axis. -The color of each bar reflects the missing data percentage in relation to the threshold**: grey for values below the -threshold and light coral for those exceeding it. The user-defined threshold is represented by a red dashed line on -the plot. +The test mechanism involves scanning each column in the input dataset and calculating the percentage of missing values. It then compares each column's missing data percentage with the predefined threshold, categorizing columns with missing data above the threshold as high-risk. The test generates a bar plot in which columns with missing data are represented on the y-axis and their corresponding missing data percentages are displayed on the x-axis. The color of each bar reflects the missing data percentage in relation to the threshold: grey for values below the threshold and light coral for those exceeding it. The user-defined threshold is represented by a red dashed line on the plot. -###### Signs of High Risk +### Signs of High Risk -- Columns with higher percentages of missing values beyond the threshold are high-risk. These are visually -represented by light coral bars on the bar plot. +- Columns with higher percentages of missing values beyond the threshold are high-risk. These are visually represented by light coral bars on the bar plot. -###### Strengths +### Strengths - Helps in quickly identifying and quantifying missing data across all columns of the dataset. - Facilitates pattern recognition through visual representation. - Enables customization of the level of risk tolerance via a user-defined threshold. - Supports both classification and regression tasks, sharing its versatility. -###### Limitations +### Limitations -- It only considers the quantity of missing values, not differentiating between different types of missingness -(Missing completely at random - MCAR, Missing at random - MAR, Not Missing at random - NMAR). -- It doesn't offer insights into potential approaches for handling missing entries, such as various imputation -strategies. +- It only considers the quantity of missing values, not differentiating between different types of missingness (Missing completely at random - MCAR, Missing at random - MAR, Not Missing at random - NMAR). +- It doesn't offer insights into potential approaches for handling missing entries, such as various imputation strategies. - The metric does not consider possible impacts of the missing data on the model's accuracy or precision. - Interpretation of the findings and the next steps might require an expert understanding of the field. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index f5297d632..8658f882f 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### MutualInformation +## MutualInformation[()]{.muted} ```python def MutualInformation( @@ -20,21 +15,15 @@ def MutualInformation( Calculates mutual information scores between features and target variable to evaluate feature relevance. -###### Purpose +### Purpose -The Mutual Information test quantifies the predictive power of each feature by measuring its statistical -dependency with the target variable. This helps identify relevant features for model training and -detect potential redundant or irrelevant variables, supporting feature selection decisions and model -interpretability. +The Mutual Information test quantifies the predictive power of each feature by measuring its statistical dependency with the target variable. This helps identify relevant features for model training and detect potential redundant or irrelevant variables, supporting feature selection decisions and model interpretability. -###### Test Mechanism +### Test Mechanism -The test employs sklearn's mutual_info_classif/mutual_info_regression functions to compute mutual -information between each feature and the target. It produces a normalized score (0 to 1) for each -feature, where higher scores indicate stronger relationships. Results are presented in both tabular -format and visualized through a bar plot with a configurable threshold line. +The test employs sklearn's mutual_info_classif/mutual_info_regression functions to compute mutual information between each feature and the target. It produces a normalized score (0 to 1) for each feature, where higher scores indicate stronger relationships. Results are presented in both tabular format and visualized through a bar plot with a configurable threshold line. -###### Signs of High Risk +### Signs of High Risk - Many features showing very low mutual information scores - Key business features exhibiting unexpectedly low scores @@ -45,7 +34,7 @@ format and visualized through a bar plot with a configurable threshold line. - Unexpected zero or near-zero scores for known important features - Inconsistent scores across different data samples -###### Strengths +### Strengths - Captures non-linear relationships between features and target - Scale-invariant measurement of feature relevance @@ -56,7 +45,7 @@ format and visualized through a bar plot with a configurable threshold line. - Handles numerical and categorical features - Computationally efficient for most datasets -###### Limitations +### Limitations - Requires sufficient data for reliable estimates - May be computationally intensive for very large datasets @@ -66,8 +55,3 @@ format and visualized through a bar plot with a configurable threshold line. - May underestimate importance of rare but crucial events - Cannot handle missing values directly - May be affected by extreme class imbalance - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index 76a601991..f0f8cdcb8 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### PearsonCorrelationMatrix +## PearsonCorrelationMatrix[()]{.muted} ```python def PearsonCorrelationMatrix( @@ -18,43 +13,26 @@ def PearsonCorrelationMatrix( Evaluates linear dependency between numerical variables in a dataset via a Pearson Correlation coefficient heat map. -###### Purpose +### Purpose -This test is intended to evaluate the extent of linear dependency between all pairs of numerical variables in the -given dataset. It provides the Pearson Correlation coefficient, which reveals any high correlations present. The -purpose of doing this is to identify potential redundancy, as variables that are highly correlated can often be -removed to reduce the dimensionality of the dataset without significantly impacting the model's performance. +This test is intended to evaluate the extent of linear dependency between all pairs of numerical variables in the given dataset. It provides the Pearson Correlation coefficient, which reveals any high correlations present. The purpose of doing this is to identify potential redundancy, as variables that are highly correlated can often be removed to reduce the dimensionality of the dataset without significantly impacting the model's performance. -###### Test Mechanism +### Test Mechanism -This metric test generates a correlation matrix for all numerical variables in the dataset using the Pearson -correlation formula. A heat map is subsequently created to visualize this matrix effectively. The color of each -point on the heat map corresponds to the magnitude and direction (positive or negative) of the correlation, with a -range from -1 (perfect negative correlation) to 1 (perfect positive correlation). Any correlation coefficients -higher than 0.7 (in absolute terms) are indicated in white in the heat map, suggesting a high degree of correlation. +This metric test generates a correlation matrix for all numerical variables in the dataset using the Pearson correlation formula. A heat map is subsequently created to visualize this matrix effectively. The color of each point on the heat map corresponds to the magnitude and direction (positive or negative) of the correlation, with a range from -1 (perfect negative correlation) to 1 (perfect positive correlation). Any correlation coefficients higher than 0.7 (in absolute terms) are indicated in white in the heat map, suggesting a high degree of correlation. -###### Signs of High Risk +### Signs of High Risk -- A large number of variables in the dataset showing a high degree of correlation (coefficients approaching ±1). -This indicates redundancy within the dataset, suggesting that some variables may not be contributing new -information to the model. +- A large number of variables in the dataset showing a high degree of correlation (coefficients approaching ±1). This indicates redundancy within the dataset, suggesting that some variables may not be contributing new information to the model. - Potential risk of overfitting. -###### Strengths +### Strengths -- Detects and quantifies the linearity of relationships between variables, aiding in identifying redundant -variables to simplify models and potentially improve performance. -- The heatmap visualization provides an easy-to-understand overview of correlations, beneficial for users not -comfortable with numerical matrices. +- Detects and quantifies the linearity of relationships between variables, aiding in identifying redundant variables to simplify models and potentially improve performance. +- The heatmap visualization provides an easy-to-understand overview of correlations, beneficial for users not comfortable with numerical matrices. -###### Limitations +### Limitations -- Limited to detecting linear relationships, potentially missing non-linear relationships which impede -opportunities for dimensionality reduction. +- Limited to detecting linear relationships, potentially missing non-linear relationships which impede opportunities for dimensionality reduction. - Measures only the degree of linear relationship, not the strength of one variable's effect on another. - The 0.7 correlation threshold is arbitrary and might exclude valid dependencies with lower coefficients. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 95ea34a5e..d8eb6ad2e 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### PhillipsPerronArch +## PhillipsPerronArch[()]{.muted} ```python def PhillipsPerronArch( @@ -18,44 +13,32 @@ def PhillipsPerronArch( Assesses the stationarity of time series data in each feature of the ML model using the Phillips-Perron test. -###### Purpose +### Purpose -The Phillips-Perron (PP) test is used to determine the stationarity of time series data for each feature in a -dataset, which is crucial for forecasting tasks. It tests the null hypothesis that a time series is unit-root -non-stationary. This is vital for understanding the stochastic behavior of the data and ensuring the robustness and -validity of predictions generated by regression analysis models. +The Phillips-Perron (PP) test is used to determine the stationarity of time series data for each feature in a dataset, which is crucial for forecasting tasks. It tests the null hypothesis that a time series is unit-root non-stationary. This is vital for understanding the stochastic behavior of the data and ensuring the robustness and validity of predictions generated by regression analysis models. -###### Test Mechanism +### Test Mechanism The PP test is conducted for each feature in the dataset as follows: - A data frame is created from the dataset. -- For each column, the Phillips-Perron method calculates the test statistic, p-value, lags used, and number of -observations. -- The results are then stored for each feature, providing a metric that indicates the stationarity of the time -series data. +- For each column, the Phillips-Perron method calculates the test statistic, p-value, lags used, and number of observations. +- The results are then stored for each feature, providing a metric that indicates the stationarity of the time series data. -###### Signs of High Risk +### Signs of High Risk - A high p-value, indicating that the series has a unit root and is non-stationary. - Test statistic values exceeding critical values, suggesting non-stationarity. - High 'usedlag' value, pointing towards autocorrelation issues that may degrade model performance. -###### Strengths +### Strengths - Resilience against heteroskedasticity in the error term. - Effective for long time series data. -- Helps in determining whether the time series is stationary, aiding in the selection of suitable forecasting -models. +- Helps in determining whether the time series is stationary, aiding in the selection of suitable forecasting models. -###### Limitations +### Limitations - Applicable only within a univariate time series framework. - Relies on asymptotic theory, which may reduce the test’s power for small sample sizes. -- Non-stationary time series must be converted to stationary series through differencing, potentially leading to -loss of important data points. - - - - - \ No newline at end of file +- Non-stationary time series must be converted to stationary series through differencing, potentially leading to loss of important data points. diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index ad5ced91f..6e7fea125 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ProtectedClassesCombination +## ProtectedClassesCombination[()]{.muted} ```python def ProtectedClassesCombination( @@ -20,38 +15,32 @@ def ProtectedClassesCombination( Visualizes combinations of protected classes and their corresponding error metric differences. -###### Purpose +### Purpose -This test aims to provide insights into how different combinations of protected classes affect various error metrics, -particularly the false negative rate (FNR) and false positive rate (FPR). By visualizing these combinations, -it helps identify potential biases or disparities in model performance across different intersectional groups. +This test aims to provide insights into how different combinations of protected classes affect various error metrics, particularly the false negative rate (FNR) and false positive rate (FPR). By visualizing these combinations, it helps identify potential biases or disparities in model performance across different intersectional groups. -###### Test Mechanism +### Test Mechanism The test performs the following steps: + 1. Combines the specified protected class columns to create a single multi-class category. -2. Calculates error metrics (FNR, FPR, etc.) for each combination of protected classes. -3. Generates visualizations showing the distribution of these metrics across all class combinations. +1. Calculates error metrics (FNR, FPR, etc.) for each combination of protected classes. +1. Generates visualizations showing the distribution of these metrics across all class combinations. -###### Signs of High Risk +### Signs of High Risk - Large disparities in FNR or FPR across different protected class combinations. - Consistent patterns of higher error rates for specific combinations of protected attributes. - Unexpected or unexplainable variations in error metrics between similar group combinations. -###### Strengths +### Strengths - Provides a comprehensive view of intersectional fairness across multiple protected attributes. - Allows for easy identification of potentially problematic combinations of protected classes. - Visualizations make it easier to spot patterns or outliers in model performance across groups. -###### Limitations +### Limitations - May become complex and difficult to interpret with a large number of protected classes or combinations. - Does not provide statistical significance of observed differences. - Visualization alone may not capture all nuances of intersectional fairness. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index 3a1e2e417..f71a1b44d 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ProtectedClassesDescription +## ProtectedClassesDescription[()]{.muted} ```python def ProtectedClassesDescription( @@ -17,20 +12,15 @@ def ProtectedClassesDescription( protected_classes = None): ``` -Visualizes the distribution of protected classes in the dataset relative to the target variable -and provides descriptive statistics. +Visualizes the distribution of protected classes in the dataset relative to the target variable and provides descriptive statistics. -###### Purpose +### Purpose -The ProtectedClassesDescription test aims to identify potential biases or significant differences in the -distribution of target outcomes across different protected classes. This visualization and statistical summary -help in understanding the relationship between protected attributes and the target variable, which is crucial -for assessing fairness in machine learning models. +The ProtectedClassesDescription test aims to identify potential biases or significant differences in the distribution of target outcomes across different protected classes. This visualization and statistical summary help in understanding the relationship between protected attributes and the target variable, which is crucial for assessing fairness in machine learning models. -###### Test Mechanism +### Test Mechanism -The function creates interactive stacked bar charts for each specified protected class using Plotly. -Additionally, it generates a single table of descriptive statistics for all protected classes, including: +The function creates interactive stacked bar charts for each specified protected class using Plotly. Additionally, it generates a single table of descriptive statistics for all protected classes, including: - Protected class and category - Count and percentage of each category within the protected class @@ -38,14 +28,14 @@ Additionally, it generates a single table of descriptive statistics for all prot - Standard deviation of the target variable for each category - Minimum and maximum values of the target variable for each category -###### Signs of High Risk +### Signs of High Risk - Significant imbalances in the distribution of target outcomes across different categories of a protected class. - Large disparities in mean, median, or mode of the target variable across categories. - Underrepresentation or overrepresentation of certain groups within protected classes. - High standard deviations in certain categories, indicating potential volatility or outliers. -###### Strengths +### Strengths - Provides both visual and statistical representation of potential biases in the dataset. - Allows for easy identification of imbalances in target variable distribution across protected classes. @@ -53,14 +43,9 @@ Additionally, it generates a single table of descriptive statistics for all prot - Consolidated statistical summary provides quantitative measures to complement visual analysis. - Applicable to both classification and regression tasks. -###### Limitations +### Limitations - Does not provide advanced statistical measures of bias or fairness. - May become cluttered if there are many categories within a protected class or many unique target values. - Interpretation may require domain expertise to understand the implications of observed disparities. - Does not account for intersectionality or complex interactions between multiple protected attributes. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index a3fd18274..7373a4733 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ProtectedClassesDisparity +## ProtectedClassesDisparity[()]{.muted} ```python def ProtectedClassesDisparity( @@ -22,41 +17,34 @@ def ProtectedClassesDisparity( Investigates disparities in model performance across different protected class segments. -###### Purpose +### Purpose -This test aims to identify and quantify potential biases in model outcomes by comparing various performance metrics -across different segments of protected classes. It helps in assessing whether the model produces discriminatory -outcomes for certain groups, which is crucial for ensuring fairness in machine learning models. +This test aims to identify and quantify potential biases in model outcomes by comparing various performance metrics across different segments of protected classes. It helps in assessing whether the model produces discriminatory outcomes for certain groups, which is crucial for ensuring fairness in machine learning models. -###### Test Mechanism +### Test Mechanism The test performs the following steps: -1. Calculates performance metrics (e.g., false negative rate, false positive rate, true positive rate) for each segment - of the specified protected classes. -2. Computes disparity ratios by comparing these metrics between different segments and a reference group. -3. Generates visualizations showing the disparities and their relation to a user-defined disparity tolerance threshold. -4. Produces a comprehensive table with various disparity metrics for detailed analysis. -###### Signs of High Risk +1. Calculates performance metrics (e.g., false negative rate, false positive rate, true positive rate) for each segment of the specified protected classes. +1. Computes disparity ratios by comparing these metrics between different segments and a reference group. +1. Generates visualizations showing the disparities and their relation to a user-defined disparity tolerance threshold. +1. Produces a comprehensive table with various disparity metrics for detailed analysis. + +### Signs of High Risk - Disparity ratios exceeding the specified disparity tolerance threshold. - Consistent patterns of higher error rates or lower performance for specific protected class segments. - Statistically significant differences in performance metrics across segments. -###### Strengths +### Strengths - Provides a comprehensive view of model fairness across multiple protected attributes and metrics. - Allows for easy identification of problematic disparities through visual and tabular representations. - Customizable disparity tolerance threshold to align with specific use-case requirements. - Applicable to various performance metrics, offering a multi-faceted analysis of model fairness. -###### Limitations +### Limitations - Relies on a predefined reference group for each protected class, which may not always be the most appropriate choice. - Does not account for intersectionality between different protected attributes. - The interpretation of results may require domain expertise to understand the implications of observed disparities. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index a993b60aa..b68f094b1 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### calculate_fairness_metrics +## calculate_fairness_metrics[()]{.muted} ```python def calculate_fairness_metrics( @@ -19,8 +14,7 @@ def calculate_fairness_metrics( protected_classes): ``` - -#### calculate_group_metrics +## calculate_group_metrics[()]{.muted} ```python def calculate_group_metrics( @@ -30,16 +24,14 @@ def calculate_group_metrics( protected_classes): ``` - -#### get_thresholds_by_group +## get_thresholds_by_group[()]{.muted} ```python def get_thresholds_by_group( threshold_optimizer): ``` - -#### initialize_and_fit_optimizer +## initialize_and_fit_optimizer[()]{.muted} ```python def initialize_and_fit_optimizer( @@ -49,8 +41,7 @@ def initialize_and_fit_optimizer( protected_classes_df): ``` - -#### make_predictions +## make_predictions[()]{.muted} ```python def make_predictions( @@ -59,16 +50,14 @@ def make_predictions( protected_classes): ``` - -#### plot_thresholds +## plot_thresholds[()]{.muted} ```python def plot_thresholds( threshold_optimizer): ``` - -#### ProtectedClassesThresholdOptimizer +## ProtectedClassesThresholdOptimizer[()]{.muted} ```python def ProtectedClassesThresholdOptimizer( @@ -81,40 +70,33 @@ def ProtectedClassesThresholdOptimizer( Obtains a classifier by applying group-specific thresholds to the provided estimator. -###### Purpose +### Purpose -This test aims to optimize the fairness of a machine learning model by applying different -classification thresholds for different protected groups. It helps in mitigating bias and -achieving more equitable outcomes across different demographic groups. +This test aims to optimize the fairness of a machine learning model by applying different classification thresholds for different protected groups. It helps in mitigating bias and achieving more equitable outcomes across different demographic groups. -###### Test Mechanism +### Test Mechanism The test uses Fairlearn's ThresholdOptimizer to: + 1. Fit an optimizer on the training data, considering protected classes. -2. Apply optimized thresholds to make predictions on the test data. -3. Calculate and report various fairness metrics. -4. Visualize the optimized thresholds. +1. Apply optimized thresholds to make predictions on the test data. +1. Calculate and report various fairness metrics. +1. Visualize the optimized thresholds. -###### Signs of High Risk +### Signs of High Risk -- Large disparities in fairness metrics (e.g., Demographic Parity Ratio, Equalized Odds Ratio) - across different protected groups. +- Large disparities in fairness metrics (e.g., Demographic Parity Ratio, Equalized Odds Ratio) across different protected groups. - Significant differences in False Positive Rates (FPR) or True Positive Rates (TPR) between groups. - Thresholds that vary widely across different protected groups. -###### Strengths +### Strengths - Provides a post-processing method to improve model fairness without modifying the original model. - Allows for balancing multiple fairness criteria simultaneously. - Offers visual insights into the threshold optimization process. -###### Limitations +### Limitations - May lead to a decrease in overall model performance while improving fairness. - Requires access to protected attribute information at prediction time. - The effectiveness can vary depending on the chosen fairness constraint and objective. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index c944dd6ac..19c4e12a9 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### plot_rolling_statistics +## plot_rolling_statistics[()]{.muted} ```python def plot_rolling_statistics( @@ -18,8 +13,7 @@ def plot_rolling_statistics( window_size): ``` - -#### RollingStatsPlot +## RollingStatsPlot[()]{.muted} ```python def RollingStatsPlot( @@ -27,55 +21,31 @@ def RollingStatsPlot( window_size: int = 12): ``` -Evaluates the stationarity of time series data by plotting its rolling mean and standard deviation over a specified -window. +Evaluates the stationarity of time series data by plotting its rolling mean and standard deviation over a specified window. -###### Purpose +### Purpose -The `RollingStatsPlot` metric is employed to gauge the stationarity of time series data in a given dataset. This -metric specifically evaluates the rolling mean and rolling standard deviation of the dataset over a pre-specified -window size. The rolling mean provides an understanding of the average trend in the data, while the rolling -standard deviation gauges the volatility of the data within the window. It is critical in preparing time series -data for modeling as it reveals key insights into data behavior across time. +The `RollingStatsPlot` metric is employed to gauge the stationarity of time series data in a given dataset. This metric specifically evaluates the rolling mean and rolling standard deviation of the dataset over a pre-specified window size. The rolling mean provides an understanding of the average trend in the data, while the rolling standard deviation gauges the volatility of the data within the window. It is critical in preparing time series data for modeling as it reveals key insights into data behavior across time. -###### Test Mechanism +### Test Mechanism -This mechanism is comprised of two steps. Initially, the rolling mean and standard deviation for each of the -dataset's columns are calculated over a window size, which can be user-specified or by default set to 12 data -points. Then, the calculated rolling mean and standard deviation are visualized via separate plots, illustrating -the trends and volatility in the dataset. A straightforward check is conducted to ensure the existence of columns -in the dataset, and to verify that the given dataset has been indexed by its date and time—a necessary prerequisite -for time series analysis. +This mechanism is comprised of two steps. Initially, the rolling mean and standard deviation for each of the dataset's columns are calculated over a window size, which can be user-specified or by default set to 12 data points. Then, the calculated rolling mean and standard deviation are visualized via separate plots, illustrating the trends and volatility in the dataset. A straightforward check is conducted to ensure the existence of columns in the dataset, and to verify that the given dataset has been indexed by its date and time—a necessary prerequisite for time series analysis. -###### Signs of High Risk +### Signs of High Risk -- The presence of non-stationary patterns in either the rolling mean or the rolling standard deviation plots, which -could indicate trends or seasonality in the data that may affect the performance of time series models. +- The presence of non-stationary patterns in either the rolling mean or the rolling standard deviation plots, which could indicate trends or seasonality in the data that may affect the performance of time series models. - Missing columns in the dataset, which would prevent the execution of this metric correctly. -- The detection of NaN values in the dataset, which may need to be addressed before the metric can proceed -successfully. +- The detection of NaN values in the dataset, which may need to be addressed before the metric can proceed successfully. -###### Strengths +### Strengths -- Offers visualizations of trending behavior and volatility within the data, facilitating a broader understanding -of the dataset's inherent characteristics. -- Checks of the dataset's integrity, such as the existence of all required columns and the availability of a -datetime index. -- Adjusts to accommodate various window sizes, thus allowing accurate analysis of data with differing temporal -granularities. +- Offers visualizations of trending behavior and volatility within the data, facilitating a broader understanding of the dataset's inherent characteristics. +- Checks of the dataset's integrity, such as the existence of all required columns and the availability of a datetime index. +- Adjusts to accommodate various window sizes, thus allowing accurate analysis of data with differing temporal granularities. - Considers each column of the data individually, thereby accommodating multi-feature datasets. -###### Limitations - -- For all columns, a fixed-size window is utilized. This may not accurately capture patterns in datasets where -different features may require different optimal window sizes. -- Requires the dataset to be indexed by date and time, hence it may not be usable for datasets without a timestamp -index. -- Primarily serves for data visualization as it does not facilitate any quantitative measures for stationarity, -such as through statistical tests. Therefore, the interpretation is subjective and depends heavily on modeler -discretion. - - - +### Limitations - \ No newline at end of file +- For all columns, a fixed-size window is utilized. This may not accurately capture patterns in datasets where different features may require different optimal window sizes. +- Requires the dataset to be indexed by date and time, hence it may not be usable for datasets without a timestamp index. +- Primarily serves for data visualization as it does not facilitate any quantitative measures for stationarity, such as through statistical tests. Therefore, the interpretation is subjective and depends heavily on modeler discretion. diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index b792be1e5..142eaacf0 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### RunsTest +## RunsTest[()]{.muted} ```python def RunsTest( @@ -18,47 +13,29 @@ def RunsTest( Executes Runs Test on ML model to detect non-random patterns in output data sequence. -###### Purpose +### Purpose -The Runs Test is a statistical procedure used to determine whether the sequence of data extracted from the ML model -behaves randomly or not. Specifically, it analyzes runs, sequences of consecutive positives or negatives, in the -data to check if there are more or fewer runs than expected under the assumption of randomness. This can be an -indication of some pattern, trend, or cycle in the model's output which may need attention. +The Runs Test is a statistical procedure used to determine whether the sequence of data extracted from the ML model behaves randomly or not. Specifically, it analyzes runs, sequences of consecutive positives or negatives, in the data to check if there are more or fewer runs than expected under the assumption of randomness. This can be an indication of some pattern, trend, or cycle in the model's output which may need attention. -###### Test Mechanism +### Test Mechanism -The testing mechanism applies the Runs Test from the statsmodels module on each column of the training dataset. For -every feature in the dataset, a Runs Test is executed, whose output includes a Runs Statistic and P-value. A low -P-value suggests that data arrangement in the feature is not likely to be random. The results are stored in a -dictionary where the keys are the feature names, and the values are another dictionary storing the test statistic -and the P-value for each feature. +The testing mechanism applies the Runs Test from the statsmodels module on each column of the training dataset. For every feature in the dataset, a Runs Test is executed, whose output includes a Runs Statistic and P-value. A low P-value suggests that data arrangement in the feature is not likely to be random. The results are stored in a dictionary where the keys are the feature names, and the values are another dictionary storing the test statistic and the P-value for each feature. -###### Signs of High Risk +### Signs of High Risk - High risk is indicated when the P-value is close to zero. -- If the P-value is less than a predefined significance level (like 0.05), it suggests that the runs (series of -positive or negative values) in the model's output are not random and are longer or shorter than what is expected -under a random scenario. -- This would mean there's a high risk of non-random distribution of errors or model outcomes, suggesting potential -issues with the model. +- If the P-value is less than a predefined significance level (like 0.05), it suggests that the runs (series of positive or negative values) in the model's output are not random and are longer or shorter than what is expected under a random scenario. +- This would mean there's a high risk of non-random distribution of errors or model outcomes, suggesting potential issues with the model. -###### Strengths +### Strengths - Straightforward and fast for detecting non-random patterns in data sequence. -- Validates assumptions of randomness, which is valuable for checking error distributions in regression models, -trendless time series data, and ensuring a classifier doesn't favor one class over another. +- Validates assumptions of randomness, which is valuable for checking error distributions in regression models, trendless time series data, and ensuring a classifier doesn't favor one class over another. - Can be applied to both classification and regression tasks, making it versatile. -###### Limitations +### Limitations -- Assumes that the data is independently and identically distributed (i.i.d.), which might not be the case for many -real-world datasets. -- The conclusion drawn from the low P-value indicating non-randomness does not provide information about the type -or the source of the detected pattern. +- Assumes that the data is independently and identically distributed (i.i.d.), which might not be the case for many real-world datasets. +- The conclusion drawn from the low P-value indicating non-randomness does not provide information about the type or the source of the detected pattern. - Sensitive to extreme values (outliers), and overly large or small run sequences can influence the results. - Does not provide model performance evaluation; it is used to detect patterns in the sequence of outputs only. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index b4dca995a..f34b31d90 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ScatterPlot +## ScatterPlot[()]{.muted} ```python def ScatterPlot( @@ -18,30 +13,21 @@ def ScatterPlot( Assesses visual relationships, patterns, and outliers among features in a dataset through scatter plot matrices. -###### Purpose +### Purpose -The ScatterPlot test aims to visually analyze a given dataset by constructing a scatter plot matrix of its -numerical features. The primary goal is to uncover relationships, patterns, and outliers across different features -to provide both quantitative and qualitative insights into multidimensional relationships within the dataset. This -visual assessment aids in understanding the efficacy of the chosen features for model training and their -suitability. +The ScatterPlot test aims to visually analyze a given dataset by constructing a scatter plot matrix of its numerical features. The primary goal is to uncover relationships, patterns, and outliers across different features to provide both quantitative and qualitative insights into multidimensional relationships within the dataset. This visual assessment aids in understanding the efficacy of the chosen features for model training and their suitability. -###### Test Mechanism +### Test Mechanism -Using the Seaborn library, the ScatterPlot function creates the scatter plot matrix. The process involves -retrieving all numerical columns from the dataset and generating a scatter matrix for these columns. The resulting -scatter plot provides visual representations of feature relationships. The function also adjusts axis labels for -readability and returns the final plot as a Matplotlib Figure object for further analysis and visualization. +Using the Seaborn library, the ScatterPlot function creates the scatter plot matrix. The process involves retrieving all numerical columns from the dataset and generating a scatter matrix for these columns. The resulting scatter plot provides visual representations of feature relationships. The function also adjusts axis labels for readability and returns the final plot as a Matplotlib Figure object for further analysis and visualization. -###### Signs of High Risk +### Signs of High Risk -- The emergence of non-linear or random patterns across different feature pairs, suggesting complex relationships -unsuitable for linear assumptions. -- Lack of clear patterns or clusters, indicating weak or non-existent correlations among features, which could -challenge certain model types. +- The emergence of non-linear or random patterns across different feature pairs, suggesting complex relationships unsuitable for linear assumptions. +- Lack of clear patterns or clusters, indicating weak or non-existent correlations among features, which could challenge certain model types. - Presence of outliers, as visual outliers can adversely influence the model's performance. -###### Strengths +### Strengths - Provides insight into the multidimensional relationships among multiple features. - Assists in identifying trends, correlations, and outliers that could affect model performance. @@ -49,17 +35,10 @@ challenge certain model types. - Versatile for application in both regression and classification tasks. - Using Seaborn facilitates an intuitive and detailed visual exploration of data. -###### Limitations +### Limitations - Scatter plot matrices may become cluttered and hard to decipher as the number of features increases. -- Primarily reveals pairwise relationships and may fail to illuminate complex interactions involving three or more -features. +- Primarily reveals pairwise relationships and may fail to illuminate complex interactions involving three or more features. - Being a visual tool, precision in quantitative analysis might be compromised. - Outliers not clearly visible in plots can be missed, affecting model performance. -- Assumes that the dataset can fit into the computer's memory, which might not be valid for extremely large -datasets. - - - - - \ No newline at end of file +- Assumes that the dataset can fit into the computer's memory, which might not be valid for extremely large datasets. diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index e4b627ce5..40e345535 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ScoreBandDefaultRates +## ScoreBandDefaultRates[()]{.muted} ```python def ScoreBandDefaultRates( @@ -21,21 +16,19 @@ def ScoreBandDefaultRates( Analyzes default rates and population distribution across credit score bands. -###### Purpose +### Purpose -The Score Band Default Rates test evaluates the discriminatory power of credit scores by analyzing -default rates across different score bands. This helps validate score effectiveness, supports -policy decisions, and provides insights into portfolio risk distribution. +The Score Band Default Rates test evaluates the discriminatory power of credit scores by analyzing default rates across different score bands. This helps validate score effectiveness, supports policy decisions, and provides insights into portfolio risk distribution. -###### Test Mechanism +### Test Mechanism The test segments the score distribution into bands and calculates key metrics for each band: + 1. Population count and percentage in each band -2. Default rate within each band -3. Cumulative statistics across bands -The results show how well the scores separate good and bad accounts. +1. Default rate within each band +1. Cumulative statistics across bands The results show how well the scores separate good and bad accounts. -###### Signs of High Risk +### Signs of High Risk - Non-monotonic default rates across score bands - Insufficient population in critical score bands @@ -46,7 +39,7 @@ The results show how well the scores separate good and bad accounts. - Extreme population skewness - Poor risk separation between bands -###### Strengths +### Strengths - Clear view of score effectiveness - Supports policy threshold decisions @@ -57,7 +50,7 @@ The results show how well the scores separate good and bad accounts. - Helps validate scoring model - Supports portfolio monitoring -###### Limitations +### Limitations - Sensitive to band definition choices - May mask within-band variations @@ -67,8 +60,3 @@ The results show how well the scores separate good and bad accounts. - No temporal trend information - Assumes band boundaries are appropriate - May oversimplify risk patterns - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index c3cd9ea02..975511f82 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### SeasonalDecompose +## SeasonalDecompose[()]{.muted} ```python def SeasonalDecompose( @@ -19,45 +14,28 @@ def SeasonalDecompose( Assesses patterns and seasonality in a time series dataset by decomposing its features into foundational components. -###### Purpose +### Purpose -The Seasonal Decompose test aims to decompose the features of a time series dataset into their fundamental -components**: observed, trend, seasonal, and residuals. By utilizing the Seasonal Decomposition of Time Series by -Loess (STL) method, the test identifies underlying patterns, predominantly seasonality, in the dataset's features. -This aids in developing a more comprehensive understanding of the dataset, which in turn facilitates more effective -model validation. +The Seasonal Decompose test aims to decompose the features of a time series dataset into their fundamental components: observed, trend, seasonal, and residuals. By utilizing the Seasonal Decomposition of Time Series by Loess (STL) method, the test identifies underlying patterns, predominantly seasonality, in the dataset's features. This aids in developing a more comprehensive understanding of the dataset, which in turn facilitates more effective model validation. -###### Test Mechanism +### Test Mechanism -The testing process leverages the `seasonal_decompose` function from the `statsmodels.tsa.seasonal` library to -evaluate each feature in the dataset. It isolates each feature into four components—observed, trend, seasonal, and -residuals—and generates six subplot graphs per feature for visual interpretation. Prior to decomposition, the test -scrutinizes and removes any non-finite values, ensuring the reliability of the analysis. +The testing process leverages the `seasonal_decompose` function from the `statsmodels.tsa.seasonal` library to evaluate each feature in the dataset. It isolates each feature into four components—observed, trend, seasonal, and residuals—and generates six subplot graphs per feature for visual interpretation. Prior to decomposition, the test scrutinizes and removes any non-finite values, ensuring the reliability of the analysis. -###### Signs of High Risk +### Signs of High Risk -- **Non-Finiteness**: Datasets with a high number of non-finite values may flag as high risk since these values are -omitted before conducting the seasonal decomposition. +- **Non-Finiteness**: Datasets with a high number of non-finite values may flag as high risk since these values are omitted before conducting the seasonal decomposition. - **Frequent Warnings**: Chronic failure to infer the frequency for a scrutinized feature indicates high risk. -- **High Seasonality**: A significant seasonal component could potentially render forecasts unreliable due to -overwhelming seasonal variation. +- **High Seasonality**: A significant seasonal component could potentially render forecasts unreliable due to overwhelming seasonal variation. -###### Strengths +### Strengths - **Seasonality Detection**: Accurately discerns hidden seasonality patterns in dataset features. - **Visualization**: Facilitates interpretation and comprehension through graphical representations. - **Unrestricted Usage**: Not confined to any specific regression model, promoting wide-ranging applicability. -###### Limitations - -- **Dependence on Assumptions**: Assumes that dataset features are periodically distributed. Features with no -inferable frequency are excluded from the test. -- **Handling Non-Finite Values**: Disregards non-finite values during analysis, potentially resulting in an -incomplete understanding of the dataset. -- **Unreliability with Noisy Datasets**: Produces unreliable results when used with datasets that contain heavy -noise. - - - +### Limitations - \ No newline at end of file +- **Dependence on Assumptions**: Assumes that dataset features are periodically distributed. Features with no inferable frequency are excluded from the test. +- **Handling Non-Finite Values**: Disregards non-finite values during analysis, potentially resulting in an incomplete understanding of the dataset. +- **Unreliability with Noisy Datasets**: Produces unreliable results when used with datasets that contain heavy noise. diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index ae7f7b742..0846c1248 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ShapiroWilk +## ShapiroWilk[()]{.muted} ```python def ShapiroWilk( @@ -18,44 +13,27 @@ def ShapiroWilk( Evaluates feature-wise normality of training data using the Shapiro-Wilk test. -###### Purpose +### Purpose -The Shapiro-Wilk test is utilized to investigate whether a particular dataset conforms to the standard normal -distribution. This analysis is crucial in machine learning modeling because the normality of the data can -profoundly impact the performance of the model. This metric is especially useful in evaluating various features of -the dataset in both classification and regression tasks. +The Shapiro-Wilk test is utilized to investigate whether a particular dataset conforms to the standard normal distribution. This analysis is crucial in machine learning modeling because the normality of the data can profoundly impact the performance of the model. This metric is especially useful in evaluating various features of the dataset in both classification and regression tasks. -###### Test Mechanism +### Test Mechanism -The Shapiro-Wilk test is conducted on each feature column of the training dataset to determine if the data -contained fall within the normal distribution. The test presents a statistic and a p-value, with the p-value -serving to validate or repudiate the null hypothesis, which is that the tested data is normally distributed. +The Shapiro-Wilk test is conducted on each feature column of the training dataset to determine if the data contained fall within the normal distribution. The test presents a statistic and a p-value, with the p-value serving to validate or repudiate the null hypothesis, which is that the tested data is normally distributed. -###### Signs of High Risk +### Signs of High Risk -- A p-value that falls below 0.05 signifies a high risk as it discards the null hypothesis, indicating that the -data does not adhere to the normal distribution. -- For machine learning models built on the presumption of data normality, such an outcome could result in subpar -performance or incorrect predictions. +- A p-value that falls below 0.05 signifies a high risk as it discards the null hypothesis, indicating that the data does not adhere to the normal distribution. +- For machine learning models built on the presumption of data normality, such an outcome could result in subpar performance or incorrect predictions. -###### Strengths +### Strengths -- The Shapiro-Wilk test is esteemed for its level of accuracy, thereby making it particularly well-suited to -datasets of small to moderate sizes. +- The Shapiro-Wilk test is esteemed for its level of accuracy, thereby making it particularly well-suited to datasets of small to moderate sizes. - It proves its versatility through its efficient functioning in both classification and regression tasks. -- By separately testing each feature column, the Shapiro-Wilk test can raise an alarm if a specific feature does -not comply with the normality. +- By separately testing each feature column, the Shapiro-Wilk test can raise an alarm if a specific feature does not comply with the normality. -###### Limitations +### Limitations -- The Shapiro-Wilk test's sensitivity can be a disadvantage as it often rejects the null hypothesis (i.e., data is -normally distributed), even for minor deviations, especially in large datasets. This may lead to unwarranted 'false -alarms' of high risk by deeming the data as not normally distributed even if it approximates normal distribution. -- Exceptional care must be taken in managing missing data or outliers prior to testing as these can greatly skew -the results. +- The Shapiro-Wilk test's sensitivity can be a disadvantage as it often rejects the null hypothesis (i.e., data is normally distributed), even for minor deviations, especially in large datasets. This may lead to unwarranted 'false alarms' of high risk by deeming the data as not normally distributed even if it approximates normal distribution. +- Exceptional care must be taken in managing missing data or outliers prior to testing as these can greatly skew the results. - Lastly, the Shapiro-Wilk test is not optimally suited for processing data with pronounced skewness or kurtosis. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index bf86dcc23..b819476d5 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### Skewness +## Skewness[()]{.muted} ```python def Skewness( @@ -17,43 +12,30 @@ def Skewness( max_threshold = 1): ``` -Evaluates the skewness of numerical data in a dataset to check against a defined threshold, aiming to ensure data -quality and optimize model performance. +Evaluates the skewness of numerical data in a dataset to check against a defined threshold, aiming to ensure data quality and optimize model performance. -###### Purpose +### Purpose -The purpose of the Skewness test is to measure the asymmetry in the distribution of data within a predictive -machine learning model. Specifically, it evaluates the divergence of said distribution from a normal distribution. -Understanding the level of skewness helps identify data quality issues, which are crucial for optimizing the -performance of traditional machine learning models in both classification and regression settings. +The purpose of the Skewness test is to measure the asymmetry in the distribution of data within a predictive machine learning model. Specifically, it evaluates the divergence of said distribution from a normal distribution. Understanding the level of skewness helps identify data quality issues, which are crucial for optimizing the performance of traditional machine learning models in both classification and regression settings. -###### Test Mechanism +### Test Mechanism -This test calculates the skewness of numerical columns in the dataset, focusing specifically on numerical data -types. The calculated skewness value is then compared against a predetermined maximum threshold, which is set by -default to 1. If the skewness value is less than this maximum threshold, the test passes; otherwise, it fails. The -test results, along with the skewness values and column names, are then recorded for further analysis. +This test calculates the skewness of numerical columns in the dataset, focusing specifically on numerical data types. The calculated skewness value is then compared against a predetermined maximum threshold, which is set by default to 1. If the skewness value is less than this maximum threshold, the test passes; otherwise, it fails. The test results, along with the skewness values and column names, are then recorded for further analysis. -###### Signs of High Risk +### Signs of High Risk - Substantial skewness levels that significantly exceed the maximum threshold. -- Persistent skewness in the data, indicating potential issues with the foundational assumptions of the machine -learning model. +- Persistent skewness in the data, indicating potential issues with the foundational assumptions of the machine learning model. - Subpar model performance, erroneous predictions, or biased inferences due to skewed data distributions. -###### Strengths +### Strengths - Fast and efficient identification of unequal data distributions within a machine learning model. - Adjustable maximum threshold parameter, allowing for customization based on user needs. - Provides a clear quantitative measure to mitigate model risks related to data skewness. -###### Limitations +### Limitations - Only evaluates numeric columns, potentially missing skewness or bias in non-numeric data. - Assumes that data should follow a normal distribution, which may not always be applicable to real-world data. - Subjective threshold for risk grading, requiring expert input and recurrent iterations for refinement. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 4c0e9d6b5..80b319353 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -4,60 +4,39 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### SpreadPlot +## SpreadPlot[()]{.muted} ```python def SpreadPlot( dataset: VMDataset): ``` -Assesses potential correlations between pairs of time series variables through visualization to enhance -understanding of their relationships. +Assesses potential correlations between pairs of time series variables through visualization to enhance understanding of their relationships. -###### Purpose +### Purpose -The SpreadPlot test aims to graphically illustrate and analyze the relationships between pairs of time series -variables within a given dataset. This facilitated understanding helps in identifying and assessing potential time -series correlations, such as cointegration, between the variables. +The SpreadPlot test aims to graphically illustrate and analyze the relationships between pairs of time series variables within a given dataset. This facilitated understanding helps in identifying and assessing potential time series correlations, such as cointegration, between the variables. -###### Test Mechanism +### Test Mechanism -The SpreadPlot test computes and represents the spread between each pair of time series variables in the dataset. -Specifically, the difference between two variables is calculated and presented as a line graph. This process is -iterated for each unique pair of variables in the dataset, allowing for comprehensive visualization of their -relationships. +The SpreadPlot test computes and represents the spread between each pair of time series variables in the dataset. Specifically, the difference between two variables is calculated and presented as a line graph. This process is iterated for each unique pair of variables in the dataset, allowing for comprehensive visualization of their relationships. -###### Signs of High Risk +### Signs of High Risk - Large fluctuations in the spread over a given timespan. -- Unexpected patterns or trends that may signal potential risks in the underlying correlations between the -variables. -- Presence of significant missing data or extreme outlier values, which could potentially skew the spread and -indicate high risk. +- Unexpected patterns or trends that may signal potential risks in the underlying correlations between the variables. +- Presence of significant missing data or extreme outlier values, which could potentially skew the spread and indicate high risk. -###### Strengths +### Strengths - Allows for thorough visual examination and interpretation of the correlations between time-series pairs. - Aids in revealing complex relationships like cointegration. - Enhances interpretability by visualizing the relationships, thereby helping in spotting outliers and trends. - Capable of handling numerous variable pairs from the dataset through a versatile and adaptable process. -###### Limitations +### Limitations -- Primarily serves as a visualization tool and does not offer quantitative measurements or statistics to -objectively determine relationships. -- Heavily relies on the quality and granularity of the data—missing data or outliers can notably disturb the -interpretation of relationships. -- Can become inefficient or difficult to interpret with a high number of variables due to the profuse number of -plots. +- Primarily serves as a visualization tool and does not offer quantitative measurements or statistics to objectively determine relationships. +- Heavily relies on the quality and granularity of the data—missing data or outliers can notably disturb the interpretation of relationships. +- Can become inefficient or difficult to interpret with a high number of variables due to the profuse number of plots. - Might not completely capture intricate non-linear relationships between the variables. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 303bdf131..761ecca10 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TabularCategoricalBarPlots +## TabularCategoricalBarPlots[()]{.muted} ```python def TabularCategoricalBarPlots( @@ -18,41 +13,27 @@ def TabularCategoricalBarPlots( Generates and visualizes bar plots for each category in categorical features to evaluate the dataset's composition. -###### Purpose +### Purpose -The purpose of this metric is to visually analyze categorical data using bar plots. It is intended to evaluate the -dataset's composition by displaying the counts of each category in each categorical feature. +The purpose of this metric is to visually analyze categorical data using bar plots. It is intended to evaluate the dataset's composition by displaying the counts of each category in each categorical feature. -###### Test Mechanism +### Test Mechanism -The provided dataset is first checked to determine if it contains any categorical variables. If no categorical -columns are found, the tool raises a ValueError. For each categorical variable in the dataset, a separate bar plot -is generated. The number of occurrences for each category is calculated and displayed on the plot. If a dataset -contains multiple categorical columns, multiple bar plots are produced. +The provided dataset is first checked to determine if it contains any categorical variables. If no categorical columns are found, the tool raises a ValueError. For each categorical variable in the dataset, a separate bar plot is generated. The number of occurrences for each category is calculated and displayed on the plot. If a dataset contains multiple categorical columns, multiple bar plots are produced. -###### Signs of High Risk +### Signs of High Risk -- High risk could occur if the categorical variables exhibit an extreme imbalance, with categories having very few -instances possibly being underrepresented in the model, which could affect the model's performance and its ability -to generalize. -- Another sign of risk is if there are too many categories in a single variable, which could lead to overfitting -and make the model complex. +- High risk could occur if the categorical variables exhibit an extreme imbalance, with categories having very few instances possibly being underrepresented in the model, which could affect the model's performance and its ability to generalize. +- Another sign of risk is if there are too many categories in a single variable, which could lead to overfitting and make the model complex. -###### Strengths +### Strengths - Provides a visual and intuitively understandable representation of categorical data. - Aids in the analysis of variable distributions. - Helps in easily identifying imbalances or rare categories that could affect the model's performance. -###### Limitations +### Limitations - This method only works with categorical data and won't apply to numerical variables. -- It does not provide informative value when there are too many categories, as the bar chart could become cluttered -and hard to interpret. -- Offers no insights into the model's performance or precision, but rather provides a descriptive analysis of the -input. - - - - - \ No newline at end of file +- It does not provide informative value when there are too many categories, as the bar chart could become cluttered and hard to interpret. +- Offers no insights into the model's performance or precision, but rather provides a descriptive analysis of the input. diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 38ae5accd..e249790e5 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -4,61 +4,37 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TabularDateTimeHistograms +## TabularDateTimeHistograms[()]{.muted} ```python def TabularDateTimeHistograms( dataset: VMDataset): ``` -Generates histograms to provide graphical insight into the distribution of time intervals in a model's datetime -data. +Generates histograms to provide graphical insight into the distribution of time intervals in a model's datetime data. -###### Purpose +### Purpose -The `TabularDateTimeHistograms` metric is designed to provide graphical insight into the distribution of time -intervals in a machine learning model's datetime data. By plotting histograms of differences between consecutive -date entries in all datetime variables, it enables an examination of the underlying pattern of time series data and -identification of anomalies. +The `TabularDateTimeHistograms` metric is designed to provide graphical insight into the distribution of time intervals in a machine learning model's datetime data. By plotting histograms of differences between consecutive date entries in all datetime variables, it enables an examination of the underlying pattern of time series data and identification of anomalies. -###### Test Mechanism +### Test Mechanism -This test operates by first identifying all datetime columns and extracting them from the dataset. For each -datetime column, it next computes the differences (in days) between consecutive dates, excluding zero values, and -visualizes these differences in a histogram. The Plotly library's histogram function is used to generate -histograms, which are labeled appropriately and provide a graphical representation of the frequency of different -day intervals in the dataset. +This test operates by first identifying all datetime columns and extracting them from the dataset. For each datetime column, it next computes the differences (in days) between consecutive dates, excluding zero values, and visualizes these differences in a histogram. The Plotly library's histogram function is used to generate histograms, which are labeled appropriately and provide a graphical representation of the frequency of different day intervals in the dataset. -###### Signs of High Risk +### Signs of High Risk -- If no datetime columns are detected in the dataset, this would lead to a ValueError. Hence, the absence of -datetime columns signifies a high risk. -- A severely skewed or irregular distribution depicted in the histogram may indicate possible complications with -the data, such as faulty timestamps or abnormalities. +- If no datetime columns are detected in the dataset, this would lead to a ValueError. Hence, the absence of datetime columns signifies a high risk. +- A severely skewed or irregular distribution depicted in the histogram may indicate possible complications with the data, such as faulty timestamps or abnormalities. -###### Strengths +### Strengths -- The metric offers a visual overview of time interval frequencies within the dataset, supporting the recognition -of inherent patterns. -- Histogram plots can aid in the detection of potential outliers and data anomalies, contributing to an assessment -of data quality. -- The metric is versatile, compatible with a range of task types, including classification and regression, and can -work with multiple datetime variables if present. +- The metric offers a visual overview of time interval frequencies within the dataset, supporting the recognition of inherent patterns. +- Histogram plots can aid in the detection of potential outliers and data anomalies, contributing to an assessment of data quality. +- The metric is versatile, compatible with a range of task types, including classification and regression, and can work with multiple datetime variables if present. -###### Limitations +### Limitations -- A major weakness of this metric is its dependence on the visual examination of data, as it does not provide a -measurable evaluation of the model. +- A major weakness of this metric is its dependence on the visual examination of data, as it does not provide a measurable evaluation of the model. - The metric might overlook complex or multi-dimensional trends in the data. - The test is only applicable to datasets containing datetime columns and will fail if such columns are unavailable. - The interpretation of the histograms relies heavily on the domain expertise and experience of the reviewer. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 1c7734f71..4439d49ff 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -4,36 +4,28 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### get_categorical_columns +## get_categorical_columns[()]{.muted} ```python def get_categorical_columns( dataset): ``` - -#### get_datetime_columns +## get_datetime_columns[()]{.muted} ```python def get_datetime_columns( dataset): ``` - -#### get_numerical_columns +## get_numerical_columns[()]{.muted} ```python def get_numerical_columns( dataset): ``` - -#### get_summary_statistics_categorical +## get_summary_statistics_categorical[()]{.muted} ```python def get_summary_statistics_categorical( @@ -41,8 +33,7 @@ def get_summary_statistics_categorical( categorical_fields): ``` - -#### get_summary_statistics_datetime +## get_summary_statistics_datetime[()]{.muted} ```python def get_summary_statistics_datetime( @@ -50,8 +41,7 @@ def get_summary_statistics_datetime( datetime_fields): ``` - -#### get_summary_statistics_numerical +## get_summary_statistics_numerical[()]{.muted} ```python def get_summary_statistics_numerical( @@ -59,8 +49,7 @@ def get_summary_statistics_numerical( numerical_fields): ``` - -#### TabularDescriptionTables +## TabularDescriptionTables[()]{.muted} ```python def TabularDescriptionTables( @@ -69,52 +58,35 @@ def TabularDescriptionTables( Summarizes key descriptive statistics for numerical, categorical, and datetime variables in a dataset. -###### Purpose +### Purpose -The main purpose of this metric is to gather and present the descriptive statistics of numerical, categorical, and -datetime variables present in a dataset. The attributes it measures include the count, mean, minimum and maximum -values, percentage of missing values, data types of fields, and unique values for categorical fields, among others. +The main purpose of this metric is to gather and present the descriptive statistics of numerical, categorical, and datetime variables present in a dataset. The attributes it measures include the count, mean, minimum and maximum values, percentage of missing values, data types of fields, and unique values for categorical fields, among others. -###### Test Mechanism +### Test Mechanism -The test first segregates the variables in the dataset according to their data types (numerical, categorical, or -datetime). Then, it compiles summary statistics for each type of variable. The specifics of these statistics vary -depending on the type of variable: +The test first segregates the variables in the dataset according to their data types (numerical, categorical, or datetime). Then, it compiles summary statistics for each type of variable. The specifics of these statistics vary depending on the type of variable: -- For numerical variables, the metric extracts descriptors like count, mean, minimum and maximum values, count of -missing values, and data types. -- For categorical variables, it counts the number of unique values, displays unique values, counts missing values, -and identifies data types. -- For datetime variables, it counts the number of unique values, identifies the earliest and latest dates, counts -missing values, and identifies data types. +- For numerical variables, the metric extracts descriptors like count, mean, minimum and maximum values, count of missing values, and data types. +- For categorical variables, it counts the number of unique values, displays unique values, counts missing values, and identifies data types. +- For datetime variables, it counts the number of unique values, identifies the earliest and latest dates, counts missing values, and identifies data types. -###### Signs of High Risk +### Signs of High Risk -- Masses of missing values in the descriptive statistics results could hint at high risk or failure, indicating -potential data collection, integrity, and quality issues. -- Detection of inappropriate distributions for numerical variables, like having negative values for variables that -are always supposed to be positive. +- Masses of missing values in the descriptive statistics results could hint at high risk or failure, indicating potential data collection, integrity, and quality issues. +- Detection of inappropriate distributions for numerical variables, like having negative values for variables that are always supposed to be positive. - Identifying inappropriate data types, like a continuous variable being encoded as a categorical type. -###### Strengths +### Strengths - Provides a comprehensive overview of the dataset. - Gives a snapshot into the essence of the numerical, categorical, and datetime fields. -- Identifies potential data quality issues such as missing values or inconsistencies crucial for building credible -machine learning models. -- The metadata, including the data type and missing value information, are vital for anyone including data -scientists dealing with the dataset before the modeling process. +- Identifies potential data quality issues such as missing values or inconsistencies crucial for building credible machine learning models. +- The metadata, including the data type and missing value information, are vital for anyone including data scientists dealing with the dataset before the modeling process. -###### Limitations +### Limitations - It does not perform any deeper statistical analysis or tests on the data. - It does not handle issues such as outliers, or relationships between variables. - It offers no insights into potential correlations or possible interactions between variables. - It does not investigate the potential impact of missing values on the performance of the machine learning models. -- It does not explore potential transformation requirements that may be necessary to enhance the performance of the -chosen algorithm. - - - - - \ No newline at end of file +- It does not explore potential transformation requirements that may be necessary to enhance the performance of the chosen algorithm. diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index d068dd38c..56fa444df 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -4,60 +4,40 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TabularNumericalHistograms +## TabularNumericalHistograms[()]{.muted} ```python def TabularNumericalHistograms( dataset: VMDataset): ``` -Generates histograms for each numerical feature in a dataset to provide visual insights into data distribution and -detect potential issues. +Generates histograms for each numerical feature in a dataset to provide visual insights into data distribution and detect potential issues. -###### Purpose +### Purpose -The purpose of this test is to provide visual analysis of numerical data through the generation of histograms for -each numerical feature in the dataset. Histograms aid in the exploratory analysis of data, offering insight into -the distribution of the data, skewness, presence of outliers, and central tendencies. It helps in understanding if -the inputs to the model are normally distributed, which is a common assumption in many machine learning algorithms. +The purpose of this test is to provide visual analysis of numerical data through the generation of histograms for each numerical feature in the dataset. Histograms aid in the exploratory analysis of data, offering insight into the distribution of the data, skewness, presence of outliers, and central tendencies. It helps in understanding if the inputs to the model are normally distributed, which is a common assumption in many machine learning algorithms. -###### Test Mechanism +### Test Mechanism -This test scans the provided dataset and extracts all the numerical columns. For each numerical column, it -constructs a histogram using plotly, with 50 bins. The deployment of histograms offers a robust visual aid, -ensuring unruffled identification and understanding of numerical data distribution patterns. +This test scans the provided dataset and extracts all the numerical columns. For each numerical column, it constructs a histogram using plotly, with 50 bins. The deployment of histograms offers a robust visual aid, ensuring unruffled identification and understanding of numerical data distribution patterns. -###### Signs of High Risk +### Signs of High Risk - A high degree of skewness - Unexpected data distributions - Existence of extreme outliers in the histograms -These may indicate issues with the data that the model is receiving. If data for a numerical feature is expected to -follow a certain distribution (like a normal distribution) but does not, it could lead to sub-par performance by -the model. As such these instances should be treated as high-risk indicators. +These may indicate issues with the data that the model is receiving. If data for a numerical feature is expected to follow a certain distribution (like a normal distribution) but does not, it could lead to sub-par performance by the model. As such these instances should be treated as high-risk indicators. -###### Strengths +### Strengths - Provides a simple, easy-to-interpret visualization of how data for each numerical attribute is distributed. - Helps detect skewed values and outliers that could potentially harm the AI model's performance. - Can be applied to large datasets and multiple numerical variables conveniently. -###### Limitations +### Limitations - Only works with numerical data, thus ignoring non-numerical or categorical data. - Does not analyze relationships between different features, only the individual feature distributions. -- Is a univariate analysis and may miss patterns or anomalies that only appear when considering multiple variables -together. -- Does not provide any insight into how these features affect the output of the model; it is purely an input -analysis tool. - - - - - \ No newline at end of file +- Is a univariate analysis and may miss patterns or anomalies that only appear when considering multiple variables together. +- Does not provide any insight into how these features affect the output of the model; it is purely an input analysis tool. diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index a5c5314a5..0cb4734be 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -4,55 +4,33 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TargetRateBarPlots +## TargetRateBarPlots[()]{.muted} ```python def TargetRateBarPlots( dataset: VMDataset): ``` -Generates bar plots visualizing the default rates of categorical features for a classification machine learning -model. +Generates bar plots visualizing the default rates of categorical features for a classification machine learning model. -###### Purpose +### Purpose -This test, implemented as a metric, is designed to provide an intuitive, graphical summary of the decision-making -patterns exhibited by a categorical classification machine learning model. The model's performance is evaluated -using bar plots depicting the ratio of target rates—meaning the proportion of positive classes—for different -categorical inputs. This allows for an easy, at-a-glance understanding of the model's accuracy. +This test, implemented as a metric, is designed to provide an intuitive, graphical summary of the decision-making patterns exhibited by a categorical classification machine learning model. The model's performance is evaluated using bar plots depicting the ratio of target rates—meaning the proportion of positive classes—for different categorical inputs. This allows for an easy, at-a-glance understanding of the model's accuracy. -###### Test Mechanism +### Test Mechanism -The test involves creating a pair of bar plots for each categorical feature in the dataset. The first plot depicts -the frequency of each category in the dataset, with each category visually distinguished by its unique color. The -second plot shows the mean target rate of each category (sourced from the "default_column"). Plotly, a Python -library, is used to generate these plots, with distinct plots created for each feature. If no specific columns are -selected, the test will generate plots for each categorical column in the dataset. +The test involves creating a pair of bar plots for each categorical feature in the dataset. The first plot depicts the frequency of each category in the dataset, with each category visually distinguished by its unique color. The second plot shows the mean target rate of each category (sourced from the "default_column"). Plotly, a Python library, is used to generate these plots, with distinct plots created for each feature. If no specific columns are selected, the test will generate plots for each categorical column in the dataset. -###### Signs of High Risk +### Signs of High Risk -- Inconsistent or non-binary values in the "default_column" could complicate or render impossible the calculation -of average target rates. -- Particularly low or high target rates for a specific category might suggest that the model is misclassifying -instances of that category. +- Inconsistent or non-binary values in the "default_column" could complicate or render impossible the calculation of average target rates. +- Particularly low or high target rates for a specific category might suggest that the model is misclassifying instances of that category. -###### Strengths +### Strengths -- This test offers a visually interpretable breakdown of the model's decisions, providing an easy way to spot -irregularities, inconsistencies, or patterns. +- This test offers a visually interpretable breakdown of the model's decisions, providing an easy way to spot irregularities, inconsistencies, or patterns. - Its flexibility allows for the inspection of one or multiple columns, as needed. -###### Limitations - -- The readability of the bar plots drops as the number of distinct categories increases in the dataset, which can -make them harder to understand and less useful. - - - +### Limitations - \ No newline at end of file +- The readability of the bar plots drops as the number of distinct categories increases in the dataset, which can make them harder to understand and less useful. diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 46485b530..40bb88f38 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -4,52 +4,35 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TimeSeriesDescription +## TimeSeriesDescription[()]{.muted} ```python def TimeSeriesDescription( dataset): ``` -Generates a detailed analysis for the provided time series dataset, summarizing key statistics to identify trends, -patterns, and data quality issues. +Generates a detailed analysis for the provided time series dataset, summarizing key statistics to identify trends, patterns, and data quality issues. -###### Purpose +### Purpose -The TimeSeriesDescription function aims to analyze an individual time series by providing a summary of key -statistics. This helps in understanding trends, patterns, and data quality issues within the time series. +The TimeSeriesDescription function aims to analyze an individual time series by providing a summary of key statistics. This helps in understanding trends, patterns, and data quality issues within the time series. -###### Test Mechanism +### Test Mechanism -The function extracts the time series data and provides a summary of key statistics. The dataset is expected to -have a datetime index. The function checks this and raises an error if the index is not in datetime format. For -each variable (column) in the dataset, appropriate statistics including start date, end date, frequency, number of -missing values, count, min, and max values are calculated. +The function extracts the time series data and provides a summary of key statistics. The dataset is expected to have a datetime index. The function checks this and raises an error if the index is not in datetime format. For each variable (column) in the dataset, appropriate statistics including start date, end date, frequency, number of missing values, count, min, and max values are calculated. -###### Signs of High Risk +### Signs of High Risk - If the index of the dataset is not in datetime format, it could lead to errors in time-series analysis. - Inconsistent or missing data within the dataset might affect the analysis of trends and patterns. -###### Strengths +### Strengths -- Provides a comprehensive summary of key statistics for each variable, helping to identify data quality issues -such as missing values. +- Provides a comprehensive summary of key statistics for each variable, helping to identify data quality issues such as missing values. - Helps in understanding the distribution and range of the data by including min and max values. -###### Limitations +### Limitations -- Assumes that the dataset is provided as a DataFrameDataset object with a .df attribute to access the pandas -DataFrame. +- Assumes that the dataset is provided as a DataFrameDataset object with a .df attribute to access the pandas DataFrame. - Only analyzes datasets with a datetime index and will raise an error for other types of indices. - Does not handle large datasets efficiently; performance may degrade with very large datasets. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 41cfc1ac4..ec80df98d 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TimeSeriesDescriptiveStatistics +## TimeSeriesDescriptiveStatistics[()]{.muted} ```python def TimeSeriesDescriptiveStatistics( @@ -18,36 +13,26 @@ def TimeSeriesDescriptiveStatistics( Evaluates the descriptive statistics of a time series dataset to identify trends, patterns, and data quality issues. -###### Purpose +### Purpose -The purpose of the TimeSeriesDescriptiveStatistics function is to analyze an individual time series by providing a -summary of key descriptive statistics. This analysis helps in understanding trends, patterns, and data quality -issues within the time series dataset. +The purpose of the TimeSeriesDescriptiveStatistics function is to analyze an individual time series by providing a summary of key descriptive statistics. This analysis helps in understanding trends, patterns, and data quality issues within the time series dataset. -###### Test Mechanism +### Test Mechanism -The function extracts the time series data and provides a summary of key descriptive statistics. The dataset is -expected to have a datetime index, and the function will check this and raise an error if the index is not in a -datetime format. For each variable (column) in the dataset, appropriate statistics, including start date, end date, -min, mean, max, skewness, kurtosis, and count, are calculated. +The function extracts the time series data and provides a summary of key descriptive statistics. The dataset is expected to have a datetime index, and the function will check this and raise an error if the index is not in a datetime format. For each variable (column) in the dataset, appropriate statistics, including start date, end date, min, mean, max, skewness, kurtosis, and count, are calculated. -###### Signs of High Risk +### Signs of High Risk - If the index of the dataset is not in datetime format, it could lead to errors in time-series analysis. - Inconsistent or missing data within the dataset might affect the analysis of trends and patterns. -###### Strengths +### Strengths - Provides a comprehensive summary of key descriptive statistics for each variable. - Helps identify data quality issues and understand the distribution of the data. -###### Limitations +### Limitations - Assumes the dataset is provided as a DataFrameDataset object with a .df attribute to access the pandas DataFrame. - Only analyzes datasets with a datetime index and will raise an error for other types of indices. - Does not handle large datasets efficiently, and performance may degrade with very large datasets. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 0ef4fa0db..5962a6491 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TimeSeriesFrequency +## TimeSeriesFrequency[()]{.muted} ```python def TimeSeriesFrequency( @@ -18,48 +13,27 @@ def TimeSeriesFrequency( Evaluates consistency of time series data frequency and generates a frequency plot. -###### Purpose +### Purpose -The purpose of the TimeSeriesFrequency test is to evaluate the consistency in the frequency of data points in a -time-series dataset. This test inspects the intervals or duration between each data point to determine if a fixed -pattern (such as daily, weekly, or monthly) exists. The identification of such patterns is crucial to time-series -analysis as any irregularities could lead to erroneous results and hinder the model's capacity for identifying -trends and patterns. +The purpose of the TimeSeriesFrequency test is to evaluate the consistency in the frequency of data points in a time-series dataset. This test inspects the intervals or duration between each data point to determine if a fixed pattern (such as daily, weekly, or monthly) exists. The identification of such patterns is crucial to time-series analysis as any irregularities could lead to erroneous results and hinder the model's capacity for identifying trends and patterns. -###### Test Mechanism +### Test Mechanism -Initially, the test checks if the dataframe index is in datetime format. Subsequently, it utilizes pandas' -`infer_freq` method to identify the frequency of each data series within the dataframe. The `infer_freq` method -attempts to establish the frequency of a time series and returns both the frequency string and a dictionary -relating these strings to their respective labels. The test compares the frequencies of all datasets. If they share -a common frequency, the test passes, but it fails if they do not. Additionally, Plotly is used to create a -frequency plot, offering a visual depiction of the time differences between consecutive entries in the dataframe -index. +Initially, the test checks if the dataframe index is in datetime format. Subsequently, it utilizes pandas' `infer_freq` method to identify the frequency of each data series within the dataframe. The `infer_freq` method attempts to establish the frequency of a time series and returns both the frequency string and a dictionary relating these strings to their respective labels. The test compares the frequencies of all datasets. If they share a common frequency, the test passes, but it fails if they do not. Additionally, Plotly is used to create a frequency plot, offering a visual depiction of the time differences between consecutive entries in the dataframe index. -###### Signs of High Risk +### Signs of High Risk -- The test fails, indicating multiple unique frequencies within the dataset. This failure could suggest irregular -intervals between observations, potentially interrupting pattern recognition or trend analysis. -- The presence of missing or null frequencies could be an indication of inconsistencies in data or gaps within the -data collection process. +- The test fails, indicating multiple unique frequencies within the dataset. This failure could suggest irregular intervals between observations, potentially interrupting pattern recognition or trend analysis. +- The presence of missing or null frequencies could be an indication of inconsistencies in data or gaps within the data collection process. -###### Strengths +### Strengths - This test uses a systematic approach to checking the consistency of data frequency within a time-series dataset. -- It increases the model's reliability by asserting the consistency of observations over time, an essential factor -in time-series analysis. -- The test generates a visual plot, providing an intuitive representation of the dataset's frequency distribution, -which caters to visual learners and aids in interpretation and explanation. +- It increases the model's reliability by asserting the consistency of observations over time, an essential factor in time-series analysis. +- The test generates a visual plot, providing an intuitive representation of the dataset's frequency distribution, which caters to visual learners and aids in interpretation and explanation. -###### Limitations +### Limitations - This test is only applicable to time-series datasets and hence not suitable for other types of datasets. -- The `infer_freq` method might not always correctly infer frequency when faced with missing or irregular data -points. -- Depending on context or the model under development, mixed frequencies might sometimes be acceptable, but this -test considers them a failing condition. - - - - - \ No newline at end of file +- The `infer_freq` method might not always correctly infer frequency when faced with missing or irregular data points. +- Depending on context or the model under development, mixed frequencies might sometimes be acceptable, but this test considers them a failing condition. diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 9f1e03570..419a468dc 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TimeSeriesHistogram +## TimeSeriesHistogram[()]{.muted} ```python def TimeSeriesHistogram( @@ -19,42 +14,30 @@ def TimeSeriesHistogram( Visualizes distribution of time-series data using histograms and Kernel Density Estimation (KDE) lines. -###### Purpose +### Purpose -The TimeSeriesHistogram test aims to perform a histogram analysis on time-series data to assess the distribution of -values within a dataset over time. This test is useful for regression tasks and can be applied to various types of -data, such as internet traffic, stock prices, and weather data, providing insights into the probability -distribution, skewness, and kurtosis of the dataset. +The TimeSeriesHistogram test aims to perform a histogram analysis on time-series data to assess the distribution of values within a dataset over time. This test is useful for regression tasks and can be applied to various types of data, such as internet traffic, stock prices, and weather data, providing insights into the probability distribution, skewness, and kurtosis of the dataset. -###### Test Mechanism +### Test Mechanism -This test operates on a specific column within the dataset that must have a datetime type index. For each column in -the dataset, a histogram is created using Plotly's histplot function. If the dataset includes more than one -time-series, a distinct histogram is plotted for each series. Additionally, a Kernel Density Estimate (KDE) line is -drawn for each histogram, visualizing the data's underlying probability distribution. The x and y-axis labels are -hidden to focus solely on the data distribution. +This test operates on a specific column within the dataset that must have a datetime type index. For each column in the dataset, a histogram is created using Plotly's histplot function. If the dataset includes more than one time-series, a distinct histogram is plotted for each series. Additionally, a Kernel Density Estimate (KDE) line is drawn for each histogram, visualizing the data's underlying probability distribution. The x and y-axis labels are hidden to focus solely on the data distribution. -###### Signs of High Risk +### Signs of High Risk - The dataset lacks a column with a datetime type index. - The specified columns do not exist within the dataset. - High skewness or kurtosis in the data distribution, indicating potential bias. - Presence of significant outliers in the data distribution. -###### Strengths +### Strengths - Serves as a visual diagnostic tool for understanding data behavior and distribution trends. - Effective for analyzing both single and multiple time-series data. - KDE line provides a smooth estimate of the overall trend in data distribution. -###### Limitations +### Limitations - Provides a high-level view without specific numeric measures such as skewness or kurtosis. - The histogram loses some detail due to binning of data values. - Cannot handle non-numeric data columns. - Histogram shape may be sensitive to the number of bins used. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 1fe748d00..c35382fe7 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TimeSeriesLinePlot +## TimeSeriesLinePlot[()]{.muted} ```python def TimeSeriesLinePlot( @@ -18,46 +13,29 @@ def TimeSeriesLinePlot( Generates and analyses time-series data through line plots revealing trends, patterns, anomalies over time. -###### Purpose +### Purpose -The TimeSeriesLinePlot metric is designed to generate and analyze time series data through the creation of line -plots. This assists in the initial inspection of the data by providing a visual representation of patterns, trends, -seasonality, irregularity, and anomalies that may be present in the dataset over a period of time. +The TimeSeriesLinePlot metric is designed to generate and analyze time series data through the creation of line plots. This assists in the initial inspection of the data by providing a visual representation of patterns, trends, seasonality, irregularity, and anomalies that may be present in the dataset over a period of time. -###### Test Mechanism +### Test Mechanism -The mechanism for this Python class involves extracting the column names from the provided dataset and subsequently -generating line plots for each column using the Plotly Python library. For every column in the dataset, a -time-series line plot is created where the values are plotted against the dataset's datetime index. It is important -to note that indexes that are not of datetime type will result in a ValueError. +The mechanism for this Python class involves extracting the column names from the provided dataset and subsequently generating line plots for each column using the Plotly Python library. For every column in the dataset, a time-series line plot is created where the values are plotted against the dataset's datetime index. It is important to note that indexes that are not of datetime type will result in a ValueError. -###### Signs of High Risk +### Signs of High Risk - Presence of time-series data that does not have datetime indices. - Provided columns do not exist in the provided dataset. -- The detection of anomalous patterns or irregularities in the time-series plots, indicating potential high model -instability or probable predictive error. +- The detection of anomalous patterns or irregularities in the time-series plots, indicating potential high model instability or probable predictive error. -###### Strengths +### Strengths -- The visual representation of complex time series data, which simplifies understanding and helps in recognizing -temporal trends, patterns, and anomalies. -- The adaptability of the metric, which allows it to effectively work with multiple time series within the same -dataset. -- Enables the identification of anomalies and irregular patterns through visual inspection, assisting in spotting -potential data or model performance problems. +- The visual representation of complex time series data, which simplifies understanding and helps in recognizing temporal trends, patterns, and anomalies. +- The adaptability of the metric, which allows it to effectively work with multiple time series within the same dataset. +- Enables the identification of anomalies and irregular patterns through visual inspection, assisting in spotting potential data or model performance problems. -###### Limitations +### Limitations - The effectiveness of the metric is heavily reliant on the quality and patterns of the provided time series data. -- Exclusively a visual tool, it lacks the capability to provide quantitative measurements, making it less effective -for comparing and ranking multiple models or when specific numerical diagnostics are needed. -- The metric necessitates that the time-specific data has been transformed into a datetime index, with the data -formatted correctly. -- The metric has an inherent limitation in that it cannot extract deeper statistical insights from the time series -data, which can limit its efficacy with complex data structures and phenomena. - - - - - \ No newline at end of file +- Exclusively a visual tool, it lacks the capability to provide quantitative measurements, making it less effective for comparing and ranking multiple models or when specific numerical diagnostics are needed. +- The metric necessitates that the time-specific data has been transformed into a datetime index, with the data formatted correctly. +- The metric has an inherent limitation in that it cannot extract deeper statistical insights from the time series data, which can limit its efficacy with complex data structures and phenomena. diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 50bd09c98..dbe5a701a 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TimeSeriesMissingValues +## TimeSeriesMissingValues[()]{.muted} ```python def TimeSeriesMissingValues( @@ -19,43 +14,27 @@ def TimeSeriesMissingValues( Validates time-series data quality by confirming the count of missing values is below a certain threshold. -###### Purpose +### Purpose -This test is designed to validate the quality of a historical time-series dataset by verifying that the number of -missing values is below a specified threshold. As time-series models greatly depend on the continuity and -temporality of data points, missing values could compromise the model's performance. Consequently, this test aims -to ensure data quality and readiness for the machine learning model, safeguarding its predictive capacity. +This test is designed to validate the quality of a historical time-series dataset by verifying that the number of missing values is below a specified threshold. As time-series models greatly depend on the continuity and temporality of data points, missing values could compromise the model's performance. Consequently, this test aims to ensure data quality and readiness for the machine learning model, safeguarding its predictive capacity. -###### Test Mechanism +### Test Mechanism -The test method commences by validating if the dataset has a datetime index; if not, an error is raised. It -establishes a lower limit threshold for missing values and performs a missing values check on each column of the -dataset. An object for the test result is created stating whether the number of missing values is within the -specified threshold. Additionally, the test calculates the percentage of missing values alongside the raw count. +The test method commences by validating if the dataset has a datetime index; if not, an error is raised. It establishes a lower limit threshold for missing values and performs a missing values check on each column of the dataset. An object for the test result is created stating whether the number of missing values is within the specified threshold. Additionally, the test calculates the percentage of missing values alongside the raw count. -###### Signs of High Risk +### Signs of High Risk -- The number of missing values in any column of the dataset surpasses the threshold, marking a failure and a -high-risk scenario. The reasons could range from incomplete data collection, faulty sensors to data preprocessing -errors. +- The number of missing values in any column of the dataset surpasses the threshold, marking a failure and a high-risk scenario. The reasons could range from incomplete data collection, faulty sensors to data preprocessing errors. -###### Strengths +### Strengths - Effectively identifies missing values which could adversely affect the model’s performance. - Applicable and customizable through the threshold parameter across different data sets. -- Goes beyond raw numbers by calculating the percentage of missing values, offering a more relative understanding -of data scarcity. +- Goes beyond raw numbers by calculating the percentage of missing values, offering a more relative understanding of data scarcity. -###### Limitations +### Limitations - Although it identifies missing values, the test does not provide solutions to handle them. -- The test demands that the dataset should have a datetime index, hence limiting its use only to time series -analysis. -- The test's sensitivity to the 'min_threshold' parameter may raise false alarms if set too strictly or may -overlook problematic data if set too loosely. +- The test demands that the dataset should have a datetime index, hence limiting its use only to time series analysis. +- The test's sensitivity to the 'min_threshold' parameter may raise false alarms if set too strictly or may overlook problematic data if set too loosely. - Solely focuses on the 'missingness' of the data and might fall short in addressing other aspects of data quality. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index a20e3c30a..f768f3e0f 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TimeSeriesOutliers +## TimeSeriesOutliers[()]{.muted} ```python def TimeSeriesOutliers( @@ -19,30 +14,21 @@ def TimeSeriesOutliers( Identifies and visualizes outliers in time-series data using the z-score method. -###### Purpose +### Purpose -This test is designed to identify outliers in time-series data using the z-score method. It's vital for ensuring -data quality before modeling, as outliers can skew predictive models and significantly impact their overall -performance. +This test is designed to identify outliers in time-series data using the z-score method. It's vital for ensuring data quality before modeling, as outliers can skew predictive models and significantly impact their overall performance. -###### Test Mechanism +### Test Mechanism -The test processes a given dataset which must have datetime indexing, checks if a 'zscore_threshold' parameter has -been supplied, and identifies columns with numeric data types. After finding numeric columns, the implementer then -applies the z-score method to each numeric column, identifying outliers based on the threshold provided. Each -outlier is listed together with their variable name, z-score, timestamp, and relative threshold in a dictionary and -converted to a DataFrame for convenient output. Additionally, it produces visual plots for each time series -illustrating outliers in the context of the broader dataset. The 'zscore_threshold' parameter sets the limit beyond -which a data point will be labeled as an outlier. The default threshold is set at 3, indicating that any data point -that falls 3 standard deviations away from the mean will be marked as an outlier. +The test processes a given dataset which must have datetime indexing, checks if a 'zscore_threshold' parameter has been supplied, and identifies columns with numeric data types. After finding numeric columns, the implementer then applies the z-score method to each numeric column, identifying outliers based on the threshold provided. Each outlier is listed together with their variable name, z-score, timestamp, and relative threshold in a dictionary and converted to a DataFrame for convenient output. Additionally, it produces visual plots for each time series illustrating outliers in the context of the broader dataset. The 'zscore_threshold' parameter sets the limit beyond which a data point will be labeled as an outlier. The default threshold is set at 3, indicating that any data point that falls 3 standard deviations away from the mean will be marked as an outlier. -###### Signs of High Risk +### Signs of High Risk - Many or substantial outliers are present within the dataset, indicating significant anomalies. - Data points with z-scores higher than the set threshold. - Potential impact on the performance of machine learning models if outliers are not properly addressed. -###### Strengths +### Strengths - The z-score method is a popular and robust method for identifying outliers in a dataset. - Simplifies time series maintenance by requiring a datetime index. @@ -50,16 +36,10 @@ that falls 3 standard deviations away from the mean will be marked as an outlier - Provides an elaborate report showing variables, dates, z-scores, and pass/fail tests. - Offers visual inspection for detected outliers through plots. -###### Limitations +### Limitations - The test only identifies outliers in numeric columns, not in categorical variables. - The utility and accuracy of z-scores can be limited if the data doesn't follow a normal distribution. -- The method relies on a subjective z-score threshold for deciding what constitutes an outlier, which might not -always be suitable depending on the dataset and use case. +- The method relies on a subjective z-score threshold for deciding what constitutes an outlier, which might not always be suitable depending on the dataset and use case. - It does not address possible ways to handle identified outliers in the data. - The requirement for a datetime index could limit its application. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 4bdbded39..120b6d845 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TooManyZeroValues +## TooManyZeroValues[()]{.muted} ```python def TooManyZeroValues( @@ -17,57 +12,32 @@ def TooManyZeroValues( max_percent_threshold: float = 0.03): ``` -Identifies numerical columns in a dataset that contain an excessive number of zero values, defined by a threshold -percentage. - -###### Purpose - -The 'TooManyZeroValues' test is utilized to identify numerical columns in the dataset that may present a quantity -of zero values considered excessive. The aim is to detect situations where these may implicate data sparsity or a -lack of variation, limiting their effectiveness within a machine learning model. The definition of 'too many' is -quantified as a percentage of total values, with a default set to 3%. - -###### Test Mechanism - -This test is conducted by looping through each column in the dataset and categorizing those that pertain to -numerical data. On identifying a numerical column, the function computes the total quantity of zero values and -their ratio to the total row count. Should the proportion exceed a pre-set threshold parameter, set by default at -0.03 or 3%, the column is considered to have failed the test. The results for each column are summarized and -reported, indicating the count and percentage of zero values for each numerical column, alongside a status -indicating whether the column has passed or failed the test. +Identifies numerical columns in a dataset that contain an excessive number of zero values, defined by a threshold percentage. -###### Signs of High Risk +### Purpose -- Numerical columns showing a high ratio of zero values when compared to the total count of rows (exceeding the -predetermined threshold). -- Columns characterized by zero values across the board suggest a complete lack of data variation, signifying high -risk. +The 'TooManyZeroValues' test is utilized to identify numerical columns in the dataset that may present a quantity of zero values considered excessive. The aim is to detect situations where these may implicate data sparsity or a lack of variation, limiting their effectiveness within a machine learning model. The definition of 'too many' is quantified as a percentage of total values, with a default set to 3%. -###### Strengths +### Test Mechanism -- Assists in highlighting columns featuring an excess of zero values that could otherwise go unnoticed within a -large dataset. -- Provides the flexibility to alter the threshold that determines when the quantity of zero values becomes 'too -many', thus catering to specific needs of a particular analysis or model. -- Offers feedback in the form of both counts and percentages of zero values, which allows a closer inspection of -the distribution and proportion of zeros within a column. -- Targets specifically numerical data, thereby avoiding inappropriate application to non-numerical columns and -mitigating the risk of false test failures. +This test is conducted by looping through each column in the dataset and categorizing those that pertain to numerical data. On identifying a numerical column, the function computes the total quantity of zero values and their ratio to the total row count. Should the proportion exceed a pre-set threshold parameter, set by default at 0.03 or 3%, the column is considered to have failed the test. The results for each column are summarized and reported, indicating the count and percentage of zero values for each numerical column, alongside a status indicating whether the column has passed or failed the test. -###### Limitations +### Signs of High Risk -- Is exclusively designed to check for zero values and doesn’t assess the potential impact of other values that -could affect the dataset, such as extremely high or low figures, missing values, or outliers. -- Lacks the ability to detect a repetitive pattern of zeros, which could be significant in time-series or -longitudinal data. -- Zero values can actually be meaningful in some contexts; therefore, tagging them as 'too many' could potentially -misinterpret the data to some extent. -- This test does not take into consideration the context of the dataset, and fails to recognize that within certain -columns, a high number of zero values could be quite normal and not necessarily an indicator of poor data quality. -- Cannot evaluate non-numerical or categorical columns, which might bring with them different types of concerns or -issues. +- Numerical columns showing a high ratio of zero values when compared to the total count of rows (exceeding the predetermined threshold). +- Columns characterized by zero values across the board suggest a complete lack of data variation, signifying high risk. +### Strengths +- Assists in highlighting columns featuring an excess of zero values that could otherwise go unnoticed within a large dataset. +- Provides the flexibility to alter the threshold that determines when the quantity of zero values becomes 'too many', thus catering to specific needs of a particular analysis or model. +- Offers feedback in the form of both counts and percentages of zero values, which allows a closer inspection of the distribution and proportion of zeros within a column. +- Targets specifically numerical data, thereby avoiding inappropriate application to non-numerical columns and mitigating the risk of false test failures. +### Limitations - \ No newline at end of file +- Is exclusively designed to check for zero values and doesn’t assess the potential impact of other values that could affect the dataset, such as extremely high or low figures, missing values, or outliers. +- Lacks the ability to detect a repetitive pattern of zeros, which could be significant in time-series or longitudinal data. +- Zero values can actually be meaningful in some contexts; therefore, tagging them as 'too many' could potentially misinterpret the data to some extent. +- This test does not take into consideration the context of the dataset, and fails to recognize that within certain columns, a high number of zero values could be quite normal and not necessarily an indicator of poor data quality. +- Cannot evaluate non-numerical or categorical columns, which might bring with them different types of concerns or issues. diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 77fc345dd..ce71bd54d 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### UniqueRows +## UniqueRows[()]{.muted} ```python def UniqueRows( @@ -19,45 +14,26 @@ def UniqueRows( Verifies the diversity of the dataset by ensuring that the count of unique rows exceeds a prescribed threshold. -###### Purpose +### Purpose -The UniqueRows test is designed to gauge the quality of the data supplied to the machine learning model by -verifying that the count of distinct rows in the dataset exceeds a specific threshold, thereby ensuring a varied -collection of data. Diversity in data is essential for training an unbiased and robust model that excels when faced -with novel data. +The UniqueRows test is designed to gauge the quality of the data supplied to the machine learning model by verifying that the count of distinct rows in the dataset exceeds a specific threshold, thereby ensuring a varied collection of data. Diversity in data is essential for training an unbiased and robust model that excels when faced with novel data. -###### Test Mechanism +### Test Mechanism -The testing process starts with calculating the total number of rows in the dataset. Subsequently, the count of -unique rows is determined for each column in the dataset. If the percentage of unique rows (calculated as the ratio -of unique rows to the overall row count) is less than the prescribed minimum percentage threshold given as a -function parameter, the test passes. The results are cached and a final pass or fail verdict is given based on -whether all columns have successfully passed the test. +The testing process starts with calculating the total number of rows in the dataset. Subsequently, the count of unique rows is determined for each column in the dataset. If the percentage of unique rows (calculated as the ratio of unique rows to the overall row count) is less than the prescribed minimum percentage threshold given as a function parameter, the test passes. The results are cached and a final pass or fail verdict is given based on whether all columns have successfully passed the test. -###### Signs of High Risk +### Signs of High Risk -- A lack of diversity in data columns, demonstrated by a count of unique rows that falls short of the preset -minimum percentage threshold, is indicative of high risk. -- This lack of variety in the data signals potential issues with data quality, possibly leading to overfitting in -the model and issues with generalization, thus posing a significant risk. +- A lack of diversity in data columns, demonstrated by a count of unique rows that falls short of the preset minimum percentage threshold, is indicative of high risk. +- This lack of variety in the data signals potential issues with data quality, possibly leading to overfitting in the model and issues with generalization, thus posing a significant risk. -###### Strengths +### Strengths - The UniqueRows test is efficient in evaluating the data's diversity across each information column in the dataset. -- This test provides a quick, systematic method to assess data quality based on uniqueness, which can be pivotal in -developing effective and unbiased machine learning models. - -###### Limitations - -- A limitation of the UniqueRows test is its assumption that the data's quality is directly proportionate to its -uniqueness, which may not always hold true. There might be contexts where certain non-unique rows are essential and -should not be overlooked. -- The test does not consider the relative 'importance' of each column in predicting the output, treating all -columns equally. -- This test may not be suitable or useful for categorical variables, where the count of unique categories is -inherently limited. - - +- This test provides a quick, systematic method to assess data quality based on uniqueness, which can be pivotal in developing effective and unbiased machine learning models. +### Limitations - \ No newline at end of file +- A limitation of the UniqueRows test is its assumption that the data's quality is directly proportionate to its uniqueness, which may not always hold true. There might be contexts where certain non-unique rows are essential and should not be overlooked. +- The test does not consider the relative 'importance' of each column in predicting the output, treating all columns equally. +- This test may not be suitable or useful for categorical variables, where the count of unique categories is inherently limited. diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index e0ca55da6..35f0b4a1e 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### WOEBinPlots +## WOEBinPlots[()]{.muted} ```python def WOEBinPlots( @@ -19,53 +14,31 @@ def WOEBinPlots( fig_width: int = 500): ``` -Generates visualizations of Weight of Evidence (WoE) and Information Value (IV) for understanding predictive power -of categorical variables in a data set. +Generates visualizations of Weight of Evidence (WoE) and Information Value (IV) for understanding predictive power of categorical variables in a data set. -###### Purpose +### Purpose -This test is designed to visualize the Weight of Evidence (WoE) and Information Value (IV) for categorical -variables in a provided dataset. By showcasing the data distribution across different categories of each feature, -it aids in understanding each variable's predictive power in the context of a classification-based machine learning -model. Commonly used in credit scoring models, WoE and IV are robust statistical methods for evaluating a -variable's predictive power. +This test is designed to visualize the Weight of Evidence (WoE) and Information Value (IV) for categorical variables in a provided dataset. By showcasing the data distribution across different categories of each feature, it aids in understanding each variable's predictive power in the context of a classification-based machine learning model. Commonly used in credit scoring models, WoE and IV are robust statistical methods for evaluating a variable's predictive power. -###### Test Mechanism +### Test Mechanism -The test implementation follows defined steps. Initially, it selects non-numeric columns from the dataset and -changes them to string type, paving the way for accurate binning. It then performs an automated WoE binning -operation on these selected features, effectively categorizing the potential values of a variable into distinct -bins. After the binning process, the function generates two separate visualizations (a scatter chart for WoE values -and a bar chart for IV) for each variable. These visual presentations are formed according to the spread of each -metric across various categories of each feature. +The test implementation follows defined steps. Initially, it selects non-numeric columns from the dataset and changes them to string type, paving the way for accurate binning. It then performs an automated WoE binning operation on these selected features, effectively categorizing the potential values of a variable into distinct bins. After the binning process, the function generates two separate visualizations (a scatter chart for WoE values and a bar chart for IV) for each variable. These visual presentations are formed according to the spread of each metric across various categories of each feature. -###### Signs of High Risk +### Signs of High Risk - Errors occurring during the binning process. - Challenges in converting non-numeric columns into string data type. -- Misbalance in the distribution of WoE and IV, with certain bins overtaking others conspicuously. This could -denote that the model is disproportionately dependent on certain variables or categories for predictions, an -indication of potential risks to its robustness and generalizability. +- Misbalance in the distribution of WoE and IV, with certain bins overtaking others conspicuously. This could denote that the model is disproportionately dependent on certain variables or categories for predictions, an indication of potential risks to its robustness and generalizability. -###### Strengths +### Strengths -- Provides a detailed visual representation of the relationship between feature categories and the target variable. -This grants an intuitive understanding of each feature's contribution to the model. -- Allows for easy identification of features with high impact, facilitating feature selection and enhancing -comprehension of the model's decision logic. +- Provides a detailed visual representation of the relationship between feature categories and the target variable. This grants an intuitive understanding of each feature's contribution to the model. +- Allows for easy identification of features with high impact, facilitating feature selection and enhancing comprehension of the model's decision logic. - WoE conversions are monotonic, upholding the rank ordering of the original data points, which simplifies analysis. -###### Limitations +### Limitations -- The method is largely reliant on the binning process, and an inappropriate binning threshold or bin number choice -might result in a misrepresentation of the variable's distribution. -- While excellent for categorical data, the encoding of continuous variables into categorical can sometimes lead to -information loss. +- The method is largely reliant on the binning process, and an inappropriate binning threshold or bin number choice might result in a misrepresentation of the variable's distribution. +- While excellent for categorical data, the encoding of continuous variables into categorical can sometimes lead to information loss. - Extreme or outlier values can dramatically affect the computation of WoE and IV, skewing results. -- The method requires a sufficient number of events per bin to generate a reliable information value and weight of -evidence. - - - - - \ No newline at end of file +- The method requires a sufficient number of events per bin to generate a reliable information value and weight of evidence. diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 96c020af3..9c29ebdfc 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### WOEBinTable +## WOEBinTable[()]{.muted} ```python def WOEBinTable( @@ -17,44 +12,28 @@ def WOEBinTable( breaks_adj: list = None): ``` -Assesses the Weight of Evidence (WoE) and Information Value (IV) of each feature to evaluate its predictive power -in a binary classification model. +Assesses the Weight of Evidence (WoE) and Information Value (IV) of each feature to evaluate its predictive power in a binary classification model. -###### Purpose +### Purpose -The Weight of Evidence (WoE) and Information Value (IV) test is designed to evaluate the predictive power of each -feature in a machine learning model. This test generates binned groups of values from each feature, computes the -WoE and IV for each bin, and provides insights into the relationship between each feature and the target variable, -illustrating their contribution to the model's predictive capabilities. +The Weight of Evidence (WoE) and Information Value (IV) test is designed to evaluate the predictive power of each feature in a machine learning model. This test generates binned groups of values from each feature, computes the WoE and IV for each bin, and provides insights into the relationship between each feature and the target variable, illustrating their contribution to the model's predictive capabilities. -###### Test Mechanism +### Test Mechanism -The test uses the `scorecardpy.woebin` method to perform automatic binning of the dataset based on WoE. The method -accepts a list of break points for binning numeric variables through the parameter `breaks_adj`. If no breaks are -provided, it uses default binning. The bins are then used to calculate the WoE and IV values, effectively creating -a dataframe that includes the bin boundaries, WoE, and IV values for each feature. A target variable is required -in the dataset to perform this analysis. +The test uses the `scorecardpy.woebin` method to perform automatic binning of the dataset based on WoE. The method accepts a list of break points for binning numeric variables through the parameter `breaks_adj`. If no breaks are provided, it uses default binning. The bins are then used to calculate the WoE and IV values, effectively creating a dataframe that includes the bin boundaries, WoE, and IV values for each feature. A target variable is required in the dataset to perform this analysis. -###### Signs of High Risk +### Signs of High Risk - High IV values, indicating variables with excessive predictive power which might lead to overfitting. - Errors during the binning process, potentially due to inappropriate data types or poorly defined bins. -###### Strengths +### Strengths -- Highly effective for feature selection in binary classification problems, as it quantifies the predictive -information within each feature concerning the binary outcome. +- Highly effective for feature selection in binary classification problems, as it quantifies the predictive information within each feature concerning the binary outcome. - The WoE transformation creates a monotonic relationship between the target and independent variables. -###### Limitations +### Limitations -- Primarily designed for binary classification tasks, making it less applicable or reliable for multi-class -classification or regression tasks. +- Primarily designed for binary classification tasks, making it less applicable or reliable for multi-class classification or regression tasks. - Potential difficulties if the dataset has many features, non-binnable features, or non-numeric features. -- The metric does not help in distinguishing whether the observed predictive factor is due to data randomness or a -true phenomenon. - - - - - \ No newline at end of file +- The metric does not help in distinguishing whether the observed predictive factor is due to data randomness or a true phenomenon. diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 660d033d1..085a90b81 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ZivotAndrewsArch +## ZivotAndrewsArch[()]{.muted} ```python def ZivotAndrewsArch( @@ -18,42 +13,25 @@ def ZivotAndrewsArch( Evaluates the order of integration and stationarity of time series data using the Zivot-Andrews unit root test. -###### Purpose +### Purpose -The Zivot-Andrews Arch metric is used to evaluate the order of integration for time series data in a machine -learning model. It's designed to test for stationarity, a crucial aspect of time series analysis, where data points -are independent of time. Stationarity means that the statistical properties such as mean, variance, and -autocorrelation are constant over time. +The Zivot-Andrews Arch metric is used to evaluate the order of integration for time series data in a machine learning model. It's designed to test for stationarity, a crucial aspect of time series analysis, where data points are independent of time. Stationarity means that the statistical properties such as mean, variance, and autocorrelation are constant over time. -###### Test Mechanism +### Test Mechanism -The Zivot-Andrews unit root test is performed on each feature in the dataset using the `ZivotAndrews` function from -the `arch.unitroot` module. This function returns several metrics for each feature, including the statistical -value, p-value (probability value), the number of lags used, and the number of observations. The p-value is used to -decide on the null hypothesis (the time series has a unit root and is non-stationary) based on a chosen level of -significance. +The Zivot-Andrews unit root test is performed on each feature in the dataset using the `ZivotAndrews` function from the `arch.unitroot` module. This function returns several metrics for each feature, including the statistical value, p-value (probability value), the number of lags used, and the number of observations. The p-value is used to decide on the null hypothesis (the time series has a unit root and is non-stationary) based on a chosen level of significance. -###### Signs of High Risk +### Signs of High Risk -- A high p-value suggests high risk, indicating insufficient evidence to reject the null hypothesis, implying that -the time series has a unit root and is non-stationary. +- A high p-value suggests high risk, indicating insufficient evidence to reject the null hypothesis, implying that the time series has a unit root and is non-stationary. - Non-stationary time series data can lead to misleading statistics and unreliable machine learning models. -###### Strengths - -- Dynamically tests for stationarity against structural breaks in time series data, offering robust evaluation of -stationarity in features. -- Especially beneficial with financial, economic, or other time-series data where data observations lack a -consistent pattern and structural breaks may occur. - -###### Limitations - -- Assumes data is derived from a single-equation, autoregressive model, making it less appropriate for multivariate -time series data or data not aligning with this model. -- May not account for unexpected shocks or changes in the series trend, both of which can significantly impact data -stationarity. - +### Strengths +- Dynamically tests for stationarity against structural breaks in time series data, offering robust evaluation of stationarity in features. +- Especially beneficial with financial, economic, or other time-series data where data observations lack a consistent pattern and structural breaks may occur. +### Limitations - \ No newline at end of file +- Assumes data is derived from a single-equation, autoregressive model, making it less appropriate for multivariate time series data or data not aligning with this model. +- May not account for unexpected shocks or changes in the series trend, both of which can significantly impact data stationarity. diff --git a/docs/validmind/tests/data_validation/nlp.qmd b/docs/validmind/tests/data_validation/nlp.qmd index 0be8e581a..2901408fa 100644 --- a/docs/validmind/tests/data_validation/nlp.qmd +++ b/docs/validmind/tests/data_validation/nlp.qmd @@ -4,9 +4,6 @@ toc-depth: 3 toc-expand: 3 --- - - - - [CommonWords](nlp/CommonWords.qmd) - [Hashtags](nlp/Hashtags.qmd) - [LanguageDetection](nlp/LanguageDetection.qmd) @@ -17,4 +14,3 @@ toc-expand: 3 - [StopWords](nlp/StopWords.qmd) - [TextDescription](nlp/TextDescription.qmd) - [Toxicity](nlp/Toxicity.qmd) - diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index bfa4bc422..8d9b1343f 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### CommonWords +## CommonWords[()]{.muted} ```python def CommonWords( @@ -18,43 +13,29 @@ def CommonWords( Assesses the most frequent non-stopwords in a text column for identifying prevalent language patterns. -###### Purpose +### Purpose -The CommonWords metric is used to identify and visualize the most prevalent words within a specified text column of -a dataset. This provides insights into the prevalent language patterns and vocabulary, especially useful in Natural -Language Processing (NLP) tasks such as text classification and text summarization. +The CommonWords metric is used to identify and visualize the most prevalent words within a specified text column of a dataset. This provides insights into the prevalent language patterns and vocabulary, especially useful in Natural Language Processing (NLP) tasks such as text classification and text summarization. -###### Test Mechanism +### Test Mechanism -The test methodology involves splitting the specified text column's entries into words, collating them into a -corpus, and then counting the frequency of each word using the Counter. The forty most frequently occurring -non-stopwords are then visualized in an interactive bar chart using Plotly, where the x-axis represents the words, -and the y-axis indicates their frequency of occurrence. +The test methodology involves splitting the specified text column's entries into words, collating them into a corpus, and then counting the frequency of each word using the Counter. The forty most frequently occurring non-stopwords are then visualized in an interactive bar chart using Plotly, where the x-axis represents the words, and the y-axis indicates their frequency of occurrence. -###### Signs of High Risk +### Signs of High Risk - A lack of distinct words within the list, or the most common words being stopwords. - Frequent occurrence of irrelevant or inappropriate words could point out a poorly curated or noisy dataset. -- An error returned due to the absence of a valid Dataset object, indicating high risk as the metric cannot be -effectively implemented without it. +- An error returned due to the absence of a valid Dataset object, indicating high risk as the metric cannot be effectively implemented without it. -###### Strengths +### Strengths -- The metric provides clear insights into the language features – specifically word frequency – of unstructured -text data. +- The metric provides clear insights into the language features – specifically word frequency – of unstructured text data. - It can reveal prominent vocabulary and language patterns, which prove vital for feature extraction in NLP tasks. - The interactive visualization helps in quickly capturing the patterns and understanding the data intuitively. -###### Limitations +### Limitations - The test disregards semantic or context-related information as it solely focuses on word frequency. - It intentionally ignores stopwords, which might carry necessary significance in certain scenarios. -- The applicability is limited to English-language text data as English stopwords are used for filtering, hence -cannot account for data in other languages. -- The metric requires a valid Dataset object, indicating a dependency condition that limits its broader -applicability. - - - - - \ No newline at end of file +- The applicability is limited to English-language text data as English stopwords are used for filtering, hence cannot account for data in other languages. +- The metric requires a valid Dataset object, indicating a dependency condition that limits its broader applicability. diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 714b41bdc..472625743 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### Hashtags +## Hashtags[()]{.muted} ```python def Hashtags( @@ -19,46 +14,29 @@ def Hashtags( Assesses hashtag frequency in a text column, highlighting usage trends and potential dataset bias or spam. -###### Purpose +### Purpose -The Hashtags test is designed to measure the frequency of hashtags used within a given text column in a dataset. It -is particularly useful for natural language processing tasks such as text classification and text summarization. -The goal is to identify common trends and patterns in the use of hashtags, which can serve as critical indicators -or features within a machine learning model. +The Hashtags test is designed to measure the frequency of hashtags used within a given text column in a dataset. It is particularly useful for natural language processing tasks such as text classification and text summarization. The goal is to identify common trends and patterns in the use of hashtags, which can serve as critical indicators or features within a machine learning model. -###### Test Mechanism +### Test Mechanism -The test implements a regular expression (regex) to extract all hashtags from the specified text column. For each -hashtag found, it makes a tally of its occurrences. It then outputs a list of the top N hashtags (default is 25, -but customizable), sorted by their counts in descending order. The results are also visualized in a bar plot, with -frequency counts on the y-axis and the corresponding hashtags on the x-axis. +The test implements a regular expression (regex) to extract all hashtags from the specified text column. For each hashtag found, it makes a tally of its occurrences. It then outputs a list of the top N hashtags (default is 25, but customizable), sorted by their counts in descending order. The results are also visualized in a bar plot, with frequency counts on the y-axis and the corresponding hashtags on the x-axis. -###### Signs of High Risk +### Signs of High Risk -- A low diversity in the usage of hashtags, as indicated by a few hashtags being used disproportionately more than -others. +- A low diversity in the usage of hashtags, as indicated by a few hashtags being used disproportionately more than others. - Repeated usage of one or few hashtags can be indicative of spam or a biased dataset. -- If there are no or extremely few hashtags found in the dataset, it perhaps signifies that the text data does not -contain structured social media data. +- If there are no or extremely few hashtags found in the dataset, it perhaps signifies that the text data does not contain structured social media data. -###### Strengths +### Strengths -- Provides a concise visual representation of the frequency of hashtags, which can be critical for understanding -trends about a particular topic in text data. -- Instrumental in tasks specifically related to social media text analytics, such as opinion analysis and trend -discovery. +- Provides a concise visual representation of the frequency of hashtags, which can be critical for understanding trends about a particular topic in text data. +- Instrumental in tasks specifically related to social media text analytics, such as opinion analysis and trend discovery. - Adaptable, allowing the flexibility to determine the number of top hashtags to be analyzed. -###### Limitations +### Limitations -- Assumes the presence of hashtags and therefore may not be applicable for text datasets that do not contain -hashtags (e.g., formal documents, scientific literature). +- Assumes the presence of hashtags and therefore may not be applicable for text datasets that do not contain hashtags (e.g., formal documents, scientific literature). - Language-specific limitations of hashtag formulations are not taken into account. - Does not account for typographical errors, variations, or synonyms in hashtags. -- Does not provide context or sentiment associated with the hashtags, so the information provided may have limited -utility on its own. - - - - - \ No newline at end of file +- Does not provide context or sentiment associated with the hashtags, so the information provided may have limited utility on its own. diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 87086c43a..999faa7fd 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### LanguageDetection +## LanguageDetection[()]{.muted} ```python def LanguageDetection( @@ -18,43 +13,34 @@ def LanguageDetection( Assesses the diversity of languages in a textual dataset by detecting and visualizing the distribution of languages. -###### Purpose +### Purpose -The Language Detection test aims to identify and visualize the distribution of languages present within a textual -dataset. This test helps in understanding the diversity of languages in the data, which is crucial for developing -and validating multilingual models. +The Language Detection test aims to identify and visualize the distribution of languages present within a textual dataset. This test helps in understanding the diversity of languages in the data, which is crucial for developing and validating multilingual models. -###### Test Mechanism +### Test Mechanism This test operates by: - Checking if the dataset has a specified text column. - Using a language detection library to determine the language of each text entry in the dataset. -- Generating a histogram plot of the language distribution, with language codes on the x-axis and their frequencies -on the y-axis. +- Generating a histogram plot of the language distribution, with language codes on the x-axis and their frequencies on the y-axis. If the text column is not specified, a ValueError is raised to ensure proper dataset configuration. -###### Signs of High Risk +### Signs of High Risk - A high proportion of entries returning "Unknown" language codes. - Detection of unexpectedly diverse or incorrect language codes, indicating potential data quality issues. - Significant imbalance in language distribution, which might indicate potential biases in the dataset. -###### Strengths +### Strengths - Provides a visual representation of language diversity within the dataset. - Helps identify data quality issues related to incorrect or unknown language detection. - Useful for ensuring that multilingual models have adequate and appropriate representation from various languages. -###### Limitations +### Limitations - Dependency on the accuracy of the language detection library, which may not be perfect. - Languages with similar structures or limited text length may be incorrectly classified. -- The test returns "Unknown" for entries where language detection fails, which might mask underlying issues with -certain languages or text formats. - - - - - \ No newline at end of file +- The test returns "Unknown" for entries where language detection fails, which might mask underlying issues with certain languages or text formats. diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index b7a23bb78..d62e93b1a 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### Mentions +## Mentions[()]{.muted} ```python def Mentions( @@ -19,44 +14,27 @@ def Mentions( Calculates and visualizes frequencies of '@' prefixed mentions in a text-based dataset for NLP model analysis. -###### Purpose +### Purpose -The "Mentions" test is designed to gauge the quality of data in a Natural Language Processing (NLP) or text-focused -Machine Learning model. The primary objective is to identify and calculate the frequency of 'mentions' within a -chosen text column of a dataset. A 'mention' in this context refers to individual text elements that are prefixed -by '@'. The output of this test reveals the most frequently mentioned entities or usernames, which can be integral -for applications such as social media analyses or customer sentiment analyses. +The "Mentions" test is designed to gauge the quality of data in a Natural Language Processing (NLP) or text-focused Machine Learning model. The primary objective is to identify and calculate the frequency of 'mentions' within a chosen text column of a dataset. A 'mention' in this context refers to individual text elements that are prefixed by '@'. The output of this test reveals the most frequently mentioned entities or usernames, which can be integral for applications such as social media analyses or customer sentiment analyses. -###### Test Mechanism +### Test Mechanism -The test first verifies the existence of a text column in the provided dataset. It then employs a regular -expression pattern to extract mentions from the text. Subsequently, the frequency of each unique mention is -calculated. The test selects the most frequent mentions based on default or user-defined parameters, the default -being the top 25, for representation. This process of thresholding forms the core of the test. A treemap plot -visualizes the test results, where the size of each rectangle corresponds to the frequency of a particular mention. +The test first verifies the existence of a text column in the provided dataset. It then employs a regular expression pattern to extract mentions from the text. Subsequently, the frequency of each unique mention is calculated. The test selects the most frequent mentions based on default or user-defined parameters, the default being the top 25, for representation. This process of thresholding forms the core of the test. A treemap plot visualizes the test results, where the size of each rectangle corresponds to the frequency of a particular mention. -###### Signs of High Risk +### Signs of High Risk - The lack of a valid text column in the dataset, which would result in the failure of the test execution. -- The absence of any mentions within the text data, indicating that there might not be any text associated with -'@'. This situation could point toward sparse or poor-quality data, thereby hampering the model's generalization or -learning capabilities. +- The absence of any mentions within the text data, indicating that there might not be any text associated with '@'. This situation could point toward sparse or poor-quality data, thereby hampering the model's generalization or learning capabilities. -###### Strengths +### Strengths - The test is specifically optimized for text-based datasets which gives it distinct power in the context of NLP. - It enables quick identification and visually appealing representation of the predominant elements or mentions. - It can provide crucial insights about the most frequently mentioned entities or usernames. -###### Limitations +### Limitations -- The test only recognizes mentions that are prefixed by '@', hence useful textual aspects not preceded by '@' -might be ignored. +- The test only recognizes mentions that are prefixed by '@', hence useful textual aspects not preceded by '@' might be ignored. - This test isn't suited for datasets devoid of textual data. -- It does not provide insights on less frequently occurring data or outliers, which means potentially significant -patterns could be overlooked. - - - - - \ No newline at end of file +- It does not provide insights on less frequently occurring data or outliers, which means potentially significant patterns could be overlooked. diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index 3960d5a5c..fb329503b 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### PolarityAndSubjectivity +## PolarityAndSubjectivity[()]{.muted} ```python def PolarityAndSubjectivity( @@ -20,41 +15,32 @@ def PolarityAndSubjectivity( Analyzes the polarity and subjectivity of text data within a given dataset to visualize the sentiment distribution. -###### Purpose +### Purpose -The Polarity and Subjectivity test is designed to evaluate the sentiment expressed in textual data. By analyzing -these aspects, it helps to identify the emotional tone and subjectivity of the dataset, which could be crucial in -understanding customer feedback, social media sentiments, or other text-related data. +The Polarity and Subjectivity test is designed to evaluate the sentiment expressed in textual data. By analyzing these aspects, it helps to identify the emotional tone and subjectivity of the dataset, which could be crucial in understanding customer feedback, social media sentiments, or other text-related data. -###### Test Mechanism +### Test Mechanism -This test uses TextBlob to compute the polarity and subjectivity scores of textual data in a given dataset. The -mechanism includes: +This test uses TextBlob to compute the polarity and subjectivity scores of textual data in a given dataset. The mechanism includes: - Iterating through each text entry in the specified column of the dataset. -- Applying the TextBlob library to compute the polarity (ranging from -1 for negative sentiment to +1 for positive -sentiment) and subjectivity (ranging from 0 for objective to 1 for subjective) for each entry. +- Applying the TextBlob library to compute the polarity (ranging from -1 for negative sentiment to +1 for positive sentiment) and subjectivity (ranging from 0 for objective to 1 for subjective) for each entry. - Creating a scatter plot using Plotly to visualize the relationship between polarity and subjectivity. -###### Signs of High Risk +### Signs of High Risk - High concentration of negative polarity values indicating prevalent negative sentiments. - High subjectivity scores suggesting the text data is largely opinion-based rather than factual. - Disproportionate clusters of extreme scores (e.g., many points near -1 or +1 polarity). -###### Strengths +### Strengths - Quantifies sentiment and subjectivity which can provide actionable insights. - Visualizes sentiment distribution, aiding in easy interpretation. - Utilizes well-established TextBlob library for sentiment analysis. -###### Limitations +### Limitations - Polarity and subjectivity calculations may oversimplify nuanced text sentiments. - Reliance on TextBlob which may not be accurate for all domains or contexts. - Visualization could become cluttered with very large datasets, making interpretation difficult. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index af0c4aaf7..c59c498da 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -6,15 +6,7 @@ toc-expand: 3 Metrics functions for any Pandas-compatible datasets - - - - - - - - -#### Punctuations +## Punctuations[()]{.muted} ```python def Punctuations( @@ -24,41 +16,27 @@ def Punctuations( Analyzes and visualizes the frequency distribution of punctuation usage in a given text dataset. -###### Purpose +### Purpose -The Punctuations Metric's primary purpose is to analyze the frequency of punctuation usage within a given text -dataset. This is often used in Natural Language Processing tasks, such as text classification and text -summarization. +The Punctuations Metric's primary purpose is to analyze the frequency of punctuation usage within a given text dataset. This is often used in Natural Language Processing tasks, such as text classification and text summarization. -###### Test Mechanism +### Test Mechanism -The test begins by verifying that the input "dataset" is of the type VMDataset. The count_mode parameter must be -either "token" (counts punctuation marks as individual tokens) or "word" (counts punctuation marks within words). -Following that, a corpus is created from the dataset by splitting its text on spaces. Each unique punctuation -character in the text corpus is then tallied. The frequency distribution of each punctuation symbol is visualized -as a bar graph, with these results being stored as Figures and associated with the main Punctuations object. +The test begins by verifying that the input "dataset" is of the type VMDataset. The count_mode parameter must be either "token" (counts punctuation marks as individual tokens) or "word" (counts punctuation marks within words). Following that, a corpus is created from the dataset by splitting its text on spaces. Each unique punctuation character in the text corpus is then tallied. The frequency distribution of each punctuation symbol is visualized as a bar graph, with these results being stored as Figures and associated with the main Punctuations object. -###### Signs of High Risk +### Signs of High Risk -- Excessive or unusual frequency of specific punctuation marks, potentially denoting dubious quality, data -corruption, or skewed data. +- Excessive or unusual frequency of specific punctuation marks, potentially denoting dubious quality, data corruption, or skewed data. -###### Strengths +### Strengths - Provides valuable insights into the distribution of punctuation usage in a text dataset. - Important in validating the quality, consistency, and nature of the data. -- Can provide hints about the style or tonality of the text corpus, such as informal and emotional context -indicated by frequent exclamation marks. +- Can provide hints about the style or tonality of the text corpus, such as informal and emotional context indicated by frequent exclamation marks. -###### Limitations +### Limitations - Focuses solely on punctuation usage, potentially missing other important textual characteristics. -- General cultural or tonality assumptions based on punctuation distribution can be misguiding, as these vary -across different languages and contexts. +- General cultural or tonality assumptions based on punctuation distribution can be misguiding, as these vary across different languages and contexts. - Less effective with languages that use non-standard or different punctuation. - Visualization may lack interpretability when there are many unique punctuation marks in the dataset. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index a00bc2c88..85ae0273f 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### Sentiment +## Sentiment[()]{.muted} ```python def Sentiment( @@ -18,37 +13,28 @@ def Sentiment( Analyzes the sentiment of text data within a dataset using the VADER sentiment analysis tool. -###### Purpose +### Purpose -The Sentiment test evaluates the overall sentiment of text data within a dataset. By analyzing sentiment scores, it -aims to ensure that the model is interpreting text data accurately and is not biased towards a particular sentiment. +The Sentiment test evaluates the overall sentiment of text data within a dataset. By analyzing sentiment scores, it aims to ensure that the model is interpreting text data accurately and is not biased towards a particular sentiment. -###### Test Mechanism +### Test Mechanism -This test uses the VADER (Valence Aware Dictionary and sEntiment Reasoner) SentimentIntensityAnalyzer. It processes -each text entry in a specified column of the dataset to calculate the compound sentiment score, which represents -the overall sentiment polarity. The distribution of these sentiment scores is then visualized using a KDE (Kernel -Density Estimation) plot, highlighting any skewness or concentration in sentiment. +This test uses the VADER (Valence Aware Dictionary and sEntiment Reasoner) SentimentIntensityAnalyzer. It processes each text entry in a specified column of the dataset to calculate the compound sentiment score, which represents the overall sentiment polarity. The distribution of these sentiment scores is then visualized using a KDE (Kernel Density Estimation) plot, highlighting any skewness or concentration in sentiment. -###### Signs of High Risk +### Signs of High Risk - Extreme polarity in sentiment scores, indicating potential bias. - Unusual concentration of sentiment scores in a specific range. - Significant deviation from expected sentiment distribution for the given text data. -###### Strengths +### Strengths - Provides a clear visual representation of sentiment distribution. - Uses a well-established sentiment analysis tool (VADER). - Can handle a wide range of text data, making it flexible for various applications. -###### Limitations +### Limitations - May not capture nuanced or context-specific sentiments. - Relies heavily on the accuracy of the VADER sentiment analysis tool. - Visualization alone may not provide comprehensive insights into underlying causes of sentiment distribution. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index a0b7de3ff..e9500ae84 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -6,15 +6,7 @@ toc-expand: 3 Threshold based tests - - - - - - - - -#### StopWords +## StopWords[()]{.muted} ```python def StopWords( @@ -25,51 +17,29 @@ def StopWords( Evaluates and visualizes the frequency of English stop words in a text dataset against a defined threshold. -###### Purpose +### Purpose -The StopWords threshold test is a tool designed for assessing the quality of text data in an ML model. It focuses -on the identification and analysis of "stop words" in a given dataset. Stop words are frequent, common, yet -semantically insignificant words (for example**: "the", "and", "is") in a language. This test evaluates the -proportion of stop words to the total word count in the dataset, in essence, scrutinizing the frequency of stop -word usage. The core objective is to highlight the prevalent stop words based on their usage frequency, which can -be instrumental in cleaning the data from noise and improving ML model performance. +The StopWords threshold test is a tool designed for assessing the quality of text data in an ML model. It focuses on the identification and analysis of "stop words" in a given dataset. Stop words are frequent, common, yet semantically insignificant words (for example: "the", "and", "is") in a language. This test evaluates the proportion of stop words to the total word count in the dataset, in essence, scrutinizing the frequency of stop word usage. The core objective is to highlight the prevalent stop words based on their usage frequency, which can be instrumental in cleaning the data from noise and improving ML model performance. -###### Test Mechanism +### Test Mechanism -The StopWords test initiates on receiving an input of a 'VMDataset' object. Absence of such an object will trigger -an error. The methodology involves inspection of the text column of the VMDataset to create a 'corpus' (a -collection of written texts). Leveraging the Natural Language Toolkit's (NLTK) stop word repository, the test -screens the corpus for any stop words and documents their frequency. It further calculates the percentage usage of -each stop word compared to the total word count in the corpus. This percentage is evaluated against a predefined -'min_percent_threshold'. If this threshold is breached, the test returns a failed output. Top prevailing stop words -along with their usage percentages are returned, facilitated by a bar chart visualization of these stop words and -their frequency. +The StopWords test initiates on receiving an input of a 'VMDataset' object. Absence of such an object will trigger an error. The methodology involves inspection of the text column of the VMDataset to create a 'corpus' (a collection of written texts). Leveraging the Natural Language Toolkit's (NLTK) stop word repository, the test screens the corpus for any stop words and documents their frequency. It further calculates the percentage usage of each stop word compared to the total word count in the corpus. This percentage is evaluated against a predefined 'min_percent_threshold'. If this threshold is breached, the test returns a failed output. Top prevailing stop words along with their usage percentages are returned, facilitated by a bar chart visualization of these stop words and their frequency. -###### Signs of High Risk +### Signs of High Risk - A percentage of any stop words exceeding the predefined 'min_percent_threshold'. -- High frequency of stop words in the dataset which may adversely affect the application's analytical performance -due to noise creation. +- High frequency of stop words in the dataset which may adversely affect the application's analytical performance due to noise creation. -###### Strengths +### Strengths - The ability to scrutinize and quantify the usage of stop words. - Provides insights into potential noise in the text data due to stop words. - Directly aids in enhancing model training efficiency. -- Includes a bar chart visualization feature to easily interpret and action upon the stop words frequency -information. +- Includes a bar chart visualization feature to easily interpret and action upon the stop words frequency information. -###### Limitations +### Limitations - The test only supports English stop words, making it less effective with datasets of other languages. -- The 'min_percent_threshold' parameter may require fine-tuning for different datasets, impacting the overall -effectiveness of the test. -- Contextual use of the stop words within the dataset is not considered, potentially overlooking their significance -in certain contexts. -- The test focuses specifically on the frequency of stop words, not providing direct measures of model performance -or predictive accuracy. - - - - - \ No newline at end of file +- The 'min_percent_threshold' parameter may require fine-tuning for different datasets, impacting the overall effectiveness of the test. +- Contextual use of the stop words within the dataset is not considered, potentially overlooking their significance in certain contexts. +- The test focuses specifically on the frequency of stop words, not providing direct measures of model performance or predictive accuracy. diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 3e0d8e7c6..c90e7fc87 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### create_metrics_df +## create_metrics_df[()]{.muted} ```python def create_metrics_df( @@ -19,8 +14,7 @@ def create_metrics_df( lang): ``` - -#### TextDescription +## TextDescription[()]{.muted} ```python def TextDescription( @@ -29,28 +23,22 @@ def TextDescription( lang: str = 'english'): ``` -Conducts comprehensive textual analysis on a dataset using NLTK to evaluate various parameters and generate -visualizations. +Conducts comprehensive textual analysis on a dataset using NLTK to evaluate various parameters and generate visualizations. -###### Purpose +### Purpose -The TextDescription test aims to conduct a thorough textual analysis of a dataset using the NLTK (Natural Language -Toolkit) library. It evaluates various metrics such as total words, total sentences, average sentence length, total -paragraphs, total unique words, most common words, total punctuations, and lexical diversity. The goal is to -understand the nature of the text and anticipate challenges machine learning models might face in text processing, -language understanding, or summarization tasks. +The TextDescription test aims to conduct a thorough textual analysis of a dataset using the NLTK (Natural Language Toolkit) library. It evaluates various metrics such as total words, total sentences, average sentence length, total paragraphs, total unique words, most common words, total punctuations, and lexical diversity. The goal is to understand the nature of the text and anticipate challenges machine learning models might face in text processing, language understanding, or summarization tasks. -###### Test Mechanism +### Test Mechanism The test works by: - Parsing the dataset and tokenizing the text into words, sentences, and paragraphs using NLTK. - Removing stopwords and unwanted tokens. -- Calculating parameters like total words, total sentences, average sentence length, total paragraphs, total unique -words, total punctuations, and lexical diversity. +- Calculating parameters like total words, total sentences, average sentence length, total paragraphs, total unique words, total punctuations, and lexical diversity. - Generating scatter plots to visualize correlations between various metrics (e.g., Total Words vs Total Sentences). -###### Signs of High Risk +### Signs of High Risk - Anomalies or increased complexity in lexical diversity. - Longer sentences and paragraphs. @@ -58,20 +46,15 @@ words, total punctuations, and lexical diversity. - Large number of unwanted tokens. - Missing or erroneous visualizations. -###### Strengths +### Strengths - Essential for pre-processing text data in machine learning models. - Provides a comprehensive breakdown of text data, aiding in understanding its complexity. - Generates visualizations to help comprehend text structure and complexity. -###### Limitations +### Limitations - Highly dependent on the NLTK library, limiting the test to supported languages. - Limited customization for removing undesirable tokens and stop words. - Does not consider semantic or grammatical complexities. - Assumes well-structured documents, which may result in inaccuracies with poorly formatted text. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index 0eca0c3cb..3b5252377 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### Toxicity +## Toxicity[()]{.muted} ```python def Toxicity( @@ -18,41 +13,33 @@ def Toxicity( Assesses the toxicity of text data within a dataset to visualize the distribution of toxicity scores. -###### Purpose +### Purpose -The Toxicity test aims to evaluate the level of toxic content present in a text dataset by leveraging a pre-trained -toxicity model. It helps in identifying potentially harmful or offensive language that may negatively impact users -or stakeholders. +The Toxicity test aims to evaluate the level of toxic content present in a text dataset by leveraging a pre-trained toxicity model. It helps in identifying potentially harmful or offensive language that may negatively impact users or stakeholders. -###### Test Mechanism +### Test Mechanism -This test uses a pre-trained toxicity evaluation model and applies it to each text entry in the specified column of -a dataset’s dataframe. The procedure involves: +This test uses a pre-trained toxicity evaluation model and applies it to each text entry in the specified column of a dataset’s dataframe. The procedure involves: - Loading a pre-trained toxicity model. - Extracting the text from the specified column in the dataset. - Computing toxicity scores for each text entry. - Generating a KDE (Kernel Density Estimate) plot to visualize the distribution of these toxicity scores. -###### Signs of High Risk +### Signs of High Risk - High concentration of high toxicity scores in the KDE plot. - A significant proportion of text entries with toxicity scores above a predefined threshold. - Wide distribution of toxicity scores, indicating inconsistency in content quality. -###### Strengths +### Strengths - Provides a visual representation of toxicity distribution, making it easier to identify outliers. - Uses a robust pre-trained model for toxicity evaluation. - Can process large text datasets efficiently. -###### Limitations +### Limitations - Depends on the accuracy and bias of the pre-trained toxicity model. - Does not provide context-specific insights, which may be necessary for nuanced understanding. - May not capture all forms of subtle or indirect toxic language. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation.qmd b/docs/validmind/tests/model_validation.qmd index 9ac235ec6..43c00931d 100644 --- a/docs/validmind/tests/model_validation.qmd +++ b/docs/validmind/tests/model_validation.qmd @@ -4,9 +4,6 @@ toc-depth: 3 toc-expand: 3 --- - - - - [BertScore](model_validation/BertScore.qmd) - [BleuScore](model_validation/BleuScore.qmd) - [ClusterSizeDistribution](model_validation/ClusterSizeDistribution.qmd) @@ -25,4 +22,3 @@ toc-expand: 3 - [TimeSeriesR2SquareBySegments](model_validation/TimeSeriesR2SquareBySegments.qmd) - [TokenDisparity](model_validation/TokenDisparity.qmd) - [ToxicityScore](model_validation/ToxicityScore.qmd) - diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 4fdc1bf6e..687c64be3 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### BertScore +## BertScore[()]{.muted} ```python def BertScore( @@ -18,53 +13,31 @@ def BertScore( evaluation_model = 'distilbert-base-uncased'): ``` -Assesses the quality of machine-generated text using BERTScore metrics and visualizes results through histograms -and bar charts, alongside compiling a comprehensive table of descriptive statistics. +Assesses the quality of machine-generated text using BERTScore metrics and visualizes results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics. -###### Purpose +### Purpose -This function is designed to assess the quality of text generated by machine learning models using BERTScore -metrics. BERTScore evaluates text generation models' performance by calculating precision, recall, and F1 score -based on BERT contextual embeddings. +This function is designed to assess the quality of text generated by machine learning models using BERTScore metrics. BERTScore evaluates text generation models' performance by calculating precision, recall, and F1 score based on BERT contextual embeddings. -###### Test Mechanism +### Test Mechanism -The function starts by extracting the true and predicted values from the provided dataset and model. It then -initializes the BERTScore evaluator. For each pair of true and predicted texts, the function calculates the -BERTScore metrics and compiles them into a dataframe. Histograms and bar charts are generated for each BERTScore -metric (Precision, Recall, and F1 Score) to visualize their distribution. Additionally, a table of descriptive -statistics (mean, median, standard deviation, minimum, and maximum) is compiled for each metric, providing a -comprehensive summary of the model's performance. The test uses the `evaluation_model` param to specify the -huggingface model to use for evaluation. `microsoft/deberta-xlarge-mnli` is the best-performing model but is -very large and may be slow without a GPU. `microsoft/deberta-large-mnli` is a smaller model that is faster to -run and `distilbert-base-uncased` is much lighter and can run on a CPU but is less accurate. +The function starts by extracting the true and predicted values from the provided dataset and model. It then initializes the BERTScore evaluator. For each pair of true and predicted texts, the function calculates the BERTScore metrics and compiles them into a dataframe. Histograms and bar charts are generated for each BERTScore metric (Precision, Recall, and F1 Score) to visualize their distribution. Additionally, a table of descriptive statistics (mean, median, standard deviation, minimum, and maximum) is compiled for each metric, providing a comprehensive summary of the model's performance. The test uses the `evaluation_model` param to specify the huggingface model to use for evaluation. `microsoft/deberta-xlarge-mnli` is the best-performing model but is very large and may be slow without a GPU. `microsoft/deberta-large-mnli` is a smaller model that is faster to run and `distilbert-base-uncased` is much lighter and can run on a CPU but is less accurate. -###### Signs of High Risk +### Signs of High Risk -- Consistently low scores across BERTScore metrics could indicate poor quality in the generated text, suggesting -that the model fails to capture the essential content of the reference texts. +- Consistently low scores across BERTScore metrics could indicate poor quality in the generated text, suggesting that the model fails to capture the essential content of the reference texts. - Low precision scores might suggest that the generated text contains a lot of redundant or irrelevant information. - Low recall scores may indicate that important information from the reference text is being omitted. -- An imbalanced performance between precision and recall, reflected by a low F1 Score, could signal issues in the -model's ability to balance informativeness and conciseness. +- An imbalanced performance between precision and recall, reflected by a low F1 Score, could signal issues in the model's ability to balance informativeness and conciseness. -###### Strengths +### Strengths -- Provides a multifaceted evaluation of text quality through different BERTScore metrics, offering a detailed view -of model performance. -- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of the -scores. +- Provides a multifaceted evaluation of text quality through different BERTScore metrics, offering a detailed view of model performance. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of the scores. - Descriptive statistics offer a concise summary of the model's strengths and weaknesses in generating text. -###### Limitations +### Limitations -- BERTScore relies on the contextual embeddings from BERT models, which may not fully capture all nuances of text -similarity. +- BERTScore relies on the contextual embeddings from BERT models, which may not fully capture all nuances of text similarity. - The evaluation relies on the availability of high-quality reference texts, which may not always be obtainable. -- While useful for comparison, BERTScore metrics alone do not provide a complete assessment of a model's -performance and should be supplemented with other metrics and qualitative analysis. - - - - - \ No newline at end of file +- While useful for comparison, BERTScore metrics alone do not provide a complete assessment of a model's performance and should be supplemented with other metrics and qualitative analysis. diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 21ef99d4e..7b2d005e2 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### BleuScore +## BleuScore[()]{.muted} ```python def BleuScore( @@ -17,50 +12,31 @@ def BleuScore( model): ``` -Evaluates the quality of machine-generated text using BLEU metrics and visualizes the results through histograms -and bar charts, alongside compiling a comprehensive table of descriptive statistics for BLEU scores. +Evaluates the quality of machine-generated text using BLEU metrics and visualizes the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for BLEU scores. -###### Purpose +### Purpose -This function is designed to assess the quality of text generated by machine learning models using the BLEU metric. -BLEU, which stands for Bilingual Evaluation Understudy, is a metric used to evaluate the overlap of n-grams between -the machine-generated text and reference texts. This evaluation is crucial for tasks such as text summarization, -machine translation, and text generation, where the goal is to produce text that accurately reflects the content -and meaning of human-crafted references. +This function is designed to assess the quality of text generated by machine learning models using the BLEU metric. BLEU, which stands for Bilingual Evaluation Understudy, is a metric used to evaluate the overlap of n-grams between the machine-generated text and reference texts. This evaluation is crucial for tasks such as text summarization, machine translation, and text generation, where the goal is to produce text that accurately reflects the content and meaning of human-crafted references. -###### Test Mechanism +### Test Mechanism -The function starts by extracting the true and predicted values from the provided dataset and model. It then -initializes the BLEU evaluator. For each pair of true and predicted texts, the function calculates the BLEU scores -and compiles them into a dataframe. Histograms and bar charts are generated for the BLEU scores to visualize their -distribution. Additionally, a table of descriptive statistics (mean, median, standard deviation, minimum, and -maximum) is compiled for the BLEU scores, providing a comprehensive summary of the model's performance. +The function starts by extracting the true and predicted values from the provided dataset and model. It then initializes the BLEU evaluator. For each pair of true and predicted texts, the function calculates the BLEU scores and compiles them into a dataframe. Histograms and bar charts are generated for the BLEU scores to visualize their distribution. Additionally, a table of descriptive statistics (mean, median, standard deviation, minimum, and maximum) is compiled for the BLEU scores, providing a comprehensive summary of the model's performance. -###### Signs of High Risk +### Signs of High Risk -- Consistently low BLEU scores could indicate poor quality in the generated text, suggesting that the model fails -to capture the essential content of the reference texts. +- Consistently low BLEU scores could indicate poor quality in the generated text, suggesting that the model fails to capture the essential content of the reference texts. - Low precision scores might suggest that the generated text contains a lot of redundant or irrelevant information. - Low recall scores may indicate that important information from the reference text is being omitted. -- An imbalanced performance between precision and recall, reflected by a low BLEU score, could signal issues in the -model's ability to balance informativeness and conciseness. +- An imbalanced performance between precision and recall, reflected by a low BLEU score, could signal issues in the model's ability to balance informativeness and conciseness. -###### Strengths +### Strengths - Provides a straightforward and widely-used evaluation of text quality through BLEU scores. -- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of the -scores. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of the scores. - Descriptive statistics offer a concise summary of the model's strengths and weaknesses in generating text. -###### Limitations +### Limitations -- BLEU metrics primarily focus on n-gram overlap and may not fully capture semantic coherence, fluency, or -grammatical quality of the text. +- BLEU metrics primarily focus on n-gram overlap and may not fully capture semantic coherence, fluency, or grammatical quality of the text. - The evaluation relies on the availability of high-quality reference texts, which may not always be obtainable. -- While useful for comparison, BLEU scores alone do not provide a complete assessment of a model's performance and -should be supplemented with other metrics and qualitative analysis. - - - - - \ No newline at end of file +- While useful for comparison, BLEU scores alone do not provide a complete assessment of a model's performance and should be supplemented with other metrics and qualitative analysis. diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 69b07143a..db7a28a47 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ClusterSizeDistribution +## ClusterSizeDistribution[()]{.muted} ```python def ClusterSizeDistribution( @@ -17,47 +12,36 @@ def ClusterSizeDistribution( model: VMModel): ``` -Assesses the performance of clustering models by comparing the distribution of cluster sizes in model predictions -with the actual data. +Assesses the performance of clustering models by comparing the distribution of cluster sizes in model predictions with the actual data. -###### Purpose +### Purpose -The Cluster Size Distribution test aims to assess the performance of clustering models by comparing the -distribution of cluster sizes in the model's predictions with the actual data. This comparison helps determine if -the clustering model's output aligns well with the true cluster distribution, providing insights into the model's -accuracy and performance. +The Cluster Size Distribution test aims to assess the performance of clustering models by comparing the distribution of cluster sizes in the model's predictions with the actual data. This comparison helps determine if the clustering model's output aligns well with the true cluster distribution, providing insights into the model's accuracy and performance. -###### Test Mechanism +### Test Mechanism The test mechanism involves the following steps: - Run the clustering model on the provided dataset to obtain predictions. - Convert both the actual and predicted outputs into pandas dataframes. - Use pandas built-in functions to derive the cluster size distributions from these dataframes. -- Construct two histograms**: one for the actual cluster size distribution and one for the predicted distribution. +- Construct two histograms: one for the actual cluster size distribution and one for the predicted distribution. - Plot the histograms side-by-side for visual comparison. -###### Signs of High Risk +### Signs of High Risk - Discrepancies between the actual cluster size distribution and the predicted cluster size distribution. - Irregular distribution of data across clusters in the predicted outcomes. - High number of outlier clusters suggesting the model struggles to correctly group data. -###### Strengths +### Strengths - Provides a visual and intuitive way to compare the clustering model's performance against actual data. - Effectively reveals where the model may be over- or underestimating cluster sizes. - Versatile as it works well with any clustering model. -###### Limitations +### Limitations - Assumes that the actual cluster distribution is optimal, which may not always be the case. -- Relies heavily on visual comparison, which could be subjective and may not offer a precise numerical measure of -performance. -- May not fully capture other important aspects of clustering, such as cluster density, distances between clusters, -and the shape of clusters. - - - - - \ No newline at end of file +- Relies heavily on visual comparison, which could be subjective and may not offer a precise numerical measure of performance. +- May not fully capture other important aspects of clustering, such as cluster density, distances between clusters, and the shape of clusters. diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 43967f680..161951a2f 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ContextualRecall +## ContextualRecall[()]{.muted} ```python def ContextualRecall( @@ -17,51 +12,29 @@ def ContextualRecall( model): ``` -Evaluates a Natural Language Generation model's ability to generate contextually relevant and factually correct -text, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of -descriptive statistics for contextual recall scores. +Evaluates a Natural Language Generation model's ability to generate contextually relevant and factually correct text, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for contextual recall scores. -###### Purpose +### Purpose -The Contextual Recall metric is used to evaluate the ability of a natural language generation (NLG) model to -generate text that appropriately reflects the given context or prompt. It measures the model's capability to -remember and reproduce the main context in its resulting output. This metric is critical in natural language -processing tasks, as the coherency and contextuality of the generated text are essential. +The Contextual Recall metric is used to evaluate the ability of a natural language generation (NLG) model to generate text that appropriately reflects the given context or prompt. It measures the model's capability to remember and reproduce the main context in its resulting output. This metric is critical in natural language processing tasks, as the coherency and contextuality of the generated text are essential. -###### Test Mechanism +### Test Mechanism -The function starts by extracting the true and predicted values from the provided dataset and model. It then -tokenizes the reference and candidate texts into discernible words or tokens using NLTK. The token overlap between -the reference and candidate texts is identified, and the Contextual Recall score is computed by dividing the number -of overlapping tokens by the total number of tokens in the reference text. Scores are calculated for each test -dataset instance, resulting in an array of scores. These scores are visualized using a histogram and a bar chart to -show score variations across different rows. Additionally, a table of descriptive statistics (mean, median, -standard deviation, minimum, and maximum) is compiled for the contextual recall scores, providing a comprehensive -summary of the model's performance. +The function starts by extracting the true and predicted values from the provided dataset and model. It then tokenizes the reference and candidate texts into discernible words or tokens using NLTK. The token overlap between the reference and candidate texts is identified, and the Contextual Recall score is computed by dividing the number of overlapping tokens by the total number of tokens in the reference text. Scores are calculated for each test dataset instance, resulting in an array of scores. These scores are visualized using a histogram and a bar chart to show score variations across different rows. Additionally, a table of descriptive statistics (mean, median, standard deviation, minimum, and maximum) is compiled for the contextual recall scores, providing a comprehensive summary of the model's performance. -###### Signs of High Risk +### Signs of High Risk -- Low contextual recall scores could indicate that the model is not effectively reflecting the original context in -its output, leading to incoherent or contextually misaligned text. +- Low contextual recall scores could indicate that the model is not effectively reflecting the original context in its output, leading to incoherent or contextually misaligned text. - A consistent trend of low recall scores could suggest underperformance of the model. -###### Strengths +### Strengths -- Provides a quantifiable measure of a model's adherence to the context and factual elements of the generated -narrative. -- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of -contextual recall scores. -- Descriptive statistics offer a concise summary of the model's performance in generating contextually relevant -texts. +- Provides a quantifiable measure of a model's adherence to the context and factual elements of the generated narrative. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of contextual recall scores. +- Descriptive statistics offer a concise summary of the model's performance in generating contextually relevant texts. -###### Limitations +### Limitations -- The focus on word overlap could result in high scores for texts that use many common words, even when these texts -lack coherence or meaningful context. +- The focus on word overlap could result in high scores for texts that use many common words, even when these texts lack coherence or meaningful context. - This metric does not consider the order of words, which could lead to overestimated scores for scrambled outputs. - Models that effectively use infrequent words might be undervalued, as these words might not overlap as often. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index e53b7498a..6792be159 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### FeaturesAUC +## FeaturesAUC[()]{.muted} ```python def FeaturesAUC( @@ -18,45 +13,28 @@ def FeaturesAUC( figure_height: int = 500): ``` -Evaluates the discriminatory power of each individual feature within a binary classification model by calculating -the Area Under the Curve (AUC) for each feature separately. - -###### Purpose - -The central objective of this metric is to quantify how well each feature on its own can differentiate between the -two classes in a binary classification problem. It serves as a univariate analysis tool that can help in -pre-modeling feature selection or post-modeling interpretation. - -###### Test Mechanism - -For each feature, the metric treats the feature values as raw scores to compute the AUC against the actual binary -outcomes. It provides an AUC value for each feature, offering a simple yet powerful indication of each feature's -univariate classification strength. +Evaluates the discriminatory power of each individual feature within a binary classification model by calculating the Area Under the Curve (AUC) for each feature separately. -###### Signs of High Risk +### Purpose -- A feature with a low AUC score may not be contributing significantly to the differentiation between the two -classes, which could be a concern if it is expected to be predictive. -- Conversely, a surprisingly high AUC for a feature not believed to be informative may suggest data leakage or -other issues with the data. +The central objective of this metric is to quantify how well each feature on its own can differentiate between the two classes in a binary classification problem. It serves as a univariate analysis tool that can help in pre-modeling feature selection or post-modeling interpretation. -###### Strengths +### Test Mechanism -- By isolating each feature, it highlights the individual contribution of features to the classification task -without the influence of other variables. -- Useful for both initial feature evaluation and for providing insights into the model's reliance on individual -features after model training. +For each feature, the metric treats the feature values as raw scores to compute the AUC against the actual binary outcomes. It provides an AUC value for each feature, offering a simple yet powerful indication of each feature's univariate classification strength. -###### Limitations +### Signs of High Risk -- Does not reflect the combined effects of features or any interaction between them, which can be critical in -certain models. -- The AUC values are calculated without considering the model's use of the features, which could lead to different -interpretations of feature importance when considering the model holistically. -- This metric is applicable only to binary classification tasks and cannot be directly extended to multiclass -classification or regression without modifications. +- A feature with a low AUC score may not be contributing significantly to the differentiation between the two classes, which could be a concern if it is expected to be predictive. +- Conversely, a surprisingly high AUC for a feature not believed to be informative may suggest data leakage or other issues with the data. +### Strengths +- By isolating each feature, it highlights the individual contribution of features to the classification task without the influence of other variables. +- Useful for both initial feature evaluation and for providing insights into the model's reliance on individual features after model training. +### Limitations - \ No newline at end of file +- Does not reflect the combined effects of features or any interaction between them, which can be critical in certain models. +- The AUC values are calculated without considering the model's use of the features, which could lead to different interpretations of feature importance when considering the model holistically. +- This metric is applicable only to binary classification tasks and cannot be directly extended to multiclass classification or regression without modifications. diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 16e4d8df6..c22690720 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### MeteorScore +## MeteorScore[()]{.muted} ```python def MeteorScore( @@ -17,54 +12,29 @@ def MeteorScore( model): ``` -Assesses the quality of machine-generated translations by comparing them to human-produced references using the -METEOR score, which evaluates precision, recall, and word order. - -###### Purpose - -The METEOR (Metric for Evaluation of Translation with Explicit ORdering) score is designed to evaluate the quality -of machine translations by comparing them against reference translations. It emphasizes both the accuracy and -fluency of translations, incorporating precision, recall, and word order into its assessment. - -###### Test Mechanism - -The function starts by extracting the true and predicted values from the provided dataset and model. The METEOR -score is computed for each pair of machine-generated translation (prediction) and its corresponding human-produced -reference. This is done by considering unigram matches between the translations, including matches based on surface -forms, stemmed forms, and synonyms. The score is a combination of unigram precision and recall, adjusted for word -order through a fragmentation penalty. Scores are compiled into a dataframe, and histograms and bar charts are -generated to visualize the distribution of METEOR scores. Additionally, a table of descriptive statistics (mean, -median, standard deviation, minimum, and maximum) is compiled for the METEOR scores, providing a comprehensive -summary of the model's performance. +Assesses the quality of machine-generated translations by comparing them to human-produced references using the METEOR score, which evaluates precision, recall, and word order. -###### Signs of High Risk +### Purpose -- Lower METEOR scores can indicate a lack of alignment between the machine-generated translations and their -human-produced references, highlighting potential deficiencies in both the accuracy and fluency of translations. -- Significant discrepancies in word order or an excessive fragmentation penalty could signal issues with how the -translation model processes and reconstructs sentence structures, potentially compromising the natural flow of -translated text. -- Persistent underperformance across a variety of text types or linguistic contexts might suggest a broader -inability of the model to adapt to the nuances of different languages or dialects, pointing towards gaps in its -training or inherent limitations. +The METEOR (Metric for Evaluation of Translation with Explicit ORdering) score is designed to evaluate the quality of machine translations by comparing them against reference translations. It emphasizes both the accuracy and fluency of translations, incorporating precision, recall, and word order into its assessment. -###### Strengths +### Test Mechanism -- Incorporates a balanced consideration of precision and recall, weighted towards recall to reflect the importance -of content coverage in translations. -- Directly accounts for word order, offering a nuanced evaluation of translation fluency beyond simple lexical -matching. -- Adapts to various forms of lexical similarity, including synonyms and stemmed forms, allowing for flexible -matching. +The function starts by extracting the true and predicted values from the provided dataset and model. The METEOR score is computed for each pair of machine-generated translation (prediction) and its corresponding human-produced reference. This is done by considering unigram matches between the translations, including matches based on surface forms, stemmed forms, and synonyms. The score is a combination of unigram precision and recall, adjusted for word order through a fragmentation penalty. Scores are compiled into a dataframe, and histograms and bar charts are generated to visualize the distribution of METEOR scores. Additionally, a table of descriptive statistics (mean, median, standard deviation, minimum, and maximum) is compiled for the METEOR scores, providing a comprehensive summary of the model's performance. -###### Limitations +### Signs of High Risk -- While comprehensive, the complexity of METEOR's calculation can make it computationally intensive, especially for -large datasets. -- The use of external resources for synonym and stemming matching may introduce variability based on the resources' -quality and relevance to the specific translation task. +- Lower METEOR scores can indicate a lack of alignment between the machine-generated translations and their human-produced references, highlighting potential deficiencies in both the accuracy and fluency of translations. +- Significant discrepancies in word order or an excessive fragmentation penalty could signal issues with how the translation model processes and reconstructs sentence structures, potentially compromising the natural flow of translated text. +- Persistent underperformance across a variety of text types or linguistic contexts might suggest a broader inability of the model to adapt to the nuances of different languages or dialects, pointing towards gaps in its training or inherent limitations. +### Strengths +- Incorporates a balanced consideration of precision and recall, weighted towards recall to reflect the importance of content coverage in translations. +- Directly accounts for word order, offering a nuanced evaluation of translation fluency beyond simple lexical matching. +- Adapts to various forms of lexical similarity, including synonyms and stemmed forms, allowing for flexible matching. +### Limitations - \ No newline at end of file +- While comprehensive, the complexity of METEOR's calculation can make it computationally intensive, especially for large datasets. +- The use of external resources for synonym and stemming matching may introduce variability based on the resources' quality and relevance to the specific translation task. diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index 9e7cc76a3..1479cee9b 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ModelMetadata +## ModelMetadata[()]{.muted} ```python def ModelMetadata( @@ -18,7 +13,7 @@ def ModelMetadata( Compare metadata of different models and generate a summary table with the results. -**Purpose****: The purpose of this function is to compare the metadata of different models, including information about their architecture, framework, framework version, and programming language. +**Purpose**: The purpose of this function is to compare the metadata of different models, including information about their architecture, framework, framework version, and programming language. **Test Mechanism**: The function retrieves the metadata for each model using `get_model_info`, renames columns according to a predefined set of labels, and compiles this information into a summary table. @@ -38,8 +33,3 @@ Compare metadata of different models and generate a summary table with the resul - Assumes that the `get_model_info` function returns all necessary metadata fields. - Relies on the correctness and completeness of the metadata provided by each model. - Does not include detailed parameter information, focusing instead on high-level metadata. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index 8a4159828..bcf846e0a 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ModelPredictionResiduals +## ModelPredictionResiduals[()]{.muted} ```python def ModelPredictionResiduals( @@ -23,36 +18,26 @@ def ModelPredictionResiduals( Assesses normality and behavior of residuals in regression models through visualization and statistical tests. -###### Purpose +### Purpose -The Model Prediction Residuals test aims to visualize the residuals of model predictions and assess their normality -using the Kolmogorov-Smirnov (KS) test. It helps to identify potential issues related to model assumptions and -effectiveness. +The Model Prediction Residuals test aims to visualize the residuals of model predictions and assess their normality using the Kolmogorov-Smirnov (KS) test. It helps to identify potential issues related to model assumptions and effectiveness. -###### Test Mechanism +### Test Mechanism -The function calculates residuals and generates -two figures**: one for the time series of residuals and one for the histogram of residuals. -It also calculates the KS test for normality and summarizes the results in a table. +The function calculates residuals and generates two figures: one for the time series of residuals and one for the histogram of residuals. It also calculates the KS test for normality and summarizes the results in a table. -###### Signs of High Risk +### Signs of High Risk - Residuals are not normally distributed, indicating potential issues with model assumptions. - High skewness or kurtosis in the residuals, which may suggest model misspecification. -###### Strengths +### Strengths - Provides clear visualizations of residuals over time and their distribution. - Includes statistical tests to assess the normality of residuals. - Helps in identifying potential model misspecifications and assumption violations. -###### Limitations +### Limitations -- Assumes that the dataset is provided as a DataFrameDataset object with a .df attribute to access the pandas -DataFrame. +- Assumes that the dataset is provided as a DataFrameDataset object with a .df attribute to access the pandas DataFrame. - Only generates plots for datasets with a datetime index, resulting in errors for other types of indices. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 7e8e9a178..831304931 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### RegardScore +## RegardScore[()]{.muted} ```python def RegardScore( @@ -17,45 +12,29 @@ def RegardScore( model): ``` -Assesses the sentiment and potential biases in text generated by NLP models by computing and visualizing regard -scores. +Assesses the sentiment and potential biases in text generated by NLP models by computing and visualizing regard scores. -###### Purpose +### Purpose -The `RegardScore` test aims to evaluate the levels of regard (positive, negative, neutral, or other) in texts -generated by NLP models. It helps in understanding the sentiment and bias present in the generated content. +The `RegardScore` test aims to evaluate the levels of regard (positive, negative, neutral, or other) in texts generated by NLP models. It helps in understanding the sentiment and bias present in the generated content. -###### Test Mechanism +### Test Mechanism -This test extracts the true and predicted values from the provided dataset and model. It then computes the regard -scores for each text instance using a preloaded `regard` evaluation tool. The scores are compiled into dataframes, -and visualizations such as histograms and bar charts are generated to display the distribution of regard scores. -Additionally, descriptive statistics (mean, median, standard deviation, minimum, and maximum) are calculated for -the regard scores, providing a comprehensive overview of the model's performance. +This test extracts the true and predicted values from the provided dataset and model. It then computes the regard scores for each text instance using a preloaded `regard` evaluation tool. The scores are compiled into dataframes, and visualizations such as histograms and bar charts are generated to display the distribution of regard scores. Additionally, descriptive statistics (mean, median, standard deviation, minimum, and maximum) are calculated for the regard scores, providing a comprehensive overview of the model's performance. -###### Signs of High Risk +### Signs of High Risk -- Noticeable skewness in the histogram, especially when comparing the predicted regard scores with the target -regard scores, can indicate biases or inconsistencies in the model. -- Lack of neutral scores in the model's predictions, despite a balanced distribution in the target data, might -signal an issue. +- Noticeable skewness in the histogram, especially when comparing the predicted regard scores with the target regard scores, can indicate biases or inconsistencies in the model. +- Lack of neutral scores in the model's predictions, despite a balanced distribution in the target data, might signal an issue. -###### Strengths +### Strengths - Provides a clear evaluation of regard levels in generated texts, aiding in ensuring content appropriateness. -- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of -regard scores. -- Descriptive statistics offer a concise summary of the model's performance in generating texts with balanced -sentiments. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of regard scores. +- Descriptive statistics offer a concise summary of the model's performance in generating texts with balanced sentiments. -###### Limitations +### Limitations - The accuracy of the regard scores is contingent upon the underlying `regard` tool. -- The scores provide a broad overview but do not specify which portions or tokens of the text are responsible for -high regard. +- The scores provide a broad overview but do not specify which portions or tokens of the text are responsible for high regard. - Supplementary, in-depth analysis might be needed for granular insights. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 90e16cf37..a745498f1 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### RegressionResidualsPlot +## RegressionResidualsPlot[()]{.muted} ```python def RegressionResidualsPlot( @@ -20,45 +15,31 @@ def RegressionResidualsPlot( Evaluates regression model performance using residual distribution and actual vs. predicted plots. -###### Purpose +### Purpose -The `RegressionResidualsPlot` metric aims to evaluate the performance of regression models. By generating and -analyzing two plots – a distribution of residuals and a scatter plot of actual versus predicted values – this tool -helps to visually appraise how well the model predicts and the nature of errors it makes. +The `RegressionResidualsPlot` metric aims to evaluate the performance of regression models. By generating and analyzing two plots – a distribution of residuals and a scatter plot of actual versus predicted values – this tool helps to visually appraise how well the model predicts and the nature of errors it makes. -###### Test Mechanism +### Test Mechanism -The process begins by extracting the true output values (`y_true`) and the model's predicted values (`y_pred`). -Residuals are computed by subtracting predicted from true values. These residuals are then visualized using a -histogram to display their distribution. Additionally, a scatter plot is derived to compare true values against -predicted values, together with a "Perfect Fit" line, which represents an ideal match (predicted values equal -actual values), facilitating the assessment of the model's predictive accuracy. +The process begins by extracting the true output values (`y_true`) and the model's predicted values (`y_pred`). Residuals are computed by subtracting predicted from true values. These residuals are then visualized using a histogram to display their distribution. Additionally, a scatter plot is derived to compare true values against predicted values, together with a "Perfect Fit" line, which represents an ideal match (predicted values equal actual values), facilitating the assessment of the model's predictive accuracy. -###### Signs of High Risk +### Signs of High Risk - Residuals showing a non-normal distribution, especially those with frequent extreme values. - Significant deviations of predicted values from actual values in the scatter plot. -- Sparse density of data points near the "Perfect Fit" line in the scatter plot, indicating poor prediction -accuracy. -- Visible patterns or trends in the residuals plot, suggesting the model's failure to capture the underlying data -structure adequately. +- Sparse density of data points near the "Perfect Fit" line in the scatter plot, indicating poor prediction accuracy. +- Visible patterns or trends in the residuals plot, suggesting the model's failure to capture the underlying data structure adequately. -###### Strengths +### Strengths - Provides a direct, visually intuitive assessment of a regression model’s accuracy and handling of data. - Visual plots can highlight issues of underfitting or overfitting. - Can reveal systematic deviations or trends that purely numerical metrics might miss. - Applicable across various regression model types. -###### Limitations +### Limitations - Relies on visual interpretation, which can be subjective and less precise than numerical evaluations. - May be difficult to interpret in cases with multi-dimensional outputs due to the plots’ two-dimensional nature. - Overlapping data points in the residuals plot can complicate interpretation efforts. -- Does not summarize model performance into a single quantifiable metric, which might be needed for comparative or -summary analyses. - - - - - \ No newline at end of file +- Does not summarize model performance into a single quantifiable metric, which might be needed for comparative or summary analyses. diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 30a317ad1..470497f5b 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### RougeScore +## RougeScore[()]{.muted} ```python def RougeScore( @@ -18,52 +13,31 @@ def RougeScore( metric = 'rouge-1'): ``` -Assesses the quality of machine-generated text using ROUGE metrics and visualizes the results to provide -comprehensive performance insights. +Assesses the quality of machine-generated text using ROUGE metrics and visualizes the results to provide comprehensive performance insights. -###### Purpose +### Purpose -The ROUGE Score test is designed to evaluate the quality of text generated by machine learning models using various -ROUGE metrics. ROUGE, which stands for Recall-Oriented Understudy for Gisting Evaluation, measures the overlap of -n-grams, word sequences, and word pairs between machine-generated text and reference texts. This evaluation is -crucial for tasks like text summarization, machine translation, and text generation, where the goal is to produce -text that accurately reflects the content and meaning of human-crafted references. +The ROUGE Score test is designed to evaluate the quality of text generated by machine learning models using various ROUGE metrics. ROUGE, which stands for Recall-Oriented Understudy for Gisting Evaluation, measures the overlap of n-grams, word sequences, and word pairs between machine-generated text and reference texts. This evaluation is crucial for tasks like text summarization, machine translation, and text generation, where the goal is to produce text that accurately reflects the content and meaning of human-crafted references. -###### Test Mechanism +### Test Mechanism -The test extracts the true and predicted values from the provided dataset and model. It initializes the ROUGE -evaluator with the specified metric (e.g., ROUGE-1). For each pair of true and predicted texts, it calculates the -ROUGE scores and compiles them into a dataframe. Histograms and bar charts are generated for each ROUGE metric -(Precision, Recall, and F1 Score) to visualize their distribution. Additionally, a table of descriptive statistics -(mean, median, standard deviation, minimum, and maximum) is compiled for each metric, providing a comprehensive -summary of the model's performance. +The test extracts the true and predicted values from the provided dataset and model. It initializes the ROUGE evaluator with the specified metric (e.g., ROUGE-1). For each pair of true and predicted texts, it calculates the ROUGE scores and compiles them into a dataframe. Histograms and bar charts are generated for each ROUGE metric (Precision, Recall, and F1 Score) to visualize their distribution. Additionally, a table of descriptive statistics (mean, median, standard deviation, minimum, and maximum) is compiled for each metric, providing a comprehensive summary of the model's performance. -###### Signs of High Risk +### Signs of High Risk -- Consistently low scores across ROUGE metrics could indicate poor quality in the generated text, suggesting that -the model fails to capture the essential content of the reference texts. +- Consistently low scores across ROUGE metrics could indicate poor quality in the generated text, suggesting that the model fails to capture the essential content of the reference texts. - Low precision scores might suggest that the generated text contains a lot of redundant or irrelevant information. - Low recall scores may indicate that important information from the reference text is being omitted. -- An imbalanced performance between precision and recall, reflected by a low F1 Score, could signal issues in the -model's ability to balance informativeness and conciseness. +- An imbalanced performance between precision and recall, reflected by a low F1 Score, could signal issues in the model's ability to balance informativeness and conciseness. -###### Strengths +### Strengths -- Provides a multifaceted evaluation of text quality through different ROUGE metrics, offering a detailed view of -model performance. -- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of the -scores. +- Provides a multifaceted evaluation of text quality through different ROUGE metrics, offering a detailed view of model performance. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of the scores. - Descriptive statistics offer a concise summary of the model's strengths and weaknesses in generating text. -###### Limitations +### Limitations -- ROUGE metrics primarily focus on n-gram overlap and may not fully capture semantic coherence, fluency, or -grammatical quality of the text. +- ROUGE metrics primarily focus on n-gram overlap and may not fully capture semantic coherence, fluency, or grammatical quality of the text. - The evaluation relies on the availability of high-quality reference texts, which may not always be obtainable. -- While useful for comparison, ROUGE scores alone do not provide a complete assessment of a model's performance and -should be supplemented with other metrics and qualitative analysis. - - - - - \ No newline at end of file +- While useful for comparison, ROUGE scores alone do not provide a complete assessment of a model's performance and should be supplemented with other metrics and qualitative analysis. diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index b587ea851..2c087a058 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TimeSeriesPredictionWithCI +## TimeSeriesPredictionWithCI[()]{.muted} ```python def TimeSeriesPredictionWithCI( @@ -18,16 +13,13 @@ def TimeSeriesPredictionWithCI( confidence = 0.95): ``` -Assesses predictive accuracy and uncertainty in time series models, highlighting breaches beyond confidence -intervals. +Assesses predictive accuracy and uncertainty in time series models, highlighting breaches beyond confidence intervals. -###### Purpose +### Purpose -The purpose of the Time Series Prediction with Confidence Intervals (CI) test is to visualize the actual versus -predicted values for time series data, including confidence intervals, and to compute and report the number of -breaches beyond these intervals. This helps in evaluating the reliability and accuracy of the model's predictions. +The purpose of the Time Series Prediction with Confidence Intervals (CI) test is to visualize the actual versus predicted values for time series data, including confidence intervals, and to compute and report the number of breaches beyond these intervals. This helps in evaluating the reliability and accuracy of the model's predictions. -###### Test Mechanism +### Test Mechanism The function performs the following steps: @@ -35,29 +27,21 @@ The function performs the following steps: - Determines the confidence intervals using a specified confidence level, typically 95%. - Counts the number of actual values that fall outside the confidence intervals, referred to as breaches. - Generates a plot visualizing the actual values, predicted values, and confidence intervals. -- Returns a DataFrame summarizing the breach information, including the total breaches, upper breaches, and lower -breaches. +- Returns a DataFrame summarizing the breach information, including the total breaches, upper breaches, and lower breaches. -###### Signs of High Risk +### Signs of High Risk -- A high number of breaches indicates that the model's predictions are not reliable within the specified confidence -level. -- Significant deviations between actual and predicted values may highlight model inadequacies or issues with data -quality. +- A high number of breaches indicates that the model's predictions are not reliable within the specified confidence level. +- Significant deviations between actual and predicted values may highlight model inadequacies or issues with data quality. -###### Strengths +### Strengths - Provides a visual representation of prediction accuracy and the uncertainty around predictions. - Includes a statistical measure of prediction reliability through confidence intervals. - Computes and reports breaches, offering a quantitative assessment of prediction performance. -###### Limitations +### Limitations - Assumes that the dataset is provided as a DataFrameDataset object with a datetime index. - Requires that `dataset.y_pred(model)` returns the predicted values for the model. - The calculation of confidence intervals assumes normally distributed errors, which may not hold for all datasets. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index 59db06bf0..e83e5ea6a 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TimeSeriesPredictionsPlot +## TimeSeriesPredictionsPlot[()]{.muted} ```python def TimeSeriesPredictionsPlot( @@ -19,30 +14,23 @@ def TimeSeriesPredictionsPlot( Plot actual vs predicted values for time series data and generate a visual comparison for the model. -###### Purpose +### Purpose -The purpose of this function is to visualize the actual versus predicted values for time -series data for a single model. +The purpose of this function is to visualize the actual versus predicted values for time series data for a single model. -###### Test Mechanism +### Test Mechanism -The function plots the actual values from the dataset and overlays the predicted -values from the model using Plotly for interactive visualization. +The function plots the actual values from the dataset and overlays the predicted values from the model using Plotly for interactive visualization. - Large discrepancies between actual and predicted values indicate poor model performance. - Systematic deviations in predicted values can highlight model bias or issues with data patterns. -###### Strengths +### Strengths - Provides a clear visual comparison of model predictions against actual values. - Uses Plotly for interactive and visually appealing plots. -###### Limitations +### Limitations - Assumes that the dataset is provided as a DataFrameDataset object with a datetime index. - Requires that `dataset.y_pred(model)` returns the predicted values for the model. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 3a518af98..a9374c9ae 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TimeSeriesR2SquareBySegments +## TimeSeriesR2SquareBySegments[()]{.muted} ```python def TimeSeriesR2SquareBySegments( @@ -18,42 +13,33 @@ def TimeSeriesR2SquareBySegments( segments = None): ``` -Evaluates the R-Squared values of regression models over specified time segments in time series data to assess -segment-wise model performance. +Evaluates the R-Squared values of regression models over specified time segments in time series data to assess segment-wise model performance. -###### Purpose +### Purpose -The TimeSeriesR2SquareBySegments test aims to evaluate the R-Squared values for several regression models across -different segments of time series data. This helps in determining how well the models explain the variability in -the data within each specific time segment. +The TimeSeriesR2SquareBySegments test aims to evaluate the R-Squared values for several regression models across different segments of time series data. This helps in determining how well the models explain the variability in the data within each specific time segment. + +### Test Mechanism -###### Test Mechanism - Provides a visual representation of model performance across different time segments. - Allows for identification of segments where the model performs poorly. - Calculating the R-Squared values for each segment. - Generating a bar chart to visually represent the R-Squared values across different models and segments. -###### Signs of High Risk +### Signs of High Risk - Significantly low R-Squared values for certain time segments, indicating poor model performance in those periods. -- Large variability in R-Squared values across different segments for the same model, suggesting inconsistent -performance. +- Large variability in R-Squared values across different segments for the same model, suggesting inconsistent performance. -###### Strengths +### Strengths - Provides a visual representation of how well models perform over different time periods. - Helps identify time segments where models may need improvement or retraining. - Facilitates comparison between multiple models in a straightforward manner. -###### Limitations +### Limitations -- Assumes datasets are provided as DataFrameDataset objects with the attributes `y`, `y_pred`, and -`feature_columns`. +- Assumes datasets are provided as DataFrameDataset objects with the attributes `y`, `y_pred`, and `feature_columns`. - Requires that `dataset.y_pred(model)` returns predicted values for the model. - Assumes that both `y_true` and `y_pred` are pandas Series with datetime indices, which may not always be the case. - May not account for more nuanced temporal dependencies within the segments. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index 83c4b2002..354342b2e 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TokenDisparity +## TokenDisparity[()]{.muted} ```python def TokenDisparity( @@ -17,43 +12,27 @@ def TokenDisparity( model): ``` -Evaluates the token disparity between reference and generated texts, visualizing the results through histograms and -bar charts, alongside compiling a comprehensive table of descriptive statistics for token counts. +Evaluates the token disparity between reference and generated texts, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for token counts. -###### Purpose +### Purpose -The Token Disparity test aims to assess the difference in the number of tokens between reference texts and texts -generated by the model. Understanding token disparity is essential for evaluating how well the generated content -matches the expected length and richness of the reference texts. +The Token Disparity test aims to assess the difference in the number of tokens between reference texts and texts generated by the model. Understanding token disparity is essential for evaluating how well the generated content matches the expected length and richness of the reference texts. -###### Test Mechanism +### Test Mechanism -The test extracts true and predicted values from the dataset and model. It computes the number of tokens in each -reference and generated text. The results are visualized using histograms and bar charts to display the -distribution of token counts. Additionally, a table of descriptive statistics, including the mean, median, standard -deviation, minimum, and maximum token counts, is compiled to provide a detailed summary of token usage. +The test extracts true and predicted values from the dataset and model. It computes the number of tokens in each reference and generated text. The results are visualized using histograms and bar charts to display the distribution of token counts. Additionally, a table of descriptive statistics, including the mean, median, standard deviation, minimum, and maximum token counts, is compiled to provide a detailed summary of token usage. -###### Signs of High Risk +### Signs of High Risk -- Significant disparity in token counts between reference and generated texts could indicate issues with text -generation quality, such as verbosity or lack of detail. -- Consistently low token counts in generated texts compared to references might suggest that the model is producing -incomplete or overly concise outputs. +- Significant disparity in token counts between reference and generated texts could indicate issues with text generation quality, such as verbosity or lack of detail. +- Consistently low token counts in generated texts compared to references might suggest that the model is producing incomplete or overly concise outputs. -###### Strengths +### Strengths - Provides a simple yet effective evaluation of text length and token usage. -- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of -token counts. -- Descriptive statistics offer a concise summary of the model's performance in generating texts of appropriate -length. - -###### Limitations - -- Token counts alone do not provide a complete assessment of text quality and should be supplemented with other -metrics and qualitative analysis. - - +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of token counts. +- Descriptive statistics offer a concise summary of the model's performance in generating texts of appropriate length. +### Limitations - \ No newline at end of file +- Token counts alone do not provide a complete assessment of text quality and should be supplemented with other metrics and qualitative analysis. diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index e308ecc7d..7bf0f1daa 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ToxicityScore +## ToxicityScore[()]{.muted} ```python def ToxicityScore( @@ -19,41 +14,27 @@ def ToxicityScore( Assesses the toxicity levels of texts generated by NLP models to identify and mitigate harmful or offensive content. -###### Purpose +### Purpose -The ToxicityScore metric is designed to evaluate the toxicity levels of texts generated by models. This is crucial -for identifying and mitigating harmful or offensive content in machine-generated texts. +The ToxicityScore metric is designed to evaluate the toxicity levels of texts generated by models. This is crucial for identifying and mitigating harmful or offensive content in machine-generated texts. -###### Test Mechanism +### Test Mechanism -The function starts by extracting the input, true, and predicted values from the provided dataset and model. The -toxicity score is computed for each text using a preloaded `toxicity` evaluation tool. The scores are compiled into -dataframes, and histograms and bar charts are generated to visualize the distribution of toxicity scores. -Additionally, a table of descriptive statistics (mean, median, standard deviation, minimum, and maximum) is -compiled for the toxicity scores, providing a comprehensive summary of the model's performance. +The function starts by extracting the input, true, and predicted values from the provided dataset and model. The toxicity score is computed for each text using a preloaded `toxicity` evaluation tool. The scores are compiled into dataframes, and histograms and bar charts are generated to visualize the distribution of toxicity scores. Additionally, a table of descriptive statistics (mean, median, standard deviation, minimum, and maximum) is compiled for the toxicity scores, providing a comprehensive summary of the model's performance. -###### Signs of High Risk +### Signs of High Risk - Drastic spikes in toxicity scores indicate potentially toxic content within the associated text segment. -- Persistent high toxicity scores across multiple texts may suggest systemic issues in the model's text generation -process. +- Persistent high toxicity scores across multiple texts may suggest systemic issues in the model's text generation process. -###### Strengths +### Strengths -- Provides a clear evaluation of toxicity levels in generated texts, helping to ensure content safety and -appropriateness. -- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of -toxicity scores. +- Provides a clear evaluation of toxicity levels in generated texts, helping to ensure content safety and appropriateness. +- Visual representations (histograms and bar charts) make it easier to interpret the distribution and trends of toxicity scores. - Descriptive statistics offer a concise summary of the model's performance in generating non-toxic texts. -###### Limitations +### Limitations - The accuracy of the toxicity scores is contingent upon the underlying `toxicity` tool. -- The scores provide a broad overview but do not specify which portions or tokens of the text are responsible for -high toxicity. +- The scores provide a broad overview but do not specify which portions or tokens of the text are responsible for high toxicity. - Supplementary, in-depth analysis might be needed for granular insights. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn.qmd b/docs/validmind/tests/model_validation/sklearn.qmd index 7d7b14374..a35f66a40 100644 --- a/docs/validmind/tests/model_validation/sklearn.qmd +++ b/docs/validmind/tests/model_validation/sklearn.qmd @@ -4,9 +4,6 @@ toc-depth: 3 toc-expand: 3 --- - - - - [AdjustedMutualInformation](sklearn/AdjustedMutualInformation.qmd) - [AdjustedRandIndex](sklearn/AdjustedRandIndex.qmd) - [CalibrationCurve](sklearn/CalibrationCurve.qmd) @@ -43,4 +40,3 @@ toc-expand: 3 - [TrainingTestDegradation](sklearn/TrainingTestDegradation.qmd) - [VMeasure](sklearn/VMeasure.qmd) - [WeakspotsDiagnosis](sklearn/WeakspotsDiagnosis.qmd) - diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index a85c5b0d1..6bb3429a0 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### AdjustedMutualInformation +## AdjustedMutualInformation[()]{.muted} ```python def AdjustedMutualInformation( @@ -17,47 +12,30 @@ def AdjustedMutualInformation( dataset: VMDataset): ``` -Evaluates clustering model performance by measuring mutual information between true and predicted labels, adjusting -for chance. +Evaluates clustering model performance by measuring mutual information between true and predicted labels, adjusting for chance. -###### Purpose +### Purpose -The purpose of this metric (Adjusted Mutual Information) is to evaluate the performance of a machine learning -model, more specifically, a clustering model. It measures the mutual information between the true labels and the -ones predicted by the model, adjusting for chance. +The purpose of this metric (Adjusted Mutual Information) is to evaluate the performance of a machine learning model, more specifically, a clustering model. It measures the mutual information between the true labels and the ones predicted by the model, adjusting for chance. -###### Test Mechanism +### Test Mechanism -The Adjusted Mutual Information (AMI) uses sklearn's `adjusted_mutual_info_score` function. This function -calculates the mutual information between the true labels and the ones predicted while correcting for the chance -correlation expected due to random label assignments. This test requires the model, the training dataset, and the -test dataset as inputs. +The Adjusted Mutual Information (AMI) uses sklearn's `adjusted_mutual_info_score` function. This function calculates the mutual information between the true labels and the ones predicted while correcting for the chance correlation expected due to random label assignments. This test requires the model, the training dataset, and the test dataset as inputs. -###### Signs of High Risk +### Signs of High Risk -- Low Adjusted Mutual Information Score**: This score ranges between 0 and 1. A low score (closer to 0) can indicate -poor model performance as the predicted labels do not align well with the true labels. -- In case of high-dimensional data, if the algorithm shows high scores, this could also be a potential risk as AMI -may not perform reliably. +- Low Adjusted Mutual Information Score: This score ranges between 0 and 1. A low score (closer to 0) can indicate poor model performance as the predicted labels do not align well with the true labels. +- In case of high-dimensional data, if the algorithm shows high scores, this could also be a potential risk as AMI may not perform reliably. -###### Strengths +### Strengths -- The AMI metric takes into account the randomness of the predicted labels, which makes it more robust than the -simple Mutual Information. -- The scale of AMI is not dependent on the sizes of the clustering, allowing for comparability between different -datasets or models. +- The AMI metric takes into account the randomness of the predicted labels, which makes it more robust than the simple Mutual Information. +- The scale of AMI is not dependent on the sizes of the clustering, allowing for comparability between different datasets or models. - Good for comparing the output of clustering algorithms where the number of clusters is not known a priori. -###### Limitations +### Limitations -- Adjusted Mutual Information does not take into account the continuous nature of some data. As a result, it may -not be the best choice for regression or other continuous types of tasks. +- Adjusted Mutual Information does not take into account the continuous nature of some data. As a result, it may not be the best choice for regression or other continuous types of tasks. - AMI has the drawback of being biased towards clusterings with a higher number of clusters. - In comparison to other metrics, AMI can be slower to compute. -- The interpretability of the score can be complex as it depends on the understanding of information theory -concepts. - - - - - \ No newline at end of file +- The interpretability of the score can be complex as it depends on the understanding of information theory concepts. diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 49f804712..920f0bf9b 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### AdjustedRandIndex +## AdjustedRandIndex[()]{.muted} ```python def AdjustedRandIndex( @@ -17,44 +12,29 @@ def AdjustedRandIndex( dataset: VMDataset): ``` -Measures the similarity between two data clusters using the Adjusted Rand Index (ARI) metric in clustering machine -learning models. +Measures the similarity between two data clusters using the Adjusted Rand Index (ARI) metric in clustering machine learning models. -###### Purpose +### Purpose -The Adjusted Rand Index (ARI) metric is intended to measure the similarity between two data clusters. This metric -is specifically used for clustering machine learning models to quantify how well the model is clustering and -producing data groups. It involves comparing the model's produced clusters against the actual (true) clusters found -in the dataset. +The Adjusted Rand Index (ARI) metric is intended to measure the similarity between two data clusters. This metric is specifically used for clustering machine learning models to quantify how well the model is clustering and producing data groups. It involves comparing the model's produced clusters against the actual (true) clusters found in the dataset. -###### Test Mechanism +### Test Mechanism -The Adjusted Rand Index (ARI) is calculated using the `adjusted_rand_score` method from the `sklearn.metrics` -module in Python. The test requires inputs including the model itself and the model's training and test datasets. -The model's computed clusters and the true clusters are compared, and the similarities are measured to compute the -ARI. +The Adjusted Rand Index (ARI) is calculated using the `adjusted_rand_score` method from the `sklearn.metrics` module in Python. The test requires inputs including the model itself and the model's training and test datasets. The model's computed clusters and the true clusters are compared, and the similarities are measured to compute the ARI. -###### Signs of High Risk +### Signs of High Risk -- If the ARI is close to zero, it signifies that the model's cluster assignments are random and do not match the -actual dataset clusters, indicating a high risk. +- If the ARI is close to zero, it signifies that the model's cluster assignments are random and do not match the actual dataset clusters, indicating a high risk. - An ARI of less than zero indicates that the model's clustering performance is worse than random. -###### Strengths +### Strengths -- ARI is normalized and provides a consistent metric between -1 and +1, irrespective of raw cluster sizes or -dataset size variations. +- ARI is normalized and provides a consistent metric between -1 and +1, irrespective of raw cluster sizes or dataset size variations. - It does not require a ground truth for computation, making it ideal for unsupervised learning model evaluations. - It penalizes for false positives and false negatives, providing a robust measure of clustering quality. -###### Limitations +### Limitations - In real-world situations, true clustering is often unknown, which can hinder the practical application of the ARI. - The ARI requires all individual data instances to be independent, which may not always hold true. -- It may be difficult to interpret the implications of an ARI score without context or a benchmark, as it is -heavily dependent on the characteristics of the dataset used. - - - - - \ No newline at end of file +- It may be difficult to interpret the implications of an ARI score without context or a benchmark, as it is heavily dependent on the characteristics of the dataset used. diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 1da732b0f..e96b3f84b 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### CalibrationCurve +## CalibrationCurve[()]{.muted} ```python def CalibrationCurve( @@ -18,26 +13,22 @@ def CalibrationCurve( n_bins: int = 10): ``` -Evaluates the calibration of probability estimates by comparing predicted probabilities against observed -frequencies. +Evaluates the calibration of probability estimates by comparing predicted probabilities against observed frequencies. -###### Purpose +### Purpose -The Calibration Curve test assesses how well a model's predicted probabilities align with actual -observed frequencies. This is crucial for applications requiring accurate probability estimates, -such as risk assessment, decision-making systems, and cost-sensitive applications where probability -calibration directly impacts business decisions. +The Calibration Curve test assesses how well a model's predicted probabilities align with actual observed frequencies. This is crucial for applications requiring accurate probability estimates, such as risk assessment, decision-making systems, and cost-sensitive applications where probability calibration directly impacts business decisions. -###### Test Mechanism +### Test Mechanism The test uses sklearn's calibration_curve function to: + 1. Sort predictions into bins based on predicted probabilities -2. Calculate the mean predicted probability in each bin -3. Compare against the observed frequency of positive cases -4. Plot the results against the perfect calibration line (y=x) -The resulting curve shows how well the predicted probabilities match empirical probabilities. +1. Calculate the mean predicted probability in each bin +1. Compare against the observed frequency of positive cases +1. Plot the results against the perfect calibration line (y=x) The resulting curve shows how well the predicted probabilities match empirical probabilities. -###### Signs of High Risk +### Signs of High Risk - Significant deviation from the perfect calibration line - Systematic overconfidence (predictions too close to 0 or 1) @@ -48,7 +39,7 @@ The resulting curve shows how well the predicted probabilities match empirical p - Consistent over/under estimation in critical probability regions - Large confidence intervals in certain probability ranges -###### Strengths +### Strengths - Visual and intuitive interpretation of probability quality - Identifies systematic biases in probability estimates @@ -59,7 +50,7 @@ The resulting curve shows how well the predicted probabilities match empirical p - Guides potential need for recalibration - Critical for risk-sensitive applications -###### Limitations +### Limitations - Sensitive to the number of bins chosen - Requires sufficient samples in each bin for reliable estimates @@ -69,8 +60,3 @@ The resulting curve shows how well the predicted probabilities match empirical p - Cannot detect all forms of miscalibration - Assumes bin boundaries are appropriate for the problem - May be affected by class imbalance - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index 1b9351f1d..a4b43cc4b 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ClassifierPerformance +## ClassifierPerformance[()]{.muted} ```python def ClassifierPerformance( @@ -18,47 +13,35 @@ def ClassifierPerformance( average: str = 'macro'): ``` -Evaluates performance of binary or multiclass classification models using precision, recall, F1-Score, accuracy, -and ROC AUC scores. +Evaluates performance of binary or multiclass classification models using precision, recall, F1-Score, accuracy, and ROC AUC scores. -###### Purpose +### Purpose -The Classifier Performance test is designed to evaluate the performance of Machine Learning classification models. -It accomplishes this by computing precision, recall, F1-Score, and accuracy, as well as the ROC AUC (Receiver -operating characteristic - Area under the curve) scores, thereby providing a comprehensive analytic view of the -models' performance. The test is adaptable, handling binary and multiclass models equally effectively. +The Classifier Performance test is designed to evaluate the performance of Machine Learning classification models. It accomplishes this by computing precision, recall, F1-Score, and accuracy, as well as the ROC AUC (Receiver operating characteristic - Area under the curve) scores, thereby providing a comprehensive analytic view of the models' performance. The test is adaptable, handling binary and multiclass models equally effectively. -###### Test Mechanism +### Test Mechanism -The test produces a report that includes precision, recall, F1-Score, and accuracy, by leveraging the -`classification_report` from scikit-learn's metrics module. For multiclass models, macro and weighted averages for -these scores are also calculated. Additionally, the ROC AUC scores are calculated and included in the report using -the `multiclass_roc_auc_score` function. The outcome of the test (report format) differs based on whether the model -is binary or multiclass. +The test produces a report that includes precision, recall, F1-Score, and accuracy, by leveraging the `classification_report` from scikit-learn's metrics module. For multiclass models, macro and weighted averages for these scores are also calculated. Additionally, the ROC AUC scores are calculated and included in the report using the `multiclass_roc_auc_score` function. The outcome of the test (report format) differs based on whether the model is binary or multiclass. -###### Signs of High Risk +### Signs of High Risk - Low values for precision, recall, F1-Score, accuracy, and ROC AUC, indicating poor performance. - Imbalance in precision and recall scores. - A low ROC AUC score, especially scores close to 0.5 or lower, suggesting a failing model. -###### Strengths +### Strengths - Versatile, capable of assessing both binary and multiclass models. - Utilizes a variety of commonly employed performance metrics, offering a comprehensive view of model performance. - The use of ROC-AUC as a metric is beneficial for evaluating unbalanced datasets. -###### Limitations +### Limitations - Assumes correctly identified labels for binary classification models. - Specifically designed for classification models and not suitable for regression models. - May provide limited insights if the test dataset does not represent real-world scenarios adequately. - - - - -#### multiclass_roc_auc_score +## multiclass_roc_auc_score[()]{.muted} ```python def multiclass_roc_auc_score( @@ -66,5 +49,3 @@ def multiclass_roc_auc_score( y_pred, average = 'macro'): ``` - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 6a88510a6..d4c6c7a76 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ClassifierThresholdOptimization +## ClassifierThresholdOptimization[()]{.muted} ```python def ClassifierThresholdOptimization( @@ -21,25 +16,21 @@ def ClassifierThresholdOptimization( Analyzes and visualizes different threshold optimization methods for binary classification models. -###### Purpose +### Purpose -The Classifier Threshold Optimization test identifies optimal decision thresholds using various -methods to balance different performance metrics. This helps adapt the model's decision boundary -to specific business requirements, such as minimizing false positives in fraud detection or -achieving target recall in medical diagnosis. +The Classifier Threshold Optimization test identifies optimal decision thresholds using various methods to balance different performance metrics. This helps adapt the model's decision boundary to specific business requirements, such as minimizing false positives in fraud detection or achieving target recall in medical diagnosis. -###### Test Mechanism +### Test Mechanism The test implements multiple threshold optimization methods: + 1. Youden's J statistic (maximizing sensitivity + specificity - 1) -2. F1-score optimization (balancing precision and recall) -3. Precision-Recall equality point -4. Target recall achievement -5. Naive (0.5) threshold -For each method, it computes ROC and PR curves, identifies optimal points, and provides -comprehensive performance metrics at each threshold. +1. F1-score optimization (balancing precision and recall) +1. Precision-Recall equality point +1. Target recall achievement +1. Naive (0.5) threshold For each method, it computes ROC and PR curves, identifies optimal points, and provides comprehensive performance metrics at each threshold. -###### Signs of High Risk +### Signs of High Risk - Large discrepancies between different optimization methods - Optimal thresholds far from the default 0.5 @@ -50,7 +41,7 @@ comprehensive performance metrics at each threshold. - Threshold optimization showing minimal impact - Business metrics not improving with optimization -###### Strengths +### Strengths - Multiple optimization strategies for different needs - Visual and numerical results for comparison @@ -61,7 +52,7 @@ comprehensive performance metrics at each threshold. - Enables informed threshold selection - Supports cost-sensitive decision making -###### Limitations +### Limitations - Assumes cost of false positives/negatives are known - May need adjustment for highly imbalanced datasets @@ -72,22 +63,11 @@ comprehensive performance metrics at each threshold. - May not capture temporal changes in optimal threshold - Single threshold may not be optimal for all subgroups -**Arguments** - -- **dataset****: VMDataset containing features and target -- **model**: VMModel containing predictions -- **methods**: List of methods to compare (default: ['youden', 'f1', 'precision_recall']) -- **target_recall**: Target recall value if using 'target_recall' method - -**Returns** - -- **Dictionary containing**: - table: DataFrame comparing different threshold optimization methods (using weighted averages for precision, recall, and f1) - figure: Plotly figure showing ROC and PR curves with optimal thresholds +Args: dataset: VMDataset containing features and target model: VMModel containing predictions methods: List of methods to compare (default: ['youden', 'f1', 'precision_recall']) target_recall: Target recall value if using 'target_recall' method +Returns: Dictionary containing: - table: DataFrame comparing different threshold optimization methods (using weighted averages for precision, recall, and f1) - figure: Plotly figure showing ROC and PR curves with optimal thresholds - - - -#### find_optimal_threshold +## find_optimal_threshold[()]{.muted} ```python def find_optimal_threshold( @@ -99,18 +79,6 @@ def find_optimal_threshold( Find the optimal classification threshold using various methods. -**Arguments** - -- **y_true****: True binary labels -- **y_prob**: Predicted probabilities -- **method**: Method to use for finding optimal threshold -- **target_recall**: Required if method='target_recall' - -**Returns** - -- **dict**: Dictionary containing threshold and metrics - - - +Args: y_true: True binary labels y_prob: Predicted probabilities method: Method to use for finding optimal threshold target_recall: Required if method='target_recall' - \ No newline at end of file +Returns: dict: Dictionary containing threshold and metrics diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 8b06ed2a5..a900ac55d 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ClusterCosineSimilarity +## ClusterCosineSimilarity[()]{.muted} ```python def ClusterCosineSimilarity( @@ -19,47 +14,28 @@ def ClusterCosineSimilarity( Measures the intra-cluster similarity of a clustering model using cosine similarity. -###### Purpose +### Purpose -The purpose of this metric is to measure how similar the data points within each cluster of a clustering model are. -This is done using cosine similarity, which compares the multi-dimensional direction (but not magnitude) of data -vectors. From a Model Risk Management perspective, this metric is used to quantitatively validate that clusters -formed by a model have high intra-cluster similarity. +The purpose of this metric is to measure how similar the data points within each cluster of a clustering model are. This is done using cosine similarity, which compares the multi-dimensional direction (but not magnitude) of data vectors. From a Model Risk Management perspective, this metric is used to quantitatively validate that clusters formed by a model have high intra-cluster similarity. -###### Test Mechanism +### Test Mechanism -This test works by first extracting the true and predicted clusters of the model's training data. Then, it computes -the centroid (average data point) of each cluster. Next, it calculates the cosine similarity between each data -point within a cluster and its respective centroid. Finally, it outputs the mean cosine similarity of each cluster, -highlighting how similar, on average, data points in a cluster are to the cluster's centroid. +This test works by first extracting the true and predicted clusters of the model's training data. Then, it computes the centroid (average data point) of each cluster. Next, it calculates the cosine similarity between each data point within a cluster and its respective centroid. Finally, it outputs the mean cosine similarity of each cluster, highlighting how similar, on average, data points in a cluster are to the cluster's centroid. -###### Signs of High Risk +### Signs of High Risk -- Low mean cosine similarity for one or more clusters**: If the mean cosine similarity is low, the data points within -the respective cluster have high variance in their directions. This can be indicative of poor clustering, -suggesting that the model might not be suitably separating the data into distinct patterns. -- High disparity between mean cosine similarity values across clusters: If there's a significant difference in mean -cosine similarity across different clusters, this could indicate imbalance in how the model forms clusters. +- Low mean cosine similarity for one or more clusters: If the mean cosine similarity is low, the data points within the respective cluster have high variance in their directions. This can be indicative of poor clustering, suggesting that the model might not be suitably separating the data into distinct patterns. +- High disparity between mean cosine similarity values across clusters: If there's a significant difference in mean cosine similarity across different clusters, this could indicate imbalance in how the model forms clusters. -###### Strengths +### Strengths -- Cosine similarity operates in a multi-dimensional space, making it effective for measuring similarity in high -dimensional datasets, typical for many machine learning problems. -- It provides an agnostic view of the cluster performance by only considering the direction (and not the magnitude) -of each vector. +- Cosine similarity operates in a multi-dimensional space, making it effective for measuring similarity in high dimensional datasets, typical for many machine learning problems. +- It provides an agnostic view of the cluster performance by only considering the direction (and not the magnitude) of each vector. - This metric is not dependent on the scale of the variables, making it equally effective on different scales. -###### Limitations +### Limitations -- Cosine similarity does not consider magnitudes (i.e. lengths) of vectors, only their direction. This means it may -overlook instances where clusters have been adequately separated in terms of magnitude. -- This method summarily assumes that centroids represent the average behavior of data points in each cluster. This -might not always be true, especially in clusters with high amounts of variance or non-spherical shapes. +- Cosine similarity does not consider magnitudes (i.e. lengths) of vectors, only their direction. This means it may overlook instances where clusters have been adequately separated in terms of magnitude. +- This method summarily assumes that centroids represent the average behavior of data points in each cluster. This might not always be true, especially in clusters with high amounts of variance or non-spherical shapes. - It primarily works with continuous variables and is not suitable for binary or categorical variables. -- Lastly, although rare, perfect perpendicular vectors (cosine similarity = 0) could be within the same cluster, -which may give an inaccurate representation of a 'bad' cluster due to low cosine similarity score. - - - - - \ No newline at end of file +- Lastly, although rare, perfect perpendicular vectors (cosine similarity = 0) could be within the same cluster, which may give an inaccurate representation of a 'bad' cluster due to low cosine similarity score. diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 1782a2478..3ec95a741 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ClusterPerformanceMetrics +## ClusterPerformanceMetrics[()]{.muted} ```python def ClusterPerformanceMetrics( @@ -19,49 +14,33 @@ def ClusterPerformanceMetrics( Evaluates the performance of clustering machine learning models using multiple established metrics. -###### Purpose +### Purpose -The `ClusterPerformanceMetrics` test is used to assess the performance and validity of clustering machine learning -models. It evaluates homogeneity, completeness, V measure score, the Adjusted Rand Index, the Adjusted Mutual -Information, and the Fowlkes-Mallows score of the model. These metrics provide a holistic understanding of the -model's ability to accurately form clusters of the given dataset. +The `ClusterPerformanceMetrics` test is used to assess the performance and validity of clustering machine learning models. It evaluates homogeneity, completeness, V measure score, the Adjusted Rand Index, the Adjusted Mutual Information, and the Fowlkes-Mallows score of the model. These metrics provide a holistic understanding of the model's ability to accurately form clusters of the given dataset. -###### Test Mechanism +### Test Mechanism -The `ClusterPerformanceMetrics` test runs a clustering ML model over a given dataset and then calculates six -metrics using the Scikit-learn metrics computation functions**: Homogeneity Score, Completeness Score, V Measure, -Adjusted Rand Index (ARI), Adjusted Mutual Information (AMI), and Fowlkes-Mallows Score. It then returns the result -as a summary, presenting the metric values for both training and testing datasets. +The `ClusterPerformanceMetrics` test runs a clustering ML model over a given dataset and then calculates six metrics using the Scikit-learn metrics computation functions: Homogeneity Score, Completeness Score, V Measure, Adjusted Rand Index (ARI), Adjusted Mutual Information (AMI), and Fowlkes-Mallows Score. It then returns the result as a summary, presenting the metric values for both training and testing datasets. -###### Signs of High Risk +### Signs of High Risk -- Low Homogeneity Score: Indicates that the clusters formed contain a variety of classes, resulting in less pure -clusters. -- Low Completeness Score: Suggests that class instances are scattered across multiple clusters rather than being -gathered in a single cluster. +- Low Homogeneity Score: Indicates that the clusters formed contain a variety of classes, resulting in less pure clusters. +- Low Completeness Score: Suggests that class instances are scattered across multiple clusters rather than being gathered in a single cluster. - Low V Measure: Reports a low overall clustering performance. - ARI close to 0 or Negative: Implies that clustering results are random or disagree with the true labels. - AMI close to 0: Means that clustering labels are random compared with the true labels. -- Low Fowlkes-Mallows score: Signifies less precise and poor clustering performance in terms of precision and -recall. +- Low Fowlkes-Mallows score: Signifies less precise and poor clustering performance in terms of precision and recall. -###### Strengths +### Strengths - Provides a comprehensive view of clustering model performance by examining multiple clustering metrics. - Uses established and widely accepted metrics from scikit-learn, providing reliability in the results. - Able to provide performance metrics for both training and testing datasets. -- Clearly defined and human-readable descriptions of each score make it easy to understand what each score -represents. +- Clearly defined and human-readable descriptions of each score make it easy to understand what each score represents. -###### Limitations +### Limitations - Only applies to clustering models; not suitable for other types of machine learning models. - Does not test for overfitting or underfitting in the clustering model. - All the scores rely on ground truth labels, the absence or inaccuracy of which can lead to misleading results. -- Does not consider aspects like computational efficiency of the model or its capability to handle high dimensional -data. - - - - - \ No newline at end of file +- Does not consider aspects like computational efficiency of the model or its capability to handle high dimensional data. diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 9b1f47a77..164fb5e9d 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### CompletenessScore +## CompletenessScore[()]{.muted} ```python def CompletenessScore( @@ -19,40 +14,25 @@ def CompletenessScore( Evaluates a clustering model's capacity to categorize instances from a single class into the same cluster. -###### Purpose - -The Completeness Score metric is used to assess the performance of clustering models. It measures the extent to -which all the data points that are members of a given class are elements of the same cluster. The aim is to -determine the capability of the model to categorize all instances from a single class into the same cluster. - -###### Test Mechanism - -This test takes three inputs, a model and its associated training and testing datasets. It invokes the -`completeness_score` function from the sklearn library on the labels predicted by the model. High scores indicate -that data points from the same class generally appear in the same cluster, while low scores suggest the opposite. - -###### Signs of High Risk +### Purpose -- Low completeness score**: This suggests that the model struggles to group instances from the same class into one -cluster, indicating poor clustering performance. +The Completeness Score metric is used to assess the performance of clustering models. It measures the extent to which all the data points that are members of a given class are elements of the same cluster. The aim is to determine the capability of the model to categorize all instances from a single class into the same cluster. -###### Strengths +### Test Mechanism -- The Completeness Score provides an effective method for assessing the performance of a clustering model, -specifically its ability to group class instances together. -- This test metric conveniently relies on the capabilities provided by the sklearn library, ensuring consistent and -reliable test results. +This test takes three inputs, a model and its associated training and testing datasets. It invokes the `completeness_score` function from the sklearn library on the labels predicted by the model. High scores indicate that data points from the same class generally appear in the same cluster, while low scores suggest the opposite. -###### Limitations +### Signs of High Risk -- This metric only evaluates a specific aspect of clustering, meaning it may not provide a holistic or complete -view of the model's performance. -- It cannot assess the effectiveness of the model in differentiating between separate classes, as it is solely -focused on how well data points from the same class are grouped. -- The Completeness Score only applies to clustering models; it cannot be used for other types of machine learning -models. +- Low completeness score: This suggests that the model struggles to group instances from the same class into one cluster, indicating poor clustering performance. +### Strengths +- The Completeness Score provides an effective method for assessing the performance of a clustering model, specifically its ability to group class instances together. +- This test metric conveniently relies on the capabilities provided by the sklearn library, ensuring consistent and reliable test results. +### Limitations - \ No newline at end of file +- This metric only evaluates a specific aspect of clustering, meaning it may not provide a holistic or complete view of the model's performance. +- It cannot assess the effectiveness of the model in differentiating between separate classes, as it is solely focused on how well data points from the same class are grouped. +- The Completeness Score only applies to clustering models; it cannot be used for other types of machine learning models. diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 1cb8b1f1a..51af351e6 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ConfusionMatrix +## ConfusionMatrix[()]{.muted} ```python def ConfusionMatrix( @@ -17,52 +12,31 @@ def ConfusionMatrix( model: VMModel): ``` -Evaluates and visually represents the classification ML model's predictive performance using a Confusion Matrix -heatmap. +Evaluates and visually represents the classification ML model's predictive performance using a Confusion Matrix heatmap. -###### Purpose +### Purpose -The Confusion Matrix tester is designed to assess the performance of a classification Machine Learning model. This -performance is evaluated based on how well the model is able to correctly classify True Positives, True Negatives, -False Positives, and False Negatives - fundamental aspects of model accuracy. +The Confusion Matrix tester is designed to assess the performance of a classification Machine Learning model. This performance is evaluated based on how well the model is able to correctly classify True Positives, True Negatives, False Positives, and False Negatives - fundamental aspects of model accuracy. -###### Test Mechanism +### Test Mechanism -The mechanism used involves taking the predicted results (`y_test_predict`) from the classification model and -comparing them against the actual values (`y_test_true`). A confusion matrix is built using the unique labels -extracted from `y_test_true`, employing scikit-learn's metrics. The matrix is then visually rendered with the help -of Plotly's `create_annotated_heatmap` function. A heatmap is created which provides a two-dimensional graphical -representation of the model's performance, showcasing distributions of True Positives (TP), True Negatives (TN), -False Positives (FP), and False Negatives (FN). +The mechanism used involves taking the predicted results (`y_test_predict`) from the classification model and comparing them against the actual values (`y_test_true`). A confusion matrix is built using the unique labels extracted from `y_test_true`, employing scikit-learn's metrics. The matrix is then visually rendered with the help of Plotly's `create_annotated_heatmap` function. A heatmap is created which provides a two-dimensional graphical representation of the model's performance, showcasing distributions of True Positives (TP), True Negatives (TN), False Positives (FP), and False Negatives (FN). -###### Signs of High Risk +### Signs of High Risk -- High numbers of False Positives (FP) and False Negatives (FN), depicting that the model is not effectively -classifying the values. -- Low numbers of True Positives (TP) and True Negatives (TN), implying that the model is struggling with correctly -identifying class labels. +- High numbers of False Positives (FP) and False Negatives (FN), depicting that the model is not effectively classifying the values. +- Low numbers of True Positives (TP) and True Negatives (TN), implying that the model is struggling with correctly identifying class labels. -###### Strengths +### Strengths - It provides a simplified yet comprehensive visual snapshot of the classification model's predictive performance. -- It distinctly brings out True Positives (TP), True Negatives (TN), False Positives (FP), and False Negatives -(FN), thus making it easier to focus on potential areas of improvement. -- The matrix is beneficial in dealing with multi-class classification problems as it can provide a simple view of -complex model performances. -- It aids in understanding the different types of errors that the model could potentially make, as it provides -in-depth insights into Type-I and Type-II errors. +- It distinctly brings out True Positives (TP), True Negatives (TN), False Positives (FP), and False Negatives (FN), thus making it easier to focus on potential areas of improvement. +- The matrix is beneficial in dealing with multi-class classification problems as it can provide a simple view of complex model performances. +- It aids in understanding the different types of errors that the model could potentially make, as it provides in-depth insights into Type-I and Type-II errors. -###### Limitations +### Limitations -- In cases of unbalanced classes, the effectiveness of the confusion matrix might be lessened. It may wrongly -interpret the accuracy of a model that is essentially just predicting the majority class. -- It does not provide a single unified statistic that could evaluate the overall performance of the model. -Different aspects of the model's performance are evaluated separately instead. +- In cases of unbalanced classes, the effectiveness of the confusion matrix might be lessened. It may wrongly interpret the accuracy of a model that is essentially just predicting the majority class. +- It does not provide a single unified statistic that could evaluate the overall performance of the model. Different aspects of the model's performance are evaluated separately instead. - It mainly serves as a descriptive tool and does not offer the capability for statistical hypothesis testing. -- Risks of misinterpretation exist because the matrix doesn't directly provide precision, recall, or F1-score data. -These metrics have to be computed separately. - - - - - \ No newline at end of file +- Risks of misinterpretation exist because the matrix doesn't directly provide precision, recall, or F1-score data. These metrics have to be computed separately. diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 29639d7a3..bd5eabf47 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### FeatureImportance +## FeatureImportance[()]{.muted} ```python def FeatureImportance( @@ -18,46 +13,33 @@ def FeatureImportance( num_features: int = 3): ``` -Compute feature importance scores for a given model and generate a summary table -with the top important features. +Compute feature importance scores for a given model and generate a summary table with the top important features. -###### Purpose +### Purpose -The Feature Importance Comparison test is designed to compare the feature importance scores for different models -when applied to various datasets. By doing so, it aims to identify the most impactful features and assess the -consistency of feature importance across models. +The Feature Importance Comparison test is designed to compare the feature importance scores for different models when applied to various datasets. By doing so, it aims to identify the most impactful features and assess the consistency of feature importance across models. -###### Test Mechanism +### Test Mechanism -This test works by iterating through each dataset-model pair and calculating permutation feature importance (PFI) -scores. It then generates a summary table containing the top `num_features` important features for each model. The -process involves: +This test works by iterating through each dataset-model pair and calculating permutation feature importance (PFI) scores. It then generates a summary table containing the top `num_features` important features for each model. The process involves: - Extracting features and target data from each dataset. - Computing PFI scores using `sklearn.inspection.permutation_importance`. - Sorting and selecting the top features based on their importance scores. - Compiling these features into a summary table for comparison. -###### Signs of High Risk +### Signs of High Risk -- Key features expected to be important are ranked low, indicating potential issues with model training or data -quality. +- Key features expected to be important are ranked low, indicating potential issues with model training or data quality. - High variance in feature importance scores across different models, suggesting instability in feature selection. -###### Strengths +### Strengths - Provides a clear comparison of the most important features for each model. - Uses permutation importance, which is a model-agnostic method and can be applied to any estimator. -###### Limitations +### Limitations -- Assumes that the dataset is provided as a DataFrameDataset object with `x_df` and `y_df` methods to access -feature and target data. +- Assumes that the dataset is provided as a DataFrameDataset object with `x_df` and `y_df` methods to access feature and target data. - Requires that `model.model` is compatible with `sklearn.inspection.permutation_importance`. -- The function's output is dependent on the number of features specified by `num_features`, which defaults to 3 but -can be adjusted. - - - - - \ No newline at end of file +- The function's output is dependent on the number of features specified by `num_features`, which defaults to 3 but can be adjusted. diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 244d63fa3..6877aee98 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### FowlkesMallowsScore +## FowlkesMallowsScore[()]{.muted} ```python def FowlkesMallowsScore( @@ -17,47 +12,29 @@ def FowlkesMallowsScore( model: VMModel): ``` -Evaluates the similarity between predicted and actual cluster assignments in a model using the Fowlkes-Mallows -score. +Evaluates the similarity between predicted and actual cluster assignments in a model using the Fowlkes-Mallows score. -###### Purpose +### Purpose -The FowlkesMallowsScore is a performance metric used to validate clustering algorithms within machine learning -models. The score intends to evaluate the matching grade between two clusters. It measures the similarity between -the predicted and actual cluster assignments, thus gauging the accuracy of the model's clustering capability. +The FowlkesMallowsScore is a performance metric used to validate clustering algorithms within machine learning models. The score intends to evaluate the matching grade between two clusters. It measures the similarity between the predicted and actual cluster assignments, thus gauging the accuracy of the model's clustering capability. -###### Test Mechanism +### Test Mechanism -The FowlkesMallowsScore method applies the `fowlkes_mallows_score` function from the `sklearn` library to evaluate -the model's accuracy in clustering different types of data. The test fetches the datasets from the model's training -and testing datasets as inputs then compares the resulting clusters against the previously known clusters to obtain -a score. A high score indicates a better clustering performance by the model. +The FowlkesMallowsScore method applies the `fowlkes_mallows_score` function from the `sklearn` library to evaluate the model's accuracy in clustering different types of data. The test fetches the datasets from the model's training and testing datasets as inputs then compares the resulting clusters against the previously known clusters to obtain a score. A high score indicates a better clustering performance by the model. -###### Signs of High Risk +### Signs of High Risk -- A low Fowlkes-Mallows score (near zero)**: This indicates that the model's clustering capability is poor and the -algorithm isn't properly grouping data. -- Inconsistently low scores across different datasets: This may indicate that the model's clustering performance is -not robust and the model may fail when applied to unseen data. +- A low Fowlkes-Mallows score (near zero): This indicates that the model's clustering capability is poor and the algorithm isn't properly grouping data. +- Inconsistently low scores across different datasets: This may indicate that the model's clustering performance is not robust and the model may fail when applied to unseen data. -###### Strengths +### Strengths -- The Fowlkes-Mallows score is a simple and effective method for evaluating the performance of clustering -algorithms. -- This metric takes into account both precision and recall in its calculation, therefore providing a balanced and -comprehensive measure of model performance. +- The Fowlkes-Mallows score is a simple and effective method for evaluating the performance of clustering algorithms. +- This metric takes into account both precision and recall in its calculation, therefore providing a balanced and comprehensive measure of model performance. - The Fowlkes-Mallows score is non-biased meaning it treats False Positives and False Negatives equally. -###### Limitations - -- As a pairwise-based method, this score can be computationally intensive for large datasets and can become -unfeasible as the size of the dataset increases. -- The Fowlkes-Mallows score works best with balanced distribution of samples across clusters. If this condition is -not met, the score can be skewed. -- It does not handle mismatching numbers of clusters between the true and predicted labels. As such, it may return -misleading results if the predicted labels suggest a different number of clusters than what is in the true labels. - - - +### Limitations - \ No newline at end of file +- As a pairwise-based method, this score can be computationally intensive for large datasets and can become unfeasible as the size of the dataset increases. +- The Fowlkes-Mallows score works best with balanced distribution of samples across clusters. If this condition is not met, the score can be skewed. +- It does not handle mismatching numbers of clusters between the true and predicted labels. As such, it may return misleading results if the predicted labels suggest a different number of clusters than what is in the true labels. diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index fc3caa367..0788c0000 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### HomogeneityScore +## HomogeneityScore[()]{.muted} ```python def HomogeneityScore( @@ -17,45 +12,29 @@ def HomogeneityScore( model: VMModel): ``` -Assesses clustering homogeneity by comparing true and predicted labels, scoring from 0 (heterogeneous) to 1 -(homogeneous). +Assesses clustering homogeneity by comparing true and predicted labels, scoring from 0 (heterogeneous) to 1 (homogeneous). -###### Purpose +### Purpose -The Homogeneity Score encapsulated in this performance test is used to measure the homogeneity of the clusters -formed by a machine learning model. In simple terms, a clustering result satisfies homogeneity if all of its -clusters contain only points which are members of a single class. +The Homogeneity Score encapsulated in this performance test is used to measure the homogeneity of the clusters formed by a machine learning model. In simple terms, a clustering result satisfies homogeneity if all of its clusters contain only points which are members of a single class. -###### Test Mechanism +### Test Mechanism -This test uses the `homogeneity_score` function from the `sklearn.metrics` library to compare the ground truth -class labels of the training and testing sets with the labels predicted by the given model. The returned score is a -metric of the clustering accuracy, and ranges from 0.0 to 1.0, with 1.0 denoting the highest possible degree of -homogeneity. +This test uses the `homogeneity_score` function from the `sklearn.metrics` library to compare the ground truth class labels of the training and testing sets with the labels predicted by the given model. The returned score is a metric of the clustering accuracy, and ranges from 0.0 to 1.0, with 1.0 denoting the highest possible degree of homogeneity. -###### Signs of High Risk +### Signs of High Risk -- A score close to 0**: This denotes that clusters are highly heterogenous and points within the same cluster might -not belong to the same class. -- A significantly lower score for testing data compared to the score for training data: This can indicate -overfitting, where the model has learned to perfectly match the training data but fails to perform well on unseen -data. +- A score close to 0: This denotes that clusters are highly heterogenous and points within the same cluster might not belong to the same class. +- A significantly lower score for testing data compared to the score for training data: This can indicate overfitting, where the model has learned to perfectly match the training data but fails to perform well on unseen data. -###### Strengths +### Strengths - It provides a simple quantitative measure of the degree to which clusters contain points from only one class. - Useful for validating clustering solutions where the ground truth — class membership of points — is known. -- It's agnostic to the absolute labels, and cares only that the points within the same cluster have the same class -label. +- It's agnostic to the absolute labels, and cares only that the points within the same cluster have the same class label. -###### Limitations +### Limitations - The Homogeneity Score is not useful for clustering solutions where the ground truth labels are not known. - It doesn’t work well with differently sized clusters since it gives predominance to larger clusters. -- The score does not address the actual number of clusters formed, or the evenness of cluster sizes. It only checks -the homogeneity within the given clusters created by the model. - - - - - \ No newline at end of file +- The score does not address the actual number of clusters formed, or the evenness of cluster sizes. It only checks the homogeneity within the given clusters created by the model. diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 8754ee4e7..353b78c93 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### custom_recall +## custom_recall[()]{.muted} ```python def custom_recall( @@ -18,8 +13,7 @@ def custom_recall( threshold = 0.5): ``` - -#### HyperParametersTuning +## HyperParametersTuning[()]{.muted} ```python def HyperParametersTuning( @@ -31,24 +25,17 @@ def HyperParametersTuning( fit_params: dict = None): ``` -Performs exhaustive grid search over specified parameter ranges to find optimal model configurations -across different metrics and decision thresholds. +Performs exhaustive grid search over specified parameter ranges to find optimal model configurations across different metrics and decision thresholds. -###### Purpose +### Purpose -The Hyperparameter Tuning test systematically explores the model's parameter space to identify optimal -configurations. It supports multiple optimization metrics and decision thresholds, providing a comprehensive -view of how different parameter combinations affect various aspects of model performance. +The Hyperparameter Tuning test systematically explores the model's parameter space to identify optimal configurations. It supports multiple optimization metrics and decision thresholds, providing a comprehensive view of how different parameter combinations affect various aspects of model performance. -###### Test Mechanism +### Test Mechanism -The test uses scikit-learn's GridSearchCV to perform cross-validation for each parameter combination. -For each specified threshold and optimization metric, it creates a scoring dictionary with -threshold-adjusted metrics, performs grid search with cross-validation, records best parameters and -corresponding scores, and combines results into a comparative table. This process is repeated for each -optimization metric to provide a comprehensive view of model performance under different configurations. +The test uses scikit-learn's GridSearchCV to perform cross-validation for each parameter combination. For each specified threshold and optimization metric, it creates a scoring dictionary with threshold-adjusted metrics, performs grid search with cross-validation, records best parameters and corresponding scores, and combines results into a comparative table. This process is repeated for each optimization metric to provide a comprehensive view of model performance under different configurations. -###### Signs of High Risk +### Signs of High Risk - Large performance variations across different parameter combinations - Significant discrepancies between different optimization metrics @@ -59,7 +46,7 @@ optimization metric to provide a comprehensive view of model performance under d - Cross-validation scores showing high variance - Extreme parameter values in best configurations -###### Strengths +### Strengths - Comprehensive exploration of parameter space - Supports multiple optimization metrics @@ -70,7 +57,7 @@ optimization metric to provide a comprehensive view of model performance under d - Enables systematic parameter selection - Supports both classification and clustering tasks -###### Limitations +### Limitations - Computationally expensive for large parameter grids - May not find global optimum (limited to grid points) @@ -80,8 +67,3 @@ optimization metric to provide a comprehensive view of model performance under d - Cross-validation splits may not preserve time series structure - Grid search may miss optimal values between grid points - Resource intensive for high-dimensional parameter spaces - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 1c5c3e761..ea9cc07e5 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### KMeansClustersOptimization +## KMeansClustersOptimization[()]{.muted} ```python def KMeansClustersOptimization( @@ -20,50 +15,29 @@ def KMeansClustersOptimization( Optimizes the number of clusters in K-means models using Elbow and Silhouette methods. -###### Purpose +### Purpose -This metric is used to optimize the number of clusters used in K-means clustering models. It intends to measure and -evaluate the optimal number of clusters by leveraging two methodologies, namely the Elbow method and the Silhouette -method. This is crucial as an inappropriate number of clusters can either overly simplify or overcomplicate the -structure of the data, thereby undermining the effectiveness of the model. +This metric is used to optimize the number of clusters used in K-means clustering models. It intends to measure and evaluate the optimal number of clusters by leveraging two methodologies, namely the Elbow method and the Silhouette method. This is crucial as an inappropriate number of clusters can either overly simplify or overcomplicate the structure of the data, thereby undermining the effectiveness of the model. -###### Test Mechanism +### Test Mechanism -The test mechanism involves iterating over a predefined range of cluster numbers and applying both the Elbow method -and the Silhouette method. The Elbow method computes the sum of the minimum euclidean distances between data points -and their respective cluster centers (distortion). This value decreases as the number of clusters increases; the -optimal number is typically at the 'elbow' point where the decrease in distortion becomes less pronounced. -Meanwhile, the Silhouette method calculates the average silhouette score for each data point in the dataset, -providing a measure of how similar each item is to its own cluster compared to other clusters. The optimal number -of clusters under this method is the one that maximizes the average silhouette score. The results of both methods -are plotted for visual inspection. +The test mechanism involves iterating over a predefined range of cluster numbers and applying both the Elbow method and the Silhouette method. The Elbow method computes the sum of the minimum euclidean distances between data points and their respective cluster centers (distortion). This value decreases as the number of clusters increases; the optimal number is typically at the 'elbow' point where the decrease in distortion becomes less pronounced. Meanwhile, the Silhouette method calculates the average silhouette score for each data point in the dataset, providing a measure of how similar each item is to its own cluster compared to other clusters. The optimal number of clusters under this method is the one that maximizes the average silhouette score. The results of both methods are plotted for visual inspection. -###### Signs of High Risk +### Signs of High Risk - A high distortion value or a low silhouette average score for the optimal number of clusters. -- No clear 'elbow' point or plateau observed in the distortion plot, or a uniformly low silhouette average score -across different numbers of clusters, suggesting the data is not amenable to clustering. -- An optimal cluster number that is unreasonably high or low, suggestive of overfitting or underfitting, -respectively. +- No clear 'elbow' point or plateau observed in the distortion plot, or a uniformly low silhouette average score across different numbers of clusters, suggesting the data is not amenable to clustering. +- An optimal cluster number that is unreasonably high or low, suggestive of overfitting or underfitting, respectively. -###### Strengths +### Strengths - Provides both a visual and quantitative method to determine the optimal number of clusters. -- Leverages two different methods (Elbow and Silhouette), thereby affording robustness and versatility in assessing -the data's clusterability. +- Leverages two different methods (Elbow and Silhouette), thereby affording robustness and versatility in assessing the data's clusterability. - Facilitates improved model performance by allowing for an informed selection of the number of clusters. -###### Limitations +### Limitations -- Assumes that a suitable number of clusters exists in the data, which may not always be true, especially for -complex or noisy data. +- Assumes that a suitable number of clusters exists in the data, which may not always be true, especially for complex or noisy data. - Both methods may fail to provide definitive answers when the data lacks clear cluster structures. -- Might not be straightforward to determine the 'elbow' point or maximize the silhouette average score, especially -in larger and complicated datasets. -- Assumes spherical clusters (due to using the Euclidean distance in the Elbow method), which might not align with -the actual structure of the data. - - - - - \ No newline at end of file +- Might not be straightforward to determine the 'elbow' point or maximize the silhouette average score, especially in larger and complicated datasets. +- Assumes spherical clusters (due to using the Euclidean distance in the Elbow method), which might not align with the actual structure of the data. diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 98ea1d0d3..faedc528e 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### MinimumAccuracy +## MinimumAccuracy[()]{.muted} ```python def MinimumAccuracy( @@ -20,40 +15,28 @@ def MinimumAccuracy( Checks if the model's prediction accuracy meets or surpasses a specified threshold. -###### Purpose +### Purpose -The Minimum Accuracy test’s objective is to verify whether the model's prediction accuracy on a specific dataset -meets or surpasses a predetermined minimum threshold. Accuracy, which is simply the ratio of correct predictions to -total predictions, is a key metric for evaluating the model's performance. Considering binary as well as multiclass -classifications, accurate labeling becomes indispensable. +The Minimum Accuracy test’s objective is to verify whether the model's prediction accuracy on a specific dataset meets or surpasses a predetermined minimum threshold. Accuracy, which is simply the ratio of correct predictions to total predictions, is a key metric for evaluating the model's performance. Considering binary as well as multiclass classifications, accurate labeling becomes indispensable. -###### Test Mechanism +### Test Mechanism -The test mechanism involves contrasting the model's accuracy score with a preset minimum threshold value, with the -default being 0.7. The accuracy score is computed utilizing sklearn’s `accuracy_score` method, where the true -labels `y_true` and predicted labels `class_pred` are compared. If the accuracy score is above the threshold, the -test receives a passing mark. The test returns the result along with the accuracy score and threshold used for the -test. +The test mechanism involves contrasting the model's accuracy score with a preset minimum threshold value, with the default being 0.7. The accuracy score is computed utilizing sklearn’s `accuracy_score` method, where the true labels `y_true` and predicted labels `class_pred` are compared. If the accuracy score is above the threshold, the test receives a passing mark. The test returns the result along with the accuracy score and threshold used for the test. -###### Signs of High Risk +### Signs of High Risk - Model fails to achieve or surpass the predefined score threshold. - Persistent scores below the threshold, indicating a high risk of inaccurate predictions. -###### Strengths +### Strengths - Simplicity, presenting a straightforward measure of holistic model performance across all classes. - Particularly advantageous when classes are balanced. - Versatile, as it can be implemented on both binary and multiclass classification tasks. -###### Limitations +### Limitations - Misleading accuracy scores when classes in the dataset are highly imbalanced. - Favoritism towards the majority class, giving an inaccurate perception of model performance. - Inability to measure the model's precision, recall, or capacity to manage false positives or false negatives. - Focused on overall correctness and may not be sufficient for all types of model analytics. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 471ceb8a6..15fe1d364 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### MinimumF1Score +## MinimumF1Score[()]{.muted} ```python def MinimumF1Score( @@ -18,44 +13,29 @@ def MinimumF1Score( min_threshold: float = 0.5): ``` -Assesses if the model's F1 score on the validation set meets a predefined minimum threshold, ensuring balanced -performance between precision and recall. +Assesses if the model's F1 score on the validation set meets a predefined minimum threshold, ensuring balanced performance between precision and recall. -###### Purpose +### Purpose -The main objective of this test is to ensure that the F1 score, a balanced measure of precision and recall, of the -model meets or surpasses a predefined threshold on the validation dataset. The F1 score is highly useful for -gauging model performance in classification tasks, especially in cases where the distribution of positive and -negative classes is skewed. +The main objective of this test is to ensure that the F1 score, a balanced measure of precision and recall, of the model meets or surpasses a predefined threshold on the validation dataset. The F1 score is highly useful for gauging model performance in classification tasks, especially in cases where the distribution of positive and negative classes is skewed. -###### Test Mechanism +### Test Mechanism -The F1 score for the validation dataset is computed through scikit-learn's metrics in Python. The scoring mechanism -differs based on the classification problem**: for multi-class problems, macro averaging is used, and for binary -classification, the built-in `f1_score` calculation is used. The obtained F1 score is then assessed against the -predefined minimum F1 score that is expected from the model. +The F1 score for the validation dataset is computed through scikit-learn's metrics in Python. The scoring mechanism differs based on the classification problem: for multi-class problems, macro averaging is used, and for binary classification, the built-in `f1_score` calculation is used. The obtained F1 score is then assessed against the predefined minimum F1 score that is expected from the model. -###### Signs of High Risk +### Signs of High Risk - If a model returns an F1 score that is less than the established threshold, it is regarded as high risk. -- A low F1 score might suggest that the model is not finding an optimal balance between precision and recall, -failing to effectively identify positive classes while minimizing false positives. +- A low F1 score might suggest that the model is not finding an optimal balance between precision and recall, failing to effectively identify positive classes while minimizing false positives. -###### Strengths +### Strengths - Provides a balanced measure of a model's performance by accounting for both false positives and false negatives. - Particularly advantageous in scenarios with imbalanced class distribution, where accuracy can be misleading. - Flexibility in setting the threshold value allows tailored minimum acceptable performance standards. -###### Limitations +### Limitations - May not be suitable for all types of models and machine learning tasks. -- The F1 score assumes an equal cost for false positives and false negatives, which may not be true in some -real-world scenarios. -- Practitioners might need to rely on other metrics such as precision, recall, or the ROC-AUC score that align more -closely with specific requirements. - - - - - \ No newline at end of file +- The F1 score assumes an equal cost for false positives and false negatives, which may not be true in some real-world scenarios. +- Practitioners might need to rely on other metrics such as precision, recall, or the ROC-AUC score that align more closely with specific requirements. diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index a2bc9714f..630b6197e 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### MinimumROCAUCScore +## MinimumROCAUCScore[()]{.muted} ```python def MinimumROCAUCScore( @@ -20,45 +15,26 @@ def MinimumROCAUCScore( Validates model by checking if the ROC AUC score meets or surpasses a specified threshold. -###### Purpose +### Purpose -The Minimum ROC AUC Score test is used to determine the model's performance by ensuring that the Receiver Operating -Characteristic Area Under the Curve (ROC AUC) score on the validation dataset meets or exceeds a predefined -threshold. The ROC AUC score indicates how well the model can distinguish between different classes, making it a -crucial measure in binary and multiclass classification tasks. +The Minimum ROC AUC Score test is used to determine the model's performance by ensuring that the Receiver Operating Characteristic Area Under the Curve (ROC AUC) score on the validation dataset meets or exceeds a predefined threshold. The ROC AUC score indicates how well the model can distinguish between different classes, making it a crucial measure in binary and multiclass classification tasks. -###### Test Mechanism +### Test Mechanism -This test implementation calculates the multiclass ROC AUC score on the true target values and the model's -predictions. The test converts the multi-class target variables into binary format using `LabelBinarizer` before -computing the score. If this ROC AUC score is higher than the predefined threshold (defaulted to 0.5), the test -passes; otherwise, it fails. The results, including the ROC AUC score, the threshold, and whether the test passed -or failed, are then stored in a `ThresholdTestResult` object. +This test implementation calculates the multiclass ROC AUC score on the true target values and the model's predictions. The test converts the multi-class target variables into binary format using `LabelBinarizer` before computing the score. If this ROC AUC score is higher than the predefined threshold (defaulted to 0.5), the test passes; otherwise, it fails. The results, including the ROC AUC score, the threshold, and whether the test passed or failed, are then stored in a `ThresholdTestResult` object. -###### Signs of High Risk +### Signs of High Risk -- A high risk or failure in the model's performance as related to this metric would be represented by a low ROC AUC -score, specifically any score lower than the predefined minimum threshold. This suggests that the model is -struggling to distinguish between different classes effectively. +- A high risk or failure in the model's performance as related to this metric would be represented by a low ROC AUC score, specifically any score lower than the predefined minimum threshold. This suggests that the model is struggling to distinguish between different classes effectively. -###### Strengths +### Strengths -- The test considers both the true positive rate and false positive rate, providing a comprehensive performance -measure. -- ROC AUC score is threshold-independent meaning it measures the model's quality across various classification -thresholds. +- The test considers both the true positive rate and false positive rate, providing a comprehensive performance measure. +- ROC AUC score is threshold-independent meaning it measures the model's quality across various classification thresholds. - Works robustly with binary as well as multi-class classification problems. -###### Limitations - -- ROC AUC may not be useful if the class distribution is highly imbalanced; it could perform well in terms of AUC -but still fail to predict the minority class. -- The test does not provide insight into what specific aspects of the model are causing poor performance if the ROC -AUC score is unsatisfactory. -- The use of macro average for multiclass ROC AUC score implies equal weightage to each class, which might not be -appropriate if the classes are imbalanced. - - - +### Limitations - \ No newline at end of file +- ROC AUC may not be useful if the class distribution is highly imbalanced; it could perform well in terms of AUC but still fail to predict the minority class. +- The test does not provide insight into what specific aspects of the model are causing poor performance if the ROC AUC score is unsatisfactory. +- The use of macro average for multiclass ROC AUC score implies equal weightage to each class, which might not be appropriate if the classes are imbalanced. diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 13d951ff6..0a367daf1 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ModelParameters +## ModelParameters[()]{.muted} ```python def ModelParameters( @@ -19,21 +14,15 @@ def ModelParameters( Extracts and displays model parameters in a structured format for transparency and reproducibility. -###### Purpose +### Purpose -The Model Parameters test is designed to provide transparency into model configuration and ensure -reproducibility of machine learning models. It accomplishes this by extracting and presenting all -relevant parameters that define the model's behavior, making it easier to audit, validate, and -reproduce model training. +The Model Parameters test is designed to provide transparency into model configuration and ensure reproducibility of machine learning models. It accomplishes this by extracting and presenting all relevant parameters that define the model's behavior, making it easier to audit, validate, and reproduce model training. -###### Test Mechanism +### Test Mechanism -The test leverages scikit-learn's API convention of get_params() to extract model parameters. It -produces a structured DataFrame containing parameter names and their corresponding values. For models -that follow scikit-learn's API (including XGBoost, RandomForest, and other estimators), all -parameters are automatically extracted and displayed. +The test leverages scikit-learn's API convention of get_params() to extract model parameters. It produces a structured DataFrame containing parameter names and their corresponding values. For models that follow scikit-learn's API (including XGBoost, RandomForest, and other estimators), all parameters are automatically extracted and displayed. -###### Signs of High Risk +### Signs of High Risk - Missing crucial parameters that should be explicitly set - Extreme parameter values that could indicate overfitting (e.g., unlimited tree depth) @@ -41,7 +30,7 @@ parameters are automatically extracted and displayed. - Parameter combinations known to cause instability or poor performance - Default values used for critical parameters that should be tuned -###### Strengths +### Strengths - Universal compatibility with scikit-learn API-compliant models - Ensures transparency in model configuration @@ -50,15 +39,10 @@ parameters are automatically extracted and displayed. - Supports both classification and regression models - Helps identify potential configuration issues -###### Limitations +### Limitations - Only works with models implementing scikit-learn's get_params() method - Cannot capture dynamic parameters set during model training - Does not validate parameter values for model-specific appropriateness - Parameter meanings and impacts may vary across different model types - Cannot detect indirect parameter interactions or their effects on model performance - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index d2d13c63d..c2e8ef2e7 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ModelsPerformanceComparison +## ModelsPerformanceComparison[()]{.muted} ```python def ModelsPerformanceComparison( @@ -17,48 +12,30 @@ def ModelsPerformanceComparison( models: list): ``` -Evaluates and compares the performance of multiple Machine Learning models using various metrics like accuracy, -precision, recall, and F1 score. +Evaluates and compares the performance of multiple Machine Learning models using various metrics like accuracy, precision, recall, and F1 score. -###### Purpose +### Purpose -The Models Performance Comparison test aims to evaluate and compare the performance of various Machine Learning -models using test data. It employs multiple metrics such as accuracy, precision, recall, and the F1 score, among -others, to assess model performance and assist in selecting the most effective model for the designated task. +The Models Performance Comparison test aims to evaluate and compare the performance of various Machine Learning models using test data. It employs multiple metrics such as accuracy, precision, recall, and the F1 score, among others, to assess model performance and assist in selecting the most effective model for the designated task. -###### Test Mechanism +### Test Mechanism -The test employs Scikit-learn’s performance metrics to evaluate each model's performance for both binary and -multiclass classification tasks. To compare performances, the test runs each model against the test dataset, then -produces a comprehensive classification report. This report includes metrics such as accuracy, precision, recall, -and the F1 score. Based on whether the task at hand is binary or multiclass classification, it calculates metrics -for all the classes and their weighted averages, macro averages, and per-class metrics. The test will be skipped if -no models are supplied. +The test employs Scikit-learn’s performance metrics to evaluate each model's performance for both binary and multiclass classification tasks. To compare performances, the test runs each model against the test dataset, then produces a comprehensive classification report. This report includes metrics such as accuracy, precision, recall, and the F1 score. Based on whether the task at hand is binary or multiclass classification, it calculates metrics for all the classes and their weighted averages, macro averages, and per-class metrics. The test will be skipped if no models are supplied. -###### Signs of High Risk +### Signs of High Risk - Low scores in accuracy, precision, recall, and F1 metrics indicate a potentially high risk. -- A low area under the Receiver Operating Characteristic (ROC) curve (roc_auc score) is another possible indicator -of high risk. +- A low area under the Receiver Operating Characteristic (ROC) curve (roc_auc score) is another possible indicator of high risk. - If the metrics scores are significantly lower than alternative models, this might suggest a high risk of failure. -###### Strengths +### Strengths -- Provides a simple way to compare the performance of multiple models, accommodating both binary and multiclass -classification tasks. +- Provides a simple way to compare the performance of multiple models, accommodating both binary and multiclass classification tasks. - Offers a holistic view of model performance through a comprehensive report of key performance metrics. -- The inclusion of the ROC AUC score is advantageous, as this robust performance metric can effectively handle -class imbalance issues. +- The inclusion of the ROC AUC score is advantageous, as this robust performance metric can effectively handle class imbalance issues. -###### Limitations +### Limitations -- May not be suitable for more complex performance evaluations that consider factors such as prediction speed, -computational cost, or business-specific constraints. -- The test's reliability depends on the provided test dataset; hence, the selected models' performance could vary -with unseen data or changes in the data distribution. +- May not be suitable for more complex performance evaluations that consider factors such as prediction speed, computational cost, or business-specific constraints. +- The test's reliability depends on the provided test dataset; hence, the selected models' performance could vary with unseen data or changes in the data distribution. - The ROC AUC score might not be as meaningful or easily interpretable for multilabel/multiclass tasks. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 78a5d9f67..828ce192d 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### OverfitDiagnosis +## OverfitDiagnosis[()]{.muted} ```python def OverfitDiagnosis( @@ -19,47 +14,36 @@ def OverfitDiagnosis( cut_off_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): ``` -Assesses potential overfitting in a model's predictions, identifying regions where performance between training and -testing sets deviates significantly. +Assesses potential overfitting in a model's predictions, identifying regions where performance between training and testing sets deviates significantly. -###### Purpose +### Purpose -The Overfit Diagnosis test aims to identify areas in a model's predictions where there is a significant difference -in performance between the training and testing sets. This test helps to pinpoint specific regions or feature -segments where the model may be overfitting. +The Overfit Diagnosis test aims to identify areas in a model's predictions where there is a significant difference in performance between the training and testing sets. This test helps to pinpoint specific regions or feature segments where the model may be overfitting. -###### Test Mechanism +### Test Mechanism -This test compares the model's performance on training versus test data, grouped by feature columns. It calculates -the difference between the training and test performance for each group and identifies regions where this -difference exceeds a specified threshold: +This test compares the model's performance on training versus test data, grouped by feature columns. It calculates the difference between the training and test performance for each group and identifies regions where this difference exceeds a specified threshold: - The test works for both classification and regression models. - It defaults to using the AUC metric for classification models and the MSE metric for regression models. - The threshold for identifying overfitting regions is set to 0.04 by default. -- The test calculates the performance metrics for each feature segment and plots regions where the performance gap -exceeds the threshold. +- The test calculates the performance metrics for each feature segment and plots regions where the performance gap exceeds the threshold. -###### Signs of High Risk +### Signs of High Risk - Significant gaps between training and test performance metrics for specific feature segments. - Multiple regions with performance gaps exceeding the defined threshold. - Higher than expected differences in predicted versus actual values in the test set compared to the training set. -###### Strengths +### Strengths - Identifies specific areas where overfitting occurs. - Supports multiple performance metrics, providing flexibility. - Applicable to both classification and regression models. - Visualization of overfitting segments aids in better understanding and debugging. -###### Limitations +### Limitations - The default threshold may not be suitable for all use cases and requires tuning. - May not capture more subtle forms of overfitting that do not exceed the threshold. - Assumes that the binning of features adequately represents the data segments. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 675868f63..3cef2480e 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### PermutationFeatureImportance +## PermutationFeatureImportance[()]{.muted} ```python def PermutationFeatureImportance( @@ -19,45 +14,29 @@ def PermutationFeatureImportance( figure_height: Union = None): ``` -Assesses the significance of each feature in a model by evaluating the impact on model performance when feature -values are randomly rearranged. +Assesses the significance of each feature in a model by evaluating the impact on model performance when feature values are randomly rearranged. -###### Purpose +### Purpose -The Permutation Feature Importance (PFI) metric aims to assess the importance of each feature used by the Machine -Learning model. The significance is measured by evaluating the decrease in the model's performance when the -feature's values are randomly arranged. +The Permutation Feature Importance (PFI) metric aims to assess the importance of each feature used by the Machine Learning model. The significance is measured by evaluating the decrease in the model's performance when the feature's values are randomly arranged. -###### Test Mechanism +### Test Mechanism -PFI is calculated via the `permutation_importance` method from the `sklearn.inspection` module. This method -shuffles the columns of the feature dataset and measures the impact on the model's performance. A significant -decrease in performance after permutating a feature's values deems the feature as important. On the other hand, if -performance remains the same, the feature is likely not important. The output of the PFI metric is a figure -illustrating the importance of each feature. +PFI is calculated via the `permutation_importance` method from the `sklearn.inspection` module. This method shuffles the columns of the feature dataset and measures the impact on the model's performance. A significant decrease in performance after permutating a feature's values deems the feature as important. On the other hand, if performance remains the same, the feature is likely not important. The output of the PFI metric is a figure illustrating the importance of each feature. -###### Signs of High Risk +### Signs of High Risk - The model heavily relies on a feature with highly variable or easily permutable values, indicating instability. -- A feature deemed unimportant by the model but expected to have a significant effect on the outcome based on -domain knowledge is not influencing the model's predictions. +- A feature deemed unimportant by the model but expected to have a significant effect on the outcome based on domain knowledge is not influencing the model's predictions. -###### Strengths +### Strengths - Provides insights into the importance of different features and may reveal underlying data structure. - Can indicate overfitting if a particular feature or set of features overly impacts the model's predictions. -- Model-agnostic and can be used with any classifier that provides a measure of prediction accuracy before and -after feature permutation. +- Model-agnostic and can be used with any classifier that provides a measure of prediction accuracy before and after feature permutation. -###### Limitations +### Limitations -- Does not imply causality; it only presents the amount of information that a feature provides for the prediction -task. -- Does not account for interactions between features. If features are correlated, the permutation importance may -allocate importance to one and not the other. +- Does not imply causality; it only presents the amount of information that a feature provides for the prediction task. +- Does not account for interactions between features. If features are correlated, the permutation importance may allocate importance to one and not the other. - Cannot interact with certain libraries like statsmodels, pytorch, catboost, etc., thus limiting its applicability. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index c8617535b..5c595e090 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### calculate_psi +## calculate_psi[()]{.muted} ```python def calculate_psi( @@ -19,14 +14,9 @@ def calculate_psi( mode = 'fixed'): ``` -Taken from: -https://towardsdatascience.com/checking-model-stability-and-population-shift-with-psi-and-csi-6d12af008783 - - +Taken from: https://towardsdatascience.com/checking-model-stability-and-population-shift-with-psi-and-csi-6d12af008783 - - -#### PopulationStabilityIndex +## PopulationStabilityIndex[()]{.muted} ```python def PopulationStabilityIndex( @@ -36,56 +26,31 @@ def PopulationStabilityIndex( mode: str = 'fixed'): ``` -Assesses the Population Stability Index (PSI) to quantify the stability of an ML model's predictions across -different datasets. +Assesses the Population Stability Index (PSI) to quantify the stability of an ML model's predictions across different datasets. -###### Purpose +### Purpose -The Population Stability Index (PSI) serves as a quantitative assessment for evaluating the stability of a machine -learning model's output distributions when comparing two different datasets. Typically, these would be a -development and a validation dataset or two datasets collected at different periods. The PSI provides a measurable -indication of any significant shift in the model's performance over time or noticeable changes in the -characteristics of the population the model is making predictions for. +The Population Stability Index (PSI) serves as a quantitative assessment for evaluating the stability of a machine learning model's output distributions when comparing two different datasets. Typically, these would be a development and a validation dataset or two datasets collected at different periods. The PSI provides a measurable indication of any significant shift in the model's performance over time or noticeable changes in the characteristics of the population the model is making predictions for. -###### Test Mechanism +### Test Mechanism -The implementation of the PSI in this script involves calculating the PSI for each feature between the training and -test datasets. Data from both datasets is sorted and placed into either a predetermined number of bins or -quantiles. The boundaries for these bins are initially determined based on the distribution of the training data. -The contents of each bin are calculated and their respective proportions determined. Subsequently, the PSI is -derived for each bin through a logarithmic transformation of the ratio of the proportions of data for each feature -in the training and test datasets. The PSI, along with the proportions of data in each bin for both datasets, are -displayed in a summary table, a grouped bar chart, and a scatter plot. +The implementation of the PSI in this script involves calculating the PSI for each feature between the training and test datasets. Data from both datasets is sorted and placed into either a predetermined number of bins or quantiles. The boundaries for these bins are initially determined based on the distribution of the training data. The contents of each bin are calculated and their respective proportions determined. Subsequently, the PSI is derived for each bin through a logarithmic transformation of the ratio of the proportions of data for each feature in the training and test datasets. The PSI, along with the proportions of data in each bin for both datasets, are displayed in a summary table, a grouped bar chart, and a scatter plot. -###### Signs of High Risk +### Signs of High Risk -- A high PSI value is a clear indicator of high risk. Such a value suggests a significant shift in the model -predictions or severe changes in the characteristics of the underlying population. -- This ultimately suggests that the model may not be performing as well as expected and that it may be less -reliable for making future predictions. +- A high PSI value is a clear indicator of high risk. Such a value suggests a significant shift in the model predictions or severe changes in the characteristics of the underlying population. +- This ultimately suggests that the model may not be performing as well as expected and that it may be less reliable for making future predictions. -###### Strengths +### Strengths -- The PSI provides a quantitative measure of the stability of a model over time or across different samples, making -it an invaluable tool for evaluating changes in a model's performance. +- The PSI provides a quantitative measure of the stability of a model over time or across different samples, making it an invaluable tool for evaluating changes in a model's performance. - It allows for direct comparisons across different features based on the PSI value. - The calculation and interpretation of the PSI are straightforward, facilitating its use in model risk management. -- The use of visual aids such as tables and charts further simplifies the comprehension and interpretation of the -PSI. +- The use of visual aids such as tables and charts further simplifies the comprehension and interpretation of the PSI. -###### Limitations +### Limitations -- The PSI test does not account for the interdependence between features**: features that are dependent on one -another may show similar shifts in their distributions, which in turn may result in similar PSI values. -- The PSI test does not inherently provide insights into why there are differences in distributions or why the PSI -values may have changed. +- The PSI test does not account for the interdependence between features: features that are dependent on one another may show similar shifts in their distributions, which in turn may result in similar PSI values. +- The PSI test does not inherently provide insights into why there are differences in distributions or why the PSI values may have changed. - The test may not handle features with significant outliers adequately. -- Additionally, the PSI test is performed on model predictions, not on the underlying data distributions which can -lead to misinterpretations. Any changes in PSI could be due to shifts in the model (model drift), changes in the -relationships between features and the target variable (concept drift), or both. However, distinguishing between -these causes is non-trivial. - - - - - \ No newline at end of file +- Additionally, the PSI test is performed on model predictions, not on the underlying data distributions which can lead to misinterpretations. Any changes in PSI could be due to shifts in the model (model drift), changes in the relationships between features and the target variable (concept drift), or both. However, distinguishing between these causes is non-trivial. diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 9eff2e5d4..dc1941c66 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### PrecisionRecallCurve +## PrecisionRecallCurve[()]{.muted} ```python def PrecisionRecallCurve( @@ -19,44 +14,26 @@ def PrecisionRecallCurve( Evaluates the precision-recall trade-off for binary classification models and visualizes the Precision-Recall curve. -###### Purpose +### Purpose -The Precision Recall Curve metric is intended to evaluate the trade-off between precision and recall in -classification models, particularly binary classification models. It assesses the model's capacity to produce -accurate results (high precision), as well as its ability to capture a majority of all positive instances (high -recall). +The Precision Recall Curve metric is intended to evaluate the trade-off between precision and recall in classification models, particularly binary classification models. It assesses the model's capacity to produce accurate results (high precision), as well as its ability to capture a majority of all positive instances (high recall). -###### Test Mechanism +### Test Mechanism -The test extracts ground truth labels and prediction probabilities from the model's test dataset. It applies the -`precision_recall_curve` method from the sklearn metrics module to these extracted labels and predictions, which -computes a precision-recall pair for each possible threshold. This calculation results in an array of precision and -recall scores that can be plotted against each other to form the Precision-Recall Curve. This curve is then -visually represented by using Plotly's scatter plot. +The test extracts ground truth labels and prediction probabilities from the model's test dataset. It applies the `precision_recall_curve` method from the sklearn metrics module to these extracted labels and predictions, which computes a precision-recall pair for each possible threshold. This calculation results in an array of precision and recall scores that can be plotted against each other to form the Precision-Recall Curve. This curve is then visually represented by using Plotly's scatter plot. -###### Signs of High Risk +### Signs of High Risk - A lower area under the Precision-Recall Curve signifies high risk. -- This corresponds to a model yielding a high amount of false positives (low precision) and/or false negatives (low -recall). -- If the curve is closer to the bottom left of the plot, rather than being closer to the top right corner, it can -be a sign of high risk. - -###### Strengths - -- This metric aptly represents the balance between precision (minimizing false positives) and recall (minimizing -false negatives), which is especially critical in scenarios where both values are significant. -- Through the graphic representation, it enables an intuitive understanding of the model's performance across -different threshold levels. - -###### Limitations - -- This metric is only applicable to binary classification models - it raises errors for multiclass classification -models or Foundation models. -- It may not fully represent the overall accuracy of the model if the cost of false positives and false negatives -are extremely different, or if the dataset is heavily imbalanced. +- This corresponds to a model yielding a high amount of false positives (low precision) and/or false negatives (low recall). +- If the curve is closer to the bottom left of the plot, rather than being closer to the top right corner, it can be a sign of high risk. +### Strengths +- This metric aptly represents the balance between precision (minimizing false positives) and recall (minimizing false negatives), which is especially critical in scenarios where both values are significant. +- Through the graphic representation, it enables an intuitive understanding of the model's performance across different threshold levels. +### Limitations - \ No newline at end of file +- This metric is only applicable to binary classification models - it raises errors for multiclass classification models or Foundation models. +- It may not fully represent the overall accuracy of the model if the cost of false positives and false negatives are extremely different, or if the dataset is heavily imbalanced. diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 455d16204..0634af8ad 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ROCCurve +## ROCCurve[()]{.muted} ```python def ROCCurve( @@ -17,52 +12,29 @@ def ROCCurve( dataset: VMDataset): ``` -Evaluates binary classification model performance by generating and plotting the Receiver Operating Characteristic -(ROC) curve and calculating the Area Under Curve (AUC) score. +Evaluates binary classification model performance by generating and plotting the Receiver Operating Characteristic (ROC) curve and calculating the Area Under Curve (AUC) score. -###### Purpose +### Purpose -The Receiver Operating Characteristic (ROC) curve is designed to evaluate the performance of binary classification -models. This curve illustrates the balance between the True Positive Rate (TPR) and False Positive Rate (FPR) -across various threshold levels. In combination with the Area Under the Curve (AUC), the ROC curve aims to measure -the model's discrimination ability between the two defined classes in a binary classification problem (e.g., -default vs non-default). Ideally, a higher AUC score signifies superior model performance in accurately -distinguishing between the positive and negative classes. +The Receiver Operating Characteristic (ROC) curve is designed to evaluate the performance of binary classification models. This curve illustrates the balance between the True Positive Rate (TPR) and False Positive Rate (FPR) across various threshold levels. In combination with the Area Under the Curve (AUC), the ROC curve aims to measure the model's discrimination ability between the two defined classes in a binary classification problem (e.g., default vs non-default). Ideally, a higher AUC score signifies superior model performance in accurately distinguishing between the positive and negative classes. -###### Test Mechanism +### Test Mechanism -First, this script selects the target model and datasets that require binary classification. It then calculates the -predicted probabilities for the test set, and uses this data, along with the true outcomes, to generate and plot -the ROC curve. Additionally, it includes a line signifying randomness (AUC of 0.5). The AUC score for the model's -ROC curve is also computed, presenting a numerical estimation of the model's performance. If any Infinite values -are detected in the ROC threshold, these are effectively eliminated. The resulting ROC curve, AUC score, and -thresholds are consequently saved for future reference. +First, this script selects the target model and datasets that require binary classification. It then calculates the predicted probabilities for the test set, and uses this data, along with the true outcomes, to generate and plot the ROC curve. Additionally, it includes a line signifying randomness (AUC of 0.5). The AUC score for the model's ROC curve is also computed, presenting a numerical estimation of the model's performance. If any Infinite values are detected in the ROC threshold, these are effectively eliminated. The resulting ROC curve, AUC score, and thresholds are consequently saved for future reference. -###### Signs of High Risk +### Signs of High Risk - A high risk is potentially linked to the model's performance if the AUC score drops below or nears 0.5. -- Another warning sign would be the ROC curve lying closer to the line of randomness, indicating no discriminative -ability. -- For the model to be deemed competent at its classification tasks, it is crucial that the AUC score is -significantly above 0.5. +- Another warning sign would be the ROC curve lying closer to the line of randomness, indicating no discriminative ability. +- For the model to be deemed competent at its classification tasks, it is crucial that the AUC score is significantly above 0.5. -###### Strengths +### Strengths -- The ROC Curve offers an inclusive visual depiction of a model's discriminative power throughout all conceivable -classification thresholds, unlike other metrics that solely disclose model performance at one fixed threshold. -- Despite the proportions of the dataset, the AUC Score, which represents the entire ROC curve as a single data -point, continues to be consistent, proving to be the ideal choice for such situations. +- The ROC Curve offers an inclusive visual depiction of a model's discriminative power throughout all conceivable classification thresholds, unlike other metrics that solely disclose model performance at one fixed threshold. +- Despite the proportions of the dataset, the AUC Score, which represents the entire ROC curve as a single data point, continues to be consistent, proving to be the ideal choice for such situations. -###### Limitations +### Limitations -- The primary limitation is that this test is exclusively structured for binary classification tasks, thus limiting -its application towards other model types. +- The primary limitation is that this test is exclusively structured for binary classification tasks, thus limiting its application towards other model types. - Furthermore, its performance might be subpar with models that output probabilities highly skewed towards 0 or 1. -- At the extreme, the ROC curve could reflect high performance even when the majority of classifications are -incorrect, provided that the model's ranking format is retained. This phenomenon is commonly termed the "Class -Imbalance Problem". - - - - - \ No newline at end of file +- At the extreme, the ROC curve could reflect high performance even when the majority of classifications are incorrect, provided that the model's ranking format is retained. This phenomenon is commonly termed the "Class Imbalance Problem". diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index fdb183d2b..4660e8630 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### RegressionErrors +## RegressionErrors[()]{.muted} ```python def RegressionErrors( @@ -19,33 +14,29 @@ def RegressionErrors( Assesses the performance and error distribution of a regression model using various error metrics. -###### Purpose +### Purpose -The purpose of the Regression Errors test is to measure the performance of a regression model by calculating -several error metrics. This evaluation helps determine the model's accuracy and potential issues like overfitting -or bias by analyzing differences in error metrics between the training and testing datasets. +The purpose of the Regression Errors test is to measure the performance of a regression model by calculating several error metrics. This evaluation helps determine the model's accuracy and potential issues like overfitting or bias by analyzing differences in error metrics between the training and testing datasets. -###### Test Mechanism +### Test Mechanism The test computes the following error metrics: -- **Mean Absolute Error (MAE)****: Average of the absolute differences between true values and predicted values. +- **Mean Absolute Error (MAE)**: Average of the absolute differences between true values and predicted values. - **Mean Squared Error (MSE)**: Average of the squared differences between true values and predicted values. - **Root Mean Squared Error (RMSE)**: Square root of the mean squared error. -- **Mean Absolute Percentage Error (MAPE)**: Average of the absolute differences between true values and predicted -values, divided by the true values, and expressed as a percentage. +- **Mean Absolute Percentage Error (MAPE)**: Average of the absolute differences between true values and predicted values, divided by the true values, and expressed as a percentage. - **Mean Bias Deviation (MBD)**: Average bias between true values and predicted values. -These metrics are calculated separately for the training and testing datasets and compared to identify -discrepancies. +These metrics are calculated separately for the training and testing datasets and compared to identify discrepancies. -###### Signs of High Risk +### Signs of High Risk - High values for MAE, MSE, RMSE, or MAPE indicating poor model performance. - Large differences in error metrics between the training and testing datasets, suggesting overfitting. - Significant deviation of MBD from zero, indicating systematic bias in model predictions. -###### Strengths +### Strengths - Provides a comprehensive overview of model performance through multiple error metrics. - Individual metrics offer specific insights, e.g., MAE for interpretability, MSE for emphasizing larger errors. @@ -53,16 +44,10 @@ discrepancies. - MAPE allows the error to be expressed as a percentage. - MBD detects systematic bias in model predictions. -###### Limitations +### Limitations - MAE and MSE are sensitive to outliers. - RMSE heavily penalizes larger errors, which might not always be desirable. - MAPE can be misleading when actual values are near zero. - MBD may not be suitable if bias varies with the magnitude of actual values. -- These metrics may not capture all nuances of model performance and should be interpreted with domain-specific -context. - - - - - \ No newline at end of file +- These metrics may not capture all nuances of model performance and should be interpreted with domain-specific context. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index b1c67735e..373fd97aa 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### RegressionErrorsComparison +## RegressionErrorsComparison[()]{.muted} ```python def RegressionErrorsComparison( @@ -17,43 +12,29 @@ def RegressionErrorsComparison( models): ``` -Assesses multiple regression error metrics to compare model performance across different datasets, emphasizing -systematic overestimation or underestimation and large percentage errors. +Assesses multiple regression error metrics to compare model performance across different datasets, emphasizing systematic overestimation or underestimation and large percentage errors. -###### Purpose +### Purpose -The purpose of this test is to compare regression errors for different models applied to various datasets. It aims -to examine model performance using multiple error metrics, thereby identifying areas where models may be -underperforming or exhibiting bias. +The purpose of this test is to compare regression errors for different models applied to various datasets. It aims to examine model performance using multiple error metrics, thereby identifying areas where models may be underperforming or exhibiting bias. -###### Test Mechanism +### Test Mechanism -The function iterates through each dataset-model pair and calculates various error metrics, including Mean Absolute -Error (MAE), Mean Squared Error (MSE), Mean Absolute Percentage Error (MAPE), and Mean Bias Deviation (MBD). The -results are summarized in a table, which provides a comprehensive view of each model's performance on the datasets. +The function iterates through each dataset-model pair and calculates various error metrics, including Mean Absolute Error (MAE), Mean Squared Error (MSE), Mean Absolute Percentage Error (MAPE), and Mean Bias Deviation (MBD). The results are summarized in a table, which provides a comprehensive view of each model's performance on the datasets. -###### Signs of High Risk +### Signs of High Risk - High Mean Absolute Error (MAE) or Mean Squared Error (MSE), indicating poor model performance. -- High Mean Absolute Percentage Error (MAPE), suggesting large percentage errors, especially problematic if the -true values are small. -- Mean Bias Deviation (MBD) significantly different from zero, indicating systematic overestimation or -underestimation by the model. +- High Mean Absolute Percentage Error (MAPE), suggesting large percentage errors, especially problematic if the true values are small. +- Mean Bias Deviation (MBD) significantly different from zero, indicating systematic overestimation or underestimation by the model. -###### Strengths +### Strengths - Provides multiple error metrics to assess model performance from different perspectives. - Includes a check to avoid division by zero when calculating MAPE. -###### Limitations +### Limitations -- Assumes that the dataset is provided as a DataFrameDataset object with `y`, `y_pred`, and `feature_columns` -attributes. -- Relies on the `logger` from `validmind.logging` to warn about zero values in `y_true`, which should be correctly -implemented and imported. +- Assumes that the dataset is provided as a DataFrameDataset object with `y`, `y_pred`, and `feature_columns` attributes. +- Relies on the `logger` from `validmind.logging` to warn about zero values in `y_true`, which should be correctly implemented and imported. - Requires that `dataset.y_pred(model)` returns the predicted values for the model. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index dde2428ee..4c3307d9d 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### RegressionPerformance +## RegressionPerformance[()]{.muted} ```python def RegressionPerformance( @@ -17,38 +12,27 @@ def RegressionPerformance( dataset: VMDataset): ``` -Evaluates the performance of a regression model using five different metrics**: MAE, MSE, RMSE, MAPE, and MBD. +Evaluates the performance of a regression model using five different metrics: MAE, MSE, RMSE, MAPE, and MBD. -###### Purpose +### Purpose -The Regression Models Performance Comparison metric is used to measure the performance of regression models. It -calculates multiple evaluation metrics, including Mean Absolute Error (MAE), Mean Squared Error (MSE), -Root Mean Squared Error (RMSE), Mean Absolute Percentage Error (MAPE), and Mean Bias Deviation (MBD), thereby -enabling a comprehensive view of model performance. +The Regression Models Performance Comparison metric is used to measure the performance of regression models. It calculates multiple evaluation metrics, including Mean Absolute Error (MAE), Mean Squared Error (MSE), Root Mean Squared Error (RMSE), Mean Absolute Percentage Error (MAPE), and Mean Bias Deviation (MBD), thereby enabling a comprehensive view of model performance. -###### Test Mechanism +### Test Mechanism -The test uses the sklearn library to calculate the MAE, MSE, RMSE, MAPE, and MBD. These calculations encapsulate both -the direction and the magnitude of error in predictions, thereby providing a multi-faceted view of model accuracy. +The test uses the sklearn library to calculate the MAE, MSE, RMSE, MAPE, and MBD. These calculations encapsulate both the direction and the magnitude of error in predictions, thereby providing a multi-faceted view of model accuracy. -###### Signs of High Risk +### Signs of High Risk -- High values of MAE, MSE, RMSE, and MAPE, which indicate a high error rate and imply a larger departure of the -model's predictions from the true values. +- High values of MAE, MSE, RMSE, and MAPE, which indicate a high error rate and imply a larger departure of the model's predictions from the true values. - A large value of MBD, which shows a consistent bias in the model’s predictions. -###### Strengths +### Strengths - The metric evaluates models on five different metrics offering a comprehensive analysis of model performance. - It is designed to handle regression tasks and can be seamlessly integrated with libraries like sklearn. -###### Limitations +### Limitations - The metric only evaluates regression models and does not evaluate classification models. -- The test assumes that the models have been trained and tested appropriately prior to evaluation. It does not -handle pre-processing, feature selection, or other stages in the model lifecycle. - - - - - \ No newline at end of file +- The test assumes that the models have been trained and tested appropriately prior to evaluation. It does not handle pre-processing, feature selection, or other stages in the model lifecycle. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 8a9f18444..9c29844f1 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### RegressionR2Square +## RegressionR2Square[()]{.muted} ```python def RegressionR2Square( @@ -17,45 +12,29 @@ def RegressionR2Square( model): ``` -Assesses the overall goodness-of-fit of a regression model by evaluating R-squared (R2) and Adjusted R-squared (Adj -R2) scores to determine the model's explanatory power over the dependent variable. +Assesses the overall goodness-of-fit of a regression model by evaluating R-squared (R2) and Adjusted R-squared (Adj R2) scores to determine the model's explanatory power over the dependent variable. -###### Purpose +### Purpose -The purpose of the RegressionR2Square Metric test is to measure the overall goodness-of-fit of a regression model. -Specifically, this Python-based test evaluates the R-squared (R2) and Adjusted R-squared (Adj R2) scores, which are -statistical measures used to assess the strength of the relationship between the model's predictors and the -response variable. +The purpose of the RegressionR2Square Metric test is to measure the overall goodness-of-fit of a regression model. Specifically, this Python-based test evaluates the R-squared (R2) and Adjusted R-squared (Adj R2) scores, which are statistical measures used to assess the strength of the relationship between the model's predictors and the response variable. -###### Test Mechanism +### Test Mechanism -The test deploys the `r2_score` method from the Scikit-learn metrics module to measure the R2 score on both -training and test sets. This score reflects the proportion of the variance in the dependent variable that is -predictable from the independent variables. The test also calculates the Adjusted R2 score, which accounts for the -number of predictors in the model to penalize model complexity and reduce overfitting. The Adjusted R2 score will -be smaller if unnecessary predictors are included in the model. +The test deploys the `r2_score` method from the Scikit-learn metrics module to measure the R2 score on both training and test sets. This score reflects the proportion of the variance in the dependent variable that is predictable from the independent variables. The test also calculates the Adjusted R2 score, which accounts for the number of predictors in the model to penalize model complexity and reduce overfitting. The Adjusted R2 score will be smaller if unnecessary predictors are included in the model. -###### Signs of High Risk +### Signs of High Risk - Low R2 or Adjusted R2 scores, suggesting that the model does not explain much variation in the dependent variable. -- Significant discrepancy between R2 scores on the training set and test set, indicating overfitting and poor -generalization to unseen data. +- Significant discrepancy between R2 scores on the training set and test set, indicating overfitting and poor generalization to unseen data. -###### Strengths +### Strengths - Widely-used measure in regression analysis, providing a sound general indication of model performance. -- Easy to interpret and understand, as it represents the proportion of the dependent variable's variance explained -by the independent variables. +- Easy to interpret and understand, as it represents the proportion of the dependent variable's variance explained by the independent variables. - Adjusted R2 score helps control overfitting by penalizing unnecessary predictors. -###### Limitations +### Limitations - Sensitive to the inclusion of unnecessary predictors even though Adjusted R2 penalizes complexity. -- Less reliable in cases of non-linear relationships or when the underlying assumptions of linear regression are -violated. +- Less reliable in cases of non-linear relationships or when the underlying assumptions of linear regression are violated. - Does not provide insight on whether the correct regression model was used or if key assumptions have been met. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 6949872e2..33ca2b4ce 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### RegressionR2SquareComparison +## RegressionR2SquareComparison[()]{.muted} ```python def RegressionR2SquareComparison( @@ -17,47 +12,34 @@ def RegressionR2SquareComparison( models): ``` -Compares R-Squared and Adjusted R-Squared values for different regression models across multiple datasets to assess -model performance and relevance of features. +Compares R-Squared and Adjusted R-Squared values for different regression models across multiple datasets to assess model performance and relevance of features. -###### Purpose +### Purpose -The Regression R2 Square Comparison test aims to compare the R-Squared and Adjusted R-Squared values for different -regression models across various datasets. It helps in assessing how well each model explains the variability in -the dataset, and whether the models include irrelevant features. +The Regression R2 Square Comparison test aims to compare the R-Squared and Adjusted R-Squared values for different regression models across various datasets. It helps in assessing how well each model explains the variability in the dataset, and whether the models include irrelevant features. -###### Test Mechanism +### Test Mechanism This test operates by: - Iterating through each dataset-model pair. - Calculating the R-Squared values to measure how much of the variability in the dataset is explained by the model. -- Calculating the Adjusted R-Squared values, which adjust the R-Squared based on the number of predictors in the -model, making it more reliable when comparing models with different numbers of features. +- Calculating the Adjusted R-Squared values, which adjust the R-Squared based on the number of predictors in the model, making it more reliable when comparing models with different numbers of features. - Generating a summary table containing these values for each combination of dataset and model. -###### Signs of High Risk +### Signs of High Risk -- If the R-Squared values are significantly low, it indicates the model isn't explaining much of the variability in -the dataset. -- A significant difference between R-Squared and Adjusted R-Squared values might indicate that the model includes -irrelevant features. +- If the R-Squared values are significantly low, it indicates the model isn't explaining much of the variability in the dataset. +- A significant difference between R-Squared and Adjusted R-Squared values might indicate that the model includes irrelevant features. -###### Strengths +### Strengths - Provides a quantitative measure of model performance in terms of variance explained. -- Adjusted R-Squared accounts for the number of predictors, making it a more reliable measure when comparing models -with different numbers of features. +- Adjusted R-Squared accounts for the number of predictors, making it a more reliable measure when comparing models with different numbers of features. - Useful for time-series forecasting and regression tasks. -###### Limitations +### Limitations - Assumes the dataset is provided as a DataFrameDataset object with `y`, `y_pred`, and `feature_columns` attributes. -- Relies on `adj_r2_score` from the `statsmodels.statsutils` module, which needs to be correctly implemented and -imported. +- Relies on `adj_r2_score` from the `statsmodels.statsutils` module, which needs to be correctly implemented and imported. - Requires that `dataset.y_pred(model)` returns the predicted values for the model. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 4ff547414..0738ff161 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### RobustnessDiagnosis +## RobustnessDiagnosis[()]{.muted} ```python def RobustnessDiagnosis( @@ -22,41 +17,32 @@ def RobustnessDiagnosis( Assesses the robustness of a machine learning model by evaluating performance decay under noisy conditions. -###### Purpose +### Purpose -The Robustness Diagnosis test aims to evaluate the resilience of a machine learning model when subjected to -perturbations or noise in its input data. This is essential for understanding the model's ability to handle -real-world scenarios where data may be imperfect or corrupted. +The Robustness Diagnosis test aims to evaluate the resilience of a machine learning model when subjected to perturbations or noise in its input data. This is essential for understanding the model's ability to handle real-world scenarios where data may be imperfect or corrupted. -###### Test Mechanism +### Test Mechanism -This test introduces Gaussian noise to the numeric input features of the datasets at varying scales of standard -deviation. The performance of the model is then measured using a specified metric. The process includes: +This test introduces Gaussian noise to the numeric input features of the datasets at varying scales of standard deviation. The performance of the model is then measured using a specified metric. The process includes: - Adding Gaussian noise to numerical input features based on scaling factors. -- Evaluating the model's performance on the perturbed data using metrics like AUC for classification tasks and MSE -for regression tasks. +- Evaluating the model's performance on the perturbed data using metrics like AUC for classification tasks and MSE for regression tasks. - Aggregating and plotting the results to visualize performance decay relative to perturbation size. -###### Signs of High Risk +### Signs of High Risk - A significant drop in performance metrics with minimal noise. - Performance decay values exceeding the specified threshold. - Consistent failure to meet performance standards across multiple perturbation scales. -###### Strengths +### Strengths - Provides insights into the model's robustness against noisy or corrupted data. - Utilizes a variety of performance metrics suitable for both classification and regression tasks. - Visualization helps in understanding the extent of performance degradation. -###### Limitations +### Limitations - Gaussian noise might not adequately represent all types of real-world data perturbations. - Performance thresholds are somewhat arbitrary and might need tuning. - The test may not account for more complex or unstructured noise patterns that could affect model robustness. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 7da86ddc8..10a6f0c43 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### generate_shap_plot +## generate_shap_plot[()]{.muted} ```python def generate_shap_plot( @@ -20,21 +15,11 @@ def generate_shap_plot( Plots two types of SHAP global importance (SHAP). -**Arguments** - -- **type_****: The type of SHAP plot to generate. Must be "mean" or "summary". -- **shap_values**: The SHAP values to plot. -- **x_test**: The test data used to generate the SHAP values. +Args: type\_: The type of SHAP plot to generate. Must be "mean" or "summary". shap_values: The SHAP values to plot. x_test: The test data used to generate the SHAP values. -**Returns** +Returns: The generated plot. -- The generated plot. - - - - - -#### select_shap_values +## select_shap_values[()]{.muted} ```python def select_shap_values( @@ -46,25 +31,13 @@ Selects SHAP values for binary or multiclass classification. For regression models, returns the SHAP values directly as there are no classes. -**Arguments** - -- **shap_values****: The SHAP values returned by the SHAP explainer. For multiclass classification, this will be a list where each element corresponds to a class. For regression, this will be a single array of SHAP values. -- **class_of_interest**: The class index for which to retrieve SHAP values. If None (default), the function will assume binary classification and use class 1 by default. +Args: shap_values: The SHAP values returned by the SHAP explainer. For multiclass classification, this will be a list where each element corresponds to a class. For regression, this will be a single array of SHAP values. class_of_interest: The class index for which to retrieve SHAP values. If None (default), the function will assume binary classification and use class 1 by default. -**Returns** +Returns: The SHAP values for the specified class (classification) or for the regression output. -- The SHAP values for the specified class (classification) or for the regression -- output. +Raises: ValueError: If class_of_interest is specified and is out of bounds for the number of classes. -**Raises** - -- **ValueError**: If class_of_interest is specified and is out of bounds for the number of classes. - - - - - -#### SHAPGlobalImportance +## SHAPGlobalImportance[()]{.muted} ```python def SHAPGlobalImportance( @@ -77,48 +50,30 @@ def SHAPGlobalImportance( Evaluates and visualizes global feature importance using SHAP values for model explanation and risk identification. -###### Purpose +### Purpose -The SHAP (SHapley Additive exPlanations) Global Importance metric aims to elucidate model outcomes by attributing -them to the contributing features. It assigns a quantifiable global importance to each feature via their respective -absolute Shapley values, thereby making it suitable for tasks like classification (both binary and multiclass). -This metric forms an essential part of model risk management. +The SHAP (SHapley Additive exPlanations) Global Importance metric aims to elucidate model outcomes by attributing them to the contributing features. It assigns a quantifiable global importance to each feature via their respective absolute Shapley values, thereby making it suitable for tasks like classification (both binary and multiclass). This metric forms an essential part of model risk management. -###### Test Mechanism +### Test Mechanism -The exam begins with the selection of a suitable explainer which aligns with the model's type. For tree-based -models like XGBClassifier, RandomForestClassifier, CatBoostClassifier, TreeExplainer is used whereas for linear -models like LogisticRegression, XGBRegressor, LinearRegression, it is the LinearExplainer. Once the explainer -calculates the Shapley values, these values are visualized using two specific graphical representations: +The exam begins with the selection of a suitable explainer which aligns with the model's type. For tree-based models like XGBClassifier, RandomForestClassifier, CatBoostClassifier, TreeExplainer is used whereas for linear models like LogisticRegression, XGBRegressor, LinearRegression, it is the LinearExplainer. Once the explainer calculates the Shapley values, these values are visualized using two specific graphical representations: -1. Mean Importance Plot**: This graph portrays the significance of individual features based on their absolute -Shapley values. It calculates the average of these absolute Shapley values across all instances to highlight the -global importance of features. +1. Mean Importance Plot: This graph portrays the significance of individual features based on their absolute Shapley values. It calculates the average of these absolute Shapley values across all instances to highlight the global importance of features. -2. Summary Plot: This visual tool combines the feature importance with their effects. Every dot on this chart -represents a Shapley value for a certain feature in a specific case. The vertical axis is denoted by the feature -whereas the horizontal one corresponds to the Shapley value. A color gradient indicates the value of the feature, -gradually changing from low to high. Features are systematically organized in accordance with their importance. +1. Summary Plot: This visual tool combines the feature importance with their effects. Every dot on this chart represents a Shapley value for a certain feature in a specific case. The vertical axis is denoted by the feature whereas the horizontal one corresponds to the Shapley value. A color gradient indicates the value of the feature, gradually changing from low to high. Features are systematically organized in accordance with their importance. -###### Signs of High Risk +### Signs of High Risk - Overemphasis on certain features in SHAP importance plots, thus hinting at the possibility of model overfitting -- Anomalies such as unexpected or illogical features showing high importance, which might suggest that the model's -decisions are rooted in incorrect or undesirable reasoning +- Anomalies such as unexpected or illogical features showing high importance, which might suggest that the model's decisions are rooted in incorrect or undesirable reasoning - A SHAP summary plot filled with high variability or scattered data points, indicating a cause for concern -###### Strengths +### Strengths -- SHAP does more than just illustrating global feature significance, it offers a detailed perspective on how -different features shape the model's decision-making logic for each instance. +- SHAP does more than just illustrating global feature significance, it offers a detailed perspective on how different features shape the model's decision-making logic for each instance. - It provides clear insights into model behavior. -###### Limitations +### Limitations - High-dimensional data can convolute interpretations. - Associating importance with tangible real-world impact still involves a certain degree of subjectivity. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index d394cefcb..b665db115 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ScoreProbabilityAlignment +## ScoreProbabilityAlignment[()]{.muted} ```python def ScoreProbabilityAlignment( @@ -21,21 +16,20 @@ def ScoreProbabilityAlignment( Analyzes the alignment between credit scores and predicted probabilities. -###### Purpose +### Purpose -The Score-Probability Alignment test evaluates how well credit scores align with -predicted default probabilities. This helps validate score scaling, identify potential -calibration issues, and ensure scores reflect risk appropriately. +The Score-Probability Alignment test evaluates how well credit scores align with predicted default probabilities. This helps validate score scaling, identify potential calibration issues, and ensure scores reflect risk appropriately. -###### Test Mechanism +### Test Mechanism The test: + 1. Groups scores into bins -2. Calculates average predicted probability per bin -3. Tests monotonicity of relationship -4. Analyzes probability distribution within score bands +1. Calculates average predicted probability per bin +1. Tests monotonicity of relationship +1. Analyzes probability distribution within score bands -###### Signs of High Risk +### Signs of High Risk - Non-monotonic relationship between scores and probabilities - Large probability variations within score bands @@ -46,7 +40,7 @@ The test: - Score bands with similar probability profiles - Unstable probability estimates in key decision bands -###### Strengths +### Strengths - Direct validation of score-to-probability relationship - Identifies potential calibration issues @@ -57,7 +51,7 @@ The test: - Easy to interpret - Supports regulatory documentation -###### Limitations +### Limitations - Sensitive to bin selection - Requires sufficient data per bin @@ -67,8 +61,3 @@ The test: - Assumes scores should align with probabilities - May oversimplify complex relationships - Limited to binary outcomes - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 5a81689ba..ab7b64616 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### SilhouettePlot +## SilhouettePlot[()]{.muted} ```python def SilhouettePlot( @@ -17,52 +12,30 @@ def SilhouettePlot( dataset: VMDataset): ``` -Calculates and visualizes Silhouette Score, assessing the degree of data point suitability to its cluster in ML -models. +Calculates and visualizes Silhouette Score, assessing the degree of data point suitability to its cluster in ML models. -###### Purpose +### Purpose -This test calculates the Silhouette Score, which is a model performance metric used in clustering applications. -Primarily, the Silhouette Score evaluates how similar a data point is to its own cluster compared to other -clusters. The metric ranges between -1 and 1, where a high value indicates that the object is well matched to its -own cluster and poorly matched to neighboring clusters. Thus, the goal is to achieve a high Silhouette Score, -implying well-separated clusters. +This test calculates the Silhouette Score, which is a model performance metric used in clustering applications. Primarily, the Silhouette Score evaluates how similar a data point is to its own cluster compared to other clusters. The metric ranges between -1 and 1, where a high value indicates that the object is well matched to its own cluster and poorly matched to neighboring clusters. Thus, the goal is to achieve a high Silhouette Score, implying well-separated clusters. -###### Test Mechanism +### Test Mechanism -The test first extracts the true and predicted labels from the model's training data. The test runs the Silhouette -Score function, which takes as input the training dataset features and the predicted labels, subsequently -calculating the average score. This average Silhouette Score is printed for reference. The script then calculates -the silhouette coefficients for each data point, helping to form the Silhouette Plot. Each cluster is represented -in this plot, with color distinguishing between different clusters. A red dashed line indicates the average -Silhouette Score. The Silhouette Scores are also collected into a structured table, facilitating model performance -analysis and comparison. +The test first extracts the true and predicted labels from the model's training data. The test runs the Silhouette Score function, which takes as input the training dataset features and the predicted labels, subsequently calculating the average score. This average Silhouette Score is printed for reference. The script then calculates the silhouette coefficients for each data point, helping to form the Silhouette Plot. Each cluster is represented in this plot, with color distinguishing between different clusters. A red dashed line indicates the average Silhouette Score. The Silhouette Scores are also collected into a structured table, facilitating model performance analysis and comparison. -###### Signs of High Risk +### Signs of High Risk -- A low Silhouette Score, potentially indicating that the clusters are not well separated and that data points may -not be fitting well to their respective clusters. -- A Silhouette Plot displaying overlapping clusters or the absence of clear distinctions between clusters visually -also suggests poor clustering performance. +- A low Silhouette Score, potentially indicating that the clusters are not well separated and that data points may not be fitting well to their respective clusters. +- A Silhouette Plot displaying overlapping clusters or the absence of clear distinctions between clusters visually also suggests poor clustering performance. -###### Strengths +### Strengths -- The Silhouette Score provides a clear and quantitative measure of how well data points have been grouped into -clusters, offering insights into model performance. -- The Silhouette Plot provides an intuitive, graphical representation of the clustering mechanism, aiding visual -assessments of model performance. +- The Silhouette Score provides a clear and quantitative measure of how well data points have been grouped into clusters, offering insights into model performance. +- The Silhouette Plot provides an intuitive, graphical representation of the clustering mechanism, aiding visual assessments of model performance. - It does not require ground truth labels, so it's useful when true cluster assignments are not known. -###### Limitations +### Limitations -- The Silhouette Score may be susceptible to the influence of outliers, which could impact its accuracy and -reliability. +- The Silhouette Score may be susceptible to the influence of outliers, which could impact its accuracy and reliability. - It assumes the clusters are convex and isotropic, which might not be the case with complex datasets. -- Due to the average nature of the Silhouette Score, the metric does not account for individual data point -assignment nuances, so potentially relevant details may be omitted. +- Due to the average nature of the Silhouette Score, the metric does not account for individual data point assignment nuances, so potentially relevant details may be omitted. - Computationally expensive for large datasets, as it requires pairwise distance computations. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index e87ec64e9..9f8e0c3a6 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### TrainingTestDegradation +## TrainingTestDegradation[()]{.muted} ```python def TrainingTestDegradation( @@ -20,45 +15,28 @@ def TrainingTestDegradation( Tests if model performance degradation between training and test datasets exceeds a predefined threshold. -###### Purpose +### Purpose -The `TrainingTestDegradation` class serves as a test to verify that the degradation in performance between the -training and test datasets does not exceed a predefined threshold. This test measures the model's ability to -generalize from its training data to unseen test data, assessing key classification metrics such as accuracy, -precision, recall, and f1 score to verify the model's robustness and reliability. +The `TrainingTestDegradation` class serves as a test to verify that the degradation in performance between the training and test datasets does not exceed a predefined threshold. This test measures the model's ability to generalize from its training data to unseen test data, assessing key classification metrics such as accuracy, precision, recall, and f1 score to verify the model's robustness and reliability. -###### Test Mechanism +### Test Mechanism -The code applies several predefined metrics, including accuracy, precision, recall, and f1 scores, to the model's -predictions for both the training and test datasets. It calculates the degradation as the difference between the -training score and test score divided by the training score. The test is considered successful if the degradation -for each metric is less than the preset maximum threshold of 10%. The results are summarized in a table showing -each metric's train score, test score, degradation percentage, and pass/fail status. +The code applies several predefined metrics, including accuracy, precision, recall, and f1 scores, to the model's predictions for both the training and test datasets. It calculates the degradation as the difference between the training score and test score divided by the training score. The test is considered successful if the degradation for each metric is less than the preset maximum threshold of 10%. The results are summarized in a table showing each metric's train score, test score, degradation percentage, and pass/fail status. -###### Signs of High Risk +### Signs of High Risk - A degradation percentage that exceeds the maximum allowed threshold of 10% for any of the evaluated metrics. - A high difference or gap between the metric scores on the training and the test datasets. - The 'Pass/Fail' column displaying 'Fail' for any of the evaluated metrics. -###### Strengths +### Strengths -- Provides a quantitative measure of the model's ability to generalize to unseen data, which is key for predicting -its practical real-world performance. -- By evaluating multiple metrics, it takes into account different facets of model performance and enables a more -holistic evaluation. -- The use of a variable predefined threshold allows the flexibility to adjust the acceptability criteria for -different scenarios. +- Provides a quantitative measure of the model's ability to generalize to unseen data, which is key for predicting its practical real-world performance. +- By evaluating multiple metrics, it takes into account different facets of model performance and enables a more holistic evaluation. +- The use of a variable predefined threshold allows the flexibility to adjust the acceptability criteria for different scenarios. -###### Limitations +### Limitations -- The test compares raw performance on training and test data but does not factor in the nature of the data. Areas -with less representation in the training set might still perform poorly on unseen data. -- It requires good coverage and balance in the test and training datasets to produce reliable results, which may -not always be available. +- The test compares raw performance on training and test data but does not factor in the nature of the data. Areas with less representation in the training set might still perform poorly on unseen data. +- It requires good coverage and balance in the test and training datasets to produce reliable results, which may not always be available. - The test is currently only designed for classification tasks. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 6902db905..4ae17832f 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### VMeasure +## VMeasure[()]{.muted} ```python def VMeasure( @@ -19,41 +14,24 @@ def VMeasure( Evaluates homogeneity and completeness of a clustering model using the V Measure Score. -###### Purpose - -The purpose of this metric, V Measure Score (V Score), is to evaluate the performance of a clustering model. It -measures the homogeneity and completeness of a set of cluster labels, where homogeneity refers to each cluster -containing only members of a single class and completeness meaning all members of a given class are assigned to the -same cluster. - -###### Test Mechanism - -ClusterVMeasure is a class that inherits from another class, ClusterPerformance. It uses the `v_measure_score` -function from the sklearn module's metrics package. The required inputs to perform this metric are the model, train -dataset, and test dataset. The test is appropriate for models tasked with clustering. - -###### Signs of High Risk +### Purpose -- Low V Measure Score**: A low V Measure Score indicates that the clustering model has poor homogeneity or -completeness, or both. This might signal that the model is failing to correctly cluster the data. +The purpose of this metric, V Measure Score (V Score), is to evaluate the performance of a clustering model. It measures the homogeneity and completeness of a set of cluster labels, where homogeneity refers to each cluster containing only members of a single class and completeness meaning all members of a given class are assigned to the same cluster. -###### Strengths +### Test Mechanism -- The V Measure Score is a harmonic mean between homogeneity and completeness. This ensures that both attributes -are taken into account when evaluating the model, providing an overall measure of its cluster validity. -- The metric does not require knowledge of the ground truth classes when measuring homogeneity and completeness, -making it applicable in instances where such information is unavailable. +ClusterVMeasure is a class that inherits from another class, ClusterPerformance. It uses the `v_measure_score` function from the sklearn module's metrics package. The required inputs to perform this metric are the model, train dataset, and test dataset. The test is appropriate for models tasked with clustering. -###### Limitations +### Signs of High Risk -- The V Measure Score can be influenced by the number of clusters, which means that it might not always reflect the -quality of the clustering. Partitioning the data into many small clusters could lead to high homogeneity but low -completeness, leading to a low V Measure Score even if the clustering might be useful. -- It assumes equal importance of homogeneity and completeness. In some applications, one may be more important than -the other. The V Measure Score does not provide flexibility in assigning different weights to homogeneity and -completeness. +- Low V Measure Score: A low V Measure Score indicates that the clustering model has poor homogeneity or completeness, or both. This might signal that the model is failing to correctly cluster the data. +### Strengths +- The V Measure Score is a harmonic mean between homogeneity and completeness. This ensures that both attributes are taken into account when evaluating the model, providing an overall measure of its cluster validity. +- The metric does not require knowledge of the ground truth classes when measuring homogeneity and completeness, making it applicable in instances where such information is unavailable. +### Limitations - \ No newline at end of file +- The V Measure Score can be influenced by the number of clusters, which means that it might not always reflect the quality of the clustering. Partitioning the data into many small clusters could lead to high homogeneity but low completeness, leading to a low V Measure Score even if the clustering might be useful. +- It assumes equal importance of homogeneity and completeness. In some applications, one may be more important than the other. The V Measure Score does not provide flexibility in assigning different weights to homogeneity and completeness. diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index d41af8671..c477753c0 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### WeakspotsDiagnosis +## WeakspotsDiagnosis[()]{.muted} ```python def WeakspotsDiagnosis( @@ -20,55 +15,31 @@ def WeakspotsDiagnosis( thresholds: Union = None): ``` -Identifies and visualizes weak spots in a machine learning model's performance across various sections of the -feature space. +Identifies and visualizes weak spots in a machine learning model's performance across various sections of the feature space. -###### Purpose +### Purpose -The weak spots test is applied to evaluate the performance of a machine learning model within specific regions of -its feature space. This test slices the feature space into various sections, evaluating the model's outputs within -each section against specific performance metrics (e.g., accuracy, precision, recall, and F1 scores). The ultimate -aim is to identify areas where the model's performance falls below the set thresholds, thereby exposing its -possible weaknesses and limitations. +The weak spots test is applied to evaluate the performance of a machine learning model within specific regions of its feature space. This test slices the feature space into various sections, evaluating the model's outputs within each section against specific performance metrics (e.g., accuracy, precision, recall, and F1 scores). The ultimate aim is to identify areas where the model's performance falls below the set thresholds, thereby exposing its possible weaknesses and limitations. -###### Test Mechanism +### Test Mechanism -The test mechanism adopts an approach of dividing the feature space of the training dataset into numerous bins. The -model's performance metrics (accuracy, precision, recall, F1 scores) are then computed for each bin on both the -training and test datasets. A "weak spot" is identified if any of the performance metrics fall below a -predetermined threshold for a particular bin on the test dataset. The test results are visually plotted as bar -charts for each performance metric, indicating the bins which fail to meet the established threshold. +The test mechanism adopts an approach of dividing the feature space of the training dataset into numerous bins. The model's performance metrics (accuracy, precision, recall, F1 scores) are then computed for each bin on both the training and test datasets. A "weak spot" is identified if any of the performance metrics fall below a predetermined threshold for a particular bin on the test dataset. The test results are visually plotted as bar charts for each performance metric, indicating the bins which fail to meet the established threshold. -###### Signs of High Risk +### Signs of High Risk - Any performance metric of the model dropping below the set thresholds. -- Significant disparity in performance between the training and test datasets within a bin could be an indication -of overfitting. -- Regions or slices with consistently low performance metrics. Such instances could mean that the model struggles -to handle specific types of input data adequately, resulting in potentially inaccurate predictions. - -###### Strengths - -- The test helps pinpoint precise regions of the feature space where the model's performance is below par, allowing -for more targeted improvements to the model. -- The graphical presentation of the performance metrics offers an intuitive way to understand the model's -performance across different feature areas. -- The test exhibits flexibility, letting users set different thresholds for various performance metrics according -to the specific requirements of the application. - -###### Limitations - -- The binning system utilized for the feature space in the test could over-simplify the model's behavior within -each bin. The granularity of this slicing depends on the chosen 'bins' parameter and can sometimes be arbitrary. -- The effectiveness of this test largely hinges on the selection of thresholds for the performance metrics, which -may not hold universally applicable and could be subjected to the specifications of a particular model and -application. -- The test is unable to handle datasets with a text column, limiting its application to numerical or categorical -data types only. -- Despite its usefulness in highlighting problematic regions, the test does not offer direct suggestions for model -improvement. +- Significant disparity in performance between the training and test datasets within a bin could be an indication of overfitting. +- Regions or slices with consistently low performance metrics. Such instances could mean that the model struggles to handle specific types of input data adequately, resulting in potentially inaccurate predictions. +### Strengths +- The test helps pinpoint precise regions of the feature space where the model's performance is below par, allowing for more targeted improvements to the model. +- The graphical presentation of the performance metrics offers an intuitive way to understand the model's performance across different feature areas. +- The test exhibits flexibility, letting users set different thresholds for various performance metrics according to the specific requirements of the application. +### Limitations - \ No newline at end of file +- The binning system utilized for the feature space in the test could over-simplify the model's behavior within each bin. The granularity of this slicing depends on the chosen 'bins' parameter and can sometimes be arbitrary. +- The effectiveness of this test largely hinges on the selection of thresholds for the performance metrics, which may not hold universally applicable and could be subjected to the specifications of a particular model and application. +- The test is unable to handle datasets with a text column, limiting its application to numerical or categorical data types only. +- Despite its usefulness in highlighting problematic regions, the test does not offer direct suggestions for model improvement. diff --git a/docs/validmind/tests/model_validation/statsmodels.qmd b/docs/validmind/tests/model_validation/statsmodels.qmd index e640e5540..7b5bf3a0f 100644 --- a/docs/validmind/tests/model_validation/statsmodels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels.qmd @@ -4,9 +4,6 @@ toc-depth: 3 toc-expand: 3 --- - - - - [AutoARIMA](statsmodels/AutoARIMA.qmd) - [CumulativePredictionProbabilities](statsmodels/CumulativePredictionProbabilities.qmd) - [DurbinWatsonTest](statsmodels/DurbinWatsonTest.qmd) @@ -23,4 +20,3 @@ toc-expand: 3 - [RegressionPermutationFeatureImportance](statsmodels/RegressionPermutationFeatureImportance.qmd) - [ScorecardHistogram](statsmodels/ScorecardHistogram.qmd) - [statsutils](statsmodels/statsutils.qmd) - diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 544447332..c0e3464c4 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### AutoARIMA +## AutoARIMA[()]{.muted} ```python def AutoARIMA( @@ -19,53 +14,28 @@ def AutoARIMA( Evaluates ARIMA models for time-series forecasting, ranking them using Bayesian and Akaike Information Criteria. -###### Purpose - -The AutoARIMA validation test is designed to evaluate and rank AutoRegressive Integrated Moving Average (ARIMA) -models. These models are primarily used for forecasting time-series data. The validation test automatically fits -multiple ARIMA models, with varying parameters, to every variable within the given dataset. The models are then -ranked based on their Bayesian Information Criterion (BIC) and Akaike Information Criterion (AIC) values, which -provide a basis for the efficient model selection process. - -###### Test Mechanism - -This metric proceeds by generating an array of feasible combinations of ARIMA model parameters which are within a -prescribed limit. These limits include `max_p`, `max_d`, `max_q`; they represent the autoregressive, differencing, -and moving average components respectively. Upon applying these sets of parameters, the validation test fits each -ARIMA model to the time-series data provided. For each model, it subsequently proceeds to calculate and record both -the BIC and AIC values, which serve as performance indicators for the model fit. Prior to this parameter fitting -process, the Augmented Dickey-Fuller test for data stationarity is conducted on the data series. If a series is -found to be non-stationary, a warning message is sent out, given that ARIMA models necessitate input series to be -stationary. - -###### Signs of High Risk +### Purpose -- If the p-value of the Augmented Dickey-Fuller test for a variable exceeds 0.05, a warning is logged. This warning -indicates that the series might not be stationary, leading to potentially inaccurate results. -- Consistent failure in fitting ARIMA models (as made evident through logged errors) might disclose issues with -either the data or model stability. +The AutoARIMA validation test is designed to evaluate and rank AutoRegressive Integrated Moving Average (ARIMA) models. These models are primarily used for forecasting time-series data. The validation test automatically fits multiple ARIMA models, with varying parameters, to every variable within the given dataset. The models are then ranked based on their Bayesian Information Criterion (BIC) and Akaike Information Criterion (AIC) values, which provide a basis for the efficient model selection process. -###### Strengths +### Test Mechanism -- The AutoARIMA validation test simplifies the often complex task of selecting the most suitable ARIMA model based -on BIC and AIC criteria. -- The mechanism incorporates a check for non-stationarity within the data, which is a critical prerequisite for -ARIMA models. -- The exhaustive search through all possible combinations of model parameters enhances the likelihood of -identifying the best-fit model. +This metric proceeds by generating an array of feasible combinations of ARIMA model parameters which are within a prescribed limit. These limits include `max_p`, `max_d`, `max_q`; they represent the autoregressive, differencing, and moving average components respectively. Upon applying these sets of parameters, the validation test fits each ARIMA model to the time-series data provided. For each model, it subsequently proceeds to calculate and record both the BIC and AIC values, which serve as performance indicators for the model fit. Prior to this parameter fitting process, the Augmented Dickey-Fuller test for data stationarity is conducted on the data series. If a series is found to be non-stationary, a warning message is sent out, given that ARIMA models necessitate input series to be stationary. -###### Limitations +### Signs of High Risk -- This validation test can be computationally costly as it involves creating and fitting multiple ARIMA models for -every variable. -- Although the test checks for non-stationarity and logs warnings where present, it does not apply any -transformations to the data to establish stationarity. -- The selection of models leans solely on BIC and AIC criteria, which may not yield the best predictive model in -all scenarios. -- The test is only applicable to regression tasks involving time-series data, and may not work effectively for -other types of machine learning tasks. +- If the p-value of the Augmented Dickey-Fuller test for a variable exceeds 0.05, a warning is logged. This warning indicates that the series might not be stationary, leading to potentially inaccurate results. +- Consistent failure in fitting ARIMA models (as made evident through logged errors) might disclose issues with either the data or model stability. +### Strengths +- The AutoARIMA validation test simplifies the often complex task of selecting the most suitable ARIMA model based on BIC and AIC criteria. +- The mechanism incorporates a check for non-stationarity within the data, which is a critical prerequisite for ARIMA models. +- The exhaustive search through all possible combinations of model parameters enhances the likelihood of identifying the best-fit model. +### Limitations - \ No newline at end of file +- This validation test can be computationally costly as it involves creating and fitting multiple ARIMA models for every variable. +- Although the test checks for non-stationarity and logs warnings where present, it does not apply any transformations to the data to establish stationarity. +- The selection of models leans solely on BIC and AIC criteria, which may not yield the best predictive model in all scenarios. +- The test is only applicable to regression tasks involving time-series data, and may not work effectively for other types of machine learning tasks. diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 5a86ace41..ecd8476b3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### CumulativePredictionProbabilities +## CumulativePredictionProbabilities[()]{.muted} ```python def CumulativePredictionProbabilities( @@ -20,50 +15,29 @@ def CumulativePredictionProbabilities( Visualizes cumulative probabilities of positive and negative classes for both training and testing in classification models. -###### Purpose +### Purpose -This metric is utilized to evaluate the distribution of predicted probabilities for positive and negative classes -in a classification model. It provides a visual assessment of the model's behavior by plotting the cumulative -probabilities for positive and negative classes across both the training and test datasets. +This metric is utilized to evaluate the distribution of predicted probabilities for positive and negative classes in a classification model. It provides a visual assessment of the model's behavior by plotting the cumulative probabilities for positive and negative classes across both the training and test datasets. -###### Test Mechanism +### Test Mechanism -The classification model is evaluated by first computing the predicted probabilities for each instance in both -the training and test datasets, which are then added as a new column in these sets. The cumulative probabilities -for positive and negative classes are subsequently calculated and sorted in ascending order. Cumulative -distributions of these probabilities are created for both positive and negative classes across both training and -test datasets. These cumulative probabilities are represented visually in a plot, containing two subplots - one for -the training data and the other for the test data, with lines representing cumulative distributions of positive and -negative classes. +The classification model is evaluated by first computing the predicted probabilities for each instance in both the training and test datasets, which are then added as a new column in these sets. The cumulative probabilities for positive and negative classes are subsequently calculated and sorted in ascending order. Cumulative distributions of these probabilities are created for both positive and negative classes across both training and test datasets. These cumulative probabilities are represented visually in a plot, containing two subplots - one for the training data and the other for the test data, with lines representing cumulative distributions of positive and negative classes. -###### Signs of High Risk +### Signs of High Risk - Imbalanced distribution of probabilities for either positive or negative classes. -- Notable discrepancies or significant differences between the cumulative probability distributions for the -training data versus the test data. -- Marked discrepancies or large differences between the cumulative probability distributions for positive and -negative classes. +- Notable discrepancies or significant differences between the cumulative probability distributions for the training data versus the test data. +- Marked discrepancies or large differences between the cumulative probability distributions for positive and negative classes. -###### Strengths +### Strengths -- Provides a visual illustration of data, which enhances the ease of understanding and interpreting the model's -behavior. -- Allows for the comparison of model's behavior across training and testing datasets, providing insights about how -well the model is generalized. -- Differentiates between positive and negative classes and their respective distribution patterns, aiding in -problem diagnosis. +- Provides a visual illustration of data, which enhances the ease of understanding and interpreting the model's behavior. +- Allows for the comparison of model's behavior across training and testing datasets, providing insights about how well the model is generalized. +- Differentiates between positive and negative classes and their respective distribution patterns, aiding in problem diagnosis. -###### Limitations +### Limitations - Exclusive to classification tasks and specifically to classification models. -- Graphical results necessitate human interpretation and may not be directly applicable for automated risk -detection. -- The method does not give a solitary quantifiable measure of model risk, instead, it offers a visual -representation and broad distributional information. -- If the training and test datasets are not representative of the overall data distribution, the metric could -provide misleading results. - - - - - \ No newline at end of file +- Graphical results necessitate human interpretation and may not be directly applicable for automated risk detection. +- The method does not give a solitary quantifiable measure of model risk, instead, it offers a visual representation and broad distributional information. +- If the training and test datasets are not representative of the overall data distribution, the metric could provide misleading results. diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index a1f13714b..81e018489 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### DurbinWatsonTest +## DurbinWatsonTest[()]{.muted} ```python def DurbinWatsonTest( @@ -20,41 +15,26 @@ def DurbinWatsonTest( Assesses autocorrelation in time series data features using the Durbin-Watson statistic. -###### Purpose +### Purpose -The Durbin-Watson Test metric detects autocorrelation in time series data (where a set of data values influences -their predecessors). Autocorrelation is a crucial factor for regression tasks as these often assume the -independence of residuals. A model with significant autocorrelation may give unreliable predictions. +The Durbin-Watson Test metric detects autocorrelation in time series data (where a set of data values influences their predecessors). Autocorrelation is a crucial factor for regression tasks as these often assume the independence of residuals. A model with significant autocorrelation may give unreliable predictions. -###### Test Mechanism +### Test Mechanism -Utilizing the `durbin_watson` function in the `statsmodels` Python library, the Durbin-Watson (DW) Test metric -generates a statistical value for each feature of the training dataset. The function is looped over all columns of -the dataset, calculating and caching the DW value for each column for further analysis. A DW metric value nearing 2 -indicates no autocorrelation. Conversely, values approaching 0 suggest positive autocorrelation, and those leaning -towards 4 imply negative autocorrelation. +Utilizing the `durbin_watson` function in the `statsmodels` Python library, the Durbin-Watson (DW) Test metric generates a statistical value for each feature of the training dataset. The function is looped over all columns of the dataset, calculating and caching the DW value for each column for further analysis. A DW metric value nearing 2 indicates no autocorrelation. Conversely, values approaching 0 suggest positive autocorrelation, and those leaning towards 4 imply negative autocorrelation. -###### Signs of High Risk +### Signs of High Risk -- If a feature's DW value significantly deviates from 2, it could signal a high risk due to potential -autocorrelation issues in the dataset. -- A value closer to 0 could imply positive autocorrelation, while a value nearer to 4 could point to negative -autocorrelation, both leading to potentially unreliable prediction models. +- If a feature's DW value significantly deviates from 2, it could signal a high risk due to potential autocorrelation issues in the dataset. +- A value closer to 0 could imply positive autocorrelation, while a value nearer to 4 could point to negative autocorrelation, both leading to potentially unreliable prediction models. -###### Strengths +### Strengths - The metric specializes in identifying autocorrelation in prediction model residuals. -- Autocorrelation detection assists in diagnosing violation of various modeling technique assumptions, particularly -in regression analysis and time-series data modeling. +- Autocorrelation detection assists in diagnosing violation of various modeling technique assumptions, particularly in regression analysis and time-series data modeling. -###### Limitations +### Limitations - The Durbin-Watson Test mainly detects linear autocorrelation and could overlook other types of relationships. - The metric is highly sensitive to data points order. Shuffling the order could lead to notably different results. -- The test only checks for first-order autocorrelation (between a variable and its immediate predecessor) and fails -to detect higher-order autocorrelation. - - - - - \ No newline at end of file +- The test only checks for first-order autocorrelation (between a variable and its immediate predecessor) and fails to detect higher-order autocorrelation. diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index 78a839134..5f32a39d2 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### GINITable +## GINITable[()]{.muted} ```python def GINITable( @@ -19,53 +14,30 @@ def GINITable( Evaluates classification model performance using AUC, GINI, and KS metrics for training and test datasets. -###### Purpose +### Purpose -The 'GINITable' metric is designed to evaluate the performance of a classification model by emphasizing its -discriminatory power. Specifically, it calculates and presents three important metrics - the Area under the ROC -Curve (AUC), the GINI coefficient, and the Kolmogorov-Smirnov (KS) statistic - for both training and test datasets. +The 'GINITable' metric is designed to evaluate the performance of a classification model by emphasizing its discriminatory power. Specifically, it calculates and presents three important metrics - the Area under the ROC Curve (AUC), the GINI coefficient, and the Kolmogorov-Smirnov (KS) statistic - for both training and test datasets. -###### Test Mechanism +### Test Mechanism -Using a dictionary for storing performance metrics for both the training and test datasets, the 'GINITable' metric -calculates each of these metrics sequentially. The Area under the ROC Curve (AUC) is calculated via the -`roc_auc_score` function from the Scikit-Learn library. The GINI coefficient, a measure of statistical dispersion, -is then computed by doubling the AUC and subtracting 1. Finally, the Kolmogorov-Smirnov (KS) statistic is -calculated via the `roc_curve` function from Scikit-Learn, with the False Positive Rate (FPR) subtracted from the -True Positive Rate (TPR) and the maximum value taken from the resulting data. These metrics are then stored in a -pandas DataFrame for convenient visualization. +Using a dictionary for storing performance metrics for both the training and test datasets, the 'GINITable' metric calculates each of these metrics sequentially. The Area under the ROC Curve (AUC) is calculated via the `roc_auc_score` function from the Scikit-Learn library. The GINI coefficient, a measure of statistical dispersion, is then computed by doubling the AUC and subtracting 1. Finally, the Kolmogorov-Smirnov (KS) statistic is calculated via the `roc_curve` function from Scikit-Learn, with the False Positive Rate (FPR) subtracted from the True Positive Rate (TPR) and the maximum value taken from the resulting data. These metrics are then stored in a pandas DataFrame for convenient visualization. -###### Signs of High Risk +### Signs of High Risk -- Low values for performance metrics may suggest a reduction in model performance, particularly a low AUC which -indicates poor classification performance, or a low GINI coefficient, which could suggest a decreased ability to -discriminate different classes. -- A high KS value may be an indicator of potential overfitting, as this generally signifies a substantial -divergence between positive and negative distributions. -- Significant discrepancies between the performance on the training dataset and the test dataset may present -another signal of high risk. +- Low values for performance metrics may suggest a reduction in model performance, particularly a low AUC which indicates poor classification performance, or a low GINI coefficient, which could suggest a decreased ability to discriminate different classes. +- A high KS value may be an indicator of potential overfitting, as this generally signifies a substantial divergence between positive and negative distributions. +- Significant discrepancies between the performance on the training dataset and the test dataset may present another signal of high risk. -###### Strengths +### Strengths -- Offers three key performance metrics (AUC, GINI, and KS) in one test, providing a more comprehensive evaluation -of the model. -- Provides a direct comparison between the model's performance on training and testing datasets, which aids in -identifying potential underfitting or overfitting. -- The applied metrics are class-distribution invariant, thereby remaining effective for evaluating model -performance even when dealing with imbalanced datasets. +- Offers three key performance metrics (AUC, GINI, and KS) in one test, providing a more comprehensive evaluation of the model. +- Provides a direct comparison between the model's performance on training and testing datasets, which aids in identifying potential underfitting or overfitting. +- The applied metrics are class-distribution invariant, thereby remaining effective for evaluating model performance even when dealing with imbalanced datasets. - Presents the metrics in a user-friendly table format for easy comprehension and analysis. -###### Limitations +### Limitations -- The GINI coefficient and KS statistic are both dependent on the AUC value. Therefore, any errors in the -calculation of the latter will adversely impact the former metrics too. -- Mainly suited for binary classification models and may require modifications for effective application in -multi-class scenarios. +- The GINI coefficient and KS statistic are both dependent on the AUC value. Therefore, any errors in the calculation of the latter will adversely impact the former metrics too. +- Mainly suited for binary classification models and may require modifications for effective application in multi-class scenarios. - The metrics used are threshold-dependent and may exhibit high variability based on the chosen cut-off points. -- The test does not incorporate a method to efficiently handle missing or inefficiently processed data, which could -lead to inaccuracies in the metrics if the data is not appropriately preprocessed. - - - - - \ No newline at end of file +- The test does not incorporate a method to efficiently handle missing or inefficiently processed data, which could lead to inaccuracies in the metrics if the data is not appropriately preprocessed. diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 824510e7a..f3fd63118 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### KolmogorovSmirnov +## KolmogorovSmirnov[()]{.muted} ```python def KolmogorovSmirnov( @@ -20,39 +15,27 @@ def KolmogorovSmirnov( Assesses whether each feature in the dataset aligns with a normal distribution using the Kolmogorov-Smirnov test. -###### Purpose +### Purpose -The Kolmogorov-Smirnov (KS) test evaluates the distribution of features in a dataset to determine their alignment -with a normal distribution. This is important because many statistical methods and machine learning models assume -normality in the data distribution. +The Kolmogorov-Smirnov (KS) test evaluates the distribution of features in a dataset to determine their alignment with a normal distribution. This is important because many statistical methods and machine learning models assume normality in the data distribution. -###### Test Mechanism +### Test Mechanism -This test calculates the KS statistic and corresponding p-value for each feature in the dataset. It does so by -comparing the cumulative distribution function of the feature with an ideal normal distribution. The KS statistic -and p-value for each feature are then stored in a dictionary. The p-value threshold to reject the normal -distribution hypothesis is not preset, providing flexibility for different applications. +This test calculates the KS statistic and corresponding p-value for each feature in the dataset. It does so by comparing the cumulative distribution function of the feature with an ideal normal distribution. The KS statistic and p-value for each feature are then stored in a dictionary. The p-value threshold to reject the normal distribution hypothesis is not preset, providing flexibility for different applications. -###### Signs of High Risk +### Signs of High Risk -- Elevated KS statistic for a feature combined with a low p-value, indicating a significant divergence from a -normal distribution. +- Elevated KS statistic for a feature combined with a low p-value, indicating a significant divergence from a normal distribution. - Features with notable deviations that could create problems if the model assumes normality in data distribution. -###### Strengths +### Strengths - The KS test is sensitive to differences in the location and shape of empirical cumulative distribution functions. - It is non-parametric and adaptable to various datasets, as it does not assume any specific data distribution. - Provides detailed insights into the distribution of individual features. -###### Limitations +### Limitations -- The test's sensitivity to disparities in the tails of data distribution might cause false alarms about -non-normality. +- The test's sensitivity to disparities in the tails of data distribution might cause false alarms about non-normality. - Less effective for multivariate distributions, as it is designed for univariate distributions. - Does not identify specific types of non-normality, such as skewness or kurtosis, which could impact model fitting. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 0ab949927..169e0b548 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### Lilliefors +## Lilliefors[()]{.muted} ```python def Lilliefors( @@ -18,49 +13,26 @@ def Lilliefors( Assesses the normality of feature distributions in an ML model's training dataset using the Lilliefors test. -###### Purpose +### Purpose -The purpose of this metric is to utilize the Lilliefors test, named in honor of the Swedish statistician Hubert -Lilliefors, in order to assess whether the features of the machine learning model's training dataset conform to a -normal distribution. This is done because the assumption of normal distribution plays a vital role in numerous -statistical procedures as well as numerous machine learning models. Should the features fail to follow a normal -distribution, some model types may not operate at optimal efficiency. This can potentially lead to inaccurate -predictions. +The purpose of this metric is to utilize the Lilliefors test, named in honor of the Swedish statistician Hubert Lilliefors, in order to assess whether the features of the machine learning model's training dataset conform to a normal distribution. This is done because the assumption of normal distribution plays a vital role in numerous statistical procedures as well as numerous machine learning models. Should the features fail to follow a normal distribution, some model types may not operate at optimal efficiency. This can potentially lead to inaccurate predictions. -###### Test Mechanism +### Test Mechanism -The application of this test happens across all feature columns within the training dataset. For each feature, the -Lilliefors test returns a test statistic and p-value. The test statistic quantifies how far the feature's -distribution is from an ideal normal distribution, whereas the p-value aids in determining the statistical -relevance of this deviation. The final results are stored within a dictionary, the keys of which correspond to the -name of the feature column, and the values being another dictionary which houses the test statistic and p-value. +The application of this test happens across all feature columns within the training dataset. For each feature, the Lilliefors test returns a test statistic and p-value. The test statistic quantifies how far the feature's distribution is from an ideal normal distribution, whereas the p-value aids in determining the statistical relevance of this deviation. The final results are stored within a dictionary, the keys of which correspond to the name of the feature column, and the values being another dictionary which houses the test statistic and p-value. -###### Signs of High Risk +### Signs of High Risk -- If the p-value corresponding to a specific feature sinks below a pre-established significance level, generally -set at 0.05, then it can be deduced that the distribution of that feature significantly deviates from a normal -distribution. This can present a high risk for models that assume normality, as these models may perform -inaccurately or inefficiently in the presence of such a feature. +- If the p-value corresponding to a specific feature sinks below a pre-established significance level, generally set at 0.05, then it can be deduced that the distribution of that feature significantly deviates from a normal distribution. This can present a high risk for models that assume normality, as these models may perform inaccurately or inefficiently in the presence of such a feature. -###### Strengths +### Strengths -- One advantage of the Lilliefors test is its utility irrespective of whether the mean and variance of the normal -distribution are known in advance. This makes it a more robust option in real-world situations where these values -might not be known. +- One advantage of the Lilliefors test is its utility irrespective of whether the mean and variance of the normal distribution are known in advance. This makes it a more robust option in real-world situations where these values might not be known. - The test has the ability to screen every feature column, offering a holistic view of the dataset. -###### Limitations - -- Despite the practical applications of the Lilliefors test in validating normality, it does come with some -limitations. -- It is only capable of testing unidimensional data, thus rendering it ineffective for datasets with interactions -between features or multi-dimensional phenomena. -- The test might not be as sensitive as some other tests (like the Anderson-Darling test) in detecting deviations -from a normal distribution. -- Like any other statistical test, Lilliefors test may also produce false positives or negatives. Hence, banking -solely on this test, without considering other characteristics of the data, may give rise to risks. - - - +### Limitations - \ No newline at end of file +- Despite the practical applications of the Lilliefors test in validating normality, it does come with some limitations. +- It is only capable of testing unidimensional data, thus rendering it ineffective for datasets with interactions between features or multi-dimensional phenomena. +- The test might not be as sensitive as some other tests (like the Anderson-Darling test) in detecting deviations from a normal distribution. +- Like any other statistical test, Lilliefors test may also produce false positives or negatives. Hence, banking solely on this test, without considering other characteristics of the data, may give rise to risks. diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index 828940b0c..9a68bfa7e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### PredictionProbabilitiesHistogram +## PredictionProbabilitiesHistogram[()]{.muted} ```python def PredictionProbabilitiesHistogram( @@ -18,16 +13,13 @@ def PredictionProbabilitiesHistogram( title = 'Histogram of Predictive Probabilities'): ``` -Assesses the predictive probability distribution for binary classification to evaluate model performance and -potential overfitting or bias. +Assesses the predictive probability distribution for binary classification to evaluate model performance and potential overfitting or bias. -###### Purpose +### Purpose -The Prediction Probabilities Histogram test is designed to generate histograms displaying the Probability of -Default (PD) predictions for both positive and negative classes in training and testing datasets. This helps in -evaluating the performance of a classification model. +The Prediction Probabilities Histogram test is designed to generate histograms displaying the Probability of Default (PD) predictions for both positive and negative classes in training and testing datasets. This helps in evaluating the performance of a classification model. -###### Test Mechanism +### Test Mechanism The metric follows these steps to execute the test: @@ -39,26 +31,21 @@ The metric follows these steps to execute the test: - Overlays the four histograms (two for training and two for testing) on two different subplot frames. - Returns a plotly graph object displaying the visualization. -###### Signs of High Risk +### Signs of High Risk - Significant discrepancies between the histograms of training and testing data. - Large disparities between the histograms for the positive and negative classes. - Potential overfitting or bias indicated by significant issues. - Unevenly distributed probabilities suggesting inaccurate model predictions. -###### Strengths +### Strengths - Offers a visual representation of the PD predictions made by the model, aiding in understanding its behavior. - Assesses both the training and testing datasets, adding depth to model validation. - Highlights disparities between classes, providing insights into class imbalance or data skewness. - Effectively visualizes risk spread, which is particularly beneficial for credit risk prediction. -###### Limitations +### Limitations - Specifically tailored for binary classification scenarios and not suited for multi-class classification tasks. - Provides a robust visual representation but lacks a quantifiable measure to assess model performance. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 1c968fee3..6f0e1b6e9 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -4,62 +4,36 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### RegressionCoeffs +## RegressionCoeffs[()]{.muted} ```python def RegressionCoeffs( model): ``` -Assesses the significance and uncertainty of predictor variables in a regression model through visualization of -coefficients and their 95% confidence intervals. +Assesses the significance and uncertainty of predictor variables in a regression model through visualization of coefficients and their 95% confidence intervals. -###### Purpose +### Purpose -The `RegressionCoeffs` metric visualizes the estimated regression coefficients alongside their 95% confidence intervals, -providing insights into the impact and significance of predictor variables on the response variable. This visualization -helps to understand the variability and uncertainty in the model's estimates, aiding in the evaluation of the -significance of each predictor. +The `RegressionCoeffs` metric visualizes the estimated regression coefficients alongside their 95% confidence intervals, providing insights into the impact and significance of predictor variables on the response variable. This visualization helps to understand the variability and uncertainty in the model's estimates, aiding in the evaluation of the significance of each predictor. -###### Test Mechanism +### Test Mechanism -The function operates by extracting the estimated coefficients and their standard errors from the regression model. -Using these, it calculates the confidence intervals at a 95% confidence level, which indicates the range within which -the true coefficient value is expected to fall 95% of the time. The confidence intervals are computed using the -Z-value associated with the 95% confidence level. The coefficients and their confidence intervals are then visualized -in a bar plot. The x-axis represents the predictor variables, the y-axis represents the estimated coefficients, and -the error bars depict the confidence intervals. +The function operates by extracting the estimated coefficients and their standard errors from the regression model. Using these, it calculates the confidence intervals at a 95% confidence level, which indicates the range within which the true coefficient value is expected to fall 95% of the time. The confidence intervals are computed using the Z-value associated with the 95% confidence level. The coefficients and their confidence intervals are then visualized in a bar plot. The x-axis represents the predictor variables, the y-axis represents the estimated coefficients, and the error bars depict the confidence intervals. -###### Signs of High Risk +### Signs of High Risk -- The confidence interval for a coefficient contains the zero value, suggesting that the predictor may not significantly -contribute to the model. +- The confidence interval for a coefficient contains the zero value, suggesting that the predictor may not significantly contribute to the model. - Multiple coefficients with confidence intervals that include zero, potentially indicating issues with model reliability. -- Very wide confidence intervals, which may suggest high uncertainty in the coefficient estimates and potential model -instability. - -###### Strengths - -- Provides a clear visualization that allows for easy interpretation of the significance and impact of predictor -variables. -- Includes confidence intervals, which provide additional information about the uncertainty surrounding each coefficient -estimate. - -###### Limitations - -- The method assumes normality of residuals and independence of observations, assumptions that may not always hold true -in practice. -- It does not address issues related to multi-collinearity among predictor variables, which can affect the interpretation -of coefficients. -- This metric is limited to regression tasks using tabular data and is not applicable to other types of machine learning -tasks or data structures. +- Very wide confidence intervals, which may suggest high uncertainty in the coefficient estimates and potential model instability. +### Strengths +- Provides a clear visualization that allows for easy interpretation of the significance and impact of predictor variables. +- Includes confidence intervals, which provide additional information about the uncertainty surrounding each coefficient estimate. +### Limitations - \ No newline at end of file +- The method assumes normality of residuals and independence of observations, assumptions that may not always hold true in practice. +- It does not address issues related to multi-collinearity among predictor variables, which can affect the interpretation of coefficients. +- This metric is limited to regression tasks using tabular data and is not applicable to other types of machine learning tasks or data structures. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 93cc22a3f..70869aece 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### RegressionFeatureSignificance +## RegressionFeatureSignificance[()]{.muted} ```python def RegressionFeatureSignificance( @@ -20,43 +15,27 @@ def RegressionFeatureSignificance( Assesses and visualizes the statistical significance of features in a regression model. -###### Purpose +### Purpose -The Regression Feature Significance metric assesses the significance of each feature in a given set of regression -model. It creates a visualization displaying p-values for every feature of the model, assisting model developers -in understanding which features are most influential in their model. +The Regression Feature Significance metric assesses the significance of each feature in a given set of regression model. It creates a visualization displaying p-values for every feature of the model, assisting model developers in understanding which features are most influential in their model. -###### Test Mechanism +### Test Mechanism -The test mechanism involves extracting the model's coefficients and p-values for each feature, and then plotting these -values. The x-axis on the plot contains the p-values while the y-axis denotes the coefficients of each feature. A -vertical red line is drawn at the threshold for p-value significance, which is 0.05 by default. Any features with -p-values to the left of this line are considered statistically significant at the chosen level. +The test mechanism involves extracting the model's coefficients and p-values for each feature, and then plotting these values. The x-axis on the plot contains the p-values while the y-axis denotes the coefficients of each feature. A vertical red line is drawn at the threshold for p-value significance, which is 0.05 by default. Any features with p-values to the left of this line are considered statistically significant at the chosen level. -###### Signs of High Risk +### Signs of High Risk -- Any feature with a high p-value (greater than the threshold) is considered a potential high risk, as it suggests -the feature is not statistically significant and may not be reliably contributing to the model's predictions. -- A high number of such features may indicate problems with the model validation, variable selection, and overall -reliability of the model predictions. +- Any feature with a high p-value (greater than the threshold) is considered a potential high risk, as it suggests the feature is not statistically significant and may not be reliably contributing to the model's predictions. +- A high number of such features may indicate problems with the model validation, variable selection, and overall reliability of the model predictions. -###### Strengths +### Strengths -- Helps identify the features that significantly contribute to a model's prediction, providing insights into the -feature importance. +- Helps identify the features that significantly contribute to a model's prediction, providing insights into the feature importance. - Provides tangible, easy-to-understand visualizations to interpret the feature significance. -###### Limitations +### Limitations -- This metric assumes model features are independent, which may not always be the case. Multicollinearity (high -correlation amongst predictors) can cause high variance and unreliable statistical tests of significance. -- The p-value strategy for feature selection doesn't take into account the magnitude of the effect, focusing solely -on whether the feature is likely non-zero. +- This metric assumes model features are independent, which may not always be the case. Multicollinearity (high correlation amongst predictors) can cause high variance and unreliable statistical tests of significance. +- The p-value strategy for feature selection doesn't take into account the magnitude of the effect, focusing solely on whether the feature is likely non-zero. - This test is specific to regression models and wouldn't be suitable for other types of ML models. -- P-value thresholds are somewhat arbitrary and do not always indicate practical significance, only statistical -significance. - - - - - \ No newline at end of file +- P-value thresholds are somewhat arbitrary and do not always indicate practical significance, only statistical significance. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 71894fc32..85f1c9656 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### RegressionModelForecastPlot +## RegressionModelForecastPlot[()]{.muted} ```python def RegressionModelForecastPlot( @@ -19,47 +14,29 @@ def RegressionModelForecastPlot( end_date: Union = None): ``` -Generates plots to visually compare the forecasted outcomes of a regression model against actual observed values over -a specified date range. +Generates plots to visually compare the forecasted outcomes of a regression model against actual observed values over a specified date range. -###### Purpose +### Purpose -This metric is useful for time-series models or any model where the outcome changes over time, allowing direct -comparison of predicted vs actual values. It can help identify overfitting or underfitting situations as well as -general model performance. +This metric is useful for time-series models or any model where the outcome changes over time, allowing direct comparison of predicted vs actual values. It can help identify overfitting or underfitting situations as well as general model performance. -###### Test Mechanism +### Test Mechanism -This test generates a plot with the x-axis representing the date ranging from the specified "start_date" to the -"end_date", while the y-axis shows the value of the outcome variable. Two lines are plotted**: one representing the -forecasted values and the other representing the observed values. The "start_date" and "end_date" can be parameters -of this test; if these parameters are not provided, they are set to the minimum and maximum date available in the -dataset. +This test generates a plot with the x-axis representing the date ranging from the specified "start_date" to the "end_date", while the y-axis shows the value of the outcome variable. Two lines are plotted: one representing the forecasted values and the other representing the observed values. The "start_date" and "end_date" can be parameters of this test; if these parameters are not provided, they are set to the minimum and maximum date available in the dataset. -###### Signs of High Risk +### Signs of High Risk -- High risk or failure signs could be deduced visually from the plots if the forecasted line significantly deviates -from the observed line, indicating the model's predicted values are not matching actual outcomes. -- A model that struggles to handle the edge conditions like maximum and minimum data points could also be -considered a sign of risk. +- High risk or failure signs could be deduced visually from the plots if the forecasted line significantly deviates from the observed line, indicating the model's predicted values are not matching actual outcomes. +- A model that struggles to handle the edge conditions like maximum and minimum data points could also be considered a sign of risk. -###### Strengths +### Strengths -- Visualization: The plot provides an intuitive and clear illustration of how well the forecast matches the actual -values, making it straightforward even for non-technical stakeholders to interpret. +- Visualization: The plot provides an intuitive and clear illustration of how well the forecast matches the actual values, making it straightforward even for non-technical stakeholders to interpret. - Flexibility: It allows comparison for multiple models and for specified time periods. -- Model Evaluation: It can be useful in identifying overfitting or underfitting situations, as these will manifest -as discrepancies between the forecasted and observed values. +- Model Evaluation: It can be useful in identifying overfitting or underfitting situations, as these will manifest as discrepancies between the forecasted and observed values. -###### Limitations +### Limitations -- Interpretation Bias: Interpretation of the plot is subjective and can lead to different conclusions by different -evaluators. +- Interpretation Bias: Interpretation of the plot is subjective and can lead to different conclusions by different evaluators. - Lack of Precision: Visual representation might not provide precise values of the deviation. -- Inapplicability: Limited to cases where the order of data points (time-series) matters, it might not be of much -use in problems that are not related to time series prediction. - - - - - \ No newline at end of file +- Inapplicability: Limited to cases where the order of data points (time-series) matters, it might not be of much use in problems that are not related to time series prediction. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index fd4de08c1..21d3a26cf 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### integrate_diff +## integrate_diff[()]{.muted} ```python def integrate_diff( @@ -17,8 +12,7 @@ def integrate_diff( start_value): ``` - -#### RegressionModelForecastPlotLevels +## RegressionModelForecastPlotLevels[()]{.muted} ```python def RegressionModelForecastPlotLevels( @@ -28,14 +22,11 @@ def RegressionModelForecastPlotLevels( Assesses the alignment between forecasted and observed values in regression models through visual plots -###### Purpose +### Purpose -This test aims to visually assess the performance of a regression model by comparing its forecasted values against -the actual observed values for both the raw and transformed (integrated) data. This helps determine the accuracy -of the model and can help identify overfitting or underfitting. The integration is applied to highlight the trend -rather than the absolute level. +This test aims to visually assess the performance of a regression model by comparing its forecasted values against the actual observed values for both the raw and transformed (integrated) data. This helps determine the accuracy of the model and can help identify overfitting or underfitting. The integration is applied to highlight the trend rather than the absolute level. -###### Test Mechanism +### Test Mechanism This test generates two plots: @@ -44,24 +35,17 @@ This test generates two plots: The transformed data is created by performing a cumulative sum on the raw data. -###### Signs of High Risk +### Signs of High Risk - Significant deviation between forecasted and observed values. - Patterns suggesting overfitting or underfitting. -- Large discrepancies in the plotted forecasts, indicating potential issues with model generalizability and -precision. +- Large discrepancies in the plotted forecasts, indicating potential issues with model generalizability and precision. -###### Strengths +### Strengths -- Provides an intuitive, visual way to assess multiple regression models, aiding in easier interpretation and -evaluation of forecast accuracy. +- Provides an intuitive, visual way to assess multiple regression models, aiding in easier interpretation and evaluation of forecast accuracy. -###### Limitations +### Limitations - Relies heavily on visual interpretation, which may vary between individuals. - Does not provide a numerical metric to quantify forecast accuracy, relying solely on visual assessment. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 2685d7ef0..1c1ab6575 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### integrate_diff +## integrate_diff[()]{.muted} ```python def integrate_diff( @@ -17,8 +12,7 @@ def integrate_diff( start_value): ``` - -#### RegressionModelSensitivityPlot +## RegressionModelSensitivityPlot[()]{.muted} ```python def RegressionModelSensitivityPlot( @@ -28,48 +22,29 @@ def RegressionModelSensitivityPlot( transformation: Union = None): ``` -Assesses the sensitivity of a regression model to changes in independent variables by applying shocks and -visualizing the impact. +Assesses the sensitivity of a regression model to changes in independent variables by applying shocks and visualizing the impact. -###### Purpose +### Purpose -The Regression Sensitivity Plot test is designed to perform sensitivity analysis on regression models. This test -aims to measure the impact of slight changes (shocks) applied to individual variables on the system's outcome while -keeping all other variables constant. By doing so, it analyzes the effects of each independent variable on the -dependent variable within the regression model, helping identify significant risk factors that could substantially -influence the model's output. +The Regression Sensitivity Plot test is designed to perform sensitivity analysis on regression models. This test aims to measure the impact of slight changes (shocks) applied to individual variables on the system's outcome while keeping all other variables constant. By doing so, it analyzes the effects of each independent variable on the dependent variable within the regression model, helping identify significant risk factors that could substantially influence the model's output. -###### Test Mechanism +### Test Mechanism -This test operates by initially applying shocks of varying magnitudes, defined by specific parameters, to each of -the model's features, one at a time. With all other variables held constant, a new prediction is made for each -dataset subjected to shocks. Any changes in the model's predictions are directly attributed to the shocks applied. -If the transformation parameter is set to "integrate," initial predictions and target values undergo transformation -via an integration function before being plotted. Finally, a plot demonstrating observed values against predicted -values for each model is generated, showcasing a distinct line graph illustrating predictions for each shock. +This test operates by initially applying shocks of varying magnitudes, defined by specific parameters, to each of the model's features, one at a time. With all other variables held constant, a new prediction is made for each dataset subjected to shocks. Any changes in the model's predictions are directly attributed to the shocks applied. If the transformation parameter is set to "integrate," initial predictions and target values undergo transformation via an integration function before being plotted. Finally, a plot demonstrating observed values against predicted values for each model is generated, showcasing a distinct line graph illustrating predictions for each shock. -###### Signs of High Risk +### Signs of High Risk -- Drastic alterations in model predictions due to minor shocks to an individual variable, indicating high -sensitivity and potential over-dependence on that variable. -- Unusually high or unpredictable shifts in response to shocks, suggesting potential model instability or -overfitting. +- Drastic alterations in model predictions due to minor shocks to an individual variable, indicating high sensitivity and potential over-dependence on that variable. +- Unusually high or unpredictable shifts in response to shocks, suggesting potential model instability or overfitting. -###### Strengths +### Strengths - Helps identify variables that strongly influence model outcomes, aiding in understanding feature importance. - Generates visual plots, making results easily interpretable even to non-technical stakeholders. - Useful in identifying overfitting and detecting unstable models that react excessively to minor variable changes. -###### Limitations +### Limitations -- Operates on the assumption that all other variables remain unchanged during the application of a shock, which may -not reflect real-world interdependencies. +- Operates on the assumption that all other variables remain unchanged during the application of a shock, which may not reflect real-world interdependencies. - Best compatible with linear models and may not effectively evaluate the sensitivity of non-linear models. -- Provides a visual representation without a numerical risk measure, potentially introducing subjectivity in -interpretation. - - - - - \ No newline at end of file +- Provides a visual representation without a numerical risk measure, potentially introducing subjectivity in interpretation. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 6f84587a8..e3390fdf0 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### RegressionModelSummary +## RegressionModelSummary[()]{.muted} ```python def RegressionModelSummary( @@ -19,36 +14,26 @@ def RegressionModelSummary( Evaluates regression model performance using metrics including R-Squared, Adjusted R-Squared, MSE, and RMSE. -###### Purpose +### Purpose -The Regression Model Summary test evaluates the performance of regression models by measuring their predictive -ability regarding dependent variables given changes in the independent variables. It uses conventional regression -metrics such as R-Squared, Adjusted R-Squared, Mean Squared Error (MSE), and Root Mean Squared Error (RMSE) to -assess the model's accuracy and fit. +The Regression Model Summary test evaluates the performance of regression models by measuring their predictive ability regarding dependent variables given changes in the independent variables. It uses conventional regression metrics such as R-Squared, Adjusted R-Squared, Mean Squared Error (MSE), and Root Mean Squared Error (RMSE) to assess the model's accuracy and fit. -###### Test Mechanism +### Test Mechanism -This test uses the sklearn library to calculate the R-Squared, Adjusted R-Squared, MSE, and RMSE. It outputs a -table with the results of these metrics along with the feature columns used by the model. +This test uses the sklearn library to calculate the R-Squared, Adjusted R-Squared, MSE, and RMSE. It outputs a table with the results of these metrics along with the feature columns used by the model. -###### Signs of High Risk +### Signs of High Risk - Low R-Squared and Adjusted R-Squared values. - High MSE and RMSE values. -###### Strengths +### Strengths - Offers an extensive evaluation of regression models by combining four key measures of model accuracy and fit. - Provides a comprehensive view of the model's performance. - Both the R-Squared and Adjusted R-Squared measures are readily interpretable. -###### Limitations +### Limitations - RMSE and MSE might be sensitive to outliers. -- A high R-Squared or Adjusted R-Squared may not necessarily indicate a good model, especially in cases of -overfitting. - - - - - \ No newline at end of file +- A high R-Squared or Adjusted R-Squared may not necessarily indicate a good model, especially in cases of overfitting. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 049fc2ebe..93ff8c26b 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### RegressionPermutationFeatureImportance +## RegressionPermutationFeatureImportance[()]{.muted} ```python def RegressionPermutationFeatureImportance( @@ -19,42 +14,28 @@ def RegressionPermutationFeatureImportance( figure_height: int = 500): ``` -Assesses the significance of each feature in a model by evaluating the impact on model performance when feature -values are randomly rearranged. +Assesses the significance of each feature in a model by evaluating the impact on model performance when feature values are randomly rearranged. -###### Purpose +### Purpose -The primary purpose of this metric is to determine which features significantly impact the performance of a -regression model developed using statsmodels. The metric measures how much the prediction accuracy deteriorates -when each feature's values are permuted. +The primary purpose of this metric is to determine which features significantly impact the performance of a regression model developed using statsmodels. The metric measures how much the prediction accuracy deteriorates when each feature's values are permuted. -###### Test Mechanism +### Test Mechanism -This metric shuffles the values of each feature one at a time in the dataset, computes the model's performance -after each permutation, and compares it to the baseline performance. A significant decrease in performance -indicates the importance of the feature. +This metric shuffles the values of each feature one at a time in the dataset, computes the model's performance after each permutation, and compares it to the baseline performance. A significant decrease in performance indicates the importance of the feature. -###### Signs of High Risk +### Signs of High Risk -- Significant reliance on a feature that, when permuted, leads to a substantial decrease in performance, suggesting -overfitting or high model dependency on that feature. -- Features identified as unimportant despite known impacts from domain knowledge, suggesting potential issues in -model training or data preprocessing. +- Significant reliance on a feature that, when permuted, leads to a substantial decrease in performance, suggesting overfitting or high model dependency on that feature. +- Features identified as unimportant despite known impacts from domain knowledge, suggesting potential issues in model training or data preprocessing. -###### Strengths +### Strengths -- Directly assesses the impact of each feature on model performance, providing clear insights into model -dependencies. +- Directly assesses the impact of each feature on model performance, providing clear insights into model dependencies. - Model-agnostic within the scope of statsmodels, applicable to any regression model that outputs predictions. -###### Limitations +### Limitations - The metric is specific to statsmodels and cannot be used with other types of models without adaptation. -- It does not capture interactions between features, which can lead to underestimating the importance of correlated -features. +- It does not capture interactions between features, which can lead to underestimating the importance of correlated features. - Assumes independence of features when calculating importance, which might not always hold true. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index 43469ad4c..df0210a44 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### ScorecardHistogram +## ScorecardHistogram[()]{.muted} ```python def ScorecardHistogram( @@ -18,51 +13,31 @@ def ScorecardHistogram( score_column = 'score'): ``` -The Scorecard Histogram test evaluates the distribution of credit scores between default and non-default instances, -providing critical insights into the performance and generalizability of credit-risk models. +The Scorecard Histogram test evaluates the distribution of credit scores between default and non-default instances, providing critical insights into the performance and generalizability of credit-risk models. -###### Purpose +### Purpose -The Scorecard Histogram test metric provides a visual interpretation of the credit scores generated by a machine -learning model for credit-risk classification tasks. It aims to compare the alignment of the model's scoring -decisions with the actual outcomes of credit loan applications. It helps in identifying potential discrepancies -between the model's predictions and real-world risk levels. +The Scorecard Histogram test metric provides a visual interpretation of the credit scores generated by a machine learning model for credit-risk classification tasks. It aims to compare the alignment of the model's scoring decisions with the actual outcomes of credit loan applications. It helps in identifying potential discrepancies between the model's predictions and real-world risk levels. -###### Test Mechanism +### Test Mechanism -This metric uses logistic regression to generate a histogram of credit scores for both default (negative class) and -non-default (positive class) instances. Using both training and test datasets, the metric calculates the credit -score of each instance with a scorecard method, considering the impact of different features on the likelihood of -default. It includes the default point to odds (PDO) scaling factor and predefined target score and odds settings. -Histograms for training and test sets are computed and plotted separately to offer insights into the model's -generalizability to unseen data. +This metric uses logistic regression to generate a histogram of credit scores for both default (negative class) and non-default (positive class) instances. Using both training and test datasets, the metric calculates the credit score of each instance with a scorecard method, considering the impact of different features on the likelihood of default. It includes the default point to odds (PDO) scaling factor and predefined target score and odds settings. Histograms for training and test sets are computed and plotted separately to offer insights into the model's generalizability to unseen data. -###### Signs of High Risk +### Signs of High Risk -- Discrepancies between the distributions of training and testing data, indicating a model's poor generalization -ability +- Discrepancies between the distributions of training and testing data, indicating a model's poor generalization ability - Skewed distributions favoring specific scores or classes, representing potential bias -###### Strengths +### Strengths - Provides a visual interpretation of the model's credit scoring system, enhancing comprehension of model behavior - Enables a direct comparison between actual and predicted scores for both training and testing data -- Its intuitive visualization helps understand the model's ability to differentiate between positive and negative -classes +- Its intuitive visualization helps understand the model's ability to differentiate between positive and negative classes - Can unveil patterns or anomalies not easily discerned through numerical metrics alone -###### Limitations - -- Despite its value for visual interpretation, it doesn't quantify the performance of the model and therefore may -lack precision for thorough model evaluation -- The quality of input data can strongly influence the metric, as bias or noise in the data will affect both the -score calculation and resultant histogram -- Its specificity to credit scoring models limits its applicability across a wider variety of machine learning -tasks and models -- The metric's effectiveness is somewhat tied to the subjective interpretation of the analyst, relying on their -judgment of the characteristics and implications of the plot. - - - +### Limitations - \ No newline at end of file +- Despite its value for visual interpretation, it doesn't quantify the performance of the model and therefore may lack precision for thorough model evaluation +- The quality of input data can strongly influence the metric, as bias or noise in the data will affect both the score calculation and resultant histogram +- Its specificity to credit scoring models limits its applicability across a wider variety of machine learning tasks and models +- The metric's effectiveness is somewhat tied to the subjective interpretation of the analyst, relying on their judgment of the characteristics and implications of the plot. diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 1c59226aa..271e44656 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### adj_r2_score +## adj_r2_score[()]{.muted} ```python def adj_r2_score( @@ -20,8 +15,3 @@ def adj_r2_score( ``` Adjusted R2 Score - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/prompt_validation.qmd b/docs/validmind/tests/prompt_validation.qmd index 3b88e88ea..679d7531b 100644 --- a/docs/validmind/tests/prompt_validation.qmd +++ b/docs/validmind/tests/prompt_validation.qmd @@ -4,9 +4,6 @@ toc-depth: 3 toc-expand: 3 --- - - - - [ai_powered_test](prompt_validation/ai_powered_test.qmd) - [Bias](prompt_validation/Bias.qmd) - [Clarity](prompt_validation/Clarity.qmd) @@ -15,4 +12,3 @@ toc-expand: 3 - [NegativeInstruction](prompt_validation/NegativeInstruction.qmd) - [Robustness](prompt_validation/Robustness.qmd) - [Specificity](prompt_validation/Specificity.qmd) - diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 9752db8dc..3012ea61f 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### Bias +## Bias[()]{.muted} ```python def Bias( @@ -17,54 +12,34 @@ def Bias( min_threshold = 7): ``` -Assesses potential bias in a Large Language Model by analyzing the distribution and order of exemplars in the -prompt. +Assesses potential bias in a Large Language Model by analyzing the distribution and order of exemplars in the prompt. -###### Purpose +### Purpose -The Bias Evaluation test calculates if and how the order and distribution of exemplars (examples) in a few-shot -learning prompt affect the output of a Large Language Model (LLM). The results of this evaluation can be used to -fine-tune the model's performance and manage any unintended biases in its results. +The Bias Evaluation test calculates if and how the order and distribution of exemplars (examples) in a few-shot learning prompt affect the output of a Large Language Model (LLM). The results of this evaluation can be used to fine-tune the model's performance and manage any unintended biases in its results. -###### Test Mechanism +### Test Mechanism This test uses two checks: -1. **Distribution of Exemplars:** The number of positive vs. negative examples in a prompt is varied. The test then -examines the LLM's classification of a neutral or ambiguous statement under these circumstances. -2. **Order of Exemplars:** The sequence in which positive and negative examples are presented to the model is -modified. Their resultant effect on the LLM's response is studied. +1. **Distribution of Exemplars:** The number of positive vs. negative examples in a prompt is varied. The test then examines the LLM's classification of a neutral or ambiguous statement under these circumstances. +1. **Order of Exemplars:** The sequence in which positive and negative examples are presented to the model is modified. Their resultant effect on the LLM's response is studied. -For each test case, the LLM grades the input prompt on a scale of 1 to 10. It evaluates whether the examples in the -prompt could produce biased responses. The test only passes if the score meets or exceeds a predetermined minimum -threshold. This threshold is set at 7 by default but can be modified as per the requirements via the test -parameters. +For each test case, the LLM grades the input prompt on a scale of 1 to 10. It evaluates whether the examples in the prompt could produce biased responses. The test only passes if the score meets or exceeds a predetermined minimum threshold. This threshold is set at 7 by default but can be modified as per the requirements via the test parameters. -###### Signs of High Risk +### Signs of High Risk -- A skewed result favoring either positive or negative responses may suggest potential bias in the model. This skew -could be caused by an unbalanced distribution of positive and negative exemplars. -- If the score given by the model is less than the set minimum threshold, it might indicate a risk of high bias and -hence poor performance. +- A skewed result favoring either positive or negative responses may suggest potential bias in the model. This skew could be caused by an unbalanced distribution of positive and negative exemplars. +- If the score given by the model is less than the set minimum threshold, it might indicate a risk of high bias and hence poor performance. -###### Strengths +### Strengths -- This test provides a quantitative measure of potential bias, offering clear guidelines for developers about -whether their Large Language Model (LLM) contains significant bias. +- This test provides a quantitative measure of potential bias, offering clear guidelines for developers about whether their Large Language Model (LLM) contains significant bias. - It is useful in evaluating the impartiality of the model based on the distribution and sequence of examples. -- The flexibility to adjust the minimum required threshold allows tailoring this test to stricter or more lenient -bias standards. - -###### Limitations - -- The test may not pick up on more subtle forms of bias or biases that are not directly related to the distribution -or order of exemplars. -- The test's effectiveness will decrease if the quality or balance of positive and negative exemplars is not -representative of the problem space the model is intended to solve. -- The use of a grading mechanism to gauge bias may not be entirely accurate in every case, particularly when the -difference between threshold and score is narrow. - - +- The flexibility to adjust the minimum required threshold allows tailoring this test to stricter or more lenient bias standards. +### Limitations - \ No newline at end of file +- The test may not pick up on more subtle forms of bias or biases that are not directly related to the distribution or order of exemplars. +- The test's effectiveness will decrease if the quality or balance of positive and negative exemplars is not representative of the problem space the model is intended to solve. +- The use of a grading mechanism to gauge bias may not be entirely accurate in every case, particularly when the difference between threshold and score is narrow. diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 2fbf83d62..71c2f8acd 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### Clarity +## Clarity[()]{.muted} ```python def Clarity( @@ -19,40 +14,27 @@ def Clarity( Evaluates and scores the clarity of prompts in a Large Language Model based on specified guidelines. -###### Purpose +### Purpose -The Clarity evaluation metric is used to assess how clear the prompts of a Large Language Model (LLM) are. This -assessment is particularly important because clear prompts assist the LLM in more accurately interpreting and -responding to instructions. +The Clarity evaluation metric is used to assess how clear the prompts of a Large Language Model (LLM) are. This assessment is particularly important because clear prompts assist the LLM in more accurately interpreting and responding to instructions. -###### Test Mechanism +### Test Mechanism -The evaluation uses an LLM to scrutinize the clarity of prompts, factoring in considerations such as the inclusion -of relevant details, persona adoption, step-by-step instructions, usage of examples, and specification of desired -output length. Each prompt is rated on a clarity scale of 1 to 10, and any prompt scoring at or above the preset -threshold (default of 7) will be marked as clear. It is important to note that this threshold can be adjusted via -test parameters, providing flexibility in the evaluation process. +The evaluation uses an LLM to scrutinize the clarity of prompts, factoring in considerations such as the inclusion of relevant details, persona adoption, step-by-step instructions, usage of examples, and specification of desired output length. Each prompt is rated on a clarity scale of 1 to 10, and any prompt scoring at or above the preset threshold (default of 7) will be marked as clear. It is important to note that this threshold can be adjusted via test parameters, providing flexibility in the evaluation process. -###### Signs of High Risk +### Signs of High Risk - Prompts that consistently score below the clarity threshold -- Repeated failure of prompts to adhere to guidelines for clarity, including detail inclusion, persona adoption, -explicit step-by-step instructions, use of examples, and specification of output length +- Repeated failure of prompts to adhere to guidelines for clarity, including detail inclusion, persona adoption, explicit step-by-step instructions, use of examples, and specification of output length -###### Strengths +### Strengths - Encourages the development of more effective prompts that aid the LLM in interpreting instructions accurately - Applies a quantifiable measure (a score from 1 to 10) to evaluate the clarity of prompts - Threshold for clarity is adjustable, allowing for flexible evaluation depending on the context -###### Limitations +### Limitations - Scoring system is subjective and relies on the AI’s interpretation of 'clarity' -- The test assumes that all required factors (detail inclusion, persona adoption, step-by-step instructions, use of -examples, and specification of output length) contribute equally to clarity, which might not always be the case +- The test assumes that all required factors (detail inclusion, persona adoption, step-by-step instructions, use of examples, and specification of output length) contribute equally to clarity, which might not always be the case - The evaluation may not be as effective if used on non-textual models - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 1b9d5fa8c..f652f6e4b 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### Conciseness +## Conciseness[()]{.muted} ```python def Conciseness( @@ -19,40 +14,29 @@ def Conciseness( Analyzes and grades the conciseness of prompts provided to a Large Language Model. -###### Purpose +### Purpose -The Conciseness Assessment is designed to evaluate the brevity and succinctness of prompts provided to a Language -Learning Model (LLM). A concise prompt strikes a balance between offering clear instructions and eliminating -redundant or unnecessary information, ensuring that the LLM receives relevant input without being overwhelmed. +The Conciseness Assessment is designed to evaluate the brevity and succinctness of prompts provided to a Language Learning Model (LLM). A concise prompt strikes a balance between offering clear instructions and eliminating redundant or unnecessary information, ensuring that the LLM receives relevant input without being overwhelmed. -###### Test Mechanism +### Test Mechanism -Using an LLM, this test conducts a conciseness analysis on input prompts. The analysis grades the prompt on a scale -from 1 to 10, where the grade reflects how well the prompt delivers clear instructions without being verbose. -Prompts that score equal to or above a predefined threshold (default set to 7) are deemed successfully concise. -This threshold can be adjusted to meet specific requirements. +Using an LLM, this test conducts a conciseness analysis on input prompts. The analysis grades the prompt on a scale from 1 to 10, where the grade reflects how well the prompt delivers clear instructions without being verbose. Prompts that score equal to or above a predefined threshold (default set to 7) are deemed successfully concise. This threshold can be adjusted to meet specific requirements. -###### Signs of High Risk +### Signs of High Risk - Prompts that consistently score below the predefined threshold. - Prompts that are overly wordy or contain unnecessary information. - Prompts that create confusion or ambiguity due to excess or unnecessary information. -###### Strengths +### Strengths - Ensures clarity and effectiveness of the prompts. - Promotes brevity and preciseness in prompts without sacrificing essential information. - Useful for models like LLMs, where input prompt length and clarity greatly influence model performance. - Provides a quantifiable measure of prompt conciseness. -###### Limitations +### Limitations -- The conciseness score is based on an AI's assessment, which might not fully capture human interpretation of -conciseness. +- The conciseness score is based on an AI's assessment, which might not fully capture human interpretation of conciseness. - The predefined threshold for conciseness could be subjective and might need adjustment based on application. - The test is dependent on the LLM’s understanding of conciseness, which might vary from model to model. - - - - - \ No newline at end of file diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index dc2a020a2..88172fde2 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### Delimitation +## Delimitation[()]{.muted} ```python def Delimitation( @@ -19,41 +14,28 @@ def Delimitation( Evaluates the proper use of delimiters in prompts provided to Large Language Models. -###### Purpose +### Purpose -The Delimitation Test aims to assess whether prompts provided to the Language Learning Model (LLM) correctly use -delimiters to mark different sections of the input. Well-delimited prompts help simplify the interpretation process -for the LLM, ensuring that the responses are precise and accurate. +The Delimitation Test aims to assess whether prompts provided to the Language Learning Model (LLM) correctly use delimiters to mark different sections of the input. Well-delimited prompts help simplify the interpretation process for the LLM, ensuring that the responses are precise and accurate. -###### Test Mechanism +### Test Mechanism -The test employs an LLM to examine prompts for appropriate use of delimiters such as triple quotation marks, XML -tags, and section titles. Each prompt is assigned a score from 1 to 10 based on its delimitation integrity. Prompts -with scores equal to or above the preset threshold (which is 7 by default, although it can be adjusted as -necessary) pass the test. +The test employs an LLM to examine prompts for appropriate use of delimiters such as triple quotation marks, XML tags, and section titles. Each prompt is assigned a score from 1 to 10 based on its delimitation integrity. Prompts with scores equal to or above the preset threshold (which is 7 by default, although it can be adjusted as necessary) pass the test. -###### Signs of High Risk +### Signs of High Risk - Prompts missing, improperly placed, or incorrectly used delimiters, leading to misinterpretation by the LLM. -- High-risk scenarios with complex prompts involving multiple tasks or diverse data where correct delimitation is -crucial. +- High-risk scenarios with complex prompts involving multiple tasks or diverse data where correct delimitation is crucial. - Scores below the threshold, indicating a high risk. -###### Strengths +### Strengths - Ensures clarity in demarcating different components of given prompts. - Reduces ambiguity in understanding prompts, especially for complex tasks. - Provides a quantified insight into the appropriateness of delimiter usage, aiding continuous improvement. -###### Limitations +### Limitations -- Only checks for the presence and placement of delimiters, not whether the correct delimiter type is used for the -specific data or task. +- Only checks for the presence and placement of delimiters, not whether the correct delimiter type is used for the specific data or task. - May not fully reveal the impacts of poor delimitation on the LLM's final performance. -- The preset score threshold may not be refined enough for complex tasks and prompts, requiring regular manual -adjustment. - - - - - \ No newline at end of file +- The preset score threshold may not be refined enough for complex tasks and prompts, requiring regular manual adjustment. diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 025b92699..3ac63434a 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### NegativeInstruction +## NegativeInstruction[()]{.muted} ```python def NegativeInstruction( @@ -19,46 +14,28 @@ def NegativeInstruction( Evaluates and grades the use of affirmative, proactive language over negative instructions in LLM prompts. -###### Purpose +### Purpose -The Negative Instruction test is utilized to scrutinize the prompts given to a Large Language Model (LLM). The -objective is to ensure these prompts are expressed using proactive, affirmative language. The focus is on -instructions indicating what needs to be done rather than what needs to be avoided, thereby guiding the LLM more -efficiently towards the desired output. +The Negative Instruction test is utilized to scrutinize the prompts given to a Large Language Model (LLM). The objective is to ensure these prompts are expressed using proactive, affirmative language. The focus is on instructions indicating what needs to be done rather than what needs to be avoided, thereby guiding the LLM more efficiently towards the desired output. -###### Test Mechanism +### Test Mechanism -An LLM is employed to evaluate each prompt. The prompt is graded based on its use of positive instructions with -scores ranging between 1-10. This grade reflects how effectively the prompt leverages affirmative language while -shying away from negative or restrictive instructions. A prompt that attains a grade equal to or above a -predetermined threshold (7 by default) is regarded as adhering effectively to the best practices of positive -instruction. This threshold can be custom-tailored through the test parameters. +An LLM is employed to evaluate each prompt. The prompt is graded based on its use of positive instructions with scores ranging between 1-10. This grade reflects how effectively the prompt leverages affirmative language while shying away from negative or restrictive instructions. A prompt that attains a grade equal to or above a predetermined threshold (7 by default) is regarded as adhering effectively to the best practices of positive instruction. This threshold can be custom-tailored through the test parameters. -###### Signs of High Risk +### Signs of High Risk - Low score obtained from the LLM analysis, indicating heavy reliance on negative instructions in the prompts. - Failure to surpass the preset minimum threshold. -- The LLM generates ambiguous or undesirable outputs as a consequence of the negative instructions used in the -prompt. +- The LLM generates ambiguous or undesirable outputs as a consequence of the negative instructions used in the prompt. -###### Strengths +### Strengths -- Encourages the usage of affirmative, proactive language in prompts, aiding in more accurate and advantageous -model responses. -- The test result provides a comprehensible score, helping to understand how well a prompt follows the positive -instruction best practices. +- Encourages the usage of affirmative, proactive language in prompts, aiding in more accurate and advantageous model responses. +- The test result provides a comprehensible score, helping to understand how well a prompt follows the positive instruction best practices. -###### Limitations +### Limitations -- Despite an adequate score, a prompt could still be misleading or could lead to undesired responses due to factors -not covered by this test. +- Despite an adequate score, a prompt could still be misleading or could lead to undesired responses due to factors not covered by this test. - The test necessitates an LLM for evaluation, which might not be available or feasible in certain scenarios. -- A numeric scoring system, while straightforward, may oversimplify complex issues related to prompt designing and -instruction clarity. -- The effectiveness of the test hinges significantly on the predetermined threshold level, which can be subjective -and may need to be adjusted according to specific use-cases. - - - - - \ No newline at end of file +- A numeric scoring system, while straightforward, may oversimplify complex issues related to prompt designing and instruction clarity. +- The effectiveness of the test hinges significantly on the predetermined threshold level, which can be subjective and may need to be adjusted according to specific use-cases. diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 978463966..24f27613b 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### Robustness +## Robustness[()]{.muted} ```python def Robustness( @@ -18,46 +13,29 @@ def Robustness( num_tests = 10): ``` -Assesses the robustness of prompts provided to a Large Language Model under varying conditions and contexts. This test -specifically measures the model's ability to generate correct classifications with the given prompt even when the -inputs are edge cases or otherwise difficult to classify. +Assesses the robustness of prompts provided to a Large Language Model under varying conditions and contexts. This test specifically measures the model's ability to generate correct classifications with the given prompt even when the inputs are edge cases or otherwise difficult to classify. -###### Purpose +### Purpose -The Robustness test is meant to evaluate the resilience and reliability of prompts provided to a Language Learning -Model (LLM). The aim of this test is to guarantee that the prompts consistently generate accurate and expected -outputs, even in diverse or challenging scenarios. This test is only applicable to LLM-powered text classification -tasks where the prompt has a single input variable. +The Robustness test is meant to evaluate the resilience and reliability of prompts provided to a Language Learning Model (LLM). The aim of this test is to guarantee that the prompts consistently generate accurate and expected outputs, even in diverse or challenging scenarios. This test is only applicable to LLM-powered text classification tasks where the prompt has a single input variable. -###### Test Mechanism +### Test Mechanism -The Robustness test appraises prompts under various conditions, alterations, and contexts to ascertain their -stability in producing consistent responses from the LLM. Factors evaluated include different phrasings, inclusion -of potential distracting elements, and various input complexities. By default, the test generates 10 inputs for a -prompt but can be adjusted according to test parameters. +The Robustness test appraises prompts under various conditions, alterations, and contexts to ascertain their stability in producing consistent responses from the LLM. Factors evaluated include different phrasings, inclusion of potential distracting elements, and various input complexities. By default, the test generates 10 inputs for a prompt but can be adjusted according to test parameters. -###### Signs of High Risk +### Signs of High Risk - If the output from the tests diverges extensively from the expected results, this indicates high risk. - When the prompt doesn't give a consistent performance across various tests. -- A high risk is indicated when the prompt is susceptible to breaking, especially when the output is expected to be -of a specific type. +- A high risk is indicated when the prompt is susceptible to breaking, especially when the output is expected to be of a specific type. -###### Strengths +### Strengths -- The robustness test helps to ensure stable performance of the LLM prompts and lowers the chances of generating -unexpected or off-target outputs. +- The robustness test helps to ensure stable performance of the LLM prompts and lowers the chances of generating unexpected or off-target outputs. - This test is vital for applications where predictability and reliability of the LLM’s output are crucial. -###### Limitations +### Limitations - Currently, the test only supports single-variable prompts, which restricts its application to more complex models. -- When there are too many target classes (over 10), the test is skipped, which can leave potential vulnerabilities -unchecked in complex multi-class models. -- The test may not account for all potential conditions or alterations that could show up in practical use -scenarios. - - - - - \ No newline at end of file +- When there are too many target classes (over 10), the test is skipped, which can leave potential vulnerabilities unchecked in complex multi-class models. +- The test may not account for all potential conditions or alterations that could show up in practical use scenarios. diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index eca27f2e1..56cbff1d4 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### Specificity +## Specificity[()]{.muted} ```python def Specificity( @@ -17,44 +12,30 @@ def Specificity( min_threshold = 7): ``` -Evaluates and scores the specificity of prompts provided to a Large Language Model (LLM), based on clarity, detail, -and relevance. +Evaluates and scores the specificity of prompts provided to a Large Language Model (LLM), based on clarity, detail, and relevance. -###### Purpose +### Purpose -The Specificity Test evaluates the clarity, precision, and effectiveness of the prompts provided to a Language -Model (LLM). It aims to ensure that the instructions embedded in a prompt are indisputably clear and relevant, -thereby helping to remove ambiguity and steer the LLM towards desired outputs. This level of specificity -significantly affects the accuracy and relevance of LLM outputs. +The Specificity Test evaluates the clarity, precision, and effectiveness of the prompts provided to a Language Model (LLM). It aims to ensure that the instructions embedded in a prompt are indisputably clear and relevant, thereby helping to remove ambiguity and steer the LLM towards desired outputs. This level of specificity significantly affects the accuracy and relevance of LLM outputs. -###### Test Mechanism +### Test Mechanism -The Specificity Test employs an LLM to grade each prompt based on clarity, detail, and relevance parameters within -a specificity scale that extends from 1 to 10. On this scale, prompts scoring equal to or more than a predefined -threshold (set to 7 by default) pass the evaluation, while those scoring below this threshold fail it. Users can -adjust this threshold as per their requirements. +The Specificity Test employs an LLM to grade each prompt based on clarity, detail, and relevance parameters within a specificity scale that extends from 1 to 10. On this scale, prompts scoring equal to or more than a predefined threshold (set to 7 by default) pass the evaluation, while those scoring below this threshold fail it. Users can adjust this threshold as per their requirements. -###### Signs of High Risk +### Signs of High Risk - Prompts scoring consistently below the established threshold - Vague or ambiguous prompts that do not provide clear direction to the LLM - Overly verbose prompts that may confuse the LLM instead of providing clear guidance -###### Strengths +### Strengths - Enables precise and clear communication with the LLM to achieve desired outputs - Serves as a crucial means to measure the effectiveness of prompts - Highly customizable, allowing users to set their threshold based on specific use cases -###### Limitations +### Limitations - This test doesn't consider the content comprehension capability of the LLM -- High specificity score doesn't guarantee a high-quality response from the LLM, as the model's performance is also -dependent on various other factors -- Striking a balance between specificity and verbosity can be challenging, as overly detailed prompts might confuse -or mislead the model - - - - - \ No newline at end of file +- High specificity score doesn't guarantee a high-quality response from the LLM, as the model's performance is also dependent on various other factors +- Striking a balance between specificity and verbosity can be challenging, as overly detailed prompts might confuse or mislead the model diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index ae432840a..ccad2956d 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### call_model +## call_model[()]{.muted} ```python def call_model( @@ -21,41 +16,32 @@ def call_model( Call LLM with the given prompts and return the response - - - - -#### get_explanation +## get_explanation[()]{.muted} ```python def get_explanation( response: str): ``` -Get just the explanation from the response string -- **TODO****: use json response mode instead of this - -- **e.g. "Score**: 8 -Explanation: " -> "" - +Get just the explanation from the response string TODO: use json response mode instead of this +``` +e.g. "Score: 8 +``` +Explanation: " -> "" - -#### get_score +## get_score[()]{.muted} ```python def get_score( response: str): ``` -Get just the score from the response string -- **TODO****: use json response mode instead of this - -- **e.g. "Score**: 8 -Explanation: " -> 8 - - +Get just the score from the response string TODO: use json response mode instead of this +``` +e.g. "Score: 8 +``` - \ No newline at end of file +Explanation: " -> 8 diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index ca41e6105..e79096650 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -4,12 +4,7 @@ toc-depth: 3 toc-expand: 3 --- - - - - - -#### describe_metric +## describe_metric[()]{.muted} ```python def describe_metric( @@ -19,11 +14,7 @@ def describe_metric( Describe a metric - - - - -#### list_metrics +## list_metrics[()]{.muted} ```python def list_metrics( @@ -32,11 +23,7 @@ def list_metrics( List all metrics - - - - -#### run_metric +## run_metric[()]{.muted} ```python def run_metric( @@ -45,8 +32,3 @@ def run_metric( ``` Run a metric - - - - - \ No newline at end of file diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 7b160b2e6..b3cbf14ca 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -5,12 +5,3 @@ toc-expand: 3 --- Models entrypoint - - - - - - - - - \ No newline at end of file diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 3c1f5b9e6..258415d82 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -4,6 +4,8 @@ from pathlib import Path from typing import Any, Dict, Set, List from jinja2 import Environment, FileSystemLoader +import mdformat +from docstring_parser import parse def resolve_alias(member: Dict[str, Any], data: Dict[str, Any]) -> Dict[str, Any]: """Resolve an alias to its target member.""" @@ -161,6 +163,108 @@ def process_module(module: Dict[str, Any], path: list, env: Environment, data: D if is_public(member, module, data, is_root=len(path) <= 1): process_module(member, path + [name], env, data) +def lint_markdown_files(output_dir: str): + """Clean up whitespace and formatting in all generated markdown files.""" + for path in Path(output_dir).rglob('*.qmd'): + with open(path) as f: + content = f.read() + + # Split content into front matter and body + parts = content.split('---', 2) + if len(parts) >= 3: + # Preserve front matter and format the rest + front_matter = parts[1] + body = parts[2] + formatted_body = mdformat.text(body, options={"wrap": "no"}) + formatted = f"---{front_matter}---\n\n{formatted_body}" + else: + # No front matter, format everything + formatted = mdformat.text(content, options={"wrap": "no"}) + + with open(path, 'w') as f: + f.write(formatted) + +def format_docstring(docstring: str) -> str: + """Format a docstring into markdown using docstring_parser.""" + try: + parsed = parse(docstring) + sections = [] + + # Main description + if parsed.short_description: + sections.append(parsed.short_description) + if parsed.long_description: + sections.append(parsed.long_description) + + # Parameters + if parsed.params: + sections.append("**Parameters**\n") + for param in parsed.params: + sections.append(f"- **{param.arg_name}**: {param.description}") + + # Returns + if parsed.returns: + sections.append("**Returns**\n") + sections.append(f"- {parsed.returns.description}") + + # Raises + if parsed.raises: + sections.append("**Raises**\n") + for raises in parsed.raises: + sections.append(f"- **{raises.type_name}**: {raises.description}") + + return "\n\n".join(sections) + except: + # Fallback to raw docstring if parsing fails + return docstring + +def parse_docstrings_recursively(data: Dict[str, Any]): + """Recursively parse all docstrings in the data structure.""" + if isinstance(data, dict): + # Parse docstring if present + if 'docstring' in data: + print("\nBEFORE:", data.get('name', 'unnamed'), data['docstring']) + + # If it's already a dict with parsed content + if isinstance(data['docstring'], dict) and 'parsed' in data['docstring']: + # If parsed is a list of sections, convert to docstring-parser format + if isinstance(data['docstring']['parsed'], list): + text_content = next(( + section['value'] + for section in data['docstring']['parsed'] + if section['kind'] == 'text' + ), None) + if text_content: + try: + parsed = parse(text_content) + data['docstring']['parsed'] = parsed + except Exception as e: + print(f"Failed to parse text content: {e}") + + # If it's a string, try to parse it + elif isinstance(data['docstring'], str): + original = data['docstring'] + try: + parsed = parse(original) + data['docstring'] = { + 'value': original, + 'parsed': parsed + } + except Exception as e: + print(f"Failed to parse docstring: {e}") + data['docstring'] = {'value': original} + + # If it's neither, wrap it in a dict + else: + data['docstring'] = {'value': str(data['docstring'])} + + print("AFTER:", data.get('name', 'unnamed'), data['docstring']) + + # Recursively process members + if 'members' in data: + for member in data['members'].values(): + parse_docstrings_recursively(member) + def generate_docs(json_path: str, template_dir: str, output_dir: str): """Generate documentation from JSON data using templates.""" # Load JSON data @@ -207,6 +311,9 @@ def generate_docs(json_path: str, template_dir: str, output_dir: str): sidebar_path = os.path.join(output_dir, '_sidebar.yml') with open(sidebar_path, 'w') as f: f.write(sidebar_output) + + # Clean up markdown formatting + lint_markdown_files(output_dir) else: print("Error: No 'validmind' module found in JSON") From 8bf70ea4a8cb545a1634f9c1d37564aa9ad095d4 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Mon, 27 Jan 2025 10:48:24 -0800 Subject: [PATCH 014/207] Save ppoint docstring parsing --- docs/templates/macros/docstring.jinja2 | 32 ++- docs/validmind.qmd | 167 ++++++++----- .../datasets/credit_risk/lending_club.qmd | 28 ++- .../credit_risk/lending_club_bias.qmd | 4 +- docs/validmind/datasets/nlp/cnn_dailymail.qmd | 9 +- docs/validmind/datasets/regression/fred.qmd | 11 +- .../datasets/regression/lending_club.qmd | 11 +- docs/validmind/errors.qmd | 4 +- docs/validmind/test_suites.qmd | 9 +- docs/validmind/test_suites/classifier.qmd | 4 +- docs/validmind/test_suites/cluster.qmd | 4 +- docs/validmind/test_suites/embeddings.qmd | 4 +- .../test_suites/parameters_optimization.qmd | 4 +- docs/validmind/tests.qmd | 5 +- .../tests/model_validation/ModelMetadata.qmd | 4 +- .../ClassifierThresholdOptimization.qmd | 24 +- .../sklearn/SHAPGlobalImportance.qmd | 25 +- scripts/generate_quarto_docs.py | 220 ++++++++++++------ 18 files changed, 389 insertions(+), 180 deletions(-) diff --git a/docs/templates/macros/docstring.jinja2 b/docs/templates/macros/docstring.jinja2 index b31a7df28..9ffb53063 100644 --- a/docs/templates/macros/docstring.jinja2 +++ b/docs/templates/macros/docstring.jinja2 @@ -14,37 +14,47 @@ {# Parameters #} {%- if docstring.parsed.params -%} - {%- set _ = sections.append("**Parameters**\n") -%} + {%- set _ = sections.append("\n**Parameters**") -%} {%- for param in docstring.parsed.params -%} - {%- set _ = sections.append("- **" ~ param.arg_name ~ "**: " ~ param.description) -%} + {%- if param.arg_name and param.description -%} + {%- set desc = param.description | trim -%} + {%- if desc.endswith(')') and '(default:' in desc -%} + {%- set desc = desc[:-1] ~ ')' -%} + {%- endif -%} + {%- set _ = sections.append("- **" ~ param.arg_name ~ "**: " ~ desc) -%} + {%- endif -%} {%- endfor -%} {%- endif -%} {# Returns #} {%- if docstring.parsed.returns -%} - {%- set _ = sections.append("**Returns**\n") -%} - {%- set _ = sections.append("- " ~ docstring.parsed.returns.description) -%} + {%- set _ = sections.append("\n**Returns**") -%} + {%- if docstring.parsed.returns.description -%} + {%- set _ = sections.append("- " ~ docstring.parsed.returns.description | trim) -%} + {%- endif -%} {%- endif -%} {# Raises #} {%- if docstring.parsed.raises -%} - {%- set _ = sections.append("**Raises**\n") -%} + {%- set _ = sections.append("\n**Raises**") -%} {%- for raises in docstring.parsed.raises -%} - {%- set _ = sections.append("- **" ~ raises.type_name ~ "**: " ~ raises.description) -%} + {%- if raises.type_name and raises.description -%} + {%- set _ = sections.append("- **" ~ raises.type_name ~ "**: " ~ raises.description | trim) -%} + {%- endif -%} {%- endfor -%} {%- endif -%} - {# If we got any sections, join them, otherwise fall back to value #} + {# Join sections with proper spacing #} {%- if sections -%} - {{ sections | join('\n\n') }} + {{ sections | join('\n') | trim }} {%- else -%} - {{ docstring.value }} + {{ docstring.value | trim }} {%- endif -%} {%- else -%} {# Always fall back to value if no parsed content #} - {{ docstring.value }} + {{ docstring.value | trim }} {%- endif -%} {% else %} -{{ docstring }} +{{ docstring | trim }} {% endif %} {% endmacro %} \ No newline at end of file diff --git a/docs/validmind.qmd b/docs/validmind.qmd index a263a5381..0e5a9b479 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -6,9 +6,7 @@ aliases: - index.html --- -The ValidMind Library is a suite of developer tools and methods designed to automate the documentation and validation of your models. - -Designed to be model agnostic, the ValidMind Library provides all the standard functionality without requiring you to rewrite any functions as long as your model is built in Python. +The ValidMind Library is a suite of developer tools and methods designed to automate the documentation and validation of your models. Designed to be model agnostic, the ValidMind Library provides all the standard functionality without requiring you to rewrite any functions as long as your model is built in Python. With a rich array of documentation tools and test suites, from documenting descriptions of your datasets to testing your models for weak spots and overfit areas, the ValidMind Library helps you automate model documentation by feeding the ValidMind Platform with documentation artifacts and test results. @@ -51,11 +49,14 @@ def get_test_suite( **kwargs = {}) -> TestSuite: ``` -Gets a TestSuite object for the current project or a specific test suite +Gets a TestSuite object for the current project or a specific test suite This function provides an interface to retrieve the TestSuite instance for the current project or a specific TestSuite instance identified by test_suite_id. The project Test Suite will contain sections for every section in the project's documentation template and these Test Suite Sections will contain all the tests associated with that template section. -This function provides an interface to retrieve the TestSuite instance for the current project or a specific TestSuite instance identified by test_suite_id. The project Test Suite will contain sections for every section in the project's documentation template and these Test Suite Sections will contain all the tests associated with that template section. +**Parameters** -Args: test_suite_id (str, optional): The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. section (str, optional): The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. args: Additional arguments to pass to the TestSuite kwargs: Additional keyword arguments to pass to the TestSuite +- **optional)**: The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. section (str, +- **optional)**: The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. +- **args**: Additional arguments to pass to the TestSuite +- **kwargs**: Additional keyword arguments to pass to the TestSuite ### init[()]{.muted} @@ -69,13 +70,20 @@ def init( monitoring: bool = False): ``` -Initializes the API client instances and calls the /ping endpoint to ensure the provided credentials are valid and we can connect to the ValidMind API. +Initializes the API client instances and calls the /ping endpoint to ensure the provided credentials are valid and we can connect to the ValidMind API. If the API key and secret are not provided, the client will attempt to retrieve them from the environment variables `VM_API_KEY` and `VM_API_SECRET`. + +**Parameters** -If the API key and secret are not provided, the client will attempt to retrieve them from the environment variables `VM_API_KEY` and `VM_API_SECRET`. +- **optional)**: The project CUID. Alias for model. Defaults to None. [DEPRECATED] model (str, +- **optional)**: The model CUID. Defaults to None. api_key (str, +- **optional)**: The API key. Defaults to None. api_secret (str, +- **optional)**: The API secret. Defaults to None. api_host (str, +- **optional)**: The API host. Defaults to None. monitoring +- **(bool)**: The ongoing monitoring flag. Defaults to False. -Args: project (str, optional): The project CUID. Alias for model. Defaults to None. [DEPRECATED] model (str, optional): The model CUID. Defaults to None. api_key (str, optional): The API key. Defaults to None. api_secret (str, optional): The API secret. Defaults to None. api_host (str, optional): The API host. Defaults to None. monitoring (bool): The ongoing monitoring flag. Defaults to False. +**Raises** -Raises: ValueError: If the API key and secret are not provided +- **ValueError**: If the API key and secret are not provided ### init_dataset[()]{.muted} @@ -97,20 +105,31 @@ def init_dataset( __log = True) -> VMDataset: ``` -Initializes a VM Dataset, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are reading a valid dataset type. - -The following dataset types are supported: +Initializes a VM Dataset, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are reading a valid dataset type. The following dataset types are supported: - Pandas DataFrame - Polars DataFrame - Numpy ndarray - Torch TensorDataset -Args: dataset : dataset from various python libraries model (VMModel): ValidMind model object targets (vm.vm.DatasetTargets): A list of target variables target_column (str): The name of the target column in the dataset feature_columns (list): A list of names of feature columns in the dataset extra_columns (dictionary): A dictionary containing the names of the prediction_column and group_by_columns in the dataset class_labels (dict): A list of class labels for classification problems type (str): The type of dataset (one of DATASET_TYPES) input_id (str): The input ID for the dataset (e.g. "my_dataset"). By default, this will be set to `dataset` but if you are passing this dataset as a test input using some other key than `dataset`, then you should set this to the same key. +**Parameters** + +- **(VMModel)**: ValidMind model object targets +- **(vm.vm.DatasetTargets)**: A list of target variables target_column +- **(str)**: The name of the target column in the dataset feature_columns +- **(list)**: A list of names of feature columns in the dataset extra_columns +- **(dictionary)**: A dictionary containing the names of the prediction_column and group_by_columns in the dataset class_labels +- **(dict)**: A list of class labels for classification problems type +- **(str)**: The type of dataset (one of DATASET_TYPES) input_id +- **(str)**: The input ID for the dataset (e.g. "my_dataset"). By default, this will be set to `dataset` but if you are passing this dataset as a test input using some other key than `dataset`, then you should set this to the same key. + +**Returns** + +- A VM Dataset instance -Raises: ValueError: If the dataset type is not supported +**Raises** -Returns: vm.vm.Dataset: A VM Dataset instance +- **ValueError**: If the dataset type is not supported ### init_model[()]{.muted} @@ -126,11 +145,21 @@ def init_model( Initializes a VM Model, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are creating a model supported libraries. -Args: model: A trained model or VMModel instance input_id (str): The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. attributes (dict): A dictionary of model attributes predict_fn (callable): A function that takes an input and returns a prediction \*\*kwargs: Additional arguments to pass to the model +**Parameters** -Raises: ValueError: If the model type is not supported +- **model**: A trained model or VMModel instance input_id +- **(str)**: The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. attributes +- **(dict)**: A dictionary of model attributes predict_fn +- **(callable)**: A function that takes an input and returns a prediction +- \*\***kwargs**: Additional arguments to pass to the model -Returns: vm.VMModel: A VM Model instance +**Returns** + +- A VM Model instance + +**Raises** + +- **ValueError**: If the model type is not supported ### init_r_model[()]{.muted} @@ -140,20 +169,21 @@ def init_r_model( input_id: str = 'model') -> VMModel: ``` -Initializes a VM Model for an R model - -R models must be saved to disk and the filetype depends on the model type... Currently we support the following model types: +Initializes a VM Model for an R model R models must be saved to disk and the filetype depends on the model type... Currently we support the following model types: - LogisticRegression `glm` model in R: saved as an RDS file with `saveRDS` - LinearRegression `lm` model in R: saved as an RDS file with `saveRDS` - XGBClassifier: saved as a .json or .bin file with `xgb.save` -- XGBRegressor: saved as a .json or .bin file with `xgb.save` +- XGBRegressor: saved as a .json or .bin file with `xgb.save` LogisticRegression and LinearRegression models are converted to sklearn models by extracting the coefficients and intercept from the R model. XGB models are loaded using the xgboost since xgb models saved in .json or .bin format can be loaded directly with either Python or R + +**Parameters** -LogisticRegression and LinearRegression models are converted to sklearn models by extracting the coefficients and intercept from the R model. XGB models are loaded using the xgboost since xgb models saved in .json or .bin format can be loaded directly with either Python or R +- **(str)**: The path to the R model saved as an RDS or XGB file model_type +- **(str)**: The type of the model (one of R_MODEL_TYPES) -Args: model_path (str): The path to the R model saved as an RDS or XGB file model_type (str): The type of the model (one of R_MODEL_TYPES) +**Returns** -Returns: vm.vm.Model: A VM Model instance +- A VM Model instance ### log_metric[()]{.muted} @@ -167,11 +197,16 @@ def log_metric( thresholds: Optional = None): ``` -Logs a unit metric +Logs a unit metric Unit metrics are key-value pairs where the key is the metric name and the value is a scalar (int or float). These key-value pairs are associated with the currently selected model (inventory model in the ValidMind Platform) and keys can be logged to over time to create a history of the metric. On the ValidMind Platform, these metrics will be used to create plots/visualizations for documentation and dashboards etc. -Unit metrics are key-value pairs where the key is the metric name and the value is a scalar (int or float). These key-value pairs are associated with the currently selected model (inventory model in the ValidMind Platform) and keys can be logged to over time to create a history of the metric. On the ValidMind Platform, these metrics will be used to create plots/visualizations for documentation and dashboards etc. +**Parameters** -Args: key (str): The metric key value (float): The metric value inputs (list, optional): A list of input IDs that were used to compute the metric. params (dict, optional): Dictionary of parameters used to compute the metric. recorded_at (str, optional): The timestamp of the metric. Server will use current time if not provided. thresholds (dict, optional): Dictionary of thresholds for the metric. +- **(str)**: The metric key value +- **(float)**: The metric value inputs (list, +- **optional)**: A list of input IDs that were used to compute the metric. params (dict, +- **optional)**: Dictionary of parameters used to compute the metric. recorded_at (str, +- **optional)**: The timestamp of the metric. Server will use current time if not provided. thresholds (dict, +- **optional)**: Dictionary of thresholds for the metric. ### preview_template[()]{.muted} @@ -180,11 +215,11 @@ def preview_template( ): ``` -Preview the documentation template for the current project +Preview the documentation template for the current project This function will display the documentation template for the current project. If the project has not been initialized, then an error will be raised. -This function will display the documentation template for the current project. If the project has not been initialized, then an error will be raised. +**Raises** -Raises: ValueError: If the project has not been initialized +- **ValueError**: If the project has not been initialized ### reload[()]{.muted} @@ -207,15 +242,24 @@ def run_documentation_tests( **kwargs = {}): ``` -Collect and run all the tests associated with a template +Collect and run all the tests associated with a template This function will analyze the current project's documentation template and collect all the tests associated with it into a test suite. It will then run the test suite, log the results to the ValidMind API, and display them to the user. -This function will analyze the current project's documentation template and collect all the tests associated with it into a test suite. It will then run the test suite, log the results to the ValidMind API, and display them to the user. +**Parameters** -Args: section (str or list, optional): The section(s) to preview. Defaults to None. send (bool, optional): Whether to send the results to the ValidMind API. Defaults to True. fail_fast (bool, optional): Whether to stop running tests after the first failure. Defaults to False. inputs (dict, optional): A dictionary of test inputs to pass to the TestSuite config: A dictionary of test parameters to override the defaults \*\*kwargs: backwards compatibility for passing in test inputs using keyword arguments +- **optional)**: The section(s) to preview. Defaults to None. send (bool, +- **optional)**: Whether to send the results to the ValidMind API. Defaults to True. fail_fast (bool, +- **optional)**: Whether to stop running tests after the first failure. Defaults to False. inputs (dict, +- **optional)**: A dictionary of test inputs to pass to the TestSuite +- **config**: A dictionary of test parameters to override the defaults +- \*\***kwargs**: backwards compatibility for passing in test inputs using keyword arguments -Returns: TestSuite or dict: The completed TestSuite instance or a dictionary of TestSuites if section is a list. +**Returns** -Raises: ValueError: If the project has not been initialized +- TestSuite or dict: The completed TestSuite instance or a dictionary of TestSuites if section is a list. + +**Raises** + +- **ValueError**: If the project has not been initialized ### run_test_suite[()]{.muted} @@ -229,15 +273,24 @@ def run_test_suite( **kwargs = {}): ``` -High Level function for running a test suite +High Level function for running a test suite This function provides a high level interface for running a test suite. A test suite is a collection of tests. This function will automatically find the correct test suite class based on the test_suite_id, initialize each of the tests, and run them. + +**Parameters** -This function provides a high level interface for running a test suite. A test suite is a collection of tests. This function will automatically find the correct test suite class based on the test_suite_id, initialize each of the tests, and run them. +- **(str)**: The test suite name (e.g. 'classifier_full_suite') config (dict, +- **optional)**: A dictionary of parameters to pass to the tests in the test suite. Defaults to None. send (bool, +- **optional)**: Whether to post the test results to the API. send=False is useful for testing. Defaults to True. fail_fast (bool, +- **optional)**: Whether to stop running tests after the first failure. Defaults to False. inputs (dict, +- **optional)**: A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` `models` etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. +- \*\***kwargs**: backwards compatibility for passing in test inputs using keyword arguments -Args: test_suite_id (str): The test suite name (e.g. 'classifier_full_suite') config (dict, optional): A dictionary of parameters to pass to the tests in the test suite. Defaults to None. send (bool, optional): Whether to post the test results to the API. send=False is useful for testing. Defaults to True. fail_fast (bool, optional): Whether to stop running tests after the first failure. Defaults to False. inputs (dict, optional): A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` `models` etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. \*\*kwargs: backwards compatibility for passing in test inputs using keyword arguments +**Returns** -Raises: ValueError: If the test suite name is not found or if there is an error initializing the test suite +- the TestSuite instance -Returns: TestSuite: the TestSuite instance +**Raises** + +- **ValueError**: If the test suite name is not found or if there is an error initializing the test suite ### tags[()]{.muted} @@ -248,7 +301,9 @@ def tags( Decorator for specifying tags for a test. -Args: \*tags: The tags to apply to the test. +**Parameters** + +- \***tags**: The tags to apply to the test. ### tasks[()]{.muted} @@ -259,7 +314,9 @@ def tasks( Decorator for specifying the task types that a test is designed for. -Args: \*tasks: The task types that the test is designed for. +**Parameters** + +- \***tasks**: The task types that the test is designed for. ### test[()]{.muted} @@ -268,24 +325,20 @@ def test( func_or_id): ``` -Decorator for creating and registering custom tests - -This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. - -The function can take two different types of arguments: +Decorator for creating and registering custom tests This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. The function can take two different types of arguments: - Inputs: ValidMind model or dataset (or list of models/datasets). These arguments must use the following names: `model`, `models`, `dataset`, `datasets`. -- Parameters: Any additional keyword arguments of any type (must have a default value) that can have any name. - -The function should return one of the following types: - +- Parameters: Any additional keyword arguments of any type (must have a default value) that can have any name. The function should return one of the following types: - Table: Either a list of dictionaries or a pandas DataFrame - Plot: Either a matplotlib figure or a plotly figure - Scalar: A single number (int or float) -- Boolean: A single boolean value indicating whether the test passed or failed +- Boolean: A single boolean value indicating whether the test passed or failed The function may also include a docstring. This docstring will be used and logged as the metric's description. + +**Parameters** -The function may also include a docstring. This docstring will be used and logged as the metric's description. +- **func**: The function to decorate +- **test_id**: The identifier for the metric. If not provided, the function name is used. -Args: func: The function to decorate test_id: The identifier for the metric. If not provided, the function name is used. +**Returns** -Returns: The decorated function. +- The decorated function. diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index a0886433f..c80c9977a 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -29,9 +29,14 @@ def get_demo_test_config( Get demo test configuration. -Args: x_test: Test features DataFrame y_test: Test target Series +**Parameters** -Returns: dict: Test configuration dictionary +- **x_test**: Test features DataFrame +- **y_test**: Test target Series + +**Returns** + +- Test configuration dictionary ## init_vm_objects[()]{.muted} @@ -50,7 +55,13 @@ def load_data( Load data from either an online source or offline files, automatically dropping specified columns for offline data. -:param source: 'online' for online data, 'offline' for offline files. Defaults to 'online'. :return: DataFrame containing the loaded data. +**Parameters** + +- **source**: 'online' for online data, 'offline' for offline files. Defaults to 'online'. + +**Returns** + +- DataFrame containing the loaded data. ## load_scorecard[()]{.muted} @@ -87,9 +98,16 @@ def split( Split dataset into train, validation (optional), and test sets. -Args: df: Input DataFrame validation_split: If None, returns train/test split. If float, returns train/val/test split test_size: Proportion of data for test set (default: 0.2) add_constant: Whether to add constant column for statsmodels (default: False) +**Parameters** + +- **df**: Input DataFrame +- **validation_split**: If None, returns train/test split. If float, returns train/val/test split +- **test_size**: Proportion of data for test set (default: 0.2) +- **add_constant**: Whether to add constant column for statsmodels (default: False) + +**Returns** -Returns: If validation_size is None: train_df, test_df If validation_size is float: train_df, validation_df, test_df +- If validation_size is None: train_df, test_df If validation_size is float: train_df, validation_df, test_df ## woe_encoding[()]{.muted} diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 9722a479d..7aa300973 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -20,7 +20,9 @@ def load_data( Load data from the specified CSV file. -:return: DataFrame containing the loaded data. +**Returns** + +- DataFrame containing the loaded data. ## preprocess[()]{.muted} diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index a6347c5ec..2f8833d1a 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -24,4 +24,11 @@ def load_data( Load data from either online source or offline files. -:param source: 'online' for online data, 'offline' for offline data. Defaults to 'online'. :param dataset_size: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. :return: DataFrame containing the loaded data. +**Parameters** + +- **source**: 'online' for online data, 'offline' for offline data. Defaults to 'online'. +- **dataset_size**: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. + +**Returns** + +- DataFrame containing the loaded data. diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index 99118f06f..6a42ad114 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -58,9 +58,16 @@ def preprocess( Split a time series DataFrame into train, validation, and test sets. -Parameters: df (pandas.DataFrame): The time series DataFrame to be split. split_option (str): The split option to choose from: 'train_test_val' (default) or 'train_test'. train_size (float): The proportion of the dataset to include in the training set. Default is 0.6. test_size (float): The proportion of the dataset to include in the test set. Default is 0.2. +**Parameters** -Returns: train_df (pandas.DataFrame): The training set. validation_df (pandas.DataFrame): The validation set (only returned if split_option is 'train_test_val'). test_df (pandas.DataFrame): The test set. +- **df**: The time series DataFrame to be split. +- **split_option**: The split option to choose from: 'train_test_val' (default) or 'train_test'. +- **train_size**: The proportion of the dataset to include in the training set. Default is 0.6. +- **test_size**: The proportion of the dataset to include in the test set. Default is 0.2. + +**Returns** + +- train_df (pandas.DataFrame): The training set. validation_df (pandas.DataFrame): The validation set (only returned if split_option is 'train_test_val'). test_df (pandas.DataFrame): The test set. ## transform[()]{.muted} diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 7ef1bd2b1..374627c01 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -23,9 +23,16 @@ def preprocess( Split a time series DataFrame into train, validation, and test sets. -Parameters: df (pandas.DataFrame): The time series DataFrame to be split. split_option (str): The split option to choose from: 'train_test_val' (default) or 'train_test'. train_size (float): The proportion of the dataset to include in the training set. Default is 0.6. test_size (float): The proportion of the dataset to include in the test set. Default is 0.2. +**Parameters** -Returns: train_df (pandas.DataFrame): The training set. validation_df (pandas.DataFrame): The validation set (only returned if split_option is 'train_test_val'). test_df (pandas.DataFrame): The test set. +- **df**: The time series DataFrame to be split. +- **split_option**: The split option to choose from: 'train_test_val' (default) or 'train_test'. +- **train_size**: The proportion of the dataset to include in the training set. Default is 0.6. +- **test_size**: The proportion of the dataset to include in the test set. Default is 0.2. + +**Returns** + +- train_df (pandas.DataFrame): The training set. validation_df (pandas.DataFrame): The validation set (only returned if split_option is 'train_test_val'). test_df (pandas.DataFrame): The test set. ## transform[()]{.muted} diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index b51807307..2bceb790c 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -4,9 +4,7 @@ toc-depth: 3 toc-expand: 3 --- -This module contains all the custom errors that are used in the ValidMind Library. - -The following base errors are defined for others: +This module contains all the custom errors that are used in the ValidMind Library. The following base errors are defined for others: - BaseError - APIRequestError diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 793ada67e..d68e373ef 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,9 +29,14 @@ def describe_suite( Describes a Test Suite by ID -Args: test_suite_id: Test Suite ID verbose: If True, describe all plans and tests in the Test Suite +**Parameters** -Returns: pandas.DataFrame: A formatted table with the Test Suite description +- **test_suite_id**: Test Suite ID +- **verbose**: If True, describe all plans and tests in the Test Suite + +**Returns** + +- A formatted table with the Test Suite description ## get_by_id[()]{.muted} diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index 026df46d7..8ab749fe3 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -4,9 +4,7 @@ toc-depth: 3 toc-expand: 3 --- -Test suites for sklearn-compatible classifier models - -Ideal setup is to have the API client to read a custom test suite from the project's configuration +Test suites for sklearn-compatible classifier models Ideal setup is to have the API client to read a custom test suite from the project's configuration ### Class: ClassifierDiagnosis diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index a421854c2..5a81d2ca9 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -4,9 +4,7 @@ toc-depth: 3 toc-expand: 3 --- -Test suites for sklearn-compatible clustering models - -Ideal setup is to have the API client to read a custom test suite from the project's configuration +Test suites for sklearn-compatible clustering models Ideal setup is to have the API client to read a custom test suite from the project's configuration ### Class: ClusterFullSuite diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index a01b13af5..bba414121 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -4,9 +4,7 @@ toc-depth: 3 toc-expand: 3 --- -Test suites for embeddings models - -Ideal setup is to have the API client to read a custom test suite from the project's configuration +Test suites for embeddings models Ideal setup is to have the API client to read a custom test suite from the project's configuration ### Class: EmbeddingsFullSuite diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index f3d95e38e..05d248997 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -4,9 +4,7 @@ toc-depth: 3 toc-expand: 3 --- -Test suites for sklearn-compatible hyper parameters tunning - -Ideal setup is to have the API client to read a custom test suite from the project's configuration +Test suites for sklearn-compatible hyper parameters tunning Ideal setup is to have the API client to read a custom test suite from the project's configuration ### Class: KmeansParametersOptimization diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index bd2b2e94c..66ea14ac3 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -20,4 +20,7 @@ def register_test_provider( Register an external test provider -Args: namespace (str): The namespace of the test provider test_provider (TestProvider): The test provider +**Parameters** + +- **(str)**: The namespace of the test provider test_provider +- **(TestProvider)**: The test provider diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index 1479cee9b..35c4d1b41 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -11,9 +11,7 @@ def ModelMetadata( model): ``` -Compare metadata of different models and generate a summary table with the results. - -**Purpose**: The purpose of this function is to compare the metadata of different models, including information about their architecture, framework, framework version, and programming language. +Compare metadata of different models and generate a summary table with the results. **Purpose**: The purpose of this function is to compare the metadata of different models, including information about their architecture, framework, framework version, and programming language. **Test Mechanism**: The function retrieves the metadata for each model using `get_model_info`, renames columns according to a predefined set of labels, and compiles this information into a summary table. diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index d4c6c7a76..f3ef5f60c 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -63,9 +63,18 @@ The test implements multiple threshold optimization methods: - May not capture temporal changes in optimal threshold - Single threshold may not be optimal for all subgroups -Args: dataset: VMDataset containing features and target model: VMModel containing predictions methods: List of methods to compare (default: ['youden', 'f1', 'precision_recall']) target_recall: Target recall value if using 'target_recall' method +**Parameters** -Returns: Dictionary containing: - table: DataFrame comparing different threshold optimization methods (using weighted averages for precision, recall, and f1) - figure: Plotly figure showing ROC and PR curves with optimal thresholds +- **dataset**: VMDataset containing features and target +- **model**: VMModel containing predictions +- **methods**: List of methods to compare (default: ['youden', 'f1', 'precision_recall']) +- **target_recall**: Target recall value if using 'target_recall' method + +**Returns** + +- Dictionary containing: +- table: DataFrame comparing different threshold optimization methods (using weighted averages for precision, recall, and f1) +- figure: Plotly figure showing ROC and PR curves with optimal thresholds ## find_optimal_threshold[()]{.muted} @@ -79,6 +88,13 @@ def find_optimal_threshold( Find the optimal classification threshold using various methods. -Args: y_true: True binary labels y_prob: Predicted probabilities method: Method to use for finding optimal threshold target_recall: Required if method='target_recall' +**Parameters** + +- **y_true**: True binary labels +- **y_prob**: Predicted probabilities +- **method**: Method to use for finding optimal threshold +- **target_recall**: Required if method='target_recall' + +**Returns** -Returns: dict: Dictionary containing threshold and metrics +- Dictionary containing threshold and metrics diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 10a6f0c43..c0fff77e2 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -15,9 +15,15 @@ def generate_shap_plot( Plots two types of SHAP global importance (SHAP). -Args: type\_: The type of SHAP plot to generate. Must be "mean" or "summary". shap_values: The SHAP values to plot. x_test: The test data used to generate the SHAP values. +**Parameters** -Returns: The generated plot. +- **type\_**: The type of SHAP plot to generate. Must be "mean" or "summary". +- **shap_values**: The SHAP values to plot. +- **x_test**: The test data used to generate the SHAP values. + +**Returns** + +- The generated plot. ## select_shap_values[()]{.muted} @@ -27,15 +33,20 @@ def select_shap_values( class_of_interest): ``` -Selects SHAP values for binary or multiclass classification. +Selects SHAP values for binary or multiclass classification. For regression models, returns the SHAP values directly as there are no classes. + +**Parameters** + +- **shap_values**: The SHAP values returned by the SHAP explainer. For multiclass classification, this will be a list where each element corresponds to a class. For regression, this will be a single array of SHAP values. +- **class_of_interest**: The class index for which to retrieve SHAP values. If None (default: (default, the function will assume binary classification and use class 1 by default.) -For regression models, returns the SHAP values directly as there are no classes. +**Returns** -Args: shap_values: The SHAP values returned by the SHAP explainer. For multiclass classification, this will be a list where each element corresponds to a class. For regression, this will be a single array of SHAP values. class_of_interest: The class index for which to retrieve SHAP values. If None (default), the function will assume binary classification and use class 1 by default. +- The SHAP values for the specified class (classification) or for the regression output. -Returns: The SHAP values for the specified class (classification) or for the regression output. +**Raises** -Raises: ValueError: If class_of_interest is specified and is out of bounds for the number of classes. +- **ValueError**: If class_of_interest is specified and is out of bounds for the number of classes. ## SHAPGlobalImportance[()]{.muted} diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 258415d82..9de4ecea5 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -5,7 +5,7 @@ from typing import Any, Dict, Set, List from jinja2 import Environment, FileSystemLoader import mdformat -from docstring_parser import parse +from docstring_parser import parse, Style def resolve_alias(member: Dict[str, Any], data: Dict[str, Any]) -> Dict[str, Any]: """Resolve an alias to its target member.""" @@ -134,8 +134,13 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: return result -def process_module(module: Dict[str, Any], path: list, env: Environment, data: Dict[str, Any]): +def process_module(module: Dict[str, Any], path: List[str], env: Environment, full_data: Dict[str, Any]): """Process a module and its members.""" + print("\nDEBUG process_module:", path) + + # Parse docstrings first + parse_docstrings_recursively(module) + module_dir = os.path.join('docs', *path[:-1]) ensure_dir(module_dir) @@ -145,7 +150,7 @@ def process_module(module: Dict[str, Any], path: list, env: Environment, data: D # Generate module documentation output = module_template.render( module=module, - full_data=data, + full_data=full_data, is_root=(len(path) <= 1), resolve_alias=resolve_alias ) @@ -160,8 +165,8 @@ def process_module(module: Dict[str, Any], path: list, env: Environment, data: D members = module.get('members', {}) for name, member in members.items(): if member.get('kind') == 'module': - if is_public(member, module, data, is_root=len(path) <= 1): - process_module(member, path + [name], env, data) + if is_public(member, module, full_data, is_root=len(path) <= 1): + process_module(member, path + [name], env, full_data) def lint_markdown_files(output_dir: str): """Clean up whitespace and formatting in all generated markdown files.""" @@ -184,89 +189,166 @@ def lint_markdown_files(output_dir: str): with open(path, 'w') as f: f.write(formatted) -def format_docstring(docstring: str) -> str: - """Format a docstring into markdown using docstring_parser.""" - try: - parsed = parse(docstring) - sections = [] - - # Main description - if parsed.short_description: - sections.append(parsed.short_description) - if parsed.long_description: - sections.append(parsed.long_description) +def format_google_docstring(docstring: str) -> str: + """Format a Google-style docstring from JSON format back to proper structure.""" + print("\nDEBUG format_google_docstring ENTRY POINT") + print("Input:", repr(docstring)) + + lines = [] + sections = docstring.split('\n\n') + + for section in sections: + if section.startswith('Args:'): + lines.append('Args:') + args_text = section.replace('Args:', '').strip() - # Parameters - if parsed.params: - sections.append("**Parameters**\n") - for param in parsed.params: - sections.append(f"- **{param.arg_name}**: {param.description}") - - # Returns - if parsed.returns: - sections.append("**Returns**\n") - sections.append(f"- {parsed.returns.description}") + current_param = None + param_desc = [] - # Raises - if parsed.raises: - sections.append("**Raises**\n") - for raises in parsed.raises: - sections.append(f"- **{raises.type_name}**: {raises.description}") + parts = args_text.split() + i = 0 + while i < len(parts): + part = parts[i] + + if ':' in part and not part.startswith('(default'): + # If we have a previous parameter, add it + if current_param: + lines.append(f" {current_param}: {' '.join(param_desc)}") + current_param = part.split(':', 1)[0] + param_desc = [part.split(':', 1)[1]] + + elif part.startswith('(default'): + # Look ahead for the default value + default_value = [] + while i < len(parts) and not parts[i].endswith(')'): + default_value.append(parts[i]) + i += 1 + if i < len(parts): # Add the last part with ) + default_value.append(parts[i]) + + # Clean up the default value + default_str = ' '.join(default_value) + default_str = default_str.replace('(default:', '').replace(')', '') + param_desc.append(f"(default: {default_str.strip()})") - return "\n\n".join(sections) + else: + param_desc.append(part) + + i += 1 + + # Add the last parameter + if current_param: + lines.append(f" {current_param}: {' '.join(param_desc)}") + + elif section.startswith('Returns:'): + lines.append('\nReturns:') + returns_text = section.replace('Returns:', '').strip() + lines.append(f" {returns_text}") + + else: + lines.append(section.strip()) + + result = '\n'.join(lines) + print("Output:", repr(result)) + return result + +def format_rst_docstring(docstring: str) -> str: + """Format an RST-style docstring from JSON format back to proper structure.""" + print("\nDEBUG format_rst_docstring ENTRY POINT") + print("Input:", repr(docstring)) + + # Split on ":param" and ":return:" to separate sections + parts = [] + current = [] + + for part in docstring.split(): + if part.startswith(':param') or part.startswith(':return:'): + if current: + parts.append(' '.join(current)) + current = [part] + else: + current.append(part) + if current: + parts.append(' '.join(current)) + + # Join with newlines + result = '\n'.join(parts) + print("Output:", repr(result)) + return result + +def try_parse_docstring(docstring: str) -> Any: + """Try to parse a docstring in multiple styles, defaulting to Google.""" + print("\nDEBUG try_parse_docstring ENTRY POINT") + print("Input:", repr(docstring)) + + # Convert escaped newlines to actual newlines + docstring = docstring.replace('\\n', '\n') + + # Check for Google style markers + google_markers = ['Args:', 'Returns:', 'Raises:', 'Yields:', 'Example:'] + is_google = any(marker in docstring for marker in google_markers) + + # Check for RST style markers + rst_markers = [':param', ':return:', ':raises:', ':yields:'] + is_rst = any(marker in docstring for marker in rst_markers) + + print(f"Style detection - Google: {is_google}, RST: {is_rst}") + + if is_google: + formatted = format_google_docstring(docstring) + try: + parsed = parse(formatted) + print("Successfully parsed as Google style!") + return parsed + except Exception as e: + print(f"Failed to parse Google style: {e}") + print("Formatted:", repr(formatted)) + + if is_rst: + formatted = format_rst_docstring(docstring) + try: + parsed = parse(formatted, style=Style.REST) + print("Successfully parsed as RST style!") + return parsed + except Exception as e: + print(f"Failed to parse RST style: {e}") + print("Formatted:", repr(formatted)) + + # If no style detected or parsing failed, try both as fallback + try: + return parse(docstring) except: - # Fallback to raw docstring if parsing fails - return docstring + try: + return parse(docstring, style=Style.REST) + except: + return None def parse_docstrings_recursively(data: Dict[str, Any]): """Recursively parse all docstrings in the data structure.""" + print("\nDEBUG parse_docstrings_recursively ENTRY") if isinstance(data, dict): - # Parse docstring if present if 'docstring' in data: - print("\nBEFORE:", data.get('name', 'unnamed'), data['docstring']) - - # If it's already a dict with parsed content - if isinstance(data['docstring'], dict) and 'parsed' in data['docstring']: - # If parsed is a list of sections, convert to docstring-parser format - if isinstance(data['docstring']['parsed'], list): - text_content = next(( - section['value'] - for section in data['docstring']['parsed'] - if section['kind'] == 'text' - ), None) - if text_content: - try: - parsed = parse(text_content) - data['docstring']['parsed'] = parsed - except Exception as e: - print(f"Failed to parse text content: {e}") - - # If it's a string, try to parse it + print(f"Found docstring: {data.get('name', 'unnamed')}") + if isinstance(data['docstring'], dict): + original = data['docstring'].get('value', '') elif isinstance(data['docstring'], str): original = data['docstring'] - try: - parsed = parse(original) - data['docstring'] = { - 'value': original, - 'parsed': parsed - } - except Exception as e: - print(f"Failed to parse docstring: {e}") - data['docstring'] = {'value': original} - - # If it's neither, wrap it in a dict else: - data['docstring'] = {'value': str(data['docstring'])} - - print("AFTER:", data.get('name', 'unnamed'), data['docstring']) + original = str(data['docstring']) + + parsed = try_parse_docstring(original) + data['docstring'] = { + 'value': original, + 'parsed': parsed + } if parsed else {'value': original} - # Recursively process members if 'members' in data: for member in data['members'].values(): parse_docstrings_recursively(member) def generate_docs(json_path: str, template_dir: str, output_dir: str): """Generate documentation from JSON data using templates.""" + print("\nDEBUG generate_docs START") # Load JSON data with open(json_path) as f: data = json.load(f) From a0f84368086d5ad95bb8c7833aff11fde7c6634d Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Mon, 27 Jan 2025 11:05:04 -0800 Subject: [PATCH 015/207] Save point before error message fixes --- scripts/generate_quarto_docs.py | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 9de4ecea5..475f72bd0 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -136,8 +136,6 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: def process_module(module: Dict[str, Any], path: List[str], env: Environment, full_data: Dict[str, Any]): """Process a module and its members.""" - print("\nDEBUG process_module:", path) - # Parse docstrings first parse_docstrings_recursively(module) @@ -191,8 +189,6 @@ def lint_markdown_files(output_dir: str): def format_google_docstring(docstring: str) -> str: """Format a Google-style docstring from JSON format back to proper structure.""" - print("\nDEBUG format_google_docstring ENTRY POINT") - print("Input:", repr(docstring)) lines = [] sections = docstring.split('\n\n') @@ -249,13 +245,10 @@ def format_google_docstring(docstring: str) -> str: lines.append(section.strip()) result = '\n'.join(lines) - print("Output:", repr(result)) return result def format_rst_docstring(docstring: str) -> str: """Format an RST-style docstring from JSON format back to proper structure.""" - print("\nDEBUG format_rst_docstring ENTRY POINT") - print("Input:", repr(docstring)) # Split on ":param" and ":return:" to separate sections parts = [] @@ -273,14 +266,10 @@ def format_rst_docstring(docstring: str) -> str: # Join with newlines result = '\n'.join(parts) - print("Output:", repr(result)) return result def try_parse_docstring(docstring: str) -> Any: """Try to parse a docstring in multiple styles, defaulting to Google.""" - print("\nDEBUG try_parse_docstring ENTRY POINT") - print("Input:", repr(docstring)) - # Convert escaped newlines to actual newlines docstring = docstring.replace('\\n', '\n') @@ -292,27 +281,21 @@ def try_parse_docstring(docstring: str) -> Any: rst_markers = [':param', ':return:', ':raises:', ':yields:'] is_rst = any(marker in docstring for marker in rst_markers) - print(f"Style detection - Google: {is_google}, RST: {is_rst}") - if is_google: formatted = format_google_docstring(docstring) try: parsed = parse(formatted) - print("Successfully parsed as Google style!") return parsed - except Exception as e: - print(f"Failed to parse Google style: {e}") - print("Formatted:", repr(formatted)) + except Exception: + pass if is_rst: formatted = format_rst_docstring(docstring) try: parsed = parse(formatted, style=Style.REST) - print("Successfully parsed as RST style!") return parsed - except Exception as e: - print(f"Failed to parse RST style: {e}") - print("Formatted:", repr(formatted)) + except Exception: + pass # If no style detected or parsing failed, try both as fallback try: @@ -325,10 +308,8 @@ def try_parse_docstring(docstring: str) -> Any: def parse_docstrings_recursively(data: Dict[str, Any]): """Recursively parse all docstrings in the data structure.""" - print("\nDEBUG parse_docstrings_recursively ENTRY") if isinstance(data, dict): if 'docstring' in data: - print(f"Found docstring: {data.get('name', 'unnamed')}") if isinstance(data['docstring'], dict): original = data['docstring'].get('value', '') elif isinstance(data['docstring'], str): @@ -348,7 +329,6 @@ def parse_docstrings_recursively(data: Dict[str, Any]): def generate_docs(json_path: str, template_dir: str, output_dir: str): """Generate documentation from JSON data using templates.""" - print("\nDEBUG generate_docs START") # Load JSON data with open(json_path) as f: data = json.load(f) From 031306a445a9f50f145e2480eff30084e53f7474 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Mon, 27 Jan 2025 11:27:46 -0800 Subject: [PATCH 016/207] Save point --- docs/templates/class.qmd.jinja2 | 35 +- .../datasets/credit_risk/lending_club.qmd | 4 +- docs/validmind/errors.qmd | 304 +++++++++++---- docs/validmind/test_suites.qmd | 362 ++++++++++++++++++ docs/validmind/test_suites/classifier.qmd | 74 +++- docs/validmind/test_suites/cluster.qmd | 42 +- docs/validmind/test_suites/embeddings.qmd | 30 +- docs/validmind/test_suites/llm.qmd | 68 +++- docs/validmind/test_suites/nlp.qmd | 58 ++- .../test_suites/parameters_optimization.qmd | 10 +- docs/validmind/test_suites/regression.qmd | 54 ++- .../test_suites/statsmodels_timeseries.qmd | 20 +- docs/validmind/test_suites/summarization.qmd | 10 +- .../test_suites/tabular_datasets.qmd | 30 +- docs/validmind/test_suites/text_data.qmd | 10 +- docs/validmind/test_suites/time_series.qmd | 74 +++- docs/validmind/tests.qmd | 61 +++ .../ChiSquaredFeaturesTable.qmd | 10 + .../tests/data_validation/ClassImbalance.qmd | 10 + .../data_validation/DatasetDescription.qmd | 10 + .../data_validation/DescriptiveStatistics.qmd | 10 + .../tests/data_validation/DickeyFullerGLS.qmd | 10 + .../data_validation/EngleGrangerCoint.qmd | 10 + docs/validmind/tests/data_validation/KPSS.qmd | 10 + .../data_validation/PhillipsPerronArch.qmd | 10 + .../ProtectedClassesCombination.qmd | 12 + .../ProtectedClassesDisparity.qmd | 12 + .../ProtectedClassesThresholdOptimizer.qmd | 12 + .../data_validation/RollingStatsPlot.qmd | 10 + .../data_validation/SeasonalDecompose.qmd | 10 + .../tests/data_validation/SpreadPlot.qmd | 10 + .../TabularCategoricalBarPlots.qmd | 10 + .../TabularDateTimeHistograms.qmd | 10 + .../data_validation/TargetRateBarPlots.qmd | 10 + .../data_validation/TimeSeriesFrequency.qmd | 10 + .../data_validation/TimeSeriesLinePlot.qmd | 10 + .../TimeSeriesMissingValues.qmd | 10 + .../data_validation/TimeSeriesOutliers.qmd | 10 + .../tests/data_validation/WOEBinPlots.qmd | 10 + .../tests/data_validation/WOEBinTable.qmd | 10 + .../data_validation/ZivotAndrewsArch.qmd | 10 + .../tests/data_validation/nlp/Hashtags.qmd | 10 + .../tests/data_validation/nlp/Mentions.qmd | 10 + .../tests/model_validation/FeaturesAUC.qmd | 10 + .../ClassifierThresholdOptimization.qmd | 2 +- .../sklearn/ClusterCosineSimilarity.qmd | 10 + .../sklearn/KMeansClustersOptimization.qmd | 10 + .../sklearn/PermutationFeatureImportance.qmd | 10 + .../sklearn/PopulationStabilityIndex.qmd | 10 + .../sklearn/PrecisionRecallCurve.qmd | 10 + .../model_validation/sklearn/ROCCurve.qmd | 10 + .../sklearn/RobustnessDiagnosis.qmd | 10 + .../sklearn/SHAPGlobalImportance.qmd | 12 +- .../statsmodels/KolmogorovSmirnov.qmd | 10 + .../statsmodels/RegressionCoeffs.qmd | 10 + .../RegressionFeatureSignificance.qmd | 10 + .../tests/prompt_validation/Bias.qmd | 10 + .../tests/prompt_validation/Clarity.qmd | 10 + .../tests/prompt_validation/Conciseness.qmd | 10 + .../tests/prompt_validation/Delimitation.qmd | 10 + .../prompt_validation/NegativeInstruction.qmd | 10 + .../tests/prompt_validation/Robustness.qmd | 20 + .../tests/prompt_validation/Specificity.qmd | 10 + docs/validmind/vm_models.qmd | 102 +++++ scripts/generate_quarto_docs.py | 61 ++- 65 files changed, 1677 insertions(+), 202 deletions(-) diff --git a/docs/templates/class.qmd.jinja2 b/docs/templates/class.qmd.jinja2 index ba1111e1f..3d32dce57 100644 --- a/docs/templates/class.qmd.jinja2 +++ b/docs/templates/class.qmd.jinja2 @@ -1,22 +1,29 @@ -{% if member.kind == "class" %} +### [class]{.muted} {{ resolved.name }} -### Class: {{ member.name }} - -{% if member.docstring %} -{{ doc.format_docstring(member.docstring) }} +```python +class {{ resolved.name }}{% if resolved.bases %}({{ resolved.bases | join(', ') }}){% endif %}: +``` +{% if resolved.docstring %} +{{ doc.format_docstring(resolved.docstring) }} {% endif %} -{% if member.bases %} -**Bases:** {% for base in member.bases %}{{ types.format_type(base) }}{% if not loop.last %}, {% endif %}{% endfor %} -{% endif %} -{% if member.members %} -#### Methods +{% if resolved.bases %} +**Inherited members** -{% for method in member.members | sort_members %} -{% if is_public(method, member, full_data) %} -{% include "function.qmd.jinja2" %} +{% for base in resolved.bases %} +{% set base_members = get_inherited_members(base, full_data) %} +{% if base_members %} +- **From {{ base }}**: {% for member in base_members %}[{{ member.name }}](#{{ member.name }}){% if not loop.last %}, {% endif %}{% endfor %} {% endif %} {% endfor %} {% endif %} -{% endif %} \ No newline at end of file + +{% if resolved.members %} +**Methods** +{% for member in resolved.members | sort_members %} +{% if member.kind == 'method' and is_public(member, module, full_data) %} +- [{{ member.name }}](#{{ member.name }}){% if member.docstring %}: {{ member.docstring.value | trim }}{% endif %} +{% endif %} +{% endfor %} +{% endif %} \ No newline at end of file diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index c80c9977a..33c7a22e9 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -102,8 +102,8 @@ Split dataset into train, validation (optional), and test sets. - **df**: Input DataFrame - **validation_split**: If None, returns train/test split. If float, returns train/val/test split -- **test_size**: Proportion of data for test set (default: 0.2) -- **add_constant**: Whether to add constant column for statsmodels (default: False) +- **test_size**: Proportion of data for test set (default: ) 0.2) +- **add_constant**: Whether to add constant column for statsmodels (default: ) False) **Returns** diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index 2bceb790c..e34491e80 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -27,224 +27,368 @@ def should_raise_on_fail_fast( Determine whether an error should be raised when fail_fast is True. -### Class: APIRequestError +### [class]{.muted} APIRequestError + +```python +class APIRequestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` Generic error for API request errors that are not known. -**Bases:** BaseError +**Inherited members** + +### [class]{.muted} BaseError + +```python +class BaseError({'cls': 'ExprName', 'name': 'Exception'}): +``` -### Class: BaseError +**Inherited members** -**Bases:** Exception +**Methods** -#### Methods +### [class]{.muted} GetTestSuiteError -### Class: GetTestSuiteError +```python +class GetTestSuiteError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When the test suite could not be found. -**Bases:** BaseError +**Inherited members** -### Class: InitializeTestSuiteError +### [class]{.muted} InitializeTestSuiteError + +```python +class InitializeTestSuiteError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When the test suite was found but could not be initialized. -**Bases:** BaseError +**Inherited members** -### Class: InvalidAPICredentialsError +### [class]{.muted} InvalidAPICredentialsError -**Bases:** APIRequestError +```python +class InvalidAPICredentialsError({'cls': 'ExprName', 'name': 'APIRequestError'}): +``` -#### Methods +**Inherited members** -### Class: InvalidContentIdPrefixError +**Methods** + +### [class]{.muted} InvalidContentIdPrefixError + +```python +class InvalidContentIdPrefixError({'cls': 'ExprName', 'name': 'APIRequestError'}): +``` When an invalid text content_id is sent to the API. -**Bases:** APIRequestError +**Inherited members** -### Class: InvalidInputError +### [class]{.muted} InvalidInputError + +```python +class InvalidInputError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When an invalid input object. -**Bases:** BaseError +**Inherited members** -### Class: InvalidMetricResultsError +### [class]{.muted} InvalidMetricResultsError + +```python +class InvalidMetricResultsError({'cls': 'ExprName', 'name': 'APIRequestError'}): +``` When an invalid metric results object is sent to the API. -**Bases:** APIRequestError +**Inherited members** + +### [class]{.muted} InvalidProjectError + +```python +class InvalidProjectError({'cls': 'ExprName', 'name': 'APIRequestError'}): +``` -### Class: InvalidProjectError +**Inherited members** -**Bases:** APIRequestError +**Methods** -#### Methods +### [class]{.muted} InvalidRequestBodyError -### Class: InvalidRequestBodyError +```python +class InvalidRequestBodyError({'cls': 'ExprName', 'name': 'APIRequestError'}): +``` When a POST/PUT request is made with an invalid request body. -**Bases:** APIRequestError +**Inherited members** -### Class: InvalidTestParametersError +### [class]{.muted} InvalidTestParametersError + +```python +class InvalidTestParametersError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When an invalid parameters for the test. -**Bases:** BaseError +**Inherited members** + +### [class]{.muted} InvalidTestResultsError -### Class: InvalidTestResultsError +```python +class InvalidTestResultsError({'cls': 'ExprName', 'name': 'APIRequestError'}): +``` When an invalid test results object is sent to the API. -**Bases:** APIRequestError +**Inherited members** -### Class: InvalidTextObjectError +### [class]{.muted} InvalidTextObjectError + +```python +class InvalidTextObjectError({'cls': 'ExprName', 'name': 'APIRequestError'}): +``` When an invalid Metadat (Text) object is sent to the API. -**Bases:** APIRequestError +**Inherited members** -### Class: InvalidValueFormatterError +### [class]{.muted} InvalidValueFormatterError + +```python +class InvalidValueFormatterError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When an invalid value formatter is provided when serializing results. -**Bases:** BaseError +**Inherited members** + +### [class]{.muted} InvalidXGBoostTrainedModelError -### Class: InvalidXGBoostTrainedModelError +```python +class InvalidXGBoostTrainedModelError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When an invalid XGBoost trained model is used when calling init_r_model. -**Bases:** BaseError +**Inherited members** -### Class: LoadTestError +### [class]{.muted} LoadTestError + +```python +class LoadTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` Exception raised when an error occurs while loading a test -**Bases:** BaseError +**Inherited members** -#### Methods +**Methods** -### Class: MismatchingClassLabelsError +### [class]{.muted} MismatchingClassLabelsError + +```python +class MismatchingClassLabelsError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When the class labels found in the dataset don't match the provided target labels. -**Bases:** BaseError +**Inherited members** + +### [class]{.muted} MissingAPICredentialsError + +```python +class MissingAPICredentialsError({'cls': 'ExprName', 'name': 'BaseError'}): +``` -### Class: MissingAPICredentialsError +**Inherited members** -**Bases:** BaseError +**Methods** -#### Methods +### [class]{.muted} MissingCacheResultsArgumentsError -### Class: MissingCacheResultsArgumentsError +```python +class MissingCacheResultsArgumentsError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When the cache_results function is missing arguments. -**Bases:** BaseError +**Inherited members** -### Class: MissingClassLabelError +### [class]{.muted} MissingClassLabelError + +```python +class MissingClassLabelError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When the one or more class labels are missing from provided dataset targets. -**Bases:** BaseError +**Inherited members** + +### [class]{.muted} MissingDependencyError -### Class: MissingDependencyError +```python +class MissingDependencyError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When a required dependency is missing. -**Bases:** BaseError +**Inherited members** -#### Methods +**Methods** -### Class: MissingDocumentationTemplate +### [class]{.muted} MissingDocumentationTemplate + +```python +class MissingDocumentationTemplate({'cls': 'ExprName', 'name': 'BaseError'}): +``` When the client config is missing the documentation template. -**Bases:** BaseError +**Inherited members** -### Class: MissingModelIdError +### [class]{.muted} MissingModelIdError -**Bases:** BaseError +```python +class MissingModelIdError({'cls': 'ExprName', 'name': 'BaseError'}): +``` -#### Methods +**Inherited members** -### Class: MissingOrInvalidModelPredictFnError +**Methods** + +### [class]{.muted} MissingOrInvalidModelPredictFnError + +```python +class MissingOrInvalidModelPredictFnError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When the pytorch model is missing a predict function or its predict method does not have the expected arguments. -**Bases:** BaseError +**Inherited members** -### Class: MissingRequiredTestInputError +### [class]{.muted} MissingRequiredTestInputError + +```python +class MissingRequiredTestInputError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When a required test context variable is missing. -**Bases:** BaseError +**Inherited members** -### Class: MissingRExtrasError +### [class]{.muted} MissingRExtrasError + +```python +class MissingRExtrasError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When the R extras have not been installed. -**Bases:** BaseError +**Inherited members** -#### Methods +**Methods** -### Class: MissingTextContentIdError +### [class]{.muted} MissingTextContentIdError + +```python +class MissingTextContentIdError({'cls': 'ExprName', 'name': 'APIRequestError'}): +``` When a Text object is sent to the API without a content_id. -**Bases:** APIRequestError +**Inherited members** -### Class: MissingTextContentsError +### [class]{.muted} MissingTextContentsError + +```python +class MissingTextContentsError({'cls': 'ExprName', 'name': 'APIRequestError'}): +``` When a Text object is sent to the API without a "text" attribute. -**Bases:** APIRequestError +**Inherited members** -### Class: SkipTestError +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` Useful error to throw when a test cannot be executed. -**Bases:** BaseError +**Inherited members** + +### [class]{.muted} TestInputInvalidDatasetError -### Class: TestInputInvalidDatasetError +```python +class TestInputInvalidDatasetError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When an invalid dataset is used in a test context. -**Bases:** BaseError +**Inherited members** -### Class: UnsupportedColumnTypeError +### [class]{.muted} UnsupportedColumnTypeError + +```python +class UnsupportedColumnTypeError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When an unsupported column type is found on a dataset. -**Bases:** BaseError +**Inherited members** -### Class: UnsupportedDatasetError +### [class]{.muted} UnsupportedDatasetError + +```python +class UnsupportedDatasetError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When an unsupported dataset is used. -**Bases:** BaseError +**Inherited members** + +### [class]{.muted} UnsupportedFigureError -### Class: UnsupportedFigureError +```python +class UnsupportedFigureError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When an unsupported figure object is constructed. -**Bases:** BaseError +**Inherited members** -### Class: UnsupportedModelError +### [class]{.muted} UnsupportedModelError + +```python +class UnsupportedModelError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When an unsupported model is used. -**Bases:** BaseError +**Inherited members** -### Class: UnsupportedModelForSHAPError +### [class]{.muted} UnsupportedModelForSHAPError + +```python +class UnsupportedModelForSHAPError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When an unsupported model is used for SHAP importance. -**Bases:** BaseError +**Inherited members** -### Class: UnsupportedRModelError +### [class]{.muted} UnsupportedRModelError + +```python +class UnsupportedRModelError({'cls': 'ExprName', 'name': 'BaseError'}): +``` When an unsupported R model is used. -**Bases:** BaseError +**Inherited members** diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index d68e373ef..5ba7dcf9d 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -19,6 +19,368 @@ Entrypoint for test suites. - [text_data](test_suites/text_data.qmd) - [time_series](test_suites/time_series.qmd) +### [class]{.muted} ClassifierDiagnosis + +```python +class ClassifierDiagnosis({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for sklearn classifier model diagnosis tests + +**Inherited members** + +**Methods** + +### [class]{.muted} ClassifierFullSuite + +```python +class ClassifierFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Full test suite for binary classification models. + +**Inherited members** + +**Methods** + +### [class]{.muted} ClassifierMetrics + +```python +class ClassifierMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for sklearn classifier metrics + +**Inherited members** + +**Methods** + +### [class]{.muted} ClassifierModelValidation + +```python +class ClassifierModelValidation({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for binary classification models. + +**Inherited members** + +**Methods** + +### [class]{.muted} ClassifierPerformance + +```python +class ClassifierPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for sklearn classifier models + +**Inherited members** + +**Methods** + +### [class]{.muted} ClusterFullSuite + +```python +class ClusterFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Full test suite for clustering models. + +**Inherited members** + +**Methods** + +### [class]{.muted} ClusterMetrics + +```python +class ClusterMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for sklearn clustering metrics + +**Inherited members** + +**Methods** + +### [class]{.muted} ClusterPerformance + +```python +class ClusterPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for sklearn cluster performance + +**Inherited members** + +**Methods** + +### [class]{.muted} EmbeddingsFullSuite + +```python +class EmbeddingsFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Full test suite for embeddings models. + +**Inherited members** + +**Methods** + +### [class]{.muted} EmbeddingsMetrics + +```python +class EmbeddingsMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for embeddings metrics + +**Inherited members** + +**Methods** + +### [class]{.muted} EmbeddingsPerformance + +```python +class EmbeddingsPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for embeddings model performance + +**Inherited members** + +**Methods** + +### [class]{.muted} KmeansParametersOptimization + +```python +class KmeansParametersOptimization({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for sklearn hyperparameters optimization + +**Inherited members** + +**Methods** + +### [class]{.muted} LLMClassifierFullSuite + +```python +class LLMClassifierFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Full test suite for LLM classification models. + +**Inherited members** + +**Methods** + +### [class]{.muted} NLPClassifierFullSuite + +```python +class NLPClassifierFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Full test suite for NLP classification models. + +**Inherited members** + +**Methods** + +### [class]{.muted} PromptValidation + +```python +class PromptValidation({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for prompt validation + +**Inherited members** + +**Methods** + +### [class]{.muted} RegressionFullSuite + +```python +class RegressionFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Full test suite for regression models. + +**Inherited members** + +**Methods** + +### [class]{.muted} RegressionMetrics + +```python +class RegressionMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for performance metrics of regression metrics + +**Inherited members** + +**Methods** + +### [class]{.muted} RegressionModelDescription + +```python +class RegressionModelDescription({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for performance metric of regression model of statsmodels library + +**Inherited members** + +**Methods** + +### [class]{.muted} RegressionModelsEvaluation + +```python +class RegressionModelsEvaluation({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for metrics comparison of regression model of statsmodels library + +**Inherited members** + +**Methods** + +### [class]{.muted} RegressionPerformance + +```python +class RegressionPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for regression model performance + +**Inherited members** + +**Methods** + +### [class]{.muted} SummarizationMetrics + +```python +class SummarizationMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for Summarization metrics + +**Inherited members** + +**Methods** + +### [class]{.muted} TabularDataQuality + +```python +class TabularDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for data quality on tabular datasets + +**Inherited members** + +**Methods** + +### [class]{.muted} TabularDataset + +```python +class TabularDataset({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for tabular datasets. + +**Inherited members** + +**Methods** + +### [class]{.muted} TabularDatasetDescription + +```python +class TabularDatasetDescription({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite to extract metadata and descriptive statistics from a tabular dataset + +**Inherited members** + +**Methods** + +### [class]{.muted} TextDataQuality + +```python +class TextDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for data quality on text data + +**Inherited members** + +**Methods** + +### [class]{.muted} TimeSeriesDataQuality + +```python +class TimeSeriesDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for data quality on time series datasets + +**Inherited members** + +**Methods** + +### [class]{.muted} TimeSeriesDataset + +```python +class TimeSeriesDataset({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for time series datasets. + +**Inherited members** + +**Methods** + +### [class]{.muted} TimeSeriesModelValidation + +```python +class TimeSeriesModelValidation({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for time series model validation. + +**Inherited members** + +**Methods** + +### [class]{.muted} TimeSeriesMultivariate + +```python +class TimeSeriesMultivariate({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +This test suite provides a preliminary understanding of the features and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. + +**Inherited members** + +**Methods** + +### [class]{.muted} TimeSeriesUnivariate + +```python +class TimeSeriesUnivariate({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +This test suite provides a preliminary understanding of the target variable(s) used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). + +The raw time series data provides a visual inspection of the target variable's behavior over time. This helps to identify any patterns or trends in the data, as well as any potential outliers or anomalies. The histogram of the target variable displays the distribution of values, providing insight into the range and frequency of values observed in the data. + +**Inherited members** + +**Methods** + ## describe_suite[()]{.muted} ```python diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index 8ab749fe3..f242a1cf1 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -6,42 +6,86 @@ toc-expand: 3 Test suites for sklearn-compatible classifier models Ideal setup is to have the API client to read a custom test suite from the project's configuration -### Class: ClassifierDiagnosis +### [class]{.muted} TabularDataQuality + +```python +class TabularDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for data quality on tabular datasets + +**Inherited members** + +**Methods** + +### [class]{.muted} TabularDatasetDescription + +```python +class TabularDatasetDescription({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite to extract metadata and descriptive statistics from a tabular dataset + +**Inherited members** + +**Methods** + +### [class]{.muted} ClassifierDiagnosis + +```python +class ClassifierDiagnosis({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for sklearn classifier model diagnosis tests -**Bases:** TestSuite +**Inherited members** + +**Methods** -#### Methods +### [class]{.muted} ClassifierFullSuite -### Class: ClassifierFullSuite +```python +class ClassifierFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Full test suite for binary classification models. -**Bases:** TestSuite +**Inherited members** -#### Methods +**Methods** -### Class: ClassifierMetrics +### [class]{.muted} ClassifierMetrics + +```python +class ClassifierMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for sklearn classifier metrics -**Bases:** TestSuite +**Inherited members** + +**Methods** -#### Methods +### [class]{.muted} ClassifierModelValidation -### Class: ClassifierModelValidation +```python +class ClassifierModelValidation({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for binary classification models. -**Bases:** TestSuite +**Inherited members** + +**Methods** -#### Methods +### [class]{.muted} ClassifierPerformance -### Class: ClassifierPerformance +```python +class ClassifierPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for sklearn classifier models -**Bases:** TestSuite +**Inherited members** -#### Methods +**Methods** diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index 5a81d2ca9..d5d8dd2f4 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -6,26 +6,50 @@ toc-expand: 3 Test suites for sklearn-compatible clustering models Ideal setup is to have the API client to read a custom test suite from the project's configuration -### Class: ClusterFullSuite +### [class]{.muted} KmeansParametersOptimization + +```python +class KmeansParametersOptimization({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for sklearn hyperparameters optimization + +**Inherited members** + +**Methods** + +### [class]{.muted} ClusterFullSuite + +```python +class ClusterFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Full test suite for clustering models. -**Bases:** TestSuite +**Inherited members** -#### Methods +**Methods** -### Class: ClusterMetrics +### [class]{.muted} ClusterMetrics + +```python +class ClusterMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for sklearn clustering metrics -**Bases:** TestSuite +**Inherited members** + +**Methods** -#### Methods +### [class]{.muted} ClusterPerformance -### Class: ClusterPerformance +```python +class ClusterPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for sklearn cluster performance -**Bases:** TestSuite +**Inherited members** -#### Methods +**Methods** diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index bba414121..cf038b078 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -6,26 +6,38 @@ toc-expand: 3 Test suites for embeddings models Ideal setup is to have the API client to read a custom test suite from the project's configuration -### Class: EmbeddingsFullSuite +### [class]{.muted} EmbeddingsFullSuite + +```python +class EmbeddingsFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Full test suite for embeddings models. -**Bases:** TestSuite +**Inherited members** + +**Methods** -#### Methods +### [class]{.muted} EmbeddingsMetrics -### Class: EmbeddingsMetrics +```python +class EmbeddingsMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for embeddings metrics -**Bases:** TestSuite +**Inherited members** + +**Methods** -#### Methods +### [class]{.muted} EmbeddingsPerformance -### Class: EmbeddingsPerformance +```python +class EmbeddingsPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for embeddings model performance -**Bases:** TestSuite +**Inherited members** -#### Methods +**Methods** diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index ef5306a2d..ca7b416dc 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -6,18 +6,74 @@ toc-expand: 3 Test suites for LLMs -### Class: LLMClassifierFullSuite +### [class]{.muted} ClassifierDiagnosis + +```python +class ClassifierDiagnosis({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for sklearn classifier model diagnosis tests + +**Inherited members** + +**Methods** + +### [class]{.muted} ClassifierMetrics + +```python +class ClassifierMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for sklearn classifier metrics + +**Inherited members** + +**Methods** + +### [class]{.muted} ClassifierPerformance + +```python +class ClassifierPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for sklearn classifier models + +**Inherited members** + +**Methods** + +### [class]{.muted} TextDataQuality + +```python +class TextDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for data quality on text data + +**Inherited members** + +**Methods** + +### [class]{.muted} LLMClassifierFullSuite + +```python +class LLMClassifierFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Full test suite for LLM classification models. -**Bases:** TestSuite +**Inherited members** + +**Methods** -#### Methods +### [class]{.muted} PromptValidation -### Class: PromptValidation +```python +class PromptValidation({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for prompt validation -**Bases:** TestSuite +**Inherited members** -#### Methods +**Methods** diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index ac6887a24..65647ae5f 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -6,10 +6,62 @@ toc-expand: 3 Test suites for NLP models -### Class: NLPClassifierFullSuite +### [class]{.muted} ClassifierDiagnosis + +```python +class ClassifierDiagnosis({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for sklearn classifier model diagnosis tests + +**Inherited members** + +**Methods** + +### [class]{.muted} ClassifierMetrics + +```python +class ClassifierMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for sklearn classifier metrics + +**Inherited members** + +**Methods** + +### [class]{.muted} ClassifierPerformance + +```python +class ClassifierPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for sklearn classifier models + +**Inherited members** + +**Methods** + +### [class]{.muted} TextDataQuality + +```python +class TextDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for data quality on text data + +**Inherited members** + +**Methods** + +### [class]{.muted} NLPClassifierFullSuite + +```python +class NLPClassifierFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Full test suite for NLP classification models. -**Bases:** TestSuite +**Inherited members** -#### Methods +**Methods** diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index 05d248997..30684da40 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -6,10 +6,14 @@ toc-expand: 3 Test suites for sklearn-compatible hyper parameters tunning Ideal setup is to have the API client to read a custom test suite from the project's configuration -### Class: KmeansParametersOptimization +### [class]{.muted} KmeansParametersOptimization + +```python +class KmeansParametersOptimization({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for sklearn hyperparameters optimization -**Bases:** TestSuite +**Inherited members** -#### Methods +**Methods** diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index 24cb6b992..b364eead2 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -4,26 +4,62 @@ toc-depth: 3 toc-expand: 3 --- -### Class: RegressionFullSuite +### [class]{.muted} TabularDataQuality + +```python +class TabularDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for data quality on tabular datasets + +**Inherited members** + +**Methods** + +### [class]{.muted} TabularDatasetDescription + +```python +class TabularDatasetDescription({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite to extract metadata and descriptive statistics from a tabular dataset + +**Inherited members** + +**Methods** + +### [class]{.muted} RegressionFullSuite + +```python +class RegressionFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Full test suite for regression models. -**Bases:** TestSuite +**Inherited members** + +**Methods** -#### Methods +### [class]{.muted} RegressionMetrics -### Class: RegressionMetrics +```python +class RegressionMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for performance metrics of regression metrics -**Bases:** TestSuite +**Inherited members** + +**Methods** -#### Methods +### [class]{.muted} RegressionPerformance -### Class: RegressionPerformance +```python +class RegressionPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for regression model performance -**Bases:** TestSuite +**Inherited members** -#### Methods +**Methods** diff --git a/docs/validmind/test_suites/statsmodels_timeseries.qmd b/docs/validmind/test_suites/statsmodels_timeseries.qmd index 04a6e6d82..9eeabc973 100644 --- a/docs/validmind/test_suites/statsmodels_timeseries.qmd +++ b/docs/validmind/test_suites/statsmodels_timeseries.qmd @@ -6,18 +6,26 @@ toc-expand: 3 Time Series Test Suites from statsmodels -### Class: RegressionModelDescription +### [class]{.muted} RegressionModelDescription + +```python +class RegressionModelDescription({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for performance metric of regression model of statsmodels library -**Bases:** TestSuite +**Inherited members** + +**Methods** -#### Methods +### [class]{.muted} RegressionModelsEvaluation -### Class: RegressionModelsEvaluation +```python +class RegressionModelsEvaluation({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for metrics comparison of regression model of statsmodels library -**Bases:** TestSuite +**Inherited members** -#### Methods +**Methods** diff --git a/docs/validmind/test_suites/summarization.qmd b/docs/validmind/test_suites/summarization.qmd index 4e6e1f1f9..74e828d27 100644 --- a/docs/validmind/test_suites/summarization.qmd +++ b/docs/validmind/test_suites/summarization.qmd @@ -6,10 +6,14 @@ toc-expand: 3 Test suites for llm summarization models -### Class: SummarizationMetrics +### [class]{.muted} SummarizationMetrics + +```python +class SummarizationMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for Summarization metrics -**Bases:** TestSuite +**Inherited members** -#### Methods +**Methods** diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd index dd318b945..af3531b48 100644 --- a/docs/validmind/test_suites/tabular_datasets.qmd +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -6,26 +6,38 @@ toc-expand: 3 Test suites for tabular datasets -### Class: TabularDataQuality +### [class]{.muted} TabularDataQuality + +```python +class TabularDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for data quality on tabular datasets -**Bases:** TestSuite +**Inherited members** + +**Methods** -#### Methods +### [class]{.muted} TabularDataset -### Class: TabularDataset +```python +class TabularDataset({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for tabular datasets. -**Bases:** TestSuite +**Inherited members** + +**Methods** -#### Methods +### [class]{.muted} TabularDatasetDescription -### Class: TabularDatasetDescription +```python +class TabularDatasetDescription({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite to extract metadata and descriptive statistics from a tabular dataset -**Bases:** TestSuite +**Inherited members** -#### Methods +**Methods** diff --git a/docs/validmind/test_suites/text_data.qmd b/docs/validmind/test_suites/text_data.qmd index ac2d44314..1924a0403 100644 --- a/docs/validmind/test_suites/text_data.qmd +++ b/docs/validmind/test_suites/text_data.qmd @@ -6,10 +6,14 @@ toc-expand: 3 Test suites for text datasets -### Class: TextDataQuality +### [class]{.muted} TextDataQuality + +```python +class TextDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for data quality on text data -**Bases:** TestSuite +**Inherited members** -#### Methods +**Methods** diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index ce76d4a68..6edee287c 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -6,44 +6,88 @@ toc-expand: 3 Time Series Test Suites -### Class: TimeSeriesDataQuality +### [class]{.muted} RegressionModelDescription + +```python +class RegressionModelDescription({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for performance metric of regression model of statsmodels library + +**Inherited members** + +**Methods** + +### [class]{.muted} RegressionModelsEvaluation + +```python +class RegressionModelsEvaluation({'cls': 'ExprName', 'name': 'TestSuite'}): +``` + +Test suite for metrics comparison of regression model of statsmodels library + +**Inherited members** + +**Methods** + +### [class]{.muted} TimeSeriesDataQuality + +```python +class TimeSeriesDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for data quality on time series datasets -**Bases:** TestSuite +**Inherited members** + +**Methods** -#### Methods +### [class]{.muted} TimeSeriesDataset -### Class: TimeSeriesDataset +```python +class TimeSeriesDataset({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for time series datasets. -**Bases:** TestSuite +**Inherited members** -#### Methods +**Methods** -### Class: TimeSeriesModelValidation +### [class]{.muted} TimeSeriesModelValidation + +```python +class TimeSeriesModelValidation({'cls': 'ExprName', 'name': 'TestSuite'}): +``` Test suite for time series model validation. -**Bases:** TestSuite +**Inherited members** + +**Methods** -#### Methods +### [class]{.muted} TimeSeriesMultivariate -### Class: TimeSeriesMultivariate +```python +class TimeSeriesMultivariate({'cls': 'ExprName', 'name': 'TestSuite'}): +``` This test suite provides a preliminary understanding of the features and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. -**Bases:** TestSuite +**Inherited members** + +**Methods** -#### Methods +### [class]{.muted} TimeSeriesUnivariate -### Class: TimeSeriesUnivariate +```python +class TimeSeriesUnivariate({'cls': 'ExprName', 'name': 'TestSuite'}): +``` This test suite provides a preliminary understanding of the target variable(s) used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). The raw time series data provides a visual inspection of the target variable's behavior over time. This helps to identify any patterns or trends in the data, as well as any potential outliers or anomalies. The histogram of the target variable displays the distribution of values, providing insight into the range and frequency of values observed in the data. -**Bases:** TestSuite +**Inherited members** -#### Methods +**Methods** diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 66ea14ac3..b235ca220 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -7,9 +7,70 @@ toc-expand: 3 ValidMind Tests Module - [data_validation](tests/data_validation.qmd) + - [model_validation](tests/model_validation.qmd) + - [prompt_validation](tests/prompt_validation.qmd) + ``` + ### [class]{.muted} LoadTestError + ``` + +```python +class LoadTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Exception raised when an error occurs while loading a test + +**Inherited members** + +**Methods** + +### [class]{.muted} LocalTestProvider + +```python +class LocalTestProvider: +``` + +Test providers in ValidMind are responsible for loading tests from different sources, such as local files, databases, or remote services. The LocalTestProvider specifically loads tests from the local file system. + +To use the LocalTestProvider, you need to provide the root_folder, which is the root directory for local tests. The test_id is a combination of the namespace (set when registering the test provider) and the path to the test class module, where slashes are replaced by dots and the .py extension is left out. + +Example usage: + +``` +# Create an instance of LocalTestProvider with the root folder +test_provider = LocalTestProvider("/path/to/tests/folder") + +# Register the test provider with a namespace +register_test_provider("my_namespace", test_provider) + +# List all tests in the namespace (returns a list of test IDs) +test_provider.list_tests() +# this is used by the validmind.tests.list_tests() function to aggregate all tests +# from all test providers + +# Load a test using the test_id (namespace + path to test class module) +test = test_provider.load_test("my_namespace.my_test_class") +# full path to the test class module is /path/to/tests/folder/my_test_class.py +``` + +**Parameters** + +- **root_folder**: The root directory for local tests. + +**Methods** ### [class]{.muted} TestProvider + +```python +class TestProvider({'cls': 'ExprName', 'name': 'Protocol'}): +``` + +Protocol for user-defined test providers + +**Inherited members** + +**Methods** + ## register_test_provider[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 624d8db2f..8ecd2ab7e 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## ChiSquaredFeaturesTable[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 29a1eccda..901e620f7 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -6,6 +6,16 @@ toc-expand: 3 Threshold based tests +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## ClassImbalance[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index d25eb868a..a90508dd6 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} UnsupportedColumnTypeError + +```python +class UnsupportedColumnTypeError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +When an unsupported column type is found on a dataset. + +**Inherited members** + ## DatasetDescription[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 09ceec015..d42ab1167 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## DescriptiveStatistics[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 6e5ed37bc..5aaff665b 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## DickeyFullerGLS[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index ebde93a3a..a7dc32789 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## EngleGrangerCoint[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 613d7d7e2..99006018b 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## KPSS[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index d8eb6ad2e..8e4d58e57 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## PhillipsPerronArch[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 6e7fea125..aa6517e7e 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -4,6 +4,18 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} MissingDependencyError + +```python +class MissingDependencyError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +When a required dependency is missing. + +**Inherited members** + +**Methods** + ## ProtectedClassesCombination[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 7373a4733..5672b879f 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -4,6 +4,18 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} MissingDependencyError + +```python +class MissingDependencyError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +When a required dependency is missing. + +**Inherited members** + +**Methods** + ## ProtectedClassesDisparity[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index b68f094b1..1f54fd614 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -4,6 +4,18 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} MissingDependencyError + +```python +class MissingDependencyError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +When a required dependency is missing. + +**Inherited members** + +**Methods** + ## calculate_fairness_metrics[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 19c4e12a9..ea6599605 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## plot_rolling_statistics[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 975511f82..e167f5e8b 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## SeasonalDecompose[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 80b319353..f04e4ee33 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## SpreadPlot[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 761ecca10..d4e7d5e14 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## TabularCategoricalBarPlots[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index e249790e5..a79e80f8d 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## TabularDateTimeHistograms[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 0cb4734be..9f4a1ac3b 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## TargetRateBarPlots[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 5962a6491..dcd09b777 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## TimeSeriesFrequency[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index c35382fe7..a0fb37ad0 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## TimeSeriesLinePlot[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index dbe5a701a..beffa7953 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## TimeSeriesMissingValues[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index f768f3e0f..f5411a0ac 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## TimeSeriesOutliers[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 35f0b4a1e..30eced2b3 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## WOEBinPlots[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 9c29ebdfc..6086c90b2 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## WOEBinTable[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 085a90b81..a8ebfc4e2 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## ZivotAndrewsArch[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 472625743..76c3fd60e 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## Hashtags[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index d62e93b1a..874f5389c 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## Mentions[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 6792be159..9adccc24a 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## FeaturesAUC[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index f3ef5f60c..595184c60 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -67,7 +67,7 @@ The test implements multiple threshold optimization methods: - **dataset**: VMDataset containing features and target - **model**: VMModel containing predictions -- **methods**: List of methods to compare (default: ['youden', 'f1', 'precision_recall']) +- **methods**: List of methods to compare (default: ) ['youden', 'f1', 'precision_recall']) - **target_recall**: Target recall value if using 'target_recall' method **Returns** diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index a900ac55d..1ff5fc3a2 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## ClusterCosineSimilarity[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index ea9cc07e5..679cc2bac 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## KMeansClustersOptimization[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 3cef2480e..7720278e5 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## PermutationFeatureImportance[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 5c595e090..34878dc97 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## calculate_psi[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index dc1941c66..6a1b052f7 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## PrecisionRecallCurve[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 0634af8ad..321106fed 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## ROCCurve[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 0738ff161..8c5e20388 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} MissingOrInvalidModelPredictFnError + +```python +class MissingOrInvalidModelPredictFnError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +When the pytorch model is missing a predict function or its predict method does not have the expected arguments. + +**Inherited members** + ## RobustnessDiagnosis[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index c0fff77e2..bcfd6868b 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} UnsupportedModelForSHAPError + +```python +class UnsupportedModelForSHAPError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +When an unsupported model is used for SHAP importance. + +**Inherited members** + ## generate_shap_plot[()]{.muted} ```python @@ -38,7 +48,7 @@ Selects SHAP values for binary or multiclass classification. For regression mode **Parameters** - **shap_values**: The SHAP values returned by the SHAP explainer. For multiclass classification, this will be a list where each element corresponds to a class. For regression, this will be a single array of SHAP values. -- **class_of_interest**: The class index for which to retrieve SHAP values. If None (default: (default, the function will assume binary classification and use class 1 by default.) +- **class_of_interest**: The class index for which to retrieve SHAP values. If None (default), the function will assume binary classification and use class 1 by default. **Returns** diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index f3fd63118..974c88168 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} InvalidTestParametersError + +```python +class InvalidTestParametersError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +When an invalid parameters for the test. + +**Inherited members** + ## KolmogorovSmirnov[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 6f0e1b6e9..3acd8260f 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## RegressionCoeffs[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 70869aece..794b8e0a4 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## RegressionFeatureSignificance[()]{.muted} ```python diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 3012ea61f..743241525 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} MissingRequiredTestInputError + +```python +class MissingRequiredTestInputError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +When a required test context variable is missing. + +**Inherited members** + ## Bias[()]{.muted} ```python diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 71c2f8acd..6cfb93bab 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} MissingRequiredTestInputError + +```python +class MissingRequiredTestInputError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +When a required test context variable is missing. + +**Inherited members** + ## Clarity[()]{.muted} ```python diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index f652f6e4b..1ff21f09a 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} MissingRequiredTestInputError + +```python +class MissingRequiredTestInputError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +When a required test context variable is missing. + +**Inherited members** + ## Conciseness[()]{.muted} ```python diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 88172fde2..bca7be73b 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} MissingRequiredTestInputError + +```python +class MissingRequiredTestInputError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +When a required test context variable is missing. + +**Inherited members** + ## Delimitation[()]{.muted} ```python diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 3ac63434a..ecc7d3397 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} MissingRequiredTestInputError + +```python +class MissingRequiredTestInputError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +When a required test context variable is missing. + +**Inherited members** + ## NegativeInstruction[()]{.muted} ```python diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 24f27613b..941599bb6 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -4,6 +4,26 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} MissingRequiredTestInputError + +```python +class MissingRequiredTestInputError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +When a required test context variable is missing. + +**Inherited members** + +### [class]{.muted} SkipTestError + +```python +class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + ## Robustness[()]{.muted} ```python diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 56cbff1d4..0f2d05bea 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -4,6 +4,16 @@ toc-depth: 3 toc-expand: 3 --- +### [class]{.muted} MissingRequiredTestInputError + +```python +class MissingRequiredTestInputError({'cls': 'ExprName', 'name': 'BaseError'}): +``` + +When a required test context variable is missing. + +**Inherited members** + ## Specificity[()]{.muted} ```python diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index b3cbf14ca..96a10cc9d 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -5,3 +5,105 @@ toc-expand: 3 --- Models entrypoint + +### [class]{.muted} Figure + +```python +class Figure: +``` + +Figure objects track the schema supported by the ValidMind API + +**Methods** + +### [class]{.muted} ModelAttributes + +```python +class ModelAttributes: +``` + +Model attributes definition + +**Methods** + +### [class]{.muted} TestSuite + +```python +class TestSuite: +``` + +Base class for test suites. Test suites are used to define a grouping of tests that can be run as a suite against datasets and models. Test Suites can be defined by inheriting from this base class and defining the list of tests as a class variable. + +Tests can be a flat list of strings or may be nested into sections by using a dict + +**Methods** + +### [class]{.muted} TestSuiteRunner + +```python +class TestSuiteRunner: +``` + +Runs a test suite + +**Methods** + +### [class]{.muted} VMDataset + +```python +class VMDataset({'cls': 'ExprName', 'name': 'VMInput'}): +``` + +Base class for VM datasets Child classes should be used to support new dataset types (tensor, polars etc) by converting the user's dataset into a numpy array collecting metadata like column names and then call this (parent) class `__init__` method. + +This way we can support multiple dataset types but under the hood we only need to work with numpy arrays and pandas dataframes in this class. + +**Parameters** + +- **raw_dataset**: The raw dataset as a NumPy array. +- **input_id**: Identifier for the dataset. +- **index**: The raw dataset index as a NumPy array. +- **columns**: The column names of the dataset. +- **target_column**: The target column name of the dataset. +- **feature_columns**: The feature column names of the dataset. +- **feature_columns_numeric**: The numeric feature column names of the dataset. +- **feature_columns_categorical**: The categorical feature column names of the dataset. +- **text_column**: The text column name of the dataset for NLP tasks. +- **target_class_labels**: The class labels for the target columns. +- **df**: The dataset as a pandas DataFrame. +- **extra_columns**: Extra columns to include in the dataset. + +**Inherited members** + +**Methods** + +### [class]{.muted} VMInput + +```python +class VMInput({'cls': 'ExprName', 'name': 'ABC'}): +``` + +Base class for ValidMind Input types + +**Inherited members** + +**Methods** + +### [class]{.muted} VMModel + +```python +class VMModel({'cls': 'ExprName', 'name': 'VMInput'}): +``` + +An base class that wraps a trained model instance and its associated data. + +**Parameters** + +- **model**: The trained model instance. Defaults to None. +- **input_id**: The input ID for the model. Defaults to None. +- **attributes**: The attributes of the model. Defaults to None. +- **name**: The name of the model. Defaults to the class name. + +**Inherited members** + +**Methods** diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 475f72bd0..8c4c7535c 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -189,7 +189,6 @@ def lint_markdown_files(output_dir: str): def format_google_docstring(docstring: str) -> str: """Format a Google-style docstring from JSON format back to proper structure.""" - lines = [] sections = docstring.split('\n\n') @@ -215,17 +214,14 @@ def format_google_docstring(docstring: str) -> str: elif part.startswith('(default'): # Look ahead for the default value - default_value = [] - while i < len(parts) and not parts[i].endswith(')'): - default_value.append(parts[i]) - i += 1 - if i < len(parts): # Add the last part with ) - default_value.append(parts[i]) - - # Clean up the default value - default_str = ' '.join(default_value) - default_str = default_str.replace('(default:', '').replace(')', '') - param_desc.append(f"(default: {default_str.strip()})") + try: + if ':' in part: + default_value = part.split(':', 1)[1].rstrip(')') + param_desc.append(f"(default: {default_value})") + else: + param_desc.append(part) + except IndexError: + param_desc.append(part) else: param_desc.append(part) @@ -244,8 +240,7 @@ def format_google_docstring(docstring: str) -> str: else: lines.append(section.strip()) - result = '\n'.join(lines) - return result + return '\n'.join(lines) def format_rst_docstring(docstring: str) -> str: """Format an RST-style docstring from JSON format back to proper structure.""" @@ -327,6 +322,43 @@ def parse_docstrings_recursively(data: Dict[str, Any]): for member in data['members'].values(): parse_docstrings_recursively(member) +def get_inherited_members(base: Dict[str, Any], full_data: Dict[str, Any]) -> List[Dict[str, Any]]: + """Get all inherited members from a base class.""" + # Get the base class name + base_name = base.get('name', '') + if not base_name: + return [] + + # Handle built-in exceptions + if base_name.startswith('builtins.'): + if base_name == 'builtins.BaseException': + return [ + {'name': 'with_traceback', 'kind': 'method'}, + {'name': 'add_note', 'kind': 'method'} + ] + return [] + + # Look up base class in our codebase + path_parts = base_name.split('.') + current = full_data.get(path_parts[0]) + if not current: + return [] + + # Navigate to base class + for part in path_parts[1:]: + if part in current.get('members', {}): + current = current['members'][part] + else: + return [] + + # Collect public methods and properties + members = [] + for member in current.get('members', {}).values(): + if member['kind'] in ('method', 'property') and not member.get('name', '').startswith('_'): + members.append(member) + + return members + def generate_docs(json_path: str, template_dir: str, output_dir: str): """Generate documentation from JSON data using templates.""" # Load JSON data @@ -345,6 +377,7 @@ def generate_docs(json_path: str, template_dir: str, output_dir: str): env.globals['is_public'] = is_public env.globals['resolve_alias'] = resolve_alias env.globals['get_all_members'] = get_all_members + env.globals['get_inherited_members'] = get_inherited_members # Start processing from root module if 'validmind' in data: From 83931b96fcc5625fcb3c1b654bf8f3286ffd1769 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Mon, 27 Jan 2025 11:28:54 -0800 Subject: [PATCH 017/207] Save point --- docs/templates/class.qmd.jinja2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/templates/class.qmd.jinja2 b/docs/templates/class.qmd.jinja2 index 3d32dce57..88a36060d 100644 --- a/docs/templates/class.qmd.jinja2 +++ b/docs/templates/class.qmd.jinja2 @@ -1,7 +1,7 @@ ### [class]{.muted} {{ resolved.name }} ```python -class {{ resolved.name }}{% if resolved.bases %}({{ resolved.bases | join(', ') }}){% endif %}: +class {{ resolved.name }}{% if resolved.bases %}({{ resolved.bases | map(attribute='name') | join(', ') }}){% endif %}: ``` {% if resolved.docstring %} @@ -14,7 +14,7 @@ class {{ resolved.name }}{% if resolved.bases %}({{ resolved.bases | join(', ') {% for base in resolved.bases %} {% set base_members = get_inherited_members(base, full_data) %} {% if base_members %} -- **From {{ base }}**: {% for member in base_members %}[{{ member.name }}](#{{ member.name }}){% if not loop.last %}, {% endif %}{% endfor %} +- **From {{ base.name }}**: {% for member in base_members %}[{{ member.name }}](#{{ member.name }}){% if not loop.last %}, {% endif %}{% endfor %} {% endif %} {% endfor %} {% endif %} From d2afcf7639b45224eb322918b5d754accc4f9b06 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Mon, 27 Jan 2025 11:32:19 -0800 Subject: [PATCH 018/207] Save point --- scripts/generate_quarto_docs.py | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 8c4c7535c..1967dcdb5 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -324,8 +324,15 @@ def parse_docstrings_recursively(data: Dict[str, Any]): def get_inherited_members(base: Dict[str, Any], full_data: Dict[str, Any]) -> List[Dict[str, Any]]: """Get all inherited members from a base class.""" - # Get the base class name - base_name = base.get('name', '') + # Get the base class name and handle the dictionary structure + if isinstance(base, dict): + if 'cls' in base and base['cls'] == 'ExprName': + base_name = base.get('name', '') + else: + base_name = base.get('name', '') + else: + base_name = str(base) + if not base_name: return [] @@ -338,22 +345,27 @@ def get_inherited_members(base: Dict[str, Any], full_data: Dict[str, Any]) -> Li ] return [] - # Look up base class in our codebase - path_parts = base_name.split('.') - current = full_data.get(path_parts[0]) + # Look up base class in validmind module + current = full_data.get('validmind', {}) if not current: return [] - # Navigate to base class - for part in path_parts[1:]: - if part in current.get('members', {}): - current = current['members'][part] + # Look for the base class in the current module's members + if base_name in current.get('members', {}): + base_class = current['members'][base_name] + else: + # Search recursively through submodules + for module in current.get('members', {}).values(): + if module.get('kind') == 'module': + if base_name in module.get('members', {}): + base_class = module['members'][base_name] + break else: return [] # Collect public methods and properties members = [] - for member in current.get('members', {}).values(): + for member in base_class.get('members', {}).values(): if member['kind'] in ('method', 'property') and not member.get('name', '').startswith('_'): members.append(member) From 876a0538f619ffda9903f9ffb9eeb1f39974cab4 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Mon, 27 Jan 2025 12:34:53 -0800 Subject: [PATCH 019/207] Save point --- docs/templates/class.qmd.jinja2 | 18 +- docs/validmind/errors.qmd | 179 ++++++++++++++---- docs/validmind/test_suites.qmd | 60 +++--- docs/validmind/test_suites/classifier.qmd | 14 +- docs/validmind/test_suites/cluster.qmd | 8 +- docs/validmind/test_suites/embeddings.qmd | 6 +- docs/validmind/test_suites/llm.qmd | 12 +- docs/validmind/test_suites/nlp.qmd | 10 +- .../test_suites/parameters_optimization.qmd | 2 +- docs/validmind/test_suites/regression.qmd | 10 +- .../test_suites/statsmodels_timeseries.qmd | 4 +- docs/validmind/test_suites/summarization.qmd | 2 +- .../test_suites/tabular_datasets.qmd | 6 +- docs/validmind/test_suites/text_data.qmd | 2 +- docs/validmind/test_suites/time_series.qmd | 14 +- docs/validmind/tests.qmd | 9 +- .../ChiSquaredFeaturesTable.qmd | 5 +- .../tests/data_validation/ClassImbalance.qmd | 5 +- .../data_validation/DatasetDescription.qmd | 5 +- .../data_validation/DescriptiveStatistics.qmd | 5 +- .../tests/data_validation/DickeyFullerGLS.qmd | 5 +- .../data_validation/EngleGrangerCoint.qmd | 5 +- docs/validmind/tests/data_validation/KPSS.qmd | 5 +- .../data_validation/PhillipsPerronArch.qmd | 5 +- .../ProtectedClassesCombination.qmd | 5 +- .../ProtectedClassesDisparity.qmd | 5 +- .../ProtectedClassesThresholdOptimizer.qmd | 5 +- .../data_validation/RollingStatsPlot.qmd | 5 +- .../data_validation/SeasonalDecompose.qmd | 5 +- .../tests/data_validation/SpreadPlot.qmd | 5 +- .../TabularCategoricalBarPlots.qmd | 5 +- .../TabularDateTimeHistograms.qmd | 5 +- .../data_validation/TargetRateBarPlots.qmd | 5 +- .../data_validation/TimeSeriesFrequency.qmd | 5 +- .../data_validation/TimeSeriesLinePlot.qmd | 5 +- .../TimeSeriesMissingValues.qmd | 5 +- .../data_validation/TimeSeriesOutliers.qmd | 5 +- .../tests/data_validation/WOEBinPlots.qmd | 5 +- .../tests/data_validation/WOEBinTable.qmd | 5 +- .../data_validation/ZivotAndrewsArch.qmd | 5 +- .../tests/data_validation/nlp/Hashtags.qmd | 5 +- .../tests/data_validation/nlp/Mentions.qmd | 5 +- .../tests/model_validation/FeaturesAUC.qmd | 5 +- .../sklearn/ClusterCosineSimilarity.qmd | 5 +- .../sklearn/KMeansClustersOptimization.qmd | 5 +- .../sklearn/PermutationFeatureImportance.qmd | 5 +- .../sklearn/PopulationStabilityIndex.qmd | 5 +- .../sklearn/PrecisionRecallCurve.qmd | 5 +- .../model_validation/sklearn/ROCCurve.qmd | 5 +- .../sklearn/RobustnessDiagnosis.qmd | 5 +- .../sklearn/SHAPGlobalImportance.qmd | 5 +- .../statsmodels/KolmogorovSmirnov.qmd | 5 +- .../statsmodels/RegressionCoeffs.qmd | 5 +- .../RegressionFeatureSignificance.qmd | 5 +- .../tests/prompt_validation/Bias.qmd | 5 +- .../tests/prompt_validation/Clarity.qmd | 5 +- .../tests/prompt_validation/Conciseness.qmd | 5 +- .../tests/prompt_validation/Delimitation.qmd | 5 +- .../prompt_validation/NegativeInstruction.qmd | 5 +- .../tests/prompt_validation/Robustness.qmd | 10 +- .../tests/prompt_validation/Specificity.qmd | 5 +- docs/validmind/vm_models.qmd | 14 +- scripts/generate_quarto_docs.py | 57 ++---- 63 files changed, 449 insertions(+), 208 deletions(-) diff --git a/docs/templates/class.qmd.jinja2 b/docs/templates/class.qmd.jinja2 index 88a36060d..d84543f9c 100644 --- a/docs/templates/class.qmd.jinja2 +++ b/docs/templates/class.qmd.jinja2 @@ -1,7 +1,7 @@ ### [class]{.muted} {{ resolved.name }} ```python -class {{ resolved.name }}{% if resolved.bases %}({{ resolved.bases | map(attribute='name') | join(', ') }}){% endif %}: +class {{ resolved.name }}({% for base in resolved.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): ``` {% if resolved.docstring %} @@ -11,13 +11,21 @@ class {{ resolved.name }}{% if resolved.bases %}({{ resolved.bases | map(attribu {% if resolved.bases %} **Inherited members** -{% for base in resolved.bases %} -{% set base_members = get_inherited_members(base, full_data) %} +{% set base_members = get_inherited_members(resolved.bases[0], full_data) %} {% if base_members %} -- **From {{ base.name }}**: {% for member in base_members %}[{{ member.name }}](#{{ member.name }}){% if not loop.last %}, {% endif %}{% endfor %} -{% endif %} +{% set grouped = {} %} +{% for member in base_members %} + {% if member.base not in grouped %} + {% set _ = grouped.update({member.base: []}) %} + {% endif %} + {% set _ = grouped[member.base].append(member) %} +{% endfor %} +{% for base, members in grouped.items() %} +- **From {{ base }}**: {% for member in members %}{% if member.kind == 'builtin' %}{{ member.name }}{% else %}[{% if member.kind == 'class' %}class {% endif %}{{ member.name }}](#{{ member.name }})[()]{.muted}{% endif %}{% if not loop.last %}, {% endif %}{% endfor %} + {% endfor %} {% endif %} +{% endif %} {% if resolved.members %} **Methods** diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index e34491e80..4ac4b2e33 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -30,365 +30,472 @@ Determine whether an error should be raised when fail_fast is True. ### [class]{.muted} APIRequestError ```python -class APIRequestError({'cls': 'ExprName', 'name': 'BaseError'}): +class APIRequestError(BaseError): ``` Generic error for API request errors that are not known. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} BaseError ```python -class BaseError({'cls': 'ExprName', 'name': 'Exception'}): +class BaseError(Exception): ``` **Inherited members** +- **From builtins.BaseException**: with_traceback, add_note + **Methods** ### [class]{.muted} GetTestSuiteError ```python -class GetTestSuiteError({'cls': 'ExprName', 'name': 'BaseError'}): +class GetTestSuiteError(BaseError): ``` When the test suite could not be found. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} InitializeTestSuiteError ```python -class InitializeTestSuiteError({'cls': 'ExprName', 'name': 'BaseError'}): +class InitializeTestSuiteError(BaseError): ``` When the test suite was found but could not be initialized. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} InvalidAPICredentialsError ```python -class InvalidAPICredentialsError({'cls': 'ExprName', 'name': 'APIRequestError'}): +class InvalidAPICredentialsError(APIRequestError): ``` **Inherited members** +- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + **Methods** ### [class]{.muted} InvalidContentIdPrefixError ```python -class InvalidContentIdPrefixError({'cls': 'ExprName', 'name': 'APIRequestError'}): +class InvalidContentIdPrefixError(APIRequestError): ``` When an invalid text content_id is sent to the API. **Inherited members** +- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} InvalidInputError ```python -class InvalidInputError({'cls': 'ExprName', 'name': 'BaseError'}): +class InvalidInputError(BaseError): ``` When an invalid input object. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} InvalidMetricResultsError ```python -class InvalidMetricResultsError({'cls': 'ExprName', 'name': 'APIRequestError'}): +class InvalidMetricResultsError(APIRequestError): ``` When an invalid metric results object is sent to the API. **Inherited members** +- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} InvalidProjectError ```python -class InvalidProjectError({'cls': 'ExprName', 'name': 'APIRequestError'}): +class InvalidProjectError(APIRequestError): ``` **Inherited members** +- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + **Methods** ### [class]{.muted} InvalidRequestBodyError ```python -class InvalidRequestBodyError({'cls': 'ExprName', 'name': 'APIRequestError'}): +class InvalidRequestBodyError(APIRequestError): ``` When a POST/PUT request is made with an invalid request body. **Inherited members** +- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} InvalidTestParametersError ```python -class InvalidTestParametersError({'cls': 'ExprName', 'name': 'BaseError'}): +class InvalidTestParametersError(BaseError): ``` When an invalid parameters for the test. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} InvalidTestResultsError ```python -class InvalidTestResultsError({'cls': 'ExprName', 'name': 'APIRequestError'}): +class InvalidTestResultsError(APIRequestError): ``` When an invalid test results object is sent to the API. **Inherited members** +- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} InvalidTextObjectError ```python -class InvalidTextObjectError({'cls': 'ExprName', 'name': 'APIRequestError'}): +class InvalidTextObjectError(APIRequestError): ``` When an invalid Metadat (Text) object is sent to the API. **Inherited members** +- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} InvalidValueFormatterError ```python -class InvalidValueFormatterError({'cls': 'ExprName', 'name': 'BaseError'}): +class InvalidValueFormatterError(BaseError): ``` When an invalid value formatter is provided when serializing results. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} InvalidXGBoostTrainedModelError ```python -class InvalidXGBoostTrainedModelError({'cls': 'ExprName', 'name': 'BaseError'}): +class InvalidXGBoostTrainedModelError(BaseError): ``` When an invalid XGBoost trained model is used when calling init_r_model. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} LoadTestError ```python -class LoadTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class LoadTestError(BaseError): ``` Exception raised when an error occurs while loading a test **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + **Methods** ### [class]{.muted} MismatchingClassLabelsError ```python -class MismatchingClassLabelsError({'cls': 'ExprName', 'name': 'BaseError'}): +class MismatchingClassLabelsError(BaseError): ``` When the class labels found in the dataset don't match the provided target labels. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} MissingAPICredentialsError ```python -class MissingAPICredentialsError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingAPICredentialsError(BaseError): ``` **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + **Methods** ### [class]{.muted} MissingCacheResultsArgumentsError ```python -class MissingCacheResultsArgumentsError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingCacheResultsArgumentsError(BaseError): ``` When the cache_results function is missing arguments. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} MissingClassLabelError ```python -class MissingClassLabelError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingClassLabelError(BaseError): ``` When the one or more class labels are missing from provided dataset targets. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} MissingDependencyError ```python -class MissingDependencyError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingDependencyError(BaseError): ``` When a required dependency is missing. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + **Methods** ### [class]{.muted} MissingDocumentationTemplate ```python -class MissingDocumentationTemplate({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingDocumentationTemplate(BaseError): ``` When the client config is missing the documentation template. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} MissingModelIdError ```python -class MissingModelIdError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingModelIdError(BaseError): ``` **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + **Methods** ### [class]{.muted} MissingOrInvalidModelPredictFnError ```python -class MissingOrInvalidModelPredictFnError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingOrInvalidModelPredictFnError(BaseError): ``` When the pytorch model is missing a predict function or its predict method does not have the expected arguments. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} MissingRequiredTestInputError ```python -class MissingRequiredTestInputError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingRequiredTestInputError(BaseError): ``` When a required test context variable is missing. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} MissingRExtrasError ```python -class MissingRExtrasError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingRExtrasError(BaseError): ``` When the R extras have not been installed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + **Methods** ### [class]{.muted} MissingTextContentIdError ```python -class MissingTextContentIdError({'cls': 'ExprName', 'name': 'APIRequestError'}): +class MissingTextContentIdError(APIRequestError): ``` When a Text object is sent to the API without a content_id. **Inherited members** +- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} MissingTextContentsError ```python -class MissingTextContentsError({'cls': 'ExprName', 'name': 'APIRequestError'}): +class MissingTextContentsError(APIRequestError): ``` When a Text object is sent to the API without a "text" attribute. **Inherited members** +- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} TestInputInvalidDatasetError ```python -class TestInputInvalidDatasetError({'cls': 'ExprName', 'name': 'BaseError'}): +class TestInputInvalidDatasetError(BaseError): ``` When an invalid dataset is used in a test context. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} UnsupportedColumnTypeError ```python -class UnsupportedColumnTypeError({'cls': 'ExprName', 'name': 'BaseError'}): +class UnsupportedColumnTypeError(BaseError): ``` When an unsupported column type is found on a dataset. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} UnsupportedDatasetError ```python -class UnsupportedDatasetError({'cls': 'ExprName', 'name': 'BaseError'}): +class UnsupportedDatasetError(BaseError): ``` When an unsupported dataset is used. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} UnsupportedFigureError ```python -class UnsupportedFigureError({'cls': 'ExprName', 'name': 'BaseError'}): +class UnsupportedFigureError(BaseError): ``` When an unsupported figure object is constructed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} UnsupportedModelError ```python -class UnsupportedModelError({'cls': 'ExprName', 'name': 'BaseError'}): +class UnsupportedModelError(BaseError): ``` When an unsupported model is used. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} UnsupportedModelForSHAPError ```python -class UnsupportedModelForSHAPError({'cls': 'ExprName', 'name': 'BaseError'}): +class UnsupportedModelForSHAPError(BaseError): ``` When an unsupported model is used for SHAP importance. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} UnsupportedRModelError ```python -class UnsupportedRModelError({'cls': 'ExprName', 'name': 'BaseError'}): +class UnsupportedRModelError(BaseError): ``` When an unsupported R model is used. **Inherited members** + +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 5ba7dcf9d..bda35e1ab 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -22,7 +22,7 @@ Entrypoint for test suites. ### [class]{.muted} ClassifierDiagnosis ```python -class ClassifierDiagnosis({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClassifierDiagnosis(TestSuite): ``` Test suite for sklearn classifier model diagnosis tests @@ -34,7 +34,7 @@ Test suite for sklearn classifier model diagnosis tests ### [class]{.muted} ClassifierFullSuite ```python -class ClassifierFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClassifierFullSuite(TestSuite): ``` Full test suite for binary classification models. @@ -46,7 +46,7 @@ Full test suite for binary classification models. ### [class]{.muted} ClassifierMetrics ```python -class ClassifierMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClassifierMetrics(TestSuite): ``` Test suite for sklearn classifier metrics @@ -58,7 +58,7 @@ Test suite for sklearn classifier metrics ### [class]{.muted} ClassifierModelValidation ```python -class ClassifierModelValidation({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClassifierModelValidation(TestSuite): ``` Test suite for binary classification models. @@ -70,7 +70,7 @@ Test suite for binary classification models. ### [class]{.muted} ClassifierPerformance ```python -class ClassifierPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClassifierPerformance(TestSuite): ``` Test suite for sklearn classifier models @@ -82,7 +82,7 @@ Test suite for sklearn classifier models ### [class]{.muted} ClusterFullSuite ```python -class ClusterFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClusterFullSuite(TestSuite): ``` Full test suite for clustering models. @@ -94,7 +94,7 @@ Full test suite for clustering models. ### [class]{.muted} ClusterMetrics ```python -class ClusterMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClusterMetrics(TestSuite): ``` Test suite for sklearn clustering metrics @@ -106,7 +106,7 @@ Test suite for sklearn clustering metrics ### [class]{.muted} ClusterPerformance ```python -class ClusterPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClusterPerformance(TestSuite): ``` Test suite for sklearn cluster performance @@ -118,7 +118,7 @@ Test suite for sklearn cluster performance ### [class]{.muted} EmbeddingsFullSuite ```python -class EmbeddingsFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +class EmbeddingsFullSuite(TestSuite): ``` Full test suite for embeddings models. @@ -130,7 +130,7 @@ Full test suite for embeddings models. ### [class]{.muted} EmbeddingsMetrics ```python -class EmbeddingsMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +class EmbeddingsMetrics(TestSuite): ``` Test suite for embeddings metrics @@ -142,7 +142,7 @@ Test suite for embeddings metrics ### [class]{.muted} EmbeddingsPerformance ```python -class EmbeddingsPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +class EmbeddingsPerformance(TestSuite): ``` Test suite for embeddings model performance @@ -154,7 +154,7 @@ Test suite for embeddings model performance ### [class]{.muted} KmeansParametersOptimization ```python -class KmeansParametersOptimization({'cls': 'ExprName', 'name': 'TestSuite'}): +class KmeansParametersOptimization(TestSuite): ``` Test suite for sklearn hyperparameters optimization @@ -166,7 +166,7 @@ Test suite for sklearn hyperparameters optimization ### [class]{.muted} LLMClassifierFullSuite ```python -class LLMClassifierFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +class LLMClassifierFullSuite(TestSuite): ``` Full test suite for LLM classification models. @@ -178,7 +178,7 @@ Full test suite for LLM classification models. ### [class]{.muted} NLPClassifierFullSuite ```python -class NLPClassifierFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +class NLPClassifierFullSuite(TestSuite): ``` Full test suite for NLP classification models. @@ -190,7 +190,7 @@ Full test suite for NLP classification models. ### [class]{.muted} PromptValidation ```python -class PromptValidation({'cls': 'ExprName', 'name': 'TestSuite'}): +class PromptValidation(TestSuite): ``` Test suite for prompt validation @@ -202,7 +202,7 @@ Test suite for prompt validation ### [class]{.muted} RegressionFullSuite ```python -class RegressionFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +class RegressionFullSuite(TestSuite): ``` Full test suite for regression models. @@ -214,7 +214,7 @@ Full test suite for regression models. ### [class]{.muted} RegressionMetrics ```python -class RegressionMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +class RegressionMetrics(TestSuite): ``` Test suite for performance metrics of regression metrics @@ -226,7 +226,7 @@ Test suite for performance metrics of regression metrics ### [class]{.muted} RegressionModelDescription ```python -class RegressionModelDescription({'cls': 'ExprName', 'name': 'TestSuite'}): +class RegressionModelDescription(TestSuite): ``` Test suite for performance metric of regression model of statsmodels library @@ -238,7 +238,7 @@ Test suite for performance metric of regression model of statsmodels library ### [class]{.muted} RegressionModelsEvaluation ```python -class RegressionModelsEvaluation({'cls': 'ExprName', 'name': 'TestSuite'}): +class RegressionModelsEvaluation(TestSuite): ``` Test suite for metrics comparison of regression model of statsmodels library @@ -250,7 +250,7 @@ Test suite for metrics comparison of regression model of statsmodels library ### [class]{.muted} RegressionPerformance ```python -class RegressionPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +class RegressionPerformance(TestSuite): ``` Test suite for regression model performance @@ -262,7 +262,7 @@ Test suite for regression model performance ### [class]{.muted} SummarizationMetrics ```python -class SummarizationMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +class SummarizationMetrics(TestSuite): ``` Test suite for Summarization metrics @@ -274,7 +274,7 @@ Test suite for Summarization metrics ### [class]{.muted} TabularDataQuality ```python -class TabularDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +class TabularDataQuality(TestSuite): ``` Test suite for data quality on tabular datasets @@ -286,7 +286,7 @@ Test suite for data quality on tabular datasets ### [class]{.muted} TabularDataset ```python -class TabularDataset({'cls': 'ExprName', 'name': 'TestSuite'}): +class TabularDataset(TestSuite): ``` Test suite for tabular datasets. @@ -298,7 +298,7 @@ Test suite for tabular datasets. ### [class]{.muted} TabularDatasetDescription ```python -class TabularDatasetDescription({'cls': 'ExprName', 'name': 'TestSuite'}): +class TabularDatasetDescription(TestSuite): ``` Test suite to extract metadata and descriptive statistics from a tabular dataset @@ -310,7 +310,7 @@ Test suite to extract metadata and descriptive statistics from a tabular dataset ### [class]{.muted} TextDataQuality ```python -class TextDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +class TextDataQuality(TestSuite): ``` Test suite for data quality on text data @@ -322,7 +322,7 @@ Test suite for data quality on text data ### [class]{.muted} TimeSeriesDataQuality ```python -class TimeSeriesDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +class TimeSeriesDataQuality(TestSuite): ``` Test suite for data quality on time series datasets @@ -334,7 +334,7 @@ Test suite for data quality on time series datasets ### [class]{.muted} TimeSeriesDataset ```python -class TimeSeriesDataset({'cls': 'ExprName', 'name': 'TestSuite'}): +class TimeSeriesDataset(TestSuite): ``` Test suite for time series datasets. @@ -346,7 +346,7 @@ Test suite for time series datasets. ### [class]{.muted} TimeSeriesModelValidation ```python -class TimeSeriesModelValidation({'cls': 'ExprName', 'name': 'TestSuite'}): +class TimeSeriesModelValidation(TestSuite): ``` Test suite for time series model validation. @@ -358,7 +358,7 @@ Test suite for time series model validation. ### [class]{.muted} TimeSeriesMultivariate ```python -class TimeSeriesMultivariate({'cls': 'ExprName', 'name': 'TestSuite'}): +class TimeSeriesMultivariate(TestSuite): ``` This test suite provides a preliminary understanding of the features and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. @@ -370,7 +370,7 @@ This test suite provides a preliminary understanding of the features and relatio ### [class]{.muted} TimeSeriesUnivariate ```python -class TimeSeriesUnivariate({'cls': 'ExprName', 'name': 'TestSuite'}): +class TimeSeriesUnivariate(TestSuite): ``` This test suite provides a preliminary understanding of the target variable(s) used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index f242a1cf1..41804e05e 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -9,7 +9,7 @@ Test suites for sklearn-compatible classifier models Ideal setup is to have the ### [class]{.muted} TabularDataQuality ```python -class TabularDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +class TabularDataQuality(TestSuite): ``` Test suite for data quality on tabular datasets @@ -21,7 +21,7 @@ Test suite for data quality on tabular datasets ### [class]{.muted} TabularDatasetDescription ```python -class TabularDatasetDescription({'cls': 'ExprName', 'name': 'TestSuite'}): +class TabularDatasetDescription(TestSuite): ``` Test suite to extract metadata and descriptive statistics from a tabular dataset @@ -33,7 +33,7 @@ Test suite to extract metadata and descriptive statistics from a tabular dataset ### [class]{.muted} ClassifierDiagnosis ```python -class ClassifierDiagnosis({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClassifierDiagnosis(TestSuite): ``` Test suite for sklearn classifier model diagnosis tests @@ -45,7 +45,7 @@ Test suite for sklearn classifier model diagnosis tests ### [class]{.muted} ClassifierFullSuite ```python -class ClassifierFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClassifierFullSuite(TestSuite): ``` Full test suite for binary classification models. @@ -57,7 +57,7 @@ Full test suite for binary classification models. ### [class]{.muted} ClassifierMetrics ```python -class ClassifierMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClassifierMetrics(TestSuite): ``` Test suite for sklearn classifier metrics @@ -69,7 +69,7 @@ Test suite for sklearn classifier metrics ### [class]{.muted} ClassifierModelValidation ```python -class ClassifierModelValidation({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClassifierModelValidation(TestSuite): ``` Test suite for binary classification models. @@ -81,7 +81,7 @@ Test suite for binary classification models. ### [class]{.muted} ClassifierPerformance ```python -class ClassifierPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClassifierPerformance(TestSuite): ``` Test suite for sklearn classifier models diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index d5d8dd2f4..1210ecc80 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -9,7 +9,7 @@ Test suites for sklearn-compatible clustering models Ideal setup is to have the ### [class]{.muted} KmeansParametersOptimization ```python -class KmeansParametersOptimization({'cls': 'ExprName', 'name': 'TestSuite'}): +class KmeansParametersOptimization(TestSuite): ``` Test suite for sklearn hyperparameters optimization @@ -21,7 +21,7 @@ Test suite for sklearn hyperparameters optimization ### [class]{.muted} ClusterFullSuite ```python -class ClusterFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClusterFullSuite(TestSuite): ``` Full test suite for clustering models. @@ -33,7 +33,7 @@ Full test suite for clustering models. ### [class]{.muted} ClusterMetrics ```python -class ClusterMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClusterMetrics(TestSuite): ``` Test suite for sklearn clustering metrics @@ -45,7 +45,7 @@ Test suite for sklearn clustering metrics ### [class]{.muted} ClusterPerformance ```python -class ClusterPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClusterPerformance(TestSuite): ``` Test suite for sklearn cluster performance diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index cf038b078..c78b2482c 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -9,7 +9,7 @@ Test suites for embeddings models Ideal setup is to have the API client to read ### [class]{.muted} EmbeddingsFullSuite ```python -class EmbeddingsFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +class EmbeddingsFullSuite(TestSuite): ``` Full test suite for embeddings models. @@ -21,7 +21,7 @@ Full test suite for embeddings models. ### [class]{.muted} EmbeddingsMetrics ```python -class EmbeddingsMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +class EmbeddingsMetrics(TestSuite): ``` Test suite for embeddings metrics @@ -33,7 +33,7 @@ Test suite for embeddings metrics ### [class]{.muted} EmbeddingsPerformance ```python -class EmbeddingsPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +class EmbeddingsPerformance(TestSuite): ``` Test suite for embeddings model performance diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index ca7b416dc..7ca911227 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -9,7 +9,7 @@ Test suites for LLMs ### [class]{.muted} ClassifierDiagnosis ```python -class ClassifierDiagnosis({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClassifierDiagnosis(TestSuite): ``` Test suite for sklearn classifier model diagnosis tests @@ -21,7 +21,7 @@ Test suite for sklearn classifier model diagnosis tests ### [class]{.muted} ClassifierMetrics ```python -class ClassifierMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClassifierMetrics(TestSuite): ``` Test suite for sklearn classifier metrics @@ -33,7 +33,7 @@ Test suite for sklearn classifier metrics ### [class]{.muted} ClassifierPerformance ```python -class ClassifierPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClassifierPerformance(TestSuite): ``` Test suite for sklearn classifier models @@ -45,7 +45,7 @@ Test suite for sklearn classifier models ### [class]{.muted} TextDataQuality ```python -class TextDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +class TextDataQuality(TestSuite): ``` Test suite for data quality on text data @@ -57,7 +57,7 @@ Test suite for data quality on text data ### [class]{.muted} LLMClassifierFullSuite ```python -class LLMClassifierFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +class LLMClassifierFullSuite(TestSuite): ``` Full test suite for LLM classification models. @@ -69,7 +69,7 @@ Full test suite for LLM classification models. ### [class]{.muted} PromptValidation ```python -class PromptValidation({'cls': 'ExprName', 'name': 'TestSuite'}): +class PromptValidation(TestSuite): ``` Test suite for prompt validation diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index 65647ae5f..a86d649a5 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -9,7 +9,7 @@ Test suites for NLP models ### [class]{.muted} ClassifierDiagnosis ```python -class ClassifierDiagnosis({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClassifierDiagnosis(TestSuite): ``` Test suite for sklearn classifier model diagnosis tests @@ -21,7 +21,7 @@ Test suite for sklearn classifier model diagnosis tests ### [class]{.muted} ClassifierMetrics ```python -class ClassifierMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClassifierMetrics(TestSuite): ``` Test suite for sklearn classifier metrics @@ -33,7 +33,7 @@ Test suite for sklearn classifier metrics ### [class]{.muted} ClassifierPerformance ```python -class ClassifierPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +class ClassifierPerformance(TestSuite): ``` Test suite for sklearn classifier models @@ -45,7 +45,7 @@ Test suite for sklearn classifier models ### [class]{.muted} TextDataQuality ```python -class TextDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +class TextDataQuality(TestSuite): ``` Test suite for data quality on text data @@ -57,7 +57,7 @@ Test suite for data quality on text data ### [class]{.muted} NLPClassifierFullSuite ```python -class NLPClassifierFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +class NLPClassifierFullSuite(TestSuite): ``` Full test suite for NLP classification models. diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index 30684da40..bcdc06f8c 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -9,7 +9,7 @@ Test suites for sklearn-compatible hyper parameters tunning Ideal setup is to ha ### [class]{.muted} KmeansParametersOptimization ```python -class KmeansParametersOptimization({'cls': 'ExprName', 'name': 'TestSuite'}): +class KmeansParametersOptimization(TestSuite): ``` Test suite for sklearn hyperparameters optimization diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index b364eead2..e470f8cd1 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -7,7 +7,7 @@ toc-expand: 3 ### [class]{.muted} TabularDataQuality ```python -class TabularDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +class TabularDataQuality(TestSuite): ``` Test suite for data quality on tabular datasets @@ -19,7 +19,7 @@ Test suite for data quality on tabular datasets ### [class]{.muted} TabularDatasetDescription ```python -class TabularDatasetDescription({'cls': 'ExprName', 'name': 'TestSuite'}): +class TabularDatasetDescription(TestSuite): ``` Test suite to extract metadata and descriptive statistics from a tabular dataset @@ -31,7 +31,7 @@ Test suite to extract metadata and descriptive statistics from a tabular dataset ### [class]{.muted} RegressionFullSuite ```python -class RegressionFullSuite({'cls': 'ExprName', 'name': 'TestSuite'}): +class RegressionFullSuite(TestSuite): ``` Full test suite for regression models. @@ -43,7 +43,7 @@ Full test suite for regression models. ### [class]{.muted} RegressionMetrics ```python -class RegressionMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +class RegressionMetrics(TestSuite): ``` Test suite for performance metrics of regression metrics @@ -55,7 +55,7 @@ Test suite for performance metrics of regression metrics ### [class]{.muted} RegressionPerformance ```python -class RegressionPerformance({'cls': 'ExprName', 'name': 'TestSuite'}): +class RegressionPerformance(TestSuite): ``` Test suite for regression model performance diff --git a/docs/validmind/test_suites/statsmodels_timeseries.qmd b/docs/validmind/test_suites/statsmodels_timeseries.qmd index 9eeabc973..4d3bc8f89 100644 --- a/docs/validmind/test_suites/statsmodels_timeseries.qmd +++ b/docs/validmind/test_suites/statsmodels_timeseries.qmd @@ -9,7 +9,7 @@ Time Series Test Suites from statsmodels ### [class]{.muted} RegressionModelDescription ```python -class RegressionModelDescription({'cls': 'ExprName', 'name': 'TestSuite'}): +class RegressionModelDescription(TestSuite): ``` Test suite for performance metric of regression model of statsmodels library @@ -21,7 +21,7 @@ Test suite for performance metric of regression model of statsmodels library ### [class]{.muted} RegressionModelsEvaluation ```python -class RegressionModelsEvaluation({'cls': 'ExprName', 'name': 'TestSuite'}): +class RegressionModelsEvaluation(TestSuite): ``` Test suite for metrics comparison of regression model of statsmodels library diff --git a/docs/validmind/test_suites/summarization.qmd b/docs/validmind/test_suites/summarization.qmd index 74e828d27..91e7ab61c 100644 --- a/docs/validmind/test_suites/summarization.qmd +++ b/docs/validmind/test_suites/summarization.qmd @@ -9,7 +9,7 @@ Test suites for llm summarization models ### [class]{.muted} SummarizationMetrics ```python -class SummarizationMetrics({'cls': 'ExprName', 'name': 'TestSuite'}): +class SummarizationMetrics(TestSuite): ``` Test suite for Summarization metrics diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd index af3531b48..7fc6cfc3b 100644 --- a/docs/validmind/test_suites/tabular_datasets.qmd +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -9,7 +9,7 @@ Test suites for tabular datasets ### [class]{.muted} TabularDataQuality ```python -class TabularDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +class TabularDataQuality(TestSuite): ``` Test suite for data quality on tabular datasets @@ -21,7 +21,7 @@ Test suite for data quality on tabular datasets ### [class]{.muted} TabularDataset ```python -class TabularDataset({'cls': 'ExprName', 'name': 'TestSuite'}): +class TabularDataset(TestSuite): ``` Test suite for tabular datasets. @@ -33,7 +33,7 @@ Test suite for tabular datasets. ### [class]{.muted} TabularDatasetDescription ```python -class TabularDatasetDescription({'cls': 'ExprName', 'name': 'TestSuite'}): +class TabularDatasetDescription(TestSuite): ``` Test suite to extract metadata and descriptive statistics from a tabular dataset diff --git a/docs/validmind/test_suites/text_data.qmd b/docs/validmind/test_suites/text_data.qmd index 1924a0403..7bb75ef4d 100644 --- a/docs/validmind/test_suites/text_data.qmd +++ b/docs/validmind/test_suites/text_data.qmd @@ -9,7 +9,7 @@ Test suites for text datasets ### [class]{.muted} TextDataQuality ```python -class TextDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +class TextDataQuality(TestSuite): ``` Test suite for data quality on text data diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index 6edee287c..41fae2a14 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -9,7 +9,7 @@ Time Series Test Suites ### [class]{.muted} RegressionModelDescription ```python -class RegressionModelDescription({'cls': 'ExprName', 'name': 'TestSuite'}): +class RegressionModelDescription(TestSuite): ``` Test suite for performance metric of regression model of statsmodels library @@ -21,7 +21,7 @@ Test suite for performance metric of regression model of statsmodels library ### [class]{.muted} RegressionModelsEvaluation ```python -class RegressionModelsEvaluation({'cls': 'ExprName', 'name': 'TestSuite'}): +class RegressionModelsEvaluation(TestSuite): ``` Test suite for metrics comparison of regression model of statsmodels library @@ -33,7 +33,7 @@ Test suite for metrics comparison of regression model of statsmodels library ### [class]{.muted} TimeSeriesDataQuality ```python -class TimeSeriesDataQuality({'cls': 'ExprName', 'name': 'TestSuite'}): +class TimeSeriesDataQuality(TestSuite): ``` Test suite for data quality on time series datasets @@ -45,7 +45,7 @@ Test suite for data quality on time series datasets ### [class]{.muted} TimeSeriesDataset ```python -class TimeSeriesDataset({'cls': 'ExprName', 'name': 'TestSuite'}): +class TimeSeriesDataset(TestSuite): ``` Test suite for time series datasets. @@ -57,7 +57,7 @@ Test suite for time series datasets. ### [class]{.muted} TimeSeriesModelValidation ```python -class TimeSeriesModelValidation({'cls': 'ExprName', 'name': 'TestSuite'}): +class TimeSeriesModelValidation(TestSuite): ``` Test suite for time series model validation. @@ -69,7 +69,7 @@ Test suite for time series model validation. ### [class]{.muted} TimeSeriesMultivariate ```python -class TimeSeriesMultivariate({'cls': 'ExprName', 'name': 'TestSuite'}): +class TimeSeriesMultivariate(TestSuite): ``` This test suite provides a preliminary understanding of the features and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. @@ -81,7 +81,7 @@ This test suite provides a preliminary understanding of the features and relatio ### [class]{.muted} TimeSeriesUnivariate ```python -class TimeSeriesUnivariate({'cls': 'ExprName', 'name': 'TestSuite'}): +class TimeSeriesUnivariate(TestSuite): ``` This test suite provides a preliminary understanding of the target variable(s) used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index b235ca220..93618a858 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -17,19 +17,22 @@ ValidMind Tests Module ``` ```python -class LoadTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class LoadTestError(BaseError): ``` Exception raised when an error occurs while loading a test **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + **Methods** ### [class]{.muted} LocalTestProvider ```python -class LocalTestProvider: +class LocalTestProvider(): ``` Test providers in ValidMind are responsible for loading tests from different sources, such as local files, databases, or remote services. The LocalTestProvider specifically loads tests from the local file system. @@ -62,7 +65,7 @@ test = test_provider.load_test("my_namespace.my_test_class") **Methods** ### [class]{.muted} TestProvider ```python -class TestProvider({'cls': 'ExprName', 'name': 'Protocol'}): +class TestProvider(Protocol): ``` Protocol for user-defined test providers diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 8ecd2ab7e..92c8b62f0 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## ChiSquaredFeaturesTable[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 901e620f7..dbea6e07b 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -9,13 +9,16 @@ Threshold based tests ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## ClassImbalance[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index a90508dd6..68c744aed 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} UnsupportedColumnTypeError ```python -class UnsupportedColumnTypeError({'cls': 'ExprName', 'name': 'BaseError'}): +class UnsupportedColumnTypeError(BaseError): ``` When an unsupported column type is found on a dataset. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## DatasetDescription[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index d42ab1167..5c2332aad 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## DescriptiveStatistics[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 5aaff665b..fd3e9473b 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## DickeyFullerGLS[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index a7dc32789..a04aa81a5 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## EngleGrangerCoint[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 99006018b..5bc13b94f 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## KPSS[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 8e4d58e57..9e52f2aae 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## PhillipsPerronArch[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index aa6517e7e..bd58c6a98 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} MissingDependencyError ```python -class MissingDependencyError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingDependencyError(BaseError): ``` When a required dependency is missing. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + **Methods** ## ProtectedClassesCombination[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 5672b879f..33a5fc41f 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} MissingDependencyError ```python -class MissingDependencyError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingDependencyError(BaseError): ``` When a required dependency is missing. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + **Methods** ## ProtectedClassesDisparity[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 1f54fd614..c2846d712 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} MissingDependencyError ```python -class MissingDependencyError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingDependencyError(BaseError): ``` When a required dependency is missing. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + **Methods** ## calculate_fairness_metrics[()]{.muted} diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index ea6599605..99a53e312 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## plot_rolling_statistics[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index e167f5e8b..3227dfe38 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## SeasonalDecompose[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index f04e4ee33..b1b236427 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## SpreadPlot[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index d4e7d5e14..279d44eae 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## TabularCategoricalBarPlots[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index a79e80f8d..15455babb 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## TabularDateTimeHistograms[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 9f4a1ac3b..b6a975007 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## TargetRateBarPlots[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index dcd09b777..6f4b86739 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## TimeSeriesFrequency[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index a0fb37ad0..72519b46f 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## TimeSeriesLinePlot[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index beffa7953..0ed336fe7 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## TimeSeriesMissingValues[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index f5411a0ac..4c0f20735 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## TimeSeriesOutliers[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 30eced2b3..718ccbad7 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## WOEBinPlots[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 6086c90b2..47a142910 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## WOEBinTable[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index a8ebfc4e2..41fcd9db7 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## ZivotAndrewsArch[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 76c3fd60e..1c8e7fa84 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## Hashtags[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 874f5389c..d235ee969 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## Mentions[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 9adccc24a..f0700952e 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## FeaturesAUC[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 1ff5fc3a2..1a644c350 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## ClusterCosineSimilarity[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 679cc2bac..59d03e5e9 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## KMeansClustersOptimization[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 7720278e5..ae8b43c14 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## PermutationFeatureImportance[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 34878dc97..a18ce6de0 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## calculate_psi[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 6a1b052f7..9c9f45335 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## PrecisionRecallCurve[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 321106fed..ff9563e3f 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## ROCCurve[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 8c5e20388..5f8b2fd2e 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} MissingOrInvalidModelPredictFnError ```python -class MissingOrInvalidModelPredictFnError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingOrInvalidModelPredictFnError(BaseError): ``` When the pytorch model is missing a predict function or its predict method does not have the expected arguments. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## RobustnessDiagnosis[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index bcfd6868b..7c810089c 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} UnsupportedModelForSHAPError ```python -class UnsupportedModelForSHAPError({'cls': 'ExprName', 'name': 'BaseError'}): +class UnsupportedModelForSHAPError(BaseError): ``` When an unsupported model is used for SHAP importance. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## generate_shap_plot[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 974c88168..3a5fc406e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} InvalidTestParametersError ```python -class InvalidTestParametersError({'cls': 'ExprName', 'name': 'BaseError'}): +class InvalidTestParametersError(BaseError): ``` When an invalid parameters for the test. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## KolmogorovSmirnov[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 3acd8260f..b632f6af3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## RegressionCoeffs[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 794b8e0a4..84d461a5a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## RegressionFeatureSignificance[()]{.muted} ```python diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 743241525..170735fea 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} MissingRequiredTestInputError ```python -class MissingRequiredTestInputError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingRequiredTestInputError(BaseError): ``` When a required test context variable is missing. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## Bias[()]{.muted} ```python diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 6cfb93bab..3a7c16eab 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} MissingRequiredTestInputError ```python -class MissingRequiredTestInputError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingRequiredTestInputError(BaseError): ``` When a required test context variable is missing. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## Clarity[()]{.muted} ```python diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 1ff21f09a..0d70509a8 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} MissingRequiredTestInputError ```python -class MissingRequiredTestInputError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingRequiredTestInputError(BaseError): ``` When a required test context variable is missing. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## Conciseness[()]{.muted} ```python diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index bca7be73b..ba8faf89e 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} MissingRequiredTestInputError ```python -class MissingRequiredTestInputError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingRequiredTestInputError(BaseError): ``` When a required test context variable is missing. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## Delimitation[()]{.muted} ```python diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index ecc7d3397..79c8e47b8 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} MissingRequiredTestInputError ```python -class MissingRequiredTestInputError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingRequiredTestInputError(BaseError): ``` When a required test context variable is missing. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## NegativeInstruction[()]{.muted} ```python diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 941599bb6..90ac610c5 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -7,23 +7,29 @@ toc-expand: 3 ### [class]{.muted} MissingRequiredTestInputError ```python -class MissingRequiredTestInputError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingRequiredTestInputError(BaseError): ``` When a required test context variable is missing. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ### [class]{.muted} SkipTestError ```python -class SkipTestError({'cls': 'ExprName', 'name': 'BaseError'}): +class SkipTestError(BaseError): ``` Useful error to throw when a test cannot be executed. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## Robustness[()]{.muted} ```python diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 0f2d05bea..01d11b26d 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -7,13 +7,16 @@ toc-expand: 3 ### [class]{.muted} MissingRequiredTestInputError ```python -class MissingRequiredTestInputError({'cls': 'ExprName', 'name': 'BaseError'}): +class MissingRequiredTestInputError(BaseError): ``` When a required test context variable is missing. **Inherited members** +- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From builtins.BaseException**: with_traceback, add_note + ## Specificity[()]{.muted} ```python diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 96a10cc9d..4ad8756cc 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -9,7 +9,7 @@ Models entrypoint ### [class]{.muted} Figure ```python -class Figure: +class Figure(): ``` Figure objects track the schema supported by the ValidMind API @@ -19,7 +19,7 @@ Figure objects track the schema supported by the ValidMind API ### [class]{.muted} ModelAttributes ```python -class ModelAttributes: +class ModelAttributes(): ``` Model attributes definition @@ -29,7 +29,7 @@ Model attributes definition ### [class]{.muted} TestSuite ```python -class TestSuite: +class TestSuite(): ``` Base class for test suites. Test suites are used to define a grouping of tests that can be run as a suite against datasets and models. Test Suites can be defined by inheriting from this base class and defining the list of tests as a class variable. @@ -41,7 +41,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ### [class]{.muted} TestSuiteRunner ```python -class TestSuiteRunner: +class TestSuiteRunner(): ``` Runs a test suite @@ -51,7 +51,7 @@ Runs a test suite ### [class]{.muted} VMDataset ```python -class VMDataset({'cls': 'ExprName', 'name': 'VMInput'}): +class VMDataset(VMInput): ``` Base class for VM datasets Child classes should be used to support new dataset types (tensor, polars etc) by converting the user's dataset into a numpy array collecting metadata like column names and then call this (parent) class `__init__` method. @@ -80,7 +80,7 @@ This way we can support multiple dataset types but under the hood we only need t ### [class]{.muted} VMInput ```python -class VMInput({'cls': 'ExprName', 'name': 'ABC'}): +class VMInput(ABC): ``` Base class for ValidMind Input types @@ -92,7 +92,7 @@ Base class for ValidMind Input types ### [class]{.muted} VMModel ```python -class VMModel({'cls': 'ExprName', 'name': 'VMInput'}): +class VMModel(VMInput): ``` An base class that wraps a trained model instance and its associated data. diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 1967dcdb5..197b0fdc0 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -324,50 +324,35 @@ def parse_docstrings_recursively(data: Dict[str, Any]): def get_inherited_members(base: Dict[str, Any], full_data: Dict[str, Any]) -> List[Dict[str, Any]]: """Get all inherited members from a base class.""" - # Get the base class name and handle the dictionary structure - if isinstance(base, dict): - if 'cls' in base and base['cls'] == 'ExprName': - base_name = base.get('name', '') - else: - base_name = base.get('name', '') - else: - base_name = str(base) - + # Get the base class name + base_name = base.get('name', '') if not base_name: return [] # Handle built-in exceptions - if base_name.startswith('builtins.'): - if base_name == 'builtins.BaseException': - return [ - {'name': 'with_traceback', 'kind': 'method'}, - {'name': 'add_note', 'kind': 'method'} - ] - return [] + if base_name == 'Exception' or base_name.startswith('builtins.'): + return [ + {'name': 'with_traceback', 'kind': 'builtin', 'base': 'builtins.BaseException'}, + {'name': 'add_note', 'kind': 'builtin', 'base': 'builtins.BaseException'} + ] - # Look up base class in validmind module - current = full_data.get('validmind', {}) - if not current: + # Look for the base class in the errors module + errors_module = full_data.get('validmind', {}).get('members', {}).get('errors', {}).get('members', {}) + base_class = errors_module.get(base_name) + + if not base_class: return [] - # Look for the base class in the current module's members - if base_name in current.get('members', {}): - base_class = current['members'][base_name] - else: - # Search recursively through submodules - for module in current.get('members', {}).values(): - if module.get('kind') == 'module': - if base_name in module.get('members', {}): - base_class = module['members'][base_name] - break - else: - return [] + # Return the base class and its description method if it exists + members = [{'name': base_name, 'kind': 'class', 'base': base_name}] + if 'description' in base_class.get('members', {}): + members.append({'name': 'description', 'kind': 'method', 'base': base_name}) - # Collect public methods and properties - members = [] - for member in base_class.get('members', {}).values(): - if member['kind'] in ('method', 'property') and not member.get('name', '').startswith('_'): - members.append(member) + # Add built-in methods from Exception + members.extend([ + {'name': 'with_traceback', 'kind': 'builtin', 'base': 'builtins.BaseException'}, + {'name': 'add_note', 'kind': 'builtin', 'base': 'builtins.BaseException'} + ]) return members From 49604b4e92cad2fd27e66fcd26a01c9e8f4cd5ad Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Mon, 27 Jan 2025 13:37:00 -0800 Subject: [PATCH 020/207] Save point for errors --- docs/_sidebar.yml | 80 +- docs/templates/class.qmd.jinja2 | 17 +- docs/templates/errors.qmd.jinja2 | 185 ++ docs/validmind/errors.html | 927 ++++++++ docs/validmind/errors.qmd | 142 +- ...p-973236bd072d72a04ee9cd82dcc9cb29.min.css | 12 + .../libs/bootstrap/bootstrap-icons.css | 2078 +++++++++++++++++ .../libs/bootstrap/bootstrap-icons.woff | Bin 0 -> 176200 bytes .../libs/bootstrap/bootstrap.min.js | 7 + .../libs/clipboard/clipboard.min.js | 7 + .../libs/quarto-html/anchor.min.js | 9 + .../libs/quarto-html/popper.min.js | 6 + ...hting-549806ee2085284f45b00abea8c6df48.css | 205 ++ .../errors_files/libs/quarto-html/quarto.js | 911 ++++++++ .../errors_files/libs/quarto-html/tippy.css | 1 + .../libs/quarto-html/tippy.umd.min.js | 2 + docs/validmind/test_suites.qmd | 94 +- docs/validmind/test_suites/classifier.qmd | 42 +- docs/validmind/test_suites/cluster.qmd | 24 +- docs/validmind/test_suites/llm.qmd | 36 +- docs/validmind/test_suites/nlp.qmd | 24 +- docs/validmind/test_suites/regression.qmd | 30 +- docs/validmind/test_suites/time_series.qmd | 46 +- docs/validmind/tests.qmd | 88 +- .../ChiSquaredFeaturesTable.qmd | 26 +- .../tests/data_validation/ClassImbalance.qmd | 26 +- .../data_validation/DatasetDescription.qmd | 26 +- .../data_validation/DescriptiveStatistics.qmd | 26 +- .../tests/data_validation/DickeyFullerGLS.qmd | 25 +- .../data_validation/EngleGrangerCoint.qmd | 26 +- docs/validmind/tests/data_validation/KPSS.qmd | 25 +- .../data_validation/PhillipsPerronArch.qmd | 25 +- .../ProtectedClassesCombination.qmd | 29 +- .../ProtectedClassesDisparity.qmd | 29 +- .../ProtectedClassesThresholdOptimizer.qmd | 29 +- .../data_validation/RollingStatsPlot.qmd | 26 +- .../data_validation/SeasonalDecompose.qmd | 25 +- .../tests/data_validation/SpreadPlot.qmd | 26 +- .../TabularCategoricalBarPlots.qmd | 26 +- .../TabularDateTimeHistograms.qmd | 26 +- .../data_validation/TargetRateBarPlots.qmd | 26 +- .../data_validation/TimeSeriesFrequency.qmd | 26 +- .../data_validation/TimeSeriesLinePlot.qmd | 26 +- .../TimeSeriesMissingValues.qmd | 26 +- .../data_validation/TimeSeriesOutliers.qmd | 26 +- .../tests/data_validation/WOEBinPlots.qmd | 25 +- .../tests/data_validation/WOEBinTable.qmd | 26 +- .../data_validation/ZivotAndrewsArch.qmd | 25 +- .../tests/data_validation/nlp/Hashtags.qmd | 26 +- .../tests/data_validation/nlp/Mentions.qmd | 26 +- .../tests/model_validation/FeaturesAUC.qmd | 25 +- .../sklearn/ClusterCosineSimilarity.qmd | 26 +- .../sklearn/KMeansClustersOptimization.qmd | 26 +- .../sklearn/PermutationFeatureImportance.qmd | 25 +- .../sklearn/PopulationStabilityIndex.qmd | 25 +- .../sklearn/PrecisionRecallCurve.qmd | 26 +- .../model_validation/sklearn/ROCCurve.qmd | 26 +- .../sklearn/RobustnessDiagnosis.qmd | 25 +- .../sklearn/SHAPGlobalImportance.qmd | 25 +- .../statsmodels/KolmogorovSmirnov.qmd | 26 +- .../statsmodels/RegressionCoeffs.qmd | 26 +- .../RegressionFeatureSignificance.qmd | 25 +- .../tests/prompt_validation/Bias.qmd | 25 +- .../tests/prompt_validation/Clarity.qmd | 25 +- .../tests/prompt_validation/Conciseness.qmd | 25 +- .../tests/prompt_validation/Delimitation.qmd | 25 +- .../prompt_validation/NegativeInstruction.qmd | 25 +- .../tests/prompt_validation/Robustness.qmd | 51 +- .../tests/prompt_validation/Specificity.qmd | 25 +- docs/validmind/vm_models.qmd | 263 +++ scripts/generate_quarto_docs.py | 94 +- 71 files changed, 5634 insertions(+), 882 deletions(-) create mode 100644 docs/templates/errors.qmd.jinja2 create mode 100644 docs/validmind/errors.html create mode 100644 docs/validmind/errors_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css create mode 100644 docs/validmind/errors_files/libs/bootstrap/bootstrap-icons.css create mode 100644 docs/validmind/errors_files/libs/bootstrap/bootstrap-icons.woff create mode 100644 docs/validmind/errors_files/libs/bootstrap/bootstrap.min.js create mode 100644 docs/validmind/errors_files/libs/clipboard/clipboard.min.js create mode 100644 docs/validmind/errors_files/libs/quarto-html/anchor.min.js create mode 100644 docs/validmind/errors_files/libs/quarto-html/popper.min.js create mode 100644 docs/validmind/errors_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css create mode 100644 docs/validmind/errors_files/libs/quarto-html/quarto.js create mode 100644 docs/validmind/errors_files/libs/quarto-html/tippy.css create mode 100644 docs/validmind/errors_files/libs/quarto-html/tippy.umd.min.js diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml index c0c38f597..c4d439aa3 100644 --- a/docs/_sidebar.yml +++ b/docs/_sidebar.yml @@ -39,18 +39,42 @@ website: - text: "errors" file: validmind/errors.qmd contents: + - text: "BaseError" + file: validmind/errors.qmd#BaseError + - text: "APIRequestError" + file: validmind/errors.qmd#APIRequestError - text: "raise_api_error()" file: validmind/errors.qmd#raise_api_error - text: "should_raise_on_fail_fast()" file: validmind/errors.qmd#should_raise_on_fail_fast - - text: "APIRequestError" - file: validmind/errors.qmd#APIRequestError - - text: "BaseError" - file: validmind/errors.qmd#BaseError + - text: "InvalidXGBoostTrainedModelError" + file: validmind/errors.qmd#InvalidXGBoostTrainedModelError + - text: "MissingModelIdError" + file: validmind/errors.qmd#MissingModelIdError + - text: "MissingOrInvalidModelPredictFnError" + file: validmind/errors.qmd#MissingOrInvalidModelPredictFnError + - text: "UnsupportedModelError" + file: validmind/errors.qmd#UnsupportedModelError + - text: "UnsupportedModelForSHAPError" + file: validmind/errors.qmd#UnsupportedModelForSHAPError + - text: "UnsupportedRModelError" + file: validmind/errors.qmd#UnsupportedRModelError - text: "GetTestSuiteError" file: validmind/errors.qmd#GetTestSuiteError - text: "InitializeTestSuiteError" file: validmind/errors.qmd#InitializeTestSuiteError + - text: "InvalidTestParametersError" + file: validmind/errors.qmd#InvalidTestParametersError + - text: "InvalidTestResultsError" + file: validmind/errors.qmd#InvalidTestResultsError + - text: "LoadTestError" + file: validmind/errors.qmd#LoadTestError + - text: "MissingRequiredTestInputError" + file: validmind/errors.qmd#MissingRequiredTestInputError + - text: "SkipTestError" + file: validmind/errors.qmd#SkipTestError + - text: "TestInputInvalidDatasetError" + file: validmind/errors.qmd#TestInputInvalidDatasetError - text: "InvalidAPICredentialsError" file: validmind/errors.qmd#InvalidAPICredentialsError - text: "InvalidContentIdPrefixError" @@ -63,20 +87,10 @@ website: file: validmind/errors.qmd#InvalidProjectError - text: "InvalidRequestBodyError" file: validmind/errors.qmd#InvalidRequestBodyError - - text: "InvalidTestParametersError" - file: validmind/errors.qmd#InvalidTestParametersError - - text: "InvalidTestResultsError" - file: validmind/errors.qmd#InvalidTestResultsError - text: "InvalidTextObjectError" file: validmind/errors.qmd#InvalidTextObjectError - text: "InvalidValueFormatterError" file: validmind/errors.qmd#InvalidValueFormatterError - - text: "InvalidXGBoostTrainedModelError" - file: validmind/errors.qmd#InvalidXGBoostTrainedModelError - - text: "LoadTestError" - file: validmind/errors.qmd#LoadTestError - - text: "MismatchingClassLabelsError" - file: validmind/errors.qmd#MismatchingClassLabelsError - text: "MissingAPICredentialsError" file: validmind/errors.qmd#MissingAPICredentialsError - text: "MissingCacheResultsArgumentsError" @@ -87,37 +101,31 @@ website: file: validmind/errors.qmd#MissingDependencyError - text: "MissingDocumentationTemplate" file: validmind/errors.qmd#MissingDocumentationTemplate - - text: "MissingModelIdError" - file: validmind/errors.qmd#MissingModelIdError - - text: "MissingOrInvalidModelPredictFnError" - file: validmind/errors.qmd#MissingOrInvalidModelPredictFnError - - text: "MissingRequiredTestInputError" - file: validmind/errors.qmd#MissingRequiredTestInputError - text: "MissingRExtrasError" file: validmind/errors.qmd#MissingRExtrasError - text: "MissingTextContentIdError" file: validmind/errors.qmd#MissingTextContentIdError - text: "MissingTextContentsError" file: validmind/errors.qmd#MissingTextContentsError - - text: "SkipTestError" - file: validmind/errors.qmd#SkipTestError - - text: "TestInputInvalidDatasetError" - file: validmind/errors.qmd#TestInputInvalidDatasetError - text: "UnsupportedColumnTypeError" file: validmind/errors.qmd#UnsupportedColumnTypeError - text: "UnsupportedDatasetError" file: validmind/errors.qmd#UnsupportedDatasetError - text: "UnsupportedFigureError" file: validmind/errors.qmd#UnsupportedFigureError - - text: "UnsupportedModelError" - file: validmind/errors.qmd#UnsupportedModelError - - text: "UnsupportedModelForSHAPError" - file: validmind/errors.qmd#UnsupportedModelForSHAPError - - text: "UnsupportedRModelError" - file: validmind/errors.qmd#UnsupportedRModelError + - text: "MismatchingClassLabelsError" + file: validmind/errors.qmd#MismatchingClassLabelsError - text: "test_suites" file: validmind/test_suites.qmd contents: + - text: "describe_suite()" + file: validmind/test_suites.qmd#describe_suite + - text: "get_by_id()" + file: validmind/test_suites.qmd#get_by_id + - text: "list_suites()" + file: validmind/test_suites.qmd#list_suites + - text: "register_test_suite()" + file: validmind/test_suites.qmd#register_test_suite - text: "ClassifierDiagnosis()" file: validmind/test_suites.qmd#ClassifierDiagnosis - text: "ClassifierFullSuite()" @@ -184,17 +192,11 @@ website: file: validmind/test_suites.qmd#TimeSeriesMultivariate - text: "TimeSeriesUnivariate()" file: validmind/test_suites.qmd#TimeSeriesUnivariate - - text: "describe_suite()" - file: validmind/test_suites.qmd#describe_suite - - text: "get_by_id()" - file: validmind/test_suites.qmd#get_by_id - - text: "list_suites()" - file: validmind/test_suites.qmd#list_suites - - text: "register_test_suite()" - file: validmind/test_suites.qmd#register_test_suite - text: "tests" file: validmind/tests.qmd contents: + - text: "register_test_provider()" + file: validmind/tests.qmd#register_test_provider - text: "describe_test()" file: validmind/tests.qmd#describe_test - text: "list_tags()" @@ -221,8 +223,6 @@ website: file: validmind/tests.qmd#test - text: "TestProvider()" file: validmind/tests.qmd#TestProvider - - text: "register_test_provider()" - file: validmind/tests.qmd#register_test_provider - text: "unit_metrics" file: validmind/unit_metrics.qmd contents: diff --git a/docs/templates/class.qmd.jinja2 b/docs/templates/class.qmd.jinja2 index d84543f9c..1d42c12ae 100644 --- a/docs/templates/class.qmd.jinja2 +++ b/docs/templates/class.qmd.jinja2 @@ -21,7 +21,7 @@ class {{ resolved.name }}({% for base in resolved.bases %}{{ base.name }}{% if n {% set _ = grouped[member.base].append(member) %} {% endfor %} {% for base, members in grouped.items() %} -- **From {{ base }}**: {% for member in members %}{% if member.kind == 'builtin' %}{{ member.name }}{% else %}[{% if member.kind == 'class' %}class {% endif %}{{ member.name }}](#{{ member.name }})[()]{.muted}{% endif %}{% if not loop.last %}, {% endif %}{% endfor %} +- **From {{ base }}**: {% for member in members %}{% if member.kind == 'builtin' %}{{ member.name }}{% else %}[{% if member.kind == 'class' %}class {% endif %}{{ member.name }}[()]{.muted}](#{% if member.kind == 'class' %}class-{% endif %}{{ member.name | lower }}){% endif %}{% if not loop.last %}, {% endif %}{% endfor %} {% endfor %} {% endif %} @@ -29,9 +29,18 @@ class {{ resolved.name }}({% for base in resolved.bases %}{{ base.name }}{% if n {% if resolved.members %} **Methods** -{% for member in resolved.members | sort_members %} -{% if member.kind == 'method' and is_public(member, module, full_data) %} -- [{{ member.name }}](#{{ member.name }}){% if member.docstring %}: {{ member.docstring.value | trim }}{% endif %} + +{% for member in resolved.members.values() | sort(attribute='name') %} +{% if member.kind in ['method', 'function'] and not member.name.startswith('_') %} +### [{{ member.name }}[()]{.muted}](#{{ member.name }}) + +```python +{{ member.name }}({{ member.parameters | map(attribute='name') | join(', ') }}) +``` + +{% if member.docstring %} +{{ doc.format_docstring(member.docstring) }} +{% endif %} {% endif %} {% endfor %} {% endif %} \ No newline at end of file diff --git a/docs/templates/errors.qmd.jinja2 b/docs/templates/errors.qmd.jinja2 new file mode 100644 index 000000000..b8ecfe0e3 --- /dev/null +++ b/docs/templates/errors.qmd.jinja2 @@ -0,0 +1,185 @@ +{% import "macros/docstring.jinja2" as doc %} +{% import "macros/types.jinja2" as types %} +--- +title: errors +toc-depth: 3 +toc-expand: 3 +--- + +{% if module.docstring %} +{{ doc.format_docstring(module.docstring) }} +{% endif %} + +## Base Errors + +{% for member in members | sort_members(is_errors_module=true) %} +{% if member.kind == 'class' and member.name in ['BaseError', 'APIRequestError'] %} +### [class]{.muted} {{ member.name }} + +```python +class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): +``` + +{% if member.docstring %} +{{ doc.format_docstring(member.docstring) }} +{% endif %} + +{% if member.members %} +**Methods** + +{% for method in member.members.values() | sort(attribute='name') %} +{% if method.kind == 'method' and not method.name.startswith('_') %} +#### [{{ method.name }}[()]{.muted}](#{{ method.name }}) +```python +{{ method.name }}({{ method.parameters | map(attribute='name') | join(', ') }}) +``` +{% endif %} +{% endfor %} +{% endif %} +{% endif %} +{% endfor %} + +## API Errors + +{% for member in members | sort_members(is_errors_module=true) %} +{% if member.kind == 'class' and (member.name.startswith('API') or member.name.endswith('APIError')) and member.name != 'APIRequestError' %} +### [class]{.muted} {{ member.name }} + +```python +class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): +``` + +{% if member.docstring %} +{{ doc.format_docstring(member.docstring) }} +{% endif %} + +{% if member.members %} +**Methods** + +{% for method in member.members.values() | sort(attribute='name') %} +{% if method.kind == 'method' and not method.name.startswith('_') %} +#### [{{ method.name }}[()]{.muted}](#{{ method.name }}) +```python +{{ method.name }}({{ method.parameters | map(attribute='name') | join(', ') }}) +``` +{% endif %} +{% endfor %} +{% endif %} +{% endif %} +{% endfor %} + +## Model Errors + +{% for member in members | sort_members(is_errors_module=true) %} +{% if member.kind == 'class' and 'Model' in member.name %} +### [class]{.muted} {{ member.name }} + +```python +class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): +``` + +{% if member.docstring %} +{{ doc.format_docstring(member.docstring) }} +{% endif %} + +{% if member.members %} +**Methods** + +{% for method in member.members.values() | sort(attribute='name') %} +{% if method.kind == 'method' and not method.name.startswith('_') %} +#### [{{ method.name }}[()]{.muted}](#{{ method.name }}) +```python +{{ method.name }}({{ method.parameters | map(attribute='name') | join(', ') }}) +``` +{% endif %} +{% endfor %} +{% endif %} +{% endif %} +{% endfor %} + +## Test Errors + +{% for member in members | sort_members(is_errors_module=true) %} +{% if member.kind == 'class' and 'Test' in member.name %} +### [class]{.muted} {{ member.name }} + +```python +class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): +``` + +{% if member.docstring %} +{{ doc.format_docstring(member.docstring) }} +{% endif %} + +{% if member.members %} +**Methods** + +{% for method in member.members.values() | sort(attribute='name') %} +{% if method.kind == 'method' and not method.name.startswith('_') %} +#### [{{ method.name }}[()]{.muted}](#{{ method.name }}) +```python +{{ method.name }}({{ method.parameters | map(attribute='name') | join(', ') }}) +``` +{% endif %} +{% endfor %} +{% endif %} +{% endif %} +{% endfor %} + +## Input Validation Errors + +{% for member in members | sort_members(is_errors_module=true) %} +{% if member.kind == 'class' and (member.name.startswith('Invalid') or member.name.startswith('Missing')) %} +### [class]{.muted} {{ member.name }} + +```python +class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): +``` + +{% if member.docstring %} +{{ doc.format_docstring(member.docstring) }} +{% endif %} + +{% if member.members %} +**Methods** + +{% for method in member.members.values() | sort(attribute='name') %} +{% if method.kind == 'method' and not method.name.startswith('_') %} +#### [{{ method.name }}[()]{.muted}](#{{ method.name }}) +```python +{{ method.name }}({{ method.parameters | map(attribute='name') | join(', ') }}) +``` +{% endif %} +{% endfor %} +{% endif %} +{% endif %} +{% endfor %} + +## Unsupported Feature Errors + +{% for member in members | sort_members(is_errors_module=true) %} +{% if member.kind == 'class' and member.name.startswith('Unsupported') %} +### [class]{.muted} {{ member.name }} + +```python +class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): +``` + +{% if member.docstring %} +{{ doc.format_docstring(member.docstring) }} +{% endif %} + +{% if member.members %} +**Methods** + +{% for method in member.members.values() | sort(attribute='name') %} +{% if method.kind == 'method' and not method.name.startswith('_') %} +#### [{{ method.name }}[()]{.muted}](#{{ method.name }}) +```python +{{ method.name }}({{ method.parameters | map(attribute='name') | join(', ') }}) +``` +{% endif %} +{% endfor %} +{% endif %} +{% endif %} +{% endfor %} \ No newline at end of file diff --git a/docs/validmind/errors.html b/docs/validmind/errors.html new file mode 100644 index 000000000..376a86658 --- /dev/null +++ b/docs/validmind/errors.html @@ -0,0 +1,927 @@ + + + + + + + + + +errors + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+

errors

+
+ + + +
+ + + + +
+ + + +
+ + +

This module contains all the custom errors that are used in the ValidMind Library. The following base errors are defined for others:

+
    +
  • BaseError
  • +
  • APIRequestError
  • +
+
+

class APIRequestError

+
class APIRequestError(BaseError):
+

Generic error for API request errors that are not known.

+

Inherited members

+ +
+
+

class BaseError

+
class BaseError(Exception):
+

Inherited members

+
    +
  • From builtins.BaseException: with_traceback, add_note
  • +
+

Methods

+
+
+

description()

+
description(self, args, kwargs)
+
+
+

class GetTestSuiteError

+
class GetTestSuiteError(BaseError):
+

When the test suite could not be found.

+

Inherited members

+ +
+
+

class InitializeTestSuiteError

+
class InitializeTestSuiteError(BaseError):
+

When the test suite was found but could not be initialized.

+

Inherited members

+ +
+
+

class InvalidAPICredentialsError

+
class InvalidAPICredentialsError(APIRequestError):
+

Inherited members

+ +

Methods

+
+
+

description()

+
description(self, args, kwargs)
+
+
+

class InvalidContentIdPrefixError

+
class InvalidContentIdPrefixError(APIRequestError):
+

When an invalid text content_id is sent to the API.

+

Inherited members

+ +
+
+

class InvalidInputError

+
class InvalidInputError(BaseError):
+

When an invalid input object.

+

Inherited members

+ +
+
+

class InvalidMetricResultsError

+
class InvalidMetricResultsError(APIRequestError):
+

When an invalid metric results object is sent to the API.

+

Inherited members

+ +
+
+

class InvalidProjectError

+
class InvalidProjectError(APIRequestError):
+

Inherited members

+ +

Methods

+
+
+

description()

+
description(self, args, kwargs)
+
+
+

class InvalidRequestBodyError

+
class InvalidRequestBodyError(APIRequestError):
+

When a POST/PUT request is made with an invalid request body.

+

Inherited members

+ +
+
+

class InvalidTestParametersError

+
class InvalidTestParametersError(BaseError):
+

When an invalid parameters for the test.

+

Inherited members

+ +
+
+

class InvalidTestResultsError

+
class InvalidTestResultsError(APIRequestError):
+

When an invalid test results object is sent to the API.

+

Inherited members

+ +
+
+

class InvalidTextObjectError

+
class InvalidTextObjectError(APIRequestError):
+

When an invalid Metadat (Text) object is sent to the API.

+

Inherited members

+ +
+
+

class InvalidValueFormatterError

+
class InvalidValueFormatterError(BaseError):
+

When an invalid value formatter is provided when serializing results.

+

Inherited members

+ +
+
+

class InvalidXGBoostTrainedModelError

+
class InvalidXGBoostTrainedModelError(BaseError):
+

When an invalid XGBoost trained model is used when calling init_r_model.

+

Inherited members

+ +
+
+

class LoadTestError

+
class LoadTestError(BaseError):
+

Exception raised when an error occurs while loading a test

+

Inherited members

+ +

Methods

+
+
+

class MismatchingClassLabelsError

+
class MismatchingClassLabelsError(BaseError):
+

When the class labels found in the dataset don’t match the provided target labels.

+

Inherited members

+ +
+
+

class MissingAPICredentialsError

+
class MissingAPICredentialsError(BaseError):
+

Inherited members

+ +

Methods

+
+
+

description()

+
description(self, args, kwargs)
+
+
+

class MissingCacheResultsArgumentsError

+
class MissingCacheResultsArgumentsError(BaseError):
+

When the cache_results function is missing arguments.

+

Inherited members

+ +
+
+

class MissingClassLabelError

+
class MissingClassLabelError(BaseError):
+

When the one or more class labels are missing from provided dataset targets.

+

Inherited members

+ +
+
+

class MissingDependencyError

+
class MissingDependencyError(BaseError):
+

When a required dependency is missing.

+

Inherited members

+ +

Methods

+
+
+

class MissingDocumentationTemplate

+
class MissingDocumentationTemplate(BaseError):
+

When the client config is missing the documentation template.

+

Inherited members

+ +
+
+

class MissingModelIdError

+
class MissingModelIdError(BaseError):
+

Inherited members

+ +

Methods

+
+
+

description()

+
description(self, args, kwargs)
+
+
+

class MissingOrInvalidModelPredictFnError

+
class MissingOrInvalidModelPredictFnError(BaseError):
+

When the pytorch model is missing a predict function or its predict method does not have the expected arguments.

+

Inherited members

+ +
+
+

class MissingRequiredTestInputError

+
class MissingRequiredTestInputError(BaseError):
+

When a required test context variable is missing.

+

Inherited members

+ +
+
+

class MissingRExtrasError

+
class MissingRExtrasError(BaseError):
+

When the R extras have not been installed.

+

Inherited members

+ +

Methods

+
+
+

description()

+
description(self, args, kwargs)
+
+
+

class MissingTextContentIdError

+
class MissingTextContentIdError(APIRequestError):
+

When a Text object is sent to the API without a content_id.

+

Inherited members

+ +
+
+

class MissingTextContentsError

+
class MissingTextContentsError(APIRequestError):
+

When a Text object is sent to the API without a “text” attribute.

+

Inherited members

+ +
+
+

class SkipTestError

+
class SkipTestError(BaseError):
+

Useful error to throw when a test cannot be executed.

+

Inherited members

+ +
+
+

class TestInputInvalidDatasetError

+
class TestInputInvalidDatasetError(BaseError):
+

When an invalid dataset is used in a test context.

+

Inherited members

+ +
+
+

class UnsupportedColumnTypeError

+
class UnsupportedColumnTypeError(BaseError):
+

When an unsupported column type is found on a dataset.

+

Inherited members

+ +
+
+

class UnsupportedDatasetError

+
class UnsupportedDatasetError(BaseError):
+

When an unsupported dataset is used.

+

Inherited members

+ +
+
+

class UnsupportedFigureError

+
class UnsupportedFigureError(BaseError):
+

When an unsupported figure object is constructed.

+

Inherited members

+ +
+
+

class UnsupportedModelError

+
class UnsupportedModelError(BaseError):
+

When an unsupported model is used.

+

Inherited members

+ +
+
+

class UnsupportedModelForSHAPError

+
class UnsupportedModelForSHAPError(BaseError):
+

When an unsupported model is used for SHAP importance.

+

Inherited members

+ +
+
+

class UnsupportedRModelError

+
class UnsupportedRModelError(BaseError):
+

When an unsupported R model is used.

+

Inherited members

+ +
+
+

raise_api_error()

+
def raise_api_error(
+    error_string):
+

Safely try to parse JSON from the response message in case the API returns a non-JSON string or if the API returns a non-standard error

+
+
+

should_raise_on_fail_fast()

+
def should_raise_on_fail_fast(
+    error) -> bool:
+

Determine whether an error should be raised when fail_fast is True.

+
+ +
+ + +
+ + + + + \ No newline at end of file diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index 4ac4b2e33..c09f5c02f 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -9,24 +9,6 @@ This module contains all the custom errors that are used in the ValidMind Librar - BaseError - APIRequestError -## raise_api_error[()]{.muted} - -```python -def raise_api_error( - error_string): -``` - -Safely try to parse JSON from the response message in case the API returns a non-JSON string or if the API returns a non-standard error - -## should_raise_on_fail_fast[()]{.muted} - -```python -def should_raise_on_fail_fast( - error) -> bool: -``` - -Determine whether an error should be raised when fail_fast is True. - ### [class]{.muted} APIRequestError ```python @@ -37,7 +19,7 @@ Generic error for API request errors that are not known. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} BaseError @@ -52,6 +34,12 @@ class BaseError(Exception): **Methods** +### [description[()]{.muted}](#description) + +```python +description(self, args, kwargs) +``` + ### [class]{.muted} GetTestSuiteError ```python @@ -62,7 +50,7 @@ When the test suite could not be found. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} InitializeTestSuiteError @@ -75,7 +63,7 @@ When the test suite was found but could not be initialized. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} InvalidAPICredentialsError @@ -86,11 +74,17 @@ class InvalidAPICredentialsError(APIRequestError): **Inherited members** -- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note **Methods** +### [description[()]{.muted}](#description) + +```python +description(self, args, kwargs) +``` + ### [class]{.muted} InvalidContentIdPrefixError ```python @@ -101,7 +95,7 @@ When an invalid text content_id is sent to the API. **Inherited members** -- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} InvalidInputError @@ -114,7 +108,7 @@ When an invalid input object. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} InvalidMetricResultsError @@ -127,7 +121,7 @@ When an invalid metric results object is sent to the API. **Inherited members** -- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} InvalidProjectError @@ -138,11 +132,17 @@ class InvalidProjectError(APIRequestError): **Inherited members** -- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note **Methods** +### [description[()]{.muted}](#description) + +```python +description(self, args, kwargs) +``` + ### [class]{.muted} InvalidRequestBodyError ```python @@ -153,7 +153,7 @@ When a POST/PUT request is made with an invalid request body. **Inherited members** -- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} InvalidTestParametersError @@ -166,7 +166,7 @@ When an invalid parameters for the test. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} InvalidTestResultsError @@ -179,7 +179,7 @@ When an invalid test results object is sent to the API. **Inherited members** -- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} InvalidTextObjectError @@ -192,7 +192,7 @@ When an invalid Metadat (Text) object is sent to the API. **Inherited members** -- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} InvalidValueFormatterError @@ -205,7 +205,7 @@ When an invalid value formatter is provided when serializing results. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} InvalidXGBoostTrainedModelError @@ -218,7 +218,7 @@ When an invalid XGBoost trained model is used when calling init_r_model. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} LoadTestError @@ -231,7 +231,7 @@ Exception raised when an error occurs while loading a test **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note **Methods** @@ -246,7 +246,7 @@ When the class labels found in the dataset don't match the provided target label **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} MissingAPICredentialsError @@ -257,11 +257,17 @@ class MissingAPICredentialsError(BaseError): **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note **Methods** +### [description[()]{.muted}](#description) + +```python +description(self, args, kwargs) +``` + ### [class]{.muted} MissingCacheResultsArgumentsError ```python @@ -272,7 +278,7 @@ When the cache_results function is missing arguments. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} MissingClassLabelError @@ -285,7 +291,7 @@ When the one or more class labels are missing from provided dataset targets. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} MissingDependencyError @@ -298,7 +304,7 @@ When a required dependency is missing. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note **Methods** @@ -313,7 +319,7 @@ When the client config is missing the documentation template. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} MissingModelIdError @@ -324,11 +330,17 @@ class MissingModelIdError(BaseError): **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note **Methods** +### [description[()]{.muted}](#description) + +```python +description(self, args, kwargs) +``` + ### [class]{.muted} MissingOrInvalidModelPredictFnError ```python @@ -339,7 +351,7 @@ When the pytorch model is missing a predict function or its predict method does **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} MissingRequiredTestInputError @@ -352,7 +364,7 @@ When a required test context variable is missing. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} MissingRExtrasError @@ -365,11 +377,17 @@ When the R extras have not been installed. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note **Methods** +### [description[()]{.muted}](#description) + +```python +description(self, args, kwargs) +``` + ### [class]{.muted} MissingTextContentIdError ```python @@ -380,7 +398,7 @@ When a Text object is sent to the API without a content_id. **Inherited members** -- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} MissingTextContentsError @@ -393,7 +411,7 @@ When a Text object is sent to the API without a "text" attribute. **Inherited members** -- **From APIRequestError**: [class APIRequestError](#APIRequestError)[()]{.muted} +- **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} SkipTestError @@ -406,7 +424,7 @@ Useful error to throw when a test cannot be executed. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} TestInputInvalidDatasetError @@ -419,7 +437,7 @@ When an invalid dataset is used in a test context. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} UnsupportedColumnTypeError @@ -432,7 +450,7 @@ When an unsupported column type is found on a dataset. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} UnsupportedDatasetError @@ -445,7 +463,7 @@ When an unsupported dataset is used. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} UnsupportedFigureError @@ -458,7 +476,7 @@ When an unsupported figure object is constructed. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} UnsupportedModelError @@ -471,7 +489,7 @@ When an unsupported model is used. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} UnsupportedModelForSHAPError @@ -484,7 +502,7 @@ When an unsupported model is used for SHAP importance. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note ### [class]{.muted} UnsupportedRModelError @@ -497,5 +515,23 @@ When an unsupported R model is used. **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + +## raise_api_error[()]{.muted} + +```python +def raise_api_error( + error_string): +``` + +Safely try to parse JSON from the response message in case the API returns a non-JSON string or if the API returns a non-standard error + +## should_raise_on_fail_fast[()]{.muted} + +```python +def should_raise_on_fail_fast( + error) -> bool: +``` + +Determine whether an error should be raised when fail_fast is True. diff --git a/docs/validmind/errors_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css b/docs/validmind/errors_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css new file mode 100644 index 000000000..d6064cbbb --- /dev/null +++ b/docs/validmind/errors_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css @@ -0,0 +1,12 @@ +/*! + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root,[data-bs-theme=light]{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-black: #000;--bs-white: #ffffff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #dee2e6;--bs-primary: #0d6efd;--bs-secondary: #6c757d;--bs-success: #198754;--bs-info: #0dcaf0;--bs-warning: #ffc107;--bs-danger: #dc3545;--bs-light: #f8f9fa;--bs-dark: #212529;--bs-default-rgb: 222, 226, 230;--bs-primary-rgb: 13, 110, 253;--bs-secondary-rgb: 108, 117, 125;--bs-success-rgb: 25, 135, 84;--bs-info-rgb: 13, 202, 240;--bs-warning-rgb: 255, 193, 7;--bs-danger-rgb: 220, 53, 69;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 33, 37, 41;--bs-primary-text-emphasis: #052c65;--bs-secondary-text-emphasis: #2b2f32;--bs-success-text-emphasis: #0a3622;--bs-info-text-emphasis: #055160;--bs-warning-text-emphasis: #664d03;--bs-danger-text-emphasis: #58151c;--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: #cfe2ff;--bs-secondary-bg-subtle: #e2e3e5;--bs-success-bg-subtle: #d1e7dd;--bs-info-bg-subtle: #cff4fc;--bs-warning-bg-subtle: #fff3cd;--bs-danger-bg-subtle: #f8d7da;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #9ec5fe;--bs-secondary-border-subtle: #c4c8cb;--bs-success-border-subtle: #a3cfbb;--bs-info-border-subtle: #9eeaf9;--bs-warning-border-subtle: #ffe69c;--bs-danger-border-subtle: #f1aeb5;--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #212529;--bs-body-color-rgb: 33, 37, 41;--bs-body-bg: #ffffff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb: 33, 37, 41;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233, 236, 239;--bs-tertiary-color: rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb: 33, 37, 41;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #0d6efd;--bs-link-color-rgb: 13, 110, 253;--bs-link-decoration: underline;--bs-link-hover-color: #0a58ca;--bs-link-hover-color-rgb: 10, 88, 202;--bs-code-color: #7d12ba;--bs-highlight-bg: #fff3cd;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: white;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.375rem;--bs-border-radius-sm: 0.25rem;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(13, 110, 253, 0.25);--bs-form-valid-color: #198754;--bs-form-valid-border-color: #198754;--bs-form-invalid-color: #dc3545;--bs-form-invalid-border-color: #dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #ffffff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: #6ea8fe;--bs-secondary-text-emphasis: #a7acb1;--bs-success-text-emphasis: #75b798;--bs-info-text-emphasis: #6edff6;--bs-warning-text-emphasis: #ffda6a;--bs-danger-text-emphasis: #ea868f;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #031633;--bs-secondary-bg-subtle: #161719;--bs-success-bg-subtle: #051b11;--bs-info-bg-subtle: #032830;--bs-warning-bg-subtle: #332701;--bs-danger-bg-subtle: #2c0b0e;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #084298;--bs-secondary-border-subtle: #41464b;--bs-success-border-subtle: #0f5132;--bs-info-border-subtle: #087990;--bs-warning-border-subtle: #997404;--bs-danger-border-subtle: #842029;--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #6ea8fe;--bs-link-hover-color: #8bb9fe;--bs-link-color-rgb: 110, 168, 254;--bs-link-hover-color-rgb: 139, 185, 254;--bs-code-color: white;--bs-border-color: #495057;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #75b798;--bs-form-valid-border-color: #75b798;--bs-form-invalid-color: #ea868f;--bs-form-invalid-border-color: #ea868f}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #e9ecef}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f8f9fa;line-height:1.5;padding:.5rem;border:1px solid var(--bs-border-color, white);border-radius:.375rem}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;border-radius:.375rem;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#212529;border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(33,37,41,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #fff;border-radius:.375rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(33,37,41,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #212529;--bs-table-bg: #ffffff;--bs-table-border-color: white;--bs-table-accent-bg: transparent;--bs-table-striped-color: #212529;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #212529;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #212529;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #909294}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #000;--bs-table-bg: #cfe2ff;--bs-table-border-color: #bacbe6;--bs-table-striped-bg: #c5d7f2;--bs-table-striped-color: #000;--bs-table-active-bg: #bacbe6;--bs-table-active-color: #000;--bs-table-hover-bg: #bfd1ec;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #000;--bs-table-bg: #e2e3e5;--bs-table-border-color: #cbccce;--bs-table-striped-bg: #d7d8da;--bs-table-striped-color: #000;--bs-table-active-bg: #cbccce;--bs-table-active-color: #000;--bs-table-hover-bg: #d1d2d4;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #000;--bs-table-bg: #d1e7dd;--bs-table-border-color: #bcd0c7;--bs-table-striped-bg: #c7dbd2;--bs-table-striped-color: #000;--bs-table-active-bg: #bcd0c7;--bs-table-active-color: #000;--bs-table-hover-bg: #c1d6cc;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #000;--bs-table-bg: #cff4fc;--bs-table-border-color: #badce3;--bs-table-striped-bg: #c5e8ef;--bs-table-striped-color: #000;--bs-table-active-bg: #badce3;--bs-table-active-color: #000;--bs-table-hover-bg: #bfe2e9;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #000;--bs-table-bg: #fff3cd;--bs-table-border-color: #e6dbb9;--bs-table-striped-bg: #f2e7c3;--bs-table-striped-color: #000;--bs-table-active-bg: #e6dbb9;--bs-table-active-color: #000;--bs-table-hover-bg: #ece1be;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #000;--bs-table-bg: #f8d7da;--bs-table-border-color: #dfc2c4;--bs-table-striped-bg: #eccccf;--bs-table-striped-color: #000;--bs-table-active-bg: #dfc2c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e5c7ca;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #f8f9fa;--bs-table-border-color: #dfe0e1;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #ffffff;--bs-table-bg: #212529;--bs-table-border-color: #373b3e;--bs-table-striped-bg: #2c3034;--bs-table-striped-color: #ffffff;--bs-table-active-bg: #373b3e;--bs-table-active-color: #ffffff;--bs-table-hover-bg: #323539;--bs-table-hover-color: #ffffff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(33,37,41,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #fff;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:rgba(33,37,41,.75);opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#212529;background-color:#f8f9fa;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e9ecef}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem;border-radius:.25rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:.375rem}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:.375rem}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #fff;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem;border-radius:.25rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #ffffff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid #fff;print-color-adjust:exact}.form-check-input[type=checkbox],.shiny-input-container .checkbox input[type=checkbox],.shiny-input-container .checkbox-inline input[type=checkbox],.shiny-input-container .radio input[type=checkbox],.shiny-input-container .radio-inline input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23ffffff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(33,37,41,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(33,37,41,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff;border-radius:.375rem}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#e9ecef}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:1px solid #fff;border-radius:.375rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;border-radius:.25rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#198754;border-radius:.375rem}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#198754;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#198754}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#198754}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#198754}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#dc3545;border-radius:.375rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#dc3545}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#dc3545}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#dc3545}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #212529;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.375rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #000;--bs-btn-bg: #dee2e6;--bs-btn-border-color: #dee2e6;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #e3e6ea;--bs-btn-hover-border-color: #e1e5e9;--bs-btn-focus-shadow-rgb: 189, 192, 196;--bs-btn-active-color: #000;--bs-btn-active-bg: #e5e8eb;--bs-btn-active-border-color: #e1e5e9;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #dee2e6;--bs-btn-disabled-border-color: #dee2e6}.btn-primary{--bs-btn-color: #ffffff;--bs-btn-bg: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #0b5ed7;--bs-btn-hover-border-color: #0a58ca;--bs-btn-focus-shadow-rgb: 49, 132, 253;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #0a58ca;--bs-btn-active-border-color: #0a53be;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #0d6efd;--bs-btn-disabled-border-color: #0d6efd}.btn-secondary{--bs-btn-color: #ffffff;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #5c636a;--bs-btn-hover-border-color: #565e64;--bs-btn-focus-shadow-rgb: 130, 138, 145;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #565e64;--bs-btn-active-border-color: #51585e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}.btn-success{--bs-btn-color: #ffffff;--bs-btn-bg: #198754;--bs-btn-border-color: #198754;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #157347;--bs-btn-hover-border-color: #146c43;--bs-btn-focus-shadow-rgb: 60, 153, 110;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #146c43;--bs-btn-active-border-color: #13653f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #198754;--bs-btn-disabled-border-color: #198754}.btn-info{--bs-btn-color: #000;--bs-btn-bg: #0dcaf0;--bs-btn-border-color: #0dcaf0;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #31d2f2;--bs-btn-hover-border-color: #25cff2;--bs-btn-focus-shadow-rgb: 11, 172, 204;--bs-btn-active-color: #000;--bs-btn-active-bg: #3dd5f3;--bs-btn-active-border-color: #25cff2;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #0dcaf0;--bs-btn-disabled-border-color: #0dcaf0}.btn-warning{--bs-btn-color: #000;--bs-btn-bg: #ffc107;--bs-btn-border-color: #ffc107;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ffca2c;--bs-btn-hover-border-color: #ffc720;--bs-btn-focus-shadow-rgb: 217, 164, 6;--bs-btn-active-color: #000;--bs-btn-active-bg: #ffcd39;--bs-btn-active-border-color: #ffc720;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #ffc107;--bs-btn-disabled-border-color: #ffc107}.btn-danger{--bs-btn-color: #ffffff;--bs-btn-bg: #dc3545;--bs-btn-border-color: #dc3545;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #bb2d3b;--bs-btn-hover-border-color: #b02a37;--bs-btn-focus-shadow-rgb: 225, 83, 97;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #b02a37;--bs-btn-active-border-color: #a52834;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #dc3545;--bs-btn-disabled-border-color: #dc3545}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #d3d4d5;--bs-btn-hover-border-color: #c6c7c8;--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: #c6c7c8;--bs-btn-active-border-color: #babbbc;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}.btn-dark{--bs-btn-color: #ffffff;--bs-btn-bg: #212529;--bs-btn-border-color: #212529;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #424649;--bs-btn-hover-border-color: #373b3e;--bs-btn-focus-shadow-rgb: 66, 70, 73;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #4d5154;--bs-btn-active-border-color: #373b3e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #212529;--bs-btn-disabled-border-color: #212529}.btn-outline-default{--bs-btn-color: #dee2e6;--bs-btn-border-color: #dee2e6;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #dee2e6;--bs-btn-hover-border-color: #dee2e6;--bs-btn-focus-shadow-rgb: 222, 226, 230;--bs-btn-active-color: #000;--bs-btn-active-bg: #dee2e6;--bs-btn-active-border-color: #dee2e6;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #dee2e6;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #dee2e6;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #0d6efd;--bs-btn-hover-border-color: #0d6efd;--bs-btn-focus-shadow-rgb: 13, 110, 253;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #0d6efd;--bs-btn-active-border-color: #0d6efd;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #0d6efd;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #0d6efd;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #6c757d;--bs-btn-hover-border-color: #6c757d;--bs-btn-focus-shadow-rgb: 108, 117, 125;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #6c757d;--bs-btn-active-border-color: #6c757d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6c757d;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #198754;--bs-btn-border-color: #198754;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #198754;--bs-btn-hover-border-color: #198754;--bs-btn-focus-shadow-rgb: 25, 135, 84;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #198754;--bs-btn-active-border-color: #198754;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #198754;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #198754;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #0dcaf0;--bs-btn-border-color: #0dcaf0;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #0dcaf0;--bs-btn-hover-border-color: #0dcaf0;--bs-btn-focus-shadow-rgb: 13, 202, 240;--bs-btn-active-color: #000;--bs-btn-active-bg: #0dcaf0;--bs-btn-active-border-color: #0dcaf0;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #0dcaf0;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #0dcaf0;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #ffc107;--bs-btn-border-color: #ffc107;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ffc107;--bs-btn-hover-border-color: #ffc107;--bs-btn-focus-shadow-rgb: 255, 193, 7;--bs-btn-active-color: #000;--bs-btn-active-bg: #ffc107;--bs-btn-active-border-color: #ffc107;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffc107;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ffc107;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #dc3545;--bs-btn-border-color: #dc3545;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #dc3545;--bs-btn-hover-border-color: #dc3545;--bs-btn-focus-shadow-rgb: 220, 53, 69;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #dc3545;--bs-btn-active-border-color: #dc3545;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #dc3545;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #dc3545;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #f8f9fa;--bs-btn-hover-border-color: #f8f9fa;--bs-btn-focus-shadow-rgb: 248, 249, 250;--bs-btn-active-color: #000;--bs-btn-active-bg: #f8f9fa;--bs-btn-active-border-color: #f8f9fa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f8f9fa;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f8f9fa;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #212529;--bs-btn-border-color: #212529;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #212529;--bs-btn-hover-border-color: #212529;--bs-btn-focus-shadow-rgb: 33, 37, 41;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #212529;--bs-btn-active-border-color: #212529;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #212529;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #212529;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #0d6efd;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #0a58ca;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #0a58ca;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 49, 132, 253;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.25rem}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #212529;--bs-dropdown-bg: #ffffff;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-border-radius: 0.375rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.375rem - 1px);--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #212529;--bs-dropdown-link-hover-color: #212529;--bs-dropdown-link-hover-bg: #f8f9fa;--bs-dropdown-link-active-color: #ffffff;--bs-dropdown-link-active-bg: #0d6efd;--bs-dropdown-link-disabled-color: rgba(33, 37, 41, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #ffffff;--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #ffffff;--bs-dropdown-link-active-bg: #0d6efd;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.375rem}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #0d6efd;--bs-nav-link-hover-color: #0a58ca;--bs-nav-link-disabled-color: rgba(33, 37, 41, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: white;--bs-nav-tabs-border-radius: 0.375rem;--bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef white;--bs-nav-tabs-link-active-color: #000;--bs-nav-tabs-link-active-bg: #ffffff;--bs-nav-tabs-link-active-border-color: white white #ffffff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: 0.375rem;--bs-nav-pills-link-active-color: #ffffff;--bs-nav-pills-link-active-bg: #0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 0.5rem;--bs-navbar-color: #fdfefe;--bs-navbar-hover-color: rgba(253, 254, 255, 0.8);--bs-navbar-disabled-color: rgba(253, 254, 254, 0.75);--bs-navbar-active-color: #fdfeff;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #fdfefe;--bs-navbar-brand-hover-color: #fdfeff;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfefe' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(253, 254, 254, 0);--bs-navbar-toggler-border-radius: 0.375rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #fdfefe;--bs-navbar-hover-color: rgba(253, 254, 255, 0.8);--bs-navbar-disabled-color: rgba(253, 254, 254, 0.75);--bs-navbar-active-color: #fdfeff;--bs-navbar-brand-color: #fdfefe;--bs-navbar-brand-hover-color: #fdfeff;--bs-navbar-toggler-border-color: rgba(253, 254, 254, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfefe' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfefe' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.375rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.375rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(33, 37, 41, 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #ffffff;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color: #212529;--bs-accordion-bg: #ffffff;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: white;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.375rem;--bs-accordion-inner-border-radius: calc(0.375rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #212529;--bs-accordion-btn-bg: #ffffff;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23052c65'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #86b7fe;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #052c65;--bs-accordion-active-bg: #cfe2ff}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: rgba(33, 37, 41, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(33, 37, 41, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #0d6efd;--bs-pagination-bg: #ffffff;--bs-pagination-border-width: 1px;--bs-pagination-border-color: white;--bs-pagination-border-radius: 0.375rem;--bs-pagination-hover-color: #0a58ca;--bs-pagination-hover-bg: #f8f9fa;--bs-pagination-hover-border-color: white;--bs-pagination-focus-color: #0a58ca;--bs-pagination-focus-bg: #e9ecef;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color: #ffffff;--bs-pagination-active-bg: #0d6efd;--bs-pagination-active-border-color: #0d6efd;--bs-pagination-disabled-color: rgba(33, 37, 41, 0.75);--bs-pagination-disabled-bg: #e9ecef;--bs-pagination-disabled-border-color: white;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(1px*-1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.25rem}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #ffffff;--bs-badge-border-radius: 0.375rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 1px solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.375rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #e9ecef;--bs-progress-border-radius: 0.375rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #ffffff;--bs-progress-bar-bg: #0d6efd;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #212529;--bs-list-group-bg: #ffffff;--bs-list-group-border-color: white;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.375rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(33, 37, 41, 0.75);--bs-list-group-action-hover-color: #000;--bs-list-group-action-hover-bg: #f8f9fa;--bs-list-group-action-active-color: #212529;--bs-list-group-action-active-bg: #e9ecef;--bs-list-group-disabled-color: rgba(33, 37, 41, 0.75);--bs-list-group-disabled-bg: #ffffff;--bs-list-group-active-color: #ffffff;--bs-list-group-active-bg: #0d6efd;--bs-list-group-active-border-color: #0d6efd;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #000;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.5;--bs-btn-close-hover-opacity: 0.75;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(255, 255, 255, 0.85);--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.375rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(33, 37, 41, 0.75);--bs-toast-header-bg: rgba(255, 255, 255, 0.85);--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #ffffff;--bs-modal-border-color: rgba(0, 0, 0, 0.175);--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: white;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: white;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #ffffff;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.375rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #ffffff;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #e9ecef;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #212529;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ffffff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ffffff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #212529;--bs-offcanvas-bg: #ffffff;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: rgba(0, 0, 0, 0.175);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#000 !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#000 !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#000 !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(229, 232, 235, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(229, 232, 235, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#000}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#000}.bg-warning{color:#000}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #0d6efd;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #d63384;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #d63384;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #dc3545;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ffc107;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ffc107;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #198754;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #0dcaf0;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #dee2e6}.bg-default{--bslib-color-bg: #dee2e6;--bslib-color-fg: #000}.text-primary{--bslib-color-fg: #0d6efd}.bg-primary{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #ffffff}.text-success{--bslib-color-fg: #198754}.bg-success{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff}.text-info{--bslib-color-fg: #0dcaf0}.bg-info{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000}.text-warning{--bslib-color-fg: #ffc107}.bg-warning{--bslib-color-bg: #ffc107;--bslib-color-fg: #000}.text-danger{--bslib-color-fg: #dc3545}.bg-danger{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #212529}.bg-dark{--bslib-color-bg: #212529;--bslib-color-fg: #ffffff}.bg-gradient-blue-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #3148f9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3148f9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #345ce5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #345ce5;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #5d56cd;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #5d56cd;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #6057b3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #6057b3;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #6d74a0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #6d74a0;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #000;--bslib-color-bg: #6e8f9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #6e8f9b;color:#000}.bg-gradient-blue-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #1278b9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #1278b9;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #000;--bslib-color-bg: #1592d4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1592d4;color:#000}.bg-gradient-blue-cyan{--bslib-color-fg: #000;--bslib-color-bg: #0d93f8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #0d93f8;color:#000}.bg-gradient-indigo-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #4236f6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #4236f6;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #931ec6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #931ec6;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #951fad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #951fad;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #ffffff;--bslib-color-bg: #a35794;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #a35794;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #4740b3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #4740b3;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #ffffff;--bslib-color-bg: #425af1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #425af1;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #4854d9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #4854d9;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #983ca9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #983ca9;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #9b3d8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #9b3d8f;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #000;--bslib-color-bg: #a97577;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #a97577;color:#000}.bg-gradient-purple-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #4d5e95;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #4d5e95;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #000;--bslib-color-bg: #4878d4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #4878d4;color:#000}.bg-gradient-pink-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #864bb4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #864bb4;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #a925b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #a925b0;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #ad399c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #ad399c;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #d8346b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #d8346b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #000;--bslib-color-bg: #e65157;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #e65157;color:#000}.bg-gradient-pink-yellow{--bslib-color-fg: #000;--bslib-color-bg: #e66c52;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #e66c52;color:#000}.bg-gradient-pink-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #8a5571;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #8a5571;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #000;--bslib-color-bg: #8d6f8c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #8d6f8c;color:#000}.bg-gradient-pink-cyan{--bslib-color-fg: #000;--bslib-color-bg: #866faf;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #866faf;color:#000}.bg-gradient-red-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #894c8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #894c8f;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #ad268a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #ad268a;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #b03a77;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b03a77;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #da345e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #da345e;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #000;--bslib-color-bg: #e95231;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #e95231;color:#000}.bg-gradient-red-yellow{--bslib-color-fg: #000;--bslib-color-bg: #ea6d2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #ea6d2c;color:#000}.bg-gradient-red-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #8e564b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #8e564b;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #000;--bslib-color-bg: #917066;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #917066;color:#000}.bg-gradient-red-cyan{--bslib-color-fg: #000;--bslib-color-bg: #897189;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #897189;color:#000}.bg-gradient-orange-blue{--bslib-color-fg: #000;--bslib-color-bg: #9d7871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #9d7871;color:#000}.bg-gradient-orange-indigo{--bslib-color-fg: #000;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#000}.bg-gradient-orange-purple{--bslib-color-fg: #000;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#000}.bg-gradient-orange-pink{--bslib-color-fg: #000;--bslib-color-bg: #ed6041;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #ed6041;color:#000}.bg-gradient-orange-red{--bslib-color-fg: #000;--bslib-color-bg: #f06128;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #f06128;color:#000}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #fe990f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #fe990f;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a2822e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #a2822e;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #000;--bslib-color-bg: #9d9c6c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #9d9c6c;color:#000}.bg-gradient-yellow-blue{--bslib-color-fg: #000;--bslib-color-bg: #9ea069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #9ea069;color:#000}.bg-gradient-yellow-indigo{--bslib-color-fg: #000;--bslib-color-bg: #c27a65;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c27a65;color:#000}.bg-gradient-yellow-purple{--bslib-color-fg: #000;--bslib-color-bg: #c58e51;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c58e51;color:#000}.bg-gradient-yellow-pink{--bslib-color-fg: #000;--bslib-color-bg: #ef8839;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #ef8839;color:#000}.bg-gradient-yellow-red{--bslib-color-fg: #000;--bslib-color-bg: #f18920;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #f18920;color:#000}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #fea60c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #fea60c;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #000;--bslib-color-bg: #a3aa26;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #a3aa26;color:#000}.bg-gradient-yellow-teal{--bslib-color-fg: #000;--bslib-color-bg: #a6c441;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6c441;color:#000}.bg-gradient-yellow-cyan{--bslib-color-fg: #000;--bslib-color-bg: #9ec564;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #9ec564;color:#000}.bg-gradient-green-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #147d98;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #147d98;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #385793;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #385793;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #3b6b80;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3b6b80;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #656567;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #656567;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #67664e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #67664e;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #74833a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #74833a;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #000;--bslib-color-bg: #759e35;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #759e35;color:#000}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #1ca16f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1ca16f;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #000;--bslib-color-bg: #14a292;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #14a292;color:#000}.bg-gradient-teal-blue{--bslib-color-fg: #000;--bslib-color-bg: #18a5c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #18a5c0;color:#000}.bg-gradient-teal-indigo{--bslib-color-fg: #000;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#000}.bg-gradient-teal-purple{--bslib-color-fg: #000;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#000}.bg-gradient-teal-pink{--bslib-color-fg: #000;--bslib-color-bg: #698d8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #698d8f;color:#000}.bg-gradient-teal-red{--bslib-color-fg: #000;--bslib-color-bg: #6b8e76;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #6b8e76;color:#000}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #000;--bslib-color-bg: #79c65d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #79c65d;color:#000}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #1daf7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #1daf7c;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #000;--bslib-color-bg: #18c9bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #18c9bb;color:#000}.bg-gradient-cyan-blue{--bslib-color-fg: #000;--bslib-color-bg: #0da5f5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #0da5f5;color:#000}.bg-gradient-cyan-indigo{--bslib-color-fg: #000;--bslib-color-bg: #3180f1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3180f1;color:#000}.bg-gradient-cyan-purple{--bslib-color-fg: #000;--bslib-color-bg: #3494dd;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3494dd;color:#000}.bg-gradient-cyan-pink{--bslib-color-fg: #000;--bslib-color-bg: #5d8ec5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #5d8ec5;color:#000}.bg-gradient-cyan-red{--bslib-color-fg: #000;--bslib-color-bg: #608eac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #608eac;color:#000}.bg-gradient-cyan-orange{--bslib-color-fg: #000;--bslib-color-bg: #6dac98;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #6dac98;color:#000}.bg-gradient-cyan-yellow{--bslib-color-fg: #000;--bslib-color-bg: #6ec693;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #6ec693;color:#000}.bg-gradient-cyan-green{--bslib-color-fg: #000;--bslib-color-bg: #12afb2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #12afb2;color:#000}.bg-gradient-cyan-teal{--bslib-color-fg: #000;--bslib-color-bg: #15cacc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #15cacc;color:#000}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.bg-blue{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #0d6efd;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #d63384;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #d63384;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #dc3545;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ffc107;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ffc107;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #198754;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #0dcaf0;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #dee2e6}.bg-default{--bslib-color-bg: #dee2e6;--bslib-color-fg: #000}.text-primary{--bslib-color-fg: #0d6efd}.bg-primary{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #ffffff}.text-success{--bslib-color-fg: #198754}.bg-success{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff}.text-info{--bslib-color-fg: #0dcaf0}.bg-info{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000}.text-warning{--bslib-color-fg: #ffc107}.bg-warning{--bslib-color-bg: #ffc107;--bslib-color-fg: #000}.text-danger{--bslib-color-fg: #dc3545}.bg-danger{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #212529}.bg-dark{--bslib-color-bg: #212529;--bslib-color-fg: #ffffff}.bg-gradient-blue-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #3148f9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3148f9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #345ce5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #345ce5;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #5d56cd;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #5d56cd;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #6057b3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #6057b3;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #6d74a0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #6d74a0;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #000;--bslib-color-bg: #6e8f9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #6e8f9b;color:#000}.bg-gradient-blue-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #1278b9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #1278b9;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #000;--bslib-color-bg: #1592d4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1592d4;color:#000}.bg-gradient-blue-cyan{--bslib-color-fg: #000;--bslib-color-bg: #0d93f8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #0d93f8;color:#000}.bg-gradient-indigo-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #4236f6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #4236f6;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #931ec6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #931ec6;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #951fad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #951fad;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #ffffff;--bslib-color-bg: #a35794;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #a35794;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #4740b3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #4740b3;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #ffffff;--bslib-color-bg: #425af1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #425af1;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #4854d9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #4854d9;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #983ca9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #983ca9;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #9b3d8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #9b3d8f;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #000;--bslib-color-bg: #a97577;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #a97577;color:#000}.bg-gradient-purple-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #4d5e95;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #4d5e95;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #000;--bslib-color-bg: #4878d4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #4878d4;color:#000}.bg-gradient-pink-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #864bb4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #864bb4;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #a925b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #a925b0;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #ad399c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #ad399c;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #d8346b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #d8346b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #000;--bslib-color-bg: #e65157;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #e65157;color:#000}.bg-gradient-pink-yellow{--bslib-color-fg: #000;--bslib-color-bg: #e66c52;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #e66c52;color:#000}.bg-gradient-pink-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #8a5571;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #8a5571;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #000;--bslib-color-bg: #8d6f8c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #8d6f8c;color:#000}.bg-gradient-pink-cyan{--bslib-color-fg: #000;--bslib-color-bg: #866faf;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #866faf;color:#000}.bg-gradient-red-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #894c8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #894c8f;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #ad268a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #ad268a;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #b03a77;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b03a77;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #da345e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #da345e;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #000;--bslib-color-bg: #e95231;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #e95231;color:#000}.bg-gradient-red-yellow{--bslib-color-fg: #000;--bslib-color-bg: #ea6d2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #ea6d2c;color:#000}.bg-gradient-red-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #8e564b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #8e564b;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #000;--bslib-color-bg: #917066;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #917066;color:#000}.bg-gradient-red-cyan{--bslib-color-fg: #000;--bslib-color-bg: #897189;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #897189;color:#000}.bg-gradient-orange-blue{--bslib-color-fg: #000;--bslib-color-bg: #9d7871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #9d7871;color:#000}.bg-gradient-orange-indigo{--bslib-color-fg: #000;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#000}.bg-gradient-orange-purple{--bslib-color-fg: #000;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#000}.bg-gradient-orange-pink{--bslib-color-fg: #000;--bslib-color-bg: #ed6041;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #ed6041;color:#000}.bg-gradient-orange-red{--bslib-color-fg: #000;--bslib-color-bg: #f06128;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #f06128;color:#000}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #fe990f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #fe990f;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a2822e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #a2822e;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #000;--bslib-color-bg: #9d9c6c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #9d9c6c;color:#000}.bg-gradient-yellow-blue{--bslib-color-fg: #000;--bslib-color-bg: #9ea069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #9ea069;color:#000}.bg-gradient-yellow-indigo{--bslib-color-fg: #000;--bslib-color-bg: #c27a65;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c27a65;color:#000}.bg-gradient-yellow-purple{--bslib-color-fg: #000;--bslib-color-bg: #c58e51;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c58e51;color:#000}.bg-gradient-yellow-pink{--bslib-color-fg: #000;--bslib-color-bg: #ef8839;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #ef8839;color:#000}.bg-gradient-yellow-red{--bslib-color-fg: #000;--bslib-color-bg: #f18920;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #f18920;color:#000}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #fea60c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #fea60c;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #000;--bslib-color-bg: #a3aa26;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #a3aa26;color:#000}.bg-gradient-yellow-teal{--bslib-color-fg: #000;--bslib-color-bg: #a6c441;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6c441;color:#000}.bg-gradient-yellow-cyan{--bslib-color-fg: #000;--bslib-color-bg: #9ec564;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #9ec564;color:#000}.bg-gradient-green-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #147d98;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #147d98;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #385793;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #385793;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #3b6b80;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3b6b80;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #656567;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #656567;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #67664e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #67664e;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #74833a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #74833a;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #000;--bslib-color-bg: #759e35;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #759e35;color:#000}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #1ca16f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1ca16f;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #000;--bslib-color-bg: #14a292;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #14a292;color:#000}.bg-gradient-teal-blue{--bslib-color-fg: #000;--bslib-color-bg: #18a5c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #18a5c0;color:#000}.bg-gradient-teal-indigo{--bslib-color-fg: #000;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#000}.bg-gradient-teal-purple{--bslib-color-fg: #000;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#000}.bg-gradient-teal-pink{--bslib-color-fg: #000;--bslib-color-bg: #698d8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #698d8f;color:#000}.bg-gradient-teal-red{--bslib-color-fg: #000;--bslib-color-bg: #6b8e76;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #6b8e76;color:#000}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #000;--bslib-color-bg: #79c65d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #79c65d;color:#000}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #1daf7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #1daf7c;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #000;--bslib-color-bg: #18c9bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #18c9bb;color:#000}.bg-gradient-cyan-blue{--bslib-color-fg: #000;--bslib-color-bg: #0da5f5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #0da5f5;color:#000}.bg-gradient-cyan-indigo{--bslib-color-fg: #000;--bslib-color-bg: #3180f1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3180f1;color:#000}.bg-gradient-cyan-purple{--bslib-color-fg: #000;--bslib-color-bg: #3494dd;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3494dd;color:#000}.bg-gradient-cyan-pink{--bslib-color-fg: #000;--bslib-color-bg: #5d8ec5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #5d8ec5;color:#000}.bg-gradient-cyan-red{--bslib-color-fg: #000;--bslib-color-bg: #608eac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #608eac;color:#000}.bg-gradient-cyan-orange{--bslib-color-fg: #000;--bslib-color-bg: #6dac98;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #6dac98;color:#000}.bg-gradient-cyan-yellow{--bslib-color-fg: #000;--bslib-color-bg: #6ec693;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #6ec693;color:#000}.bg-gradient-cyan-green{--bslib-color-fg: #000;--bslib-color-bg: #12afb2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #12afb2;color:#000}.bg-gradient-cyan-teal{--bslib-color-fg: #000;--bslib-color-bg: #15cacc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #15cacc;color:#000}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #ffffff);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}:root{--bslib-page-sidebar-title-bg: #517699;--bslib-page-sidebar-title-color: #ffffff}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #fff}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.375rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px #fff;border-radius:.375rem;color:#212529;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#fff;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#fff;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#fff;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#212529}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:rgba(33,37,41,.75)}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}dd code:not(.sourceCode),p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}.callout pre.sourceCode{padding-left:0}div.ansi-escaped-output{font-family:monospace;display:block}/*! +* +* ansi colors from IPython notebook's +* +* we also add `bright-[color]-` synonyms for the `-[color]-intense` classes since +* that seems to be what ansi_up emits +* +*/.ansi-black-fg{color:#3e424d}.ansi-black-bg{background-color:#3e424d}.ansi-black-intense-black,.ansi-bright-black-fg{color:#282c36}.ansi-black-intense-black,.ansi-bright-black-bg{background-color:#282c36}.ansi-red-fg{color:#e75c58}.ansi-red-bg{background-color:#e75c58}.ansi-red-intense-red,.ansi-bright-red-fg{color:#b22b31}.ansi-red-intense-red,.ansi-bright-red-bg{background-color:#b22b31}.ansi-green-fg{color:#00a250}.ansi-green-bg{background-color:#00a250}.ansi-green-intense-green,.ansi-bright-green-fg{color:#007427}.ansi-green-intense-green,.ansi-bright-green-bg{background-color:#007427}.ansi-yellow-fg{color:#ddb62b}.ansi-yellow-bg{background-color:#ddb62b}.ansi-yellow-intense-yellow,.ansi-bright-yellow-fg{color:#b27d12}.ansi-yellow-intense-yellow,.ansi-bright-yellow-bg{background-color:#b27d12}.ansi-blue-fg{color:#208ffb}.ansi-blue-bg{background-color:#208ffb}.ansi-blue-intense-blue,.ansi-bright-blue-fg{color:#0065ca}.ansi-blue-intense-blue,.ansi-bright-blue-bg{background-color:#0065ca}.ansi-magenta-fg{color:#d160c4}.ansi-magenta-bg{background-color:#d160c4}.ansi-magenta-intense-magenta,.ansi-bright-magenta-fg{color:#a03196}.ansi-magenta-intense-magenta,.ansi-bright-magenta-bg{background-color:#a03196}.ansi-cyan-fg{color:#60c6c8}.ansi-cyan-bg{background-color:#60c6c8}.ansi-cyan-intense-cyan,.ansi-bright-cyan-fg{color:#258f8f}.ansi-cyan-intense-cyan,.ansi-bright-cyan-bg{background-color:#258f8f}.ansi-white-fg{color:#c5c1b4}.ansi-white-bg{background-color:#c5c1b4}.ansi-white-intense-white,.ansi-bright-white-fg{color:#a1a6b2}.ansi-white-intense-white,.ansi-bright-white-bg{background-color:#a1a6b2}.ansi-default-inverse-fg{color:#fff}.ansi-default-inverse-bg{background-color:#000}.ansi-bold{font-weight:bold}.ansi-underline{text-decoration:underline}:root{--quarto-body-bg: #ffffff;--quarto-body-color: #212529;--quarto-text-muted: rgba(33, 37, 41, 0.75);--quarto-border-color: white;--quarto-border-width: 1px;--quarto-border-radius: 0.375rem}table.gt_table{color:var(--quarto-body-color);font-size:1em;width:100%;background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_column_spanner_outer{color:var(--quarto-body-color);background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_col_heading{color:var(--quarto-body-color);font-weight:bold;background-color:rgba(0,0,0,0)}table.gt_table thead.gt_col_headings{border-bottom:1px solid currentColor;border-top-width:inherit;border-top-color:var(--quarto-border-color)}table.gt_table thead.gt_col_headings:not(:first-child){border-top-width:1px;border-top-color:var(--quarto-border-color)}table.gt_table td.gt_row{border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-width:0px}table.gt_table tbody.gt_table_body{border-top-width:1px;border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-color:currentColor}div.columns{display:initial;gap:initial}div.column{display:inline-block;overflow-x:initial;vertical-align:top;width:50%}.code-annotation-tip-content{word-wrap:break-word}.code-annotation-container-hidden{display:none !important}dl.code-annotation-container-grid{display:grid;grid-template-columns:min-content auto}dl.code-annotation-container-grid dt{grid-column:1}dl.code-annotation-container-grid dd{grid-column:2}pre.sourceCode.code-annotation-code{padding-right:0}code.sourceCode .code-annotation-anchor{z-index:100;position:relative;float:right;background-color:rgba(0,0,0,0)}input[type=checkbox]{margin-right:.5ch}:root{--mermaid-bg-color: #ffffff;--mermaid-edge-color: #6c757d;--mermaid-node-fg-color: #212529;--mermaid-fg-color: #212529;--mermaid-fg-color--lighter: #383f45;--mermaid-fg-color--lightest: #4e5862;--mermaid-font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, Noto Sans, Liberation Sans, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;--mermaid-label-bg-color: #ffffff;--mermaid-label-fg-color: #0d6efd;--mermaid-node-bg-color: rgba(13, 110, 253, 0.1);--mermaid-node-fg-color: #212529}@media print{:root{font-size:11pt}#quarto-sidebar,#TOC,.nav-page{display:none}.page-columns .content{grid-column-start:page-start}.fixed-top{position:relative}.panel-caption,.figure-caption,figcaption{color:#666}}.code-copy-button{position:absolute;top:0;right:0;border:0;margin-top:5px;margin-right:5px;background-color:rgba(0,0,0,0);z-index:3}.code-copy-button:focus{outline:none}.code-copy-button-tooltip{font-size:.75em}pre.sourceCode:hover>.code-copy-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}pre.sourceCode:hover>.code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button-checked:hover>.bi::before{background-image:url('data:image/svg+xml,')}main ol ol,main ul ul,main ol ul,main ul ol{margin-bottom:1em}ul>li:not(:has(>p))>ul,ol>li:not(:has(>p))>ul,ul>li:not(:has(>p))>ol,ol>li:not(:has(>p))>ol{margin-bottom:0}ul>li:not(:has(>p))>ul>li:has(>p),ol>li:not(:has(>p))>ul>li:has(>p),ul>li:not(:has(>p))>ol>li:has(>p),ol>li:not(:has(>p))>ol>li:has(>p){margin-top:1rem}body{margin:0}main.page-columns>header>h1.title,main.page-columns>header>.title.h1{margin-bottom:0}@media(min-width: 992px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] 35px [page-end-inset page-end] 5fr [screen-end-inset] 1.5em}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 3em [body-end] 50px [body-end-outset] minmax(0px, 250px) [page-end-inset] minmax(50px, 100px) [page-end] 1fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 100px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 150px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 991.98px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(1250px - 3em)) [body-content-end body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 767.98px){body .page-columns,body.fullcontent:not(.floating):not(.docked) .page-columns,body.slimcontent:not(.floating):not(.docked) .page-columns,body.docked .page-columns,body.docked.slimcontent .page-columns,body.docked.fullcontent .page-columns,body.floating .page-columns,body.floating.slimcontent .page-columns,body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}nav[role=doc-toc]{display:none}}body,.page-row-navigation{grid-template-rows:[page-top] max-content [contents-top] max-content [contents-bottom] max-content [page-bottom]}.page-rows-contents{grid-template-rows:[content-top] minmax(max-content, 1fr) [content-bottom] minmax(60px, max-content) [page-bottom]}.page-full{grid-column:screen-start/screen-end !important}.page-columns>*{grid-column:body-content-start/body-content-end}.page-columns.column-page>*{grid-column:page-start/page-end}.page-columns.column-page-left .page-columns.page-full>*,.page-columns.column-page-left>*{grid-column:page-start/body-content-end}.page-columns.column-page-right .page-columns.page-full>*,.page-columns.column-page-right>*{grid-column:body-content-start/page-end}.page-rows{grid-auto-rows:auto}.header{grid-column:screen-start/screen-end;grid-row:page-top/contents-top}#quarto-content{padding:0;grid-column:screen-start/screen-end;grid-row:contents-top/contents-bottom}body.floating .sidebar.sidebar-navigation{grid-column:page-start/body-start;grid-row:content-top/page-bottom}body.docked .sidebar.sidebar-navigation{grid-column:screen-start/body-start;grid-row:content-top/page-bottom}.sidebar.toc-left{grid-column:page-start/body-start;grid-row:content-top/page-bottom}.sidebar.margin-sidebar{grid-column:body-end/page-end;grid-row:content-top/page-bottom}.page-columns .content{grid-column:body-content-start/body-content-end;grid-row:content-top/content-bottom;align-content:flex-start}.page-columns .page-navigation{grid-column:body-content-start/body-content-end;grid-row:content-bottom/page-bottom}.page-columns .footer{grid-column:screen-start/screen-end;grid-row:contents-bottom/page-bottom}.page-columns .column-body{grid-column:body-content-start/body-content-end}.page-columns .column-body-fullbleed{grid-column:body-start/body-end}.page-columns .column-body-outset{grid-column:body-start-outset/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset table{background:#fff}.page-columns .column-body-outset-left{grid-column:body-start-outset/body-content-end;z-index:998;opacity:.999}.page-columns .column-body-outset-left table{background:#fff}.page-columns .column-body-outset-right{grid-column:body-content-start/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset-right table{background:#fff}.page-columns .column-page{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-page table{background:#fff}.page-columns .column-page-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset table{background:#fff}.page-columns .column-page-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-inset-left table{background:#fff}.page-columns .column-page-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset-right figcaption table{background:#fff}.page-columns .column-page-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-left table{background:#fff}.page-columns .column-page-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-page-right figcaption table{background:#fff}#quarto-content.page-columns #quarto-margin-sidebar,#quarto-content.page-columns #quarto-sidebar{z-index:1}@media(max-width: 991.98px){#quarto-content.page-columns #quarto-margin-sidebar.collapse,#quarto-content.page-columns #quarto-sidebar.collapse,#quarto-content.page-columns #quarto-margin-sidebar.collapsing,#quarto-content.page-columns #quarto-sidebar.collapsing{z-index:1055}}#quarto-content.page-columns main.column-page,#quarto-content.page-columns main.column-page-right,#quarto-content.page-columns main.column-page-left{z-index:0}.page-columns .column-screen-inset{grid-column:screen-start-inset/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:screen-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:screen-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:screen-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:screen-start/screen-end;padding:1em;background:#f8f9fa;z-index:998;opacity:.999;margin-bottom:1em}.zindex-content{z-index:998;opacity:.999}.zindex-modal{z-index:1055;opacity:.999}.zindex-over-content{z-index:999;opacity:.999}img.img-fluid.column-screen,img.img-fluid.column-screen-inset-shaded,img.img-fluid.column-screen-inset,img.img-fluid.column-screen-inset-left,img.img-fluid.column-screen-inset-right,img.img-fluid.column-screen-left,img.img-fluid.column-screen-right{width:100%}@media(min-width: 992px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.column-sidebar{grid-column:page-start/body-start !important;z-index:998}.column-leftmargin{grid-column:screen-start-inset/body-start !important;z-index:998}.no-row-height{height:1em;overflow:visible}}@media(max-width: 991.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.no-row-height{height:1em;overflow:visible}.page-columns.page-full{overflow:visible}.page-columns.toc-left .margin-caption,.page-columns.toc-left div.aside,.page-columns.toc-left aside:not(.footnotes):not(.sidebar),.page-columns.toc-left .column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.page-columns.toc-left .no-row-height{height:initial;overflow:initial}}@media(max-width: 767.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.no-row-height{height:initial;overflow:initial}#quarto-margin-sidebar{display:none}#quarto-sidebar-toc-left{display:none}.hidden-sm{display:none}}.panel-grid{display:grid;grid-template-rows:repeat(1, 1fr);grid-template-columns:repeat(24, 1fr);gap:1em}.panel-grid .g-col-1{grid-column:auto/span 1}.panel-grid .g-col-2{grid-column:auto/span 2}.panel-grid .g-col-3{grid-column:auto/span 3}.panel-grid .g-col-4{grid-column:auto/span 4}.panel-grid .g-col-5{grid-column:auto/span 5}.panel-grid .g-col-6{grid-column:auto/span 6}.panel-grid .g-col-7{grid-column:auto/span 7}.panel-grid .g-col-8{grid-column:auto/span 8}.panel-grid .g-col-9{grid-column:auto/span 9}.panel-grid .g-col-10{grid-column:auto/span 10}.panel-grid .g-col-11{grid-column:auto/span 11}.panel-grid .g-col-12{grid-column:auto/span 12}.panel-grid .g-col-13{grid-column:auto/span 13}.panel-grid .g-col-14{grid-column:auto/span 14}.panel-grid .g-col-15{grid-column:auto/span 15}.panel-grid .g-col-16{grid-column:auto/span 16}.panel-grid .g-col-17{grid-column:auto/span 17}.panel-grid .g-col-18{grid-column:auto/span 18}.panel-grid .g-col-19{grid-column:auto/span 19}.panel-grid .g-col-20{grid-column:auto/span 20}.panel-grid .g-col-21{grid-column:auto/span 21}.panel-grid .g-col-22{grid-column:auto/span 22}.panel-grid .g-col-23{grid-column:auto/span 23}.panel-grid .g-col-24{grid-column:auto/span 24}.panel-grid .g-start-1{grid-column-start:1}.panel-grid .g-start-2{grid-column-start:2}.panel-grid .g-start-3{grid-column-start:3}.panel-grid .g-start-4{grid-column-start:4}.panel-grid .g-start-5{grid-column-start:5}.panel-grid .g-start-6{grid-column-start:6}.panel-grid .g-start-7{grid-column-start:7}.panel-grid .g-start-8{grid-column-start:8}.panel-grid .g-start-9{grid-column-start:9}.panel-grid .g-start-10{grid-column-start:10}.panel-grid .g-start-11{grid-column-start:11}.panel-grid .g-start-12{grid-column-start:12}.panel-grid .g-start-13{grid-column-start:13}.panel-grid .g-start-14{grid-column-start:14}.panel-grid .g-start-15{grid-column-start:15}.panel-grid .g-start-16{grid-column-start:16}.panel-grid .g-start-17{grid-column-start:17}.panel-grid .g-start-18{grid-column-start:18}.panel-grid .g-start-19{grid-column-start:19}.panel-grid .g-start-20{grid-column-start:20}.panel-grid .g-start-21{grid-column-start:21}.panel-grid .g-start-22{grid-column-start:22}.panel-grid .g-start-23{grid-column-start:23}@media(min-width: 576px){.panel-grid .g-col-sm-1{grid-column:auto/span 1}.panel-grid .g-col-sm-2{grid-column:auto/span 2}.panel-grid .g-col-sm-3{grid-column:auto/span 3}.panel-grid .g-col-sm-4{grid-column:auto/span 4}.panel-grid .g-col-sm-5{grid-column:auto/span 5}.panel-grid .g-col-sm-6{grid-column:auto/span 6}.panel-grid .g-col-sm-7{grid-column:auto/span 7}.panel-grid .g-col-sm-8{grid-column:auto/span 8}.panel-grid .g-col-sm-9{grid-column:auto/span 9}.panel-grid .g-col-sm-10{grid-column:auto/span 10}.panel-grid .g-col-sm-11{grid-column:auto/span 11}.panel-grid .g-col-sm-12{grid-column:auto/span 12}.panel-grid .g-col-sm-13{grid-column:auto/span 13}.panel-grid .g-col-sm-14{grid-column:auto/span 14}.panel-grid .g-col-sm-15{grid-column:auto/span 15}.panel-grid .g-col-sm-16{grid-column:auto/span 16}.panel-grid .g-col-sm-17{grid-column:auto/span 17}.panel-grid .g-col-sm-18{grid-column:auto/span 18}.panel-grid .g-col-sm-19{grid-column:auto/span 19}.panel-grid .g-col-sm-20{grid-column:auto/span 20}.panel-grid .g-col-sm-21{grid-column:auto/span 21}.panel-grid .g-col-sm-22{grid-column:auto/span 22}.panel-grid .g-col-sm-23{grid-column:auto/span 23}.panel-grid .g-col-sm-24{grid-column:auto/span 24}.panel-grid .g-start-sm-1{grid-column-start:1}.panel-grid .g-start-sm-2{grid-column-start:2}.panel-grid .g-start-sm-3{grid-column-start:3}.panel-grid .g-start-sm-4{grid-column-start:4}.panel-grid .g-start-sm-5{grid-column-start:5}.panel-grid .g-start-sm-6{grid-column-start:6}.panel-grid .g-start-sm-7{grid-column-start:7}.panel-grid .g-start-sm-8{grid-column-start:8}.panel-grid .g-start-sm-9{grid-column-start:9}.panel-grid .g-start-sm-10{grid-column-start:10}.panel-grid .g-start-sm-11{grid-column-start:11}.panel-grid .g-start-sm-12{grid-column-start:12}.panel-grid .g-start-sm-13{grid-column-start:13}.panel-grid .g-start-sm-14{grid-column-start:14}.panel-grid .g-start-sm-15{grid-column-start:15}.panel-grid .g-start-sm-16{grid-column-start:16}.panel-grid .g-start-sm-17{grid-column-start:17}.panel-grid .g-start-sm-18{grid-column-start:18}.panel-grid .g-start-sm-19{grid-column-start:19}.panel-grid .g-start-sm-20{grid-column-start:20}.panel-grid .g-start-sm-21{grid-column-start:21}.panel-grid .g-start-sm-22{grid-column-start:22}.panel-grid .g-start-sm-23{grid-column-start:23}}@media(min-width: 768px){.panel-grid .g-col-md-1{grid-column:auto/span 1}.panel-grid .g-col-md-2{grid-column:auto/span 2}.panel-grid .g-col-md-3{grid-column:auto/span 3}.panel-grid .g-col-md-4{grid-column:auto/span 4}.panel-grid .g-col-md-5{grid-column:auto/span 5}.panel-grid .g-col-md-6{grid-column:auto/span 6}.panel-grid .g-col-md-7{grid-column:auto/span 7}.panel-grid .g-col-md-8{grid-column:auto/span 8}.panel-grid .g-col-md-9{grid-column:auto/span 9}.panel-grid .g-col-md-10{grid-column:auto/span 10}.panel-grid .g-col-md-11{grid-column:auto/span 11}.panel-grid .g-col-md-12{grid-column:auto/span 12}.panel-grid .g-col-md-13{grid-column:auto/span 13}.panel-grid .g-col-md-14{grid-column:auto/span 14}.panel-grid .g-col-md-15{grid-column:auto/span 15}.panel-grid .g-col-md-16{grid-column:auto/span 16}.panel-grid .g-col-md-17{grid-column:auto/span 17}.panel-grid .g-col-md-18{grid-column:auto/span 18}.panel-grid .g-col-md-19{grid-column:auto/span 19}.panel-grid .g-col-md-20{grid-column:auto/span 20}.panel-grid .g-col-md-21{grid-column:auto/span 21}.panel-grid .g-col-md-22{grid-column:auto/span 22}.panel-grid .g-col-md-23{grid-column:auto/span 23}.panel-grid .g-col-md-24{grid-column:auto/span 24}.panel-grid .g-start-md-1{grid-column-start:1}.panel-grid .g-start-md-2{grid-column-start:2}.panel-grid .g-start-md-3{grid-column-start:3}.panel-grid .g-start-md-4{grid-column-start:4}.panel-grid .g-start-md-5{grid-column-start:5}.panel-grid .g-start-md-6{grid-column-start:6}.panel-grid .g-start-md-7{grid-column-start:7}.panel-grid .g-start-md-8{grid-column-start:8}.panel-grid .g-start-md-9{grid-column-start:9}.panel-grid .g-start-md-10{grid-column-start:10}.panel-grid .g-start-md-11{grid-column-start:11}.panel-grid .g-start-md-12{grid-column-start:12}.panel-grid .g-start-md-13{grid-column-start:13}.panel-grid .g-start-md-14{grid-column-start:14}.panel-grid .g-start-md-15{grid-column-start:15}.panel-grid .g-start-md-16{grid-column-start:16}.panel-grid .g-start-md-17{grid-column-start:17}.panel-grid .g-start-md-18{grid-column-start:18}.panel-grid .g-start-md-19{grid-column-start:19}.panel-grid .g-start-md-20{grid-column-start:20}.panel-grid .g-start-md-21{grid-column-start:21}.panel-grid .g-start-md-22{grid-column-start:22}.panel-grid .g-start-md-23{grid-column-start:23}}@media(min-width: 992px){.panel-grid .g-col-lg-1{grid-column:auto/span 1}.panel-grid .g-col-lg-2{grid-column:auto/span 2}.panel-grid .g-col-lg-3{grid-column:auto/span 3}.panel-grid .g-col-lg-4{grid-column:auto/span 4}.panel-grid .g-col-lg-5{grid-column:auto/span 5}.panel-grid .g-col-lg-6{grid-column:auto/span 6}.panel-grid .g-col-lg-7{grid-column:auto/span 7}.panel-grid .g-col-lg-8{grid-column:auto/span 8}.panel-grid .g-col-lg-9{grid-column:auto/span 9}.panel-grid .g-col-lg-10{grid-column:auto/span 10}.panel-grid .g-col-lg-11{grid-column:auto/span 11}.panel-grid .g-col-lg-12{grid-column:auto/span 12}.panel-grid .g-col-lg-13{grid-column:auto/span 13}.panel-grid .g-col-lg-14{grid-column:auto/span 14}.panel-grid .g-col-lg-15{grid-column:auto/span 15}.panel-grid .g-col-lg-16{grid-column:auto/span 16}.panel-grid .g-col-lg-17{grid-column:auto/span 17}.panel-grid .g-col-lg-18{grid-column:auto/span 18}.panel-grid .g-col-lg-19{grid-column:auto/span 19}.panel-grid .g-col-lg-20{grid-column:auto/span 20}.panel-grid .g-col-lg-21{grid-column:auto/span 21}.panel-grid .g-col-lg-22{grid-column:auto/span 22}.panel-grid .g-col-lg-23{grid-column:auto/span 23}.panel-grid .g-col-lg-24{grid-column:auto/span 24}.panel-grid .g-start-lg-1{grid-column-start:1}.panel-grid .g-start-lg-2{grid-column-start:2}.panel-grid .g-start-lg-3{grid-column-start:3}.panel-grid .g-start-lg-4{grid-column-start:4}.panel-grid .g-start-lg-5{grid-column-start:5}.panel-grid .g-start-lg-6{grid-column-start:6}.panel-grid .g-start-lg-7{grid-column-start:7}.panel-grid .g-start-lg-8{grid-column-start:8}.panel-grid .g-start-lg-9{grid-column-start:9}.panel-grid .g-start-lg-10{grid-column-start:10}.panel-grid .g-start-lg-11{grid-column-start:11}.panel-grid .g-start-lg-12{grid-column-start:12}.panel-grid .g-start-lg-13{grid-column-start:13}.panel-grid .g-start-lg-14{grid-column-start:14}.panel-grid .g-start-lg-15{grid-column-start:15}.panel-grid .g-start-lg-16{grid-column-start:16}.panel-grid .g-start-lg-17{grid-column-start:17}.panel-grid .g-start-lg-18{grid-column-start:18}.panel-grid .g-start-lg-19{grid-column-start:19}.panel-grid .g-start-lg-20{grid-column-start:20}.panel-grid .g-start-lg-21{grid-column-start:21}.panel-grid .g-start-lg-22{grid-column-start:22}.panel-grid .g-start-lg-23{grid-column-start:23}}@media(min-width: 1200px){.panel-grid .g-col-xl-1{grid-column:auto/span 1}.panel-grid .g-col-xl-2{grid-column:auto/span 2}.panel-grid .g-col-xl-3{grid-column:auto/span 3}.panel-grid .g-col-xl-4{grid-column:auto/span 4}.panel-grid .g-col-xl-5{grid-column:auto/span 5}.panel-grid .g-col-xl-6{grid-column:auto/span 6}.panel-grid .g-col-xl-7{grid-column:auto/span 7}.panel-grid .g-col-xl-8{grid-column:auto/span 8}.panel-grid .g-col-xl-9{grid-column:auto/span 9}.panel-grid .g-col-xl-10{grid-column:auto/span 10}.panel-grid .g-col-xl-11{grid-column:auto/span 11}.panel-grid .g-col-xl-12{grid-column:auto/span 12}.panel-grid .g-col-xl-13{grid-column:auto/span 13}.panel-grid .g-col-xl-14{grid-column:auto/span 14}.panel-grid .g-col-xl-15{grid-column:auto/span 15}.panel-grid .g-col-xl-16{grid-column:auto/span 16}.panel-grid .g-col-xl-17{grid-column:auto/span 17}.panel-grid .g-col-xl-18{grid-column:auto/span 18}.panel-grid .g-col-xl-19{grid-column:auto/span 19}.panel-grid .g-col-xl-20{grid-column:auto/span 20}.panel-grid .g-col-xl-21{grid-column:auto/span 21}.panel-grid .g-col-xl-22{grid-column:auto/span 22}.panel-grid .g-col-xl-23{grid-column:auto/span 23}.panel-grid .g-col-xl-24{grid-column:auto/span 24}.panel-grid .g-start-xl-1{grid-column-start:1}.panel-grid .g-start-xl-2{grid-column-start:2}.panel-grid .g-start-xl-3{grid-column-start:3}.panel-grid .g-start-xl-4{grid-column-start:4}.panel-grid .g-start-xl-5{grid-column-start:5}.panel-grid .g-start-xl-6{grid-column-start:6}.panel-grid .g-start-xl-7{grid-column-start:7}.panel-grid .g-start-xl-8{grid-column-start:8}.panel-grid .g-start-xl-9{grid-column-start:9}.panel-grid .g-start-xl-10{grid-column-start:10}.panel-grid .g-start-xl-11{grid-column-start:11}.panel-grid .g-start-xl-12{grid-column-start:12}.panel-grid .g-start-xl-13{grid-column-start:13}.panel-grid .g-start-xl-14{grid-column-start:14}.panel-grid .g-start-xl-15{grid-column-start:15}.panel-grid .g-start-xl-16{grid-column-start:16}.panel-grid .g-start-xl-17{grid-column-start:17}.panel-grid .g-start-xl-18{grid-column-start:18}.panel-grid .g-start-xl-19{grid-column-start:19}.panel-grid .g-start-xl-20{grid-column-start:20}.panel-grid .g-start-xl-21{grid-column-start:21}.panel-grid .g-start-xl-22{grid-column-start:22}.panel-grid .g-start-xl-23{grid-column-start:23}}@media(min-width: 1400px){.panel-grid .g-col-xxl-1{grid-column:auto/span 1}.panel-grid .g-col-xxl-2{grid-column:auto/span 2}.panel-grid .g-col-xxl-3{grid-column:auto/span 3}.panel-grid .g-col-xxl-4{grid-column:auto/span 4}.panel-grid .g-col-xxl-5{grid-column:auto/span 5}.panel-grid .g-col-xxl-6{grid-column:auto/span 6}.panel-grid .g-col-xxl-7{grid-column:auto/span 7}.panel-grid .g-col-xxl-8{grid-column:auto/span 8}.panel-grid .g-col-xxl-9{grid-column:auto/span 9}.panel-grid .g-col-xxl-10{grid-column:auto/span 10}.panel-grid .g-col-xxl-11{grid-column:auto/span 11}.panel-grid .g-col-xxl-12{grid-column:auto/span 12}.panel-grid .g-col-xxl-13{grid-column:auto/span 13}.panel-grid .g-col-xxl-14{grid-column:auto/span 14}.panel-grid .g-col-xxl-15{grid-column:auto/span 15}.panel-grid .g-col-xxl-16{grid-column:auto/span 16}.panel-grid .g-col-xxl-17{grid-column:auto/span 17}.panel-grid .g-col-xxl-18{grid-column:auto/span 18}.panel-grid .g-col-xxl-19{grid-column:auto/span 19}.panel-grid .g-col-xxl-20{grid-column:auto/span 20}.panel-grid .g-col-xxl-21{grid-column:auto/span 21}.panel-grid .g-col-xxl-22{grid-column:auto/span 22}.panel-grid .g-col-xxl-23{grid-column:auto/span 23}.panel-grid .g-col-xxl-24{grid-column:auto/span 24}.panel-grid .g-start-xxl-1{grid-column-start:1}.panel-grid .g-start-xxl-2{grid-column-start:2}.panel-grid .g-start-xxl-3{grid-column-start:3}.panel-grid .g-start-xxl-4{grid-column-start:4}.panel-grid .g-start-xxl-5{grid-column-start:5}.panel-grid .g-start-xxl-6{grid-column-start:6}.panel-grid .g-start-xxl-7{grid-column-start:7}.panel-grid .g-start-xxl-8{grid-column-start:8}.panel-grid .g-start-xxl-9{grid-column-start:9}.panel-grid .g-start-xxl-10{grid-column-start:10}.panel-grid .g-start-xxl-11{grid-column-start:11}.panel-grid .g-start-xxl-12{grid-column-start:12}.panel-grid .g-start-xxl-13{grid-column-start:13}.panel-grid .g-start-xxl-14{grid-column-start:14}.panel-grid .g-start-xxl-15{grid-column-start:15}.panel-grid .g-start-xxl-16{grid-column-start:16}.panel-grid .g-start-xxl-17{grid-column-start:17}.panel-grid .g-start-xxl-18{grid-column-start:18}.panel-grid .g-start-xxl-19{grid-column-start:19}.panel-grid .g-start-xxl-20{grid-column-start:20}.panel-grid .g-start-xxl-21{grid-column-start:21}.panel-grid .g-start-xxl-22{grid-column-start:22}.panel-grid .g-start-xxl-23{grid-column-start:23}}main{margin-top:1em;margin-bottom:1em}h1,.h1,h2,.h2{color:inherit;margin-top:2rem;margin-bottom:1rem;font-weight:600}h1.title,.title.h1{margin-top:0}main.content>section:first-of-type>h2:first-child,main.content>section:first-of-type>.h2:first-child{margin-top:0}h2,.h2{border-bottom:1px solid #fff;padding-bottom:.5rem}h3,.h3{font-weight:600}h3,.h3,h4,.h4{opacity:.9;margin-top:1.5rem}h5,.h5,h6,.h6{opacity:.9}.header-section-number{color:#5a6570}.nav-link.active .header-section-number{color:inherit}mark,.mark{padding:0em}.panel-caption,.figure-caption,.subfigure-caption,.table-caption,figcaption,caption{font-size:.9rem;color:#5a6570}.quarto-layout-cell[data-ref-parent] caption{color:#5a6570}.column-margin figcaption,.margin-caption,div.aside,aside,.column-margin{color:#5a6570;font-size:.825rem}.panel-caption.margin-caption{text-align:inherit}.column-margin.column-container p{margin-bottom:0}.column-margin.column-container>*:not(.collapse):first-child{padding-bottom:.5em;display:block}.column-margin.column-container>*:not(.collapse):not(:first-child){padding-top:.5em;padding-bottom:.5em;display:block}.column-margin.column-container>*.collapse:not(.show){display:none}@media(min-width: 768px){.column-margin.column-container .callout-margin-content:first-child{margin-top:4.5em}.column-margin.column-container .callout-margin-content-simple:first-child{margin-top:3.5em}}.margin-caption>*{padding-top:.5em;padding-bottom:.5em}@media(max-width: 767.98px){.quarto-layout-row{flex-direction:column}}.nav-tabs .nav-item{margin-top:1px;cursor:pointer}.tab-content{margin-top:0px;border-left:#fff 1px solid;border-right:#fff 1px solid;border-bottom:#fff 1px solid;margin-left:0;padding:1em;margin-bottom:1em}@media(max-width: 767.98px){.layout-sidebar{margin-left:0;margin-right:0}}.panel-sidebar,.panel-sidebar .form-control,.panel-input,.panel-input .form-control,.selectize-dropdown{font-size:.9rem}.panel-sidebar .form-control,.panel-input .form-control{padding-top:.1rem}.tab-pane div.sourceCode{margin-top:0px}.tab-pane>p{padding-top:0}.tab-pane>p:nth-child(1){padding-top:0}.tab-pane>p:last-child{margin-bottom:0}.tab-pane>pre:last-child{margin-bottom:0}.tab-content>.tab-pane:not(.active){display:none !important}div.sourceCode{background-color:rgba(233,236,239,.65);border:1px solid rgba(233,236,239,.65);border-radius:.375rem}pre.sourceCode{background-color:rgba(0,0,0,0)}pre.sourceCode{border:none;font-size:.875em;overflow:visible !important;padding:.4em}div.sourceCode{overflow-y:hidden}.callout div.sourceCode{margin-left:initial}.blockquote{font-size:inherit;padding-left:1rem;padding-right:1.5rem;color:#5a6570}.blockquote h1:first-child,.blockquote .h1:first-child,.blockquote h2:first-child,.blockquote .h2:first-child,.blockquote h3:first-child,.blockquote .h3:first-child,.blockquote h4:first-child,.blockquote .h4:first-child,.blockquote h5:first-child,.blockquote .h5:first-child{margin-top:0}pre{background-color:initial;padding:initial;border:initial}p pre code:not(.sourceCode),li pre code:not(.sourceCode),pre code:not(.sourceCode){background-color:initial}p code:not(.sourceCode),li code:not(.sourceCode),td code:not(.sourceCode){background-color:#f8f9fa;padding:.2em}nav p code:not(.sourceCode),nav li code:not(.sourceCode),nav td code:not(.sourceCode){background-color:rgba(0,0,0,0);padding:0}td code:not(.sourceCode){white-space:pre-wrap}#quarto-embedded-source-code-modal>.modal-dialog{max-width:1000px;padding-left:1.75rem;padding-right:1.75rem}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body{padding:0}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body div.sourceCode{margin:0;padding:.2rem .2rem;border-radius:0px;border:none}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-header{padding:.7rem}.code-tools-button{font-size:1rem;padding:.15rem .15rem;margin-left:5px;color:rgba(33,37,41,.75);background-color:rgba(0,0,0,0);transition:initial;cursor:pointer}.code-tools-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}.code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}.sidebar{will-change:top;transition:top 200ms linear;position:sticky;overflow-y:auto;padding-top:1.2em;max-height:100vh}.sidebar.toc-left,.sidebar.margin-sidebar{top:0px;padding-top:1em}.sidebar.quarto-banner-title-block-sidebar>*{padding-top:1.65em}figure .quarto-notebook-link{margin-top:.5em}.quarto-notebook-link{font-size:.75em;color:rgba(33,37,41,.75);margin-bottom:1em;text-decoration:none;display:block}.quarto-notebook-link:hover{text-decoration:underline;color:#0d6efd}.quarto-notebook-link::before{display:inline-block;height:.75rem;width:.75rem;margin-bottom:0em;margin-right:.25em;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:.75rem .75rem}.toc-actions i.bi,.quarto-code-links i.bi,.quarto-other-links i.bi,.quarto-alternate-notebooks i.bi,.quarto-alternate-formats i.bi{margin-right:.4em;font-size:.8rem}.quarto-other-links-text-target .quarto-code-links i.bi,.quarto-other-links-text-target .quarto-other-links i.bi{margin-right:.2em}.quarto-other-formats-text-target .quarto-alternate-formats i.bi{margin-right:.1em}.toc-actions i.bi.empty,.quarto-code-links i.bi.empty,.quarto-other-links i.bi.empty,.quarto-alternate-notebooks i.bi.empty,.quarto-alternate-formats i.bi.empty{padding-left:1em}.quarto-notebook h2,.quarto-notebook .h2{border-bottom:none}.quarto-notebook .cell-container{display:flex}.quarto-notebook .cell-container .cell{flex-grow:4}.quarto-notebook .cell-container .cell-decorator{padding-top:1.5em;padding-right:1em;text-align:right}.quarto-notebook .cell-container.code-fold .cell-decorator{padding-top:3em}.quarto-notebook .cell-code code{white-space:pre-wrap}.quarto-notebook .cell .cell-output-stderr pre code,.quarto-notebook .cell .cell-output-stdout pre code{white-space:pre-wrap;overflow-wrap:anywhere}.toc-actions,.quarto-alternate-formats,.quarto-other-links,.quarto-code-links,.quarto-alternate-notebooks{padding-left:0em}.sidebar .toc-actions a,.sidebar .quarto-alternate-formats a,.sidebar .quarto-other-links a,.sidebar .quarto-code-links a,.sidebar .quarto-alternate-notebooks a,.sidebar nav[role=doc-toc] a{text-decoration:none}.sidebar .toc-actions a:hover,.sidebar .quarto-other-links a:hover,.sidebar .quarto-code-links a:hover,.sidebar .quarto-alternate-formats a:hover,.sidebar .quarto-alternate-notebooks a:hover{color:#0d6efd}.sidebar .toc-actions h2,.sidebar .toc-actions .h2,.sidebar .quarto-code-links h2,.sidebar .quarto-code-links .h2,.sidebar .quarto-other-links h2,.sidebar .quarto-other-links .h2,.sidebar .quarto-alternate-notebooks h2,.sidebar .quarto-alternate-notebooks .h2,.sidebar .quarto-alternate-formats h2,.sidebar .quarto-alternate-formats .h2,.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-weight:500;margin-bottom:.2rem;margin-top:.3rem;font-family:inherit;border-bottom:0;padding-bottom:0;padding-top:0px}.sidebar .toc-actions>h2,.sidebar .toc-actions>.h2,.sidebar .quarto-code-links>h2,.sidebar .quarto-code-links>.h2,.sidebar .quarto-other-links>h2,.sidebar .quarto-other-links>.h2,.sidebar .quarto-alternate-notebooks>h2,.sidebar .quarto-alternate-notebooks>.h2,.sidebar .quarto-alternate-formats>h2,.sidebar .quarto-alternate-formats>.h2{font-size:.8rem}.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-size:.875rem}.sidebar nav[role=doc-toc]>ul a{border-left:1px solid #e9ecef;padding-left:.6rem}.sidebar .toc-actions h2>ul a,.sidebar .toc-actions .h2>ul a,.sidebar .quarto-code-links h2>ul a,.sidebar .quarto-code-links .h2>ul a,.sidebar .quarto-other-links h2>ul a,.sidebar .quarto-other-links .h2>ul a,.sidebar .quarto-alternate-notebooks h2>ul a,.sidebar .quarto-alternate-notebooks .h2>ul a,.sidebar .quarto-alternate-formats h2>ul a,.sidebar .quarto-alternate-formats .h2>ul a{border-left:none;padding-left:.6rem}.sidebar .toc-actions ul a:empty,.sidebar .quarto-code-links ul a:empty,.sidebar .quarto-other-links ul a:empty,.sidebar .quarto-alternate-notebooks ul a:empty,.sidebar .quarto-alternate-formats ul a:empty,.sidebar nav[role=doc-toc]>ul a:empty{display:none}.sidebar .toc-actions ul,.sidebar .quarto-code-links ul,.sidebar .quarto-other-links ul,.sidebar .quarto-alternate-notebooks ul,.sidebar .quarto-alternate-formats ul{padding-left:0;list-style:none}.sidebar nav[role=doc-toc] ul{list-style:none;padding-left:0;list-style:none}.sidebar nav[role=doc-toc]>ul{margin-left:.45em}.quarto-margin-sidebar nav[role=doc-toc]{padding-left:.5em}.sidebar .toc-actions>ul,.sidebar .quarto-code-links>ul,.sidebar .quarto-other-links>ul,.sidebar .quarto-alternate-notebooks>ul,.sidebar .quarto-alternate-formats>ul{font-size:.8rem}.sidebar nav[role=doc-toc]>ul{font-size:.875rem}.sidebar .toc-actions ul li a,.sidebar .quarto-code-links ul li a,.sidebar .quarto-other-links ul li a,.sidebar .quarto-alternate-notebooks ul li a,.sidebar .quarto-alternate-formats ul li a,.sidebar nav[role=doc-toc]>ul li a{line-height:1.1rem;padding-bottom:.2rem;padding-top:.2rem;color:inherit}.sidebar nav[role=doc-toc] ul>li>ul>li>a{padding-left:1.2em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>a{padding-left:2.4em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>a{padding-left:3.6em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:4.8em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:6em}.sidebar nav[role=doc-toc] ul>li>a.active,.sidebar nav[role=doc-toc] ul>li>ul>li>a.active{border-left:1px solid #0d6efd;color:#0d6efd !important}.sidebar nav[role=doc-toc] ul>li>a:hover,.sidebar nav[role=doc-toc] ul>li>ul>li>a:hover{color:#0d6efd !important}kbd,.kbd{color:#212529;background-color:#f8f9fa;border:1px solid;border-radius:5px;border-color:#fff}.quarto-appendix-contents div.hanging-indent{margin-left:0em}.quarto-appendix-contents div.hanging-indent div.csl-entry{margin-left:1em;text-indent:-1em}.citation a,.footnote-ref{text-decoration:none}.footnotes ol{padding-left:1em}.tippy-content>*{margin-bottom:.7em}.tippy-content>*:last-child{margin-bottom:0}.callout{margin-top:1.25rem;margin-bottom:1.25rem;border-radius:.375rem;overflow-wrap:break-word}.callout .callout-title-container{overflow-wrap:anywhere}.callout.callout-style-simple{padding:.4em .7em;border-left:5px solid;border-right:1px solid #fff;border-top:1px solid #fff;border-bottom:1px solid #fff}.callout.callout-style-default{border-left:5px solid;border-right:1px solid #fff;border-top:1px solid #fff;border-bottom:1px solid #fff}.callout .callout-body-container{flex-grow:1}.callout.callout-style-simple .callout-body{font-size:.9rem;font-weight:400}.callout.callout-style-default .callout-body{font-size:.9rem;font-weight:400}.callout:not(.no-icon).callout-titled.callout-style-simple .callout-body{padding-left:1.6em}.callout.callout-titled>.callout-header{padding-top:.2em;margin-bottom:-0.2em}.callout.callout-style-simple>div.callout-header{border-bottom:none;font-size:.9rem;font-weight:600;opacity:75%}.callout.callout-style-default>div.callout-header{border-bottom:none;font-weight:600;opacity:85%;font-size:.9rem;padding-left:.5em;padding-right:.5em}.callout.callout-style-default .callout-body{padding-left:.5em;padding-right:.5em}.callout.callout-style-default .callout-body>:first-child{padding-top:.5rem;margin-top:0}.callout>div.callout-header[data-bs-toggle=collapse]{cursor:pointer}.callout.callout-style-default .callout-header[aria-expanded=false],.callout.callout-style-default .callout-header[aria-expanded=true]{padding-top:0px;margin-bottom:0px;align-items:center}.callout.callout-titled .callout-body>:last-child:not(.sourceCode),.callout.callout-titled .callout-body>div>:last-child:not(.sourceCode){padding-bottom:.5rem;margin-bottom:0}.callout:not(.callout-titled) .callout-body>:first-child,.callout:not(.callout-titled) .callout-body>div>:first-child{margin-top:.25rem}.callout:not(.callout-titled) .callout-body>:last-child,.callout:not(.callout-titled) .callout-body>div>:last-child{margin-bottom:.2rem}.callout.callout-style-simple .callout-icon::before,.callout.callout-style-simple .callout-toggle::before{height:1rem;width:1rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.callout.callout-style-default .callout-icon::before,.callout.callout-style-default .callout-toggle::before{height:.9rem;width:.9rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:.9rem .9rem}.callout.callout-style-default .callout-toggle::before{margin-top:5px}.callout .callout-btn-toggle .callout-toggle::before{transition:transform .2s linear}.callout .callout-header[aria-expanded=false] .callout-toggle::before{transform:rotate(-90deg)}.callout .callout-header[aria-expanded=true] .callout-toggle::before{transform:none}.callout.callout-style-simple:not(.no-icon) div.callout-icon-container{padding-top:.2em;padding-right:.55em}.callout.callout-style-default:not(.no-icon) div.callout-icon-container{padding-top:.1em;padding-right:.35em}.callout.callout-style-default:not(.no-icon) div.callout-title-container{margin-top:-1px}.callout.callout-style-default.callout-caution:not(.no-icon) div.callout-icon-container{padding-top:.3em;padding-right:.35em}.callout>.callout-body>.callout-icon-container>.no-icon,.callout>.callout-header>.callout-icon-container>.no-icon{display:none}div.callout.callout{border-left-color:rgba(33,37,41,.75)}div.callout.callout-style-default>.callout-header{background-color:rgba(33,37,41,.75)}div.callout-note.callout{border-left-color:#0d6efd}div.callout-note.callout-style-default>.callout-header{background-color:#e7f1ff}div.callout-note:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-tip.callout{border-left-color:#198754}div.callout-tip.callout-style-default>.callout-header{background-color:#e8f3ee}div.callout-tip:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-warning.callout{border-left-color:#ffc107}div.callout-warning.callout-style-default>.callout-header{background-color:#fff9e6}div.callout-warning:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-caution.callout{border-left-color:#fd7e14}div.callout-caution.callout-style-default>.callout-header{background-color:#fff2e8}div.callout-caution:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-important.callout{border-left-color:#dc3545}div.callout-important.callout-style-default>.callout-header{background-color:#fcebec}div.callout-important:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important .callout-toggle::before{background-image:url('data:image/svg+xml,')}.quarto-toggle-container{display:flex;align-items:center}.quarto-reader-toggle .bi::before,.quarto-color-scheme-toggle .bi::before{display:inline-block;height:1rem;width:1rem;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.sidebar-navigation{padding-left:20px}.navbar{background-color:#517699;color:#fdfefe}.navbar .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.quarto-sidebar-toggle{border-color:#fff;border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem;border-style:solid;border-width:1px;overflow:hidden;border-top-width:0px;padding-top:0px !important}.quarto-sidebar-toggle-title{cursor:pointer;padding-bottom:2px;margin-left:.25em;text-align:center;font-weight:400;font-size:.775em}#quarto-content .quarto-sidebar-toggle{background:#fafafa}#quarto-content .quarto-sidebar-toggle-title{color:#212529}.quarto-sidebar-toggle-icon{color:#fff;margin-right:.5em;float:right;transition:transform .2s ease}.quarto-sidebar-toggle-icon::before{padding-top:5px}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-icon{transform:rotate(-180deg)}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-title{border-bottom:solid #fff 1px}.quarto-sidebar-toggle-contents{background-color:#fff;padding-right:10px;padding-left:10px;margin-top:0px !important;transition:max-height .5s ease}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-contents{padding-top:1em;padding-bottom:10px}@media(max-width: 767.98px){.sidebar-menu-container{padding-bottom:5em}}.quarto-sidebar-toggle:not(.expanded) .quarto-sidebar-toggle-contents{padding-top:0px !important;padding-bottom:0px}nav[role=doc-toc]{z-index:1020}#quarto-sidebar>*,nav[role=doc-toc]>*{transition:opacity .1s ease,border .1s ease}#quarto-sidebar.slow>*,nav[role=doc-toc].slow>*{transition:opacity .4s ease,border .4s ease}.quarto-color-scheme-toggle:not(.alternate).top-right .bi::before{background-image:url('data:image/svg+xml,')}.quarto-color-scheme-toggle.alternate.top-right .bi::before{background-image:url('data:image/svg+xml,')}#quarto-appendix.default{border-top:1px solid #fff}#quarto-appendix.default{background-color:#fff;padding-top:1.5em;margin-top:2em;z-index:998}#quarto-appendix.default .quarto-appendix-heading{margin-top:0;line-height:1.4em;font-weight:600;opacity:.9;border-bottom:none;margin-bottom:0}#quarto-appendix.default .footnotes ol,#quarto-appendix.default .footnotes ol li>p:last-of-type,#quarto-appendix.default .quarto-appendix-contents>p:last-of-type{margin-bottom:0}#quarto-appendix.default .footnotes ol{margin-left:.5em}#quarto-appendix.default .quarto-appendix-secondary-label{margin-bottom:.4em}#quarto-appendix.default .quarto-appendix-bibtex{font-size:.7em;padding:1em;border:solid 1px #fff;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-bibtex code.sourceCode{white-space:pre-wrap}#quarto-appendix.default .quarto-appendix-citeas{font-size:.9em;padding:1em;border:solid 1px #fff;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-heading{font-size:1em !important}#quarto-appendix.default *[role=doc-endnotes]>ol,#quarto-appendix.default .quarto-appendix-contents>*:not(h2):not(.h2){font-size:.9em}#quarto-appendix.default section{padding-bottom:1.5em}#quarto-appendix.default section *[role=doc-endnotes],#quarto-appendix.default section>*:not(a){opacity:.9;word-wrap:break-word}.btn.btn-quarto,div.cell-output-display .btn-quarto{--bs-btn-color: #fefefe;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fefefe;--bs-btn-hover-bg: #828a91;--bs-btn-hover-border-color: #7b838a;--bs-btn-focus-shadow-rgb: 130, 138, 144;--bs-btn-active-color: #000;--bs-btn-active-bg: #899197;--bs-btn-active-border-color: #7b838a;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}nav.quarto-secondary-nav.color-navbar{background-color:#517699;color:#fdfefe}nav.quarto-secondary-nav.color-navbar h1,nav.quarto-secondary-nav.color-navbar .h1,nav.quarto-secondary-nav.color-navbar .quarto-btn-toggle{color:#fdfefe}@media(max-width: 991.98px){body.nav-sidebar .quarto-title-banner{margin-bottom:0;padding-bottom:1em}body.nav-sidebar #title-block-header{margin-block-end:0}}p.subtitle{margin-top:.25em;margin-bottom:.5em}code a:any-link{color:inherit;text-decoration-color:#6c757d}/*! light */div.observablehq table thead tr th{background-color:var(--bs-body-bg)}input,button,select,optgroup,textarea{background-color:var(--bs-body-bg)}.code-annotated .code-copy-button{margin-right:1.25em;margin-top:0;padding-bottom:0;padding-top:3px}.code-annotation-gutter-bg{background-color:#fff}.code-annotation-gutter{background-color:rgba(233,236,239,.65)}.code-annotation-gutter,.code-annotation-gutter-bg{height:100%;width:calc(20px + .5em);position:absolute;top:0;right:0}dl.code-annotation-container-grid dt{margin-right:1em;margin-top:.25rem}dl.code-annotation-container-grid dt{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:#383f45;border:solid #383f45 1px;border-radius:50%;height:22px;width:22px;line-height:22px;font-size:11px;text-align:center;vertical-align:middle;text-decoration:none}dl.code-annotation-container-grid dt[data-target-cell]{cursor:pointer}dl.code-annotation-container-grid dt[data-target-cell].code-annotation-active{color:#fff;border:solid #aaa 1px;background-color:#aaa}pre.code-annotation-code{padding-top:0;padding-bottom:0}pre.code-annotation-code code{z-index:3}#code-annotation-line-highlight-gutter{width:100%;border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}#code-annotation-line-highlight{margin-left:-4em;width:calc(100% + 4em);border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}code.sourceCode .code-annotation-anchor.code-annotation-active{background-color:var(--quarto-hl-normal-color, #aaaaaa);border:solid var(--quarto-hl-normal-color, #aaaaaa) 1px;color:#e9ecef;font-weight:bolder}code.sourceCode .code-annotation-anchor{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:var(--quarto-hl-co-color);border:solid var(--quarto-hl-co-color) 1px;border-radius:50%;height:18px;width:18px;font-size:9px;margin-top:2px}code.sourceCode button.code-annotation-anchor{padding:2px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none}code.sourceCode a.code-annotation-anchor{line-height:18px;text-align:center;vertical-align:middle;cursor:default;text-decoration:none}@media print{.page-columns .column-screen-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:page-start-inset/page-end-inset;padding:1em;background:#f8f9fa;z-index:998;opacity:.999;margin-bottom:1em}}.quarto-video{margin-bottom:1em}.table{border-top:1px solid #d3d3d4;border-bottom:1px solid #d3d3d4}.table>thead{border-top-width:0;border-bottom:1px solid #909294}.table a{word-break:break-word}.table>:not(caption)>*>*{background-color:unset;color:unset}#quarto-document-content .crosstalk-input .checkbox input[type=checkbox],#quarto-document-content .crosstalk-input .checkbox-inline input[type=checkbox]{position:unset;margin-top:unset;margin-left:unset}#quarto-document-content .row{margin-left:unset;margin-right:unset}.quarto-xref{white-space:nowrap}#quarto-draft-alert{margin-top:0px;margin-bottom:0px;padding:.3em;text-align:center;font-size:.9em}#quarto-draft-alert i{margin-right:.3em}#quarto-back-to-top{z-index:1000}pre{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:0.875em;font-weight:400}pre code{font-family:inherit;font-size:inherit;font-weight:inherit}code{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:0.875em;font-weight:400}a{background-color:rgba(0,0,0,0);font-weight:400;text-decoration:underline}a.external:after{content:"";background-image:url('data:image/svg+xml,');background-size:contain;background-repeat:no-repeat;background-position:center center;margin-left:.2em;padding-right:.75em}div.sourceCode code a.external:after{content:none}a.external:after:hover{cursor:pointer}.quarto-ext-icon{display:inline-block;font-size:.75em;padding-left:.3em}.code-with-filename .code-with-filename-file{margin-bottom:0;padding-bottom:2px;padding-top:2px;padding-left:.7em;border:var(--quarto-border-width) solid var(--quarto-border-color);border-radius:var(--quarto-border-radius);border-bottom:0;border-bottom-left-radius:0%;border-bottom-right-radius:0%}.code-with-filename div.sourceCode,.reveal .code-with-filename div.sourceCode{margin-top:0;border-top-left-radius:0%;border-top-right-radius:0%}.code-with-filename .code-with-filename-file pre{margin-bottom:0}.code-with-filename .code-with-filename-file{background-color:rgba(219,219,219,.8)}.quarto-dark .code-with-filename .code-with-filename-file{background-color:#555}.code-with-filename .code-with-filename-file strong{font-weight:400}.quarto-title-banner{margin-bottom:1em;color:#fdfefe;background:#517699}.quarto-title-banner a{color:#fdfefe}.quarto-title-banner h1,.quarto-title-banner .h1,.quarto-title-banner h2,.quarto-title-banner .h2{color:#fdfefe}.quarto-title-banner .code-tools-button{color:#b9dcdc}.quarto-title-banner .code-tools-button:hover{color:#fdfefe}.quarto-title-banner .code-tools-button>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .quarto-title .title{font-weight:600}.quarto-title-banner .quarto-categories{margin-top:.75em}@media(min-width: 992px){.quarto-title-banner{padding-top:2.5em;padding-bottom:2.5em}}@media(max-width: 991.98px){.quarto-title-banner{padding-top:1em;padding-bottom:1em}}@media(max-width: 767.98px){body.hypothesis-enabled #title-block-header>*{padding-right:20px}}main.quarto-banner-title-block>section:first-child>h2,main.quarto-banner-title-block>section:first-child>.h2,main.quarto-banner-title-block>section:first-child>h3,main.quarto-banner-title-block>section:first-child>.h3,main.quarto-banner-title-block>section:first-child>h4,main.quarto-banner-title-block>section:first-child>.h4{margin-top:0}.quarto-title .quarto-categories{display:flex;flex-wrap:wrap;row-gap:.5em;column-gap:.4em;padding-bottom:.5em;margin-top:.75em}.quarto-title .quarto-categories .quarto-category{padding:.25em .75em;font-size:.65em;text-transform:uppercase;border:solid 1px;border-radius:.375rem;opacity:.6}.quarto-title .quarto-categories .quarto-category a{color:inherit}.quarto-title-meta-container{display:grid;grid-template-columns:1fr auto}.quarto-title-meta-column-end{display:flex;flex-direction:column;padding-left:1em}.quarto-title-meta-column-end a .bi{margin-right:.3em}#title-block-header.quarto-title-block.default .quarto-title-meta{display:grid;grid-template-columns:repeat(2, 1fr);grid-column-gap:1em}#title-block-header.quarto-title-block.default .quarto-title .title{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-author-orcid img{margin-top:-0.2em;height:.8em;width:.8em}#title-block-header.quarto-title-block.default .quarto-title-author-email{opacity:.7}#title-block-header.quarto-title-block.default .quarto-description p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p,#title-block-header.quarto-title-block.default .quarto-title-authors p,#title-block-header.quarto-title-block.default .quarto-title-affiliations p{margin-bottom:.1em}#title-block-header.quarto-title-block.default .quarto-title-meta-heading{text-transform:uppercase;margin-top:1em;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-contents{font-size:.9em}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p.affiliation:last-of-type{margin-bottom:.1em}#title-block-header.quarto-title-block.default p.affiliation{margin-bottom:.1em}#title-block-header.quarto-title-block.default .keywords,#title-block-header.quarto-title-block.default .description,#title-block-header.quarto-title-block.default .abstract{margin-top:0}#title-block-header.quarto-title-block.default .keywords>p,#title-block-header.quarto-title-block.default .description>p,#title-block-header.quarto-title-block.default .abstract>p{font-size:.9em}#title-block-header.quarto-title-block.default .keywords>p:last-of-type,#title-block-header.quarto-title-block.default .description>p:last-of-type,#title-block-header.quarto-title-block.default .abstract>p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .keywords .block-title,#title-block-header.quarto-title-block.default .description .block-title,#title-block-header.quarto-title-block.default .abstract .block-title{margin-top:1em;text-transform:uppercase;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-author{display:grid;grid-template-columns:minmax(max-content, 1fr) 1fr;grid-column-gap:1em}.quarto-title-tools-only{display:flex;justify-content:right}:root{--quarto-scss-export-title-banner-color: ;--quarto-scss-export-title-banner-bg: ;--quarto-scss-export-btn-code-copy-color: #5E5E5E;--quarto-scss-export-btn-code-copy-color-active: #4758AB;--quarto-scss-export-sidebar-bg: #fff;--quarto-scss-export-blue: #0d6efd;--quarto-scss-export-primary: #0d6efd;--quarto-scss-export-white: #ffffff;--quarto-scss-export-gray-200: #e9ecef;--quarto-scss-export-gray-100: #f8f9fa;--quarto-scss-export-gray-900: #212529;--quarto-scss-export-link-color: #0d6efd;--quarto-scss-export-link-color-bg: transparent;--quarto-scss-export-code-color: #7d12ba;--quarto-scss-export-code-bg: #f8f9fa;--quarto-scss-export-toc-color: #0d6efd;--quarto-scss-export-toc-active-border: #0d6efd;--quarto-scss-export-toc-inactive-border: #e9ecef;--quarto-scss-export-navbar-default: #517699;--quarto-scss-export-navbar-hl-override: false;--quarto-scss-export-navbar-bg: #517699;--quarto-scss-export-btn-bg: #6c757d;--quarto-scss-export-btn-fg: #fefefe;--quarto-scss-export-body-contrast-bg: #ffffff;--quarto-scss-export-body-contrast-color: #212529;--quarto-scss-export-navbar-fg: #fdfefe;--quarto-scss-export-navbar-hl: #fdfeff;--quarto-scss-export-navbar-brand: #fdfefe;--quarto-scss-export-navbar-brand-hl: #fdfeff;--quarto-scss-export-navbar-toggler-border-color: rgba(253, 254, 254, 0);--quarto-scss-export-navbar-hover-color: rgba(253, 254, 255, 0.8);--quarto-scss-export-navbar-disabled-color: rgba(253, 254, 254, 0.75);--quarto-scss-export-sidebar-fg: #595959;--quarto-scss-export-sidebar-hl: ;--quarto-scss-export-title-block-color: #212529;--quarto-scss-export-title-block-contast-color: #ffffff;--quarto-scss-export-footer-bg: #fff;--quarto-scss-export-footer-fg: #757575;--quarto-scss-export-popover-bg: #ffffff;--quarto-scss-export-input-bg: #ffffff;--quarto-scss-export-input-border-color: white;--quarto-scss-export-code-annotation-higlight-color: rgba(170, 170, 170, 0.2666666667);--quarto-scss-export-code-annotation-higlight-bg: rgba(170, 170, 170, 0.1333333333);--quarto-scss-export-table-group-separator-color: #909294;--quarto-scss-export-table-group-separator-color-lighter: #d3d3d4;--quarto-scss-export-link-decoration: underline;--quarto-scss-export-border-color: white;--quarto-scss-export-table-border-color: white;--quarto-scss-export-gray-300: #dee2e6;--quarto-scss-export-gray-400: #ced4da;--quarto-scss-export-gray-500: #adb5bd;--quarto-scss-export-gray-600: #6c757d;--quarto-scss-export-gray-700: #495057;--quarto-scss-export-gray-800: #343a40;--quarto-scss-export-black: #000;--quarto-scss-export-indigo: #6610f2;--quarto-scss-export-purple: #6f42c1;--quarto-scss-export-pink: #d63384;--quarto-scss-export-red: #dc3545;--quarto-scss-export-orange: #fd7e14;--quarto-scss-export-yellow: #ffc107;--quarto-scss-export-green: #198754;--quarto-scss-export-teal: #20c997;--quarto-scss-export-cyan: #0dcaf0;--quarto-scss-export-color-contrast-dark: #000;--quarto-scss-export-color-contrast-light: #ffffff;--quarto-scss-export-blue-100: #cfe2ff;--quarto-scss-export-blue-200: #9ec5fe;--quarto-scss-export-blue-300: #6ea8fe;--quarto-scss-export-blue-400: #3d8bfd;--quarto-scss-export-blue-500: #0d6efd;--quarto-scss-export-blue-600: #0a58ca;--quarto-scss-export-blue-700: #084298;--quarto-scss-export-blue-800: #052c65;--quarto-scss-export-blue-900: #031633;--quarto-scss-export-indigo-100: #e0cffc;--quarto-scss-export-indigo-200: #c29ffa;--quarto-scss-export-indigo-300: #a370f7;--quarto-scss-export-indigo-400: #8540f5;--quarto-scss-export-indigo-500: #6610f2;--quarto-scss-export-indigo-600: #520dc2;--quarto-scss-export-indigo-700: #3d0a91;--quarto-scss-export-indigo-800: #290661;--quarto-scss-export-indigo-900: #140330;--quarto-scss-export-purple-100: #e2d9f3;--quarto-scss-export-purple-200: #c5b3e6;--quarto-scss-export-purple-300: #a98eda;--quarto-scss-export-purple-400: #8c68cd;--quarto-scss-export-purple-500: #6f42c1;--quarto-scss-export-purple-600: #59359a;--quarto-scss-export-purple-700: #432874;--quarto-scss-export-purple-800: #2c1a4d;--quarto-scss-export-purple-900: #160d27;--quarto-scss-export-pink-100: #f7d6e6;--quarto-scss-export-pink-200: #efadce;--quarto-scss-export-pink-300: #e685b5;--quarto-scss-export-pink-400: #de5c9d;--quarto-scss-export-pink-500: #d63384;--quarto-scss-export-pink-600: #ab296a;--quarto-scss-export-pink-700: #801f4f;--quarto-scss-export-pink-800: #561435;--quarto-scss-export-pink-900: #2b0a1a;--quarto-scss-export-red-100: #f8d7da;--quarto-scss-export-red-200: #f1aeb5;--quarto-scss-export-red-300: #ea868f;--quarto-scss-export-red-400: #e35d6a;--quarto-scss-export-red-500: #dc3545;--quarto-scss-export-red-600: #b02a37;--quarto-scss-export-red-700: #842029;--quarto-scss-export-red-800: #58151c;--quarto-scss-export-red-900: #2c0b0e;--quarto-scss-export-orange-100: #ffe5d0;--quarto-scss-export-orange-200: #fecba1;--quarto-scss-export-orange-300: #feb272;--quarto-scss-export-orange-400: #fd9843;--quarto-scss-export-orange-500: #fd7e14;--quarto-scss-export-orange-600: #ca6510;--quarto-scss-export-orange-700: #984c0c;--quarto-scss-export-orange-800: #653208;--quarto-scss-export-orange-900: #331904;--quarto-scss-export-yellow-100: #fff3cd;--quarto-scss-export-yellow-200: #ffe69c;--quarto-scss-export-yellow-300: #ffda6a;--quarto-scss-export-yellow-400: #ffcd39;--quarto-scss-export-yellow-500: #ffc107;--quarto-scss-export-yellow-600: #cc9a06;--quarto-scss-export-yellow-700: #997404;--quarto-scss-export-yellow-800: #664d03;--quarto-scss-export-yellow-900: #332701;--quarto-scss-export-green-100: #d1e7dd;--quarto-scss-export-green-200: #a3cfbb;--quarto-scss-export-green-300: #75b798;--quarto-scss-export-green-400: #479f76;--quarto-scss-export-green-500: #198754;--quarto-scss-export-green-600: #146c43;--quarto-scss-export-green-700: #0f5132;--quarto-scss-export-green-800: #0a3622;--quarto-scss-export-green-900: #051b11;--quarto-scss-export-teal-100: #d2f4ea;--quarto-scss-export-teal-200: #a6e9d5;--quarto-scss-export-teal-300: #79dfc1;--quarto-scss-export-teal-400: #4dd4ac;--quarto-scss-export-teal-500: #20c997;--quarto-scss-export-teal-600: #1aa179;--quarto-scss-export-teal-700: #13795b;--quarto-scss-export-teal-800: #0d503c;--quarto-scss-export-teal-900: #06281e;--quarto-scss-export-cyan-100: #cff4fc;--quarto-scss-export-cyan-200: #9eeaf9;--quarto-scss-export-cyan-300: #6edff6;--quarto-scss-export-cyan-400: #3dd5f3;--quarto-scss-export-cyan-500: #0dcaf0;--quarto-scss-export-cyan-600: #0aa2c0;--quarto-scss-export-cyan-700: #087990;--quarto-scss-export-cyan-800: #055160;--quarto-scss-export-cyan-900: #032830;--quarto-scss-export-default: #dee2e6;--quarto-scss-export-secondary: #6c757d;--quarto-scss-export-success: #198754;--quarto-scss-export-info: #0dcaf0;--quarto-scss-export-warning: #ffc107;--quarto-scss-export-danger: #dc3545;--quarto-scss-export-light: #f8f9fa;--quarto-scss-export-dark: #212529;--quarto-scss-export-primary-text-emphasis: #052c65;--quarto-scss-export-secondary-text-emphasis: #2b2f32;--quarto-scss-export-success-text-emphasis: #0a3622;--quarto-scss-export-info-text-emphasis: #055160;--quarto-scss-export-warning-text-emphasis: #664d03;--quarto-scss-export-danger-text-emphasis: #58151c;--quarto-scss-export-light-text-emphasis: #495057;--quarto-scss-export-dark-text-emphasis: #495057;--quarto-scss-export-primary-bg-subtle: #cfe2ff;--quarto-scss-export-secondary-bg-subtle: #e2e3e5;--quarto-scss-export-success-bg-subtle: #d1e7dd;--quarto-scss-export-info-bg-subtle: #cff4fc;--quarto-scss-export-warning-bg-subtle: #fff3cd;--quarto-scss-export-danger-bg-subtle: #f8d7da;--quarto-scss-export-light-bg-subtle: #fcfcfd;--quarto-scss-export-dark-bg-subtle: #ced4da;--quarto-scss-export-primary-border-subtle: #9ec5fe;--quarto-scss-export-secondary-border-subtle: #c4c8cb;--quarto-scss-export-success-border-subtle: #a3cfbb;--quarto-scss-export-info-border-subtle: #9eeaf9;--quarto-scss-export-warning-border-subtle: #ffe69c;--quarto-scss-export-danger-border-subtle: #f1aeb5;--quarto-scss-export-light-border-subtle: #e9ecef;--quarto-scss-export-dark-border-subtle: #adb5bd;--quarto-scss-export-body-text-align: ;--quarto-scss-export-body-color: #212529;--quarto-scss-export-body-bg: #ffffff;--quarto-scss-export-body-secondary-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-body-secondary-bg: #e9ecef;--quarto-scss-export-body-tertiary-color: rgba(33, 37, 41, 0.5);--quarto-scss-export-body-tertiary-bg: #f8f9fa;--quarto-scss-export-body-emphasis-color: #000;--quarto-scss-export-link-hover-color: #0a58ca;--quarto-scss-export-link-hover-decoration: ;--quarto-scss-export-border-color-translucent: rgba(0, 0, 0, 0.175);--quarto-scss-export-component-active-bg: #0d6efd;--quarto-scss-export-component-active-color: #ffffff;--quarto-scss-export-focus-ring-color: rgba(13, 110, 253, 0.25);--quarto-scss-export-headings-font-family: ;--quarto-scss-export-headings-font-style: ;--quarto-scss-export-display-font-family: ;--quarto-scss-export-display-font-style: ;--quarto-scss-export-text-muted: rgba(33, 37, 41, 0.75);--quarto-scss-export-blockquote-footer-color: #6c757d;--quarto-scss-export-blockquote-border-color: #e9ecef;--quarto-scss-export-hr-bg-color: ;--quarto-scss-export-hr-height: ;--quarto-scss-export-hr-border-color: ;--quarto-scss-export-legend-font-weight: ;--quarto-scss-export-mark-bg: #fff3cd;--quarto-scss-export-table-color: #212529;--quarto-scss-export-table-bg: #ffffff;--quarto-scss-export-table-accent-bg: transparent;--quarto-scss-export-table-th-font-weight: ;--quarto-scss-export-table-striped-color: #212529;--quarto-scss-export-table-striped-bg: rgba(0, 0, 0, 0.05);--quarto-scss-export-table-active-color: #212529;--quarto-scss-export-table-active-bg: rgba(0, 0, 0, 0.1);--quarto-scss-export-table-hover-color: #212529;--quarto-scss-export-table-hover-bg: rgba(0, 0, 0, 0.075);--quarto-scss-export-table-caption-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-input-btn-font-family: ;--quarto-scss-export-input-btn-focus-color: rgba(13, 110, 253, 0.25);--quarto-scss-export-btn-color: #212529;--quarto-scss-export-btn-font-family: ;--quarto-scss-export-btn-white-space: ;--quarto-scss-export-btn-link-color: #0d6efd;--quarto-scss-export-btn-link-hover-color: #0a58ca;--quarto-scss-export-btn-link-disabled-color: #6c757d;--quarto-scss-export-form-text-font-style: ;--quarto-scss-export-form-text-font-weight: ;--quarto-scss-export-form-text-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-form-label-font-size: ;--quarto-scss-export-form-label-font-style: ;--quarto-scss-export-form-label-font-weight: ;--quarto-scss-export-form-label-color: ;--quarto-scss-export-input-font-family: ;--quarto-scss-export-input-disabled-color: ;--quarto-scss-export-input-disabled-bg: #e9ecef;--quarto-scss-export-input-disabled-border-color: ;--quarto-scss-export-input-color: #212529;--quarto-scss-export-input-focus-bg: #ffffff;--quarto-scss-export-input-focus-border-color: #86b7fe;--quarto-scss-export-input-focus-color: #212529;--quarto-scss-export-input-placeholder-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-input-plaintext-color: #212529;--quarto-scss-export-form-check-label-color: ;--quarto-scss-export-form-check-transition: ;--quarto-scss-export-form-check-input-bg: #ffffff;--quarto-scss-export-form-check-input-focus-border: #86b7fe;--quarto-scss-export-form-check-input-checked-color: #ffffff;--quarto-scss-export-form-check-input-checked-bg-color: #0d6efd;--quarto-scss-export-form-check-input-checked-border-color: #0d6efd;--quarto-scss-export-form-check-input-indeterminate-color: #ffffff;--quarto-scss-export-form-check-input-indeterminate-bg-color: #0d6efd;--quarto-scss-export-form-check-input-indeterminate-border-color: #0d6efd;--quarto-scss-export-form-switch-color: rgba(0, 0, 0, 0.25);--quarto-scss-export-form-switch-focus-color: #86b7fe;--quarto-scss-export-form-switch-checked-color: #ffffff;--quarto-scss-export-input-group-addon-color: #212529;--quarto-scss-export-input-group-addon-bg: #f8f9fa;--quarto-scss-export-input-group-addon-border-color: white;--quarto-scss-export-form-select-font-family: ;--quarto-scss-export-form-select-color: #212529;--quarto-scss-export-form-select-bg: #ffffff;--quarto-scss-export-form-select-disabled-color: ;--quarto-scss-export-form-select-disabled-bg: #e9ecef;--quarto-scss-export-form-select-disabled-border-color: ;--quarto-scss-export-form-select-indicator-color: #343a40;--quarto-scss-export-form-select-border-color: white;--quarto-scss-export-form-select-focus-border-color: #86b7fe;--quarto-scss-export-form-range-track-bg: #f8f9fa;--quarto-scss-export-form-range-thumb-bg: #0d6efd;--quarto-scss-export-form-range-thumb-active-bg: #b6d4fe;--quarto-scss-export-form-range-thumb-disabled-bg: rgba(33, 37, 41, 0.75);--quarto-scss-export-form-file-button-color: #212529;--quarto-scss-export-form-file-button-bg: #f8f9fa;--quarto-scss-export-form-file-button-hover-bg: #e9ecef;--quarto-scss-export-form-floating-label-disabled-color: #6c757d;--quarto-scss-export-form-feedback-font-style: ;--quarto-scss-export-form-feedback-valid-color: #198754;--quarto-scss-export-form-feedback-invalid-color: #dc3545;--quarto-scss-export-form-feedback-icon-valid-color: #198754;--quarto-scss-export-form-feedback-icon-invalid-color: #dc3545;--quarto-scss-export-form-valid-color: #198754;--quarto-scss-export-form-valid-border-color: #198754;--quarto-scss-export-form-invalid-color: #dc3545;--quarto-scss-export-form-invalid-border-color: #dc3545;--quarto-scss-export-nav-link-font-size: ;--quarto-scss-export-nav-link-font-weight: ;--quarto-scss-export-nav-link-color: #0d6efd;--quarto-scss-export-nav-link-hover-color: #0a58ca;--quarto-scss-export-nav-link-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-nav-tabs-border-color: white;--quarto-scss-export-nav-tabs-link-hover-border-color: #e9ecef #e9ecef white;--quarto-scss-export-nav-tabs-link-active-color: #000;--quarto-scss-export-nav-tabs-link-active-bg: #ffffff;--quarto-scss-export-nav-pills-link-active-bg: #0d6efd;--quarto-scss-export-nav-pills-link-active-color: #ffffff;--quarto-scss-export-nav-underline-link-active-color: #000;--quarto-scss-export-navbar-padding-x: ;--quarto-scss-export-navbar-light-contrast: #ffffff;--quarto-scss-export-navbar-dark-contrast: #ffffff;--quarto-scss-export-navbar-light-icon-color: rgba(255, 255, 255, 0.75);--quarto-scss-export-navbar-dark-icon-color: rgba(255, 255, 255, 0.75);--quarto-scss-export-dropdown-color: #212529;--quarto-scss-export-dropdown-bg: #ffffff;--quarto-scss-export-dropdown-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-link-color: #212529;--quarto-scss-export-dropdown-link-hover-color: #212529;--quarto-scss-export-dropdown-link-hover-bg: #f8f9fa;--quarto-scss-export-dropdown-link-active-bg: #0d6efd;--quarto-scss-export-dropdown-link-active-color: #ffffff;--quarto-scss-export-dropdown-link-disabled-color: rgba(33, 37, 41, 0.5);--quarto-scss-export-dropdown-header-color: #6c757d;--quarto-scss-export-dropdown-dark-color: #dee2e6;--quarto-scss-export-dropdown-dark-bg: #343a40;--quarto-scss-export-dropdown-dark-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-dark-divider-bg: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-dark-box-shadow: ;--quarto-scss-export-dropdown-dark-link-color: #dee2e6;--quarto-scss-export-dropdown-dark-link-hover-color: #ffffff;--quarto-scss-export-dropdown-dark-link-hover-bg: rgba(255, 255, 255, 0.15);--quarto-scss-export-dropdown-dark-link-active-color: #ffffff;--quarto-scss-export-dropdown-dark-link-active-bg: #0d6efd;--quarto-scss-export-dropdown-dark-link-disabled-color: #adb5bd;--quarto-scss-export-dropdown-dark-header-color: #adb5bd;--quarto-scss-export-pagination-color: #0d6efd;--quarto-scss-export-pagination-bg: #ffffff;--quarto-scss-export-pagination-border-color: white;--quarto-scss-export-pagination-focus-color: #0a58ca;--quarto-scss-export-pagination-focus-bg: #e9ecef;--quarto-scss-export-pagination-hover-color: #0a58ca;--quarto-scss-export-pagination-hover-bg: #f8f9fa;--quarto-scss-export-pagination-hover-border-color: white;--quarto-scss-export-pagination-active-color: #ffffff;--quarto-scss-export-pagination-active-bg: #0d6efd;--quarto-scss-export-pagination-active-border-color: #0d6efd;--quarto-scss-export-pagination-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-pagination-disabled-bg: #e9ecef;--quarto-scss-export-pagination-disabled-border-color: white;--quarto-scss-export-card-title-color: ;--quarto-scss-export-card-subtitle-color: ;--quarto-scss-export-card-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-card-box-shadow: ;--quarto-scss-export-card-cap-bg: rgba(33, 37, 41, 0.03);--quarto-scss-export-card-cap-color: ;--quarto-scss-export-card-height: ;--quarto-scss-export-card-color: ;--quarto-scss-export-card-bg: #ffffff;--quarto-scss-export-accordion-color: #212529;--quarto-scss-export-accordion-bg: #ffffff;--quarto-scss-export-accordion-border-color: white;--quarto-scss-export-accordion-button-color: #212529;--quarto-scss-export-accordion-button-bg: #ffffff;--quarto-scss-export-accordion-button-active-bg: #cfe2ff;--quarto-scss-export-accordion-button-active-color: #052c65;--quarto-scss-export-accordion-button-focus-border-color: #86b7fe;--quarto-scss-export-accordion-icon-color: #212529;--quarto-scss-export-accordion-icon-active-color: #052c65;--quarto-scss-export-tooltip-color: #ffffff;--quarto-scss-export-tooltip-bg: #000;--quarto-scss-export-tooltip-margin: ;--quarto-scss-export-tooltip-arrow-color: ;--quarto-scss-export-form-feedback-tooltip-line-height: ;--quarto-scss-export-popover-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-popover-header-bg: #e9ecef;--quarto-scss-export-popover-body-color: #212529;--quarto-scss-export-popover-arrow-color: #ffffff;--quarto-scss-export-popover-arrow-outer-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-toast-color: ;--quarto-scss-export-toast-background-color: rgba(255, 255, 255, 0.85);--quarto-scss-export-toast-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-toast-header-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-toast-header-background-color: rgba(255, 255, 255, 0.85);--quarto-scss-export-toast-header-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-badge-color: #ffffff;--quarto-scss-export-modal-content-color: ;--quarto-scss-export-modal-content-bg: #ffffff;--quarto-scss-export-modal-content-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-modal-backdrop-bg: #000;--quarto-scss-export-modal-header-border-color: white;--quarto-scss-export-modal-footer-bg: ;--quarto-scss-export-modal-footer-border-color: white;--quarto-scss-export-progress-bg: #e9ecef;--quarto-scss-export-progress-bar-color: #ffffff;--quarto-scss-export-progress-bar-bg: #0d6efd;--quarto-scss-export-list-group-color: #212529;--quarto-scss-export-list-group-bg: #ffffff;--quarto-scss-export-list-group-border-color: white;--quarto-scss-export-list-group-hover-bg: #f8f9fa;--quarto-scss-export-list-group-active-bg: #0d6efd;--quarto-scss-export-list-group-active-color: #ffffff;--quarto-scss-export-list-group-active-border-color: #0d6efd;--quarto-scss-export-list-group-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-list-group-disabled-bg: #ffffff;--quarto-scss-export-list-group-action-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-list-group-action-hover-color: #000;--quarto-scss-export-list-group-action-active-color: #212529;--quarto-scss-export-list-group-action-active-bg: #e9ecef;--quarto-scss-export-thumbnail-bg: #ffffff;--quarto-scss-export-thumbnail-border-color: white;--quarto-scss-export-figure-caption-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-font-size: ;--quarto-scss-export-breadcrumb-bg: ;--quarto-scss-export-breadcrumb-divider-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-active-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-border-radius: ;--quarto-scss-export-carousel-control-color: #ffffff;--quarto-scss-export-carousel-indicator-active-bg: #ffffff;--quarto-scss-export-carousel-caption-color: #ffffff;--quarto-scss-export-carousel-dark-indicator-active-bg: #000;--quarto-scss-export-carousel-dark-caption-color: #000;--quarto-scss-export-btn-close-color: #000;--quarto-scss-export-offcanvas-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-offcanvas-bg-color: #ffffff;--quarto-scss-export-offcanvas-color: #212529;--quarto-scss-export-offcanvas-backdrop-bg: #000;--quarto-scss-export-code-color-dark: white;--quarto-scss-export-kbd-color: #ffffff;--quarto-scss-export-kbd-bg: #212529;--quarto-scss-export-nested-kbd-font-weight: ;--quarto-scss-export-pre-bg: #f8f9fa;--quarto-scss-export-pre-color: #000;--quarto-scss-export-bslib-page-sidebar-title-bg: #517699;--quarto-scss-export-bslib-page-sidebar-title-color: #ffffff;--quarto-scss-export-bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--quarto-scss-export-bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--quarto-scss-export-mermaid-bg-color: #ffffff;--quarto-scss-export-mermaid-edge-color: #6c757d;--quarto-scss-export-mermaid-node-fg-color: #212529;--quarto-scss-export-mermaid-fg-color: #212529;--quarto-scss-export-mermaid-fg-color--lighter: #383f45;--quarto-scss-export-mermaid-fg-color--lightest: #4e5862;--quarto-scss-export-mermaid-label-bg-color: #ffffff;--quarto-scss-export-mermaid-label-fg-color: #0d6efd;--quarto-scss-export-mermaid-node-bg-color: rgba(13, 110, 253, 0.1);--quarto-scss-export-code-block-border-left-color: white;--quarto-scss-export-callout-color-note: #0d6efd;--quarto-scss-export-callout-color-tip: #198754;--quarto-scss-export-callout-color-important: #dc3545;--quarto-scss-export-callout-color-caution: #fd7e14;--quarto-scss-export-callout-color-warning: #ffc107} \ No newline at end of file diff --git a/docs/validmind/errors_files/libs/bootstrap/bootstrap-icons.css b/docs/validmind/errors_files/libs/bootstrap/bootstrap-icons.css new file mode 100644 index 000000000..285e4448f --- /dev/null +++ b/docs/validmind/errors_files/libs/bootstrap/bootstrap-icons.css @@ -0,0 +1,2078 @@ +/*! + * Bootstrap Icons v1.11.1 (https://icons.getbootstrap.com/) + * Copyright 2019-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) + */ + +@font-face { + font-display: block; + font-family: "bootstrap-icons"; + src: +url("./bootstrap-icons.woff?2820a3852bdb9a5832199cc61cec4e65") format("woff"); +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-family: bootstrap-icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-123::before { content: "\f67f"; } +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-3d-fill::before { content: "\f15a"; } +.bi-badge-3d::before { content: "\f15b"; } +.bi-badge-4k-fill::before { content: "\f15c"; } +.bi-badge-4k::before { content: "\f15d"; } +.bi-badge-8k-fill::before { content: "\f15e"; } +.bi-badge-8k::before { content: "\f15f"; } +.bi-badge-ad-fill::before { content: "\f160"; } +.bi-badge-ad::before { content: "\f161"; } +.bi-badge-ar-fill::before { content: "\f162"; } +.bi-badge-ar::before { content: "\f163"; } +.bi-badge-cc-fill::before { content: "\f164"; } +.bi-badge-cc::before { content: "\f165"; } +.bi-badge-hd-fill::before { content: "\f166"; } +.bi-badge-hd::before { content: "\f167"; } +.bi-badge-tm-fill::before { content: "\f168"; } +.bi-badge-tm::before { content: "\f169"; } +.bi-badge-vo-fill::before { content: "\f16a"; } +.bi-badge-vo::before { content: "\f16b"; } +.bi-badge-vr-fill::before { content: "\f16c"; } +.bi-badge-vr::before { content: "\f16d"; } +.bi-badge-wc-fill::before { content: "\f16e"; } +.bi-badge-wc::before { content: "\f16f"; } +.bi-bag-check-fill::before { content: "\f170"; } +.bi-bag-check::before { content: "\f171"; } +.bi-bag-dash-fill::before { content: "\f172"; } +.bi-bag-dash::before { content: "\f173"; } +.bi-bag-fill::before { content: "\f174"; } +.bi-bag-plus-fill::before { content: "\f175"; } +.bi-bag-plus::before { content: "\f176"; } +.bi-bag-x-fill::before { content: "\f177"; } +.bi-bag-x::before { content: "\f178"; } +.bi-bag::before { content: "\f179"; } +.bi-bar-chart-fill::before { content: "\f17a"; } +.bi-bar-chart-line-fill::before { content: "\f17b"; } +.bi-bar-chart-line::before { content: "\f17c"; } +.bi-bar-chart-steps::before { content: "\f17d"; } +.bi-bar-chart::before { content: "\f17e"; } +.bi-basket-fill::before { content: "\f17f"; } +.bi-basket::before { content: "\f180"; } +.bi-basket2-fill::before { content: "\f181"; } +.bi-basket2::before { content: "\f182"; } +.bi-basket3-fill::before { content: "\f183"; } +.bi-basket3::before { content: "\f184"; } +.bi-battery-charging::before { content: "\f185"; } +.bi-battery-full::before { content: "\f186"; } +.bi-battery-half::before { content: "\f187"; } +.bi-battery::before { content: "\f188"; } +.bi-bell-fill::before { content: "\f189"; } +.bi-bell::before { content: "\f18a"; } +.bi-bezier::before { content: "\f18b"; } +.bi-bezier2::before { content: "\f18c"; } +.bi-bicycle::before { content: "\f18d"; } +.bi-binoculars-fill::before { content: "\f18e"; } +.bi-binoculars::before { content: "\f18f"; } +.bi-blockquote-left::before { content: "\f190"; } +.bi-blockquote-right::before { content: "\f191"; } +.bi-book-fill::before { content: "\f192"; } +.bi-book-half::before { content: "\f193"; } +.bi-book::before { content: "\f194"; } +.bi-bookmark-check-fill::before { content: "\f195"; } +.bi-bookmark-check::before { content: "\f196"; } +.bi-bookmark-dash-fill::before { content: "\f197"; } +.bi-bookmark-dash::before { content: "\f198"; } +.bi-bookmark-fill::before { content: "\f199"; } +.bi-bookmark-heart-fill::before { content: "\f19a"; } +.bi-bookmark-heart::before { content: "\f19b"; } +.bi-bookmark-plus-fill::before { content: "\f19c"; } +.bi-bookmark-plus::before { content: "\f19d"; } +.bi-bookmark-star-fill::before { content: "\f19e"; } +.bi-bookmark-star::before { content: "\f19f"; } +.bi-bookmark-x-fill::before { content: "\f1a0"; } +.bi-bookmark-x::before { content: "\f1a1"; } +.bi-bookmark::before { content: "\f1a2"; } +.bi-bookmarks-fill::before { content: "\f1a3"; } +.bi-bookmarks::before { content: "\f1a4"; } +.bi-bookshelf::before { content: "\f1a5"; } +.bi-bootstrap-fill::before { content: "\f1a6"; } +.bi-bootstrap-reboot::before { content: "\f1a7"; } +.bi-bootstrap::before { content: "\f1a8"; } +.bi-border-all::before { content: "\f1a9"; } +.bi-border-bottom::before { content: "\f1aa"; } +.bi-border-center::before { content: "\f1ab"; } +.bi-border-inner::before { content: "\f1ac"; } +.bi-border-left::before { content: "\f1ad"; } +.bi-border-middle::before { content: "\f1ae"; } +.bi-border-outer::before { content: "\f1af"; } +.bi-border-right::before { content: "\f1b0"; } +.bi-border-style::before { content: "\f1b1"; } +.bi-border-top::before { content: "\f1b2"; } +.bi-border-width::before { content: "\f1b3"; } +.bi-border::before { content: "\f1b4"; } +.bi-bounding-box-circles::before { content: "\f1b5"; } +.bi-bounding-box::before { content: "\f1b6"; } +.bi-box-arrow-down-left::before { content: "\f1b7"; } +.bi-box-arrow-down-right::before { content: "\f1b8"; } +.bi-box-arrow-down::before { content: "\f1b9"; } +.bi-box-arrow-in-down-left::before { content: "\f1ba"; } +.bi-box-arrow-in-down-right::before { content: "\f1bb"; } +.bi-box-arrow-in-down::before { content: "\f1bc"; } +.bi-box-arrow-in-left::before { content: "\f1bd"; } +.bi-box-arrow-in-right::before { content: "\f1be"; } +.bi-box-arrow-in-up-left::before { content: "\f1bf"; } +.bi-box-arrow-in-up-right::before { content: "\f1c0"; } +.bi-box-arrow-in-up::before { content: "\f1c1"; } +.bi-box-arrow-left::before { content: "\f1c2"; } +.bi-box-arrow-right::before { content: "\f1c3"; } +.bi-box-arrow-up-left::before { content: "\f1c4"; } +.bi-box-arrow-up-right::before { content: "\f1c5"; } +.bi-box-arrow-up::before { content: "\f1c6"; } +.bi-box-seam::before { content: "\f1c7"; } +.bi-box::before { content: "\f1c8"; } +.bi-braces::before { content: "\f1c9"; } +.bi-bricks::before { content: "\f1ca"; } +.bi-briefcase-fill::before { content: "\f1cb"; } +.bi-briefcase::before { content: "\f1cc"; } +.bi-brightness-alt-high-fill::before { content: "\f1cd"; } +.bi-brightness-alt-high::before { content: "\f1ce"; } +.bi-brightness-alt-low-fill::before { content: "\f1cf"; } +.bi-brightness-alt-low::before { content: "\f1d0"; } +.bi-brightness-high-fill::before { content: "\f1d1"; } +.bi-brightness-high::before { content: "\f1d2"; } +.bi-brightness-low-fill::before { content: "\f1d3"; } +.bi-brightness-low::before { content: "\f1d4"; } +.bi-broadcast-pin::before { content: "\f1d5"; } +.bi-broadcast::before { content: "\f1d6"; } +.bi-brush-fill::before { content: "\f1d7"; } +.bi-brush::before { content: "\f1d8"; } +.bi-bucket-fill::before { content: "\f1d9"; } +.bi-bucket::before { content: "\f1da"; } +.bi-bug-fill::before { content: "\f1db"; } +.bi-bug::before { content: "\f1dc"; } +.bi-building::before { content: "\f1dd"; } +.bi-bullseye::before { content: "\f1de"; } +.bi-calculator-fill::before { content: "\f1df"; } +.bi-calculator::before { content: "\f1e0"; } +.bi-calendar-check-fill::before { content: "\f1e1"; } +.bi-calendar-check::before { content: "\f1e2"; } +.bi-calendar-date-fill::before { content: "\f1e3"; } +.bi-calendar-date::before { content: "\f1e4"; } +.bi-calendar-day-fill::before { content: "\f1e5"; } +.bi-calendar-day::before { content: "\f1e6"; } +.bi-calendar-event-fill::before { content: "\f1e7"; } +.bi-calendar-event::before { content: "\f1e8"; } +.bi-calendar-fill::before { content: "\f1e9"; } +.bi-calendar-minus-fill::before { content: "\f1ea"; } +.bi-calendar-minus::before { content: "\f1eb"; } +.bi-calendar-month-fill::before { content: "\f1ec"; } +.bi-calendar-month::before { content: "\f1ed"; } +.bi-calendar-plus-fill::before { content: "\f1ee"; } +.bi-calendar-plus::before { content: "\f1ef"; } +.bi-calendar-range-fill::before { content: "\f1f0"; } +.bi-calendar-range::before { content: "\f1f1"; } +.bi-calendar-week-fill::before { content: "\f1f2"; } +.bi-calendar-week::before { content: "\f1f3"; } +.bi-calendar-x-fill::before { content: "\f1f4"; } +.bi-calendar-x::before { content: "\f1f5"; } +.bi-calendar::before { content: "\f1f6"; } +.bi-calendar2-check-fill::before { content: "\f1f7"; } +.bi-calendar2-check::before { content: "\f1f8"; } +.bi-calendar2-date-fill::before { content: "\f1f9"; } +.bi-calendar2-date::before { content: "\f1fa"; } +.bi-calendar2-day-fill::before { content: "\f1fb"; } +.bi-calendar2-day::before { content: "\f1fc"; } +.bi-calendar2-event-fill::before { content: "\f1fd"; } +.bi-calendar2-event::before { content: "\f1fe"; } +.bi-calendar2-fill::before { content: "\f1ff"; } +.bi-calendar2-minus-fill::before { content: "\f200"; } +.bi-calendar2-minus::before { content: "\f201"; } +.bi-calendar2-month-fill::before { content: "\f202"; } +.bi-calendar2-month::before { content: "\f203"; } +.bi-calendar2-plus-fill::before { content: "\f204"; } +.bi-calendar2-plus::before { content: "\f205"; } +.bi-calendar2-range-fill::before { content: "\f206"; } +.bi-calendar2-range::before { content: "\f207"; } +.bi-calendar2-week-fill::before { content: "\f208"; } +.bi-calendar2-week::before { content: "\f209"; } +.bi-calendar2-x-fill::before { content: "\f20a"; } +.bi-calendar2-x::before { content: "\f20b"; } +.bi-calendar2::before { content: "\f20c"; } +.bi-calendar3-event-fill::before { content: "\f20d"; } +.bi-calendar3-event::before { content: "\f20e"; } +.bi-calendar3-fill::before { content: "\f20f"; } +.bi-calendar3-range-fill::before { content: "\f210"; } +.bi-calendar3-range::before { content: "\f211"; } +.bi-calendar3-week-fill::before { content: "\f212"; } +.bi-calendar3-week::before { content: "\f213"; } +.bi-calendar3::before { content: "\f214"; } +.bi-calendar4-event::before { content: "\f215"; } +.bi-calendar4-range::before { content: "\f216"; } +.bi-calendar4-week::before { content: "\f217"; } +.bi-calendar4::before { content: "\f218"; } +.bi-camera-fill::before { content: "\f219"; } +.bi-camera-reels-fill::before { content: "\f21a"; } +.bi-camera-reels::before { content: "\f21b"; } +.bi-camera-video-fill::before { content: "\f21c"; } +.bi-camera-video-off-fill::before { content: "\f21d"; } +.bi-camera-video-off::before { content: "\f21e"; } +.bi-camera-video::before { content: "\f21f"; } +.bi-camera::before { content: "\f220"; } +.bi-camera2::before { content: "\f221"; } +.bi-capslock-fill::before { content: "\f222"; } +.bi-capslock::before { content: "\f223"; } +.bi-card-checklist::before { content: "\f224"; } +.bi-card-heading::before { content: "\f225"; } +.bi-card-image::before { content: "\f226"; } +.bi-card-list::before { content: "\f227"; } +.bi-card-text::before { content: "\f228"; } +.bi-caret-down-fill::before { content: "\f229"; } +.bi-caret-down-square-fill::before { content: "\f22a"; } +.bi-caret-down-square::before { content: "\f22b"; } +.bi-caret-down::before { content: "\f22c"; } +.bi-caret-left-fill::before { content: "\f22d"; } +.bi-caret-left-square-fill::before { content: "\f22e"; } +.bi-caret-left-square::before { content: "\f22f"; } +.bi-caret-left::before { content: "\f230"; } +.bi-caret-right-fill::before { content: "\f231"; } +.bi-caret-right-square-fill::before { content: "\f232"; } +.bi-caret-right-square::before { content: "\f233"; } +.bi-caret-right::before { content: "\f234"; } +.bi-caret-up-fill::before { content: "\f235"; } +.bi-caret-up-square-fill::before { content: "\f236"; } +.bi-caret-up-square::before { content: "\f237"; } +.bi-caret-up::before { content: "\f238"; } +.bi-cart-check-fill::before { content: "\f239"; } +.bi-cart-check::before { content: "\f23a"; } +.bi-cart-dash-fill::before { content: "\f23b"; } +.bi-cart-dash::before { content: "\f23c"; } +.bi-cart-fill::before { content: "\f23d"; } +.bi-cart-plus-fill::before { content: "\f23e"; } +.bi-cart-plus::before { content: "\f23f"; } +.bi-cart-x-fill::before { content: "\f240"; } +.bi-cart-x::before { content: "\f241"; } +.bi-cart::before { content: "\f242"; } +.bi-cart2::before { content: "\f243"; } +.bi-cart3::before { content: "\f244"; } +.bi-cart4::before { content: "\f245"; } +.bi-cash-stack::before { content: "\f246"; } +.bi-cash::before { content: "\f247"; } +.bi-cast::before { content: "\f248"; } +.bi-chat-dots-fill::before { content: "\f249"; } +.bi-chat-dots::before { content: "\f24a"; } +.bi-chat-fill::before { content: "\f24b"; } +.bi-chat-left-dots-fill::before { content: "\f24c"; } +.bi-chat-left-dots::before { content: "\f24d"; } +.bi-chat-left-fill::before { content: "\f24e"; } +.bi-chat-left-quote-fill::before { content: "\f24f"; } +.bi-chat-left-quote::before { content: "\f250"; } +.bi-chat-left-text-fill::before { content: "\f251"; } +.bi-chat-left-text::before { content: "\f252"; } +.bi-chat-left::before { content: "\f253"; } +.bi-chat-quote-fill::before { content: "\f254"; } +.bi-chat-quote::before { content: "\f255"; } +.bi-chat-right-dots-fill::before { content: "\f256"; } +.bi-chat-right-dots::before { content: "\f257"; } +.bi-chat-right-fill::before { content: "\f258"; } +.bi-chat-right-quote-fill::before { content: "\f259"; } +.bi-chat-right-quote::before { content: "\f25a"; } +.bi-chat-right-text-fill::before { content: "\f25b"; } +.bi-chat-right-text::before { content: "\f25c"; } +.bi-chat-right::before { content: "\f25d"; } +.bi-chat-square-dots-fill::before { content: "\f25e"; } +.bi-chat-square-dots::before { content: "\f25f"; } +.bi-chat-square-fill::before { content: "\f260"; } +.bi-chat-square-quote-fill::before { content: "\f261"; } +.bi-chat-square-quote::before { content: "\f262"; } +.bi-chat-square-text-fill::before { content: "\f263"; } +.bi-chat-square-text::before { content: "\f264"; } +.bi-chat-square::before { content: "\f265"; } +.bi-chat-text-fill::before { content: "\f266"; } +.bi-chat-text::before { content: "\f267"; } +.bi-chat::before { content: "\f268"; } +.bi-check-all::before { content: "\f269"; } +.bi-check-circle-fill::before { content: "\f26a"; } +.bi-check-circle::before { content: "\f26b"; } +.bi-check-square-fill::before { content: "\f26c"; } +.bi-check-square::before { content: "\f26d"; } +.bi-check::before { content: "\f26e"; } +.bi-check2-all::before { content: "\f26f"; } +.bi-check2-circle::before { content: "\f270"; } +.bi-check2-square::before { content: "\f271"; } +.bi-check2::before { content: "\f272"; } +.bi-chevron-bar-contract::before { content: "\f273"; } +.bi-chevron-bar-down::before { content: "\f274"; } +.bi-chevron-bar-expand::before { content: "\f275"; } +.bi-chevron-bar-left::before { content: "\f276"; } +.bi-chevron-bar-right::before { content: "\f277"; } +.bi-chevron-bar-up::before { content: "\f278"; } +.bi-chevron-compact-down::before { content: "\f279"; } +.bi-chevron-compact-left::before { content: "\f27a"; } +.bi-chevron-compact-right::before { content: "\f27b"; } +.bi-chevron-compact-up::before { content: "\f27c"; } +.bi-chevron-contract::before { content: "\f27d"; } +.bi-chevron-double-down::before { content: "\f27e"; } +.bi-chevron-double-left::before { content: "\f27f"; } +.bi-chevron-double-right::before { content: "\f280"; } +.bi-chevron-double-up::before { content: "\f281"; } +.bi-chevron-down::before { content: "\f282"; } +.bi-chevron-expand::before { content: "\f283"; } +.bi-chevron-left::before { content: "\f284"; } +.bi-chevron-right::before { content: "\f285"; } +.bi-chevron-up::before { content: "\f286"; } +.bi-circle-fill::before { content: "\f287"; } +.bi-circle-half::before { content: "\f288"; } +.bi-circle-square::before { content: "\f289"; } +.bi-circle::before { content: "\f28a"; } +.bi-clipboard-check::before { content: "\f28b"; } +.bi-clipboard-data::before { content: "\f28c"; } +.bi-clipboard-minus::before { content: "\f28d"; } +.bi-clipboard-plus::before { content: "\f28e"; } +.bi-clipboard-x::before { content: "\f28f"; } +.bi-clipboard::before { content: "\f290"; } +.bi-clock-fill::before { content: "\f291"; } +.bi-clock-history::before { content: "\f292"; } +.bi-clock::before { content: "\f293"; } +.bi-cloud-arrow-down-fill::before { content: "\f294"; } +.bi-cloud-arrow-down::before { content: "\f295"; } +.bi-cloud-arrow-up-fill::before { content: "\f296"; } +.bi-cloud-arrow-up::before { content: "\f297"; } +.bi-cloud-check-fill::before { content: "\f298"; } +.bi-cloud-check::before { content: "\f299"; } +.bi-cloud-download-fill::before { content: "\f29a"; } +.bi-cloud-download::before { content: "\f29b"; } +.bi-cloud-drizzle-fill::before { content: "\f29c"; } +.bi-cloud-drizzle::before { content: "\f29d"; } +.bi-cloud-fill::before { content: "\f29e"; } +.bi-cloud-fog-fill::before { content: "\f29f"; } +.bi-cloud-fog::before { content: "\f2a0"; } +.bi-cloud-fog2-fill::before { content: "\f2a1"; } +.bi-cloud-fog2::before { content: "\f2a2"; } +.bi-cloud-hail-fill::before { content: "\f2a3"; } +.bi-cloud-hail::before { content: "\f2a4"; } +.bi-cloud-haze-fill::before { content: "\f2a6"; } +.bi-cloud-haze::before { content: "\f2a7"; } +.bi-cloud-haze2-fill::before { content: "\f2a8"; } +.bi-cloud-lightning-fill::before { content: "\f2a9"; } +.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } +.bi-cloud-lightning-rain::before { content: "\f2ab"; } +.bi-cloud-lightning::before { content: "\f2ac"; } +.bi-cloud-minus-fill::before { content: "\f2ad"; } +.bi-cloud-minus::before { content: "\f2ae"; } +.bi-cloud-moon-fill::before { content: "\f2af"; } +.bi-cloud-moon::before { content: "\f2b0"; } +.bi-cloud-plus-fill::before { content: "\f2b1"; } +.bi-cloud-plus::before { content: "\f2b2"; } +.bi-cloud-rain-fill::before { content: "\f2b3"; } +.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } +.bi-cloud-rain-heavy::before { content: "\f2b5"; } +.bi-cloud-rain::before { content: "\f2b6"; } +.bi-cloud-slash-fill::before { content: "\f2b7"; } +.bi-cloud-slash::before { content: "\f2b8"; } +.bi-cloud-sleet-fill::before { content: "\f2b9"; } +.bi-cloud-sleet::before { content: "\f2ba"; } +.bi-cloud-snow-fill::before { content: "\f2bb"; } +.bi-cloud-snow::before { content: "\f2bc"; } +.bi-cloud-sun-fill::before { content: "\f2bd"; } +.bi-cloud-sun::before { content: "\f2be"; } +.bi-cloud-upload-fill::before { content: "\f2bf"; } +.bi-cloud-upload::before { content: "\f2c0"; } +.bi-cloud::before { content: "\f2c1"; } +.bi-clouds-fill::before { content: "\f2c2"; } +.bi-clouds::before { content: "\f2c3"; } +.bi-cloudy-fill::before { content: "\f2c4"; } +.bi-cloudy::before { content: "\f2c5"; } +.bi-code-slash::before { content: "\f2c6"; } +.bi-code-square::before { content: "\f2c7"; } +.bi-code::before { content: "\f2c8"; } +.bi-collection-fill::before { content: "\f2c9"; } +.bi-collection-play-fill::before { content: "\f2ca"; } +.bi-collection-play::before { content: "\f2cb"; } +.bi-collection::before { content: "\f2cc"; } +.bi-columns-gap::before { content: "\f2cd"; } +.bi-columns::before { content: "\f2ce"; } +.bi-command::before { content: "\f2cf"; } +.bi-compass-fill::before { content: "\f2d0"; } +.bi-compass::before { content: "\f2d1"; } +.bi-cone-striped::before { content: "\f2d2"; } +.bi-cone::before { content: "\f2d3"; } +.bi-controller::before { content: "\f2d4"; } +.bi-cpu-fill::before { content: "\f2d5"; } +.bi-cpu::before { content: "\f2d6"; } +.bi-credit-card-2-back-fill::before { content: "\f2d7"; } +.bi-credit-card-2-back::before { content: "\f2d8"; } +.bi-credit-card-2-front-fill::before { content: "\f2d9"; } +.bi-credit-card-2-front::before { content: "\f2da"; } +.bi-credit-card-fill::before { content: "\f2db"; } +.bi-credit-card::before { content: "\f2dc"; } +.bi-crop::before { content: "\f2dd"; } +.bi-cup-fill::before { content: "\f2de"; } +.bi-cup-straw::before { content: "\f2df"; } +.bi-cup::before { content: "\f2e0"; } +.bi-cursor-fill::before { content: "\f2e1"; } +.bi-cursor-text::before { content: "\f2e2"; } +.bi-cursor::before { content: "\f2e3"; } +.bi-dash-circle-dotted::before { content: "\f2e4"; } +.bi-dash-circle-fill::before { content: "\f2e5"; } +.bi-dash-circle::before { content: "\f2e6"; } +.bi-dash-square-dotted::before { content: "\f2e7"; } +.bi-dash-square-fill::before { content: "\f2e8"; } +.bi-dash-square::before { content: "\f2e9"; } +.bi-dash::before { content: "\f2ea"; } +.bi-diagram-2-fill::before { content: "\f2eb"; } +.bi-diagram-2::before { content: "\f2ec"; } +.bi-diagram-3-fill::before { content: "\f2ed"; } +.bi-diagram-3::before { content: "\f2ee"; } +.bi-diamond-fill::before { content: "\f2ef"; } +.bi-diamond-half::before { content: "\f2f0"; } +.bi-diamond::before { content: "\f2f1"; } +.bi-dice-1-fill::before { content: "\f2f2"; } +.bi-dice-1::before { content: "\f2f3"; } +.bi-dice-2-fill::before { content: "\f2f4"; } +.bi-dice-2::before { content: "\f2f5"; } +.bi-dice-3-fill::before { content: "\f2f6"; } +.bi-dice-3::before { content: "\f2f7"; } +.bi-dice-4-fill::before { content: "\f2f8"; } +.bi-dice-4::before { content: "\f2f9"; } +.bi-dice-5-fill::before { content: "\f2fa"; } +.bi-dice-5::before { content: "\f2fb"; } +.bi-dice-6-fill::before { content: "\f2fc"; } +.bi-dice-6::before { content: "\f2fd"; } +.bi-disc-fill::before { content: "\f2fe"; } +.bi-disc::before { content: "\f2ff"; } +.bi-discord::before { content: "\f300"; } +.bi-display-fill::before { content: "\f301"; } +.bi-display::before { content: "\f302"; } +.bi-distribute-horizontal::before { content: "\f303"; } +.bi-distribute-vertical::before { content: "\f304"; } +.bi-door-closed-fill::before { content: "\f305"; } +.bi-door-closed::before { content: "\f306"; } +.bi-door-open-fill::before { content: "\f307"; } +.bi-door-open::before { content: "\f308"; } +.bi-dot::before { content: "\f309"; } +.bi-download::before { content: "\f30a"; } +.bi-droplet-fill::before { content: "\f30b"; } +.bi-droplet-half::before { content: "\f30c"; } +.bi-droplet::before { content: "\f30d"; } +.bi-earbuds::before { content: "\f30e"; } +.bi-easel-fill::before { content: "\f30f"; } +.bi-easel::before { content: "\f310"; } +.bi-egg-fill::before { content: "\f311"; } +.bi-egg-fried::before { content: "\f312"; } +.bi-egg::before { content: "\f313"; } +.bi-eject-fill::before { content: "\f314"; } +.bi-eject::before { content: "\f315"; } +.bi-emoji-angry-fill::before { content: "\f316"; } +.bi-emoji-angry::before { content: "\f317"; } +.bi-emoji-dizzy-fill::before { content: "\f318"; } +.bi-emoji-dizzy::before { content: "\f319"; } +.bi-emoji-expressionless-fill::before { content: "\f31a"; } +.bi-emoji-expressionless::before { content: "\f31b"; } +.bi-emoji-frown-fill::before { content: "\f31c"; } +.bi-emoji-frown::before { content: "\f31d"; } +.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } +.bi-emoji-heart-eyes::before { content: "\f31f"; } +.bi-emoji-laughing-fill::before { content: "\f320"; } +.bi-emoji-laughing::before { content: "\f321"; } +.bi-emoji-neutral-fill::before { content: "\f322"; } +.bi-emoji-neutral::before { content: "\f323"; } +.bi-emoji-smile-fill::before { content: "\f324"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } +.bi-emoji-smile-upside-down::before { content: "\f326"; } +.bi-emoji-smile::before { content: "\f327"; } +.bi-emoji-sunglasses-fill::before { content: "\f328"; } +.bi-emoji-sunglasses::before { content: "\f329"; } +.bi-emoji-wink-fill::before { content: "\f32a"; } +.bi-emoji-wink::before { content: "\f32b"; } +.bi-envelope-fill::before { content: "\f32c"; } +.bi-envelope-open-fill::before { content: "\f32d"; } +.bi-envelope-open::before { content: "\f32e"; } +.bi-envelope::before { content: "\f32f"; } +.bi-eraser-fill::before { content: "\f330"; } +.bi-eraser::before { content: "\f331"; } +.bi-exclamation-circle-fill::before { content: "\f332"; } +.bi-exclamation-circle::before { content: "\f333"; } +.bi-exclamation-diamond-fill::before { content: "\f334"; } +.bi-exclamation-diamond::before { content: "\f335"; } +.bi-exclamation-octagon-fill::before { content: "\f336"; } +.bi-exclamation-octagon::before { content: "\f337"; } +.bi-exclamation-square-fill::before { content: "\f338"; } +.bi-exclamation-square::before { content: "\f339"; } +.bi-exclamation-triangle-fill::before { content: "\f33a"; } +.bi-exclamation-triangle::before { content: "\f33b"; } +.bi-exclamation::before { content: "\f33c"; } +.bi-exclude::before { content: "\f33d"; } +.bi-eye-fill::before { content: "\f33e"; } +.bi-eye-slash-fill::before { content: "\f33f"; } +.bi-eye-slash::before { content: "\f340"; } +.bi-eye::before { content: "\f341"; } +.bi-eyedropper::before { content: "\f342"; } +.bi-eyeglasses::before { content: "\f343"; } +.bi-facebook::before { content: "\f344"; } +.bi-file-arrow-down-fill::before { content: "\f345"; } +.bi-file-arrow-down::before { content: "\f346"; } +.bi-file-arrow-up-fill::before { content: "\f347"; } +.bi-file-arrow-up::before { content: "\f348"; } +.bi-file-bar-graph-fill::before { content: "\f349"; } +.bi-file-bar-graph::before { content: "\f34a"; } +.bi-file-binary-fill::before { content: "\f34b"; } +.bi-file-binary::before { content: "\f34c"; } +.bi-file-break-fill::before { content: "\f34d"; } +.bi-file-break::before { content: "\f34e"; } +.bi-file-check-fill::before { content: "\f34f"; } +.bi-file-check::before { content: "\f350"; } +.bi-file-code-fill::before { content: "\f351"; } +.bi-file-code::before { content: "\f352"; } +.bi-file-diff-fill::before { content: "\f353"; } +.bi-file-diff::before { content: "\f354"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } +.bi-file-earmark-arrow-down::before { content: "\f356"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } +.bi-file-earmark-arrow-up::before { content: "\f358"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } +.bi-file-earmark-bar-graph::before { content: "\f35a"; } +.bi-file-earmark-binary-fill::before { content: "\f35b"; } +.bi-file-earmark-binary::before { content: "\f35c"; } +.bi-file-earmark-break-fill::before { content: "\f35d"; } +.bi-file-earmark-break::before { content: "\f35e"; } +.bi-file-earmark-check-fill::before { content: "\f35f"; } +.bi-file-earmark-check::before { content: "\f360"; } +.bi-file-earmark-code-fill::before { content: "\f361"; } +.bi-file-earmark-code::before { content: "\f362"; } +.bi-file-earmark-diff-fill::before { content: "\f363"; } +.bi-file-earmark-diff::before { content: "\f364"; } +.bi-file-earmark-easel-fill::before { content: "\f365"; } +.bi-file-earmark-easel::before { content: "\f366"; } +.bi-file-earmark-excel-fill::before { content: "\f367"; } +.bi-file-earmark-excel::before { content: "\f368"; } +.bi-file-earmark-fill::before { content: "\f369"; } +.bi-file-earmark-font-fill::before { content: "\f36a"; } +.bi-file-earmark-font::before { content: "\f36b"; } +.bi-file-earmark-image-fill::before { content: "\f36c"; } +.bi-file-earmark-image::before { content: "\f36d"; } +.bi-file-earmark-lock-fill::before { content: "\f36e"; } +.bi-file-earmark-lock::before { content: "\f36f"; } +.bi-file-earmark-lock2-fill::before { content: "\f370"; } +.bi-file-earmark-lock2::before { content: "\f371"; } +.bi-file-earmark-medical-fill::before { content: "\f372"; } +.bi-file-earmark-medical::before { content: "\f373"; } +.bi-file-earmark-minus-fill::before { content: "\f374"; } +.bi-file-earmark-minus::before { content: "\f375"; } +.bi-file-earmark-music-fill::before { content: "\f376"; } +.bi-file-earmark-music::before { content: "\f377"; } +.bi-file-earmark-person-fill::before { content: "\f378"; } +.bi-file-earmark-person::before { content: "\f379"; } +.bi-file-earmark-play-fill::before { content: "\f37a"; } +.bi-file-earmark-play::before { content: "\f37b"; } +.bi-file-earmark-plus-fill::before { content: "\f37c"; } +.bi-file-earmark-plus::before { content: "\f37d"; } +.bi-file-earmark-post-fill::before { content: "\f37e"; } +.bi-file-earmark-post::before { content: "\f37f"; } +.bi-file-earmark-ppt-fill::before { content: "\f380"; } +.bi-file-earmark-ppt::before { content: "\f381"; } +.bi-file-earmark-richtext-fill::before { content: "\f382"; } +.bi-file-earmark-richtext::before { content: "\f383"; } +.bi-file-earmark-ruled-fill::before { content: "\f384"; } +.bi-file-earmark-ruled::before { content: "\f385"; } +.bi-file-earmark-slides-fill::before { content: "\f386"; } +.bi-file-earmark-slides::before { content: "\f387"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } +.bi-file-earmark-spreadsheet::before { content: "\f389"; } +.bi-file-earmark-text-fill::before { content: "\f38a"; } +.bi-file-earmark-text::before { content: "\f38b"; } +.bi-file-earmark-word-fill::before { content: "\f38c"; } +.bi-file-earmark-word::before { content: "\f38d"; } +.bi-file-earmark-x-fill::before { content: "\f38e"; } +.bi-file-earmark-x::before { content: "\f38f"; } +.bi-file-earmark-zip-fill::before { content: "\f390"; } +.bi-file-earmark-zip::before { content: "\f391"; } +.bi-file-earmark::before { content: "\f392"; } +.bi-file-easel-fill::before { content: "\f393"; } +.bi-file-easel::before { content: "\f394"; } +.bi-file-excel-fill::before { content: "\f395"; } +.bi-file-excel::before { content: "\f396"; } +.bi-file-fill::before { content: "\f397"; } +.bi-file-font-fill::before { content: "\f398"; } +.bi-file-font::before { content: "\f399"; } +.bi-file-image-fill::before { content: "\f39a"; } +.bi-file-image::before { content: "\f39b"; } +.bi-file-lock-fill::before { content: "\f39c"; } +.bi-file-lock::before { content: "\f39d"; } +.bi-file-lock2-fill::before { content: "\f39e"; } +.bi-file-lock2::before { content: "\f39f"; } +.bi-file-medical-fill::before { content: "\f3a0"; } +.bi-file-medical::before { content: "\f3a1"; } +.bi-file-minus-fill::before { content: "\f3a2"; } +.bi-file-minus::before { content: "\f3a3"; } +.bi-file-music-fill::before { content: "\f3a4"; } +.bi-file-music::before { content: "\f3a5"; } +.bi-file-person-fill::before { content: "\f3a6"; } +.bi-file-person::before { content: "\f3a7"; } +.bi-file-play-fill::before { content: "\f3a8"; } +.bi-file-play::before { content: "\f3a9"; } +.bi-file-plus-fill::before { content: "\f3aa"; } +.bi-file-plus::before { content: "\f3ab"; } +.bi-file-post-fill::before { content: "\f3ac"; } +.bi-file-post::before { content: "\f3ad"; } +.bi-file-ppt-fill::before { content: "\f3ae"; } +.bi-file-ppt::before { content: "\f3af"; } +.bi-file-richtext-fill::before { content: "\f3b0"; } +.bi-file-richtext::before { content: "\f3b1"; } +.bi-file-ruled-fill::before { content: "\f3b2"; } +.bi-file-ruled::before { content: "\f3b3"; } +.bi-file-slides-fill::before { content: "\f3b4"; } +.bi-file-slides::before { content: "\f3b5"; } +.bi-file-spreadsheet-fill::before { content: "\f3b6"; } +.bi-file-spreadsheet::before { content: "\f3b7"; } +.bi-file-text-fill::before { content: "\f3b8"; } +.bi-file-text::before { content: "\f3b9"; } +.bi-file-word-fill::before { content: "\f3ba"; } +.bi-file-word::before { content: "\f3bb"; } +.bi-file-x-fill::before { content: "\f3bc"; } +.bi-file-x::before { content: "\f3bd"; } +.bi-file-zip-fill::before { content: "\f3be"; } +.bi-file-zip::before { content: "\f3bf"; } +.bi-file::before { content: "\f3c0"; } +.bi-files-alt::before { content: "\f3c1"; } +.bi-files::before { content: "\f3c2"; } +.bi-film::before { content: "\f3c3"; } +.bi-filter-circle-fill::before { content: "\f3c4"; } +.bi-filter-circle::before { content: "\f3c5"; } +.bi-filter-left::before { content: "\f3c6"; } +.bi-filter-right::before { content: "\f3c7"; } +.bi-filter-square-fill::before { content: "\f3c8"; } +.bi-filter-square::before { content: "\f3c9"; } +.bi-filter::before { content: "\f3ca"; } +.bi-flag-fill::before { content: "\f3cb"; } +.bi-flag::before { content: "\f3cc"; } +.bi-flower1::before { content: "\f3cd"; } +.bi-flower2::before { content: "\f3ce"; } +.bi-flower3::before { content: "\f3cf"; } +.bi-folder-check::before { content: "\f3d0"; } +.bi-folder-fill::before { content: "\f3d1"; } +.bi-folder-minus::before { content: "\f3d2"; } +.bi-folder-plus::before { content: "\f3d3"; } +.bi-folder-symlink-fill::before { content: "\f3d4"; } +.bi-folder-symlink::before { content: "\f3d5"; } +.bi-folder-x::before { content: "\f3d6"; } +.bi-folder::before { content: "\f3d7"; } +.bi-folder2-open::before { content: "\f3d8"; } +.bi-folder2::before { content: "\f3d9"; } +.bi-fonts::before { content: "\f3da"; } +.bi-forward-fill::before { content: "\f3db"; } +.bi-forward::before { content: "\f3dc"; } +.bi-front::before { content: "\f3dd"; } +.bi-fullscreen-exit::before { content: "\f3de"; } +.bi-fullscreen::before { content: "\f3df"; } +.bi-funnel-fill::before { content: "\f3e0"; } +.bi-funnel::before { content: "\f3e1"; } +.bi-gear-fill::before { content: "\f3e2"; } +.bi-gear-wide-connected::before { content: "\f3e3"; } +.bi-gear-wide::before { content: "\f3e4"; } +.bi-gear::before { content: "\f3e5"; } +.bi-gem::before { content: "\f3e6"; } +.bi-geo-alt-fill::before { content: "\f3e7"; } +.bi-geo-alt::before { content: "\f3e8"; } +.bi-geo-fill::before { content: "\f3e9"; } +.bi-geo::before { content: "\f3ea"; } +.bi-gift-fill::before { content: "\f3eb"; } +.bi-gift::before { content: "\f3ec"; } +.bi-github::before { content: "\f3ed"; } +.bi-globe::before { content: "\f3ee"; } +.bi-globe2::before { content: "\f3ef"; } +.bi-google::before { content: "\f3f0"; } +.bi-graph-down::before { content: "\f3f1"; } +.bi-graph-up::before { content: "\f3f2"; } +.bi-grid-1x2-fill::before { content: "\f3f3"; } +.bi-grid-1x2::before { content: "\f3f4"; } +.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } +.bi-grid-3x2-gap::before { content: "\f3f6"; } +.bi-grid-3x2::before { content: "\f3f7"; } +.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } +.bi-grid-3x3-gap::before { content: "\f3f9"; } +.bi-grid-3x3::before { content: "\f3fa"; } +.bi-grid-fill::before { content: "\f3fb"; } +.bi-grid::before { content: "\f3fc"; } +.bi-grip-horizontal::before { content: "\f3fd"; } +.bi-grip-vertical::before { content: "\f3fe"; } +.bi-hammer::before { content: "\f3ff"; } +.bi-hand-index-fill::before { content: "\f400"; } +.bi-hand-index-thumb-fill::before { content: "\f401"; } +.bi-hand-index-thumb::before { content: "\f402"; } +.bi-hand-index::before { content: "\f403"; } +.bi-hand-thumbs-down-fill::before { content: "\f404"; } +.bi-hand-thumbs-down::before { content: "\f405"; } +.bi-hand-thumbs-up-fill::before { content: "\f406"; } +.bi-hand-thumbs-up::before { content: "\f407"; } +.bi-handbag-fill::before { content: "\f408"; } +.bi-handbag::before { content: "\f409"; } +.bi-hash::before { content: "\f40a"; } +.bi-hdd-fill::before { content: "\f40b"; } +.bi-hdd-network-fill::before { content: "\f40c"; } +.bi-hdd-network::before { content: "\f40d"; } +.bi-hdd-rack-fill::before { content: "\f40e"; } +.bi-hdd-rack::before { content: "\f40f"; } +.bi-hdd-stack-fill::before { content: "\f410"; } +.bi-hdd-stack::before { content: "\f411"; } +.bi-hdd::before { content: "\f412"; } +.bi-headphones::before { content: "\f413"; } +.bi-headset::before { content: "\f414"; } +.bi-heart-fill::before { content: "\f415"; } +.bi-heart-half::before { content: "\f416"; } +.bi-heart::before { content: "\f417"; } +.bi-heptagon-fill::before { content: "\f418"; } +.bi-heptagon-half::before { content: "\f419"; } +.bi-heptagon::before { content: "\f41a"; } +.bi-hexagon-fill::before { content: "\f41b"; } +.bi-hexagon-half::before { content: "\f41c"; } +.bi-hexagon::before { content: "\f41d"; } +.bi-hourglass-bottom::before { content: "\f41e"; } +.bi-hourglass-split::before { content: "\f41f"; } +.bi-hourglass-top::before { content: "\f420"; } +.bi-hourglass::before { content: "\f421"; } +.bi-house-door-fill::before { content: "\f422"; } +.bi-house-door::before { content: "\f423"; } +.bi-house-fill::before { content: "\f424"; } +.bi-house::before { content: "\f425"; } +.bi-hr::before { content: "\f426"; } +.bi-hurricane::before { content: "\f427"; } +.bi-image-alt::before { content: "\f428"; } +.bi-image-fill::before { content: "\f429"; } +.bi-image::before { content: "\f42a"; } +.bi-images::before { content: "\f42b"; } +.bi-inbox-fill::before { content: "\f42c"; } +.bi-inbox::before { content: "\f42d"; } +.bi-inboxes-fill::before { content: "\f42e"; } +.bi-inboxes::before { content: "\f42f"; } +.bi-info-circle-fill::before { content: "\f430"; } +.bi-info-circle::before { content: "\f431"; } +.bi-info-square-fill::before { content: "\f432"; } +.bi-info-square::before { content: "\f433"; } +.bi-info::before { content: "\f434"; } +.bi-input-cursor-text::before { content: "\f435"; } +.bi-input-cursor::before { content: "\f436"; } +.bi-instagram::before { content: "\f437"; } +.bi-intersect::before { content: "\f438"; } +.bi-journal-album::before { content: "\f439"; } +.bi-journal-arrow-down::before { content: "\f43a"; } +.bi-journal-arrow-up::before { content: "\f43b"; } +.bi-journal-bookmark-fill::before { content: "\f43c"; } +.bi-journal-bookmark::before { content: "\f43d"; } +.bi-journal-check::before { content: "\f43e"; } +.bi-journal-code::before { content: "\f43f"; } +.bi-journal-medical::before { content: "\f440"; } +.bi-journal-minus::before { content: "\f441"; } +.bi-journal-plus::before { content: "\f442"; } +.bi-journal-richtext::before { content: "\f443"; } +.bi-journal-text::before { content: "\f444"; } +.bi-journal-x::before { content: "\f445"; } +.bi-journal::before { content: "\f446"; } +.bi-journals::before { content: "\f447"; } +.bi-joystick::before { content: "\f448"; } +.bi-justify-left::before { content: "\f449"; } +.bi-justify-right::before { content: "\f44a"; } +.bi-justify::before { content: "\f44b"; } +.bi-kanban-fill::before { content: "\f44c"; } +.bi-kanban::before { content: "\f44d"; } +.bi-key-fill::before { content: "\f44e"; } +.bi-key::before { content: "\f44f"; } +.bi-keyboard-fill::before { content: "\f450"; } +.bi-keyboard::before { content: "\f451"; } +.bi-ladder::before { content: "\f452"; } +.bi-lamp-fill::before { content: "\f453"; } +.bi-lamp::before { content: "\f454"; } +.bi-laptop-fill::before { content: "\f455"; } +.bi-laptop::before { content: "\f456"; } +.bi-layer-backward::before { content: "\f457"; } +.bi-layer-forward::before { content: "\f458"; } +.bi-layers-fill::before { content: "\f459"; } +.bi-layers-half::before { content: "\f45a"; } +.bi-layers::before { content: "\f45b"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } +.bi-layout-sidebar-inset::before { content: "\f45d"; } +.bi-layout-sidebar-reverse::before { content: "\f45e"; } +.bi-layout-sidebar::before { content: "\f45f"; } +.bi-layout-split::before { content: "\f460"; } +.bi-layout-text-sidebar-reverse::before { content: "\f461"; } +.bi-layout-text-sidebar::before { content: "\f462"; } +.bi-layout-text-window-reverse::before { content: "\f463"; } +.bi-layout-text-window::before { content: "\f464"; } +.bi-layout-three-columns::before { content: "\f465"; } +.bi-layout-wtf::before { content: "\f466"; } +.bi-life-preserver::before { content: "\f467"; } +.bi-lightbulb-fill::before { content: "\f468"; } +.bi-lightbulb-off-fill::before { content: "\f469"; } +.bi-lightbulb-off::before { content: "\f46a"; } +.bi-lightbulb::before { content: "\f46b"; } +.bi-lightning-charge-fill::before { content: "\f46c"; } +.bi-lightning-charge::before { content: "\f46d"; } +.bi-lightning-fill::before { content: "\f46e"; } +.bi-lightning::before { content: "\f46f"; } +.bi-link-45deg::before { content: "\f470"; } +.bi-link::before { content: "\f471"; } +.bi-linkedin::before { content: "\f472"; } +.bi-list-check::before { content: "\f473"; } +.bi-list-nested::before { content: "\f474"; } +.bi-list-ol::before { content: "\f475"; } +.bi-list-stars::before { content: "\f476"; } +.bi-list-task::before { content: "\f477"; } +.bi-list-ul::before { content: "\f478"; } +.bi-list::before { content: "\f479"; } +.bi-lock-fill::before { content: "\f47a"; } +.bi-lock::before { content: "\f47b"; } +.bi-mailbox::before { content: "\f47c"; } +.bi-mailbox2::before { content: "\f47d"; } +.bi-map-fill::before { content: "\f47e"; } +.bi-map::before { content: "\f47f"; } +.bi-markdown-fill::before { content: "\f480"; } +.bi-markdown::before { content: "\f481"; } +.bi-mask::before { content: "\f482"; } +.bi-megaphone-fill::before { content: "\f483"; } +.bi-megaphone::before { content: "\f484"; } +.bi-menu-app-fill::before { content: "\f485"; } +.bi-menu-app::before { content: "\f486"; } +.bi-menu-button-fill::before { content: "\f487"; } +.bi-menu-button-wide-fill::before { content: "\f488"; } +.bi-menu-button-wide::before { content: "\f489"; } +.bi-menu-button::before { content: "\f48a"; } +.bi-menu-down::before { content: "\f48b"; } +.bi-menu-up::before { content: "\f48c"; } +.bi-mic-fill::before { content: "\f48d"; } +.bi-mic-mute-fill::before { content: "\f48e"; } +.bi-mic-mute::before { content: "\f48f"; } +.bi-mic::before { content: "\f490"; } +.bi-minecart-loaded::before { content: "\f491"; } +.bi-minecart::before { content: "\f492"; } +.bi-moisture::before { content: "\f493"; } +.bi-moon-fill::before { content: "\f494"; } +.bi-moon-stars-fill::before { content: "\f495"; } +.bi-moon-stars::before { content: "\f496"; } +.bi-moon::before { content: "\f497"; } +.bi-mouse-fill::before { content: "\f498"; } +.bi-mouse::before { content: "\f499"; } +.bi-mouse2-fill::before { content: "\f49a"; } +.bi-mouse2::before { content: "\f49b"; } +.bi-mouse3-fill::before { content: "\f49c"; } +.bi-mouse3::before { content: "\f49d"; } +.bi-music-note-beamed::before { content: "\f49e"; } +.bi-music-note-list::before { content: "\f49f"; } +.bi-music-note::before { content: "\f4a0"; } +.bi-music-player-fill::before { content: "\f4a1"; } +.bi-music-player::before { content: "\f4a2"; } +.bi-newspaper::before { content: "\f4a3"; } +.bi-node-minus-fill::before { content: "\f4a4"; } +.bi-node-minus::before { content: "\f4a5"; } +.bi-node-plus-fill::before { content: "\f4a6"; } +.bi-node-plus::before { content: "\f4a7"; } +.bi-nut-fill::before { content: "\f4a8"; } +.bi-nut::before { content: "\f4a9"; } +.bi-octagon-fill::before { content: "\f4aa"; } +.bi-octagon-half::before { content: "\f4ab"; } +.bi-octagon::before { content: "\f4ac"; } +.bi-option::before { content: "\f4ad"; } +.bi-outlet::before { content: "\f4ae"; } +.bi-paint-bucket::before { content: "\f4af"; } +.bi-palette-fill::before { content: "\f4b0"; } +.bi-palette::before { content: "\f4b1"; } +.bi-palette2::before { content: "\f4b2"; } +.bi-paperclip::before { content: "\f4b3"; } +.bi-paragraph::before { content: "\f4b4"; } +.bi-patch-check-fill::before { content: "\f4b5"; } +.bi-patch-check::before { content: "\f4b6"; } +.bi-patch-exclamation-fill::before { content: "\f4b7"; } +.bi-patch-exclamation::before { content: "\f4b8"; } +.bi-patch-minus-fill::before { content: "\f4b9"; } +.bi-patch-minus::before { content: "\f4ba"; } +.bi-patch-plus-fill::before { content: "\f4bb"; } +.bi-patch-plus::before { content: "\f4bc"; } +.bi-patch-question-fill::before { content: "\f4bd"; } +.bi-patch-question::before { content: "\f4be"; } +.bi-pause-btn-fill::before { content: "\f4bf"; } +.bi-pause-btn::before { content: "\f4c0"; } +.bi-pause-circle-fill::before { content: "\f4c1"; } +.bi-pause-circle::before { content: "\f4c2"; } +.bi-pause-fill::before { content: "\f4c3"; } +.bi-pause::before { content: "\f4c4"; } +.bi-peace-fill::before { content: "\f4c5"; } +.bi-peace::before { content: "\f4c6"; } +.bi-pen-fill::before { content: "\f4c7"; } +.bi-pen::before { content: "\f4c8"; } +.bi-pencil-fill::before { content: "\f4c9"; } +.bi-pencil-square::before { content: "\f4ca"; } +.bi-pencil::before { content: "\f4cb"; } +.bi-pentagon-fill::before { content: "\f4cc"; } +.bi-pentagon-half::before { content: "\f4cd"; } +.bi-pentagon::before { content: "\f4ce"; } +.bi-people-fill::before { content: "\f4cf"; } +.bi-people::before { content: "\f4d0"; } +.bi-percent::before { content: "\f4d1"; } +.bi-person-badge-fill::before { content: "\f4d2"; } +.bi-person-badge::before { content: "\f4d3"; } +.bi-person-bounding-box::before { content: "\f4d4"; } +.bi-person-check-fill::before { content: "\f4d5"; } +.bi-person-check::before { content: "\f4d6"; } +.bi-person-circle::before { content: "\f4d7"; } +.bi-person-dash-fill::before { content: "\f4d8"; } +.bi-person-dash::before { content: "\f4d9"; } +.bi-person-fill::before { content: "\f4da"; } +.bi-person-lines-fill::before { content: "\f4db"; } +.bi-person-plus-fill::before { content: "\f4dc"; } +.bi-person-plus::before { content: "\f4dd"; } +.bi-person-square::before { content: "\f4de"; } +.bi-person-x-fill::before { content: "\f4df"; } +.bi-person-x::before { content: "\f4e0"; } +.bi-person::before { content: "\f4e1"; } +.bi-phone-fill::before { content: "\f4e2"; } +.bi-phone-landscape-fill::before { content: "\f4e3"; } +.bi-phone-landscape::before { content: "\f4e4"; } +.bi-phone-vibrate-fill::before { content: "\f4e5"; } +.bi-phone-vibrate::before { content: "\f4e6"; } +.bi-phone::before { content: "\f4e7"; } +.bi-pie-chart-fill::before { content: "\f4e8"; } +.bi-pie-chart::before { content: "\f4e9"; } +.bi-pin-angle-fill::before { content: "\f4ea"; } +.bi-pin-angle::before { content: "\f4eb"; } +.bi-pin-fill::before { content: "\f4ec"; } +.bi-pin::before { content: "\f4ed"; } +.bi-pip-fill::before { content: "\f4ee"; } +.bi-pip::before { content: "\f4ef"; } +.bi-play-btn-fill::before { content: "\f4f0"; } +.bi-play-btn::before { content: "\f4f1"; } +.bi-play-circle-fill::before { content: "\f4f2"; } +.bi-play-circle::before { content: "\f4f3"; } +.bi-play-fill::before { content: "\f4f4"; } +.bi-play::before { content: "\f4f5"; } +.bi-plug-fill::before { content: "\f4f6"; } +.bi-plug::before { content: "\f4f7"; } +.bi-plus-circle-dotted::before { content: "\f4f8"; } +.bi-plus-circle-fill::before { content: "\f4f9"; } +.bi-plus-circle::before { content: "\f4fa"; } +.bi-plus-square-dotted::before { content: "\f4fb"; } +.bi-plus-square-fill::before { content: "\f4fc"; } +.bi-plus-square::before { content: "\f4fd"; } +.bi-plus::before { content: "\f4fe"; } +.bi-power::before { content: "\f4ff"; } +.bi-printer-fill::before { content: "\f500"; } +.bi-printer::before { content: "\f501"; } +.bi-puzzle-fill::before { content: "\f502"; } +.bi-puzzle::before { content: "\f503"; } +.bi-question-circle-fill::before { content: "\f504"; } +.bi-question-circle::before { content: "\f505"; } +.bi-question-diamond-fill::before { content: "\f506"; } +.bi-question-diamond::before { content: "\f507"; } +.bi-question-octagon-fill::before { content: "\f508"; } +.bi-question-octagon::before { content: "\f509"; } +.bi-question-square-fill::before { content: "\f50a"; } +.bi-question-square::before { content: "\f50b"; } +.bi-question::before { content: "\f50c"; } +.bi-rainbow::before { content: "\f50d"; } +.bi-receipt-cutoff::before { content: "\f50e"; } +.bi-receipt::before { content: "\f50f"; } +.bi-reception-0::before { content: "\f510"; } +.bi-reception-1::before { content: "\f511"; } +.bi-reception-2::before { content: "\f512"; } +.bi-reception-3::before { content: "\f513"; } +.bi-reception-4::before { content: "\f514"; } +.bi-record-btn-fill::before { content: "\f515"; } +.bi-record-btn::before { content: "\f516"; } +.bi-record-circle-fill::before { content: "\f517"; } +.bi-record-circle::before { content: "\f518"; } +.bi-record-fill::before { content: "\f519"; } +.bi-record::before { content: "\f51a"; } +.bi-record2-fill::before { content: "\f51b"; } +.bi-record2::before { content: "\f51c"; } +.bi-reply-all-fill::before { content: "\f51d"; } +.bi-reply-all::before { content: "\f51e"; } +.bi-reply-fill::before { content: "\f51f"; } +.bi-reply::before { content: "\f520"; } +.bi-rss-fill::before { content: "\f521"; } +.bi-rss::before { content: "\f522"; } +.bi-rulers::before { content: "\f523"; } +.bi-save-fill::before { content: "\f524"; } +.bi-save::before { content: "\f525"; } +.bi-save2-fill::before { content: "\f526"; } +.bi-save2::before { content: "\f527"; } +.bi-scissors::before { content: "\f528"; } +.bi-screwdriver::before { content: "\f529"; } +.bi-search::before { content: "\f52a"; } +.bi-segmented-nav::before { content: "\f52b"; } +.bi-server::before { content: "\f52c"; } +.bi-share-fill::before { content: "\f52d"; } +.bi-share::before { content: "\f52e"; } +.bi-shield-check::before { content: "\f52f"; } +.bi-shield-exclamation::before { content: "\f530"; } +.bi-shield-fill-check::before { content: "\f531"; } +.bi-shield-fill-exclamation::before { content: "\f532"; } +.bi-shield-fill-minus::before { content: "\f533"; } +.bi-shield-fill-plus::before { content: "\f534"; } +.bi-shield-fill-x::before { content: "\f535"; } +.bi-shield-fill::before { content: "\f536"; } +.bi-shield-lock-fill::before { content: "\f537"; } +.bi-shield-lock::before { content: "\f538"; } +.bi-shield-minus::before { content: "\f539"; } +.bi-shield-plus::before { content: "\f53a"; } +.bi-shield-shaded::before { content: "\f53b"; } +.bi-shield-slash-fill::before { content: "\f53c"; } +.bi-shield-slash::before { content: "\f53d"; } +.bi-shield-x::before { content: "\f53e"; } +.bi-shield::before { content: "\f53f"; } +.bi-shift-fill::before { content: "\f540"; } +.bi-shift::before { content: "\f541"; } +.bi-shop-window::before { content: "\f542"; } +.bi-shop::before { content: "\f543"; } +.bi-shuffle::before { content: "\f544"; } +.bi-signpost-2-fill::before { content: "\f545"; } +.bi-signpost-2::before { content: "\f546"; } +.bi-signpost-fill::before { content: "\f547"; } +.bi-signpost-split-fill::before { content: "\f548"; } +.bi-signpost-split::before { content: "\f549"; } +.bi-signpost::before { content: "\f54a"; } +.bi-sim-fill::before { content: "\f54b"; } +.bi-sim::before { content: "\f54c"; } +.bi-skip-backward-btn-fill::before { content: "\f54d"; } +.bi-skip-backward-btn::before { content: "\f54e"; } +.bi-skip-backward-circle-fill::before { content: "\f54f"; } +.bi-skip-backward-circle::before { content: "\f550"; } +.bi-skip-backward-fill::before { content: "\f551"; } +.bi-skip-backward::before { content: "\f552"; } +.bi-skip-end-btn-fill::before { content: "\f553"; } +.bi-skip-end-btn::before { content: "\f554"; } +.bi-skip-end-circle-fill::before { content: "\f555"; } +.bi-skip-end-circle::before { content: "\f556"; } +.bi-skip-end-fill::before { content: "\f557"; } +.bi-skip-end::before { content: "\f558"; } +.bi-skip-forward-btn-fill::before { content: "\f559"; } +.bi-skip-forward-btn::before { content: "\f55a"; } +.bi-skip-forward-circle-fill::before { content: "\f55b"; } +.bi-skip-forward-circle::before { content: "\f55c"; } +.bi-skip-forward-fill::before { content: "\f55d"; } +.bi-skip-forward::before { content: "\f55e"; } +.bi-skip-start-btn-fill::before { content: "\f55f"; } +.bi-skip-start-btn::before { content: "\f560"; } +.bi-skip-start-circle-fill::before { content: "\f561"; } +.bi-skip-start-circle::before { content: "\f562"; } +.bi-skip-start-fill::before { content: "\f563"; } +.bi-skip-start::before { content: "\f564"; } +.bi-slack::before { content: "\f565"; } +.bi-slash-circle-fill::before { content: "\f566"; } +.bi-slash-circle::before { content: "\f567"; } +.bi-slash-square-fill::before { content: "\f568"; } +.bi-slash-square::before { content: "\f569"; } +.bi-slash::before { content: "\f56a"; } +.bi-sliders::before { content: "\f56b"; } +.bi-smartwatch::before { content: "\f56c"; } +.bi-snow::before { content: "\f56d"; } +.bi-snow2::before { content: "\f56e"; } +.bi-snow3::before { content: "\f56f"; } +.bi-sort-alpha-down-alt::before { content: "\f570"; } +.bi-sort-alpha-down::before { content: "\f571"; } +.bi-sort-alpha-up-alt::before { content: "\f572"; } +.bi-sort-alpha-up::before { content: "\f573"; } +.bi-sort-down-alt::before { content: "\f574"; } +.bi-sort-down::before { content: "\f575"; } +.bi-sort-numeric-down-alt::before { content: "\f576"; } +.bi-sort-numeric-down::before { content: "\f577"; } +.bi-sort-numeric-up-alt::before { content: "\f578"; } +.bi-sort-numeric-up::before { content: "\f579"; } +.bi-sort-up-alt::before { content: "\f57a"; } +.bi-sort-up::before { content: "\f57b"; } +.bi-soundwave::before { content: "\f57c"; } +.bi-speaker-fill::before { content: "\f57d"; } +.bi-speaker::before { content: "\f57e"; } +.bi-speedometer::before { content: "\f57f"; } +.bi-speedometer2::before { content: "\f580"; } +.bi-spellcheck::before { content: "\f581"; } +.bi-square-fill::before { content: "\f582"; } +.bi-square-half::before { content: "\f583"; } +.bi-square::before { content: "\f584"; } +.bi-stack::before { content: "\f585"; } +.bi-star-fill::before { content: "\f586"; } +.bi-star-half::before { content: "\f587"; } +.bi-star::before { content: "\f588"; } +.bi-stars::before { content: "\f589"; } +.bi-stickies-fill::before { content: "\f58a"; } +.bi-stickies::before { content: "\f58b"; } +.bi-sticky-fill::before { content: "\f58c"; } +.bi-sticky::before { content: "\f58d"; } +.bi-stop-btn-fill::before { content: "\f58e"; } +.bi-stop-btn::before { content: "\f58f"; } +.bi-stop-circle-fill::before { content: "\f590"; } +.bi-stop-circle::before { content: "\f591"; } +.bi-stop-fill::before { content: "\f592"; } +.bi-stop::before { content: "\f593"; } +.bi-stoplights-fill::before { content: "\f594"; } +.bi-stoplights::before { content: "\f595"; } +.bi-stopwatch-fill::before { content: "\f596"; } +.bi-stopwatch::before { content: "\f597"; } +.bi-subtract::before { content: "\f598"; } +.bi-suit-club-fill::before { content: "\f599"; } +.bi-suit-club::before { content: "\f59a"; } +.bi-suit-diamond-fill::before { content: "\f59b"; } +.bi-suit-diamond::before { content: "\f59c"; } +.bi-suit-heart-fill::before { content: "\f59d"; } +.bi-suit-heart::before { content: "\f59e"; } +.bi-suit-spade-fill::before { content: "\f59f"; } +.bi-suit-spade::before { content: "\f5a0"; } +.bi-sun-fill::before { content: "\f5a1"; } +.bi-sun::before { content: "\f5a2"; } +.bi-sunglasses::before { content: "\f5a3"; } +.bi-sunrise-fill::before { content: "\f5a4"; } +.bi-sunrise::before { content: "\f5a5"; } +.bi-sunset-fill::before { content: "\f5a6"; } +.bi-sunset::before { content: "\f5a7"; } +.bi-symmetry-horizontal::before { content: "\f5a8"; } +.bi-symmetry-vertical::before { content: "\f5a9"; } +.bi-table::before { content: "\f5aa"; } +.bi-tablet-fill::before { content: "\f5ab"; } +.bi-tablet-landscape-fill::before { content: "\f5ac"; } +.bi-tablet-landscape::before { content: "\f5ad"; } +.bi-tablet::before { content: "\f5ae"; } +.bi-tag-fill::before { content: "\f5af"; } +.bi-tag::before { content: "\f5b0"; } +.bi-tags-fill::before { content: "\f5b1"; } +.bi-tags::before { content: "\f5b2"; } +.bi-telegram::before { content: "\f5b3"; } +.bi-telephone-fill::before { content: "\f5b4"; } +.bi-telephone-forward-fill::before { content: "\f5b5"; } +.bi-telephone-forward::before { content: "\f5b6"; } +.bi-telephone-inbound-fill::before { content: "\f5b7"; } +.bi-telephone-inbound::before { content: "\f5b8"; } +.bi-telephone-minus-fill::before { content: "\f5b9"; } +.bi-telephone-minus::before { content: "\f5ba"; } +.bi-telephone-outbound-fill::before { content: "\f5bb"; } +.bi-telephone-outbound::before { content: "\f5bc"; } +.bi-telephone-plus-fill::before { content: "\f5bd"; } +.bi-telephone-plus::before { content: "\f5be"; } +.bi-telephone-x-fill::before { content: "\f5bf"; } +.bi-telephone-x::before { content: "\f5c0"; } +.bi-telephone::before { content: "\f5c1"; } +.bi-terminal-fill::before { content: "\f5c2"; } +.bi-terminal::before { content: "\f5c3"; } +.bi-text-center::before { content: "\f5c4"; } +.bi-text-indent-left::before { content: "\f5c5"; } +.bi-text-indent-right::before { content: "\f5c6"; } +.bi-text-left::before { content: "\f5c7"; } +.bi-text-paragraph::before { content: "\f5c8"; } +.bi-text-right::before { content: "\f5c9"; } +.bi-textarea-resize::before { content: "\f5ca"; } +.bi-textarea-t::before { content: "\f5cb"; } +.bi-textarea::before { content: "\f5cc"; } +.bi-thermometer-half::before { content: "\f5cd"; } +.bi-thermometer-high::before { content: "\f5ce"; } +.bi-thermometer-low::before { content: "\f5cf"; } +.bi-thermometer-snow::before { content: "\f5d0"; } +.bi-thermometer-sun::before { content: "\f5d1"; } +.bi-thermometer::before { content: "\f5d2"; } +.bi-three-dots-vertical::before { content: "\f5d3"; } +.bi-three-dots::before { content: "\f5d4"; } +.bi-toggle-off::before { content: "\f5d5"; } +.bi-toggle-on::before { content: "\f5d6"; } +.bi-toggle2-off::before { content: "\f5d7"; } +.bi-toggle2-on::before { content: "\f5d8"; } +.bi-toggles::before { content: "\f5d9"; } +.bi-toggles2::before { content: "\f5da"; } +.bi-tools::before { content: "\f5db"; } +.bi-tornado::before { content: "\f5dc"; } +.bi-trash-fill::before { content: "\f5dd"; } +.bi-trash::before { content: "\f5de"; } +.bi-trash2-fill::before { content: "\f5df"; } +.bi-trash2::before { content: "\f5e0"; } +.bi-tree-fill::before { content: "\f5e1"; } +.bi-tree::before { content: "\f5e2"; } +.bi-triangle-fill::before { content: "\f5e3"; } +.bi-triangle-half::before { content: "\f5e4"; } +.bi-triangle::before { content: "\f5e5"; } +.bi-trophy-fill::before { content: "\f5e6"; } +.bi-trophy::before { content: "\f5e7"; } +.bi-tropical-storm::before { content: "\f5e8"; } +.bi-truck-flatbed::before { content: "\f5e9"; } +.bi-truck::before { content: "\f5ea"; } +.bi-tsunami::before { content: "\f5eb"; } +.bi-tv-fill::before { content: "\f5ec"; } +.bi-tv::before { content: "\f5ed"; } +.bi-twitch::before { content: "\f5ee"; } +.bi-twitter::before { content: "\f5ef"; } +.bi-type-bold::before { content: "\f5f0"; } +.bi-type-h1::before { content: "\f5f1"; } +.bi-type-h2::before { content: "\f5f2"; } +.bi-type-h3::before { content: "\f5f3"; } +.bi-type-italic::before { content: "\f5f4"; } +.bi-type-strikethrough::before { content: "\f5f5"; } +.bi-type-underline::before { content: "\f5f6"; } +.bi-type::before { content: "\f5f7"; } +.bi-ui-checks-grid::before { content: "\f5f8"; } +.bi-ui-checks::before { content: "\f5f9"; } +.bi-ui-radios-grid::before { content: "\f5fa"; } +.bi-ui-radios::before { content: "\f5fb"; } +.bi-umbrella-fill::before { content: "\f5fc"; } +.bi-umbrella::before { content: "\f5fd"; } +.bi-union::before { content: "\f5fe"; } +.bi-unlock-fill::before { content: "\f5ff"; } +.bi-unlock::before { content: "\f600"; } +.bi-upc-scan::before { content: "\f601"; } +.bi-upc::before { content: "\f602"; } +.bi-upload::before { content: "\f603"; } +.bi-vector-pen::before { content: "\f604"; } +.bi-view-list::before { content: "\f605"; } +.bi-view-stacked::before { content: "\f606"; } +.bi-vinyl-fill::before { content: "\f607"; } +.bi-vinyl::before { content: "\f608"; } +.bi-voicemail::before { content: "\f609"; } +.bi-volume-down-fill::before { content: "\f60a"; } +.bi-volume-down::before { content: "\f60b"; } +.bi-volume-mute-fill::before { content: "\f60c"; } +.bi-volume-mute::before { content: "\f60d"; } +.bi-volume-off-fill::before { content: "\f60e"; } +.bi-volume-off::before { content: "\f60f"; } +.bi-volume-up-fill::before { content: "\f610"; } +.bi-volume-up::before { content: "\f611"; } +.bi-vr::before { content: "\f612"; } +.bi-wallet-fill::before { content: "\f613"; } +.bi-wallet::before { content: "\f614"; } +.bi-wallet2::before { content: "\f615"; } +.bi-watch::before { content: "\f616"; } +.bi-water::before { content: "\f617"; } +.bi-whatsapp::before { content: "\f618"; } +.bi-wifi-1::before { content: "\f619"; } +.bi-wifi-2::before { content: "\f61a"; } +.bi-wifi-off::before { content: "\f61b"; } +.bi-wifi::before { content: "\f61c"; } +.bi-wind::before { content: "\f61d"; } +.bi-window-dock::before { content: "\f61e"; } +.bi-window-sidebar::before { content: "\f61f"; } +.bi-window::before { content: "\f620"; } +.bi-wrench::before { content: "\f621"; } +.bi-x-circle-fill::before { content: "\f622"; } +.bi-x-circle::before { content: "\f623"; } +.bi-x-diamond-fill::before { content: "\f624"; } +.bi-x-diamond::before { content: "\f625"; } +.bi-x-octagon-fill::before { content: "\f626"; } +.bi-x-octagon::before { content: "\f627"; } +.bi-x-square-fill::before { content: "\f628"; } +.bi-x-square::before { content: "\f629"; } +.bi-x::before { content: "\f62a"; } +.bi-youtube::before { content: "\f62b"; } +.bi-zoom-in::before { content: "\f62c"; } +.bi-zoom-out::before { content: "\f62d"; } +.bi-bank::before { content: "\f62e"; } +.bi-bank2::before { content: "\f62f"; } +.bi-bell-slash-fill::before { content: "\f630"; } +.bi-bell-slash::before { content: "\f631"; } +.bi-cash-coin::before { content: "\f632"; } +.bi-check-lg::before { content: "\f633"; } +.bi-coin::before { content: "\f634"; } +.bi-currency-bitcoin::before { content: "\f635"; } +.bi-currency-dollar::before { content: "\f636"; } +.bi-currency-euro::before { content: "\f637"; } +.bi-currency-exchange::before { content: "\f638"; } +.bi-currency-pound::before { content: "\f639"; } +.bi-currency-yen::before { content: "\f63a"; } +.bi-dash-lg::before { content: "\f63b"; } +.bi-exclamation-lg::before { content: "\f63c"; } +.bi-file-earmark-pdf-fill::before { content: "\f63d"; } +.bi-file-earmark-pdf::before { content: "\f63e"; } +.bi-file-pdf-fill::before { content: "\f63f"; } +.bi-file-pdf::before { content: "\f640"; } +.bi-gender-ambiguous::before { content: "\f641"; } +.bi-gender-female::before { content: "\f642"; } +.bi-gender-male::before { content: "\f643"; } +.bi-gender-trans::before { content: "\f644"; } +.bi-headset-vr::before { content: "\f645"; } +.bi-info-lg::before { content: "\f646"; } +.bi-mastodon::before { content: "\f647"; } +.bi-messenger::before { content: "\f648"; } +.bi-piggy-bank-fill::before { content: "\f649"; } +.bi-piggy-bank::before { content: "\f64a"; } +.bi-pin-map-fill::before { content: "\f64b"; } +.bi-pin-map::before { content: "\f64c"; } +.bi-plus-lg::before { content: "\f64d"; } +.bi-question-lg::before { content: "\f64e"; } +.bi-recycle::before { content: "\f64f"; } +.bi-reddit::before { content: "\f650"; } +.bi-safe-fill::before { content: "\f651"; } +.bi-safe2-fill::before { content: "\f652"; } +.bi-safe2::before { content: "\f653"; } +.bi-sd-card-fill::before { content: "\f654"; } +.bi-sd-card::before { content: "\f655"; } +.bi-skype::before { content: "\f656"; } +.bi-slash-lg::before { content: "\f657"; } +.bi-translate::before { content: "\f658"; } +.bi-x-lg::before { content: "\f659"; } +.bi-safe::before { content: "\f65a"; } +.bi-apple::before { content: "\f65b"; } +.bi-microsoft::before { content: "\f65d"; } +.bi-windows::before { content: "\f65e"; } +.bi-behance::before { content: "\f65c"; } +.bi-dribbble::before { content: "\f65f"; } +.bi-line::before { content: "\f660"; } +.bi-medium::before { content: "\f661"; } +.bi-paypal::before { content: "\f662"; } +.bi-pinterest::before { content: "\f663"; } +.bi-signal::before { content: "\f664"; } +.bi-snapchat::before { content: "\f665"; } +.bi-spotify::before { content: "\f666"; } +.bi-stack-overflow::before { content: "\f667"; } +.bi-strava::before { content: "\f668"; } +.bi-wordpress::before { content: "\f669"; } +.bi-vimeo::before { content: "\f66a"; } +.bi-activity::before { content: "\f66b"; } +.bi-easel2-fill::before { content: "\f66c"; } +.bi-easel2::before { content: "\f66d"; } +.bi-easel3-fill::before { content: "\f66e"; } +.bi-easel3::before { content: "\f66f"; } +.bi-fan::before { content: "\f670"; } +.bi-fingerprint::before { content: "\f671"; } +.bi-graph-down-arrow::before { content: "\f672"; } +.bi-graph-up-arrow::before { content: "\f673"; } +.bi-hypnotize::before { content: "\f674"; } +.bi-magic::before { content: "\f675"; } +.bi-person-rolodex::before { content: "\f676"; } +.bi-person-video::before { content: "\f677"; } +.bi-person-video2::before { content: "\f678"; } +.bi-person-video3::before { content: "\f679"; } +.bi-person-workspace::before { content: "\f67a"; } +.bi-radioactive::before { content: "\f67b"; } +.bi-webcam-fill::before { content: "\f67c"; } +.bi-webcam::before { content: "\f67d"; } +.bi-yin-yang::before { content: "\f67e"; } +.bi-bandaid-fill::before { content: "\f680"; } +.bi-bandaid::before { content: "\f681"; } +.bi-bluetooth::before { content: "\f682"; } +.bi-body-text::before { content: "\f683"; } +.bi-boombox::before { content: "\f684"; } +.bi-boxes::before { content: "\f685"; } +.bi-dpad-fill::before { content: "\f686"; } +.bi-dpad::before { content: "\f687"; } +.bi-ear-fill::before { content: "\f688"; } +.bi-ear::before { content: "\f689"; } +.bi-envelope-check-fill::before { content: "\f68b"; } +.bi-envelope-check::before { content: "\f68c"; } +.bi-envelope-dash-fill::before { content: "\f68e"; } +.bi-envelope-dash::before { content: "\f68f"; } +.bi-envelope-exclamation-fill::before { content: "\f691"; } +.bi-envelope-exclamation::before { content: "\f692"; } +.bi-envelope-plus-fill::before { content: "\f693"; } +.bi-envelope-plus::before { content: "\f694"; } +.bi-envelope-slash-fill::before { content: "\f696"; } +.bi-envelope-slash::before { content: "\f697"; } +.bi-envelope-x-fill::before { content: "\f699"; } +.bi-envelope-x::before { content: "\f69a"; } +.bi-explicit-fill::before { content: "\f69b"; } +.bi-explicit::before { content: "\f69c"; } +.bi-git::before { content: "\f69d"; } +.bi-infinity::before { content: "\f69e"; } +.bi-list-columns-reverse::before { content: "\f69f"; } +.bi-list-columns::before { content: "\f6a0"; } +.bi-meta::before { content: "\f6a1"; } +.bi-nintendo-switch::before { content: "\f6a4"; } +.bi-pc-display-horizontal::before { content: "\f6a5"; } +.bi-pc-display::before { content: "\f6a6"; } +.bi-pc-horizontal::before { content: "\f6a7"; } +.bi-pc::before { content: "\f6a8"; } +.bi-playstation::before { content: "\f6a9"; } +.bi-plus-slash-minus::before { content: "\f6aa"; } +.bi-projector-fill::before { content: "\f6ab"; } +.bi-projector::before { content: "\f6ac"; } +.bi-qr-code-scan::before { content: "\f6ad"; } +.bi-qr-code::before { content: "\f6ae"; } +.bi-quora::before { content: "\f6af"; } +.bi-quote::before { content: "\f6b0"; } +.bi-robot::before { content: "\f6b1"; } +.bi-send-check-fill::before { content: "\f6b2"; } +.bi-send-check::before { content: "\f6b3"; } +.bi-send-dash-fill::before { content: "\f6b4"; } +.bi-send-dash::before { content: "\f6b5"; } +.bi-send-exclamation-fill::before { content: "\f6b7"; } +.bi-send-exclamation::before { content: "\f6b8"; } +.bi-send-fill::before { content: "\f6b9"; } +.bi-send-plus-fill::before { content: "\f6ba"; } +.bi-send-plus::before { content: "\f6bb"; } +.bi-send-slash-fill::before { content: "\f6bc"; } +.bi-send-slash::before { content: "\f6bd"; } +.bi-send-x-fill::before { content: "\f6be"; } +.bi-send-x::before { content: "\f6bf"; } +.bi-send::before { content: "\f6c0"; } +.bi-steam::before { content: "\f6c1"; } +.bi-terminal-dash::before { content: "\f6c3"; } +.bi-terminal-plus::before { content: "\f6c4"; } +.bi-terminal-split::before { content: "\f6c5"; } +.bi-ticket-detailed-fill::before { content: "\f6c6"; } +.bi-ticket-detailed::before { content: "\f6c7"; } +.bi-ticket-fill::before { content: "\f6c8"; } +.bi-ticket-perforated-fill::before { content: "\f6c9"; } +.bi-ticket-perforated::before { content: "\f6ca"; } +.bi-ticket::before { content: "\f6cb"; } +.bi-tiktok::before { content: "\f6cc"; } +.bi-window-dash::before { content: "\f6cd"; } +.bi-window-desktop::before { content: "\f6ce"; } +.bi-window-fullscreen::before { content: "\f6cf"; } +.bi-window-plus::before { content: "\f6d0"; } +.bi-window-split::before { content: "\f6d1"; } +.bi-window-stack::before { content: "\f6d2"; } +.bi-window-x::before { content: "\f6d3"; } +.bi-xbox::before { content: "\f6d4"; } +.bi-ethernet::before { content: "\f6d5"; } +.bi-hdmi-fill::before { content: "\f6d6"; } +.bi-hdmi::before { content: "\f6d7"; } +.bi-usb-c-fill::before { content: "\f6d8"; } +.bi-usb-c::before { content: "\f6d9"; } +.bi-usb-fill::before { content: "\f6da"; } +.bi-usb-plug-fill::before { content: "\f6db"; } +.bi-usb-plug::before { content: "\f6dc"; } +.bi-usb-symbol::before { content: "\f6dd"; } +.bi-usb::before { content: "\f6de"; } +.bi-boombox-fill::before { content: "\f6df"; } +.bi-displayport::before { content: "\f6e1"; } +.bi-gpu-card::before { content: "\f6e2"; } +.bi-memory::before { content: "\f6e3"; } +.bi-modem-fill::before { content: "\f6e4"; } +.bi-modem::before { content: "\f6e5"; } +.bi-motherboard-fill::before { content: "\f6e6"; } +.bi-motherboard::before { content: "\f6e7"; } +.bi-optical-audio-fill::before { content: "\f6e8"; } +.bi-optical-audio::before { content: "\f6e9"; } +.bi-pci-card::before { content: "\f6ea"; } +.bi-router-fill::before { content: "\f6eb"; } +.bi-router::before { content: "\f6ec"; } +.bi-thunderbolt-fill::before { content: "\f6ef"; } +.bi-thunderbolt::before { content: "\f6f0"; } +.bi-usb-drive-fill::before { content: "\f6f1"; } +.bi-usb-drive::before { content: "\f6f2"; } +.bi-usb-micro-fill::before { content: "\f6f3"; } +.bi-usb-micro::before { content: "\f6f4"; } +.bi-usb-mini-fill::before { content: "\f6f5"; } +.bi-usb-mini::before { content: "\f6f6"; } +.bi-cloud-haze2::before { content: "\f6f7"; } +.bi-device-hdd-fill::before { content: "\f6f8"; } +.bi-device-hdd::before { content: "\f6f9"; } +.bi-device-ssd-fill::before { content: "\f6fa"; } +.bi-device-ssd::before { content: "\f6fb"; } +.bi-displayport-fill::before { content: "\f6fc"; } +.bi-mortarboard-fill::before { content: "\f6fd"; } +.bi-mortarboard::before { content: "\f6fe"; } +.bi-terminal-x::before { content: "\f6ff"; } +.bi-arrow-through-heart-fill::before { content: "\f700"; } +.bi-arrow-through-heart::before { content: "\f701"; } +.bi-badge-sd-fill::before { content: "\f702"; } +.bi-badge-sd::before { content: "\f703"; } +.bi-bag-heart-fill::before { content: "\f704"; } +.bi-bag-heart::before { content: "\f705"; } +.bi-balloon-fill::before { content: "\f706"; } +.bi-balloon-heart-fill::before { content: "\f707"; } +.bi-balloon-heart::before { content: "\f708"; } +.bi-balloon::before { content: "\f709"; } +.bi-box2-fill::before { content: "\f70a"; } +.bi-box2-heart-fill::before { content: "\f70b"; } +.bi-box2-heart::before { content: "\f70c"; } +.bi-box2::before { content: "\f70d"; } +.bi-braces-asterisk::before { content: "\f70e"; } +.bi-calendar-heart-fill::before { content: "\f70f"; } +.bi-calendar-heart::before { content: "\f710"; } +.bi-calendar2-heart-fill::before { content: "\f711"; } +.bi-calendar2-heart::before { content: "\f712"; } +.bi-chat-heart-fill::before { content: "\f713"; } +.bi-chat-heart::before { content: "\f714"; } +.bi-chat-left-heart-fill::before { content: "\f715"; } +.bi-chat-left-heart::before { content: "\f716"; } +.bi-chat-right-heart-fill::before { content: "\f717"; } +.bi-chat-right-heart::before { content: "\f718"; } +.bi-chat-square-heart-fill::before { content: "\f719"; } +.bi-chat-square-heart::before { content: "\f71a"; } +.bi-clipboard-check-fill::before { content: "\f71b"; } +.bi-clipboard-data-fill::before { content: "\f71c"; } +.bi-clipboard-fill::before { content: "\f71d"; } +.bi-clipboard-heart-fill::before { content: "\f71e"; } +.bi-clipboard-heart::before { content: "\f71f"; } +.bi-clipboard-minus-fill::before { content: "\f720"; } +.bi-clipboard-plus-fill::before { content: "\f721"; } +.bi-clipboard-pulse::before { content: "\f722"; } +.bi-clipboard-x-fill::before { content: "\f723"; } +.bi-clipboard2-check-fill::before { content: "\f724"; } +.bi-clipboard2-check::before { content: "\f725"; } +.bi-clipboard2-data-fill::before { content: "\f726"; } +.bi-clipboard2-data::before { content: "\f727"; } +.bi-clipboard2-fill::before { content: "\f728"; } +.bi-clipboard2-heart-fill::before { content: "\f729"; } +.bi-clipboard2-heart::before { content: "\f72a"; } +.bi-clipboard2-minus-fill::before { content: "\f72b"; } +.bi-clipboard2-minus::before { content: "\f72c"; } +.bi-clipboard2-plus-fill::before { content: "\f72d"; } +.bi-clipboard2-plus::before { content: "\f72e"; } +.bi-clipboard2-pulse-fill::before { content: "\f72f"; } +.bi-clipboard2-pulse::before { content: "\f730"; } +.bi-clipboard2-x-fill::before { content: "\f731"; } +.bi-clipboard2-x::before { content: "\f732"; } +.bi-clipboard2::before { content: "\f733"; } +.bi-emoji-kiss-fill::before { content: "\f734"; } +.bi-emoji-kiss::before { content: "\f735"; } +.bi-envelope-heart-fill::before { content: "\f736"; } +.bi-envelope-heart::before { content: "\f737"; } +.bi-envelope-open-heart-fill::before { content: "\f738"; } +.bi-envelope-open-heart::before { content: "\f739"; } +.bi-envelope-paper-fill::before { content: "\f73a"; } +.bi-envelope-paper-heart-fill::before { content: "\f73b"; } +.bi-envelope-paper-heart::before { content: "\f73c"; } +.bi-envelope-paper::before { content: "\f73d"; } +.bi-filetype-aac::before { content: "\f73e"; } +.bi-filetype-ai::before { content: "\f73f"; } +.bi-filetype-bmp::before { content: "\f740"; } +.bi-filetype-cs::before { content: "\f741"; } +.bi-filetype-css::before { content: "\f742"; } +.bi-filetype-csv::before { content: "\f743"; } +.bi-filetype-doc::before { content: "\f744"; } +.bi-filetype-docx::before { content: "\f745"; } +.bi-filetype-exe::before { content: "\f746"; } +.bi-filetype-gif::before { content: "\f747"; } +.bi-filetype-heic::before { content: "\f748"; } +.bi-filetype-html::before { content: "\f749"; } +.bi-filetype-java::before { content: "\f74a"; } +.bi-filetype-jpg::before { content: "\f74b"; } +.bi-filetype-js::before { content: "\f74c"; } +.bi-filetype-jsx::before { content: "\f74d"; } +.bi-filetype-key::before { content: "\f74e"; } +.bi-filetype-m4p::before { content: "\f74f"; } +.bi-filetype-md::before { content: "\f750"; } +.bi-filetype-mdx::before { content: "\f751"; } +.bi-filetype-mov::before { content: "\f752"; } +.bi-filetype-mp3::before { content: "\f753"; } +.bi-filetype-mp4::before { content: "\f754"; } +.bi-filetype-otf::before { content: "\f755"; } +.bi-filetype-pdf::before { content: "\f756"; } +.bi-filetype-php::before { content: "\f757"; } +.bi-filetype-png::before { content: "\f758"; } +.bi-filetype-ppt::before { content: "\f75a"; } +.bi-filetype-psd::before { content: "\f75b"; } +.bi-filetype-py::before { content: "\f75c"; } +.bi-filetype-raw::before { content: "\f75d"; } +.bi-filetype-rb::before { content: "\f75e"; } +.bi-filetype-sass::before { content: "\f75f"; } +.bi-filetype-scss::before { content: "\f760"; } +.bi-filetype-sh::before { content: "\f761"; } +.bi-filetype-svg::before { content: "\f762"; } +.bi-filetype-tiff::before { content: "\f763"; } +.bi-filetype-tsx::before { content: "\f764"; } +.bi-filetype-ttf::before { content: "\f765"; } +.bi-filetype-txt::before { content: "\f766"; } +.bi-filetype-wav::before { content: "\f767"; } +.bi-filetype-woff::before { content: "\f768"; } +.bi-filetype-xls::before { content: "\f76a"; } +.bi-filetype-xml::before { content: "\f76b"; } +.bi-filetype-yml::before { content: "\f76c"; } +.bi-heart-arrow::before { content: "\f76d"; } +.bi-heart-pulse-fill::before { content: "\f76e"; } +.bi-heart-pulse::before { content: "\f76f"; } +.bi-heartbreak-fill::before { content: "\f770"; } +.bi-heartbreak::before { content: "\f771"; } +.bi-hearts::before { content: "\f772"; } +.bi-hospital-fill::before { content: "\f773"; } +.bi-hospital::before { content: "\f774"; } +.bi-house-heart-fill::before { content: "\f775"; } +.bi-house-heart::before { content: "\f776"; } +.bi-incognito::before { content: "\f777"; } +.bi-magnet-fill::before { content: "\f778"; } +.bi-magnet::before { content: "\f779"; } +.bi-person-heart::before { content: "\f77a"; } +.bi-person-hearts::before { content: "\f77b"; } +.bi-phone-flip::before { content: "\f77c"; } +.bi-plugin::before { content: "\f77d"; } +.bi-postage-fill::before { content: "\f77e"; } +.bi-postage-heart-fill::before { content: "\f77f"; } +.bi-postage-heart::before { content: "\f780"; } +.bi-postage::before { content: "\f781"; } +.bi-postcard-fill::before { content: "\f782"; } +.bi-postcard-heart-fill::before { content: "\f783"; } +.bi-postcard-heart::before { content: "\f784"; } +.bi-postcard::before { content: "\f785"; } +.bi-search-heart-fill::before { content: "\f786"; } +.bi-search-heart::before { content: "\f787"; } +.bi-sliders2-vertical::before { content: "\f788"; } +.bi-sliders2::before { content: "\f789"; } +.bi-trash3-fill::before { content: "\f78a"; } +.bi-trash3::before { content: "\f78b"; } +.bi-valentine::before { content: "\f78c"; } +.bi-valentine2::before { content: "\f78d"; } +.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } +.bi-wrench-adjustable-circle::before { content: "\f78f"; } +.bi-wrench-adjustable::before { content: "\f790"; } +.bi-filetype-json::before { content: "\f791"; } +.bi-filetype-pptx::before { content: "\f792"; } +.bi-filetype-xlsx::before { content: "\f793"; } +.bi-1-circle-fill::before { content: "\f796"; } +.bi-1-circle::before { content: "\f797"; } +.bi-1-square-fill::before { content: "\f798"; } +.bi-1-square::before { content: "\f799"; } +.bi-2-circle-fill::before { content: "\f79c"; } +.bi-2-circle::before { content: "\f79d"; } +.bi-2-square-fill::before { content: "\f79e"; } +.bi-2-square::before { content: "\f79f"; } +.bi-3-circle-fill::before { content: "\f7a2"; } +.bi-3-circle::before { content: "\f7a3"; } +.bi-3-square-fill::before { content: "\f7a4"; } +.bi-3-square::before { content: "\f7a5"; } +.bi-4-circle-fill::before { content: "\f7a8"; } +.bi-4-circle::before { content: "\f7a9"; } +.bi-4-square-fill::before { content: "\f7aa"; } +.bi-4-square::before { content: "\f7ab"; } +.bi-5-circle-fill::before { content: "\f7ae"; } +.bi-5-circle::before { content: "\f7af"; } +.bi-5-square-fill::before { content: "\f7b0"; } +.bi-5-square::before { content: "\f7b1"; } +.bi-6-circle-fill::before { content: "\f7b4"; } +.bi-6-circle::before { content: "\f7b5"; } +.bi-6-square-fill::before { content: "\f7b6"; } +.bi-6-square::before { content: "\f7b7"; } +.bi-7-circle-fill::before { content: "\f7ba"; } +.bi-7-circle::before { content: "\f7bb"; } +.bi-7-square-fill::before { content: "\f7bc"; } +.bi-7-square::before { content: "\f7bd"; } +.bi-8-circle-fill::before { content: "\f7c0"; } +.bi-8-circle::before { content: "\f7c1"; } +.bi-8-square-fill::before { content: "\f7c2"; } +.bi-8-square::before { content: "\f7c3"; } +.bi-9-circle-fill::before { content: "\f7c6"; } +.bi-9-circle::before { content: "\f7c7"; } +.bi-9-square-fill::before { content: "\f7c8"; } +.bi-9-square::before { content: "\f7c9"; } +.bi-airplane-engines-fill::before { content: "\f7ca"; } +.bi-airplane-engines::before { content: "\f7cb"; } +.bi-airplane-fill::before { content: "\f7cc"; } +.bi-airplane::before { content: "\f7cd"; } +.bi-alexa::before { content: "\f7ce"; } +.bi-alipay::before { content: "\f7cf"; } +.bi-android::before { content: "\f7d0"; } +.bi-android2::before { content: "\f7d1"; } +.bi-box-fill::before { content: "\f7d2"; } +.bi-box-seam-fill::before { content: "\f7d3"; } +.bi-browser-chrome::before { content: "\f7d4"; } +.bi-browser-edge::before { content: "\f7d5"; } +.bi-browser-firefox::before { content: "\f7d6"; } +.bi-browser-safari::before { content: "\f7d7"; } +.bi-c-circle-fill::before { content: "\f7da"; } +.bi-c-circle::before { content: "\f7db"; } +.bi-c-square-fill::before { content: "\f7dc"; } +.bi-c-square::before { content: "\f7dd"; } +.bi-capsule-pill::before { content: "\f7de"; } +.bi-capsule::before { content: "\f7df"; } +.bi-car-front-fill::before { content: "\f7e0"; } +.bi-car-front::before { content: "\f7e1"; } +.bi-cassette-fill::before { content: "\f7e2"; } +.bi-cassette::before { content: "\f7e3"; } +.bi-cc-circle-fill::before { content: "\f7e6"; } +.bi-cc-circle::before { content: "\f7e7"; } +.bi-cc-square-fill::before { content: "\f7e8"; } +.bi-cc-square::before { content: "\f7e9"; } +.bi-cup-hot-fill::before { content: "\f7ea"; } +.bi-cup-hot::before { content: "\f7eb"; } +.bi-currency-rupee::before { content: "\f7ec"; } +.bi-dropbox::before { content: "\f7ed"; } +.bi-escape::before { content: "\f7ee"; } +.bi-fast-forward-btn-fill::before { content: "\f7ef"; } +.bi-fast-forward-btn::before { content: "\f7f0"; } +.bi-fast-forward-circle-fill::before { content: "\f7f1"; } +.bi-fast-forward-circle::before { content: "\f7f2"; } +.bi-fast-forward-fill::before { content: "\f7f3"; } +.bi-fast-forward::before { content: "\f7f4"; } +.bi-filetype-sql::before { content: "\f7f5"; } +.bi-fire::before { content: "\f7f6"; } +.bi-google-play::before { content: "\f7f7"; } +.bi-h-circle-fill::before { content: "\f7fa"; } +.bi-h-circle::before { content: "\f7fb"; } +.bi-h-square-fill::before { content: "\f7fc"; } +.bi-h-square::before { content: "\f7fd"; } +.bi-indent::before { content: "\f7fe"; } +.bi-lungs-fill::before { content: "\f7ff"; } +.bi-lungs::before { content: "\f800"; } +.bi-microsoft-teams::before { content: "\f801"; } +.bi-p-circle-fill::before { content: "\f804"; } +.bi-p-circle::before { content: "\f805"; } +.bi-p-square-fill::before { content: "\f806"; } +.bi-p-square::before { content: "\f807"; } +.bi-pass-fill::before { content: "\f808"; } +.bi-pass::before { content: "\f809"; } +.bi-prescription::before { content: "\f80a"; } +.bi-prescription2::before { content: "\f80b"; } +.bi-r-circle-fill::before { content: "\f80e"; } +.bi-r-circle::before { content: "\f80f"; } +.bi-r-square-fill::before { content: "\f810"; } +.bi-r-square::before { content: "\f811"; } +.bi-repeat-1::before { content: "\f812"; } +.bi-repeat::before { content: "\f813"; } +.bi-rewind-btn-fill::before { content: "\f814"; } +.bi-rewind-btn::before { content: "\f815"; } +.bi-rewind-circle-fill::before { content: "\f816"; } +.bi-rewind-circle::before { content: "\f817"; } +.bi-rewind-fill::before { content: "\f818"; } +.bi-rewind::before { content: "\f819"; } +.bi-train-freight-front-fill::before { content: "\f81a"; } +.bi-train-freight-front::before { content: "\f81b"; } +.bi-train-front-fill::before { content: "\f81c"; } +.bi-train-front::before { content: "\f81d"; } +.bi-train-lightrail-front-fill::before { content: "\f81e"; } +.bi-train-lightrail-front::before { content: "\f81f"; } +.bi-truck-front-fill::before { content: "\f820"; } +.bi-truck-front::before { content: "\f821"; } +.bi-ubuntu::before { content: "\f822"; } +.bi-unindent::before { content: "\f823"; } +.bi-unity::before { content: "\f824"; } +.bi-universal-access-circle::before { content: "\f825"; } +.bi-universal-access::before { content: "\f826"; } +.bi-virus::before { content: "\f827"; } +.bi-virus2::before { content: "\f828"; } +.bi-wechat::before { content: "\f829"; } +.bi-yelp::before { content: "\f82a"; } +.bi-sign-stop-fill::before { content: "\f82b"; } +.bi-sign-stop-lights-fill::before { content: "\f82c"; } +.bi-sign-stop-lights::before { content: "\f82d"; } +.bi-sign-stop::before { content: "\f82e"; } +.bi-sign-turn-left-fill::before { content: "\f82f"; } +.bi-sign-turn-left::before { content: "\f830"; } +.bi-sign-turn-right-fill::before { content: "\f831"; } +.bi-sign-turn-right::before { content: "\f832"; } +.bi-sign-turn-slight-left-fill::before { content: "\f833"; } +.bi-sign-turn-slight-left::before { content: "\f834"; } +.bi-sign-turn-slight-right-fill::before { content: "\f835"; } +.bi-sign-turn-slight-right::before { content: "\f836"; } +.bi-sign-yield-fill::before { content: "\f837"; } +.bi-sign-yield::before { content: "\f838"; } +.bi-ev-station-fill::before { content: "\f839"; } +.bi-ev-station::before { content: "\f83a"; } +.bi-fuel-pump-diesel-fill::before { content: "\f83b"; } +.bi-fuel-pump-diesel::before { content: "\f83c"; } +.bi-fuel-pump-fill::before { content: "\f83d"; } +.bi-fuel-pump::before { content: "\f83e"; } +.bi-0-circle-fill::before { content: "\f83f"; } +.bi-0-circle::before { content: "\f840"; } +.bi-0-square-fill::before { content: "\f841"; } +.bi-0-square::before { content: "\f842"; } +.bi-rocket-fill::before { content: "\f843"; } +.bi-rocket-takeoff-fill::before { content: "\f844"; } +.bi-rocket-takeoff::before { content: "\f845"; } +.bi-rocket::before { content: "\f846"; } +.bi-stripe::before { content: "\f847"; } +.bi-subscript::before { content: "\f848"; } +.bi-superscript::before { content: "\f849"; } +.bi-trello::before { content: "\f84a"; } +.bi-envelope-at-fill::before { content: "\f84b"; } +.bi-envelope-at::before { content: "\f84c"; } +.bi-regex::before { content: "\f84d"; } +.bi-text-wrap::before { content: "\f84e"; } +.bi-sign-dead-end-fill::before { content: "\f84f"; } +.bi-sign-dead-end::before { content: "\f850"; } +.bi-sign-do-not-enter-fill::before { content: "\f851"; } +.bi-sign-do-not-enter::before { content: "\f852"; } +.bi-sign-intersection-fill::before { content: "\f853"; } +.bi-sign-intersection-side-fill::before { content: "\f854"; } +.bi-sign-intersection-side::before { content: "\f855"; } +.bi-sign-intersection-t-fill::before { content: "\f856"; } +.bi-sign-intersection-t::before { content: "\f857"; } +.bi-sign-intersection-y-fill::before { content: "\f858"; } +.bi-sign-intersection-y::before { content: "\f859"; } +.bi-sign-intersection::before { content: "\f85a"; } +.bi-sign-merge-left-fill::before { content: "\f85b"; } +.bi-sign-merge-left::before { content: "\f85c"; } +.bi-sign-merge-right-fill::before { content: "\f85d"; } +.bi-sign-merge-right::before { content: "\f85e"; } +.bi-sign-no-left-turn-fill::before { content: "\f85f"; } +.bi-sign-no-left-turn::before { content: "\f860"; } +.bi-sign-no-parking-fill::before { content: "\f861"; } +.bi-sign-no-parking::before { content: "\f862"; } +.bi-sign-no-right-turn-fill::before { content: "\f863"; } +.bi-sign-no-right-turn::before { content: "\f864"; } +.bi-sign-railroad-fill::before { content: "\f865"; } +.bi-sign-railroad::before { content: "\f866"; } +.bi-building-add::before { content: "\f867"; } +.bi-building-check::before { content: "\f868"; } +.bi-building-dash::before { content: "\f869"; } +.bi-building-down::before { content: "\f86a"; } +.bi-building-exclamation::before { content: "\f86b"; } +.bi-building-fill-add::before { content: "\f86c"; } +.bi-building-fill-check::before { content: "\f86d"; } +.bi-building-fill-dash::before { content: "\f86e"; } +.bi-building-fill-down::before { content: "\f86f"; } +.bi-building-fill-exclamation::before { content: "\f870"; } +.bi-building-fill-gear::before { content: "\f871"; } +.bi-building-fill-lock::before { content: "\f872"; } +.bi-building-fill-slash::before { content: "\f873"; } +.bi-building-fill-up::before { content: "\f874"; } +.bi-building-fill-x::before { content: "\f875"; } +.bi-building-fill::before { content: "\f876"; } +.bi-building-gear::before { content: "\f877"; } +.bi-building-lock::before { content: "\f878"; } +.bi-building-slash::before { content: "\f879"; } +.bi-building-up::before { content: "\f87a"; } +.bi-building-x::before { content: "\f87b"; } +.bi-buildings-fill::before { content: "\f87c"; } +.bi-buildings::before { content: "\f87d"; } +.bi-bus-front-fill::before { content: "\f87e"; } +.bi-bus-front::before { content: "\f87f"; } +.bi-ev-front-fill::before { content: "\f880"; } +.bi-ev-front::before { content: "\f881"; } +.bi-globe-americas::before { content: "\f882"; } +.bi-globe-asia-australia::before { content: "\f883"; } +.bi-globe-central-south-asia::before { content: "\f884"; } +.bi-globe-europe-africa::before { content: "\f885"; } +.bi-house-add-fill::before { content: "\f886"; } +.bi-house-add::before { content: "\f887"; } +.bi-house-check-fill::before { content: "\f888"; } +.bi-house-check::before { content: "\f889"; } +.bi-house-dash-fill::before { content: "\f88a"; } +.bi-house-dash::before { content: "\f88b"; } +.bi-house-down-fill::before { content: "\f88c"; } +.bi-house-down::before { content: "\f88d"; } +.bi-house-exclamation-fill::before { content: "\f88e"; } +.bi-house-exclamation::before { content: "\f88f"; } +.bi-house-gear-fill::before { content: "\f890"; } +.bi-house-gear::before { content: "\f891"; } +.bi-house-lock-fill::before { content: "\f892"; } +.bi-house-lock::before { content: "\f893"; } +.bi-house-slash-fill::before { content: "\f894"; } +.bi-house-slash::before { content: "\f895"; } +.bi-house-up-fill::before { content: "\f896"; } +.bi-house-up::before { content: "\f897"; } +.bi-house-x-fill::before { content: "\f898"; } +.bi-house-x::before { content: "\f899"; } +.bi-person-add::before { content: "\f89a"; } +.bi-person-down::before { content: "\f89b"; } +.bi-person-exclamation::before { content: "\f89c"; } +.bi-person-fill-add::before { content: "\f89d"; } +.bi-person-fill-check::before { content: "\f89e"; } +.bi-person-fill-dash::before { content: "\f89f"; } +.bi-person-fill-down::before { content: "\f8a0"; } +.bi-person-fill-exclamation::before { content: "\f8a1"; } +.bi-person-fill-gear::before { content: "\f8a2"; } +.bi-person-fill-lock::before { content: "\f8a3"; } +.bi-person-fill-slash::before { content: "\f8a4"; } +.bi-person-fill-up::before { content: "\f8a5"; } +.bi-person-fill-x::before { content: "\f8a6"; } +.bi-person-gear::before { content: "\f8a7"; } +.bi-person-lock::before { content: "\f8a8"; } +.bi-person-slash::before { content: "\f8a9"; } +.bi-person-up::before { content: "\f8aa"; } +.bi-scooter::before { content: "\f8ab"; } +.bi-taxi-front-fill::before { content: "\f8ac"; } +.bi-taxi-front::before { content: "\f8ad"; } +.bi-amd::before { content: "\f8ae"; } +.bi-database-add::before { content: "\f8af"; } +.bi-database-check::before { content: "\f8b0"; } +.bi-database-dash::before { content: "\f8b1"; } +.bi-database-down::before { content: "\f8b2"; } +.bi-database-exclamation::before { content: "\f8b3"; } +.bi-database-fill-add::before { content: "\f8b4"; } +.bi-database-fill-check::before { content: "\f8b5"; } +.bi-database-fill-dash::before { content: "\f8b6"; } +.bi-database-fill-down::before { content: "\f8b7"; } +.bi-database-fill-exclamation::before { content: "\f8b8"; } +.bi-database-fill-gear::before { content: "\f8b9"; } +.bi-database-fill-lock::before { content: "\f8ba"; } +.bi-database-fill-slash::before { content: "\f8bb"; } +.bi-database-fill-up::before { content: "\f8bc"; } +.bi-database-fill-x::before { content: "\f8bd"; } +.bi-database-fill::before { content: "\f8be"; } +.bi-database-gear::before { content: "\f8bf"; } +.bi-database-lock::before { content: "\f8c0"; } +.bi-database-slash::before { content: "\f8c1"; } +.bi-database-up::before { content: "\f8c2"; } +.bi-database-x::before { content: "\f8c3"; } +.bi-database::before { content: "\f8c4"; } +.bi-houses-fill::before { content: "\f8c5"; } +.bi-houses::before { content: "\f8c6"; } +.bi-nvidia::before { content: "\f8c7"; } +.bi-person-vcard-fill::before { content: "\f8c8"; } +.bi-person-vcard::before { content: "\f8c9"; } +.bi-sina-weibo::before { content: "\f8ca"; } +.bi-tencent-qq::before { content: "\f8cb"; } +.bi-wikipedia::before { content: "\f8cc"; } +.bi-alphabet-uppercase::before { content: "\f2a5"; } +.bi-alphabet::before { content: "\f68a"; } +.bi-amazon::before { content: "\f68d"; } +.bi-arrows-collapse-vertical::before { content: "\f690"; } +.bi-arrows-expand-vertical::before { content: "\f695"; } +.bi-arrows-vertical::before { content: "\f698"; } +.bi-arrows::before { content: "\f6a2"; } +.bi-ban-fill::before { content: "\f6a3"; } +.bi-ban::before { content: "\f6b6"; } +.bi-bing::before { content: "\f6c2"; } +.bi-cake::before { content: "\f6e0"; } +.bi-cake2::before { content: "\f6ed"; } +.bi-cookie::before { content: "\f6ee"; } +.bi-copy::before { content: "\f759"; } +.bi-crosshair::before { content: "\f769"; } +.bi-crosshair2::before { content: "\f794"; } +.bi-emoji-astonished-fill::before { content: "\f795"; } +.bi-emoji-astonished::before { content: "\f79a"; } +.bi-emoji-grimace-fill::before { content: "\f79b"; } +.bi-emoji-grimace::before { content: "\f7a0"; } +.bi-emoji-grin-fill::before { content: "\f7a1"; } +.bi-emoji-grin::before { content: "\f7a6"; } +.bi-emoji-surprise-fill::before { content: "\f7a7"; } +.bi-emoji-surprise::before { content: "\f7ac"; } +.bi-emoji-tear-fill::before { content: "\f7ad"; } +.bi-emoji-tear::before { content: "\f7b2"; } +.bi-envelope-arrow-down-fill::before { content: "\f7b3"; } +.bi-envelope-arrow-down::before { content: "\f7b8"; } +.bi-envelope-arrow-up-fill::before { content: "\f7b9"; } +.bi-envelope-arrow-up::before { content: "\f7be"; } +.bi-feather::before { content: "\f7bf"; } +.bi-feather2::before { content: "\f7c4"; } +.bi-floppy-fill::before { content: "\f7c5"; } +.bi-floppy::before { content: "\f7d8"; } +.bi-floppy2-fill::before { content: "\f7d9"; } +.bi-floppy2::before { content: "\f7e4"; } +.bi-gitlab::before { content: "\f7e5"; } +.bi-highlighter::before { content: "\f7f8"; } +.bi-marker-tip::before { content: "\f802"; } +.bi-nvme-fill::before { content: "\f803"; } +.bi-nvme::before { content: "\f80c"; } +.bi-opencollective::before { content: "\f80d"; } +.bi-pci-card-network::before { content: "\f8cd"; } +.bi-pci-card-sound::before { content: "\f8ce"; } +.bi-radar::before { content: "\f8cf"; } +.bi-send-arrow-down-fill::before { content: "\f8d0"; } +.bi-send-arrow-down::before { content: "\f8d1"; } +.bi-send-arrow-up-fill::before { content: "\f8d2"; } +.bi-send-arrow-up::before { content: "\f8d3"; } +.bi-sim-slash-fill::before { content: "\f8d4"; } +.bi-sim-slash::before { content: "\f8d5"; } +.bi-sourceforge::before { content: "\f8d6"; } +.bi-substack::before { content: "\f8d7"; } +.bi-threads-fill::before { content: "\f8d8"; } +.bi-threads::before { content: "\f8d9"; } +.bi-transparency::before { content: "\f8da"; } +.bi-twitter-x::before { content: "\f8db"; } +.bi-type-h4::before { content: "\f8dc"; } +.bi-type-h5::before { content: "\f8dd"; } +.bi-type-h6::before { content: "\f8de"; } +.bi-backpack-fill::before { content: "\f8df"; } +.bi-backpack::before { content: "\f8e0"; } +.bi-backpack2-fill::before { content: "\f8e1"; } +.bi-backpack2::before { content: "\f8e2"; } +.bi-backpack3-fill::before { content: "\f8e3"; } +.bi-backpack3::before { content: "\f8e4"; } +.bi-backpack4-fill::before { content: "\f8e5"; } +.bi-backpack4::before { content: "\f8e6"; } +.bi-brilliance::before { content: "\f8e7"; } +.bi-cake-fill::before { content: "\f8e8"; } +.bi-cake2-fill::before { content: "\f8e9"; } +.bi-duffle-fill::before { content: "\f8ea"; } +.bi-duffle::before { content: "\f8eb"; } +.bi-exposure::before { content: "\f8ec"; } +.bi-gender-neuter::before { content: "\f8ed"; } +.bi-highlights::before { content: "\f8ee"; } +.bi-luggage-fill::before { content: "\f8ef"; } +.bi-luggage::before { content: "\f8f0"; } +.bi-mailbox-flag::before { content: "\f8f1"; } +.bi-mailbox2-flag::before { content: "\f8f2"; } +.bi-noise-reduction::before { content: "\f8f3"; } +.bi-passport-fill::before { content: "\f8f4"; } +.bi-passport::before { content: "\f8f5"; } +.bi-person-arms-up::before { content: "\f8f6"; } +.bi-person-raised-hand::before { content: "\f8f7"; } +.bi-person-standing-dress::before { content: "\f8f8"; } +.bi-person-standing::before { content: "\f8f9"; } +.bi-person-walking::before { content: "\f8fa"; } +.bi-person-wheelchair::before { content: "\f8fb"; } +.bi-shadows::before { content: "\f8fc"; } +.bi-suitcase-fill::before { content: "\f8fd"; } +.bi-suitcase-lg-fill::before { content: "\f8fe"; } +.bi-suitcase-lg::before { content: "\f8ff"; } +.bi-suitcase::before { content: "\f900"; } +.bi-suitcase2-fill::before { content: "\f901"; } +.bi-suitcase2::before { content: "\f902"; } +.bi-vignette::before { content: "\f903"; } diff --git a/docs/validmind/errors_files/libs/bootstrap/bootstrap-icons.woff b/docs/validmind/errors_files/libs/bootstrap/bootstrap-icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..dbeeb055674125ad78fda0f3d166b36e5cc92336 GIT binary patch literal 176200 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

2+UrCZlNAp`)&G@jg{m-!Dn; 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πR(XEyYV3az{Ot$Y*f93mYq^Lnu{qbYp!X!TA9&! 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 F?~0aZ)an2L literal 0 HcmV?d00001 diff --git a/docs/validmind/errors_files/libs/bootstrap/bootstrap.min.js b/docs/validmind/errors_files/libs/bootstrap/bootstrap.min.js new file mode 100644 index 000000000..e8f21f703 --- /dev/null +++ b/docs/validmind/errors_files/libs/bootstrap/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.1"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return n(e)},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"

"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=":not(.dropdown-toggle)",zs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Rs=`.nav-link${Bs}, .list-group-item${Bs}, [role="tab"]${Bs}, ${zs}`,qs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Vs extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Vs.getOrCreateInstance(i).show())}_getChildren(){return z.find(Rs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(Rs)?t:z.findOne(Rs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Vs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,zs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Vs.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(qs))Vs.getOrCreateInstance(t)})),m(Vs);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Ys=`focusin${Ks}`,Us=`focusout${Ks}`,Gs=`hide${Ks}`,Js=`hidden${Ks}`,Zs=`show${Ks}`,to=`shown${Ks}`,eo="hide",io="show",no="showing",so={animation:"boolean",autohide:"boolean",delay:"number"},oo={animation:!0,autohide:!0,delay:5e3};class ro extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return oo}static get DefaultType(){return so}static get NAME(){return"toast"}show(){N.trigger(this._element,Zs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(eo),d(this._element),this._element.classList.add(io,no),this._queueCallback((()=>{this._element.classList.remove(no),N.trigger(this._element,to),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Gs).defaultPrevented||(this._element.classList.add(no),this._queueCallback((()=>{this._element.classList.add(eo),this._element.classList.remove(no,io),N.trigger(this._element,Js)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(io),super.dispose()}isShown(){return this._element.classList.contains(io)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Qs,(t=>this._onInteraction(t,!0))),N.on(this._element,Xs,(t=>this._onInteraction(t,!1))),N.on(this._element,Ys,(t=>this._onInteraction(t,!0))),N.on(this._element,Us,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ro.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ro),m(ro),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Vs,Toast:ro,Tooltip:cs}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/docs/validmind/errors_files/libs/clipboard/clipboard.min.js b/docs/validmind/errors_files/libs/clipboard/clipboard.min.js new file mode 100644 index 000000000..1103f811e --- /dev/null +++ b/docs/validmind/errors_files/libs/clipboard/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1.anchorjs-link,.anchorjs-link:focus{opacity:1}",A.sheet.cssRules.length),A.sheet.insertRule("[data-anchorjs-icon]::after{content:attr(data-anchorjs-icon)}",A.sheet.cssRules.length),A.sheet.insertRule('@font-face{font-family:anchorjs-icons;src:url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype")}',A.sheet.cssRules.length)),h=document.querySelectorAll("[id]"),t=[].map.call(h,function(A){return A.id}),i=0;i\]./()*\\\n\t\b\v\u00A0]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),A=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||A||!1}}}); +// @license-end \ No newline at end of file diff --git a/docs/validmind/errors_files/libs/quarto-html/popper.min.js b/docs/validmind/errors_files/libs/quarto-html/popper.min.js new file mode 100644 index 000000000..e3726d728 --- /dev/null +++ b/docs/validmind/errors_files/libs/quarto-html/popper.min.js @@ -0,0 +1,6 @@ +/** + * @popperjs/core v2.11.7 - MIT License + */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){"use strict";function t(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function n(e){return e instanceof t(e).Element||e instanceof Element}function r(e){return e instanceof t(e).HTMLElement||e instanceof HTMLElement}function o(e){return"undefined"!=typeof ShadowRoot&&(e instanceof t(e).ShadowRoot||e instanceof ShadowRoot)}var i=Math.max,a=Math.min,s=Math.round;function f(){var e=navigator.userAgentData;return null!=e&&e.brands&&Array.isArray(e.brands)?e.brands.map((function(e){return e.brand+"/"+e.version})).join(" "):navigator.userAgent}function c(){return!/^((?!chrome|android).)*safari/i.test(f())}function p(e,o,i){void 0===o&&(o=!1),void 0===i&&(i=!1);var a=e.getBoundingClientRect(),f=1,p=1;o&&r(e)&&(f=e.offsetWidth>0&&s(a.width)/e.offsetWidth||1,p=e.offsetHeight>0&&s(a.height)/e.offsetHeight||1);var u=(n(e)?t(e):window).visualViewport,l=!c()&&i,d=(a.left+(l&&u?u.offsetLeft:0))/f,h=(a.top+(l&&u?u.offsetTop:0))/p,m=a.width/f,v=a.height/p;return{width:m,height:v,top:h,right:d+m,bottom:h+v,left:d,x:d,y:h}}function u(e){var n=t(e);return{scrollLeft:n.pageXOffset,scrollTop:n.pageYOffset}}function l(e){return e?(e.nodeName||"").toLowerCase():null}function d(e){return((n(e)?e.ownerDocument:e.document)||window.document).documentElement}function h(e){return p(d(e)).left+u(e).scrollLeft}function m(e){return t(e).getComputedStyle(e)}function v(e){var t=m(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function y(e,n,o){void 0===o&&(o=!1);var i,a,f=r(n),c=r(n)&&function(e){var t=e.getBoundingClientRect(),n=s(t.width)/e.offsetWidth||1,r=s(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(n),m=d(n),y=p(e,c,o),g={scrollLeft:0,scrollTop:0},b={x:0,y:0};return(f||!f&&!o)&&(("body"!==l(n)||v(m))&&(g=(i=n)!==t(i)&&r(i)?{scrollLeft:(a=i).scrollLeft,scrollTop:a.scrollTop}:u(i)),r(n)?((b=p(n,!0)).x+=n.clientLeft,b.y+=n.clientTop):m&&(b.x=h(m))),{x:y.left+g.scrollLeft-b.x,y:y.top+g.scrollTop-b.y,width:y.width,height:y.height}}function g(e){var t=p(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function b(e){return"html"===l(e)?e:e.assignedSlot||e.parentNode||(o(e)?e.host:null)||d(e)}function x(e){return["html","body","#document"].indexOf(l(e))>=0?e.ownerDocument.body:r(e)&&v(e)?e:x(b(e))}function w(e,n){var r;void 0===n&&(n=[]);var o=x(e),i=o===(null==(r=e.ownerDocument)?void 0:r.body),a=t(o),s=i?[a].concat(a.visualViewport||[],v(o)?o:[]):o,f=n.concat(s);return i?f:f.concat(w(b(s)))}function O(e){return["table","td","th"].indexOf(l(e))>=0}function j(e){return r(e)&&"fixed"!==m(e).position?e.offsetParent:null}function E(e){for(var n=t(e),i=j(e);i&&O(i)&&"static"===m(i).position;)i=j(i);return i&&("html"===l(i)||"body"===l(i)&&"static"===m(i).position)?n:i||function(e){var t=/firefox/i.test(f());if(/Trident/i.test(f())&&r(e)&&"fixed"===m(e).position)return null;var n=b(e);for(o(n)&&(n=n.host);r(n)&&["html","body"].indexOf(l(n))<0;){var i=m(n);if("none"!==i.transform||"none"!==i.perspective||"paint"===i.contain||-1!==["transform","perspective"].indexOf(i.willChange)||t&&"filter"===i.willChange||t&&i.filter&&"none"!==i.filter)return n;n=n.parentNode}return null}(e)||n}var D="top",A="bottom",L="right",P="left",M="auto",k=[D,A,L,P],W="start",B="end",H="viewport",T="popper",R=k.reduce((function(e,t){return e.concat([t+"-"+W,t+"-"+B])}),[]),S=[].concat(k,[M]).reduce((function(e,t){return e.concat([t,t+"-"+W,t+"-"+B])}),[]),V=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function q(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}function C(e){return e.split("-")[0]}function N(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&o(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function I(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function _(e,r,o){return r===H?I(function(e,n){var r=t(e),o=d(e),i=r.visualViewport,a=o.clientWidth,s=o.clientHeight,f=0,p=0;if(i){a=i.width,s=i.height;var u=c();(u||!u&&"fixed"===n)&&(f=i.offsetLeft,p=i.offsetTop)}return{width:a,height:s,x:f+h(e),y:p}}(e,o)):n(r)?function(e,t){var n=p(e,!1,"fixed"===t);return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}(r,o):I(function(e){var t,n=d(e),r=u(e),o=null==(t=e.ownerDocument)?void 0:t.body,a=i(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=i(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),f=-r.scrollLeft+h(e),c=-r.scrollTop;return"rtl"===m(o||n).direction&&(f+=i(n.clientWidth,o?o.clientWidth:0)-a),{width:a,height:s,x:f,y:c}}(d(e)))}function F(e,t,o,s){var f="clippingParents"===t?function(e){var t=w(b(e)),o=["absolute","fixed"].indexOf(m(e).position)>=0&&r(e)?E(e):e;return n(o)?t.filter((function(e){return n(e)&&N(e,o)&&"body"!==l(e)})):[]}(e):[].concat(t),c=[].concat(f,[o]),p=c[0],u=c.reduce((function(t,n){var r=_(e,n,s);return t.top=i(r.top,t.top),t.right=a(r.right,t.right),t.bottom=a(r.bottom,t.bottom),t.left=i(r.left,t.left),t}),_(e,p,s));return u.width=u.right-u.left,u.height=u.bottom-u.top,u.x=u.left,u.y=u.top,u}function U(e){return e.split("-")[1]}function z(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function X(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?C(o):null,a=o?U(o):null,s=n.x+n.width/2-r.width/2,f=n.y+n.height/2-r.height/2;switch(i){case D:t={x:s,y:n.y-r.height};break;case A:t={x:s,y:n.y+n.height};break;case L:t={x:n.x+n.width,y:f};break;case P:t={x:n.x-r.width,y:f};break;default:t={x:n.x,y:n.y}}var c=i?z(i):null;if(null!=c){var p="y"===c?"height":"width";switch(a){case W:t[c]=t[c]-(n[p]/2-r[p]/2);break;case B:t[c]=t[c]+(n[p]/2-r[p]/2)}}return t}function Y(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function G(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function J(e,t){void 0===t&&(t={});var r=t,o=r.placement,i=void 0===o?e.placement:o,a=r.strategy,s=void 0===a?e.strategy:a,f=r.boundary,c=void 0===f?"clippingParents":f,u=r.rootBoundary,l=void 0===u?H:u,h=r.elementContext,m=void 0===h?T:h,v=r.altBoundary,y=void 0!==v&&v,g=r.padding,b=void 0===g?0:g,x=Y("number"!=typeof b?b:G(b,k)),w=m===T?"reference":T,O=e.rects.popper,j=e.elements[y?w:m],E=F(n(j)?j:j.contextElement||d(e.elements.popper),c,l,s),P=p(e.elements.reference),M=X({reference:P,element:O,strategy:"absolute",placement:i}),W=I(Object.assign({},O,M)),B=m===T?W:P,R={top:E.top-B.top+x.top,bottom:B.bottom-E.bottom+x.bottom,left:E.left-B.left+x.left,right:B.right-E.right+x.right},S=e.modifiersData.offset;if(m===T&&S){var V=S[i];Object.keys(R).forEach((function(e){var t=[L,A].indexOf(e)>=0?1:-1,n=[D,A].indexOf(e)>=0?"y":"x";R[e]+=V[n]*t}))}return R}var K={placement:"bottom",modifiers:[],strategy:"absolute"};function Q(){for(var e=arguments.length,t=new Array(e),n=0;n=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],s=i[1];return a=a||0,s=(s||0)*o,[P,L].indexOf(r)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,i),e}),{}),s=a[t.placement],f=s.x,c=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=f,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=a}},se={left:"right",right:"left",bottom:"top",top:"bottom"};function fe(e){return e.replace(/left|right|bottom|top/g,(function(e){return se[e]}))}var ce={start:"end",end:"start"};function pe(e){return e.replace(/start|end/g,(function(e){return ce[e]}))}function ue(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,f=n.allowedAutoPlacements,c=void 0===f?S:f,p=U(r),u=p?s?R:R.filter((function(e){return U(e)===p})):k,l=u.filter((function(e){return c.indexOf(e)>=0}));0===l.length&&(l=u);var d=l.reduce((function(t,n){return t[n]=J(e,{placement:n,boundary:o,rootBoundary:i,padding:a})[C(n)],t}),{});return Object.keys(d).sort((function(e,t){return d[e]-d[t]}))}var le={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,a=n.altAxis,s=void 0===a||a,f=n.fallbackPlacements,c=n.padding,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.flipVariations,h=void 0===d||d,m=n.allowedAutoPlacements,v=t.options.placement,y=C(v),g=f||(y===v||!h?[fe(v)]:function(e){if(C(e)===M)return[];var t=fe(e);return[pe(e),t,pe(t)]}(v)),b=[v].concat(g).reduce((function(e,n){return e.concat(C(n)===M?ue(t,{placement:n,boundary:p,rootBoundary:u,padding:c,flipVariations:h,allowedAutoPlacements:m}):n)}),[]),x=t.rects.reference,w=t.rects.popper,O=new Map,j=!0,E=b[0],k=0;k=0,S=R?"width":"height",V=J(t,{placement:B,boundary:p,rootBoundary:u,altBoundary:l,padding:c}),q=R?T?L:P:T?A:D;x[S]>w[S]&&(q=fe(q));var N=fe(q),I=[];if(i&&I.push(V[H]<=0),s&&I.push(V[q]<=0,V[N]<=0),I.every((function(e){return e}))){E=B,j=!1;break}O.set(B,I)}if(j)for(var _=function(e){var t=b.find((function(t){var n=O.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return E=t,"break"},F=h?3:1;F>0;F--){if("break"===_(F))break}t.placement!==E&&(t.modifiersData[r]._skip=!0,t.placement=E,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function de(e,t,n){return i(e,a(t,n))}var he={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,s=void 0===o||o,f=n.altAxis,c=void 0!==f&&f,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.padding,h=n.tether,m=void 0===h||h,v=n.tetherOffset,y=void 0===v?0:v,b=J(t,{boundary:p,rootBoundary:u,padding:d,altBoundary:l}),x=C(t.placement),w=U(t.placement),O=!w,j=z(x),M="x"===j?"y":"x",k=t.modifiersData.popperOffsets,B=t.rects.reference,H=t.rects.popper,T="function"==typeof y?y(Object.assign({},t.rects,{placement:t.placement})):y,R="number"==typeof T?{mainAxis:T,altAxis:T}:Object.assign({mainAxis:0,altAxis:0},T),S=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,V={x:0,y:0};if(k){if(s){var q,N="y"===j?D:P,I="y"===j?A:L,_="y"===j?"height":"width",F=k[j],X=F+b[N],Y=F-b[I],G=m?-H[_]/2:0,K=w===W?B[_]:H[_],Q=w===W?-H[_]:-B[_],Z=t.elements.arrow,$=m&&Z?g(Z):{width:0,height:0},ee=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},te=ee[N],ne=ee[I],re=de(0,B[_],$[_]),oe=O?B[_]/2-G-re-te-R.mainAxis:K-re-te-R.mainAxis,ie=O?-B[_]/2+G+re+ne+R.mainAxis:Q+re+ne+R.mainAxis,ae=t.elements.arrow&&E(t.elements.arrow),se=ae?"y"===j?ae.clientTop||0:ae.clientLeft||0:0,fe=null!=(q=null==S?void 0:S[j])?q:0,ce=F+ie-fe,pe=de(m?a(X,F+oe-fe-se):X,F,m?i(Y,ce):Y);k[j]=pe,V[j]=pe-F}if(c){var ue,le="x"===j?D:P,he="x"===j?A:L,me=k[M],ve="y"===M?"height":"width",ye=me+b[le],ge=me-b[he],be=-1!==[D,P].indexOf(x),xe=null!=(ue=null==S?void 0:S[M])?ue:0,we=be?ye:me-B[ve]-H[ve]-xe+R.altAxis,Oe=be?me+B[ve]+H[ve]-xe-R.altAxis:ge,je=m&&be?function(e,t,n){var r=de(e,t,n);return r>n?n:r}(we,me,Oe):de(m?we:ye,me,m?Oe:ge);k[M]=je,V[M]=je-me}t.modifiersData[r]=V}},requiresIfExists:["offset"]};var me={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=C(n.placement),f=z(s),c=[P,L].indexOf(s)>=0?"height":"width";if(i&&a){var p=function(e,t){return Y("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:G(e,k))}(o.padding,n),u=g(i),l="y"===f?D:P,d="y"===f?A:L,h=n.rects.reference[c]+n.rects.reference[f]-a[f]-n.rects.popper[c],m=a[f]-n.rects.reference[f],v=E(i),y=v?"y"===f?v.clientHeight||0:v.clientWidth||0:0,b=h/2-m/2,x=p[l],w=y-u[c]-p[d],O=y/2-u[c]/2+b,j=de(x,O,w),M=f;n.modifiersData[r]=((t={})[M]=j,t.centerOffset=j-O,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&N(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ve(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function ye(e){return[D,L,A,P].some((function(t){return e[t]>=0}))}var ge={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=J(t,{elementContext:"reference"}),s=J(t,{altBoundary:!0}),f=ve(a,r),c=ve(s,o,i),p=ye(f),u=ye(c);t.modifiersData[n]={referenceClippingOffsets:f,popperEscapeOffsets:c,isReferenceHidden:p,hasPopperEscaped:u},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":u})}},be=Z({defaultModifiers:[ee,te,oe,ie]}),xe=[ee,te,oe,ie,ae,le,he,me,ge],we=Z({defaultModifiers:xe});e.applyStyles=ie,e.arrow=me,e.computeStyles=oe,e.createPopper=we,e.createPopperLite=be,e.defaultModifiers=xe,e.detectOverflow=J,e.eventListeners=ee,e.flip=le,e.hide=ge,e.offset=ae,e.popperGenerator=Z,e.popperOffsets=te,e.preventOverflow=he,Object.defineProperty(e,"__esModule",{value:!0})})); + diff --git a/docs/validmind/errors_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css b/docs/validmind/errors_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css new file mode 100644 index 000000000..80e34e41a --- /dev/null +++ b/docs/validmind/errors_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css @@ -0,0 +1,205 @@ +/* quarto syntax highlight colors */ +:root { + --quarto-hl-ot-color: #003B4F; + --quarto-hl-at-color: #657422; + --quarto-hl-ss-color: #20794D; + --quarto-hl-an-color: #5E5E5E; + --quarto-hl-fu-color: #4758AB; + --quarto-hl-st-color: #20794D; + --quarto-hl-cf-color: #003B4F; + --quarto-hl-op-color: #5E5E5E; + --quarto-hl-er-color: #AD0000; + --quarto-hl-bn-color: #AD0000; + --quarto-hl-al-color: #AD0000; + --quarto-hl-va-color: #111111; + --quarto-hl-bu-color: inherit; + --quarto-hl-ex-color: inherit; + --quarto-hl-pp-color: #AD0000; + --quarto-hl-in-color: #5E5E5E; + --quarto-hl-vs-color: #20794D; + --quarto-hl-wa-color: #5E5E5E; + --quarto-hl-do-color: #5E5E5E; + --quarto-hl-im-color: #00769E; + --quarto-hl-ch-color: #20794D; + --quarto-hl-dt-color: #AD0000; + --quarto-hl-fl-color: #AD0000; + --quarto-hl-co-color: #5E5E5E; + --quarto-hl-cv-color: #5E5E5E; + --quarto-hl-cn-color: #8f5902; + --quarto-hl-sc-color: #5E5E5E; + --quarto-hl-dv-color: #AD0000; + --quarto-hl-kw-color: #003B4F; +} + +/* other quarto variables */ +:root { + --quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +pre > code.sourceCode > span { + color: #003B4F; +} + +code span { + color: #003B4F; +} + +code.sourceCode > span { + color: #003B4F; +} + +div.sourceCode, +div.sourceCode pre.sourceCode { + color: #003B4F; +} + +code span.ot { + color: #003B4F; + font-style: inherit; +} + +code span.at { + color: #657422; + font-style: inherit; +} + +code span.ss { + color: #20794D; + font-style: inherit; +} + +code span.an { + color: #5E5E5E; + font-style: inherit; +} + +code span.fu { + color: #4758AB; + font-style: inherit; +} + +code span.st { + color: #20794D; + font-style: inherit; +} + +code span.cf { + color: #003B4F; + font-weight: bold; + font-style: inherit; +} + +code span.op { + color: #5E5E5E; + font-style: inherit; +} + +code span.er { + color: #AD0000; + font-style: inherit; +} + +code span.bn { + color: #AD0000; + font-style: inherit; +} + +code span.al { + color: #AD0000; + font-style: inherit; +} + +code span.va { + color: #111111; + font-style: inherit; +} + +code span.bu { + font-style: inherit; +} + +code span.ex { + font-style: inherit; +} + +code span.pp { + color: #AD0000; + font-style: inherit; +} + +code span.in { + color: #5E5E5E; + font-style: inherit; +} + +code span.vs { + color: #20794D; + font-style: inherit; +} + +code span.wa { + color: #5E5E5E; + font-style: italic; +} + +code span.do { + color: #5E5E5E; + font-style: italic; +} + +code span.im { + color: #00769E; + font-style: inherit; +} + +code span.ch { + color: #20794D; + font-style: inherit; +} + +code span.dt { + color: #AD0000; + font-style: inherit; +} + +code span.fl { + color: #AD0000; + font-style: inherit; +} + +code span.co { + color: #5E5E5E; + font-style: inherit; +} + +code span.cv { + color: #5E5E5E; + font-style: italic; +} + +code span.cn { + color: #8f5902; + font-style: inherit; +} + +code span.sc { + color: #5E5E5E; + font-style: inherit; +} + +code span.dv { + color: #AD0000; + font-style: inherit; +} + +code span.kw { + color: #003B4F; + font-weight: bold; + font-style: inherit; +} + +.prevent-inlining { + content: " { + // Find any conflicting margin elements and add margins to the + // top to prevent overlap + const marginChildren = window.document.querySelectorAll( + ".column-margin.column-container > *, .margin-caption, .aside" + ); + + let lastBottom = 0; + for (const marginChild of marginChildren) { + if (marginChild.offsetParent !== null) { + // clear the top margin so we recompute it + marginChild.style.marginTop = null; + const top = marginChild.getBoundingClientRect().top + window.scrollY; + if (top < lastBottom) { + const marginChildStyle = window.getComputedStyle(marginChild); + const marginBottom = parseFloat(marginChildStyle["marginBottom"]); + const margin = lastBottom - top + marginBottom; + marginChild.style.marginTop = `${margin}px`; + } + const styles = window.getComputedStyle(marginChild); + const marginTop = parseFloat(styles["marginTop"]); + lastBottom = top + marginChild.getBoundingClientRect().height + marginTop; + } + } +}; + +window.document.addEventListener("DOMContentLoaded", function (_event) { + // Recompute the position of margin elements anytime the body size changes + if (window.ResizeObserver) { + const resizeObserver = new window.ResizeObserver( + throttle(() => { + layoutMarginEls(); + if ( + window.document.body.getBoundingClientRect().width < 990 && + isReaderMode() + ) { + quartoToggleReader(); + } + }, 50) + ); + resizeObserver.observe(window.document.body); + } + + const tocEl = window.document.querySelector('nav.toc-active[role="doc-toc"]'); + const sidebarEl = window.document.getElementById("quarto-sidebar"); + const leftTocEl = window.document.getElementById("quarto-sidebar-toc-left"); + const marginSidebarEl = window.document.getElementById( + "quarto-margin-sidebar" + ); + // function to determine whether the element has a previous sibling that is active + const prevSiblingIsActiveLink = (el) => { + const sibling = el.previousElementSibling; + if (sibling && sibling.tagName === "A") { + return sibling.classList.contains("active"); + } else { + return false; + } + }; + + // fire slideEnter for bootstrap tab activations (for htmlwidget resize behavior) + function fireSlideEnter(e) { + const event = window.document.createEvent("Event"); + event.initEvent("slideenter", true, true); + window.document.dispatchEvent(event); + } + const tabs = window.document.querySelectorAll('a[data-bs-toggle="tab"]'); + tabs.forEach((tab) => { + tab.addEventListener("shown.bs.tab", fireSlideEnter); + }); + + // fire slideEnter for tabby tab activations (for htmlwidget resize behavior) + document.addEventListener("tabby", fireSlideEnter, false); + + // Track scrolling and mark TOC links as active + // get table of contents and sidebar (bail if we don't have at least one) + const tocLinks = tocEl + ? [...tocEl.querySelectorAll("a[data-scroll-target]")] + : []; + const makeActive = (link) => tocLinks[link].classList.add("active"); + const removeActive = (link) => tocLinks[link].classList.remove("active"); + const removeAllActive = () => + [...Array(tocLinks.length).keys()].forEach((link) => removeActive(link)); + + // activate the anchor for a section associated with this TOC entry + tocLinks.forEach((link) => { + link.addEventListener("click", () => { + if (link.href.indexOf("#") !== -1) { + const anchor = link.href.split("#")[1]; + const heading = window.document.querySelector( + `[data-anchor-id="${anchor}"]` + ); + if (heading) { + // Add the class + heading.classList.add("reveal-anchorjs-link"); + + // function to show the anchor + const handleMouseout = () => { + heading.classList.remove("reveal-anchorjs-link"); + heading.removeEventListener("mouseout", handleMouseout); + }; + + // add a function to clear the anchor when the user mouses out of it + heading.addEventListener("mouseout", handleMouseout); + } + } + }); + }); + + const sections = tocLinks.map((link) => { + const target = link.getAttribute("data-scroll-target"); + if (target.startsWith("#")) { + return window.document.getElementById(decodeURI(`${target.slice(1)}`)); + } else { + return window.document.querySelector(decodeURI(`${target}`)); + } + }); + + const sectionMargin = 200; + let currentActive = 0; + // track whether we've initialized state the first time + let init = false; + + const updateActiveLink = () => { + // The index from bottom to top (e.g. reversed list) + let sectionIndex = -1; + if ( + window.innerHeight + window.pageYOffset >= + window.document.body.offsetHeight + ) { + // This is the no-scroll case where last section should be the active one + sectionIndex = 0; + } else { + // This finds the last section visible on screen that should be made active + sectionIndex = [...sections].reverse().findIndex((section) => { + if (section) { + return window.pageYOffset >= section.offsetTop - sectionMargin; + } else { + return false; + } + }); + } + if (sectionIndex > -1) { + const current = sections.length - sectionIndex - 1; + if (current !== currentActive) { + removeAllActive(); + currentActive = current; + makeActive(current); + if (init) { + window.dispatchEvent(sectionChanged); + } + init = true; + } + } + }; + + const inHiddenRegion = (top, bottom, hiddenRegions) => { + for (const region of hiddenRegions) { + if (top <= region.bottom && bottom >= region.top) { + return true; + } + } + return false; + }; + + const categorySelector = "header.quarto-title-block .quarto-category"; + const activateCategories = (href) => { + // Find any categories + // Surround them with a link pointing back to: + // #category=Authoring + try { + const categoryEls = window.document.querySelectorAll(categorySelector); + for (const categoryEl of categoryEls) { + const categoryText = categoryEl.textContent; + if (categoryText) { + const link = `${href}#category=${encodeURIComponent(categoryText)}`; + const linkEl = window.document.createElement("a"); + linkEl.setAttribute("href", link); + for (const child of categoryEl.childNodes) { + linkEl.append(child); + } + categoryEl.appendChild(linkEl); + } + } + } catch { + // Ignore errors + } + }; + function hasTitleCategories() { + return window.document.querySelector(categorySelector) !== null; + } + + function offsetRelativeUrl(url) { + const offset = getMeta("quarto:offset"); + return offset ? offset + url : url; + } + + function offsetAbsoluteUrl(url) { + const offset = getMeta("quarto:offset"); + const baseUrl = new URL(offset, window.location); + + const projRelativeUrl = url.replace(baseUrl, ""); + if (projRelativeUrl.startsWith("/")) { + return projRelativeUrl; + } else { + return "/" + projRelativeUrl; + } + } + + // read a meta tag value + function getMeta(metaName) { + const metas = window.document.getElementsByTagName("meta"); + for (let i = 0; i < metas.length; i++) { + if (metas[i].getAttribute("name") === metaName) { + return metas[i].getAttribute("content"); + } + } + return ""; + } + + async function findAndActivateCategories() { + // Categories search with listing only use path without query + const currentPagePath = offsetAbsoluteUrl( + window.location.origin + window.location.pathname + ); + const response = await fetch(offsetRelativeUrl("listings.json")); + if (response.status == 200) { + return response.json().then(function (listingPaths) { + const listingHrefs = []; + for (const listingPath of listingPaths) { + const pathWithoutLeadingSlash = listingPath.listing.substring(1); + for (const item of listingPath.items) { + if ( + item === currentPagePath || + item === currentPagePath + "index.html" + ) { + // Resolve this path against the offset to be sure + // we already are using the correct path to the listing + // (this adjusts the listing urls to be rooted against + // whatever root the page is actually running against) + const relative = offsetRelativeUrl(pathWithoutLeadingSlash); + const baseUrl = window.location; + const resolvedPath = new URL(relative, baseUrl); + listingHrefs.push(resolvedPath.pathname); + break; + } + } + } + + // Look up the tree for a nearby linting and use that if we find one + const nearestListing = findNearestParentListing( + offsetAbsoluteUrl(window.location.pathname), + listingHrefs + ); + if (nearestListing) { + activateCategories(nearestListing); + } else { + // See if the referrer is a listing page for this item + const referredRelativePath = offsetAbsoluteUrl(document.referrer); + const referrerListing = listingHrefs.find((listingHref) => { + const isListingReferrer = + listingHref === referredRelativePath || + listingHref === referredRelativePath + "index.html"; + return isListingReferrer; + }); + + if (referrerListing) { + // Try to use the referrer if possible + activateCategories(referrerListing); + } else if (listingHrefs.length > 0) { + // Otherwise, just fall back to the first listing + activateCategories(listingHrefs[0]); + } + } + }); + } + } + if (hasTitleCategories()) { + findAndActivateCategories(); + } + + const findNearestParentListing = (href, listingHrefs) => { + if (!href || !listingHrefs) { + return undefined; + } + // Look up the tree for a nearby linting and use that if we find one + const relativeParts = href.substring(1).split("/"); + while (relativeParts.length > 0) { + const path = relativeParts.join("/"); + for (const listingHref of listingHrefs) { + if (listingHref.startsWith(path)) { + return listingHref; + } + } + relativeParts.pop(); + } + + return undefined; + }; + + const manageSidebarVisiblity = (el, placeholderDescriptor) => { + let isVisible = true; + let elRect; + + return (hiddenRegions) => { + if (el === null) { + return; + } + + // Find the last element of the TOC + const lastChildEl = el.lastElementChild; + + if (lastChildEl) { + // Converts the sidebar to a menu + const convertToMenu = () => { + for (const child of el.children) { + child.style.opacity = 0; + child.style.overflow = "hidden"; + child.style.pointerEvents = "none"; + } + + nexttick(() => { + const toggleContainer = window.document.createElement("div"); + toggleContainer.style.width = "100%"; + toggleContainer.classList.add("zindex-over-content"); + toggleContainer.classList.add("quarto-sidebar-toggle"); + toggleContainer.classList.add("headroom-target"); // Marks this to be managed by headeroom + toggleContainer.id = placeholderDescriptor.id; + toggleContainer.style.position = "fixed"; + + const toggleIcon = window.document.createElement("i"); + toggleIcon.classList.add("quarto-sidebar-toggle-icon"); + toggleIcon.classList.add("bi"); + toggleIcon.classList.add("bi-caret-down-fill"); + + const toggleTitle = window.document.createElement("div"); + const titleEl = window.document.body.querySelector( + placeholderDescriptor.titleSelector + ); + if (titleEl) { + toggleTitle.append( + titleEl.textContent || titleEl.innerText, + toggleIcon + ); + } + toggleTitle.classList.add("zindex-over-content"); + toggleTitle.classList.add("quarto-sidebar-toggle-title"); + toggleContainer.append(toggleTitle); + + const toggleContents = window.document.createElement("div"); + toggleContents.classList = el.classList; + toggleContents.classList.add("zindex-over-content"); + toggleContents.classList.add("quarto-sidebar-toggle-contents"); + for (const child of el.children) { + if (child.id === "toc-title") { + continue; + } + + const clone = child.cloneNode(true); + clone.style.opacity = 1; + clone.style.pointerEvents = null; + clone.style.display = null; + toggleContents.append(clone); + } + toggleContents.style.height = "0px"; + const positionToggle = () => { + // position the element (top left of parent, same width as parent) + if (!elRect) { + elRect = el.getBoundingClientRect(); + } + toggleContainer.style.left = `${elRect.left}px`; + toggleContainer.style.top = `${elRect.top}px`; + toggleContainer.style.width = `${elRect.width}px`; + }; + positionToggle(); + + toggleContainer.append(toggleContents); + el.parentElement.prepend(toggleContainer); + + // Process clicks + let tocShowing = false; + // Allow the caller to control whether this is dismissed + // when it is clicked (e.g. sidebar navigation supports + // opening and closing the nav tree, so don't dismiss on click) + const clickEl = placeholderDescriptor.dismissOnClick + ? toggleContainer + : toggleTitle; + + const closeToggle = () => { + if (tocShowing) { + toggleContainer.classList.remove("expanded"); + toggleContents.style.height = "0px"; + tocShowing = false; + } + }; + + // Get rid of any expanded toggle if the user scrolls + window.document.addEventListener( + "scroll", + throttle(() => { + closeToggle(); + }, 50) + ); + + // Handle positioning of the toggle + window.addEventListener( + "resize", + throttle(() => { + elRect = undefined; + positionToggle(); + }, 50) + ); + + window.addEventListener("quarto-hrChanged", () => { + elRect = undefined; + }); + + // Process the click + clickEl.onclick = () => { + if (!tocShowing) { + toggleContainer.classList.add("expanded"); + toggleContents.style.height = null; + tocShowing = true; + } else { + closeToggle(); + } + }; + }); + }; + + // Converts a sidebar from a menu back to a sidebar + const convertToSidebar = () => { + for (const child of el.children) { + child.style.opacity = 1; + child.style.overflow = null; + child.style.pointerEvents = null; + } + + const placeholderEl = window.document.getElementById( + placeholderDescriptor.id + ); + if (placeholderEl) { + placeholderEl.remove(); + } + + el.classList.remove("rollup"); + }; + + if (isReaderMode()) { + convertToMenu(); + isVisible = false; + } else { + // Find the top and bottom o the element that is being managed + const elTop = el.offsetTop; + const elBottom = + elTop + lastChildEl.offsetTop + lastChildEl.offsetHeight; + + if (!isVisible) { + // If the element is current not visible reveal if there are + // no conflicts with overlay regions + if (!inHiddenRegion(elTop, elBottom, hiddenRegions)) { + convertToSidebar(); + isVisible = true; + } + } else { + // If the element is visible, hide it if it conflicts with overlay regions + // and insert a placeholder toggle (or if we're in reader mode) + if (inHiddenRegion(elTop, elBottom, hiddenRegions)) { + convertToMenu(); + isVisible = false; + } + } + } + } + }; + }; + + const tabEls = document.querySelectorAll('a[data-bs-toggle="tab"]'); + for (const tabEl of tabEls) { + const id = tabEl.getAttribute("data-bs-target"); + if (id) { + const columnEl = document.querySelector( + `${id} .column-margin, .tabset-margin-content` + ); + if (columnEl) + tabEl.addEventListener("shown.bs.tab", function (event) { + const el = event.srcElement; + if (el) { + const visibleCls = `${el.id}-margin-content`; + // walk up until we find a parent tabset + let panelTabsetEl = el.parentElement; + while (panelTabsetEl) { + if (panelTabsetEl.classList.contains("panel-tabset")) { + break; + } + panelTabsetEl = panelTabsetEl.parentElement; + } + + if (panelTabsetEl) { + const prevSib = panelTabsetEl.previousElementSibling; + if ( + prevSib && + prevSib.classList.contains("tabset-margin-container") + ) { + const childNodes = prevSib.querySelectorAll( + ".tabset-margin-content" + ); + for (const childEl of childNodes) { + if (childEl.classList.contains(visibleCls)) { + childEl.classList.remove("collapse"); + } else { + childEl.classList.add("collapse"); + } + } + } + } + } + + layoutMarginEls(); + }); + } + } + + // Manage the visibility of the toc and the sidebar + const marginScrollVisibility = manageSidebarVisiblity(marginSidebarEl, { + id: "quarto-toc-toggle", + titleSelector: "#toc-title", + dismissOnClick: true, + }); + const sidebarScrollVisiblity = manageSidebarVisiblity(sidebarEl, { + id: "quarto-sidebarnav-toggle", + titleSelector: ".title", + dismissOnClick: false, + }); + let tocLeftScrollVisibility; + if (leftTocEl) { + tocLeftScrollVisibility = manageSidebarVisiblity(leftTocEl, { + id: "quarto-lefttoc-toggle", + titleSelector: "#toc-title", + dismissOnClick: true, + }); + } + + // Find the first element that uses formatting in special columns + const conflictingEls = window.document.body.querySelectorAll( + '[class^="column-"], [class*=" column-"], aside, [class*="margin-caption"], [class*=" margin-caption"], [class*="margin-ref"], [class*=" margin-ref"]' + ); + + // Filter all the possibly conflicting elements into ones + // the do conflict on the left or ride side + const arrConflictingEls = Array.from(conflictingEls); + const leftSideConflictEls = arrConflictingEls.filter((el) => { + if (el.tagName === "ASIDE") { + return false; + } + return Array.from(el.classList).find((className) => { + return ( + className !== "column-body" && + className.startsWith("column-") && + !className.endsWith("right") && + !className.endsWith("container") && + className !== "column-margin" + ); + }); + }); + const rightSideConflictEls = arrConflictingEls.filter((el) => { + if (el.tagName === "ASIDE") { + return true; + } + + const hasMarginCaption = Array.from(el.classList).find((className) => { + return className == "margin-caption"; + }); + if (hasMarginCaption) { + return true; + } + + return Array.from(el.classList).find((className) => { + return ( + className !== "column-body" && + !className.endsWith("container") && + className.startsWith("column-") && + !className.endsWith("left") + ); + }); + }); + + const kOverlapPaddingSize = 10; + function toRegions(els) { + return els.map((el) => { + const boundRect = el.getBoundingClientRect(); + const top = + boundRect.top + + document.documentElement.scrollTop - + kOverlapPaddingSize; + return { + top, + bottom: top + el.scrollHeight + 2 * kOverlapPaddingSize, + }; + }); + } + + let hasObserved = false; + const visibleItemObserver = (els) => { + let visibleElements = [...els]; + const intersectionObserver = new IntersectionObserver( + (entries, _observer) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + if (visibleElements.indexOf(entry.target) === -1) { + visibleElements.push(entry.target); + } + } else { + visibleElements = visibleElements.filter((visibleEntry) => { + return visibleEntry !== entry; + }); + } + }); + + if (!hasObserved) { + hideOverlappedSidebars(); + } + hasObserved = true; + }, + {} + ); + els.forEach((el) => { + intersectionObserver.observe(el); + }); + + return { + getVisibleEntries: () => { + return visibleElements; + }, + }; + }; + + const rightElementObserver = visibleItemObserver(rightSideConflictEls); + const leftElementObserver = visibleItemObserver(leftSideConflictEls); + + const hideOverlappedSidebars = () => { + marginScrollVisibility(toRegions(rightElementObserver.getVisibleEntries())); + sidebarScrollVisiblity(toRegions(leftElementObserver.getVisibleEntries())); + if (tocLeftScrollVisibility) { + tocLeftScrollVisibility( + toRegions(leftElementObserver.getVisibleEntries()) + ); + } + }; + + window.quartoToggleReader = () => { + // Applies a slow class (or removes it) + // to update the transition speed + const slowTransition = (slow) => { + const manageTransition = (id, slow) => { + const el = document.getElementById(id); + if (el) { + if (slow) { + el.classList.add("slow"); + } else { + el.classList.remove("slow"); + } + } + }; + + manageTransition("TOC", slow); + manageTransition("quarto-sidebar", slow); + }; + const readerMode = !isReaderMode(); + setReaderModeValue(readerMode); + + // If we're entering reader mode, slow the transition + if (readerMode) { + slowTransition(readerMode); + } + highlightReaderToggle(readerMode); + hideOverlappedSidebars(); + + // If we're exiting reader mode, restore the non-slow transition + if (!readerMode) { + slowTransition(!readerMode); + } + }; + + const highlightReaderToggle = (readerMode) => { + const els = document.querySelectorAll(".quarto-reader-toggle"); + if (els) { + els.forEach((el) => { + if (readerMode) { + el.classList.add("reader"); + } else { + el.classList.remove("reader"); + } + }); + } + }; + + const setReaderModeValue = (val) => { + if (window.location.protocol !== "file:") { + window.localStorage.setItem("quarto-reader-mode", val); + } else { + localReaderMode = val; + } + }; + + const isReaderMode = () => { + if (window.location.protocol !== "file:") { + return window.localStorage.getItem("quarto-reader-mode") === "true"; + } else { + return localReaderMode; + } + }; + let localReaderMode = null; + + const tocOpenDepthStr = tocEl?.getAttribute("data-toc-expanded"); + const tocOpenDepth = tocOpenDepthStr ? Number(tocOpenDepthStr) : 1; + + // Walk the TOC and collapse/expand nodes + // Nodes are expanded if: + // - they are top level + // - they have children that are 'active' links + // - they are directly below an link that is 'active' + const walk = (el, depth) => { + // Tick depth when we enter a UL + if (el.tagName === "UL") { + depth = depth + 1; + } + + // It this is active link + let isActiveNode = false; + if (el.tagName === "A" && el.classList.contains("active")) { + isActiveNode = true; + } + + // See if there is an active child to this element + let hasActiveChild = false; + for (child of el.children) { + hasActiveChild = walk(child, depth) || hasActiveChild; + } + + // Process the collapse state if this is an UL + if (el.tagName === "UL") { + if (tocOpenDepth === -1 && depth > 1) { + // toc-expand: false + el.classList.add("collapse"); + } else if ( + depth <= tocOpenDepth || + hasActiveChild || + prevSiblingIsActiveLink(el) + ) { + el.classList.remove("collapse"); + } else { + el.classList.add("collapse"); + } + + // untick depth when we leave a UL + depth = depth - 1; + } + return hasActiveChild || isActiveNode; + }; + + // walk the TOC and expand / collapse any items that should be shown + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + + // Throttle the scroll event and walk peridiocally + window.document.addEventListener( + "scroll", + throttle(() => { + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + if (!isReaderMode()) { + hideOverlappedSidebars(); + } + }, 5) + ); + window.addEventListener( + "resize", + throttle(() => { + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + if (!isReaderMode()) { + hideOverlappedSidebars(); + } + }, 10) + ); + hideOverlappedSidebars(); + highlightReaderToggle(isReaderMode()); +}); + +// grouped tabsets +window.addEventListener("pageshow", (_event) => { + function getTabSettings() { + const data = localStorage.getItem("quarto-persistent-tabsets-data"); + if (!data) { + localStorage.setItem("quarto-persistent-tabsets-data", "{}"); + return {}; + } + if (data) { + return JSON.parse(data); + } + } + + function setTabSettings(data) { + localStorage.setItem( + "quarto-persistent-tabsets-data", + JSON.stringify(data) + ); + } + + function setTabState(groupName, groupValue) { + const data = getTabSettings(); + data[groupName] = groupValue; + setTabSettings(data); + } + + function toggleTab(tab, active) { + const tabPanelId = tab.getAttribute("aria-controls"); + const tabPanel = document.getElementById(tabPanelId); + if (active) { + tab.classList.add("active"); + tabPanel.classList.add("active"); + } else { + tab.classList.remove("active"); + tabPanel.classList.remove("active"); + } + } + + function toggleAll(selectedGroup, selectorsToSync) { + for (const [thisGroup, tabs] of Object.entries(selectorsToSync)) { + const active = selectedGroup === thisGroup; + for (const tab of tabs) { + toggleTab(tab, active); + } + } + } + + function findSelectorsToSyncByLanguage() { + const result = {}; + const tabs = Array.from( + document.querySelectorAll(`div[data-group] a[id^='tabset-']`) + ); + for (const item of tabs) { + const div = item.parentElement.parentElement.parentElement; + const group = div.getAttribute("data-group"); + if (!result[group]) { + result[group] = {}; + } + const selectorsToSync = result[group]; + const value = item.innerHTML; + if (!selectorsToSync[value]) { + selectorsToSync[value] = []; + } + selectorsToSync[value].push(item); + } + return result; + } + + function setupSelectorSync() { + const selectorsToSync = findSelectorsToSyncByLanguage(); + Object.entries(selectorsToSync).forEach(([group, tabSetsByValue]) => { + Object.entries(tabSetsByValue).forEach(([value, items]) => { + items.forEach((item) => { + item.addEventListener("click", (_event) => { + setTabState(group, value); + toggleAll(value, selectorsToSync[group]); + }); + }); + }); + }); + return selectorsToSync; + } + + const selectorsToSync = setupSelectorSync(); + for (const [group, selectedName] of Object.entries(getTabSettings())) { + const selectors = selectorsToSync[group]; + // it's possible that stale state gives us empty selections, so we explicitly check here. + if (selectors) { + toggleAll(selectedName, selectors); + } + } +}); + +function throttle(func, wait) { + let waiting = false; + return function () { + if (!waiting) { + func.apply(this, arguments); + waiting = true; + setTimeout(function () { + waiting = false; + }, wait); + } + }; +} + +function nexttick(func) { + return setTimeout(func, 0); +} diff --git a/docs/validmind/errors_files/libs/quarto-html/tippy.css b/docs/validmind/errors_files/libs/quarto-html/tippy.css new file mode 100644 index 000000000..e6ae635cb --- /dev/null +++ b/docs/validmind/errors_files/libs/quarto-html/tippy.css @@ -0,0 +1 @@ +.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1} \ No newline at end of file diff --git a/docs/validmind/errors_files/libs/quarto-html/tippy.umd.min.js b/docs/validmind/errors_files/libs/quarto-html/tippy.umd.min.js new file mode 100644 index 000000000..ca292be32 --- /dev/null +++ b/docs/validmind/errors_files/libs/quarto-html/tippy.umd.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],t):(e=e||self).tippy=t(e.Popper)}(this,(function(e){"use strict";var t={passive:!0,capture:!0},n=function(){return document.body};function r(e,t,n){if(Array.isArray(e)){var r=e[t];return null==r?Array.isArray(n)?n[t]:n:r}return e}function o(e,t){var n={}.toString.call(e);return 0===n.indexOf("[object")&&n.indexOf(t+"]")>-1}function i(e,t){return"function"==typeof e?e.apply(void 0,t):e}function a(e,t){return 0===t?e:function(r){clearTimeout(n),n=setTimeout((function(){e(r)}),t)};var n}function s(e,t){var n=Object.assign({},e);return t.forEach((function(e){delete n[e]})),n}function u(e){return[].concat(e)}function c(e,t){-1===e.indexOf(t)&&e.push(t)}function p(e){return e.split("-")[0]}function f(e){return[].slice.call(e)}function l(e){return Object.keys(e).reduce((function(t,n){return void 0!==e[n]&&(t[n]=e[n]),t}),{})}function d(){return document.createElement("div")}function v(e){return["Element","Fragment"].some((function(t){return o(e,t)}))}function m(e){return o(e,"MouseEvent")}function g(e){return!(!e||!e._tippy||e._tippy.reference!==e)}function h(e){return v(e)?[e]:function(e){return o(e,"NodeList")}(e)?f(e):Array.isArray(e)?e:f(document.querySelectorAll(e))}function b(e,t){e.forEach((function(e){e&&(e.style.transitionDuration=t+"ms")}))}function y(e,t){e.forEach((function(e){e&&e.setAttribute("data-state",t)}))}function w(e){var t,n=u(e)[0];return null!=n&&null!=(t=n.ownerDocument)&&t.body?n.ownerDocument:document}function E(e,t,n){var r=t+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(t){e[r](t,n)}))}function O(e,t){for(var n=t;n;){var r;if(e.contains(n))return!0;n=null==n.getRootNode||null==(r=n.getRootNode())?void 0:r.host}return!1}var x={isTouch:!1},C=0;function T(){x.isTouch||(x.isTouch=!0,window.performance&&document.addEventListener("mousemove",A))}function A(){var e=performance.now();e-C<20&&(x.isTouch=!1,document.removeEventListener("mousemove",A)),C=e}function L(){var e=document.activeElement;if(g(e)){var t=e._tippy;e.blur&&!t.state.isVisible&&e.blur()}}var D=!!("undefined"!=typeof window&&"undefined"!=typeof document)&&!!window.msCrypto,R=Object.assign({appendTo:n,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),k=Object.keys(R);function P(e){var t=(e.plugins||[]).reduce((function(t,n){var r,o=n.name,i=n.defaultValue;o&&(t[o]=void 0!==e[o]?e[o]:null!=(r=R[o])?r:i);return t}),{});return Object.assign({},e,t)}function j(e,t){var n=Object.assign({},t,{content:i(t.content,[e])},t.ignoreAttributes?{}:function(e,t){return(t?Object.keys(P(Object.assign({},R,{plugins:t}))):k).reduce((function(t,n){var r=(e.getAttribute("data-tippy-"+n)||"").trim();if(!r)return t;if("content"===n)t[n]=r;else try{t[n]=JSON.parse(r)}catch(e){t[n]=r}return t}),{})}(e,t.plugins));return n.aria=Object.assign({},R.aria,n.aria),n.aria={expanded:"auto"===n.aria.expanded?t.interactive:n.aria.expanded,content:"auto"===n.aria.content?t.interactive?null:"describedby":n.aria.content},n}function M(e,t){e.innerHTML=t}function V(e){var t=d();return!0===e?t.className="tippy-arrow":(t.className="tippy-svg-arrow",v(e)?t.appendChild(e):M(t,e)),t}function I(e,t){v(t.content)?(M(e,""),e.appendChild(t.content)):"function"!=typeof t.content&&(t.allowHTML?M(e,t.content):e.textContent=t.content)}function S(e){var t=e.firstElementChild,n=f(t.children);return{box:t,content:n.find((function(e){return e.classList.contains("tippy-content")})),arrow:n.find((function(e){return e.classList.contains("tippy-arrow")||e.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(e){return e.classList.contains("tippy-backdrop")}))}}function N(e){var t=d(),n=d();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=d();function o(n,r){var o=S(t),i=o.box,a=o.content,s=o.arrow;r.theme?i.setAttribute("data-theme",r.theme):i.removeAttribute("data-theme"),"string"==typeof r.animation?i.setAttribute("data-animation",r.animation):i.removeAttribute("data-animation"),r.inertia?i.setAttribute("data-inertia",""):i.removeAttribute("data-inertia"),i.style.maxWidth="number"==typeof r.maxWidth?r.maxWidth+"px":r.maxWidth,r.role?i.setAttribute("role",r.role):i.removeAttribute("role"),n.content===r.content&&n.allowHTML===r.allowHTML||I(a,e.props),r.arrow?s?n.arrow!==r.arrow&&(i.removeChild(s),i.appendChild(V(r.arrow))):i.appendChild(V(r.arrow)):s&&i.removeChild(s)}return r.className="tippy-content",r.setAttribute("data-state","hidden"),I(r,e.props),t.appendChild(n),n.appendChild(r),o(e.props,e.props),{popper:t,onUpdate:o}}N.$$tippy=!0;var B=1,H=[],U=[];function _(o,s){var v,g,h,C,T,A,L,k,M=j(o,Object.assign({},R,P(l(s)))),V=!1,I=!1,N=!1,_=!1,F=[],W=a(we,M.interactiveDebounce),X=B++,Y=(k=M.plugins).filter((function(e,t){return k.indexOf(e)===t})),$={id:X,reference:o,popper:d(),popperInstance:null,props:M,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:Y,clearDelayTimeouts:function(){clearTimeout(v),clearTimeout(g),cancelAnimationFrame(h)},setProps:function(e){if($.state.isDestroyed)return;ae("onBeforeUpdate",[$,e]),be();var t=$.props,n=j(o,Object.assign({},t,l(e),{ignoreAttributes:!0}));$.props=n,he(),t.interactiveDebounce!==n.interactiveDebounce&&(ce(),W=a(we,n.interactiveDebounce));t.triggerTarget&&!n.triggerTarget?u(t.triggerTarget).forEach((function(e){e.removeAttribute("aria-expanded")})):n.triggerTarget&&o.removeAttribute("aria-expanded");ue(),ie(),J&&J(t,n);$.popperInstance&&(Ce(),Ae().forEach((function(e){requestAnimationFrame(e._tippy.popperInstance.forceUpdate)})));ae("onAfterUpdate",[$,e])},setContent:function(e){$.setProps({content:e})},show:function(){var e=$.state.isVisible,t=$.state.isDestroyed,o=!$.state.isEnabled,a=x.isTouch&&!$.props.touch,s=r($.props.duration,0,R.duration);if(e||t||o||a)return;if(te().hasAttribute("disabled"))return;if(ae("onShow",[$],!1),!1===$.props.onShow($))return;$.state.isVisible=!0,ee()&&(z.style.visibility="visible");ie(),de(),$.state.isMounted||(z.style.transition="none");if(ee()){var u=re(),p=u.box,f=u.content;b([p,f],0)}A=function(){var e;if($.state.isVisible&&!_){if(_=!0,z.offsetHeight,z.style.transition=$.props.moveTransition,ee()&&$.props.animation){var t=re(),n=t.box,r=t.content;b([n,r],s),y([n,r],"visible")}se(),ue(),c(U,$),null==(e=$.popperInstance)||e.forceUpdate(),ae("onMount",[$]),$.props.animation&&ee()&&function(e,t){me(e,t)}(s,(function(){$.state.isShown=!0,ae("onShown",[$])}))}},function(){var e,t=$.props.appendTo,r=te();e=$.props.interactive&&t===n||"parent"===t?r.parentNode:i(t,[r]);e.contains(z)||e.appendChild(z);$.state.isMounted=!0,Ce()}()},hide:function(){var e=!$.state.isVisible,t=$.state.isDestroyed,n=!$.state.isEnabled,o=r($.props.duration,1,R.duration);if(e||t||n)return;if(ae("onHide",[$],!1),!1===$.props.onHide($))return;$.state.isVisible=!1,$.state.isShown=!1,_=!1,V=!1,ee()&&(z.style.visibility="hidden");if(ce(),ve(),ie(!0),ee()){var i=re(),a=i.box,s=i.content;$.props.animation&&(b([a,s],o),y([a,s],"hidden"))}se(),ue(),$.props.animation?ee()&&function(e,t){me(e,(function(){!$.state.isVisible&&z.parentNode&&z.parentNode.contains(z)&&t()}))}(o,$.unmount):$.unmount()},hideWithInteractivity:function(e){ne().addEventListener("mousemove",W),c(H,W),W(e)},enable:function(){$.state.isEnabled=!0},disable:function(){$.hide(),$.state.isEnabled=!1},unmount:function(){$.state.isVisible&&$.hide();if(!$.state.isMounted)return;Te(),Ae().forEach((function(e){e._tippy.unmount()})),z.parentNode&&z.parentNode.removeChild(z);U=U.filter((function(e){return e!==$})),$.state.isMounted=!1,ae("onHidden",[$])},destroy:function(){if($.state.isDestroyed)return;$.clearDelayTimeouts(),$.unmount(),be(),delete o._tippy,$.state.isDestroyed=!0,ae("onDestroy",[$])}};if(!M.render)return $;var q=M.render($),z=q.popper,J=q.onUpdate;z.setAttribute("data-tippy-root",""),z.id="tippy-"+$.id,$.popper=z,o._tippy=$,z._tippy=$;var G=Y.map((function(e){return e.fn($)})),K=o.hasAttribute("aria-expanded");return he(),ue(),ie(),ae("onCreate",[$]),M.showOnCreate&&Le(),z.addEventListener("mouseenter",(function(){$.props.interactive&&$.state.isVisible&&$.clearDelayTimeouts()})),z.addEventListener("mouseleave",(function(){$.props.interactive&&$.props.trigger.indexOf("mouseenter")>=0&&ne().addEventListener("mousemove",W)})),$;function Q(){var e=$.props.touch;return Array.isArray(e)?e:[e,0]}function Z(){return"hold"===Q()[0]}function ee(){var e;return!(null==(e=$.props.render)||!e.$$tippy)}function te(){return L||o}function ne(){var e=te().parentNode;return e?w(e):document}function re(){return S(z)}function oe(e){return $.state.isMounted&&!$.state.isVisible||x.isTouch||C&&"focus"===C.type?0:r($.props.delay,e?0:1,R.delay)}function ie(e){void 0===e&&(e=!1),z.style.pointerEvents=$.props.interactive&&!e?"":"none",z.style.zIndex=""+$.props.zIndex}function ae(e,t,n){var r;(void 0===n&&(n=!0),G.forEach((function(n){n[e]&&n[e].apply(n,t)})),n)&&(r=$.props)[e].apply(r,t)}function se(){var e=$.props.aria;if(e.content){var t="aria-"+e.content,n=z.id;u($.props.triggerTarget||o).forEach((function(e){var r=e.getAttribute(t);if($.state.isVisible)e.setAttribute(t,r?r+" "+n:n);else{var o=r&&r.replace(n,"").trim();o?e.setAttribute(t,o):e.removeAttribute(t)}}))}}function ue(){!K&&$.props.aria.expanded&&u($.props.triggerTarget||o).forEach((function(e){$.props.interactive?e.setAttribute("aria-expanded",$.state.isVisible&&e===te()?"true":"false"):e.removeAttribute("aria-expanded")}))}function ce(){ne().removeEventListener("mousemove",W),H=H.filter((function(e){return e!==W}))}function pe(e){if(!x.isTouch||!N&&"mousedown"!==e.type){var t=e.composedPath&&e.composedPath()[0]||e.target;if(!$.props.interactive||!O(z,t)){if(u($.props.triggerTarget||o).some((function(e){return O(e,t)}))){if(x.isTouch)return;if($.state.isVisible&&$.props.trigger.indexOf("click")>=0)return}else ae("onClickOutside",[$,e]);!0===$.props.hideOnClick&&($.clearDelayTimeouts(),$.hide(),I=!0,setTimeout((function(){I=!1})),$.state.isMounted||ve())}}}function fe(){N=!0}function le(){N=!1}function de(){var e=ne();e.addEventListener("mousedown",pe,!0),e.addEventListener("touchend",pe,t),e.addEventListener("touchstart",le,t),e.addEventListener("touchmove",fe,t)}function ve(){var e=ne();e.removeEventListener("mousedown",pe,!0),e.removeEventListener("touchend",pe,t),e.removeEventListener("touchstart",le,t),e.removeEventListener("touchmove",fe,t)}function me(e,t){var n=re().box;function r(e){e.target===n&&(E(n,"remove",r),t())}if(0===e)return t();E(n,"remove",T),E(n,"add",r),T=r}function ge(e,t,n){void 0===n&&(n=!1),u($.props.triggerTarget||o).forEach((function(r){r.addEventListener(e,t,n),F.push({node:r,eventType:e,handler:t,options:n})}))}function he(){var e;Z()&&(ge("touchstart",ye,{passive:!0}),ge("touchend",Ee,{passive:!0})),(e=$.props.trigger,e.split(/\s+/).filter(Boolean)).forEach((function(e){if("manual"!==e)switch(ge(e,ye),e){case"mouseenter":ge("mouseleave",Ee);break;case"focus":ge(D?"focusout":"blur",Oe);break;case"focusin":ge("focusout",Oe)}}))}function be(){F.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),F=[]}function ye(e){var t,n=!1;if($.state.isEnabled&&!xe(e)&&!I){var r="focus"===(null==(t=C)?void 0:t.type);C=e,L=e.currentTarget,ue(),!$.state.isVisible&&m(e)&&H.forEach((function(t){return t(e)})),"click"===e.type&&($.props.trigger.indexOf("mouseenter")<0||V)&&!1!==$.props.hideOnClick&&$.state.isVisible?n=!0:Le(e),"click"===e.type&&(V=!n),n&&!r&&De(e)}}function we(e){var t=e.target,n=te().contains(t)||z.contains(t);"mousemove"===e.type&&n||function(e,t){var n=t.clientX,r=t.clientY;return e.every((function(e){var t=e.popperRect,o=e.popperState,i=e.props.interactiveBorder,a=p(o.placement),s=o.modifiersData.offset;if(!s)return!0;var u="bottom"===a?s.top.y:0,c="top"===a?s.bottom.y:0,f="right"===a?s.left.x:0,l="left"===a?s.right.x:0,d=t.top-r+u>i,v=r-t.bottom-c>i,m=t.left-n+f>i,g=n-t.right-l>i;return d||v||m||g}))}(Ae().concat(z).map((function(e){var t,n=null==(t=e._tippy.popperInstance)?void 0:t.state;return n?{popperRect:e.getBoundingClientRect(),popperState:n,props:M}:null})).filter(Boolean),e)&&(ce(),De(e))}function Ee(e){xe(e)||$.props.trigger.indexOf("click")>=0&&V||($.props.interactive?$.hideWithInteractivity(e):De(e))}function Oe(e){$.props.trigger.indexOf("focusin")<0&&e.target!==te()||$.props.interactive&&e.relatedTarget&&z.contains(e.relatedTarget)||De(e)}function xe(e){return!!x.isTouch&&Z()!==e.type.indexOf("touch")>=0}function Ce(){Te();var t=$.props,n=t.popperOptions,r=t.placement,i=t.offset,a=t.getReferenceClientRect,s=t.moveTransition,u=ee()?S(z).arrow:null,c=a?{getBoundingClientRect:a,contextElement:a.contextElement||te()}:o,p=[{name:"offset",options:{offset:i}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(e){var t=e.state;if(ee()){var n=re().box;["placement","reference-hidden","escaped"].forEach((function(e){"placement"===e?n.setAttribute("data-placement",t.placement):t.attributes.popper["data-popper-"+e]?n.setAttribute("data-"+e,""):n.removeAttribute("data-"+e)})),t.attributes.popper={}}}}];ee()&&u&&p.push({name:"arrow",options:{element:u,padding:3}}),p.push.apply(p,(null==n?void 0:n.modifiers)||[]),$.popperInstance=e.createPopper(c,z,Object.assign({},n,{placement:r,onFirstUpdate:A,modifiers:p}))}function Te(){$.popperInstance&&($.popperInstance.destroy(),$.popperInstance=null)}function Ae(){return f(z.querySelectorAll("[data-tippy-root]"))}function Le(e){$.clearDelayTimeouts(),e&&ae("onTrigger",[$,e]),de();var t=oe(!0),n=Q(),r=n[0],o=n[1];x.isTouch&&"hold"===r&&o&&(t=o),t?v=setTimeout((function(){$.show()}),t):$.show()}function De(e){if($.clearDelayTimeouts(),ae("onUntrigger",[$,e]),$.state.isVisible){if(!($.props.trigger.indexOf("mouseenter")>=0&&$.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(e.type)>=0&&V)){var t=oe(!1);t?g=setTimeout((function(){$.state.isVisible&&$.hide()}),t):h=requestAnimationFrame((function(){$.hide()}))}}else ve()}}function F(e,n){void 0===n&&(n={});var r=R.plugins.concat(n.plugins||[]);document.addEventListener("touchstart",T,t),window.addEventListener("blur",L);var o=Object.assign({},n,{plugins:r}),i=h(e).reduce((function(e,t){var n=t&&_(t,o);return n&&e.push(n),e}),[]);return v(e)?i[0]:i}F.defaultProps=R,F.setDefaultProps=function(e){Object.keys(e).forEach((function(t){R[t]=e[t]}))},F.currentInput=x;var W=Object.assign({},e.applyStyles,{effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow)}}),X={mouseover:"mouseenter",focusin:"focus",click:"click"};var Y={name:"animateFill",defaultValue:!1,fn:function(e){var t;if(null==(t=e.props.render)||!t.$$tippy)return{};var n=S(e.popper),r=n.box,o=n.content,i=e.props.animateFill?function(){var e=d();return e.className="tippy-backdrop",y([e],"hidden"),e}():null;return{onCreate:function(){i&&(r.insertBefore(i,r.firstElementChild),r.setAttribute("data-animatefill",""),r.style.overflow="hidden",e.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(i){var e=r.style.transitionDuration,t=Number(e.replace("ms",""));o.style.transitionDelay=Math.round(t/10)+"ms",i.style.transitionDuration=e,y([i],"visible")}},onShow:function(){i&&(i.style.transitionDuration="0ms")},onHide:function(){i&&y([i],"hidden")}}}};var $={clientX:0,clientY:0},q=[];function z(e){var t=e.clientX,n=e.clientY;$={clientX:t,clientY:n}}var J={name:"followCursor",defaultValue:!1,fn:function(e){var t=e.reference,n=w(e.props.triggerTarget||t),r=!1,o=!1,i=!0,a=e.props;function s(){return"initial"===e.props.followCursor&&e.state.isVisible}function u(){n.addEventListener("mousemove",f)}function c(){n.removeEventListener("mousemove",f)}function p(){r=!0,e.setProps({getReferenceClientRect:null}),r=!1}function f(n){var r=!n.target||t.contains(n.target),o=e.props.followCursor,i=n.clientX,a=n.clientY,s=t.getBoundingClientRect(),u=i-s.left,c=a-s.top;!r&&e.props.interactive||e.setProps({getReferenceClientRect:function(){var e=t.getBoundingClientRect(),n=i,r=a;"initial"===o&&(n=e.left+u,r=e.top+c);var s="horizontal"===o?e.top:r,p="vertical"===o?e.right:n,f="horizontal"===o?e.bottom:r,l="vertical"===o?e.left:n;return{width:p-l,height:f-s,top:s,right:p,bottom:f,left:l}}})}function l(){e.props.followCursor&&(q.push({instance:e,doc:n}),function(e){e.addEventListener("mousemove",z)}(n))}function d(){0===(q=q.filter((function(t){return t.instance!==e}))).filter((function(e){return e.doc===n})).length&&function(e){e.removeEventListener("mousemove",z)}(n)}return{onCreate:l,onDestroy:d,onBeforeUpdate:function(){a=e.props},onAfterUpdate:function(t,n){var i=n.followCursor;r||void 0!==i&&a.followCursor!==i&&(d(),i?(l(),!e.state.isMounted||o||s()||u()):(c(),p()))},onMount:function(){e.props.followCursor&&!o&&(i&&(f($),i=!1),s()||u())},onTrigger:function(e,t){m(t)&&($={clientX:t.clientX,clientY:t.clientY}),o="focus"===t.type},onHidden:function(){e.props.followCursor&&(p(),c(),i=!0)}}}};var G={name:"inlinePositioning",defaultValue:!1,fn:function(e){var t,n=e.reference;var r=-1,o=!1,i=[],a={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(o){var a=o.state;e.props.inlinePositioning&&(-1!==i.indexOf(a.placement)&&(i=[]),t!==a.placement&&-1===i.indexOf(a.placement)&&(i.push(a.placement),e.setProps({getReferenceClientRect:function(){return function(e){return function(e,t,n,r){if(n.length<2||null===e)return t;if(2===n.length&&r>=0&&n[0].left>n[1].right)return n[r]||t;switch(e){case"top":case"bottom":var o=n[0],i=n[n.length-1],a="top"===e,s=o.top,u=i.bottom,c=a?o.left:i.left,p=a?o.right:i.right;return{top:s,bottom:u,left:c,right:p,width:p-c,height:u-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(e){return e.left}))),l=Math.max.apply(Math,n.map((function(e){return e.right}))),d=n.filter((function(t){return"left"===e?t.left===f:t.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return t}}(p(e),n.getBoundingClientRect(),f(n.getClientRects()),r)}(a.placement)}})),t=a.placement)}};function s(){var t;o||(t=function(e,t){var n;return{popperOptions:Object.assign({},e.popperOptions,{modifiers:[].concat(((null==(n=e.popperOptions)?void 0:n.modifiers)||[]).filter((function(e){return e.name!==t.name})),[t])})}}(e.props,a),o=!0,e.setProps(t),o=!1)}return{onCreate:s,onAfterUpdate:s,onTrigger:function(t,n){if(m(n)){var o=f(e.reference.getClientRects()),i=o.find((function(e){return e.left-2<=n.clientX&&e.right+2>=n.clientX&&e.top-2<=n.clientY&&e.bottom+2>=n.clientY})),a=o.indexOf(i);r=a>-1?a:r}},onHidden:function(){r=-1}}}};var K={name:"sticky",defaultValue:!1,fn:function(e){var t=e.reference,n=e.popper;function r(t){return!0===e.props.sticky||e.props.sticky===t}var o=null,i=null;function a(){var s=r("reference")?(e.popperInstance?e.popperInstance.state.elements.reference:t).getBoundingClientRect():null,u=r("popper")?n.getBoundingClientRect():null;(s&&Q(o,s)||u&&Q(i,u))&&e.popperInstance&&e.popperInstance.update(),o=s,i=u,e.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){e.props.sticky&&a()}}}};function Q(e,t){return!e||!t||(e.top!==t.top||e.right!==t.right||e.bottom!==t.bottom||e.left!==t.left)}return F.setDefaultProps({plugins:[Y,J,G,K],render:N}),F.createSingleton=function(e,t){var n;void 0===t&&(t={});var r,o=e,i=[],a=[],c=t.overrides,p=[],f=!1;function l(){a=o.map((function(e){return u(e.props.triggerTarget||e.reference)})).reduce((function(e,t){return e.concat(t)}),[])}function v(){i=o.map((function(e){return e.reference}))}function m(e){o.forEach((function(t){e?t.enable():t.disable()}))}function g(e){return o.map((function(t){var n=t.setProps;return t.setProps=function(o){n(o),t.reference===r&&e.setProps(o)},function(){t.setProps=n}}))}function h(e,t){var n=a.indexOf(t);if(t!==r){r=t;var s=(c||[]).concat("content").reduce((function(e,t){return e[t]=o[n].props[t],e}),{});e.setProps(Object.assign({},s,{getReferenceClientRect:"function"==typeof s.getReferenceClientRect?s.getReferenceClientRect:function(){var e;return null==(e=i[n])?void 0:e.getBoundingClientRect()}}))}}m(!1),v(),l();var b={fn:function(){return{onDestroy:function(){m(!0)},onHidden:function(){r=null},onClickOutside:function(e){e.props.showOnCreate&&!f&&(f=!0,r=null)},onShow:function(e){e.props.showOnCreate&&!f&&(f=!0,h(e,i[0]))},onTrigger:function(e,t){h(e,t.currentTarget)}}}},y=F(d(),Object.assign({},s(t,["overrides"]),{plugins:[b].concat(t.plugins||[]),triggerTarget:a,popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat((null==(n=t.popperOptions)?void 0:n.modifiers)||[],[W])})})),w=y.show;y.show=function(e){if(w(),!r&&null==e)return h(y,i[0]);if(!r||null!=e){if("number"==typeof e)return i[e]&&h(y,i[e]);if(o.indexOf(e)>=0){var t=e.reference;return h(y,t)}return i.indexOf(e)>=0?h(y,e):void 0}},y.showNext=function(){var e=i[0];if(!r)return y.show(0);var t=i.indexOf(r);y.show(i[t+1]||e)},y.showPrevious=function(){var e=i[i.length-1];if(!r)return y.show(e);var t=i.indexOf(r),n=i[t-1]||e;y.show(n)};var E=y.setProps;return y.setProps=function(e){c=e.overrides||c,E(e)},y.setInstances=function(e){m(!0),p.forEach((function(e){return e()})),o=e,m(!1),v(),l(),p=g(y),y.setProps({triggerTarget:a})},p=g(y),y},F.delegate=function(e,n){var r=[],o=[],i=!1,a=n.target,c=s(n,["target"]),p=Object.assign({},c,{trigger:"manual",touch:!1}),f=Object.assign({touch:R.touch},c,{showOnCreate:!0}),l=F(e,p);function d(e){if(e.target&&!i){var t=e.target.closest(a);if(t){var r=t.getAttribute("data-tippy-trigger")||n.trigger||R.trigger;if(!t._tippy&&!("touchstart"===e.type&&"boolean"==typeof f.touch||"touchstart"!==e.type&&r.indexOf(X[e.type])<0)){var s=F(t,f);s&&(o=o.concat(s))}}}}function v(e,t,n,o){void 0===o&&(o=!1),e.addEventListener(t,n,o),r.push({node:e,eventType:t,handler:n,options:o})}return u(l).forEach((function(e){var n=e.destroy,a=e.enable,s=e.disable;e.destroy=function(e){void 0===e&&(e=!0),e&&o.forEach((function(e){e.destroy()})),o=[],r.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),r=[],n()},e.enable=function(){a(),o.forEach((function(e){return e.enable()})),i=!1},e.disable=function(){s(),o.forEach((function(e){return e.disable()})),i=!0},function(e){var n=e.reference;v(n,"touchstart",d,t),v(n,"mouseover",d),v(n,"focusin",d),v(n,"click",d)}(e)})),l},F.hideAll=function(e){var t=void 0===e?{}:e,n=t.exclude,r=t.duration;U.forEach((function(e){var t=!1;if(n&&(t=g(n)?e.reference===n:e.popper===n.popper),!t){var o=e.props.duration;e.setProps({duration:r}),e.hide(),e.state.isDestroyed||e.setProps({duration:o})}}))},F.roundArrow='',F})); + diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index bda35e1ab..4aacff6eb 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -19,6 +19,53 @@ Entrypoint for test suites. - [text_data](test_suites/text_data.qmd) - [time_series](test_suites/time_series.qmd) +## describe_suite[()]{.muted} + +```python +def describe_suite( + test_suite_id: str, + verbose = False): +``` + +Describes a Test Suite by ID + +**Parameters** + +- **test_suite_id**: Test Suite ID +- **verbose**: If True, describe all plans and tests in the Test Suite + +**Returns** + +- A formatted table with the Test Suite description + +## get_by_id[()]{.muted} + +```python +def get_by_id( + test_suite_id: str): +``` + +Returns the test suite by ID + +## list_suites[()]{.muted} + +```python +def list_suites( + pretty: bool = True): +``` + +Returns a list of all available test suites + +## register_test_suite[()]{.muted} + +```python +def register_test_suite( + suite_id: str, + suite: TestSuite): +``` + +Registers a custom test suite + ### [class]{.muted} ClassifierDiagnosis ```python @@ -380,50 +427,3 @@ The raw time series data provides a visual inspection of the target variable's b **Inherited members** **Methods** - -## describe_suite[()]{.muted} - -```python -def describe_suite( - test_suite_id: str, - verbose = False): -``` - -Describes a Test Suite by ID - -**Parameters** - -- **test_suite_id**: Test Suite ID -- **verbose**: If True, describe all plans and tests in the Test Suite - -**Returns** - -- A formatted table with the Test Suite description - -## get_by_id[()]{.muted} - -```python -def get_by_id( - test_suite_id: str): -``` - -Returns the test suite by ID - -## list_suites[()]{.muted} - -```python -def list_suites( - pretty: bool = True): -``` - -Returns a list of all available test suites - -## register_test_suite[()]{.muted} - -```python -def register_test_suite( - suite_id: str, - suite: TestSuite): -``` - -Registers a custom test suite diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index 41804e05e..8cc9fe4a6 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -6,85 +6,85 @@ toc-expand: 3 Test suites for sklearn-compatible classifier models Ideal setup is to have the API client to read a custom test suite from the project's configuration -### [class]{.muted} TabularDataQuality +### [class]{.muted} ClassifierDiagnosis ```python -class TabularDataQuality(TestSuite): +class ClassifierDiagnosis(TestSuite): ``` -Test suite for data quality on tabular datasets +Test suite for sklearn classifier model diagnosis tests **Inherited members** **Methods** -### [class]{.muted} TabularDatasetDescription +### [class]{.muted} ClassifierFullSuite ```python -class TabularDatasetDescription(TestSuite): +class ClassifierFullSuite(TestSuite): ``` -Test suite to extract metadata and descriptive statistics from a tabular dataset +Full test suite for binary classification models. **Inherited members** **Methods** -### [class]{.muted} ClassifierDiagnosis +### [class]{.muted} ClassifierMetrics ```python -class ClassifierDiagnosis(TestSuite): +class ClassifierMetrics(TestSuite): ``` -Test suite for sklearn classifier model diagnosis tests +Test suite for sklearn classifier metrics **Inherited members** **Methods** -### [class]{.muted} ClassifierFullSuite +### [class]{.muted} ClassifierModelValidation ```python -class ClassifierFullSuite(TestSuite): +class ClassifierModelValidation(TestSuite): ``` -Full test suite for binary classification models. +Test suite for binary classification models. **Inherited members** **Methods** -### [class]{.muted} ClassifierMetrics +### [class]{.muted} ClassifierPerformance ```python -class ClassifierMetrics(TestSuite): +class ClassifierPerformance(TestSuite): ``` -Test suite for sklearn classifier metrics +Test suite for sklearn classifier models **Inherited members** **Methods** -### [class]{.muted} ClassifierModelValidation +### [class]{.muted} TabularDataQuality ```python -class ClassifierModelValidation(TestSuite): +class TabularDataQuality(TestSuite): ``` -Test suite for binary classification models. +Test suite for data quality on tabular datasets **Inherited members** **Methods** -### [class]{.muted} ClassifierPerformance +### [class]{.muted} TabularDatasetDescription ```python -class ClassifierPerformance(TestSuite): +class TabularDatasetDescription(TestSuite): ``` -Test suite for sklearn classifier models +Test suite to extract metadata and descriptive statistics from a tabular dataset **Inherited members** diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index 1210ecc80..db8429f83 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -6,18 +6,6 @@ toc-expand: 3 Test suites for sklearn-compatible clustering models Ideal setup is to have the API client to read a custom test suite from the project's configuration -### [class]{.muted} KmeansParametersOptimization - -```python -class KmeansParametersOptimization(TestSuite): -``` - -Test suite for sklearn hyperparameters optimization - -**Inherited members** - -**Methods** - ### [class]{.muted} ClusterFullSuite ```python @@ -53,3 +41,15 @@ Test suite for sklearn cluster performance **Inherited members** **Methods** + +### [class]{.muted} KmeansParametersOptimization + +```python +class KmeansParametersOptimization(TestSuite): +``` + +Test suite for sklearn hyperparameters optimization + +**Inherited members** + +**Methods** diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index 7ca911227..1d4a9aa78 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -6,73 +6,73 @@ toc-expand: 3 Test suites for LLMs -### [class]{.muted} ClassifierDiagnosis +### [class]{.muted} LLMClassifierFullSuite ```python -class ClassifierDiagnosis(TestSuite): +class LLMClassifierFullSuite(TestSuite): ``` -Test suite for sklearn classifier model diagnosis tests +Full test suite for LLM classification models. **Inherited members** **Methods** -### [class]{.muted} ClassifierMetrics +### [class]{.muted} PromptValidation ```python -class ClassifierMetrics(TestSuite): +class PromptValidation(TestSuite): ``` -Test suite for sklearn classifier metrics +Test suite for prompt validation **Inherited members** **Methods** -### [class]{.muted} ClassifierPerformance +### [class]{.muted} ClassifierDiagnosis ```python -class ClassifierPerformance(TestSuite): +class ClassifierDiagnosis(TestSuite): ``` -Test suite for sklearn classifier models +Test suite for sklearn classifier model diagnosis tests **Inherited members** **Methods** -### [class]{.muted} TextDataQuality +### [class]{.muted} ClassifierMetrics ```python -class TextDataQuality(TestSuite): +class ClassifierMetrics(TestSuite): ``` -Test suite for data quality on text data +Test suite for sklearn classifier metrics **Inherited members** **Methods** -### [class]{.muted} LLMClassifierFullSuite +### [class]{.muted} ClassifierPerformance ```python -class LLMClassifierFullSuite(TestSuite): +class ClassifierPerformance(TestSuite): ``` -Full test suite for LLM classification models. +Test suite for sklearn classifier models **Inherited members** **Methods** -### [class]{.muted} PromptValidation +### [class]{.muted} TextDataQuality ```python -class PromptValidation(TestSuite): +class TextDataQuality(TestSuite): ``` -Test suite for prompt validation +Test suite for data quality on text data **Inherited members** diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index a86d649a5..3c05f812d 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -6,6 +6,18 @@ toc-expand: 3 Test suites for NLP models +### [class]{.muted} NLPClassifierFullSuite + +```python +class NLPClassifierFullSuite(TestSuite): +``` + +Full test suite for NLP classification models. + +**Inherited members** + +**Methods** + ### [class]{.muted} ClassifierDiagnosis ```python @@ -53,15 +65,3 @@ Test suite for data quality on text data **Inherited members** **Methods** - -### [class]{.muted} NLPClassifierFullSuite - -```python -class NLPClassifierFullSuite(TestSuite): -``` - -Full test suite for NLP classification models. - -**Inherited members** - -**Methods** diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index e470f8cd1..9e3939c1e 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -4,61 +4,61 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} TabularDataQuality +### [class]{.muted} RegressionFullSuite ```python -class TabularDataQuality(TestSuite): +class RegressionFullSuite(TestSuite): ``` -Test suite for data quality on tabular datasets +Full test suite for regression models. **Inherited members** **Methods** -### [class]{.muted} TabularDatasetDescription +### [class]{.muted} RegressionMetrics ```python -class TabularDatasetDescription(TestSuite): +class RegressionMetrics(TestSuite): ``` -Test suite to extract metadata and descriptive statistics from a tabular dataset +Test suite for performance metrics of regression metrics **Inherited members** **Methods** -### [class]{.muted} RegressionFullSuite +### [class]{.muted} RegressionPerformance ```python -class RegressionFullSuite(TestSuite): +class RegressionPerformance(TestSuite): ``` -Full test suite for regression models. +Test suite for regression model performance **Inherited members** **Methods** -### [class]{.muted} RegressionMetrics +### [class]{.muted} TabularDataQuality ```python -class RegressionMetrics(TestSuite): +class TabularDataQuality(TestSuite): ``` -Test suite for performance metrics of regression metrics +Test suite for data quality on tabular datasets **Inherited members** **Methods** -### [class]{.muted} RegressionPerformance +### [class]{.muted} TabularDatasetDescription ```python -class RegressionPerformance(TestSuite): +class TabularDatasetDescription(TestSuite): ``` -Test suite for regression model performance +Test suite to extract metadata and descriptive statistics from a tabular dataset **Inherited members** diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index 41fae2a14..57e18e4c4 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -6,87 +6,87 @@ toc-expand: 3 Time Series Test Suites -### [class]{.muted} RegressionModelDescription +### [class]{.muted} TimeSeriesDataQuality ```python -class RegressionModelDescription(TestSuite): +class TimeSeriesDataQuality(TestSuite): ``` -Test suite for performance metric of regression model of statsmodels library +Test suite for data quality on time series datasets **Inherited members** **Methods** -### [class]{.muted} RegressionModelsEvaluation +### [class]{.muted} TimeSeriesDataset ```python -class RegressionModelsEvaluation(TestSuite): +class TimeSeriesDataset(TestSuite): ``` -Test suite for metrics comparison of regression model of statsmodels library +Test suite for time series datasets. **Inherited members** **Methods** -### [class]{.muted} TimeSeriesDataQuality +### [class]{.muted} TimeSeriesModelValidation ```python -class TimeSeriesDataQuality(TestSuite): +class TimeSeriesModelValidation(TestSuite): ``` -Test suite for data quality on time series datasets +Test suite for time series model validation. **Inherited members** **Methods** -### [class]{.muted} TimeSeriesDataset +### [class]{.muted} TimeSeriesMultivariate ```python -class TimeSeriesDataset(TestSuite): +class TimeSeriesMultivariate(TestSuite): ``` -Test suite for time series datasets. +This test suite provides a preliminary understanding of the features and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. **Inherited members** **Methods** -### [class]{.muted} TimeSeriesModelValidation +### [class]{.muted} TimeSeriesUnivariate ```python -class TimeSeriesModelValidation(TestSuite): +class TimeSeriesUnivariate(TestSuite): ``` -Test suite for time series model validation. +This test suite provides a preliminary understanding of the target variable(s) used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). + +The raw time series data provides a visual inspection of the target variable's behavior over time. This helps to identify any patterns or trends in the data, as well as any potential outliers or anomalies. The histogram of the target variable displays the distribution of values, providing insight into the range and frequency of values observed in the data. **Inherited members** **Methods** -### [class]{.muted} TimeSeriesMultivariate +### [class]{.muted} RegressionModelDescription ```python -class TimeSeriesMultivariate(TestSuite): +class RegressionModelDescription(TestSuite): ``` -This test suite provides a preliminary understanding of the features and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. +Test suite for performance metric of regression model of statsmodels library **Inherited members** **Methods** -### [class]{.muted} TimeSeriesUnivariate +### [class]{.muted} RegressionModelsEvaluation ```python -class TimeSeriesUnivariate(TestSuite): +class RegressionModelsEvaluation(TestSuite): ``` -This test suite provides a preliminary understanding of the target variable(s) used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). - -The raw time series data provides a visual inspection of the target variable's behavior over time. This helps to identify any patterns or trends in the data, as well as any potential outliers or anomalies. The histogram of the target variable displays the distribution of values, providing insight into the range and frequency of values observed in the data. +Test suite for metrics comparison of regression model of statsmodels library **Inherited members** diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 93618a858..7e4344739 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -7,14 +7,23 @@ toc-expand: 3 ValidMind Tests Module - [data_validation](tests/data_validation.qmd) - - [model_validation](tests/model_validation.qmd) - - [prompt_validation](tests/prompt_validation.qmd) - ``` - ### [class]{.muted} LoadTestError - ``` +## register_test_provider[()]{.muted} + +```python +def register_test_provider( + namespace: str, + test_provider: TestProvider) -> None: +``` + +Register an external test provider + +**Parameters** + +- **(str)**: The namespace of the test provider test_provider +- **(TestProvider)**: The test provider ### [class]{.muted} LoadTestError ```python class LoadTestError(BaseError): @@ -24,7 +33,7 @@ Exception raised when an error occurs while loading a test **Inherited members** -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note **Methods** @@ -62,7 +71,41 @@ test = test_provider.load_test("my_namespace.my_test_class") - **root_folder**: The root directory for local tests. -**Methods** ### [class]{.muted} TestProvider +**Methods** + +### [list_tests[()]{.muted}](#list_tests) + +```python +list_tests(self) +``` + +List all tests in the given namespace + +**Returns** + +- A list of test IDs + +### [load_test[()]{.muted}](#load_test) + +```python +load_test(self, test_id) +``` + +Load the test identified by the given test_id. + +**Parameters** + +- **(str)**: The identifier of the test. This corresponds to the relative path of the python file from the root folder, with slashes replaced by dots + +**Returns** + +- The test class that matches the last part of the test_id. + +**Raises** + +- **LocalTestProviderLoadModuleError**: If the test module cannot be imported +- **LocalTestProviderLoadTestError**: If the test class cannot be found in the module + ### [class]{.muted} TestProvider ```python class TestProvider(Protocol): @@ -74,17 +117,34 @@ Protocol for user-defined test providers **Methods** -## register_test_provider[()]{.muted} +### [list_tests[()]{.muted}](#list_tests) ```python -def register_test_provider( - namespace: str, - test_provider: TestProvider) -> None: +list_tests(self) ``` -Register an external test provider +List all tests in the given namespace + +**Returns** + +- A list of test IDs + +### [load_test[()]{.muted}](#load_test) + +```python +load_test(self, test_id) +``` + +Load the test function identified by the given test_id **Parameters** -- **(str)**: The namespace of the test provider test_provider -- **(TestProvider)**: The test provider +- **(str)**: The test ID (does not contain the namespace under which the test is registered) + +**Returns** + +- The test function + +**Raises** + +- **FileNotFoundError**: If the test is not found diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 92c8b62f0..f1b0c2747 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## ChiSquaredFeaturesTable[()]{.muted} ```python @@ -52,3 +39,16 @@ The function creates a contingency table for each categorical feature and the ta - The test is designed for classification tasks and is not applicable to regression problems. - As with all hypothesis tests, the Chi-Squared test can only detect associations, not causal relationships. - The choice of p-value threshold can affect the interpretation of feature relevance, and different thresholds may lead to different conclusions. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index dbea6e07b..326eb5b43 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -6,19 +6,6 @@ toc-expand: 3 Threshold based tests -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## ClassImbalance[()]{.muted} ```python @@ -58,3 +45,16 @@ This Class Imbalance test operates by calculating the frequency (expressed as a - Regardless of the percentage threshold, it doesn't account for varying costs or impacts of misclassifying different classes, which might fluctuate based on specific applications or domains. - While it can identify imbalances in class distribution, it doesn't provide direct methods to address or correct these imbalances. - The test is only applicable for classification operations and unsuitable for regression or clustering tasks. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 68c744aed..e0263ca97 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} UnsupportedColumnTypeError - -```python -class UnsupportedColumnTypeError(BaseError): -``` - -When an unsupported column type is found on a dataset. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## DatasetDescription[()]{.muted} ```python @@ -95,3 +82,16 @@ Returns a collection of histograms for a numerical column, each one with a diffe def infer_datatypes( df): ``` + +### [class]{.muted} UnsupportedColumnTypeError + +```python +class UnsupportedColumnTypeError(BaseError): +``` + +When an unsupported column type is found on a dataset. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 5c2332aad..069a0f51a 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## DescriptiveStatistics[()]{.muted} ```python @@ -67,3 +54,16 @@ def get_summary_statistics_numerical( df, numerical_fields): ``` + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index fd3e9473b..58210ad8a 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## DickeyFullerGLS[()]{.muted} ```python @@ -49,3 +36,15 @@ This code implements the Dickey-Fuller GLS unit root test on each attribute of t - Despite its benefits, the DFGLS test does present some drawbacks. It can potentially lead to inaccurate conclusions if the time series data incorporates a structural break. - If the time series tends to follow a trend while still being stationary, the test might misinterpret it, necessitating further detrending. - The test also presents challenges when dealing with shorter time series data or volatile data, not producing reliable results in these cases. + ### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index a04aa81a5..45bc85047 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## EngleGrangerCoint[()]{.muted} ```python @@ -50,3 +37,16 @@ The test first drops any non-applicable values from the input dataset and then i - Assumes that the time series are integrated of the same order, which isn't always true in multivariate time series datasets. - The presence of non-stationary characteristics in the series or structural breaks can result in falsely positive or negative cointegration results. - May not perform well for small sample sizes due to lack of statistical power and should be supplemented with other predictive indicators for a more robust model evaluation. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 5bc13b94f..2679b8e5d 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## KPSS[()]{.muted} ```python @@ -49,3 +36,15 @@ This test calculates the KPSS score for each feature in the dataset. The KPSS sc - Assumes the absence of a unit root in the series and doesn't differentiate between series that are stationary and those border-lining stationarity. - The test may have restricted power against certain alternatives. - The reliability of the test is contingent on the number of lags selected, which introduces potential bias in the measurement. + ### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 9e52f2aae..0db61d612 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## PhillipsPerronArch[()]{.muted} ```python @@ -55,3 +42,15 @@ The PP test is conducted for each feature in the dataset as follows: - Applicable only within a univariate time series framework. - Relies on asymptotic theory, which may reduce the test’s power for small sample sizes. - Non-stationary time series must be converted to stationary series through differencing, potentially leading to loss of important data points. + ### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index bd58c6a98..b0b806b82 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -4,21 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} MissingDependencyError - -```python -class MissingDependencyError(BaseError): -``` - -When a required dependency is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - -**Methods** - ## ProtectedClassesCombination[()]{.muted} ```python @@ -59,3 +44,17 @@ The test performs the following steps: - May become complex and difficult to interpret with a large number of protected classes or combinations. - Does not provide statistical significance of observed differences. - Visualization alone may not capture all nuances of intersectional fairness. + ### [class]{.muted} MissingDependencyError + +```python +class MissingDependencyError(BaseError): +``` + +When a required dependency is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + +**Methods** diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 33a5fc41f..07cf7e8ea 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -4,21 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} MissingDependencyError - -```python -class MissingDependencyError(BaseError): -``` - -When a required dependency is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - -**Methods** - ## ProtectedClassesDisparity[()]{.muted} ```python @@ -63,3 +48,17 @@ The test performs the following steps: - Relies on a predefined reference group for each protected class, which may not always be the most appropriate choice. - Does not account for intersectionality between different protected attributes. - The interpretation of results may require domain expertise to understand the implications of observed disparities. + ### [class]{.muted} MissingDependencyError + +```python +class MissingDependencyError(BaseError): +``` + +When a required dependency is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + +**Methods** diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index c2846d712..3c895b5ed 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -4,21 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} MissingDependencyError - -```python -class MissingDependencyError(BaseError): -``` - -When a required dependency is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - -**Methods** - ## calculate_fairness_metrics[()]{.muted} ```python @@ -115,3 +100,17 @@ The test uses Fairlearn's ThresholdOptimizer to: - May lead to a decrease in overall model performance while improving fairness. - Requires access to protected attribute information at prediction time. - The effectiveness can vary depending on the chosen fairness constraint and objective. + ### [class]{.muted} MissingDependencyError + +```python +class MissingDependencyError(BaseError): +``` + +When a required dependency is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + +**Methods** diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 99a53e312..92ac776a9 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## plot_rolling_statistics[()]{.muted} ```python @@ -62,3 +49,16 @@ This mechanism is comprised of two steps. Initially, the rolling mean and standa - For all columns, a fixed-size window is utilized. This may not accurately capture patterns in datasets where different features may require different optimal window sizes. - Requires the dataset to be indexed by date and time, hence it may not be usable for datasets without a timestamp index. - Primarily serves for data visualization as it does not facilitate any quantitative measures for stationarity, such as through statistical tests. Therefore, the interpretation is subjective and depends heavily on modeler discretion. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 3227dfe38..7ba4cbaee 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## SeasonalDecompose[()]{.muted} ```python @@ -52,3 +39,15 @@ The testing process leverages the `seasonal_decompose` function from the `statsm - **Dependence on Assumptions**: Assumes that dataset features are periodically distributed. Features with no inferable frequency are excluded from the test. - **Handling Non-Finite Values**: Disregards non-finite values during analysis, potentially resulting in an incomplete understanding of the dataset. - **Unreliability with Noisy Datasets**: Produces unreliable results when used with datasets that contain heavy noise. + ### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index b1b236427..9d00f425a 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## SpreadPlot[()]{.muted} ```python @@ -53,3 +40,16 @@ The SpreadPlot test computes and represents the spread between each pair of time - Heavily relies on the quality and granularity of the data—missing data or outliers can notably disturb the interpretation of relationships. - Can become inefficient or difficult to interpret with a high number of variables due to the profuse number of plots. - Might not completely capture intricate non-linear relationships between the variables. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 279d44eae..0b6f39139 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## TabularCategoricalBarPlots[()]{.muted} ```python @@ -50,3 +37,16 @@ The provided dataset is first checked to determine if it contains any categorica - This method only works with categorical data and won't apply to numerical variables. - It does not provide informative value when there are too many categories, as the bar chart could become cluttered and hard to interpret. - Offers no insights into the model's performance or precision, but rather provides a descriptive analysis of the input. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 15455babb..5fac50195 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## TabularDateTimeHistograms[()]{.muted} ```python @@ -51,3 +38,16 @@ This test operates by first identifying all datetime columns and extracting them - The metric might overlook complex or multi-dimensional trends in the data. - The test is only applicable to datasets containing datetime columns and will fail if such columns are unavailable. - The interpretation of the histograms relies heavily on the domain expertise and experience of the reviewer. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index b6a975007..56ae72244 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## TargetRateBarPlots[()]{.muted} ```python @@ -47,3 +34,16 @@ The test involves creating a pair of bar plots for each categorical feature in t ### Limitations - The readability of the bar plots drops as the number of distinct categories increases in the dataset, which can make them harder to understand and less useful. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 6f4b86739..4f7d8f77f 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## TimeSeriesFrequency[()]{.muted} ```python @@ -50,3 +37,16 @@ Initially, the test checks if the dataframe index is in datetime format. Subsequ - This test is only applicable to time-series datasets and hence not suitable for other types of datasets. - The `infer_freq` method might not always correctly infer frequency when faced with missing or irregular data points. - Depending on context or the model under development, mixed frequencies might sometimes be acceptable, but this test considers them a failing condition. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 72519b46f..bc8e89129 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## TimeSeriesLinePlot[()]{.muted} ```python @@ -52,3 +39,16 @@ The mechanism for this Python class involves extracting the column names from th - Exclusively a visual tool, it lacks the capability to provide quantitative measurements, making it less effective for comparing and ranking multiple models or when specific numerical diagnostics are needed. - The metric necessitates that the time-specific data has been transformed into a datetime index, with the data formatted correctly. - The metric has an inherent limitation in that it cannot extract deeper statistical insights from the time series data, which can limit its efficacy with complex data structures and phenomena. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 0ed336fe7..64a85e8be 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## TimeSeriesMissingValues[()]{.muted} ```python @@ -51,3 +38,16 @@ The test method commences by validating if the dataset has a datetime index; if - The test demands that the dataset should have a datetime index, hence limiting its use only to time series analysis. - The test's sensitivity to the 'min_threshold' parameter may raise false alarms if set too strictly or may overlook problematic data if set too loosely. - Solely focuses on the 'missingness' of the data and might fall short in addressing other aspects of data quality. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 4c0f20735..685e5cb36 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## TimeSeriesOutliers[()]{.muted} ```python @@ -56,3 +43,16 @@ The test processes a given dataset which must have datetime indexing, checks if - The method relies on a subjective z-score threshold for deciding what constitutes an outlier, which might not always be suitable depending on the dataset and use case. - It does not address possible ways to handle identified outliers in the data. - The requirement for a datetime index could limit its application. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 718ccbad7..bd6e051c3 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## WOEBinPlots[()]{.muted} ```python @@ -55,3 +42,15 @@ The test implementation follows defined steps. Initially, it selects non-numeric - While excellent for categorical data, the encoding of continuous variables into categorical can sometimes lead to information loss. - Extreme or outlier values can dramatically affect the computation of WoE and IV, skewing results. - The method requires a sufficient number of events per bin to generate a reliable information value and weight of evidence. + ### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 47a142910..91bbf926f 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## WOEBinTable[()]{.muted} ```python @@ -50,3 +37,16 @@ The test uses the `scorecardpy.woebin` method to perform automatic binning of th - Primarily designed for binary classification tasks, making it less applicable or reliable for multi-class classification or regression tasks. - Potential difficulties if the dataset has many features, non-binnable features, or non-numeric features. - The metric does not help in distinguishing whether the observed predictive factor is due to data randomness or a true phenomenon. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 41fcd9db7..d4a02fce0 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## ZivotAndrewsArch[()]{.muted} ```python @@ -48,3 +35,15 @@ The Zivot-Andrews unit root test is performed on each feature in the dataset usi - Assumes data is derived from a single-equation, autoregressive model, making it less appropriate for multivariate time series data or data not aligning with this model. - May not account for unexpected shocks or changes in the series trend, both of which can significantly impact data stationarity. + ### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 1c8e7fa84..2a2411e89 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## Hashtags[()]{.muted} ```python @@ -53,3 +40,16 @@ The test implements a regular expression (regex) to extract all hashtags from th - Language-specific limitations of hashtag formulations are not taken into account. - Does not account for typographical errors, variations, or synonyms in hashtags. - Does not provide context or sentiment associated with the hashtags, so the information provided may have limited utility on its own. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index d235ee969..a72148a1e 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## Mentions[()]{.muted} ```python @@ -51,3 +38,16 @@ The test first verifies the existence of a text column in the provided dataset. - The test only recognizes mentions that are prefixed by '@', hence useful textual aspects not preceded by '@' might be ignored. - This test isn't suited for datasets devoid of textual data. - It does not provide insights on less frequently occurring data or outliers, which means potentially significant patterns could be overlooked. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index f0700952e..e41a4bce8 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## FeaturesAUC[()]{.muted} ```python @@ -51,3 +38,15 @@ For each feature, the metric treats the feature values as raw scores to compute - Does not reflect the combined effects of features or any interaction between them, which can be critical in certain models. - The AUC values are calculated without considering the model's use of the features, which could lead to different interpretations of feature importance when considering the model holistically. - This metric is applicable only to binary classification tasks and cannot be directly extended to multiclass classification or regression without modifications. + ### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 1a644c350..fe8c716ad 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## ClusterCosineSimilarity[()]{.muted} ```python @@ -52,3 +39,16 @@ This test works by first extracting the true and predicted clusters of the model - This method summarily assumes that centroids represent the average behavior of data points in each cluster. This might not always be true, especially in clusters with high amounts of variance or non-spherical shapes. - It primarily works with continuous variables and is not suitable for binary or categorical variables. - Lastly, although rare, perfect perpendicular vectors (cosine similarity = 0) could be within the same cluster, which may give an inaccurate representation of a 'bad' cluster due to low cosine similarity score. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 59d03e5e9..14d020741 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## KMeansClustersOptimization[()]{.muted} ```python @@ -54,3 +41,16 @@ The test mechanism involves iterating over a predefined range of cluster numbers - Both methods may fail to provide definitive answers when the data lacks clear cluster structures. - Might not be straightforward to determine the 'elbow' point or maximize the silhouette average score, especially in larger and complicated datasets. - Assumes spherical clusters (due to using the Euclidean distance in the Elbow method), which might not align with the actual structure of the data. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index ae8b43c14..abb3cbde9 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## PermutationFeatureImportance[()]{.muted} ```python @@ -53,3 +40,15 @@ PFI is calculated via the `permutation_importance` method from the `sklearn.insp - Does not imply causality; it only presents the amount of information that a feature provides for the prediction task. - Does not account for interactions between features. If features are correlated, the permutation importance may allocate importance to one and not the other. - Cannot interact with certain libraries like statsmodels, pytorch, catboost, etc., thus limiting its applicability. + ### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index a18ce6de0..e08135588 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## calculate_psi[()]{.muted} ```python @@ -67,3 +54,15 @@ The implementation of the PSI in this script involves calculating the PSI for ea - The PSI test does not inherently provide insights into why there are differences in distributions or why the PSI values may have changed. - The test may not handle features with significant outliers adequately. - Additionally, the PSI test is performed on model predictions, not on the underlying data distributions which can lead to misinterpretations. Any changes in PSI could be due to shifts in the model (model drift), changes in the relationships between features and the target variable (concept drift), or both. However, distinguishing between these causes is non-trivial. + ### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 9c9f45335..d1283f2c2 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## PrecisionRecallCurve[()]{.muted} ```python @@ -50,3 +37,16 @@ The test extracts ground truth labels and prediction probabilities from the mode - This metric is only applicable to binary classification models - it raises errors for multiclass classification models or Foundation models. - It may not fully represent the overall accuracy of the model if the cost of false positives and false negatives are extremely different, or if the dataset is heavily imbalanced. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index ff9563e3f..6545d7010 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## ROCCurve[()]{.muted} ```python @@ -51,3 +38,16 @@ First, this script selects the target model and datasets that require binary cla - The primary limitation is that this test is exclusively structured for binary classification tasks, thus limiting its application towards other model types. - Furthermore, its performance might be subpar with models that output probabilities highly skewed towards 0 or 1. - At the extreme, the ROC curve could reflect high performance even when the majority of classifications are incorrect, provided that the model's ranking format is retained. This phenomenon is commonly termed the "Class Imbalance Problem". + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 5f8b2fd2e..f1f41b096 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} MissingOrInvalidModelPredictFnError - -```python -class MissingOrInvalidModelPredictFnError(BaseError): -``` - -When the pytorch model is missing a predict function or its predict method does not have the expected arguments. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## RobustnessDiagnosis[()]{.muted} ```python @@ -59,3 +46,15 @@ This test introduces Gaussian noise to the numeric input features of the dataset - Gaussian noise might not adequately represent all types of real-world data perturbations. - Performance thresholds are somewhat arbitrary and might need tuning. - The test may not account for more complex or unstructured noise patterns that could affect model robustness. + ### [class]{.muted} MissingOrInvalidModelPredictFnError + +```python +class MissingOrInvalidModelPredictFnError(BaseError): +``` + +When the pytorch model is missing a predict function or its predict method does not have the expected arguments. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 7c810089c..5d05bc5e3 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} UnsupportedModelForSHAPError - -```python -class UnsupportedModelForSHAPError(BaseError): -``` - -When an unsupported model is used for SHAP importance. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## generate_shap_plot[()]{.muted} ```python @@ -101,3 +88,15 @@ The exam begins with the selection of a suitable explainer which aligns with the - High-dimensional data can convolute interpretations. - Associating importance with tangible real-world impact still involves a certain degree of subjectivity. + ### [class]{.muted} UnsupportedModelForSHAPError + +```python +class UnsupportedModelForSHAPError(BaseError): +``` + +When an unsupported model is used for SHAP importance. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 3a5fc406e..6721ef662 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} InvalidTestParametersError - -```python -class InvalidTestParametersError(BaseError): -``` - -When an invalid parameters for the test. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## KolmogorovSmirnov[()]{.muted} ```python @@ -52,3 +39,16 @@ This test calculates the KS statistic and corresponding p-value for each feature - The test's sensitivity to disparities in the tails of data distribution might cause false alarms about non-normality. - Less effective for multivariate distributions, as it is designed for univariate distributions. - Does not identify specific types of non-normality, such as skewness or kurtosis, which could impact model fitting. + +### [class]{.muted} InvalidTestParametersError + +```python +class InvalidTestParametersError(BaseError): +``` + +When an invalid parameters for the test. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index b632f6af3..e18d10c37 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## RegressionCoeffs[()]{.muted} ```python @@ -50,3 +37,16 @@ The function operates by extracting the estimated coefficients and their standar - The method assumes normality of residuals and independence of observations, assumptions that may not always hold true in practice. - It does not address issues related to multi-collinearity among predictor variables, which can affect the interpretation of coefficients. - This metric is limited to regression tasks using tabular data and is not applicable to other types of machine learning tasks or data structures. + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 84d461a5a..5f94ee8a8 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## RegressionFeatureSignificance[()]{.muted} ```python @@ -52,3 +39,15 @@ The test mechanism involves extracting the model's coefficients and p-values for - The p-value strategy for feature selection doesn't take into account the magnitude of the effect, focusing solely on whether the feature is likely non-zero. - This test is specific to regression models and wouldn't be suitable for other types of ML models. - P-value thresholds are somewhat arbitrary and do not always indicate practical significance, only statistical significance. + ### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 170735fea..6a045d008 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} MissingRequiredTestInputError - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## Bias[()]{.muted} ```python @@ -56,3 +43,15 @@ For each test case, the LLM grades the input prompt on a scale of 1 to 10. It ev - The test may not pick up on more subtle forms of bias or biases that are not directly related to the distribution or order of exemplars. - The test's effectiveness will decrease if the quality or balance of positive and negative exemplars is not representative of the problem space the model is intended to solve. - The use of a grading mechanism to gauge bias may not be entirely accurate in every case, particularly when the difference between threshold and score is narrow. + ### [class]{.muted} MissingRequiredTestInputError + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 3a7c16eab..92574e5c1 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} MissingRequiredTestInputError - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## Clarity[()]{.muted} ```python @@ -51,3 +38,15 @@ The evaluation uses an LLM to scrutinize the clarity of prompts, factoring in co - Scoring system is subjective and relies on the AI’s interpretation of 'clarity' - The test assumes that all required factors (detail inclusion, persona adoption, step-by-step instructions, use of examples, and specification of output length) contribute equally to clarity, which might not always be the case - The evaluation may not be as effective if used on non-textual models + ### [class]{.muted} MissingRequiredTestInputError + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 0d70509a8..06a28c4b8 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} MissingRequiredTestInputError - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## Conciseness[()]{.muted} ```python @@ -53,3 +40,15 @@ Using an LLM, this test conducts a conciseness analysis on input prompts. The an - The conciseness score is based on an AI's assessment, which might not fully capture human interpretation of conciseness. - The predefined threshold for conciseness could be subjective and might need adjustment based on application. - The test is dependent on the LLM’s understanding of conciseness, which might vary from model to model. + ### [class]{.muted} MissingRequiredTestInputError + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index ba8faf89e..ca6e309c4 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} MissingRequiredTestInputError - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## Delimitation[()]{.muted} ```python @@ -52,3 +39,15 @@ The test employs an LLM to examine prompts for appropriate use of delimiters suc - Only checks for the presence and placement of delimiters, not whether the correct delimiter type is used for the specific data or task. - May not fully reveal the impacts of poor delimitation on the LLM's final performance. - The preset score threshold may not be refined enough for complex tasks and prompts, requiring regular manual adjustment. + ### [class]{.muted} MissingRequiredTestInputError + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 79c8e47b8..fbc97bda1 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} MissingRequiredTestInputError - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## NegativeInstruction[()]{.muted} ```python @@ -52,3 +39,15 @@ An LLM is employed to evaluate each prompt. The prompt is graded based on its us - The test necessitates an LLM for evaluation, which might not be available or feasible in certain scenarios. - A numeric scoring system, while straightforward, may oversimplify complex issues related to prompt designing and instruction clarity. - The effectiveness of the test hinges significantly on the predetermined threshold level, which can be subjective and may need to be adjusted according to specific use-cases. + ### [class]{.muted} MissingRequiredTestInputError + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 90ac610c5..f53a9ae1b 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -4,32 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} MissingRequiredTestInputError - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - -### [class]{.muted} SkipTestError - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## Robustness[()]{.muted} ```python @@ -65,3 +39,28 @@ The Robustness test appraises prompts under various conditions, alterations, and - Currently, the test only supports single-variable prompts, which restricts its application to more complex models. - When there are too many target classes (over 10), the test is skipped, which can leave potential vulnerabilities unchecked in complex multi-class models. - The test may not account for all potential conditions or alterations that could show up in practical use scenarios. + ### [class]{.muted} MissingRequiredTestInputError + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + +### [class]{.muted} SkipTestError + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 01d11b26d..ac170fce1 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -4,19 +4,6 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} MissingRequiredTestInputError - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError](#BaseError)[()]{.muted}, [description](#description)[()]{.muted} -- **From builtins.BaseException**: with_traceback, add_note - ## Specificity[()]{.muted} ```python @@ -52,3 +39,15 @@ The Specificity Test employs an LLM to grade each prompt based on clarity, detai - This test doesn't consider the content comprehension capability of the LLM - High specificity score doesn't guarantee a high-quality response from the LLM, as the model's performance is also dependent on various other factors - Striking a balance between specificity and verbosity can be challenging, as overly detailed prompts might confuse or mislead the model + ### [class]{.muted} MissingRequiredTestInputError + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 4ad8756cc..d4060a64c 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -16,6 +16,30 @@ Figure objects track the schema supported by the ValidMind API **Methods** +### [serialize[()]{.muted}](#serialize) + +```python +serialize(self) +``` + +Serializes the Figure to a dictionary so it can be sent to the API + +### [serialize_files[()]{.muted}](#serialize_files) + +```python +serialize_files(self) +``` + +Creates a `requests`-compatible files object to be sent to the API + +### [to_widget[()]{.muted}](#to_widget) + +```python +to_widget(self) +``` + +Returns the ipywidget compatible representation of the figure. Ideally we would render images as-is, but Plotly FigureWidgets don't work well on Google Colab when they are combined with ipywidgets. + ### [class]{.muted} ModelAttributes ```python @@ -26,6 +50,14 @@ Model attributes definition **Methods** +### [from_dict[()]{.muted}](#from_dict) + +```python +from_dict(cls, data) +``` + +Creates a ModelAttributes instance from a dictionary + ### [class]{.muted} TestSuite ```python @@ -38,6 +70,34 @@ Tests can be a flat list of strings or may be nested into sections by using a di **Methods** +### [get_default_config[()]{.muted}](#get_default_config) + +```python +get_default_config(self) +``` + +Returns the default configuration for the test suite Each test in a test suite can accept parameters and those parameters can have default values. Both the parameters and their defaults are set in the test class and a config object can be passed to the test suite's run method to override the defaults. This function returns a dictionary containing the parameters and their default values for every test to allow users to view and set values + +**Returns** + +- A dictionary of test names and their default parameters + +### [get_tests[()]{.muted}](#get_tests) + +```python +get_tests(self) +``` + +Get all test suite test objects from all sections + +### [num_tests[()]{.muted}](#num_tests) + +```python +num_tests(self) +``` + +Returns the total number of tests in the test suite + ### [class]{.muted} TestSuiteRunner ```python @@ -48,6 +108,33 @@ Runs a test suite **Methods** +### [log_results[()]{.muted}](#log_results) + +```python +log_results(self) +``` + +Logs the results of the test suite to ValidMind This method will be called after the test suite has been run and all results have been collected. This method will log the results to ValidMind. + +### [run[()]{.muted}](#run) + +```python +run(self, send, fail_fast) +``` + +Runs the test suite, renders the summary and sends the results to ValidMind + +**Parameters** + +- **optional)**: Whether to send the results to ValidMind. Defaults to True. fail_fast (bool, +- **optional)**: Whether to stop running tests after the first failure. Defaults to False. + +### [summarize[()]{.muted}](#summarize) + +```python +summarize(self, show_link) +``` + ### [class]{.muted} VMDataset ```python @@ -77,6 +164,142 @@ This way we can support multiple dataset types but under the hood we only need t **Methods** +### [add_extra_column[()]{.muted}](#add_extra_column) + +```python +add_extra_column(self, column_name, column_values) +``` + +Adds an extra column to the dataset without modifying the dataset `features` and `target` columns. + +**Parameters** + +- **(str)**: The name of the extra column. column_values (np.ndarray, +- **optional)**: The values of the extra column. + +### [assign_predictions[()]{.muted}](#assign_predictions) + +```python +assign_predictions(self, model, prediction_column, prediction_values, probability_column, probability_values, prediction_probabilities, kwargs) +``` + +Assign predictions and probabilities to the dataset. + +**Parameters** + +- **(VMModel)**: The model used to generate the predictions. prediction_column (str, +- **optional)**: The name of the column containing the predictions. Defaults to None. prediction_values (list, +- **optional)**: The values of the predictions. Defaults to None. probability_column (str, +- **optional)**: The name of the column containing the probabilities. Defaults to None. probability_values (list, +- **optional)**: The values of the probabilities. Defaults to None. prediction_probabilities (list, +- **DEPRECATED**: The values of the probabilities. Defaults to None. +- **kwargs**: Additional keyword arguments that will get passed through to the model's `predict` method. + +### [prediction_column[()]{.muted}](#prediction_column) + +```python +prediction_column(self, model, column_name) +``` + +Get or set the prediction column for a model. + +### [probability_column[()]{.muted}](#probability_column) + +```python +probability_column(self, model, column_name) +``` + +Get or set the probability column for a model. + +### [target_classes[()]{.muted}](#target_classes) + +```python +target_classes(self) +``` + +Returns the target class labels or unique values of the target column. + +### [with_options[()]{.muted}](#with_options) + +```python +with_options(self, kwargs) +``` + +Support options provided when passing an input to run_test or run_test_suite + +**Parameters** + +- **Options**: - +- **columns**: Filter columns in the dataset + +**Returns** + +- A new instance of the dataset with only the specified columns + +### [x_df[()]{.muted}](#x_df) + +```python +x_df(self) +``` + +Returns a dataframe containing only the feature columns + +### [y_df[()]{.muted}](#y_df) + +```python +y_df(self) +``` + +Returns a dataframe containing the target column + +### [y_pred[()]{.muted}](#y_pred) + +```python +y_pred(self, model) +``` + +Returns the predictions for a given model. Attempts to stack complex prediction types (e.g., embeddings) into a single, multi-dimensional array. + +**Parameters** + +- **(VMModel)**: The model whose predictions are sought. + +**Returns** + +- The predictions for the model + +### [y_pred_df[()]{.muted}](#y_pred_df) + +```python +y_pred_df(self, model) +``` + +Returns a dataframe containing the predictions for a given model + +### [y_prob[()]{.muted}](#y_prob) + +```python +y_prob(self, model) +``` + +Returns the probabilities for a given model. + +**Parameters** + +- **(str)**: The ID of the model whose predictions are sought. + +**Returns** + +- The probability variables. + +### [y_prob_df[()]{.muted}](#y_prob_df) + +```python +y_prob_df(self, model) +``` + +Returns a dataframe containing the probabilities for a given model + ### [class]{.muted} VMInput ```python @@ -89,6 +312,22 @@ Base class for ValidMind Input types **Methods** +### [with_options[()]{.muted}](#with_options) + +```python +with_options(self, kwargs) +``` + +Allows for setting options on the input object that are passed by the user when using the input to run a test or set of tests To allow options, just override this method in the subclass (see VMDataset) and ensure that it returns a new instance of the input with the specified options set. + +**Parameters** + +- \*\***kwargs**: Arbitrary keyword arguments that will be passed to the input object + +**Returns** + +- A new instance of the input with the specified options set + ### [class]{.muted} VMModel ```python @@ -107,3 +346,27 @@ An base class that wraps a trained model instance and its associated data. **Inherited members** **Methods** + +### [predict[()]{.muted}](#predict) + +```python +predict(self, args, kwargs) +``` + +Predict method for the model. This is a wrapper around the model's + +### [predict_proba[()]{.muted}](#predict_proba) + +```python +predict_proba(self, args, kwargs) +``` + +Predict probabilties - must be implemented by subclass if needed + +### [serialize[()]{.muted}](#serialize) + +```python +serialize(self) +``` + +Serializes the model to a dictionary so it can be sent to the API diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 197b0fdc0..c6f39dbbf 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -30,28 +30,42 @@ def get_all_members(members: Dict[str, Any]) -> Set[str]: return {elem.strip("'") for elem in all_elements} return set() -def sort_members(members): +def sort_members(members, is_errors_module=False): """Sort members by kind and name.""" if isinstance(members, dict): members = members.values() def get_sort_key(member): - name = str(member.get('name', '')) # Ensure string for sorting + name = str(member.get('name', '')) kind = member.get('kind', '') - # Special case: __version__ should be first - if name == "__version__": - return (0, name) - - # Order: aliases, functions, modules, others - if kind == 'alias': - return (1, name.lower()) # Case-insensitive natural sort - elif kind == 'function': - return (2, name.lower()) - elif kind == 'module': - return (3, name.lower()) + if is_errors_module and kind == 'class': + # Base errors first + if name == 'BaseError': + return ('0', '0', name) # Use strings for consistent comparison + elif name == 'APIRequestError': + return ('0', '1', name) + # Then group by category + elif name.startswith('API') or name.endswith('APIError'): + return ('1', '0', name) + elif 'Model' in name: + return ('2', '0', name) + elif 'Test' in name: + return ('3', '0', name) + elif name.startswith('Invalid') or name.startswith('Missing'): + return ('4', '0', name) + elif name.startswith('Unsupported'): + return ('5', '0', name) + else: + return ('6', '0', name) else: - return (4, name.lower()) + # Default sorting for non-error modules + if kind == 'class': + return ('0', name.lower()) + elif kind == 'function': + return ('1', name.lower()) + else: + return ('2', name.lower()) return sorted(members, key=get_sort_key) @@ -93,7 +107,7 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: # Collect items from this module module_items = [] - for member in sort_members(module['members']): + for member in sort_members(module['members'], module.get('name') == 'errors'): if not is_public(member, module, full_data, is_root): continue @@ -118,7 +132,7 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: result[module_name] = module_items # Recursively collect from submodules - for member in sort_members(module['members']): + for member in sort_members(module['members'], module.get('name') == 'errors'): if member['kind'] == 'module' and is_public(member, module, full_data, is_root): submodule_path = path + [member['name']] submodule_items = collect_documented_items(member, submodule_path, full_data, False) @@ -126,7 +140,7 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: # Also check for nested modules in the submodule if member.get('members'): - for submember in sort_members(member['members']): + for submember in sort_members(member['members'], member.get('name') == 'errors'): if submember['kind'] == 'module' and is_public(submember, member, full_data, False): subsubmodule_path = submodule_path + [submember['name']] subsubmodule_items = collect_documented_items(submember, subsubmodule_path, full_data, False) @@ -345,8 +359,20 @@ def get_inherited_members(base: Dict[str, Any], full_data: Dict[str, Any]) -> Li # Return the base class and its description method if it exists members = [{'name': base_name, 'kind': 'class', 'base': base_name}] - if 'description' in base_class.get('members', {}): - members.append({'name': 'description', 'kind': 'method', 'base': base_name}) + + # Add all public methods + for name, member in base_class.get('members', {}).items(): + # Include __init__ and __str__, skip other private methods + if name.startswith('_') and name not in {'__init__', '__str__'}: + continue + + if member['kind'] in ('function', 'method', 'property'): + members.append({ + 'name': name, + 'kind': 'method', + 'base': base_name, + 'docstring': member.get('docstring', {}).get('value', '') + }) # Add built-in methods from Exception members.extend([ @@ -356,6 +382,36 @@ def get_inherited_members(base: Dict[str, Any], full_data: Dict[str, Any]) -> Li return members +def generate_module_doc(module, full_data, env, output_dir): + """Generate documentation for a module.""" + is_errors = module.get('name') == 'errors' + + # Choose template based on module name + template = env.get_template('errors.qmd.jinja2' if is_errors else 'module.qmd.jinja2') + + # For errors module, filter to only include classes and skip module-level functions + if is_errors: + filtered_members = { + name: member for name, member in module.get('members', {}).items() + if member.get('kind') == 'class' + } + else: + filtered_members = module.get('members', {}) + + # Generate documentation + output = template.render( + module=module, + members=filtered_members, + full_data=full_data, + doc=doc_utils, + is_errors_module=is_errors + ) + + # Write output + output_path = os.path.join(output_dir, f"{module['name']}.qmd") + with open(output_path, 'w') as f: + f.write(output) + def generate_docs(json_path: str, template_dir: str, output_dir: str): """Generate documentation from JSON data using templates.""" # Load JSON data From 3619456e23e8c6a8d8cfb74fcae84f2806de0be9 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Mon, 27 Jan 2025 13:56:39 -0800 Subject: [PATCH 021/207] Save point before switching to vm_models --- docs/project_tree | 1219 +++++++++++++++++ docs/validmind/errors.html | 927 ------------- docs/validmind/vm_models.qmd | 2 +- ...p-973236bd072d72a04ee9cd82dcc9cb29.min.css | 0 .../libs/bootstrap/bootstrap-icons.css | 0 .../libs/bootstrap/bootstrap-icons.woff | Bin .../libs/bootstrap/bootstrap.min.js | 0 .../libs/clipboard/clipboard.min.js | 0 .../libs/quarto-html/anchor.min.js | 0 .../libs/quarto-html/popper.min.js | 0 ...hting-549806ee2085284f45b00abea8c6df48.css | 0 .../libs/quarto-html/quarto.js | 0 .../libs/quarto-html/tippy.css | 0 .../libs/quarto-html/tippy.umd.min.js | 0 14 files changed, 1220 insertions(+), 928 deletions(-) create mode 100644 docs/project_tree delete mode 100644 docs/validmind/errors.html rename docs/validmind/{errors_files => vm_models_files}/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css (100%) rename docs/validmind/{errors_files => vm_models_files}/libs/bootstrap/bootstrap-icons.css (100%) rename docs/validmind/{errors_files => vm_models_files}/libs/bootstrap/bootstrap-icons.woff (100%) rename docs/validmind/{errors_files => vm_models_files}/libs/bootstrap/bootstrap.min.js (100%) rename docs/validmind/{errors_files => vm_models_files}/libs/clipboard/clipboard.min.js (100%) rename docs/validmind/{errors_files => vm_models_files}/libs/quarto-html/anchor.min.js (100%) rename docs/validmind/{errors_files => vm_models_files}/libs/quarto-html/popper.min.js (100%) rename docs/validmind/{errors_files => vm_models_files}/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css (100%) rename docs/validmind/{errors_files => vm_models_files}/libs/quarto-html/quarto.js (100%) rename docs/validmind/{errors_files => vm_models_files}/libs/quarto-html/tippy.css (100%) rename docs/validmind/{errors_files => vm_models_files}/libs/quarto-html/tippy.umd.min.js (100%) diff --git a/docs/project_tree b/docs/project_tree new file mode 100644 index 000000000..f51eb40bb --- /dev/null +++ b/docs/project_tree @@ -0,0 +1,1219 @@ +. +├── LICENSE +├── Makefile +├── README.md +├── README.pypi.md +├── docs +│   ├── _build +│   │   ├── index.html +│   │   ├── search.js +│   │   ├── validmind +│   │   │   ├── __version__.html +│   │   │   ├── datasets +│   │   │   │   ├── classification +│   │   │   │   │   ├── customer_churn.html +│   │   │   │   │   └── taiwan_credit.html +│   │   │   │   ├── classification.html +│   │   │   │   ├── credit_risk +│   │   │   │   │   ├── lending_club.html +│   │   │   │   │   └── lending_club_bias.html +│   │   │   │   ├── credit_risk.html +│   │   │   │   ├── nlp +│   │   │   │   │   ├── cnn_dailymail.html +│   │   │   │   │   └── twitter_covid_19.html +│   │   │   │   ├── nlp.html +│   │   │   │   ├── regression +│   │   │   │   │   ├── fred.html +│   │   │   │   │   └── lending_club.html +│   │   │   │   └── regression.html +│   │   │   ├── datasets.html +│   │   │   ├── errors.html +│   │   │   ├── test_suites +│   │   │   │   ├── classifier.html +│   │   │   │   ├── cluster.html +│   │   │   │   ├── embeddings.html +│   │   │   │   ├── llm.html +│   │   │   │   ├── nlp.html +│   │   │   │   ├── parameters_optimization.html +│   │   │   │   ├── regression.html +│   │   │   │   ├── statsmodels_timeseries.html +│   │   │   │   ├── summarization.html +│   │   │   │   ├── tabular_datasets.html +│   │   │   │   ├── text_data.html +│   │   │   │   └── time_series.html +│   │   │   ├── test_suites.html +│   │   │   ├── tests +│   │   │   │   ├── data_validation +│   │   │   │   │   ├── ACFandPACFPlot.html +│   │   │   │   │   ├── ADF.html +│   │   │   │   │   ├── AutoAR.html +│   │   │   │   │   ├── AutoMA.html +│   │   │   │   │   ├── AutoStationarity.html +│   │   │   │   │   ├── BivariateScatterPlots.html +│   │   │   │   │   ├── BoxPierce.html +│   │   │   │   │   ├── ChiSquaredFeaturesTable.html +│   │   │   │   │   ├── ClassImbalance.html +│   │   │   │   │   ├── DatasetDescription.html +│   │   │   │   │   ├── DatasetSplit.html +│   │   │   │   │   ├── DescriptiveStatistics.html +│   │   │   │   │   ├── DickeyFullerGLS.html +│   │   │   │   │   ├── Duplicates.html +│   │   │   │   │   ├── EngleGrangerCoint.html +│   │   │   │   │   ├── FeatureTargetCorrelationPlot.html +│   │   │   │   │   ├── HighCardinality.html +│   │   │   │   │   ├── HighPearsonCorrelation.html +│   │   │   │   │   ├── IQROutliersBarPlot.html +│   │   │   │   │   ├── IQROutliersTable.html +│   │   │   │   │   ├── IsolationForestOutliers.html +│   │   │   │   │   ├── JarqueBera.html +│   │   │   │   │   ├── KPSS.html +│   │   │   │   │   ├── LJungBox.html +│   │   │   │   │   ├── LaggedCorrelationHeatmap.html +│   │   │   │   │   ├── MissingValues.html +│   │   │   │   │   ├── MissingValuesBarPlot.html +│   │   │   │   │   ├── MutualInformation.html +│   │   │   │   │   ├── PearsonCorrelationMatrix.html +│   │   │   │   │   ├── PhillipsPerronArch.html +│   │   │   │   │   ├── ProtectedClassesCombination.html +│   │   │   │   │   ├── ProtectedClassesDescription.html +│   │   │   │   │   ├── ProtectedClassesDisparity.html +│   │   │   │   │   ├── ProtectedClassesThresholdOptimizer.html +│   │   │   │   │   ├── RollingStatsPlot.html +│   │   │   │   │   ├── RunsTest.html +│   │   │   │   │   ├── ScatterPlot.html +│   │   │   │   │   ├── ScoreBandDefaultRates.html +│   │   │   │   │   ├── SeasonalDecompose.html +│   │   │   │   │   ├── ShapiroWilk.html +│   │   │   │   │   ├── Skewness.html +│   │   │   │   │   ├── SpreadPlot.html +│   │   │   │   │   ├── TabularCategoricalBarPlots.html +│   │   │   │   │   ├── TabularDateTimeHistograms.html +│   │   │   │   │   ├── TabularDescriptionTables.html +│   │   │   │   │   ├── TabularNumericalHistograms.html +│   │   │   │   │   ├── TargetRateBarPlots.html +│   │   │   │   │   ├── TimeSeriesDescription.html +│   │   │   │   │   ├── TimeSeriesDescriptiveStatistics.html +│   │   │   │   │   ├── TimeSeriesFrequency.html +│   │   │   │   │   ├── TimeSeriesHistogram.html +│   │   │   │   │   ├── TimeSeriesLinePlot.html +│   │   │   │   │   ├── TimeSeriesMissingValues.html +│   │   │   │   │   ├── TimeSeriesOutliers.html +│   │   │   │   │   ├── TooManyZeroValues.html +│   │   │   │   │   ├── UniqueRows.html +│   │   │   │   │   ├── WOEBinPlots.html +│   │   │   │   │   ├── WOEBinTable.html +│   │   │   │   │   ├── ZivotAndrewsArch.html +│   │   │   │   │   ├── nlp +│   │   │   │   │   │   ├── CommonWords.html +│   │   │   │   │   │   ├── Hashtags.html +│   │   │   │   │   │   ├── LanguageDetection.html +│   │   │   │   │   │   ├── Mentions.html +│   │   │   │   │   │   ├── PolarityAndSubjectivity.html +│   │   │   │   │   │   ├── Punctuations.html +│   │   │   │   │   │   ├── Sentiment.html +│   │   │   │   │   │   ├── StopWords.html +│   │   │   │   │   │   ├── TextDescription.html +│   │   │   │   │   │   └── Toxicity.html +│   │   │   │   │   └── nlp.html +│   │   │   │   ├── data_validation.html +│   │   │   │   ├── model_validation +│   │   │   │   │   ├── BertScore.html +│   │   │   │   │   ├── BleuScore.html +│   │   │   │   │   ├── ClusterSizeDistribution.html +│   │   │   │   │   ├── ContextualRecall.html +│   │   │   │   │   ├── FeaturesAUC.html +│   │   │   │   │   ├── MeteorScore.html +│   │   │   │   │   ├── ModelMetadata.html +│   │   │   │   │   ├── ModelPredictionResiduals.html +│   │   │   │   │   ├── RegardScore.html +│   │   │   │   │   ├── RegressionResidualsPlot.html +│   │   │   │   │   ├── RougeScore.html +│   │   │   │   │   ├── TimeSeriesPredictionWithCI.html +│   │   │   │   │   ├── TimeSeriesPredictionsPlot.html +│   │   │   │   │   ├── TimeSeriesR2SquareBySegments.html +│   │   │   │   │   ├── TokenDisparity.html +│   │   │   │   │   ├── ToxicityScore.html +│   │   │   │   │   ├── sklearn +│   │   │   │   │   │   ├── AdjustedMutualInformation.html +│   │   │   │   │   │   ├── AdjustedRandIndex.html +│   │   │   │   │   │   ├── CalibrationCurve.html +│   │   │   │   │   │   ├── ClassifierPerformance.html +│   │   │   │   │   │   ├── ClassifierThresholdOptimization.html +│   │   │   │   │   │   ├── ClusterCosineSimilarity.html +│   │   │   │   │   │   ├── ClusterPerformanceMetrics.html +│   │   │   │   │   │   ├── CompletenessScore.html +│   │   │   │   │   │   ├── ConfusionMatrix.html +│   │   │   │   │   │   ├── FeatureImportance.html +│   │   │   │   │   │   ├── FowlkesMallowsScore.html +│   │   │   │   │   │   ├── HomogeneityScore.html +│   │   │   │   │   │   ├── HyperParametersTuning.html +│   │   │   │   │   │   ├── KMeansClustersOptimization.html +│   │   │   │   │   │   ├── MinimumAccuracy.html +│   │   │   │   │   │   ├── MinimumF1Score.html +│   │   │   │   │   │   ├── MinimumROCAUCScore.html +│   │   │   │   │   │   ├── ModelParameters.html +│   │   │   │   │   │   ├── ModelsPerformanceComparison.html +│   │   │   │   │   │   ├── OverfitDiagnosis.html +│   │   │   │   │   │   ├── PermutationFeatureImportance.html +│   │   │   │   │   │   ├── PopulationStabilityIndex.html +│   │   │   │   │   │   ├── PrecisionRecallCurve.html +│   │   │   │   │   │   ├── ROCCurve.html +│   │   │   │   │   │   ├── RegressionErrors.html +│   │   │   │   │   │   ├── RegressionErrorsComparison.html +│   │   │   │   │   │   ├── RegressionPerformance.html +│   │   │   │   │   │   ├── RegressionR2Square.html +│   │   │   │   │   │   ├── RegressionR2SquareComparison.html +│   │   │   │   │   │   ├── RobustnessDiagnosis.html +│   │   │   │   │   │   ├── SHAPGlobalImportance.html +│   │   │   │   │   │   ├── ScoreProbabilityAlignment.html +│   │   │   │   │   │   ├── SilhouettePlot.html +│   │   │   │   │   │   ├── TrainingTestDegradation.html +│   │   │   │   │   │   ├── VMeasure.html +│   │   │   │   │   │   └── WeakspotsDiagnosis.html +│   │   │   │   │   ├── sklearn.html +│   │   │   │   │   ├── statsmodels +│   │   │   │   │   │   ├── AutoARIMA.html +│   │   │   │   │   │   ├── CumulativePredictionProbabilities.html +│   │   │   │   │   │   ├── DurbinWatsonTest.html +│   │   │   │   │   │   ├── GINITable.html +│   │   │   │   │   │   ├── KolmogorovSmirnov.html +│   │   │   │   │   │   ├── Lilliefors.html +│   │   │   │   │   │   ├── PredictionProbabilitiesHistogram.html +│   │   │   │   │   │   ├── RegressionCoeffs.html +│   │   │   │   │   │   ├── RegressionFeatureSignificance.html +│   │   │   │   │   │   ├── RegressionModelForecastPlot.html +│   │   │   │   │   │   ├── RegressionModelForecastPlotLevels.html +│   │   │   │   │   │   ├── RegressionModelSensitivityPlot.html +│   │   │   │   │   │   ├── RegressionModelSummary.html +│   │   │   │   │   │   ├── RegressionPermutationFeatureImportance.html +│   │   │   │   │   │   ├── ScorecardHistogram.html +│   │   │   │   │   │   └── statsutils.html +│   │   │   │   │   └── statsmodels.html +│   │   │   │   ├── model_validation.html +│   │   │   │   ├── prompt_validation +│   │   │   │   │   ├── Bias.html +│   │   │   │   │   ├── Clarity.html +│   │   │   │   │   ├── Conciseness.html +│   │   │   │   │   ├── Delimitation.html +│   │   │   │   │   ├── NegativeInstruction.html +│   │   │   │   │   ├── Robustness.html +│   │   │   │   │   ├── Specificity.html +│   │   │   │   │   └── ai_powered_test.html +│   │   │   │   └── prompt_validation.html +│   │   │   ├── tests.html +│   │   │   ├── unit_metrics.html +│   │   │   └── vm_models.html +│   │   └── validmind.html +│   ├── _sidebar.yml +│   ├── griffe_all.log +│   ├── project_tree +│   ├── templates +│   │   ├── class.qmd.jinja2 +│   │   ├── custom.css +│   │   ├── errors.qmd.jinja2 +│   │   ├── function.qmd.jinja2 +│   │   ├── macros +│   │   │   ├── docstring.jinja2 +│   │   │   ├── navigation.jinja2 +│   │   │   └── types.jinja2 +│   │   ├── module.html.jinja2 +│   │   ├── module.qmd.jinja2 +│   │   ├── sidebar.qmd.jinja2 +│   │   └── template.qmd.jinja2_OLD +│   ├── validmind +│   ├── validmind.json +│   ├── validmind.qmd +│   └── validmind.tree +├── images +│   └── ValidMind-logo-color.svg +├── notebooks +│   ├── README.md +│   ├── code_samples +│   │   ├── capital_markets +│   │   │   ├── quickstart_option_pricing_models.ipynb +│   │   │   └── quickstart_option_pricing_models_quantlib.ipynb +│   │   ├── credit_risk +│   │   │   ├── application_scorecard_demo.ipynb +│   │   │   ├── application_scorecard_executive.ipynb +│   │   │   ├── application_scorecard_full_suite.ipynb +│   │   │   ├── application_scorecard_with_bias.ipynb +│   │   │   ├── application_scorecard_with_ml.ipynb +│   │   │   └── custom_tests +│   │   │   └── ScoreBandDiscriminationMetrics.py +│   │   ├── custom_tests +│   │   │   ├── implement_custom_tests.ipynb +│   │   │   └── integrate_external_test_providers.ipynb +│   │   ├── nlp_and_llm +│   │   │   ├── datasets +│   │   │   │   ├── bbc_text_cls.csv +│   │   │   │   ├── bbc_text_cls_reference.csv +│   │   │   │   ├── cnn_dailymail_100_with_predictions.csv +│   │   │   │   ├── cnn_dailymail_500_with_predictions.csv +│   │   │   │   ├── sentiments.csv +│   │   │   │   └── sentiments_with_predictions.csv +│   │   │   ├── foundation_models_integration_demo.ipynb +│   │   │   ├── foundation_models_summarization_demo.ipynb +│   │   │   ├── hugging_face_integration_demo.ipynb +│   │   │   ├── hugging_face_summarization_demo.ipynb +│   │   │   ├── llm_summarization_demo.ipynb +│   │   │   ├── prompt_validation_demo.ipynb +│   │   │   └── rag_documentation_demo.ipynb +│   │   ├── ongoing_monitoring +│   │   │   ├── application_scorecard_ongoing_monitoring.ipynb +│   │   │   ├── quickstart_customer_churn_ongoing_monitoring.ipynb +│   │   │   └── xgboost_model.model +│   │   ├── quickstart_customer_churn_full_suite.ipynb +│   │   ├── regression +│   │   │   └── quickstart_regression_full_suite.ipynb +│   │   └── time_series +│   │   ├── quickstart_time_series_full_suite.ipynb +│   │   └── quickstart_time_series_high_code.ipynb +│   ├── code_sharing +│   │   ├── clustering +│   │   │   └── quickstart_cluster_demo.ipynb +│   │   ├── credit_risk +│   │   │   └── assign_prediction_probabilities.ipynb +│   │   ├── datasets +│   │   │   ├── bank_customer_churn.csv +│   │   │   ├── lending_club_loan_rates.csv +│   │   │   ├── marketing_lead_conversion.csv +│   │   │   ├── probability_of_default +│   │   │   │   └── Data Dictionary.xlsx +│   │   │   ├── taiwan_credit.csv +│   │   │   └── time_series +│   │   │   ├── fred_loan_rates.csv +│   │   │   ├── fred_loan_rates_test_1.csv +│   │   │   ├── fred_loan_rates_test_2.csv +│   │   │   ├── fred_loan_rates_test_3.csv +│   │   │   ├── fred_loan_rates_test_4.csv +│   │   │   ├── fred_loan_rates_test_5.csv +│   │   │   ├── lending_club_loan_rates.csv +│   │   │   └── raw +│   │   │   └── fred +│   │   │   ├── CPIAUCSL.csv +│   │   │   ├── CSUSHPISA.csv +│   │   │   ├── DRSFRMACBS.csv +│   │   │   ├── FEDFUNDS.csv +│   │   │   ├── GDP.csv +│   │   │   ├── GDPC1.csv +│   │   │   ├── GS10.csv +│   │   │   ├── GS3.csv +│   │   │   ├── GS5.csv +│   │   │   ├── MORTGAGE30US.csv +│   │   │   └── UNRATE.csv +│   │   ├── embeddings +│   │   │   └── quickstart_embeddings_demo.ipynb +│   │   ├── external_tests +│   │   │   └── tests +│   │   │   └── MyIsolationForest.py +│   │   ├── insurance_mortality +│   │   │   ├── insurance_dataset.csv +│   │   │   ├── insurance_validation_demo.ipynb +│   │   │   ├── test_df.csv +│   │   │   ├── train_df.csv +│   │   │   └── validmind_insurance_POC.ipynb +│   │   ├── llm +│   │   │   ├── datasets +│   │   │   │   ├── bbc_text_cls.csv +│   │   │   │   ├── bbc_text_cls_reference.csv +│   │   │   │   ├── rag +│   │   │   │   │   ├── rag_evaluation_dataset_01.csv +│   │   │   │   │   ├── rag_evaluation_dataset_02.csv +│   │   │   │   │   ├── rag_evaluation_dataset_03.csv +│   │   │   │   │   ├── rag_evaluation_results.csv +│   │   │   │   │   ├── rfp_existing_questions_client_1.csv +│   │   │   │   │   ├── rfp_existing_questions_client_2.csv +│   │   │   │   │   ├── rfp_existing_questions_client_3.csv +│   │   │   │   │   ├── rfp_existing_questions_client_4.csv +│   │   │   │   │   ├── rfp_existing_questions_client_5.csv +│   │   │   │   │   ├── rfp_new_questions_client_100.csv +│   │   │   │   │   ├── vendor_contracts_001_020.csv +│   │   │   │   │   ├── vendor_contracts_021_040.csv +│   │   │   │   │   ├── vendor_contracts_041_060.csv +│   │   │   │   │   └── vendor_contracts_questions.csv +│   │   │   │   └── sentiments.csv +│   │   │   ├── llm_descriptions_context.ipynb +│   │   │   ├── rag_llamaindex.ipynb +│   │   │   ├── rag_rfp_answer_generation.ipynb +│   │   │   ├── rag_rfp_answer_generation_langchain.ipynb +│   │   │   ├── rag_rfp_question_similarity.ipynb +│   │   │   ├── rag_vendor_contracts_llamaindex.ipynb +│   │   │   └── vendor_contract_agent +│   │   │   ├── data +│   │   │   │   ├── contracts.json +│   │   │   │   └── vendors.json +│   │   │   ├── genai_vendor_contract_agent_usecase_poc.ipynb +│   │   │   ├── tool_definitions +│   │   │   │   ├── query_database.json +│   │   │   │   └── search_online.json +│   │   │   └── utils.py +│   │   ├── market_basket_analysis +│   │   │   ├── datasets +│   │   │   │   └── mba +│   │   │   │   └── Online Retail.csv +│   │   │   └── mba_poc.ipynb +│   │   ├── operational_deposit +│   │   │   ├── dataset_image.png +│   │   │   ├── datasets +│   │   │   │   └── odm_data_example +│   │   │   │   └── synthetic_data.csv +│   │   │   ├── model_image.png +│   │   │   ├── operational_deposit_poc.ipynb +│   │   │   ├── synthetic_data_generation.ipynb +│   │   │   └── tests +│   │   │   └── TimeseriesGroupbyPlot.py +│   │   ├── output_templates +│   │   │   ├── Screenshot 2024-02-15 at 2.48.03 PM.png +│   │   │   ├── Screenshot 2024-02-15 at 4.51.56 PM.png +│   │   │   └── customizing_tests_with_output_templates.ipynb +│   │   ├── post_processing_functions.ipynb +│   │   ├── r +│   │   │   ├── r_custom_tests.Rmd +│   │   │   ├── r_customer_churn_demo.Rmd +│   │   │   ├── r_customer_churn_demo_xgboost.Rmd +│   │   │   ├── r_mortality_demo.Rmd +│   │   │   ├── r_time_series_data_validation.Rmd +│   │   │   └── r_time_series_model_validation.Rmd +│   │   ├── r_demo +│   │   │   ├── prune_dt.pmml +│   │   │   ├── r-customer-churn-model.ipynb +│   │   │   ├── r-ecm-demo.ipynb +│   │   │   ├── r-ecm-model.ipynb +│   │   │   ├── r-ecm-model.rds +│   │   │   ├── r_churn_test.csv +│   │   │   ├── r_churn_train.csv +│   │   │   ├── r_log_reg_churn_model.rds +│   │   │   └── r_xgb_churn_model.json +│   │   ├── regression +│   │   │   └── regression_unit_metrics.ipynb +│   │   └── test_configuration_updates_demo.ipynb +│   ├── how_to +│   │   ├── configure_dataset_features.ipynb +│   │   ├── dataset_image.png +│   │   ├── document_multiple_results_for_the_same_test.ipynb +│   │   ├── explore_test_suites.ipynb +│   │   ├── explore_tests.ipynb +│   │   ├── filter_input_columns.ipynb +│   │   ├── load_datasets_predictions.ipynb +│   │   ├── log_metrics_over_time.ipynb +│   │   ├── model_image.png +│   │   ├── run_documentation_sections.ipynb +│   │   ├── run_documentation_tests_with_config.ipynb +│   │   ├── run_tests +│   │   │   ├── 1_run_dataset_based_tests.ipynb +│   │   │   └── 2_run_comparison_tests.ipynb +│   │   ├── run_tests_that_require_multiple_datasets.ipynb +│   │   ├── run_unit_metrics.ipynb +│   │   └── use_dataset_model_objects.ipynb +│   ├── images +│   │   ├── add_metric_over_time_block.png +│   │   ├── btc-price-custom-metric.png +│   │   ├── composite-metric-in-template-preview.png +│   │   ├── high-pearson-correlation-block.png +│   │   ├── hyperparameters-custom-metric.png +│   │   ├── image-in-custom-metric.png +│   │   ├── insert-test-driven-block-correlations.png +│   │   ├── insert-test-driven-block-custom-class-imbalance.jpg +│   │   ├── insert-test-driven-block-custom-confusion-matrix.png +│   │   ├── insert-test-driven-block-custom.png +│   │   ├── insert-test-driven-block-test-provider.png +│   │   ├── insert-test-driven-block.png +│   │   ├── log_metric_accuracy.png +│   │   ├── log_metric_auc_1.png +│   │   ├── log_metric_auc_2.png +│   │   ├── log_metric_auc_3.png +│   │   ├── log_metric_auc_4.png +│   │   ├── log_metric_f1.png +│   │   ├── log_metric_precision.png +│   │   ├── log_metric_recall.png +│   │   ├── multiple-tables-plots-custom-metric.png +│   │   ├── my_tests_directory.png +│   │   ├── parameterized-custom-metric.png +│   │   ├── pearson-correlation-matrix-test-output.png +│   │   ├── pearson-correlation-matrix.png +│   │   ├── selecting-composite-metric.png +│   │   └── selecting-high-pearson-correlation-test.png +│   ├── templates +│   │   ├── README.md +│   │   ├── __pycache__ +│   │   │   └── e2e_template.cpython-39.pyc +│   │   ├── about-validmind.ipynb +│   │   ├── e2e-notebook.ipynb +│   │   ├── e2e_template.py +│   │   ├── install-initialize-validmind.ipynb +│   │   ├── next-steps.ipynb +│   │   └── upgrade-validmind.ipynb +│   └── tutorials +│   └── intro_for_model_developers.ipynb +├── poetry.lock +├── pyproject.toml +├── r +│   ├── custom_tests.py +│   └── validmind +│   ├── DESCRIPTION +│   ├── NAMESPACE +│   ├── R +│   │   ├── custom_tests.R +│   │   └── platform.R +│   ├── README.md +│   ├── inst +│   │   └── extdata +│   │   └── child.Rmd +│   ├── man +│   │   ├── build_r_plotly.Rd +│   │   ├── display_report.Rd +│   │   ├── print_summary_tables.Rd +│   │   ├── process_result.Rd +│   │   ├── register_custom_test.Rd +│   │   ├── run_custom_test.Rd +│   │   ├── save_model.Rd +│   │   ├── summarize_metric_result.Rd +│   │   ├── summarize_result.Rd +│   │   ├── summarize_test_result.Rd +│   │   └── vm.Rd +│   └── validmind.Rproj +├── scripts +│   ├── README.md +│   ├── __init__.py +│   ├── api_tree.py +│   ├── bulk_ai_test_updates.py +│   ├── bulk_unit_tests_updates.py +│   ├── check_tests.py +│   ├── copyright.txt +│   ├── copyright_files.py +│   ├── credentials_check.py +│   ├── ensure_clean_notebooks.py +│   ├── extract_descriptions.py +│   ├── format_and_add.sh +│   ├── generate_quarto_docs.py +│   ├── generate_test_id_type.py +│   ├── run_e2e_notebooks.py +│   └── verify_copyright.py +├── tests +│   ├── __init__.py +│   ├── run_test_utils.py +│   ├── test_api_client.py +│   ├── test_client.py +│   ├── test_dataset.py +│   ├── test_framework_init.py +│   ├── test_full_suite.py +│   ├── test_full_suite_nb.py +│   ├── test_unit_tests.py +│   ├── test_validmind_tests_module.py +│   └── unit_tests +│   ├── __init__.py +│   ├── data_validation +│   │   ├── __init__.py +│   │   ├── nlp +│   │   │   ├── test_CommonWords.py +│   │   │   ├── test_LanguageDetection.py +│   │   │   ├── test_PolarityAndSubjectivity.py +│   │   │   ├── test_Punctuations.py +│   │   │   ├── test_Sentiment.py +│   │   │   └── test_Toxicity.py +│   │   ├── test_ACFandPACFPlot.py +│   │   ├── test_ADF.py +│   │   ├── test_AutoAR.py +│   │   ├── test_AutoMA.py +│   │   ├── test_AutoStationarity.py +│   │   ├── test_BivariateScatterPlots.py +│   │   ├── test_BoxPierce.py +│   │   ├── test_ChiSquaredFeaturesTable.py +│   │   ├── test_ClassImbalance.py +│   │   ├── test_DatasetDescription.py +│   │   ├── test_DatasetSplit.py +│   │   ├── test_DescriptiveStatistics.py +│   │   ├── test_DickeyFullerGLS.py +│   │   ├── test_Duplicates.py +│   │   ├── test_EngleGrangerCoint.py +│   │   ├── test_FeatureTargetCorrelationPlot.py +│   │   ├── test_HighCardinality.py +│   │   ├── test_HighPearsonCorrelation.py +│   │   ├── test_IQROutliersBarPlot.py +│   │   ├── test_IQROutliersTable.py +│   │   ├── test_IsolationForestOutliers.py +│   │   ├── test_JarqueBera.py +│   │   ├── test_KPSS.py +│   │   ├── test_LJungBox.py +│   │   ├── test_LaggedCorrelationHeatmap.py +│   │   ├── test_MissingValues.py +│   │   ├── test_MissingValuesBarPlot.py +│   │   ├── test_PearsonCorrelationMatrix.py +│   │   ├── test_PhillipsPerronArch.py +│   │   ├── test_RollingStatsPlot.py +│   │   ├── test_RunsTest.py +│   │   ├── test_ScatterPlot.py +│   │   ├── test_SeasonalDecompose.py +│   │   ├── test_ShapiroWilk.py +│   │   ├── test_Skewness.py +│   │   ├── test_SpreadPlot.py +│   │   ├── test_TabularCategoricalBarPlots.py +│   │   ├── test_TabularDateTimeHistograms.py +│   │   ├── test_TabularDescriptionTables.py +│   │   ├── test_TabularNumericalHistograms.py +│   │   ├── test_TargetRateBarPlots.py +│   │   ├── test_TimeSeriesDescription.py +│   │   ├── test_TimeSeriesDescriptiveStatistics.py +│   │   ├── test_TimeSeriesFrequency.py +│   │   ├── test_TimeSeriesHistogram.py +│   │   ├── test_TimeSeriesLinePlot.py +│   │   ├── test_TimeSeriesMissingValues.py +│   │   ├── test_TimeSeriesOutliers.py +│   │   ├── test_TooManyZeroValues.py +│   │   ├── test_UniqueRows.py +│   │   ├── test_WOEBinPlots.py +│   │   ├── test_WOEBinTable.py +│   │   └── test_ZivotAndrewsArch.py +│   ├── model_validation +│   │   ├── ragas +│   │   │   ├── test_AnswerCorrectness.py +│   │   │   ├── test_AspectCritic.py +│   │   │   ├── test_ContextEntityRecall.py +│   │   │   ├── test_ContextPrecision.py +│   │   │   ├── test_ContextPrecisionWithoutReference.py +│   │   │   ├── test_ContextRecall.py +│   │   │   ├── test_Faithfulness.py +│   │   │   ├── test_NoiseSensitivity.py +│   │   │   ├── test_ResponseRelevancy.py +│   │   │   └── test_SemanticSimilarity.py +│   │   ├── sklearn +│   │   │   ├── test_FeatureImportance.py +│   │   │   ├── test_ROCCurve.py +│   │   │   ├── test_RegressionErrors.py +│   │   │   ├── test_RegressionErrorsComparison.py +│   │   │   ├── test_RegressionR2Square.py +│   │   │   └── test_RegressionR2SquareComparison.py +│   │   ├── statsmodels +│   │   │   ├── test_CumulativePredictionProbabilities.py +│   │   │   ├── test_DurbinWatsonTest.py +│   │   │   ├── test_GINITable.py +│   │   │   ├── test_PredictionProbabilitiesHistogram.py +│   │   │   ├── test_RegressionCoeffs.py +│   │   │   └── test_ScorecardHistogram.py +│   │   ├── test_BertScore.py +│   │   ├── test_BleuScore.py +│   │   ├── test_ContextualRecall.py +│   │   ├── test_MeteorScore.py +│   │   ├── test_ModelMetadata.py +│   │   ├── test_ModelPredictionResiduals.py +│   │   ├── test_RegardScore.py +│   │   ├── test_RougeScore.py +│   │   ├── test_TimeSeriesPredictionWithCI.py +│   │   ├── test_TimeSeriesPredictionsPlot.py +│   │   ├── test_TimeSeriesR2SquareBySegments.py +│   │   ├── test_TokenDisparity.py +│   │   └── test_ToxicityScore.py +│   └── utils.py +└── validmind + ├── __init__.py + ├── __pycache__ + │   ├── __init__.cpython-39.pyc + │   ├── __version__.cpython-39.pyc + │   ├── api_client.cpython-39.pyc + │   ├── client.cpython-39.pyc + │   ├── client_config.cpython-39.pyc + │   ├── errors.cpython-39.pyc + │   ├── input_registry.cpython-39.pyc + │   ├── logging.cpython-39.pyc + │   ├── template.cpython-39.pyc + │   └── utils.cpython-39.pyc + ├── __version__.py + ├── ai + │   ├── __pycache__ + │   │   ├── test_descriptions.cpython-39.pyc + │   │   └── utils.cpython-39.pyc + │   ├── test_descriptions.py + │   └── utils.py + ├── api_client.py + ├── client.py + ├── client_config.py + ├── datasets + │   ├── __init__.py + │   ├── __pycache__ + │   │   └── __init__.cpython-39.pyc + │   ├── classification + │   │   ├── __init__.py + │   │   ├── __pycache__ + │   │   │   ├── __init__.cpython-39.pyc + │   │   │   ├── customer_churn.cpython-39.pyc + │   │   │   └── taiwan_credit.cpython-39.pyc + │   │   ├── customer_churn.py + │   │   ├── datasets + │   │   │   ├── bank_customer_churn.csv + │   │   │   └── taiwan_credit.csv + │   │   └── taiwan_credit.py + │   ├── cluster + │   │   └── digits.py + │   ├── credit_risk + │   │   ├── __init__.py + │   │   ├── __pycache__ + │   │   │   ├── __init__.cpython-39.pyc + │   │   │   ├── lending_club.cpython-39.pyc + │   │   │   └── lending_club_bias.cpython-39.pyc + │   │   ├── datasets + │   │   │   ├── lending_club_biased.csv.gz + │   │   │   └── lending_club_loan_data_2007_2014_clean.csv.gz + │   │   ├── lending_club.py + │   │   └── lending_club_bias.py + │   ├── llm + │   │   └── rag + │   │   ├── __init__.py + │   │   ├── datasets + │   │   │   ├── rfp_existing_questions_client_1.csv + │   │   │   ├── rfp_existing_questions_client_2.csv + │   │   │   ├── rfp_existing_questions_client_3.csv + │   │   │   ├── rfp_existing_questions_client_4.csv + │   │   │   └── rfp_existing_questions_client_5.csv + │   │   └── rfp.py + │   ├── nlp + │   │   ├── __init__.py + │   │   ├── __pycache__ + │   │   │   ├── __init__.cpython-39.pyc + │   │   │   ├── cnn_dailymail.cpython-39.pyc + │   │   │   └── twitter_covid_19.cpython-39.pyc + │   │   ├── cnn_dailymail.py + │   │   ├── datasets + │   │   │   ├── Covid_19.csv + │   │   │   ├── cnn_dailymail_100_with_predictions.csv + │   │   │   ├── cnn_dailymail_500_with_predictions.csv + │   │   │   └── sentiments_with_predictions.csv + │   │   └── twitter_covid_19.py + │   └── regression + │   ├── __init__.py + │   ├── __pycache__ + │   │   ├── __init__.cpython-39.pyc + │   │   ├── california_housing.cpython-39.pyc + │   │   ├── fred.cpython-39.pyc + │   │   ├── fred_timeseries.cpython-39.pyc + │   │   └── lending_club.cpython-39.pyc + │   ├── california_housing.py + │   ├── datasets + │   │   ├── fred + │   │   │   ├── CPIAUCSL.csv + │   │   │   ├── CSUSHPISA.csv + │   │   │   ├── DRSFRMACBS.csv + │   │   │   ├── FEDFUNDS.csv + │   │   │   ├── GDP.csv + │   │   │   ├── GDPC1.csv + │   │   │   ├── GS10.csv + │   │   │   ├── GS3.csv + │   │   │   ├── GS5.csv + │   │   │   ├── MORTGAGE30US.csv + │   │   │   └── UNRATE.csv + │   │   ├── fred_loan_rates.csv + │   │   ├── fred_loan_rates_test_1.csv + │   │   ├── fred_loan_rates_test_2.csv + │   │   ├── fred_loan_rates_test_3.csv + │   │   ├── fred_loan_rates_test_4.csv + │   │   ├── fred_loan_rates_test_5.csv + │   │   └── leanding_club_loan_rates.csv + │   ├── fred.py + │   ├── fred_timeseries.py + │   ├── lending_club.py + │   └── models + │   ├── fred_loan_rates_model_1.pkl + │   ├── fred_loan_rates_model_2.pkl + │   ├── fred_loan_rates_model_3.pkl + │   ├── fred_loan_rates_model_4.pkl + │   └── fred_loan_rates_model_5.pkl + ├── errors.py + ├── html_templates + │   ├── __init__.py + │   ├── __pycache__ + │   │   ├── __init__.cpython-39.pyc + │   │   └── content_blocks.cpython-39.pyc + │   └── content_blocks.py + ├── input_registry.py + ├── logging.py + ├── models + │   ├── __init__.py + │   ├── __pycache__ + │   │   ├── __init__.cpython-39.pyc + │   │   ├── foundation.cpython-39.pyc + │   │   ├── function.cpython-39.pyc + │   │   ├── huggingface.cpython-39.pyc + │   │   ├── metadata.cpython-39.pyc + │   │   ├── pipeline.cpython-39.pyc + │   │   ├── pytorch.cpython-39.pyc + │   │   ├── r_model.cpython-39.pyc + │   │   └── sklearn.cpython-39.pyc + │   ├── foundation.py + │   ├── function.py + │   ├── huggingface.py + │   ├── metadata.py + │   ├── pipeline.py + │   ├── pytorch.py + │   ├── r_model.py + │   └── sklearn.py + ├── template.py + ├── test_suites + │   ├── __init__.py + │   ├── __pycache__ + │   │   ├── __init__.cpython-39.pyc + │   │   ├── classifier.cpython-39.pyc + │   │   ├── cluster.cpython-39.pyc + │   │   ├── embeddings.cpython-39.pyc + │   │   ├── llm.cpython-39.pyc + │   │   ├── nlp.cpython-39.pyc + │   │   ├── parameters_optimization.cpython-39.pyc + │   │   ├── regression.cpython-39.pyc + │   │   ├── statsmodels_timeseries.cpython-39.pyc + │   │   ├── summarization.cpython-39.pyc + │   │   ├── tabular_datasets.cpython-39.pyc + │   │   ├── text_data.cpython-39.pyc + │   │   └── time_series.cpython-39.pyc + │   ├── classifier.py + │   ├── cluster.py + │   ├── embeddings.py + │   ├── llm.py + │   ├── nlp.py + │   ├── parameters_optimization.py + │   ├── regression.py + │   ├── statsmodels_timeseries.py + │   ├── summarization.py + │   ├── tabular_datasets.py + │   ├── text_data.py + │   └── time_series.py + ├── tests + │   ├── __init__.py + │   ├── __pycache__ + │   │   ├── __init__.cpython-39.pyc + │   │   ├── __types__.cpython-39.pyc + │   │   ├── _store.cpython-39.pyc + │   │   ├── comparison.cpython-39.pyc + │   │   ├── decorator.cpython-39.pyc + │   │   ├── load.cpython-39.pyc + │   │   ├── output.cpython-39.pyc + │   │   ├── run.cpython-39.pyc + │   │   ├── test_providers.cpython-39.pyc + │   │   └── utils.cpython-39.pyc + │   ├── __types__.py + │   ├── _store.py + │   ├── comparison.py + │   ├── data_validation + │   │   ├── ACFandPACFPlot.py + │   │   ├── ADF.py + │   │   ├── AutoAR.py + │   │   ├── AutoMA.py + │   │   ├── AutoStationarity.py + │   │   ├── BivariateScatterPlots.py + │   │   ├── BoxPierce.py + │   │   ├── ChiSquaredFeaturesTable.py + │   │   ├── ClassImbalance.py + │   │   ├── DatasetDescription.py + │   │   ├── DatasetSplit.py + │   │   ├── DescriptiveStatistics.py + │   │   ├── DickeyFullerGLS.py + │   │   ├── Duplicates.py + │   │   ├── EngleGrangerCoint.py + │   │   ├── FeatureTargetCorrelationPlot.py + │   │   ├── HighCardinality.py + │   │   ├── HighPearsonCorrelation.py + │   │   ├── IQROutliersBarPlot.py + │   │   ├── IQROutliersTable.py + │   │   ├── IsolationForestOutliers.py + │   │   ├── JarqueBera.py + │   │   ├── KPSS.py + │   │   ├── LJungBox.py + │   │   ├── LaggedCorrelationHeatmap.py + │   │   ├── MissingValues.py + │   │   ├── MissingValuesBarPlot.py + │   │   ├── MutualInformation.py + │   │   ├── PearsonCorrelationMatrix.py + │   │   ├── PhillipsPerronArch.py + │   │   ├── ProtectedClassesCombination.py + │   │   ├── ProtectedClassesDescription.py + │   │   ├── ProtectedClassesDisparity.py + │   │   ├── ProtectedClassesThresholdOptimizer.py + │   │   ├── RollingStatsPlot.py + │   │   ├── RunsTest.py + │   │   ├── ScatterPlot.py + │   │   ├── ScoreBandDefaultRates.py + │   │   ├── SeasonalDecompose.py + │   │   ├── ShapiroWilk.py + │   │   ├── Skewness.py + │   │   ├── SpreadPlot.py + │   │   ├── TabularCategoricalBarPlots.py + │   │   ├── TabularDateTimeHistograms.py + │   │   ├── TabularDescriptionTables.py + │   │   ├── TabularNumericalHistograms.py + │   │   ├── TargetRateBarPlots.py + │   │   ├── TimeSeriesDescription.py + │   │   ├── TimeSeriesDescriptiveStatistics.py + │   │   ├── TimeSeriesFrequency.py + │   │   ├── TimeSeriesHistogram.py + │   │   ├── TimeSeriesLinePlot.py + │   │   ├── TimeSeriesMissingValues.py + │   │   ├── TimeSeriesOutliers.py + │   │   ├── TooManyZeroValues.py + │   │   ├── UniqueRows.py + │   │   ├── WOEBinPlots.py + │   │   ├── WOEBinTable.py + │   │   ├── ZivotAndrewsArch.py + │   │   ├── __init__.py + │   │   ├── __pycache__ + │   │   │   ├── ACFandPACFPlot.cpython-39.pyc + │   │   │   ├── ADF.cpython-39.pyc + │   │   │   ├── AutoAR.cpython-39.pyc + │   │   │   ├── AutoMA.cpython-39.pyc + │   │   │   ├── AutoStationarity.cpython-39.pyc + │   │   │   ├── BivariateScatterPlots.cpython-39.pyc + │   │   │   ├── BoxPierce.cpython-39.pyc + │   │   │   ├── ChiSquaredFeaturesTable.cpython-39.pyc + │   │   │   ├── ClassImbalance.cpython-39.pyc + │   │   │   ├── DatasetDescription.cpython-39.pyc + │   │   │   ├── DatasetSplit.cpython-39.pyc + │   │   │   ├── DescriptiveStatistics.cpython-39.pyc + │   │   │   ├── DickeyFullerGLS.cpython-39.pyc + │   │   │   ├── Duplicates.cpython-39.pyc + │   │   │   ├── EngleGrangerCoint.cpython-39.pyc + │   │   │   ├── FeatureTargetCorrelationPlot.cpython-39.pyc + │   │   │   ├── HighCardinality.cpython-39.pyc + │   │   │   ├── HighPearsonCorrelation.cpython-39.pyc + │   │   │   ├── IQROutliersBarPlot.cpython-39.pyc + │   │   │   ├── IQROutliersTable.cpython-39.pyc + │   │   │   ├── IsolationForestOutliers.cpython-39.pyc + │   │   │   ├── JarqueBera.cpython-39.pyc + │   │   │   ├── KPSS.cpython-39.pyc + │   │   │   ├── LJungBox.cpython-39.pyc + │   │   │   ├── LaggedCorrelationHeatmap.cpython-39.pyc + │   │   │   ├── MissingValues.cpython-39.pyc + │   │   │   ├── MissingValuesBarPlot.cpython-39.pyc + │   │   │   ├── MutualInformation.cpython-39.pyc + │   │   │   ├── PearsonCorrelationMatrix.cpython-39.pyc + │   │   │   ├── PhillipsPerronArch.cpython-39.pyc + │   │   │   ├── ProtectedClassesCombination.cpython-39.pyc + │   │   │   ├── ProtectedClassesDescription.cpython-39.pyc + │   │   │   ├── ProtectedClassesDisparity.cpython-39.pyc + │   │   │   ├── ProtectedClassesThresholdOptimizer.cpython-39.pyc + │   │   │   ├── RollingStatsPlot.cpython-39.pyc + │   │   │   ├── RunsTest.cpython-39.pyc + │   │   │   ├── ScatterPlot.cpython-39.pyc + │   │   │   ├── ScoreBandDefaultRates.cpython-39.pyc + │   │   │   ├── SeasonalDecompose.cpython-39.pyc + │   │   │   ├── ShapiroWilk.cpython-39.pyc + │   │   │   ├── Skewness.cpython-39.pyc + │   │   │   ├── SpreadPlot.cpython-39.pyc + │   │   │   ├── TabularCategoricalBarPlots.cpython-39.pyc + │   │   │   ├── TabularDateTimeHistograms.cpython-39.pyc + │   │   │   ├── TabularDescriptionTables.cpython-39.pyc + │   │   │   ├── TabularNumericalHistograms.cpython-39.pyc + │   │   │   ├── TargetRateBarPlots.cpython-39.pyc + │   │   │   ├── TimeSeriesDescription.cpython-39.pyc + │   │   │   ├── TimeSeriesDescriptiveStatistics.cpython-39.pyc + │   │   │   ├── TimeSeriesFrequency.cpython-39.pyc + │   │   │   ├── TimeSeriesHistogram.cpython-39.pyc + │   │   │   ├── TimeSeriesLinePlot.cpython-39.pyc + │   │   │   ├── TimeSeriesMissingValues.cpython-39.pyc + │   │   │   ├── TimeSeriesOutliers.cpython-39.pyc + │   │   │   ├── TooManyZeroValues.cpython-39.pyc + │   │   │   ├── UniqueRows.cpython-39.pyc + │   │   │   ├── WOEBinPlots.cpython-39.pyc + │   │   │   ├── WOEBinTable.cpython-39.pyc + │   │   │   ├── ZivotAndrewsArch.cpython-39.pyc + │   │   │   └── __init__.cpython-39.pyc + │   │   └── nlp + │   │   ├── CommonWords.py + │   │   ├── Hashtags.py + │   │   ├── LanguageDetection.py + │   │   ├── Mentions.py + │   │   ├── PolarityAndSubjectivity.py + │   │   ├── Punctuations.py + │   │   ├── Sentiment.py + │   │   ├── StopWords.py + │   │   ├── TextDescription.py + │   │   ├── Toxicity.py + │   │   ├── __init__.py + │   │   └── __pycache__ + │   │   ├── CommonWords.cpython-39.pyc + │   │   ├── Hashtags.cpython-39.pyc + │   │   ├── LanguageDetection.cpython-39.pyc + │   │   ├── Mentions.cpython-39.pyc + │   │   ├── PolarityAndSubjectivity.cpython-39.pyc + │   │   ├── Punctuations.cpython-39.pyc + │   │   ├── Sentiment.cpython-39.pyc + │   │   ├── StopWords.cpython-39.pyc + │   │   ├── TextDescription.cpython-39.pyc + │   │   ├── Toxicity.cpython-39.pyc + │   │   └── __init__.cpython-39.pyc + │   ├── decorator.py + │   ├── load.py + │   ├── model_validation + │   │   ├── BertScore.py + │   │   ├── BleuScore.py + │   │   ├── ClusterSizeDistribution.py + │   │   ├── ContextualRecall.py + │   │   ├── FeaturesAUC.py + │   │   ├── MeteorScore.py + │   │   ├── ModelMetadata.py + │   │   ├── ModelPredictionResiduals.py + │   │   ├── RegardScore.py + │   │   ├── RegressionResidualsPlot.py + │   │   ├── RougeScore.py + │   │   ├── TimeSeriesPredictionWithCI.py + │   │   ├── TimeSeriesPredictionsPlot.py + │   │   ├── TimeSeriesR2SquareBySegments.py + │   │   ├── TokenDisparity.py + │   │   ├── ToxicityScore.py + │   │   ├── __init__.py + │   │   ├── __pycache__ + │   │   │   ├── BertScore.cpython-39.pyc + │   │   │   ├── BleuScore.cpython-39.pyc + │   │   │   ├── ClusterSizeDistribution.cpython-39.pyc + │   │   │   ├── ContextualRecall.cpython-39.pyc + │   │   │   ├── FeaturesAUC.cpython-39.pyc + │   │   │   ├── MeteorScore.cpython-39.pyc + │   │   │   ├── ModelMetadata.cpython-39.pyc + │   │   │   ├── ModelPredictionResiduals.cpython-39.pyc + │   │   │   ├── RegardScore.cpython-39.pyc + │   │   │   ├── RegressionResidualsPlot.cpython-39.pyc + │   │   │   ├── RougeScore.cpython-39.pyc + │   │   │   ├── TimeSeriesPredictionWithCI.cpython-39.pyc + │   │   │   ├── TimeSeriesPredictionsPlot.cpython-39.pyc + │   │   │   ├── TimeSeriesR2SquareBySegments.cpython-39.pyc + │   │   │   ├── TokenDisparity.cpython-39.pyc + │   │   │   ├── ToxicityScore.cpython-39.pyc + │   │   │   └── __init__.cpython-39.pyc + │   │   ├── embeddings + │   │   │   ├── ClusterDistribution.py + │   │   │   ├── CosineSimilarityComparison.py + │   │   │   ├── CosineSimilarityDistribution.py + │   │   │   ├── CosineSimilarityHeatmap.py + │   │   │   ├── DescriptiveAnalytics.py + │   │   │   ├── EmbeddingsVisualization2D.py + │   │   │   ├── EuclideanDistanceComparison.py + │   │   │   ├── EuclideanDistanceHeatmap.py + │   │   │   ├── PCAComponentsPairwisePlots.py + │   │   │   ├── StabilityAnalysisKeyword.py + │   │   │   ├── StabilityAnalysisRandomNoise.py + │   │   │   ├── StabilityAnalysisSynonyms.py + │   │   │   ├── StabilityAnalysisTranslation.py + │   │   │   ├── TSNEComponentsPairwisePlots.py + │   │   │   └── utils.py + │   │   ├── ragas + │   │   │   ├── AnswerCorrectness.py + │   │   │   ├── AspectCritic.py + │   │   │   ├── ContextEntityRecall.py + │   │   │   ├── ContextPrecision.py + │   │   │   ├── ContextPrecisionWithoutReference.py + │   │   │   ├── ContextRecall.py + │   │   │   ├── Faithfulness.py + │   │   │   ├── NoiseSensitivity.py + │   │   │   ├── ResponseRelevancy.py + │   │   │   ├── SemanticSimilarity.py + │   │   │   └── utils.py + │   │   ├── sklearn + │   │   │   ├── AdjustedMutualInformation.py + │   │   │   ├── AdjustedRandIndex.py + │   │   │   ├── CalibrationCurve.py + │   │   │   ├── ClassifierPerformance.py + │   │   │   ├── ClassifierThresholdOptimization.py + │   │   │   ├── ClusterCosineSimilarity.py + │   │   │   ├── ClusterPerformanceMetrics.py + │   │   │   ├── CompletenessScore.py + │   │   │   ├── ConfusionMatrix.py + │   │   │   ├── FeatureImportance.py + │   │   │   ├── FowlkesMallowsScore.py + │   │   │   ├── HomogeneityScore.py + │   │   │   ├── HyperParametersTuning.py + │   │   │   ├── KMeansClustersOptimization.py + │   │   │   ├── MinimumAccuracy.py + │   │   │   ├── MinimumF1Score.py + │   │   │   ├── MinimumROCAUCScore.py + │   │   │   ├── ModelParameters.py + │   │   │   ├── ModelsPerformanceComparison.py + │   │   │   ├── OverfitDiagnosis.py + │   │   │   ├── PermutationFeatureImportance.py + │   │   │   ├── PopulationStabilityIndex.py + │   │   │   ├── PrecisionRecallCurve.py + │   │   │   ├── ROCCurve.py + │   │   │   ├── RegressionErrors.py + │   │   │   ├── RegressionErrorsComparison.py + │   │   │   ├── RegressionPerformance.py + │   │   │   ├── RegressionR2Square.py + │   │   │   ├── RegressionR2SquareComparison.py + │   │   │   ├── RobustnessDiagnosis.py + │   │   │   ├── SHAPGlobalImportance.py + │   │   │   ├── ScoreProbabilityAlignment.py + │   │   │   ├── SilhouettePlot.py + │   │   │   ├── TrainingTestDegradation.py + │   │   │   ├── VMeasure.py + │   │   │   ├── WeakspotsDiagnosis.py + │   │   │   ├── __init__.py + │   │   │   └── __pycache__ + │   │   │   ├── AdjustedMutualInformation.cpython-39.pyc + │   │   │   ├── AdjustedRandIndex.cpython-39.pyc + │   │   │   ├── CalibrationCurve.cpython-39.pyc + │   │   │   ├── ClassifierPerformance.cpython-39.pyc + │   │   │   ├── ClassifierThresholdOptimization.cpython-39.pyc + │   │   │   ├── ClusterCosineSimilarity.cpython-39.pyc + │   │   │   ├── ClusterPerformanceMetrics.cpython-39.pyc + │   │   │   ├── CompletenessScore.cpython-39.pyc + │   │   │   ├── ConfusionMatrix.cpython-39.pyc + │   │   │   ├── FeatureImportance.cpython-39.pyc + │   │   │   ├── FowlkesMallowsScore.cpython-39.pyc + │   │   │   ├── HomogeneityScore.cpython-39.pyc + │   │   │   ├── HyperParametersTuning.cpython-39.pyc + │   │   │   ├── KMeansClustersOptimization.cpython-39.pyc + │   │   │   ├── MinimumAccuracy.cpython-39.pyc + │   │   │   ├── MinimumF1Score.cpython-39.pyc + │   │   │   ├── MinimumROCAUCScore.cpython-39.pyc + │   │   │   ├── ModelParameters.cpython-39.pyc + │   │   │   ├── ModelsPerformanceComparison.cpython-39.pyc + │   │   │   ├── OverfitDiagnosis.cpython-39.pyc + │   │   │   ├── PermutationFeatureImportance.cpython-39.pyc + │   │   │   ├── PopulationStabilityIndex.cpython-39.pyc + │   │   │   ├── PrecisionRecallCurve.cpython-39.pyc + │   │   │   ├── ROCCurve.cpython-39.pyc + │   │   │   ├── RegressionErrors.cpython-39.pyc + │   │   │   ├── RegressionErrorsComparison.cpython-39.pyc + │   │   │   ├── RegressionPerformance.cpython-39.pyc + │   │   │   ├── RegressionR2Square.cpython-39.pyc + │   │   │   ├── RegressionR2SquareComparison.cpython-39.pyc + │   │   │   ├── RobustnessDiagnosis.cpython-39.pyc + │   │   │   ├── SHAPGlobalImportance.cpython-39.pyc + │   │   │   ├── ScoreProbabilityAlignment.cpython-39.pyc + │   │   │   ├── SilhouettePlot.cpython-39.pyc + │   │   │   ├── TrainingTestDegradation.cpython-39.pyc + │   │   │   ├── VMeasure.cpython-39.pyc + │   │   │   ├── WeakspotsDiagnosis.cpython-39.pyc + │   │   │   └── __init__.cpython-39.pyc + │   │   └── statsmodels + │   │   ├── AutoARIMA.py + │   │   ├── CumulativePredictionProbabilities.py + │   │   ├── DurbinWatsonTest.py + │   │   ├── GINITable.py + │   │   ├── KolmogorovSmirnov.py + │   │   ├── Lilliefors.py + │   │   ├── PredictionProbabilitiesHistogram.py + │   │   ├── RegressionCoeffs.py + │   │   ├── RegressionFeatureSignificance.py + │   │   ├── RegressionModelForecastPlot.py + │   │   ├── RegressionModelForecastPlotLevels.py + │   │   ├── RegressionModelSensitivityPlot.py + │   │   ├── RegressionModelSummary.py + │   │   ├── RegressionPermutationFeatureImportance.py + │   │   ├── ScorecardHistogram.py + │   │   ├── __init__.py + │   │   ├── __pycache__ + │   │   │   ├── AutoARIMA.cpython-39.pyc + │   │   │   ├── CumulativePredictionProbabilities.cpython-39.pyc + │   │   │   ├── DurbinWatsonTest.cpython-39.pyc + │   │   │   ├── GINITable.cpython-39.pyc + │   │   │   ├── KolmogorovSmirnov.cpython-39.pyc + │   │   │   ├── Lilliefors.cpython-39.pyc + │   │   │   ├── PredictionProbabilitiesHistogram.cpython-39.pyc + │   │   │   ├── RegressionCoeffs.cpython-39.pyc + │   │   │   ├── RegressionFeatureSignificance.cpython-39.pyc + │   │   │   ├── RegressionModelForecastPlot.cpython-39.pyc + │   │   │   ├── RegressionModelForecastPlotLevels.cpython-39.pyc + │   │   │   ├── RegressionModelSensitivityPlot.cpython-39.pyc + │   │   │   ├── RegressionModelSummary.cpython-39.pyc + │   │   │   ├── RegressionPermutationFeatureImportance.cpython-39.pyc + │   │   │   ├── ScorecardHistogram.cpython-39.pyc + │   │   │   ├── __init__.cpython-39.pyc + │   │   │   └── statsutils.cpython-39.pyc + │   │   └── statsutils.py + │   ├── ongoing_monitoring + │   │   ├── CalibrationCurveDrift.py + │   │   ├── ClassDiscriminationDrift.py + │   │   ├── ClassImbalanceDrift.py + │   │   ├── ClassificationAccuracyDrift.py + │   │   ├── ConfusionMatrixDrift.py + │   │   ├── CumulativePredictionProbabilitiesDrift.py + │   │   ├── FeatureDrift.py + │   │   ├── PredictionAcrossEachFeature.py + │   │   ├── PredictionCorrelation.py + │   │   ├── PredictionProbabilitiesHistogramDrift.py + │   │   ├── PredictionQuantilesAcrossFeatures.py + │   │   ├── ROCCurveDrift.py + │   │   ├── ScoreBandsDrift.py + │   │   ├── ScorecardHistogramDrift.py + │   │   └── TargetPredictionDistributionPlot.py + │   ├── output.py + │   ├── prompt_validation + │   │   ├── Bias.py + │   │   ├── Clarity.py + │   │   ├── Conciseness.py + │   │   ├── Delimitation.py + │   │   ├── NegativeInstruction.py + │   │   ├── Robustness.py + │   │   ├── Specificity.py + │   │   ├── __init__.py + │   │   ├── __pycache__ + │   │   │   ├── Bias.cpython-39.pyc + │   │   │   ├── Clarity.cpython-39.pyc + │   │   │   ├── Conciseness.cpython-39.pyc + │   │   │   ├── Delimitation.cpython-39.pyc + │   │   │   ├── NegativeInstruction.cpython-39.pyc + │   │   │   ├── Robustness.cpython-39.pyc + │   │   │   ├── Specificity.cpython-39.pyc + │   │   │   ├── __init__.cpython-39.pyc + │   │   │   └── ai_powered_test.cpython-39.pyc + │   │   └── ai_powered_test.py + │   ├── run.py + │   ├── test_providers.py + │   └── utils.py + ├── unit_metrics + │   ├── __init__.py + │   ├── __pycache__ + │   │   └── __init__.cpython-39.pyc + │   ├── classification + │   │   ├── Accuracy.py + │   │   ├── F1.py + │   │   ├── Precision.py + │   │   ├── ROC_AUC.py + │   │   └── Recall.py + │   └── regression + │   ├── AdjustedRSquaredScore.py + │   ├── GiniCoefficient.py + │   ├── HuberLoss.py + │   ├── KolmogorovSmirnovStatistic.py + │   ├── MeanAbsoluteError.py + │   ├── MeanAbsolutePercentageError.py + │   ├── MeanBiasDeviation.py + │   ├── MeanSquaredError.py + │   ├── QuantileLoss.py + │   ├── RSquaredScore.py + │   └── RootMeanSquaredError.py + ├── utils.py + └── vm_models + ├── __init__.py + ├── __pycache__ + │   ├── __init__.cpython-39.pyc + │   ├── figure.cpython-39.pyc + │   ├── input.cpython-39.pyc + │   └── model.cpython-39.pyc + ├── dataset + │   ├── __init__.py + │   ├── __pycache__ + │   │   ├── __init__.cpython-39.pyc + │   │   ├── dataset.cpython-39.pyc + │   │   └── utils.cpython-39.pyc + │   ├── dataset.py + │   └── utils.py + ├── figure.py + ├── input.py + ├── model.py + ├── result + │   ├── __init__.py + │   ├── __pycache__ + │   │   ├── __init__.cpython-39.pyc + │   │   ├── result.cpython-39.pyc + │   │   └── utils.cpython-39.pyc + │   ├── result.jinja + │   ├── result.py + │   └── utils.py + └── test_suite + ├── __init__.py + ├── __pycache__ + │   ├── runner.cpython-39.pyc + │   ├── summary.cpython-39.pyc + │   ├── test.cpython-39.pyc + │   └── test_suite.cpython-39.pyc + ├── runner.py + ├── summary.py + ├── test.py + └── test_suite.py + +141 directories, 1076 files diff --git a/docs/validmind/errors.html b/docs/validmind/errors.html deleted file mode 100644 index 376a86658..000000000 --- a/docs/validmind/errors.html +++ /dev/null @@ -1,927 +0,0 @@ - - - - - - - - - -errors - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index d4060a64c..f9621fabd 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -312,7 +312,7 @@ Base class for ValidMind Input types **Methods** -### [with_options[()]{.muted}](#with_options) +#### [with_options[()]{.muted}](#with_options) ```python with_options(self, kwargs) diff --git a/docs/validmind/errors_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css b/docs/validmind/vm_models_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css similarity index 100% rename from docs/validmind/errors_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css rename to docs/validmind/vm_models_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css diff --git a/docs/validmind/errors_files/libs/bootstrap/bootstrap-icons.css b/docs/validmind/vm_models_files/libs/bootstrap/bootstrap-icons.css similarity index 100% rename from docs/validmind/errors_files/libs/bootstrap/bootstrap-icons.css rename to docs/validmind/vm_models_files/libs/bootstrap/bootstrap-icons.css diff --git a/docs/validmind/errors_files/libs/bootstrap/bootstrap-icons.woff b/docs/validmind/vm_models_files/libs/bootstrap/bootstrap-icons.woff similarity index 100% rename from docs/validmind/errors_files/libs/bootstrap/bootstrap-icons.woff rename to docs/validmind/vm_models_files/libs/bootstrap/bootstrap-icons.woff diff --git a/docs/validmind/errors_files/libs/bootstrap/bootstrap.min.js b/docs/validmind/vm_models_files/libs/bootstrap/bootstrap.min.js similarity index 100% rename from docs/validmind/errors_files/libs/bootstrap/bootstrap.min.js rename to docs/validmind/vm_models_files/libs/bootstrap/bootstrap.min.js diff --git a/docs/validmind/errors_files/libs/clipboard/clipboard.min.js b/docs/validmind/vm_models_files/libs/clipboard/clipboard.min.js similarity index 100% rename from docs/validmind/errors_files/libs/clipboard/clipboard.min.js rename to docs/validmind/vm_models_files/libs/clipboard/clipboard.min.js diff --git a/docs/validmind/errors_files/libs/quarto-html/anchor.min.js b/docs/validmind/vm_models_files/libs/quarto-html/anchor.min.js similarity index 100% rename from docs/validmind/errors_files/libs/quarto-html/anchor.min.js rename to docs/validmind/vm_models_files/libs/quarto-html/anchor.min.js diff --git a/docs/validmind/errors_files/libs/quarto-html/popper.min.js b/docs/validmind/vm_models_files/libs/quarto-html/popper.min.js similarity index 100% rename from docs/validmind/errors_files/libs/quarto-html/popper.min.js rename to docs/validmind/vm_models_files/libs/quarto-html/popper.min.js diff --git a/docs/validmind/errors_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css b/docs/validmind/vm_models_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css similarity index 100% rename from docs/validmind/errors_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css rename to docs/validmind/vm_models_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css diff --git a/docs/validmind/errors_files/libs/quarto-html/quarto.js b/docs/validmind/vm_models_files/libs/quarto-html/quarto.js similarity index 100% rename from docs/validmind/errors_files/libs/quarto-html/quarto.js rename to docs/validmind/vm_models_files/libs/quarto-html/quarto.js diff --git a/docs/validmind/errors_files/libs/quarto-html/tippy.css b/docs/validmind/vm_models_files/libs/quarto-html/tippy.css similarity index 100% rename from docs/validmind/errors_files/libs/quarto-html/tippy.css rename to docs/validmind/vm_models_files/libs/quarto-html/tippy.css diff --git a/docs/validmind/errors_files/libs/quarto-html/tippy.umd.min.js b/docs/validmind/vm_models_files/libs/quarto-html/tippy.umd.min.js similarity index 100% rename from docs/validmind/errors_files/libs/quarto-html/tippy.umd.min.js rename to docs/validmind/vm_models_files/libs/quarto-html/tippy.umd.min.js From b67c020144219951b0ca64ed851fff2a21525878 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Mon, 27 Jan 2025 13:58:43 -0800 Subject: [PATCH 022/207] Another save point --- docs/validmind/vm_models.qmd | 2 +- ...p-973236bd072d72a04ee9cd82dcc9cb29.min.css | 12 - .../libs/bootstrap/bootstrap-icons.css | 2078 ----------------- .../libs/bootstrap/bootstrap-icons.woff | Bin 176200 -> 0 bytes .../libs/bootstrap/bootstrap.min.js | 7 - .../libs/clipboard/clipboard.min.js | 7 - .../libs/quarto-html/anchor.min.js | 9 - .../libs/quarto-html/popper.min.js | 6 - ...hting-549806ee2085284f45b00abea8c6df48.css | 205 -- .../libs/quarto-html/quarto.js | 911 -------- .../libs/quarto-html/tippy.css | 1 - .../libs/quarto-html/tippy.umd.min.js | 2 - 12 files changed, 1 insertion(+), 3239 deletions(-) delete mode 100644 docs/validmind/vm_models_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css delete mode 100644 docs/validmind/vm_models_files/libs/bootstrap/bootstrap-icons.css delete mode 100644 docs/validmind/vm_models_files/libs/bootstrap/bootstrap-icons.woff delete mode 100644 docs/validmind/vm_models_files/libs/bootstrap/bootstrap.min.js delete mode 100644 docs/validmind/vm_models_files/libs/clipboard/clipboard.min.js delete mode 100644 docs/validmind/vm_models_files/libs/quarto-html/anchor.min.js delete mode 100644 docs/validmind/vm_models_files/libs/quarto-html/popper.min.js delete mode 100644 docs/validmind/vm_models_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css delete mode 100644 docs/validmind/vm_models_files/libs/quarto-html/quarto.js delete mode 100644 docs/validmind/vm_models_files/libs/quarto-html/tippy.css delete mode 100644 docs/validmind/vm_models_files/libs/quarto-html/tippy.umd.min.js diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index f9621fabd..d4060a64c 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -312,7 +312,7 @@ Base class for ValidMind Input types **Methods** -#### [with_options[()]{.muted}](#with_options) +### [with_options[()]{.muted}](#with_options) ```python with_options(self, kwargs) diff --git a/docs/validmind/vm_models_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css b/docs/validmind/vm_models_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css deleted file mode 100644 index d6064cbbb..000000000 --- a/docs/validmind/vm_models_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css +++ /dev/null @@ -1,12 +0,0 @@ -/*! - * Bootstrap v5.3.1 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root,[data-bs-theme=light]{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-black: #000;--bs-white: #ffffff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #dee2e6;--bs-primary: #0d6efd;--bs-secondary: #6c757d;--bs-success: #198754;--bs-info: #0dcaf0;--bs-warning: #ffc107;--bs-danger: #dc3545;--bs-light: #f8f9fa;--bs-dark: #212529;--bs-default-rgb: 222, 226, 230;--bs-primary-rgb: 13, 110, 253;--bs-secondary-rgb: 108, 117, 125;--bs-success-rgb: 25, 135, 84;--bs-info-rgb: 13, 202, 240;--bs-warning-rgb: 255, 193, 7;--bs-danger-rgb: 220, 53, 69;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 33, 37, 41;--bs-primary-text-emphasis: #052c65;--bs-secondary-text-emphasis: #2b2f32;--bs-success-text-emphasis: #0a3622;--bs-info-text-emphasis: #055160;--bs-warning-text-emphasis: #664d03;--bs-danger-text-emphasis: #58151c;--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: #cfe2ff;--bs-secondary-bg-subtle: #e2e3e5;--bs-success-bg-subtle: #d1e7dd;--bs-info-bg-subtle: #cff4fc;--bs-warning-bg-subtle: #fff3cd;--bs-danger-bg-subtle: #f8d7da;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #9ec5fe;--bs-secondary-border-subtle: #c4c8cb;--bs-success-border-subtle: #a3cfbb;--bs-info-border-subtle: #9eeaf9;--bs-warning-border-subtle: #ffe69c;--bs-danger-border-subtle: #f1aeb5;--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #212529;--bs-body-color-rgb: 33, 37, 41;--bs-body-bg: #ffffff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb: 33, 37, 41;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233, 236, 239;--bs-tertiary-color: rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb: 33, 37, 41;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #0d6efd;--bs-link-color-rgb: 13, 110, 253;--bs-link-decoration: underline;--bs-link-hover-color: #0a58ca;--bs-link-hover-color-rgb: 10, 88, 202;--bs-code-color: #7d12ba;--bs-highlight-bg: #fff3cd;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: white;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.375rem;--bs-border-radius-sm: 0.25rem;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(13, 110, 253, 0.25);--bs-form-valid-color: #198754;--bs-form-valid-border-color: #198754;--bs-form-invalid-color: #dc3545;--bs-form-invalid-border-color: #dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #ffffff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: #6ea8fe;--bs-secondary-text-emphasis: #a7acb1;--bs-success-text-emphasis: #75b798;--bs-info-text-emphasis: #6edff6;--bs-warning-text-emphasis: #ffda6a;--bs-danger-text-emphasis: #ea868f;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #031633;--bs-secondary-bg-subtle: #161719;--bs-success-bg-subtle: #051b11;--bs-info-bg-subtle: #032830;--bs-warning-bg-subtle: #332701;--bs-danger-bg-subtle: #2c0b0e;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #084298;--bs-secondary-border-subtle: #41464b;--bs-success-border-subtle: #0f5132;--bs-info-border-subtle: #087990;--bs-warning-border-subtle: #997404;--bs-danger-border-subtle: #842029;--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #6ea8fe;--bs-link-hover-color: #8bb9fe;--bs-link-color-rgb: 110, 168, 254;--bs-link-hover-color-rgb: 139, 185, 254;--bs-code-color: white;--bs-border-color: #495057;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #75b798;--bs-form-valid-border-color: #75b798;--bs-form-invalid-color: #ea868f;--bs-form-invalid-border-color: #ea868f}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #e9ecef}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f8f9fa;line-height:1.5;padding:.5rem;border:1px solid var(--bs-border-color, white);border-radius:.375rem}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;border-radius:.375rem;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#212529;border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(33,37,41,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #fff;border-radius:.375rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(33,37,41,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #212529;--bs-table-bg: #ffffff;--bs-table-border-color: white;--bs-table-accent-bg: transparent;--bs-table-striped-color: #212529;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #212529;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #212529;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #909294}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #000;--bs-table-bg: #cfe2ff;--bs-table-border-color: #bacbe6;--bs-table-striped-bg: #c5d7f2;--bs-table-striped-color: #000;--bs-table-active-bg: #bacbe6;--bs-table-active-color: #000;--bs-table-hover-bg: #bfd1ec;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #000;--bs-table-bg: #e2e3e5;--bs-table-border-color: #cbccce;--bs-table-striped-bg: #d7d8da;--bs-table-striped-color: #000;--bs-table-active-bg: #cbccce;--bs-table-active-color: #000;--bs-table-hover-bg: #d1d2d4;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #000;--bs-table-bg: #d1e7dd;--bs-table-border-color: #bcd0c7;--bs-table-striped-bg: #c7dbd2;--bs-table-striped-color: #000;--bs-table-active-bg: #bcd0c7;--bs-table-active-color: #000;--bs-table-hover-bg: #c1d6cc;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #000;--bs-table-bg: #cff4fc;--bs-table-border-color: #badce3;--bs-table-striped-bg: #c5e8ef;--bs-table-striped-color: #000;--bs-table-active-bg: #badce3;--bs-table-active-color: #000;--bs-table-hover-bg: #bfe2e9;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #000;--bs-table-bg: #fff3cd;--bs-table-border-color: #e6dbb9;--bs-table-striped-bg: #f2e7c3;--bs-table-striped-color: #000;--bs-table-active-bg: #e6dbb9;--bs-table-active-color: #000;--bs-table-hover-bg: #ece1be;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #000;--bs-table-bg: #f8d7da;--bs-table-border-color: #dfc2c4;--bs-table-striped-bg: #eccccf;--bs-table-striped-color: #000;--bs-table-active-bg: #dfc2c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e5c7ca;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #f8f9fa;--bs-table-border-color: #dfe0e1;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #ffffff;--bs-table-bg: #212529;--bs-table-border-color: #373b3e;--bs-table-striped-bg: #2c3034;--bs-table-striped-color: #ffffff;--bs-table-active-bg: #373b3e;--bs-table-active-color: #ffffff;--bs-table-hover-bg: #323539;--bs-table-hover-color: #ffffff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(33,37,41,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #fff;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:rgba(33,37,41,.75);opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#212529;background-color:#f8f9fa;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e9ecef}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem;border-radius:.25rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:.375rem}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:.375rem}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #fff;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem;border-radius:.25rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #ffffff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid #fff;print-color-adjust:exact}.form-check-input[type=checkbox],.shiny-input-container .checkbox input[type=checkbox],.shiny-input-container .checkbox-inline input[type=checkbox],.shiny-input-container .radio input[type=checkbox],.shiny-input-container .radio-inline input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23ffffff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(33,37,41,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(33,37,41,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff;border-radius:.375rem}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#e9ecef}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:1px solid #fff;border-radius:.375rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;border-radius:.25rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#198754;border-radius:.375rem}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#198754;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#198754}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#198754}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#198754}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#dc3545;border-radius:.375rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#dc3545}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#dc3545}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#dc3545}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #212529;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.375rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #000;--bs-btn-bg: #dee2e6;--bs-btn-border-color: #dee2e6;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #e3e6ea;--bs-btn-hover-border-color: #e1e5e9;--bs-btn-focus-shadow-rgb: 189, 192, 196;--bs-btn-active-color: #000;--bs-btn-active-bg: #e5e8eb;--bs-btn-active-border-color: #e1e5e9;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #dee2e6;--bs-btn-disabled-border-color: #dee2e6}.btn-primary{--bs-btn-color: #ffffff;--bs-btn-bg: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #0b5ed7;--bs-btn-hover-border-color: #0a58ca;--bs-btn-focus-shadow-rgb: 49, 132, 253;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #0a58ca;--bs-btn-active-border-color: #0a53be;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #0d6efd;--bs-btn-disabled-border-color: #0d6efd}.btn-secondary{--bs-btn-color: #ffffff;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #5c636a;--bs-btn-hover-border-color: #565e64;--bs-btn-focus-shadow-rgb: 130, 138, 145;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #565e64;--bs-btn-active-border-color: #51585e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}.btn-success{--bs-btn-color: #ffffff;--bs-btn-bg: #198754;--bs-btn-border-color: #198754;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #157347;--bs-btn-hover-border-color: #146c43;--bs-btn-focus-shadow-rgb: 60, 153, 110;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #146c43;--bs-btn-active-border-color: #13653f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #198754;--bs-btn-disabled-border-color: #198754}.btn-info{--bs-btn-color: #000;--bs-btn-bg: #0dcaf0;--bs-btn-border-color: #0dcaf0;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #31d2f2;--bs-btn-hover-border-color: #25cff2;--bs-btn-focus-shadow-rgb: 11, 172, 204;--bs-btn-active-color: #000;--bs-btn-active-bg: #3dd5f3;--bs-btn-active-border-color: #25cff2;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #0dcaf0;--bs-btn-disabled-border-color: #0dcaf0}.btn-warning{--bs-btn-color: #000;--bs-btn-bg: #ffc107;--bs-btn-border-color: #ffc107;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ffca2c;--bs-btn-hover-border-color: #ffc720;--bs-btn-focus-shadow-rgb: 217, 164, 6;--bs-btn-active-color: #000;--bs-btn-active-bg: #ffcd39;--bs-btn-active-border-color: #ffc720;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #ffc107;--bs-btn-disabled-border-color: #ffc107}.btn-danger{--bs-btn-color: #ffffff;--bs-btn-bg: #dc3545;--bs-btn-border-color: #dc3545;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #bb2d3b;--bs-btn-hover-border-color: #b02a37;--bs-btn-focus-shadow-rgb: 225, 83, 97;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #b02a37;--bs-btn-active-border-color: #a52834;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #dc3545;--bs-btn-disabled-border-color: #dc3545}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #d3d4d5;--bs-btn-hover-border-color: #c6c7c8;--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: #c6c7c8;--bs-btn-active-border-color: #babbbc;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}.btn-dark{--bs-btn-color: #ffffff;--bs-btn-bg: #212529;--bs-btn-border-color: #212529;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #424649;--bs-btn-hover-border-color: #373b3e;--bs-btn-focus-shadow-rgb: 66, 70, 73;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #4d5154;--bs-btn-active-border-color: #373b3e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #212529;--bs-btn-disabled-border-color: #212529}.btn-outline-default{--bs-btn-color: #dee2e6;--bs-btn-border-color: #dee2e6;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #dee2e6;--bs-btn-hover-border-color: #dee2e6;--bs-btn-focus-shadow-rgb: 222, 226, 230;--bs-btn-active-color: #000;--bs-btn-active-bg: #dee2e6;--bs-btn-active-border-color: #dee2e6;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #dee2e6;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #dee2e6;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #0d6efd;--bs-btn-hover-border-color: #0d6efd;--bs-btn-focus-shadow-rgb: 13, 110, 253;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #0d6efd;--bs-btn-active-border-color: #0d6efd;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #0d6efd;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #0d6efd;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #6c757d;--bs-btn-hover-border-color: #6c757d;--bs-btn-focus-shadow-rgb: 108, 117, 125;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #6c757d;--bs-btn-active-border-color: #6c757d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6c757d;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #198754;--bs-btn-border-color: #198754;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #198754;--bs-btn-hover-border-color: #198754;--bs-btn-focus-shadow-rgb: 25, 135, 84;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #198754;--bs-btn-active-border-color: #198754;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #198754;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #198754;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #0dcaf0;--bs-btn-border-color: #0dcaf0;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #0dcaf0;--bs-btn-hover-border-color: #0dcaf0;--bs-btn-focus-shadow-rgb: 13, 202, 240;--bs-btn-active-color: #000;--bs-btn-active-bg: #0dcaf0;--bs-btn-active-border-color: #0dcaf0;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #0dcaf0;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #0dcaf0;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #ffc107;--bs-btn-border-color: #ffc107;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ffc107;--bs-btn-hover-border-color: #ffc107;--bs-btn-focus-shadow-rgb: 255, 193, 7;--bs-btn-active-color: #000;--bs-btn-active-bg: #ffc107;--bs-btn-active-border-color: #ffc107;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffc107;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ffc107;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #dc3545;--bs-btn-border-color: #dc3545;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #dc3545;--bs-btn-hover-border-color: #dc3545;--bs-btn-focus-shadow-rgb: 220, 53, 69;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #dc3545;--bs-btn-active-border-color: #dc3545;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #dc3545;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #dc3545;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #f8f9fa;--bs-btn-hover-border-color: #f8f9fa;--bs-btn-focus-shadow-rgb: 248, 249, 250;--bs-btn-active-color: #000;--bs-btn-active-bg: #f8f9fa;--bs-btn-active-border-color: #f8f9fa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f8f9fa;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f8f9fa;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #212529;--bs-btn-border-color: #212529;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #212529;--bs-btn-hover-border-color: #212529;--bs-btn-focus-shadow-rgb: 33, 37, 41;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #212529;--bs-btn-active-border-color: #212529;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #212529;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #212529;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #0d6efd;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #0a58ca;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #0a58ca;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 49, 132, 253;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.25rem}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #212529;--bs-dropdown-bg: #ffffff;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-border-radius: 0.375rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.375rem - 1px);--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #212529;--bs-dropdown-link-hover-color: #212529;--bs-dropdown-link-hover-bg: #f8f9fa;--bs-dropdown-link-active-color: #ffffff;--bs-dropdown-link-active-bg: #0d6efd;--bs-dropdown-link-disabled-color: rgba(33, 37, 41, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #ffffff;--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #ffffff;--bs-dropdown-link-active-bg: #0d6efd;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.375rem}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #0d6efd;--bs-nav-link-hover-color: #0a58ca;--bs-nav-link-disabled-color: rgba(33, 37, 41, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: white;--bs-nav-tabs-border-radius: 0.375rem;--bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef white;--bs-nav-tabs-link-active-color: #000;--bs-nav-tabs-link-active-bg: #ffffff;--bs-nav-tabs-link-active-border-color: white white #ffffff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: 0.375rem;--bs-nav-pills-link-active-color: #ffffff;--bs-nav-pills-link-active-bg: #0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 0.5rem;--bs-navbar-color: #fdfefe;--bs-navbar-hover-color: rgba(253, 254, 255, 0.8);--bs-navbar-disabled-color: rgba(253, 254, 254, 0.75);--bs-navbar-active-color: #fdfeff;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #fdfefe;--bs-navbar-brand-hover-color: #fdfeff;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfefe' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(253, 254, 254, 0);--bs-navbar-toggler-border-radius: 0.375rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #fdfefe;--bs-navbar-hover-color: rgba(253, 254, 255, 0.8);--bs-navbar-disabled-color: rgba(253, 254, 254, 0.75);--bs-navbar-active-color: #fdfeff;--bs-navbar-brand-color: #fdfefe;--bs-navbar-brand-hover-color: #fdfeff;--bs-navbar-toggler-border-color: rgba(253, 254, 254, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfefe' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfefe' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.375rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.375rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(33, 37, 41, 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #ffffff;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color: #212529;--bs-accordion-bg: #ffffff;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: white;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.375rem;--bs-accordion-inner-border-radius: calc(0.375rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #212529;--bs-accordion-btn-bg: #ffffff;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23052c65'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #86b7fe;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #052c65;--bs-accordion-active-bg: #cfe2ff}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: rgba(33, 37, 41, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(33, 37, 41, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #0d6efd;--bs-pagination-bg: #ffffff;--bs-pagination-border-width: 1px;--bs-pagination-border-color: white;--bs-pagination-border-radius: 0.375rem;--bs-pagination-hover-color: #0a58ca;--bs-pagination-hover-bg: #f8f9fa;--bs-pagination-hover-border-color: white;--bs-pagination-focus-color: #0a58ca;--bs-pagination-focus-bg: #e9ecef;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color: #ffffff;--bs-pagination-active-bg: #0d6efd;--bs-pagination-active-border-color: #0d6efd;--bs-pagination-disabled-color: rgba(33, 37, 41, 0.75);--bs-pagination-disabled-bg: #e9ecef;--bs-pagination-disabled-border-color: white;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(1px*-1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.25rem}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #ffffff;--bs-badge-border-radius: 0.375rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 1px solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.375rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #e9ecef;--bs-progress-border-radius: 0.375rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #ffffff;--bs-progress-bar-bg: #0d6efd;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #212529;--bs-list-group-bg: #ffffff;--bs-list-group-border-color: white;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.375rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(33, 37, 41, 0.75);--bs-list-group-action-hover-color: #000;--bs-list-group-action-hover-bg: #f8f9fa;--bs-list-group-action-active-color: #212529;--bs-list-group-action-active-bg: #e9ecef;--bs-list-group-disabled-color: rgba(33, 37, 41, 0.75);--bs-list-group-disabled-bg: #ffffff;--bs-list-group-active-color: #ffffff;--bs-list-group-active-bg: #0d6efd;--bs-list-group-active-border-color: #0d6efd;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #000;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.5;--bs-btn-close-hover-opacity: 0.75;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(255, 255, 255, 0.85);--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.375rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(33, 37, 41, 0.75);--bs-toast-header-bg: rgba(255, 255, 255, 0.85);--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #ffffff;--bs-modal-border-color: rgba(0, 0, 0, 0.175);--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: white;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: white;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #ffffff;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.375rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #ffffff;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #e9ecef;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #212529;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ffffff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ffffff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #212529;--bs-offcanvas-bg: #ffffff;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: rgba(0, 0, 0, 0.175);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#000 !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#000 !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#000 !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(229, 232, 235, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(229, 232, 235, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#000}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#000}.bg-warning{color:#000}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #0d6efd;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #d63384;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #d63384;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #dc3545;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ffc107;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ffc107;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #198754;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #0dcaf0;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #dee2e6}.bg-default{--bslib-color-bg: #dee2e6;--bslib-color-fg: #000}.text-primary{--bslib-color-fg: #0d6efd}.bg-primary{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #ffffff}.text-success{--bslib-color-fg: #198754}.bg-success{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff}.text-info{--bslib-color-fg: #0dcaf0}.bg-info{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000}.text-warning{--bslib-color-fg: #ffc107}.bg-warning{--bslib-color-bg: #ffc107;--bslib-color-fg: #000}.text-danger{--bslib-color-fg: #dc3545}.bg-danger{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #212529}.bg-dark{--bslib-color-bg: #212529;--bslib-color-fg: #ffffff}.bg-gradient-blue-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #3148f9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3148f9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #345ce5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #345ce5;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #5d56cd;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #5d56cd;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #6057b3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #6057b3;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #6d74a0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #6d74a0;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #000;--bslib-color-bg: #6e8f9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #6e8f9b;color:#000}.bg-gradient-blue-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #1278b9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #1278b9;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #000;--bslib-color-bg: #1592d4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1592d4;color:#000}.bg-gradient-blue-cyan{--bslib-color-fg: #000;--bslib-color-bg: #0d93f8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #0d93f8;color:#000}.bg-gradient-indigo-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #4236f6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #4236f6;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #931ec6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #931ec6;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #951fad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #951fad;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #ffffff;--bslib-color-bg: #a35794;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #a35794;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #4740b3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #4740b3;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #ffffff;--bslib-color-bg: #425af1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #425af1;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #4854d9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #4854d9;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #983ca9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #983ca9;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #9b3d8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #9b3d8f;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #000;--bslib-color-bg: #a97577;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #a97577;color:#000}.bg-gradient-purple-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #4d5e95;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #4d5e95;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #000;--bslib-color-bg: #4878d4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #4878d4;color:#000}.bg-gradient-pink-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #864bb4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #864bb4;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #a925b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #a925b0;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #ad399c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #ad399c;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #d8346b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #d8346b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #000;--bslib-color-bg: #e65157;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #e65157;color:#000}.bg-gradient-pink-yellow{--bslib-color-fg: #000;--bslib-color-bg: #e66c52;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #e66c52;color:#000}.bg-gradient-pink-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #8a5571;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #8a5571;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #000;--bslib-color-bg: #8d6f8c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #8d6f8c;color:#000}.bg-gradient-pink-cyan{--bslib-color-fg: #000;--bslib-color-bg: #866faf;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #866faf;color:#000}.bg-gradient-red-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #894c8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #894c8f;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #ad268a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #ad268a;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #b03a77;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b03a77;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #da345e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #da345e;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #000;--bslib-color-bg: #e95231;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #e95231;color:#000}.bg-gradient-red-yellow{--bslib-color-fg: #000;--bslib-color-bg: #ea6d2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #ea6d2c;color:#000}.bg-gradient-red-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #8e564b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #8e564b;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #000;--bslib-color-bg: #917066;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #917066;color:#000}.bg-gradient-red-cyan{--bslib-color-fg: #000;--bslib-color-bg: #897189;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #897189;color:#000}.bg-gradient-orange-blue{--bslib-color-fg: #000;--bslib-color-bg: #9d7871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #9d7871;color:#000}.bg-gradient-orange-indigo{--bslib-color-fg: #000;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#000}.bg-gradient-orange-purple{--bslib-color-fg: #000;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#000}.bg-gradient-orange-pink{--bslib-color-fg: #000;--bslib-color-bg: #ed6041;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #ed6041;color:#000}.bg-gradient-orange-red{--bslib-color-fg: #000;--bslib-color-bg: #f06128;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #f06128;color:#000}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #fe990f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #fe990f;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a2822e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #a2822e;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #000;--bslib-color-bg: #9d9c6c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #9d9c6c;color:#000}.bg-gradient-yellow-blue{--bslib-color-fg: #000;--bslib-color-bg: #9ea069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #9ea069;color:#000}.bg-gradient-yellow-indigo{--bslib-color-fg: #000;--bslib-color-bg: #c27a65;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c27a65;color:#000}.bg-gradient-yellow-purple{--bslib-color-fg: #000;--bslib-color-bg: #c58e51;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c58e51;color:#000}.bg-gradient-yellow-pink{--bslib-color-fg: #000;--bslib-color-bg: #ef8839;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #ef8839;color:#000}.bg-gradient-yellow-red{--bslib-color-fg: #000;--bslib-color-bg: #f18920;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #f18920;color:#000}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #fea60c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #fea60c;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #000;--bslib-color-bg: #a3aa26;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #a3aa26;color:#000}.bg-gradient-yellow-teal{--bslib-color-fg: #000;--bslib-color-bg: #a6c441;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6c441;color:#000}.bg-gradient-yellow-cyan{--bslib-color-fg: #000;--bslib-color-bg: #9ec564;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #9ec564;color:#000}.bg-gradient-green-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #147d98;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #147d98;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #385793;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #385793;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #3b6b80;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3b6b80;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #656567;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #656567;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #67664e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #67664e;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #74833a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #74833a;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #000;--bslib-color-bg: #759e35;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #759e35;color:#000}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #1ca16f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1ca16f;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #000;--bslib-color-bg: #14a292;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #14a292;color:#000}.bg-gradient-teal-blue{--bslib-color-fg: #000;--bslib-color-bg: #18a5c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #18a5c0;color:#000}.bg-gradient-teal-indigo{--bslib-color-fg: #000;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#000}.bg-gradient-teal-purple{--bslib-color-fg: #000;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#000}.bg-gradient-teal-pink{--bslib-color-fg: #000;--bslib-color-bg: #698d8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #698d8f;color:#000}.bg-gradient-teal-red{--bslib-color-fg: #000;--bslib-color-bg: #6b8e76;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #6b8e76;color:#000}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #000;--bslib-color-bg: #79c65d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #79c65d;color:#000}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #1daf7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #1daf7c;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #000;--bslib-color-bg: #18c9bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #18c9bb;color:#000}.bg-gradient-cyan-blue{--bslib-color-fg: #000;--bslib-color-bg: #0da5f5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #0da5f5;color:#000}.bg-gradient-cyan-indigo{--bslib-color-fg: #000;--bslib-color-bg: #3180f1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3180f1;color:#000}.bg-gradient-cyan-purple{--bslib-color-fg: #000;--bslib-color-bg: #3494dd;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3494dd;color:#000}.bg-gradient-cyan-pink{--bslib-color-fg: #000;--bslib-color-bg: #5d8ec5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #5d8ec5;color:#000}.bg-gradient-cyan-red{--bslib-color-fg: #000;--bslib-color-bg: #608eac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #608eac;color:#000}.bg-gradient-cyan-orange{--bslib-color-fg: #000;--bslib-color-bg: #6dac98;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #6dac98;color:#000}.bg-gradient-cyan-yellow{--bslib-color-fg: #000;--bslib-color-bg: #6ec693;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #6ec693;color:#000}.bg-gradient-cyan-green{--bslib-color-fg: #000;--bslib-color-bg: #12afb2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #12afb2;color:#000}.bg-gradient-cyan-teal{--bslib-color-fg: #000;--bslib-color-bg: #15cacc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #15cacc;color:#000}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.bg-blue{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #0d6efd;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #d63384;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #d63384;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #dc3545;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ffc107;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ffc107;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #198754;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #0dcaf0;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #dee2e6}.bg-default{--bslib-color-bg: #dee2e6;--bslib-color-fg: #000}.text-primary{--bslib-color-fg: #0d6efd}.bg-primary{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #ffffff}.text-success{--bslib-color-fg: #198754}.bg-success{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff}.text-info{--bslib-color-fg: #0dcaf0}.bg-info{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000}.text-warning{--bslib-color-fg: #ffc107}.bg-warning{--bslib-color-bg: #ffc107;--bslib-color-fg: #000}.text-danger{--bslib-color-fg: #dc3545}.bg-danger{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #212529}.bg-dark{--bslib-color-bg: #212529;--bslib-color-fg: #ffffff}.bg-gradient-blue-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #3148f9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3148f9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #345ce5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #345ce5;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #5d56cd;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #5d56cd;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #6057b3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #6057b3;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #6d74a0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #6d74a0;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #000;--bslib-color-bg: #6e8f9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #6e8f9b;color:#000}.bg-gradient-blue-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #1278b9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #1278b9;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #000;--bslib-color-bg: #1592d4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1592d4;color:#000}.bg-gradient-blue-cyan{--bslib-color-fg: #000;--bslib-color-bg: #0d93f8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #0d93f8;color:#000}.bg-gradient-indigo-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #4236f6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #4236f6;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #931ec6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #931ec6;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #951fad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #951fad;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #ffffff;--bslib-color-bg: #a35794;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #a35794;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #4740b3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #4740b3;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #ffffff;--bslib-color-bg: #425af1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #425af1;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #4854d9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #4854d9;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #983ca9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #983ca9;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #9b3d8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #9b3d8f;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #000;--bslib-color-bg: #a97577;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #a97577;color:#000}.bg-gradient-purple-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #4d5e95;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #4d5e95;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #000;--bslib-color-bg: #4878d4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #4878d4;color:#000}.bg-gradient-pink-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #864bb4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #864bb4;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #a925b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #a925b0;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #ad399c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #ad399c;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #d8346b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #d8346b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #000;--bslib-color-bg: #e65157;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #e65157;color:#000}.bg-gradient-pink-yellow{--bslib-color-fg: #000;--bslib-color-bg: #e66c52;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #e66c52;color:#000}.bg-gradient-pink-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #8a5571;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #8a5571;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #000;--bslib-color-bg: #8d6f8c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #8d6f8c;color:#000}.bg-gradient-pink-cyan{--bslib-color-fg: #000;--bslib-color-bg: #866faf;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #866faf;color:#000}.bg-gradient-red-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #894c8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #894c8f;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #ad268a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #ad268a;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #b03a77;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b03a77;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #da345e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #da345e;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #000;--bslib-color-bg: #e95231;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #e95231;color:#000}.bg-gradient-red-yellow{--bslib-color-fg: #000;--bslib-color-bg: #ea6d2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #ea6d2c;color:#000}.bg-gradient-red-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #8e564b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #8e564b;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #000;--bslib-color-bg: #917066;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #917066;color:#000}.bg-gradient-red-cyan{--bslib-color-fg: #000;--bslib-color-bg: #897189;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #897189;color:#000}.bg-gradient-orange-blue{--bslib-color-fg: #000;--bslib-color-bg: #9d7871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #9d7871;color:#000}.bg-gradient-orange-indigo{--bslib-color-fg: #000;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#000}.bg-gradient-orange-purple{--bslib-color-fg: #000;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#000}.bg-gradient-orange-pink{--bslib-color-fg: #000;--bslib-color-bg: #ed6041;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #ed6041;color:#000}.bg-gradient-orange-red{--bslib-color-fg: #000;--bslib-color-bg: #f06128;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #f06128;color:#000}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #fe990f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #fe990f;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a2822e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #a2822e;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #000;--bslib-color-bg: #9d9c6c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #9d9c6c;color:#000}.bg-gradient-yellow-blue{--bslib-color-fg: #000;--bslib-color-bg: #9ea069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #9ea069;color:#000}.bg-gradient-yellow-indigo{--bslib-color-fg: #000;--bslib-color-bg: #c27a65;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c27a65;color:#000}.bg-gradient-yellow-purple{--bslib-color-fg: #000;--bslib-color-bg: #c58e51;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c58e51;color:#000}.bg-gradient-yellow-pink{--bslib-color-fg: #000;--bslib-color-bg: #ef8839;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #ef8839;color:#000}.bg-gradient-yellow-red{--bslib-color-fg: #000;--bslib-color-bg: #f18920;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #f18920;color:#000}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #fea60c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #fea60c;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #000;--bslib-color-bg: #a3aa26;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #a3aa26;color:#000}.bg-gradient-yellow-teal{--bslib-color-fg: #000;--bslib-color-bg: #a6c441;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6c441;color:#000}.bg-gradient-yellow-cyan{--bslib-color-fg: #000;--bslib-color-bg: #9ec564;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #9ec564;color:#000}.bg-gradient-green-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #147d98;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #147d98;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #385793;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #385793;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #3b6b80;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3b6b80;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #656567;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #656567;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #67664e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #67664e;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #74833a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #74833a;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #000;--bslib-color-bg: #759e35;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #759e35;color:#000}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #1ca16f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1ca16f;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #000;--bslib-color-bg: #14a292;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #14a292;color:#000}.bg-gradient-teal-blue{--bslib-color-fg: #000;--bslib-color-bg: #18a5c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #18a5c0;color:#000}.bg-gradient-teal-indigo{--bslib-color-fg: #000;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#000}.bg-gradient-teal-purple{--bslib-color-fg: #000;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#000}.bg-gradient-teal-pink{--bslib-color-fg: #000;--bslib-color-bg: #698d8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #698d8f;color:#000}.bg-gradient-teal-red{--bslib-color-fg: #000;--bslib-color-bg: #6b8e76;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #6b8e76;color:#000}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #000;--bslib-color-bg: #79c65d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #79c65d;color:#000}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #1daf7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #1daf7c;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #000;--bslib-color-bg: #18c9bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #18c9bb;color:#000}.bg-gradient-cyan-blue{--bslib-color-fg: #000;--bslib-color-bg: #0da5f5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #0da5f5;color:#000}.bg-gradient-cyan-indigo{--bslib-color-fg: #000;--bslib-color-bg: #3180f1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3180f1;color:#000}.bg-gradient-cyan-purple{--bslib-color-fg: #000;--bslib-color-bg: #3494dd;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3494dd;color:#000}.bg-gradient-cyan-pink{--bslib-color-fg: #000;--bslib-color-bg: #5d8ec5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #5d8ec5;color:#000}.bg-gradient-cyan-red{--bslib-color-fg: #000;--bslib-color-bg: #608eac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #608eac;color:#000}.bg-gradient-cyan-orange{--bslib-color-fg: #000;--bslib-color-bg: #6dac98;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #6dac98;color:#000}.bg-gradient-cyan-yellow{--bslib-color-fg: #000;--bslib-color-bg: #6ec693;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #6ec693;color:#000}.bg-gradient-cyan-green{--bslib-color-fg: #000;--bslib-color-bg: #12afb2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #12afb2;color:#000}.bg-gradient-cyan-teal{--bslib-color-fg: #000;--bslib-color-bg: #15cacc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #15cacc;color:#000}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #ffffff);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}:root{--bslib-page-sidebar-title-bg: #517699;--bslib-page-sidebar-title-color: #ffffff}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #fff}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.375rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px #fff;border-radius:.375rem;color:#212529;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#fff;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#fff;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#fff;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#212529}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:rgba(33,37,41,.75)}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}dd code:not(.sourceCode),p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}.callout pre.sourceCode{padding-left:0}div.ansi-escaped-output{font-family:monospace;display:block}/*! -* -* ansi colors from IPython notebook's -* -* we also add `bright-[color]-` synonyms for the `-[color]-intense` classes since -* that seems to be what ansi_up emits -* -*/.ansi-black-fg{color:#3e424d}.ansi-black-bg{background-color:#3e424d}.ansi-black-intense-black,.ansi-bright-black-fg{color:#282c36}.ansi-black-intense-black,.ansi-bright-black-bg{background-color:#282c36}.ansi-red-fg{color:#e75c58}.ansi-red-bg{background-color:#e75c58}.ansi-red-intense-red,.ansi-bright-red-fg{color:#b22b31}.ansi-red-intense-red,.ansi-bright-red-bg{background-color:#b22b31}.ansi-green-fg{color:#00a250}.ansi-green-bg{background-color:#00a250}.ansi-green-intense-green,.ansi-bright-green-fg{color:#007427}.ansi-green-intense-green,.ansi-bright-green-bg{background-color:#007427}.ansi-yellow-fg{color:#ddb62b}.ansi-yellow-bg{background-color:#ddb62b}.ansi-yellow-intense-yellow,.ansi-bright-yellow-fg{color:#b27d12}.ansi-yellow-intense-yellow,.ansi-bright-yellow-bg{background-color:#b27d12}.ansi-blue-fg{color:#208ffb}.ansi-blue-bg{background-color:#208ffb}.ansi-blue-intense-blue,.ansi-bright-blue-fg{color:#0065ca}.ansi-blue-intense-blue,.ansi-bright-blue-bg{background-color:#0065ca}.ansi-magenta-fg{color:#d160c4}.ansi-magenta-bg{background-color:#d160c4}.ansi-magenta-intense-magenta,.ansi-bright-magenta-fg{color:#a03196}.ansi-magenta-intense-magenta,.ansi-bright-magenta-bg{background-color:#a03196}.ansi-cyan-fg{color:#60c6c8}.ansi-cyan-bg{background-color:#60c6c8}.ansi-cyan-intense-cyan,.ansi-bright-cyan-fg{color:#258f8f}.ansi-cyan-intense-cyan,.ansi-bright-cyan-bg{background-color:#258f8f}.ansi-white-fg{color:#c5c1b4}.ansi-white-bg{background-color:#c5c1b4}.ansi-white-intense-white,.ansi-bright-white-fg{color:#a1a6b2}.ansi-white-intense-white,.ansi-bright-white-bg{background-color:#a1a6b2}.ansi-default-inverse-fg{color:#fff}.ansi-default-inverse-bg{background-color:#000}.ansi-bold{font-weight:bold}.ansi-underline{text-decoration:underline}:root{--quarto-body-bg: #ffffff;--quarto-body-color: #212529;--quarto-text-muted: rgba(33, 37, 41, 0.75);--quarto-border-color: white;--quarto-border-width: 1px;--quarto-border-radius: 0.375rem}table.gt_table{color:var(--quarto-body-color);font-size:1em;width:100%;background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_column_spanner_outer{color:var(--quarto-body-color);background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_col_heading{color:var(--quarto-body-color);font-weight:bold;background-color:rgba(0,0,0,0)}table.gt_table thead.gt_col_headings{border-bottom:1px solid currentColor;border-top-width:inherit;border-top-color:var(--quarto-border-color)}table.gt_table thead.gt_col_headings:not(:first-child){border-top-width:1px;border-top-color:var(--quarto-border-color)}table.gt_table td.gt_row{border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-width:0px}table.gt_table tbody.gt_table_body{border-top-width:1px;border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-color:currentColor}div.columns{display:initial;gap:initial}div.column{display:inline-block;overflow-x:initial;vertical-align:top;width:50%}.code-annotation-tip-content{word-wrap:break-word}.code-annotation-container-hidden{display:none !important}dl.code-annotation-container-grid{display:grid;grid-template-columns:min-content auto}dl.code-annotation-container-grid dt{grid-column:1}dl.code-annotation-container-grid dd{grid-column:2}pre.sourceCode.code-annotation-code{padding-right:0}code.sourceCode .code-annotation-anchor{z-index:100;position:relative;float:right;background-color:rgba(0,0,0,0)}input[type=checkbox]{margin-right:.5ch}:root{--mermaid-bg-color: #ffffff;--mermaid-edge-color: #6c757d;--mermaid-node-fg-color: #212529;--mermaid-fg-color: #212529;--mermaid-fg-color--lighter: #383f45;--mermaid-fg-color--lightest: #4e5862;--mermaid-font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, Noto Sans, Liberation Sans, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;--mermaid-label-bg-color: #ffffff;--mermaid-label-fg-color: #0d6efd;--mermaid-node-bg-color: rgba(13, 110, 253, 0.1);--mermaid-node-fg-color: #212529}@media print{:root{font-size:11pt}#quarto-sidebar,#TOC,.nav-page{display:none}.page-columns .content{grid-column-start:page-start}.fixed-top{position:relative}.panel-caption,.figure-caption,figcaption{color:#666}}.code-copy-button{position:absolute;top:0;right:0;border:0;margin-top:5px;margin-right:5px;background-color:rgba(0,0,0,0);z-index:3}.code-copy-button:focus{outline:none}.code-copy-button-tooltip{font-size:.75em}pre.sourceCode:hover>.code-copy-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}pre.sourceCode:hover>.code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button-checked:hover>.bi::before{background-image:url('data:image/svg+xml,')}main ol ol,main ul ul,main ol ul,main ul ol{margin-bottom:1em}ul>li:not(:has(>p))>ul,ol>li:not(:has(>p))>ul,ul>li:not(:has(>p))>ol,ol>li:not(:has(>p))>ol{margin-bottom:0}ul>li:not(:has(>p))>ul>li:has(>p),ol>li:not(:has(>p))>ul>li:has(>p),ul>li:not(:has(>p))>ol>li:has(>p),ol>li:not(:has(>p))>ol>li:has(>p){margin-top:1rem}body{margin:0}main.page-columns>header>h1.title,main.page-columns>header>.title.h1{margin-bottom:0}@media(min-width: 992px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] 35px [page-end-inset page-end] 5fr [screen-end-inset] 1.5em}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 3em [body-end] 50px [body-end-outset] minmax(0px, 250px) [page-end-inset] minmax(50px, 100px) [page-end] 1fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 100px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 150px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 991.98px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(1250px - 3em)) [body-content-end body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 767.98px){body .page-columns,body.fullcontent:not(.floating):not(.docked) .page-columns,body.slimcontent:not(.floating):not(.docked) .page-columns,body.docked .page-columns,body.docked.slimcontent .page-columns,body.docked.fullcontent .page-columns,body.floating .page-columns,body.floating.slimcontent .page-columns,body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}nav[role=doc-toc]{display:none}}body,.page-row-navigation{grid-template-rows:[page-top] max-content [contents-top] max-content [contents-bottom] max-content [page-bottom]}.page-rows-contents{grid-template-rows:[content-top] minmax(max-content, 1fr) [content-bottom] minmax(60px, max-content) [page-bottom]}.page-full{grid-column:screen-start/screen-end !important}.page-columns>*{grid-column:body-content-start/body-content-end}.page-columns.column-page>*{grid-column:page-start/page-end}.page-columns.column-page-left .page-columns.page-full>*,.page-columns.column-page-left>*{grid-column:page-start/body-content-end}.page-columns.column-page-right .page-columns.page-full>*,.page-columns.column-page-right>*{grid-column:body-content-start/page-end}.page-rows{grid-auto-rows:auto}.header{grid-column:screen-start/screen-end;grid-row:page-top/contents-top}#quarto-content{padding:0;grid-column:screen-start/screen-end;grid-row:contents-top/contents-bottom}body.floating .sidebar.sidebar-navigation{grid-column:page-start/body-start;grid-row:content-top/page-bottom}body.docked .sidebar.sidebar-navigation{grid-column:screen-start/body-start;grid-row:content-top/page-bottom}.sidebar.toc-left{grid-column:page-start/body-start;grid-row:content-top/page-bottom}.sidebar.margin-sidebar{grid-column:body-end/page-end;grid-row:content-top/page-bottom}.page-columns .content{grid-column:body-content-start/body-content-end;grid-row:content-top/content-bottom;align-content:flex-start}.page-columns .page-navigation{grid-column:body-content-start/body-content-end;grid-row:content-bottom/page-bottom}.page-columns .footer{grid-column:screen-start/screen-end;grid-row:contents-bottom/page-bottom}.page-columns .column-body{grid-column:body-content-start/body-content-end}.page-columns .column-body-fullbleed{grid-column:body-start/body-end}.page-columns .column-body-outset{grid-column:body-start-outset/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset table{background:#fff}.page-columns .column-body-outset-left{grid-column:body-start-outset/body-content-end;z-index:998;opacity:.999}.page-columns .column-body-outset-left table{background:#fff}.page-columns .column-body-outset-right{grid-column:body-content-start/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset-right table{background:#fff}.page-columns .column-page{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-page table{background:#fff}.page-columns .column-page-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset table{background:#fff}.page-columns .column-page-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-inset-left table{background:#fff}.page-columns .column-page-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset-right figcaption table{background:#fff}.page-columns .column-page-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-left table{background:#fff}.page-columns .column-page-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-page-right figcaption table{background:#fff}#quarto-content.page-columns #quarto-margin-sidebar,#quarto-content.page-columns #quarto-sidebar{z-index:1}@media(max-width: 991.98px){#quarto-content.page-columns #quarto-margin-sidebar.collapse,#quarto-content.page-columns #quarto-sidebar.collapse,#quarto-content.page-columns #quarto-margin-sidebar.collapsing,#quarto-content.page-columns #quarto-sidebar.collapsing{z-index:1055}}#quarto-content.page-columns main.column-page,#quarto-content.page-columns main.column-page-right,#quarto-content.page-columns main.column-page-left{z-index:0}.page-columns .column-screen-inset{grid-column:screen-start-inset/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:screen-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:screen-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:screen-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:screen-start/screen-end;padding:1em;background:#f8f9fa;z-index:998;opacity:.999;margin-bottom:1em}.zindex-content{z-index:998;opacity:.999}.zindex-modal{z-index:1055;opacity:.999}.zindex-over-content{z-index:999;opacity:.999}img.img-fluid.column-screen,img.img-fluid.column-screen-inset-shaded,img.img-fluid.column-screen-inset,img.img-fluid.column-screen-inset-left,img.img-fluid.column-screen-inset-right,img.img-fluid.column-screen-left,img.img-fluid.column-screen-right{width:100%}@media(min-width: 992px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.column-sidebar{grid-column:page-start/body-start !important;z-index:998}.column-leftmargin{grid-column:screen-start-inset/body-start !important;z-index:998}.no-row-height{height:1em;overflow:visible}}@media(max-width: 991.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.no-row-height{height:1em;overflow:visible}.page-columns.page-full{overflow:visible}.page-columns.toc-left .margin-caption,.page-columns.toc-left div.aside,.page-columns.toc-left aside:not(.footnotes):not(.sidebar),.page-columns.toc-left .column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.page-columns.toc-left .no-row-height{height:initial;overflow:initial}}@media(max-width: 767.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.no-row-height{height:initial;overflow:initial}#quarto-margin-sidebar{display:none}#quarto-sidebar-toc-left{display:none}.hidden-sm{display:none}}.panel-grid{display:grid;grid-template-rows:repeat(1, 1fr);grid-template-columns:repeat(24, 1fr);gap:1em}.panel-grid .g-col-1{grid-column:auto/span 1}.panel-grid .g-col-2{grid-column:auto/span 2}.panel-grid .g-col-3{grid-column:auto/span 3}.panel-grid .g-col-4{grid-column:auto/span 4}.panel-grid .g-col-5{grid-column:auto/span 5}.panel-grid .g-col-6{grid-column:auto/span 6}.panel-grid .g-col-7{grid-column:auto/span 7}.panel-grid .g-col-8{grid-column:auto/span 8}.panel-grid .g-col-9{grid-column:auto/span 9}.panel-grid .g-col-10{grid-column:auto/span 10}.panel-grid .g-col-11{grid-column:auto/span 11}.panel-grid .g-col-12{grid-column:auto/span 12}.panel-grid .g-col-13{grid-column:auto/span 13}.panel-grid .g-col-14{grid-column:auto/span 14}.panel-grid .g-col-15{grid-column:auto/span 15}.panel-grid .g-col-16{grid-column:auto/span 16}.panel-grid .g-col-17{grid-column:auto/span 17}.panel-grid .g-col-18{grid-column:auto/span 18}.panel-grid .g-col-19{grid-column:auto/span 19}.panel-grid .g-col-20{grid-column:auto/span 20}.panel-grid .g-col-21{grid-column:auto/span 21}.panel-grid .g-col-22{grid-column:auto/span 22}.panel-grid .g-col-23{grid-column:auto/span 23}.panel-grid .g-col-24{grid-column:auto/span 24}.panel-grid .g-start-1{grid-column-start:1}.panel-grid .g-start-2{grid-column-start:2}.panel-grid .g-start-3{grid-column-start:3}.panel-grid .g-start-4{grid-column-start:4}.panel-grid .g-start-5{grid-column-start:5}.panel-grid .g-start-6{grid-column-start:6}.panel-grid .g-start-7{grid-column-start:7}.panel-grid .g-start-8{grid-column-start:8}.panel-grid .g-start-9{grid-column-start:9}.panel-grid .g-start-10{grid-column-start:10}.panel-grid .g-start-11{grid-column-start:11}.panel-grid .g-start-12{grid-column-start:12}.panel-grid .g-start-13{grid-column-start:13}.panel-grid .g-start-14{grid-column-start:14}.panel-grid .g-start-15{grid-column-start:15}.panel-grid .g-start-16{grid-column-start:16}.panel-grid .g-start-17{grid-column-start:17}.panel-grid .g-start-18{grid-column-start:18}.panel-grid .g-start-19{grid-column-start:19}.panel-grid .g-start-20{grid-column-start:20}.panel-grid .g-start-21{grid-column-start:21}.panel-grid .g-start-22{grid-column-start:22}.panel-grid .g-start-23{grid-column-start:23}@media(min-width: 576px){.panel-grid .g-col-sm-1{grid-column:auto/span 1}.panel-grid .g-col-sm-2{grid-column:auto/span 2}.panel-grid .g-col-sm-3{grid-column:auto/span 3}.panel-grid .g-col-sm-4{grid-column:auto/span 4}.panel-grid .g-col-sm-5{grid-column:auto/span 5}.panel-grid .g-col-sm-6{grid-column:auto/span 6}.panel-grid .g-col-sm-7{grid-column:auto/span 7}.panel-grid .g-col-sm-8{grid-column:auto/span 8}.panel-grid .g-col-sm-9{grid-column:auto/span 9}.panel-grid .g-col-sm-10{grid-column:auto/span 10}.panel-grid .g-col-sm-11{grid-column:auto/span 11}.panel-grid .g-col-sm-12{grid-column:auto/span 12}.panel-grid .g-col-sm-13{grid-column:auto/span 13}.panel-grid .g-col-sm-14{grid-column:auto/span 14}.panel-grid .g-col-sm-15{grid-column:auto/span 15}.panel-grid .g-col-sm-16{grid-column:auto/span 16}.panel-grid .g-col-sm-17{grid-column:auto/span 17}.panel-grid .g-col-sm-18{grid-column:auto/span 18}.panel-grid .g-col-sm-19{grid-column:auto/span 19}.panel-grid .g-col-sm-20{grid-column:auto/span 20}.panel-grid .g-col-sm-21{grid-column:auto/span 21}.panel-grid .g-col-sm-22{grid-column:auto/span 22}.panel-grid .g-col-sm-23{grid-column:auto/span 23}.panel-grid .g-col-sm-24{grid-column:auto/span 24}.panel-grid .g-start-sm-1{grid-column-start:1}.panel-grid .g-start-sm-2{grid-column-start:2}.panel-grid .g-start-sm-3{grid-column-start:3}.panel-grid .g-start-sm-4{grid-column-start:4}.panel-grid .g-start-sm-5{grid-column-start:5}.panel-grid .g-start-sm-6{grid-column-start:6}.panel-grid .g-start-sm-7{grid-column-start:7}.panel-grid .g-start-sm-8{grid-column-start:8}.panel-grid .g-start-sm-9{grid-column-start:9}.panel-grid .g-start-sm-10{grid-column-start:10}.panel-grid .g-start-sm-11{grid-column-start:11}.panel-grid .g-start-sm-12{grid-column-start:12}.panel-grid .g-start-sm-13{grid-column-start:13}.panel-grid .g-start-sm-14{grid-column-start:14}.panel-grid .g-start-sm-15{grid-column-start:15}.panel-grid .g-start-sm-16{grid-column-start:16}.panel-grid .g-start-sm-17{grid-column-start:17}.panel-grid .g-start-sm-18{grid-column-start:18}.panel-grid .g-start-sm-19{grid-column-start:19}.panel-grid .g-start-sm-20{grid-column-start:20}.panel-grid .g-start-sm-21{grid-column-start:21}.panel-grid .g-start-sm-22{grid-column-start:22}.panel-grid .g-start-sm-23{grid-column-start:23}}@media(min-width: 768px){.panel-grid .g-col-md-1{grid-column:auto/span 1}.panel-grid .g-col-md-2{grid-column:auto/span 2}.panel-grid .g-col-md-3{grid-column:auto/span 3}.panel-grid .g-col-md-4{grid-column:auto/span 4}.panel-grid .g-col-md-5{grid-column:auto/span 5}.panel-grid .g-col-md-6{grid-column:auto/span 6}.panel-grid .g-col-md-7{grid-column:auto/span 7}.panel-grid .g-col-md-8{grid-column:auto/span 8}.panel-grid .g-col-md-9{grid-column:auto/span 9}.panel-grid .g-col-md-10{grid-column:auto/span 10}.panel-grid .g-col-md-11{grid-column:auto/span 11}.panel-grid .g-col-md-12{grid-column:auto/span 12}.panel-grid .g-col-md-13{grid-column:auto/span 13}.panel-grid .g-col-md-14{grid-column:auto/span 14}.panel-grid .g-col-md-15{grid-column:auto/span 15}.panel-grid .g-col-md-16{grid-column:auto/span 16}.panel-grid .g-col-md-17{grid-column:auto/span 17}.panel-grid .g-col-md-18{grid-column:auto/span 18}.panel-grid .g-col-md-19{grid-column:auto/span 19}.panel-grid .g-col-md-20{grid-column:auto/span 20}.panel-grid .g-col-md-21{grid-column:auto/span 21}.panel-grid .g-col-md-22{grid-column:auto/span 22}.panel-grid .g-col-md-23{grid-column:auto/span 23}.panel-grid .g-col-md-24{grid-column:auto/span 24}.panel-grid .g-start-md-1{grid-column-start:1}.panel-grid .g-start-md-2{grid-column-start:2}.panel-grid .g-start-md-3{grid-column-start:3}.panel-grid .g-start-md-4{grid-column-start:4}.panel-grid .g-start-md-5{grid-column-start:5}.panel-grid .g-start-md-6{grid-column-start:6}.panel-grid .g-start-md-7{grid-column-start:7}.panel-grid .g-start-md-8{grid-column-start:8}.panel-grid .g-start-md-9{grid-column-start:9}.panel-grid .g-start-md-10{grid-column-start:10}.panel-grid .g-start-md-11{grid-column-start:11}.panel-grid .g-start-md-12{grid-column-start:12}.panel-grid .g-start-md-13{grid-column-start:13}.panel-grid .g-start-md-14{grid-column-start:14}.panel-grid .g-start-md-15{grid-column-start:15}.panel-grid .g-start-md-16{grid-column-start:16}.panel-grid .g-start-md-17{grid-column-start:17}.panel-grid .g-start-md-18{grid-column-start:18}.panel-grid .g-start-md-19{grid-column-start:19}.panel-grid .g-start-md-20{grid-column-start:20}.panel-grid .g-start-md-21{grid-column-start:21}.panel-grid .g-start-md-22{grid-column-start:22}.panel-grid .g-start-md-23{grid-column-start:23}}@media(min-width: 992px){.panel-grid .g-col-lg-1{grid-column:auto/span 1}.panel-grid .g-col-lg-2{grid-column:auto/span 2}.panel-grid .g-col-lg-3{grid-column:auto/span 3}.panel-grid .g-col-lg-4{grid-column:auto/span 4}.panel-grid .g-col-lg-5{grid-column:auto/span 5}.panel-grid .g-col-lg-6{grid-column:auto/span 6}.panel-grid .g-col-lg-7{grid-column:auto/span 7}.panel-grid .g-col-lg-8{grid-column:auto/span 8}.panel-grid .g-col-lg-9{grid-column:auto/span 9}.panel-grid .g-col-lg-10{grid-column:auto/span 10}.panel-grid .g-col-lg-11{grid-column:auto/span 11}.panel-grid .g-col-lg-12{grid-column:auto/span 12}.panel-grid .g-col-lg-13{grid-column:auto/span 13}.panel-grid .g-col-lg-14{grid-column:auto/span 14}.panel-grid .g-col-lg-15{grid-column:auto/span 15}.panel-grid .g-col-lg-16{grid-column:auto/span 16}.panel-grid .g-col-lg-17{grid-column:auto/span 17}.panel-grid .g-col-lg-18{grid-column:auto/span 18}.panel-grid .g-col-lg-19{grid-column:auto/span 19}.panel-grid .g-col-lg-20{grid-column:auto/span 20}.panel-grid .g-col-lg-21{grid-column:auto/span 21}.panel-grid .g-col-lg-22{grid-column:auto/span 22}.panel-grid .g-col-lg-23{grid-column:auto/span 23}.panel-grid .g-col-lg-24{grid-column:auto/span 24}.panel-grid .g-start-lg-1{grid-column-start:1}.panel-grid .g-start-lg-2{grid-column-start:2}.panel-grid .g-start-lg-3{grid-column-start:3}.panel-grid .g-start-lg-4{grid-column-start:4}.panel-grid .g-start-lg-5{grid-column-start:5}.panel-grid .g-start-lg-6{grid-column-start:6}.panel-grid .g-start-lg-7{grid-column-start:7}.panel-grid .g-start-lg-8{grid-column-start:8}.panel-grid .g-start-lg-9{grid-column-start:9}.panel-grid .g-start-lg-10{grid-column-start:10}.panel-grid .g-start-lg-11{grid-column-start:11}.panel-grid .g-start-lg-12{grid-column-start:12}.panel-grid .g-start-lg-13{grid-column-start:13}.panel-grid .g-start-lg-14{grid-column-start:14}.panel-grid .g-start-lg-15{grid-column-start:15}.panel-grid .g-start-lg-16{grid-column-start:16}.panel-grid .g-start-lg-17{grid-column-start:17}.panel-grid .g-start-lg-18{grid-column-start:18}.panel-grid .g-start-lg-19{grid-column-start:19}.panel-grid .g-start-lg-20{grid-column-start:20}.panel-grid .g-start-lg-21{grid-column-start:21}.panel-grid .g-start-lg-22{grid-column-start:22}.panel-grid .g-start-lg-23{grid-column-start:23}}@media(min-width: 1200px){.panel-grid .g-col-xl-1{grid-column:auto/span 1}.panel-grid .g-col-xl-2{grid-column:auto/span 2}.panel-grid .g-col-xl-3{grid-column:auto/span 3}.panel-grid .g-col-xl-4{grid-column:auto/span 4}.panel-grid .g-col-xl-5{grid-column:auto/span 5}.panel-grid .g-col-xl-6{grid-column:auto/span 6}.panel-grid .g-col-xl-7{grid-column:auto/span 7}.panel-grid .g-col-xl-8{grid-column:auto/span 8}.panel-grid .g-col-xl-9{grid-column:auto/span 9}.panel-grid .g-col-xl-10{grid-column:auto/span 10}.panel-grid .g-col-xl-11{grid-column:auto/span 11}.panel-grid .g-col-xl-12{grid-column:auto/span 12}.panel-grid .g-col-xl-13{grid-column:auto/span 13}.panel-grid .g-col-xl-14{grid-column:auto/span 14}.panel-grid .g-col-xl-15{grid-column:auto/span 15}.panel-grid .g-col-xl-16{grid-column:auto/span 16}.panel-grid .g-col-xl-17{grid-column:auto/span 17}.panel-grid .g-col-xl-18{grid-column:auto/span 18}.panel-grid .g-col-xl-19{grid-column:auto/span 19}.panel-grid .g-col-xl-20{grid-column:auto/span 20}.panel-grid .g-col-xl-21{grid-column:auto/span 21}.panel-grid .g-col-xl-22{grid-column:auto/span 22}.panel-grid .g-col-xl-23{grid-column:auto/span 23}.panel-grid .g-col-xl-24{grid-column:auto/span 24}.panel-grid .g-start-xl-1{grid-column-start:1}.panel-grid .g-start-xl-2{grid-column-start:2}.panel-grid .g-start-xl-3{grid-column-start:3}.panel-grid .g-start-xl-4{grid-column-start:4}.panel-grid .g-start-xl-5{grid-column-start:5}.panel-grid .g-start-xl-6{grid-column-start:6}.panel-grid .g-start-xl-7{grid-column-start:7}.panel-grid .g-start-xl-8{grid-column-start:8}.panel-grid .g-start-xl-9{grid-column-start:9}.panel-grid .g-start-xl-10{grid-column-start:10}.panel-grid .g-start-xl-11{grid-column-start:11}.panel-grid .g-start-xl-12{grid-column-start:12}.panel-grid .g-start-xl-13{grid-column-start:13}.panel-grid .g-start-xl-14{grid-column-start:14}.panel-grid .g-start-xl-15{grid-column-start:15}.panel-grid .g-start-xl-16{grid-column-start:16}.panel-grid .g-start-xl-17{grid-column-start:17}.panel-grid .g-start-xl-18{grid-column-start:18}.panel-grid .g-start-xl-19{grid-column-start:19}.panel-grid .g-start-xl-20{grid-column-start:20}.panel-grid .g-start-xl-21{grid-column-start:21}.panel-grid .g-start-xl-22{grid-column-start:22}.panel-grid .g-start-xl-23{grid-column-start:23}}@media(min-width: 1400px){.panel-grid .g-col-xxl-1{grid-column:auto/span 1}.panel-grid .g-col-xxl-2{grid-column:auto/span 2}.panel-grid .g-col-xxl-3{grid-column:auto/span 3}.panel-grid .g-col-xxl-4{grid-column:auto/span 4}.panel-grid .g-col-xxl-5{grid-column:auto/span 5}.panel-grid .g-col-xxl-6{grid-column:auto/span 6}.panel-grid .g-col-xxl-7{grid-column:auto/span 7}.panel-grid .g-col-xxl-8{grid-column:auto/span 8}.panel-grid .g-col-xxl-9{grid-column:auto/span 9}.panel-grid .g-col-xxl-10{grid-column:auto/span 10}.panel-grid .g-col-xxl-11{grid-column:auto/span 11}.panel-grid .g-col-xxl-12{grid-column:auto/span 12}.panel-grid .g-col-xxl-13{grid-column:auto/span 13}.panel-grid .g-col-xxl-14{grid-column:auto/span 14}.panel-grid .g-col-xxl-15{grid-column:auto/span 15}.panel-grid .g-col-xxl-16{grid-column:auto/span 16}.panel-grid .g-col-xxl-17{grid-column:auto/span 17}.panel-grid .g-col-xxl-18{grid-column:auto/span 18}.panel-grid .g-col-xxl-19{grid-column:auto/span 19}.panel-grid .g-col-xxl-20{grid-column:auto/span 20}.panel-grid .g-col-xxl-21{grid-column:auto/span 21}.panel-grid .g-col-xxl-22{grid-column:auto/span 22}.panel-grid .g-col-xxl-23{grid-column:auto/span 23}.panel-grid .g-col-xxl-24{grid-column:auto/span 24}.panel-grid .g-start-xxl-1{grid-column-start:1}.panel-grid .g-start-xxl-2{grid-column-start:2}.panel-grid .g-start-xxl-3{grid-column-start:3}.panel-grid .g-start-xxl-4{grid-column-start:4}.panel-grid .g-start-xxl-5{grid-column-start:5}.panel-grid .g-start-xxl-6{grid-column-start:6}.panel-grid .g-start-xxl-7{grid-column-start:7}.panel-grid .g-start-xxl-8{grid-column-start:8}.panel-grid .g-start-xxl-9{grid-column-start:9}.panel-grid .g-start-xxl-10{grid-column-start:10}.panel-grid .g-start-xxl-11{grid-column-start:11}.panel-grid .g-start-xxl-12{grid-column-start:12}.panel-grid .g-start-xxl-13{grid-column-start:13}.panel-grid .g-start-xxl-14{grid-column-start:14}.panel-grid .g-start-xxl-15{grid-column-start:15}.panel-grid .g-start-xxl-16{grid-column-start:16}.panel-grid .g-start-xxl-17{grid-column-start:17}.panel-grid .g-start-xxl-18{grid-column-start:18}.panel-grid .g-start-xxl-19{grid-column-start:19}.panel-grid .g-start-xxl-20{grid-column-start:20}.panel-grid .g-start-xxl-21{grid-column-start:21}.panel-grid .g-start-xxl-22{grid-column-start:22}.panel-grid .g-start-xxl-23{grid-column-start:23}}main{margin-top:1em;margin-bottom:1em}h1,.h1,h2,.h2{color:inherit;margin-top:2rem;margin-bottom:1rem;font-weight:600}h1.title,.title.h1{margin-top:0}main.content>section:first-of-type>h2:first-child,main.content>section:first-of-type>.h2:first-child{margin-top:0}h2,.h2{border-bottom:1px solid #fff;padding-bottom:.5rem}h3,.h3{font-weight:600}h3,.h3,h4,.h4{opacity:.9;margin-top:1.5rem}h5,.h5,h6,.h6{opacity:.9}.header-section-number{color:#5a6570}.nav-link.active .header-section-number{color:inherit}mark,.mark{padding:0em}.panel-caption,.figure-caption,.subfigure-caption,.table-caption,figcaption,caption{font-size:.9rem;color:#5a6570}.quarto-layout-cell[data-ref-parent] caption{color:#5a6570}.column-margin figcaption,.margin-caption,div.aside,aside,.column-margin{color:#5a6570;font-size:.825rem}.panel-caption.margin-caption{text-align:inherit}.column-margin.column-container p{margin-bottom:0}.column-margin.column-container>*:not(.collapse):first-child{padding-bottom:.5em;display:block}.column-margin.column-container>*:not(.collapse):not(:first-child){padding-top:.5em;padding-bottom:.5em;display:block}.column-margin.column-container>*.collapse:not(.show){display:none}@media(min-width: 768px){.column-margin.column-container .callout-margin-content:first-child{margin-top:4.5em}.column-margin.column-container .callout-margin-content-simple:first-child{margin-top:3.5em}}.margin-caption>*{padding-top:.5em;padding-bottom:.5em}@media(max-width: 767.98px){.quarto-layout-row{flex-direction:column}}.nav-tabs .nav-item{margin-top:1px;cursor:pointer}.tab-content{margin-top:0px;border-left:#fff 1px solid;border-right:#fff 1px solid;border-bottom:#fff 1px solid;margin-left:0;padding:1em;margin-bottom:1em}@media(max-width: 767.98px){.layout-sidebar{margin-left:0;margin-right:0}}.panel-sidebar,.panel-sidebar .form-control,.panel-input,.panel-input .form-control,.selectize-dropdown{font-size:.9rem}.panel-sidebar .form-control,.panel-input .form-control{padding-top:.1rem}.tab-pane div.sourceCode{margin-top:0px}.tab-pane>p{padding-top:0}.tab-pane>p:nth-child(1){padding-top:0}.tab-pane>p:last-child{margin-bottom:0}.tab-pane>pre:last-child{margin-bottom:0}.tab-content>.tab-pane:not(.active){display:none !important}div.sourceCode{background-color:rgba(233,236,239,.65);border:1px solid rgba(233,236,239,.65);border-radius:.375rem}pre.sourceCode{background-color:rgba(0,0,0,0)}pre.sourceCode{border:none;font-size:.875em;overflow:visible !important;padding:.4em}div.sourceCode{overflow-y:hidden}.callout div.sourceCode{margin-left:initial}.blockquote{font-size:inherit;padding-left:1rem;padding-right:1.5rem;color:#5a6570}.blockquote h1:first-child,.blockquote .h1:first-child,.blockquote h2:first-child,.blockquote .h2:first-child,.blockquote h3:first-child,.blockquote .h3:first-child,.blockquote h4:first-child,.blockquote .h4:first-child,.blockquote h5:first-child,.blockquote .h5:first-child{margin-top:0}pre{background-color:initial;padding:initial;border:initial}p pre code:not(.sourceCode),li pre code:not(.sourceCode),pre code:not(.sourceCode){background-color:initial}p code:not(.sourceCode),li code:not(.sourceCode),td code:not(.sourceCode){background-color:#f8f9fa;padding:.2em}nav p code:not(.sourceCode),nav li code:not(.sourceCode),nav td code:not(.sourceCode){background-color:rgba(0,0,0,0);padding:0}td code:not(.sourceCode){white-space:pre-wrap}#quarto-embedded-source-code-modal>.modal-dialog{max-width:1000px;padding-left:1.75rem;padding-right:1.75rem}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body{padding:0}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body div.sourceCode{margin:0;padding:.2rem .2rem;border-radius:0px;border:none}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-header{padding:.7rem}.code-tools-button{font-size:1rem;padding:.15rem .15rem;margin-left:5px;color:rgba(33,37,41,.75);background-color:rgba(0,0,0,0);transition:initial;cursor:pointer}.code-tools-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}.code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}.sidebar{will-change:top;transition:top 200ms linear;position:sticky;overflow-y:auto;padding-top:1.2em;max-height:100vh}.sidebar.toc-left,.sidebar.margin-sidebar{top:0px;padding-top:1em}.sidebar.quarto-banner-title-block-sidebar>*{padding-top:1.65em}figure .quarto-notebook-link{margin-top:.5em}.quarto-notebook-link{font-size:.75em;color:rgba(33,37,41,.75);margin-bottom:1em;text-decoration:none;display:block}.quarto-notebook-link:hover{text-decoration:underline;color:#0d6efd}.quarto-notebook-link::before{display:inline-block;height:.75rem;width:.75rem;margin-bottom:0em;margin-right:.25em;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:.75rem .75rem}.toc-actions i.bi,.quarto-code-links i.bi,.quarto-other-links i.bi,.quarto-alternate-notebooks i.bi,.quarto-alternate-formats i.bi{margin-right:.4em;font-size:.8rem}.quarto-other-links-text-target .quarto-code-links i.bi,.quarto-other-links-text-target .quarto-other-links i.bi{margin-right:.2em}.quarto-other-formats-text-target .quarto-alternate-formats i.bi{margin-right:.1em}.toc-actions i.bi.empty,.quarto-code-links i.bi.empty,.quarto-other-links i.bi.empty,.quarto-alternate-notebooks i.bi.empty,.quarto-alternate-formats i.bi.empty{padding-left:1em}.quarto-notebook h2,.quarto-notebook .h2{border-bottom:none}.quarto-notebook .cell-container{display:flex}.quarto-notebook .cell-container .cell{flex-grow:4}.quarto-notebook .cell-container .cell-decorator{padding-top:1.5em;padding-right:1em;text-align:right}.quarto-notebook .cell-container.code-fold .cell-decorator{padding-top:3em}.quarto-notebook .cell-code code{white-space:pre-wrap}.quarto-notebook .cell .cell-output-stderr pre code,.quarto-notebook .cell .cell-output-stdout pre code{white-space:pre-wrap;overflow-wrap:anywhere}.toc-actions,.quarto-alternate-formats,.quarto-other-links,.quarto-code-links,.quarto-alternate-notebooks{padding-left:0em}.sidebar .toc-actions a,.sidebar .quarto-alternate-formats a,.sidebar .quarto-other-links a,.sidebar .quarto-code-links a,.sidebar .quarto-alternate-notebooks a,.sidebar nav[role=doc-toc] a{text-decoration:none}.sidebar .toc-actions a:hover,.sidebar .quarto-other-links a:hover,.sidebar .quarto-code-links a:hover,.sidebar .quarto-alternate-formats a:hover,.sidebar .quarto-alternate-notebooks a:hover{color:#0d6efd}.sidebar .toc-actions h2,.sidebar .toc-actions .h2,.sidebar .quarto-code-links h2,.sidebar .quarto-code-links .h2,.sidebar .quarto-other-links h2,.sidebar .quarto-other-links .h2,.sidebar .quarto-alternate-notebooks h2,.sidebar .quarto-alternate-notebooks .h2,.sidebar .quarto-alternate-formats h2,.sidebar .quarto-alternate-formats .h2,.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-weight:500;margin-bottom:.2rem;margin-top:.3rem;font-family:inherit;border-bottom:0;padding-bottom:0;padding-top:0px}.sidebar .toc-actions>h2,.sidebar .toc-actions>.h2,.sidebar .quarto-code-links>h2,.sidebar .quarto-code-links>.h2,.sidebar .quarto-other-links>h2,.sidebar .quarto-other-links>.h2,.sidebar .quarto-alternate-notebooks>h2,.sidebar .quarto-alternate-notebooks>.h2,.sidebar .quarto-alternate-formats>h2,.sidebar .quarto-alternate-formats>.h2{font-size:.8rem}.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-size:.875rem}.sidebar nav[role=doc-toc]>ul a{border-left:1px solid #e9ecef;padding-left:.6rem}.sidebar .toc-actions h2>ul a,.sidebar .toc-actions .h2>ul a,.sidebar .quarto-code-links h2>ul a,.sidebar .quarto-code-links .h2>ul a,.sidebar .quarto-other-links h2>ul a,.sidebar .quarto-other-links .h2>ul a,.sidebar .quarto-alternate-notebooks h2>ul a,.sidebar .quarto-alternate-notebooks .h2>ul a,.sidebar .quarto-alternate-formats h2>ul a,.sidebar .quarto-alternate-formats .h2>ul a{border-left:none;padding-left:.6rem}.sidebar .toc-actions ul a:empty,.sidebar .quarto-code-links ul a:empty,.sidebar .quarto-other-links ul a:empty,.sidebar .quarto-alternate-notebooks ul a:empty,.sidebar .quarto-alternate-formats ul a:empty,.sidebar nav[role=doc-toc]>ul a:empty{display:none}.sidebar .toc-actions ul,.sidebar .quarto-code-links ul,.sidebar .quarto-other-links ul,.sidebar .quarto-alternate-notebooks ul,.sidebar .quarto-alternate-formats ul{padding-left:0;list-style:none}.sidebar nav[role=doc-toc] ul{list-style:none;padding-left:0;list-style:none}.sidebar nav[role=doc-toc]>ul{margin-left:.45em}.quarto-margin-sidebar nav[role=doc-toc]{padding-left:.5em}.sidebar .toc-actions>ul,.sidebar .quarto-code-links>ul,.sidebar .quarto-other-links>ul,.sidebar .quarto-alternate-notebooks>ul,.sidebar .quarto-alternate-formats>ul{font-size:.8rem}.sidebar nav[role=doc-toc]>ul{font-size:.875rem}.sidebar .toc-actions ul li a,.sidebar .quarto-code-links ul li a,.sidebar .quarto-other-links ul li a,.sidebar .quarto-alternate-notebooks ul li a,.sidebar .quarto-alternate-formats ul li a,.sidebar nav[role=doc-toc]>ul li a{line-height:1.1rem;padding-bottom:.2rem;padding-top:.2rem;color:inherit}.sidebar nav[role=doc-toc] ul>li>ul>li>a{padding-left:1.2em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>a{padding-left:2.4em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>a{padding-left:3.6em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:4.8em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:6em}.sidebar nav[role=doc-toc] ul>li>a.active,.sidebar nav[role=doc-toc] ul>li>ul>li>a.active{border-left:1px solid #0d6efd;color:#0d6efd !important}.sidebar nav[role=doc-toc] ul>li>a:hover,.sidebar nav[role=doc-toc] ul>li>ul>li>a:hover{color:#0d6efd !important}kbd,.kbd{color:#212529;background-color:#f8f9fa;border:1px solid;border-radius:5px;border-color:#fff}.quarto-appendix-contents div.hanging-indent{margin-left:0em}.quarto-appendix-contents div.hanging-indent div.csl-entry{margin-left:1em;text-indent:-1em}.citation a,.footnote-ref{text-decoration:none}.footnotes ol{padding-left:1em}.tippy-content>*{margin-bottom:.7em}.tippy-content>*:last-child{margin-bottom:0}.callout{margin-top:1.25rem;margin-bottom:1.25rem;border-radius:.375rem;overflow-wrap:break-word}.callout .callout-title-container{overflow-wrap:anywhere}.callout.callout-style-simple{padding:.4em .7em;border-left:5px solid;border-right:1px solid #fff;border-top:1px solid #fff;border-bottom:1px solid #fff}.callout.callout-style-default{border-left:5px solid;border-right:1px solid #fff;border-top:1px solid #fff;border-bottom:1px solid #fff}.callout .callout-body-container{flex-grow:1}.callout.callout-style-simple .callout-body{font-size:.9rem;font-weight:400}.callout.callout-style-default .callout-body{font-size:.9rem;font-weight:400}.callout:not(.no-icon).callout-titled.callout-style-simple .callout-body{padding-left:1.6em}.callout.callout-titled>.callout-header{padding-top:.2em;margin-bottom:-0.2em}.callout.callout-style-simple>div.callout-header{border-bottom:none;font-size:.9rem;font-weight:600;opacity:75%}.callout.callout-style-default>div.callout-header{border-bottom:none;font-weight:600;opacity:85%;font-size:.9rem;padding-left:.5em;padding-right:.5em}.callout.callout-style-default .callout-body{padding-left:.5em;padding-right:.5em}.callout.callout-style-default .callout-body>:first-child{padding-top:.5rem;margin-top:0}.callout>div.callout-header[data-bs-toggle=collapse]{cursor:pointer}.callout.callout-style-default .callout-header[aria-expanded=false],.callout.callout-style-default .callout-header[aria-expanded=true]{padding-top:0px;margin-bottom:0px;align-items:center}.callout.callout-titled .callout-body>:last-child:not(.sourceCode),.callout.callout-titled .callout-body>div>:last-child:not(.sourceCode){padding-bottom:.5rem;margin-bottom:0}.callout:not(.callout-titled) .callout-body>:first-child,.callout:not(.callout-titled) .callout-body>div>:first-child{margin-top:.25rem}.callout:not(.callout-titled) .callout-body>:last-child,.callout:not(.callout-titled) .callout-body>div>:last-child{margin-bottom:.2rem}.callout.callout-style-simple .callout-icon::before,.callout.callout-style-simple .callout-toggle::before{height:1rem;width:1rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.callout.callout-style-default .callout-icon::before,.callout.callout-style-default .callout-toggle::before{height:.9rem;width:.9rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:.9rem .9rem}.callout.callout-style-default .callout-toggle::before{margin-top:5px}.callout .callout-btn-toggle .callout-toggle::before{transition:transform .2s linear}.callout .callout-header[aria-expanded=false] .callout-toggle::before{transform:rotate(-90deg)}.callout .callout-header[aria-expanded=true] .callout-toggle::before{transform:none}.callout.callout-style-simple:not(.no-icon) div.callout-icon-container{padding-top:.2em;padding-right:.55em}.callout.callout-style-default:not(.no-icon) div.callout-icon-container{padding-top:.1em;padding-right:.35em}.callout.callout-style-default:not(.no-icon) div.callout-title-container{margin-top:-1px}.callout.callout-style-default.callout-caution:not(.no-icon) div.callout-icon-container{padding-top:.3em;padding-right:.35em}.callout>.callout-body>.callout-icon-container>.no-icon,.callout>.callout-header>.callout-icon-container>.no-icon{display:none}div.callout.callout{border-left-color:rgba(33,37,41,.75)}div.callout.callout-style-default>.callout-header{background-color:rgba(33,37,41,.75)}div.callout-note.callout{border-left-color:#0d6efd}div.callout-note.callout-style-default>.callout-header{background-color:#e7f1ff}div.callout-note:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-tip.callout{border-left-color:#198754}div.callout-tip.callout-style-default>.callout-header{background-color:#e8f3ee}div.callout-tip:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-warning.callout{border-left-color:#ffc107}div.callout-warning.callout-style-default>.callout-header{background-color:#fff9e6}div.callout-warning:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-caution.callout{border-left-color:#fd7e14}div.callout-caution.callout-style-default>.callout-header{background-color:#fff2e8}div.callout-caution:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-important.callout{border-left-color:#dc3545}div.callout-important.callout-style-default>.callout-header{background-color:#fcebec}div.callout-important:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important .callout-toggle::before{background-image:url('data:image/svg+xml,')}.quarto-toggle-container{display:flex;align-items:center}.quarto-reader-toggle .bi::before,.quarto-color-scheme-toggle .bi::before{display:inline-block;height:1rem;width:1rem;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.sidebar-navigation{padding-left:20px}.navbar{background-color:#517699;color:#fdfefe}.navbar .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.quarto-sidebar-toggle{border-color:#fff;border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem;border-style:solid;border-width:1px;overflow:hidden;border-top-width:0px;padding-top:0px !important}.quarto-sidebar-toggle-title{cursor:pointer;padding-bottom:2px;margin-left:.25em;text-align:center;font-weight:400;font-size:.775em}#quarto-content .quarto-sidebar-toggle{background:#fafafa}#quarto-content .quarto-sidebar-toggle-title{color:#212529}.quarto-sidebar-toggle-icon{color:#fff;margin-right:.5em;float:right;transition:transform .2s ease}.quarto-sidebar-toggle-icon::before{padding-top:5px}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-icon{transform:rotate(-180deg)}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-title{border-bottom:solid #fff 1px}.quarto-sidebar-toggle-contents{background-color:#fff;padding-right:10px;padding-left:10px;margin-top:0px !important;transition:max-height .5s ease}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-contents{padding-top:1em;padding-bottom:10px}@media(max-width: 767.98px){.sidebar-menu-container{padding-bottom:5em}}.quarto-sidebar-toggle:not(.expanded) .quarto-sidebar-toggle-contents{padding-top:0px !important;padding-bottom:0px}nav[role=doc-toc]{z-index:1020}#quarto-sidebar>*,nav[role=doc-toc]>*{transition:opacity .1s ease,border .1s ease}#quarto-sidebar.slow>*,nav[role=doc-toc].slow>*{transition:opacity .4s ease,border .4s ease}.quarto-color-scheme-toggle:not(.alternate).top-right .bi::before{background-image:url('data:image/svg+xml,')}.quarto-color-scheme-toggle.alternate.top-right .bi::before{background-image:url('data:image/svg+xml,')}#quarto-appendix.default{border-top:1px solid #fff}#quarto-appendix.default{background-color:#fff;padding-top:1.5em;margin-top:2em;z-index:998}#quarto-appendix.default .quarto-appendix-heading{margin-top:0;line-height:1.4em;font-weight:600;opacity:.9;border-bottom:none;margin-bottom:0}#quarto-appendix.default .footnotes ol,#quarto-appendix.default .footnotes ol li>p:last-of-type,#quarto-appendix.default .quarto-appendix-contents>p:last-of-type{margin-bottom:0}#quarto-appendix.default .footnotes ol{margin-left:.5em}#quarto-appendix.default .quarto-appendix-secondary-label{margin-bottom:.4em}#quarto-appendix.default .quarto-appendix-bibtex{font-size:.7em;padding:1em;border:solid 1px #fff;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-bibtex code.sourceCode{white-space:pre-wrap}#quarto-appendix.default .quarto-appendix-citeas{font-size:.9em;padding:1em;border:solid 1px #fff;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-heading{font-size:1em !important}#quarto-appendix.default *[role=doc-endnotes]>ol,#quarto-appendix.default .quarto-appendix-contents>*:not(h2):not(.h2){font-size:.9em}#quarto-appendix.default section{padding-bottom:1.5em}#quarto-appendix.default section *[role=doc-endnotes],#quarto-appendix.default section>*:not(a){opacity:.9;word-wrap:break-word}.btn.btn-quarto,div.cell-output-display .btn-quarto{--bs-btn-color: #fefefe;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fefefe;--bs-btn-hover-bg: #828a91;--bs-btn-hover-border-color: #7b838a;--bs-btn-focus-shadow-rgb: 130, 138, 144;--bs-btn-active-color: #000;--bs-btn-active-bg: #899197;--bs-btn-active-border-color: #7b838a;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}nav.quarto-secondary-nav.color-navbar{background-color:#517699;color:#fdfefe}nav.quarto-secondary-nav.color-navbar h1,nav.quarto-secondary-nav.color-navbar .h1,nav.quarto-secondary-nav.color-navbar .quarto-btn-toggle{color:#fdfefe}@media(max-width: 991.98px){body.nav-sidebar .quarto-title-banner{margin-bottom:0;padding-bottom:1em}body.nav-sidebar #title-block-header{margin-block-end:0}}p.subtitle{margin-top:.25em;margin-bottom:.5em}code a:any-link{color:inherit;text-decoration-color:#6c757d}/*! light */div.observablehq table thead tr th{background-color:var(--bs-body-bg)}input,button,select,optgroup,textarea{background-color:var(--bs-body-bg)}.code-annotated .code-copy-button{margin-right:1.25em;margin-top:0;padding-bottom:0;padding-top:3px}.code-annotation-gutter-bg{background-color:#fff}.code-annotation-gutter{background-color:rgba(233,236,239,.65)}.code-annotation-gutter,.code-annotation-gutter-bg{height:100%;width:calc(20px + .5em);position:absolute;top:0;right:0}dl.code-annotation-container-grid dt{margin-right:1em;margin-top:.25rem}dl.code-annotation-container-grid dt{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:#383f45;border:solid #383f45 1px;border-radius:50%;height:22px;width:22px;line-height:22px;font-size:11px;text-align:center;vertical-align:middle;text-decoration:none}dl.code-annotation-container-grid dt[data-target-cell]{cursor:pointer}dl.code-annotation-container-grid dt[data-target-cell].code-annotation-active{color:#fff;border:solid #aaa 1px;background-color:#aaa}pre.code-annotation-code{padding-top:0;padding-bottom:0}pre.code-annotation-code code{z-index:3}#code-annotation-line-highlight-gutter{width:100%;border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}#code-annotation-line-highlight{margin-left:-4em;width:calc(100% + 4em);border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}code.sourceCode .code-annotation-anchor.code-annotation-active{background-color:var(--quarto-hl-normal-color, #aaaaaa);border:solid var(--quarto-hl-normal-color, #aaaaaa) 1px;color:#e9ecef;font-weight:bolder}code.sourceCode .code-annotation-anchor{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:var(--quarto-hl-co-color);border:solid var(--quarto-hl-co-color) 1px;border-radius:50%;height:18px;width:18px;font-size:9px;margin-top:2px}code.sourceCode button.code-annotation-anchor{padding:2px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none}code.sourceCode a.code-annotation-anchor{line-height:18px;text-align:center;vertical-align:middle;cursor:default;text-decoration:none}@media print{.page-columns .column-screen-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:page-start-inset/page-end-inset;padding:1em;background:#f8f9fa;z-index:998;opacity:.999;margin-bottom:1em}}.quarto-video{margin-bottom:1em}.table{border-top:1px solid #d3d3d4;border-bottom:1px solid #d3d3d4}.table>thead{border-top-width:0;border-bottom:1px solid #909294}.table a{word-break:break-word}.table>:not(caption)>*>*{background-color:unset;color:unset}#quarto-document-content .crosstalk-input .checkbox input[type=checkbox],#quarto-document-content .crosstalk-input .checkbox-inline input[type=checkbox]{position:unset;margin-top:unset;margin-left:unset}#quarto-document-content .row{margin-left:unset;margin-right:unset}.quarto-xref{white-space:nowrap}#quarto-draft-alert{margin-top:0px;margin-bottom:0px;padding:.3em;text-align:center;font-size:.9em}#quarto-draft-alert i{margin-right:.3em}#quarto-back-to-top{z-index:1000}pre{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:0.875em;font-weight:400}pre code{font-family:inherit;font-size:inherit;font-weight:inherit}code{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:0.875em;font-weight:400}a{background-color:rgba(0,0,0,0);font-weight:400;text-decoration:underline}a.external:after{content:"";background-image:url('data:image/svg+xml,');background-size:contain;background-repeat:no-repeat;background-position:center center;margin-left:.2em;padding-right:.75em}div.sourceCode code a.external:after{content:none}a.external:after:hover{cursor:pointer}.quarto-ext-icon{display:inline-block;font-size:.75em;padding-left:.3em}.code-with-filename .code-with-filename-file{margin-bottom:0;padding-bottom:2px;padding-top:2px;padding-left:.7em;border:var(--quarto-border-width) solid var(--quarto-border-color);border-radius:var(--quarto-border-radius);border-bottom:0;border-bottom-left-radius:0%;border-bottom-right-radius:0%}.code-with-filename div.sourceCode,.reveal .code-with-filename div.sourceCode{margin-top:0;border-top-left-radius:0%;border-top-right-radius:0%}.code-with-filename .code-with-filename-file pre{margin-bottom:0}.code-with-filename .code-with-filename-file{background-color:rgba(219,219,219,.8)}.quarto-dark .code-with-filename .code-with-filename-file{background-color:#555}.code-with-filename .code-with-filename-file strong{font-weight:400}.quarto-title-banner{margin-bottom:1em;color:#fdfefe;background:#517699}.quarto-title-banner a{color:#fdfefe}.quarto-title-banner h1,.quarto-title-banner .h1,.quarto-title-banner h2,.quarto-title-banner .h2{color:#fdfefe}.quarto-title-banner .code-tools-button{color:#b9dcdc}.quarto-title-banner .code-tools-button:hover{color:#fdfefe}.quarto-title-banner .code-tools-button>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .quarto-title .title{font-weight:600}.quarto-title-banner .quarto-categories{margin-top:.75em}@media(min-width: 992px){.quarto-title-banner{padding-top:2.5em;padding-bottom:2.5em}}@media(max-width: 991.98px){.quarto-title-banner{padding-top:1em;padding-bottom:1em}}@media(max-width: 767.98px){body.hypothesis-enabled #title-block-header>*{padding-right:20px}}main.quarto-banner-title-block>section:first-child>h2,main.quarto-banner-title-block>section:first-child>.h2,main.quarto-banner-title-block>section:first-child>h3,main.quarto-banner-title-block>section:first-child>.h3,main.quarto-banner-title-block>section:first-child>h4,main.quarto-banner-title-block>section:first-child>.h4{margin-top:0}.quarto-title .quarto-categories{display:flex;flex-wrap:wrap;row-gap:.5em;column-gap:.4em;padding-bottom:.5em;margin-top:.75em}.quarto-title .quarto-categories .quarto-category{padding:.25em .75em;font-size:.65em;text-transform:uppercase;border:solid 1px;border-radius:.375rem;opacity:.6}.quarto-title .quarto-categories .quarto-category a{color:inherit}.quarto-title-meta-container{display:grid;grid-template-columns:1fr auto}.quarto-title-meta-column-end{display:flex;flex-direction:column;padding-left:1em}.quarto-title-meta-column-end a .bi{margin-right:.3em}#title-block-header.quarto-title-block.default .quarto-title-meta{display:grid;grid-template-columns:repeat(2, 1fr);grid-column-gap:1em}#title-block-header.quarto-title-block.default .quarto-title .title{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-author-orcid img{margin-top:-0.2em;height:.8em;width:.8em}#title-block-header.quarto-title-block.default .quarto-title-author-email{opacity:.7}#title-block-header.quarto-title-block.default .quarto-description p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p,#title-block-header.quarto-title-block.default .quarto-title-authors p,#title-block-header.quarto-title-block.default .quarto-title-affiliations p{margin-bottom:.1em}#title-block-header.quarto-title-block.default .quarto-title-meta-heading{text-transform:uppercase;margin-top:1em;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-contents{font-size:.9em}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p.affiliation:last-of-type{margin-bottom:.1em}#title-block-header.quarto-title-block.default p.affiliation{margin-bottom:.1em}#title-block-header.quarto-title-block.default .keywords,#title-block-header.quarto-title-block.default .description,#title-block-header.quarto-title-block.default .abstract{margin-top:0}#title-block-header.quarto-title-block.default .keywords>p,#title-block-header.quarto-title-block.default .description>p,#title-block-header.quarto-title-block.default .abstract>p{font-size:.9em}#title-block-header.quarto-title-block.default .keywords>p:last-of-type,#title-block-header.quarto-title-block.default .description>p:last-of-type,#title-block-header.quarto-title-block.default .abstract>p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .keywords .block-title,#title-block-header.quarto-title-block.default .description .block-title,#title-block-header.quarto-title-block.default .abstract .block-title{margin-top:1em;text-transform:uppercase;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-author{display:grid;grid-template-columns:minmax(max-content, 1fr) 1fr;grid-column-gap:1em}.quarto-title-tools-only{display:flex;justify-content:right}:root{--quarto-scss-export-title-banner-color: ;--quarto-scss-export-title-banner-bg: ;--quarto-scss-export-btn-code-copy-color: #5E5E5E;--quarto-scss-export-btn-code-copy-color-active: #4758AB;--quarto-scss-export-sidebar-bg: #fff;--quarto-scss-export-blue: #0d6efd;--quarto-scss-export-primary: #0d6efd;--quarto-scss-export-white: #ffffff;--quarto-scss-export-gray-200: #e9ecef;--quarto-scss-export-gray-100: #f8f9fa;--quarto-scss-export-gray-900: #212529;--quarto-scss-export-link-color: #0d6efd;--quarto-scss-export-link-color-bg: transparent;--quarto-scss-export-code-color: #7d12ba;--quarto-scss-export-code-bg: #f8f9fa;--quarto-scss-export-toc-color: #0d6efd;--quarto-scss-export-toc-active-border: #0d6efd;--quarto-scss-export-toc-inactive-border: #e9ecef;--quarto-scss-export-navbar-default: #517699;--quarto-scss-export-navbar-hl-override: false;--quarto-scss-export-navbar-bg: #517699;--quarto-scss-export-btn-bg: #6c757d;--quarto-scss-export-btn-fg: #fefefe;--quarto-scss-export-body-contrast-bg: #ffffff;--quarto-scss-export-body-contrast-color: #212529;--quarto-scss-export-navbar-fg: #fdfefe;--quarto-scss-export-navbar-hl: #fdfeff;--quarto-scss-export-navbar-brand: #fdfefe;--quarto-scss-export-navbar-brand-hl: #fdfeff;--quarto-scss-export-navbar-toggler-border-color: rgba(253, 254, 254, 0);--quarto-scss-export-navbar-hover-color: rgba(253, 254, 255, 0.8);--quarto-scss-export-navbar-disabled-color: rgba(253, 254, 254, 0.75);--quarto-scss-export-sidebar-fg: #595959;--quarto-scss-export-sidebar-hl: ;--quarto-scss-export-title-block-color: #212529;--quarto-scss-export-title-block-contast-color: #ffffff;--quarto-scss-export-footer-bg: #fff;--quarto-scss-export-footer-fg: #757575;--quarto-scss-export-popover-bg: #ffffff;--quarto-scss-export-input-bg: #ffffff;--quarto-scss-export-input-border-color: white;--quarto-scss-export-code-annotation-higlight-color: rgba(170, 170, 170, 0.2666666667);--quarto-scss-export-code-annotation-higlight-bg: rgba(170, 170, 170, 0.1333333333);--quarto-scss-export-table-group-separator-color: #909294;--quarto-scss-export-table-group-separator-color-lighter: #d3d3d4;--quarto-scss-export-link-decoration: underline;--quarto-scss-export-border-color: white;--quarto-scss-export-table-border-color: white;--quarto-scss-export-gray-300: #dee2e6;--quarto-scss-export-gray-400: #ced4da;--quarto-scss-export-gray-500: #adb5bd;--quarto-scss-export-gray-600: #6c757d;--quarto-scss-export-gray-700: #495057;--quarto-scss-export-gray-800: #343a40;--quarto-scss-export-black: #000;--quarto-scss-export-indigo: #6610f2;--quarto-scss-export-purple: #6f42c1;--quarto-scss-export-pink: #d63384;--quarto-scss-export-red: #dc3545;--quarto-scss-export-orange: #fd7e14;--quarto-scss-export-yellow: #ffc107;--quarto-scss-export-green: #198754;--quarto-scss-export-teal: #20c997;--quarto-scss-export-cyan: #0dcaf0;--quarto-scss-export-color-contrast-dark: #000;--quarto-scss-export-color-contrast-light: #ffffff;--quarto-scss-export-blue-100: #cfe2ff;--quarto-scss-export-blue-200: #9ec5fe;--quarto-scss-export-blue-300: #6ea8fe;--quarto-scss-export-blue-400: #3d8bfd;--quarto-scss-export-blue-500: #0d6efd;--quarto-scss-export-blue-600: #0a58ca;--quarto-scss-export-blue-700: #084298;--quarto-scss-export-blue-800: #052c65;--quarto-scss-export-blue-900: #031633;--quarto-scss-export-indigo-100: #e0cffc;--quarto-scss-export-indigo-200: #c29ffa;--quarto-scss-export-indigo-300: #a370f7;--quarto-scss-export-indigo-400: #8540f5;--quarto-scss-export-indigo-500: #6610f2;--quarto-scss-export-indigo-600: #520dc2;--quarto-scss-export-indigo-700: #3d0a91;--quarto-scss-export-indigo-800: #290661;--quarto-scss-export-indigo-900: #140330;--quarto-scss-export-purple-100: #e2d9f3;--quarto-scss-export-purple-200: #c5b3e6;--quarto-scss-export-purple-300: #a98eda;--quarto-scss-export-purple-400: #8c68cd;--quarto-scss-export-purple-500: #6f42c1;--quarto-scss-export-purple-600: #59359a;--quarto-scss-export-purple-700: #432874;--quarto-scss-export-purple-800: #2c1a4d;--quarto-scss-export-purple-900: #160d27;--quarto-scss-export-pink-100: #f7d6e6;--quarto-scss-export-pink-200: #efadce;--quarto-scss-export-pink-300: #e685b5;--quarto-scss-export-pink-400: #de5c9d;--quarto-scss-export-pink-500: #d63384;--quarto-scss-export-pink-600: #ab296a;--quarto-scss-export-pink-700: #801f4f;--quarto-scss-export-pink-800: #561435;--quarto-scss-export-pink-900: #2b0a1a;--quarto-scss-export-red-100: #f8d7da;--quarto-scss-export-red-200: #f1aeb5;--quarto-scss-export-red-300: #ea868f;--quarto-scss-export-red-400: #e35d6a;--quarto-scss-export-red-500: #dc3545;--quarto-scss-export-red-600: #b02a37;--quarto-scss-export-red-700: #842029;--quarto-scss-export-red-800: #58151c;--quarto-scss-export-red-900: #2c0b0e;--quarto-scss-export-orange-100: #ffe5d0;--quarto-scss-export-orange-200: #fecba1;--quarto-scss-export-orange-300: #feb272;--quarto-scss-export-orange-400: #fd9843;--quarto-scss-export-orange-500: #fd7e14;--quarto-scss-export-orange-600: #ca6510;--quarto-scss-export-orange-700: #984c0c;--quarto-scss-export-orange-800: #653208;--quarto-scss-export-orange-900: #331904;--quarto-scss-export-yellow-100: #fff3cd;--quarto-scss-export-yellow-200: #ffe69c;--quarto-scss-export-yellow-300: #ffda6a;--quarto-scss-export-yellow-400: #ffcd39;--quarto-scss-export-yellow-500: #ffc107;--quarto-scss-export-yellow-600: #cc9a06;--quarto-scss-export-yellow-700: #997404;--quarto-scss-export-yellow-800: #664d03;--quarto-scss-export-yellow-900: #332701;--quarto-scss-export-green-100: #d1e7dd;--quarto-scss-export-green-200: #a3cfbb;--quarto-scss-export-green-300: #75b798;--quarto-scss-export-green-400: #479f76;--quarto-scss-export-green-500: #198754;--quarto-scss-export-green-600: #146c43;--quarto-scss-export-green-700: #0f5132;--quarto-scss-export-green-800: #0a3622;--quarto-scss-export-green-900: #051b11;--quarto-scss-export-teal-100: #d2f4ea;--quarto-scss-export-teal-200: #a6e9d5;--quarto-scss-export-teal-300: #79dfc1;--quarto-scss-export-teal-400: #4dd4ac;--quarto-scss-export-teal-500: #20c997;--quarto-scss-export-teal-600: #1aa179;--quarto-scss-export-teal-700: #13795b;--quarto-scss-export-teal-800: #0d503c;--quarto-scss-export-teal-900: #06281e;--quarto-scss-export-cyan-100: #cff4fc;--quarto-scss-export-cyan-200: #9eeaf9;--quarto-scss-export-cyan-300: #6edff6;--quarto-scss-export-cyan-400: #3dd5f3;--quarto-scss-export-cyan-500: #0dcaf0;--quarto-scss-export-cyan-600: #0aa2c0;--quarto-scss-export-cyan-700: #087990;--quarto-scss-export-cyan-800: #055160;--quarto-scss-export-cyan-900: #032830;--quarto-scss-export-default: #dee2e6;--quarto-scss-export-secondary: #6c757d;--quarto-scss-export-success: #198754;--quarto-scss-export-info: #0dcaf0;--quarto-scss-export-warning: #ffc107;--quarto-scss-export-danger: #dc3545;--quarto-scss-export-light: #f8f9fa;--quarto-scss-export-dark: #212529;--quarto-scss-export-primary-text-emphasis: #052c65;--quarto-scss-export-secondary-text-emphasis: #2b2f32;--quarto-scss-export-success-text-emphasis: #0a3622;--quarto-scss-export-info-text-emphasis: #055160;--quarto-scss-export-warning-text-emphasis: #664d03;--quarto-scss-export-danger-text-emphasis: #58151c;--quarto-scss-export-light-text-emphasis: #495057;--quarto-scss-export-dark-text-emphasis: #495057;--quarto-scss-export-primary-bg-subtle: #cfe2ff;--quarto-scss-export-secondary-bg-subtle: #e2e3e5;--quarto-scss-export-success-bg-subtle: #d1e7dd;--quarto-scss-export-info-bg-subtle: #cff4fc;--quarto-scss-export-warning-bg-subtle: #fff3cd;--quarto-scss-export-danger-bg-subtle: #f8d7da;--quarto-scss-export-light-bg-subtle: #fcfcfd;--quarto-scss-export-dark-bg-subtle: #ced4da;--quarto-scss-export-primary-border-subtle: #9ec5fe;--quarto-scss-export-secondary-border-subtle: #c4c8cb;--quarto-scss-export-success-border-subtle: #a3cfbb;--quarto-scss-export-info-border-subtle: #9eeaf9;--quarto-scss-export-warning-border-subtle: #ffe69c;--quarto-scss-export-danger-border-subtle: #f1aeb5;--quarto-scss-export-light-border-subtle: #e9ecef;--quarto-scss-export-dark-border-subtle: #adb5bd;--quarto-scss-export-body-text-align: ;--quarto-scss-export-body-color: #212529;--quarto-scss-export-body-bg: #ffffff;--quarto-scss-export-body-secondary-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-body-secondary-bg: #e9ecef;--quarto-scss-export-body-tertiary-color: rgba(33, 37, 41, 0.5);--quarto-scss-export-body-tertiary-bg: #f8f9fa;--quarto-scss-export-body-emphasis-color: #000;--quarto-scss-export-link-hover-color: #0a58ca;--quarto-scss-export-link-hover-decoration: ;--quarto-scss-export-border-color-translucent: rgba(0, 0, 0, 0.175);--quarto-scss-export-component-active-bg: #0d6efd;--quarto-scss-export-component-active-color: #ffffff;--quarto-scss-export-focus-ring-color: rgba(13, 110, 253, 0.25);--quarto-scss-export-headings-font-family: ;--quarto-scss-export-headings-font-style: ;--quarto-scss-export-display-font-family: ;--quarto-scss-export-display-font-style: ;--quarto-scss-export-text-muted: rgba(33, 37, 41, 0.75);--quarto-scss-export-blockquote-footer-color: #6c757d;--quarto-scss-export-blockquote-border-color: #e9ecef;--quarto-scss-export-hr-bg-color: ;--quarto-scss-export-hr-height: ;--quarto-scss-export-hr-border-color: ;--quarto-scss-export-legend-font-weight: ;--quarto-scss-export-mark-bg: #fff3cd;--quarto-scss-export-table-color: #212529;--quarto-scss-export-table-bg: #ffffff;--quarto-scss-export-table-accent-bg: transparent;--quarto-scss-export-table-th-font-weight: ;--quarto-scss-export-table-striped-color: #212529;--quarto-scss-export-table-striped-bg: rgba(0, 0, 0, 0.05);--quarto-scss-export-table-active-color: #212529;--quarto-scss-export-table-active-bg: rgba(0, 0, 0, 0.1);--quarto-scss-export-table-hover-color: #212529;--quarto-scss-export-table-hover-bg: rgba(0, 0, 0, 0.075);--quarto-scss-export-table-caption-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-input-btn-font-family: ;--quarto-scss-export-input-btn-focus-color: rgba(13, 110, 253, 0.25);--quarto-scss-export-btn-color: #212529;--quarto-scss-export-btn-font-family: ;--quarto-scss-export-btn-white-space: ;--quarto-scss-export-btn-link-color: #0d6efd;--quarto-scss-export-btn-link-hover-color: #0a58ca;--quarto-scss-export-btn-link-disabled-color: #6c757d;--quarto-scss-export-form-text-font-style: ;--quarto-scss-export-form-text-font-weight: ;--quarto-scss-export-form-text-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-form-label-font-size: ;--quarto-scss-export-form-label-font-style: ;--quarto-scss-export-form-label-font-weight: ;--quarto-scss-export-form-label-color: ;--quarto-scss-export-input-font-family: ;--quarto-scss-export-input-disabled-color: ;--quarto-scss-export-input-disabled-bg: #e9ecef;--quarto-scss-export-input-disabled-border-color: ;--quarto-scss-export-input-color: #212529;--quarto-scss-export-input-focus-bg: #ffffff;--quarto-scss-export-input-focus-border-color: #86b7fe;--quarto-scss-export-input-focus-color: #212529;--quarto-scss-export-input-placeholder-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-input-plaintext-color: #212529;--quarto-scss-export-form-check-label-color: ;--quarto-scss-export-form-check-transition: ;--quarto-scss-export-form-check-input-bg: #ffffff;--quarto-scss-export-form-check-input-focus-border: #86b7fe;--quarto-scss-export-form-check-input-checked-color: #ffffff;--quarto-scss-export-form-check-input-checked-bg-color: #0d6efd;--quarto-scss-export-form-check-input-checked-border-color: #0d6efd;--quarto-scss-export-form-check-input-indeterminate-color: #ffffff;--quarto-scss-export-form-check-input-indeterminate-bg-color: #0d6efd;--quarto-scss-export-form-check-input-indeterminate-border-color: #0d6efd;--quarto-scss-export-form-switch-color: rgba(0, 0, 0, 0.25);--quarto-scss-export-form-switch-focus-color: #86b7fe;--quarto-scss-export-form-switch-checked-color: #ffffff;--quarto-scss-export-input-group-addon-color: #212529;--quarto-scss-export-input-group-addon-bg: #f8f9fa;--quarto-scss-export-input-group-addon-border-color: white;--quarto-scss-export-form-select-font-family: ;--quarto-scss-export-form-select-color: #212529;--quarto-scss-export-form-select-bg: #ffffff;--quarto-scss-export-form-select-disabled-color: ;--quarto-scss-export-form-select-disabled-bg: #e9ecef;--quarto-scss-export-form-select-disabled-border-color: ;--quarto-scss-export-form-select-indicator-color: #343a40;--quarto-scss-export-form-select-border-color: white;--quarto-scss-export-form-select-focus-border-color: #86b7fe;--quarto-scss-export-form-range-track-bg: #f8f9fa;--quarto-scss-export-form-range-thumb-bg: #0d6efd;--quarto-scss-export-form-range-thumb-active-bg: #b6d4fe;--quarto-scss-export-form-range-thumb-disabled-bg: rgba(33, 37, 41, 0.75);--quarto-scss-export-form-file-button-color: #212529;--quarto-scss-export-form-file-button-bg: #f8f9fa;--quarto-scss-export-form-file-button-hover-bg: #e9ecef;--quarto-scss-export-form-floating-label-disabled-color: #6c757d;--quarto-scss-export-form-feedback-font-style: ;--quarto-scss-export-form-feedback-valid-color: #198754;--quarto-scss-export-form-feedback-invalid-color: #dc3545;--quarto-scss-export-form-feedback-icon-valid-color: #198754;--quarto-scss-export-form-feedback-icon-invalid-color: #dc3545;--quarto-scss-export-form-valid-color: #198754;--quarto-scss-export-form-valid-border-color: #198754;--quarto-scss-export-form-invalid-color: #dc3545;--quarto-scss-export-form-invalid-border-color: #dc3545;--quarto-scss-export-nav-link-font-size: ;--quarto-scss-export-nav-link-font-weight: ;--quarto-scss-export-nav-link-color: #0d6efd;--quarto-scss-export-nav-link-hover-color: #0a58ca;--quarto-scss-export-nav-link-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-nav-tabs-border-color: white;--quarto-scss-export-nav-tabs-link-hover-border-color: #e9ecef #e9ecef white;--quarto-scss-export-nav-tabs-link-active-color: #000;--quarto-scss-export-nav-tabs-link-active-bg: #ffffff;--quarto-scss-export-nav-pills-link-active-bg: #0d6efd;--quarto-scss-export-nav-pills-link-active-color: #ffffff;--quarto-scss-export-nav-underline-link-active-color: #000;--quarto-scss-export-navbar-padding-x: ;--quarto-scss-export-navbar-light-contrast: #ffffff;--quarto-scss-export-navbar-dark-contrast: #ffffff;--quarto-scss-export-navbar-light-icon-color: rgba(255, 255, 255, 0.75);--quarto-scss-export-navbar-dark-icon-color: rgba(255, 255, 255, 0.75);--quarto-scss-export-dropdown-color: #212529;--quarto-scss-export-dropdown-bg: #ffffff;--quarto-scss-export-dropdown-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-link-color: #212529;--quarto-scss-export-dropdown-link-hover-color: #212529;--quarto-scss-export-dropdown-link-hover-bg: #f8f9fa;--quarto-scss-export-dropdown-link-active-bg: #0d6efd;--quarto-scss-export-dropdown-link-active-color: #ffffff;--quarto-scss-export-dropdown-link-disabled-color: rgba(33, 37, 41, 0.5);--quarto-scss-export-dropdown-header-color: #6c757d;--quarto-scss-export-dropdown-dark-color: #dee2e6;--quarto-scss-export-dropdown-dark-bg: #343a40;--quarto-scss-export-dropdown-dark-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-dark-divider-bg: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-dark-box-shadow: ;--quarto-scss-export-dropdown-dark-link-color: #dee2e6;--quarto-scss-export-dropdown-dark-link-hover-color: #ffffff;--quarto-scss-export-dropdown-dark-link-hover-bg: rgba(255, 255, 255, 0.15);--quarto-scss-export-dropdown-dark-link-active-color: #ffffff;--quarto-scss-export-dropdown-dark-link-active-bg: #0d6efd;--quarto-scss-export-dropdown-dark-link-disabled-color: #adb5bd;--quarto-scss-export-dropdown-dark-header-color: #adb5bd;--quarto-scss-export-pagination-color: #0d6efd;--quarto-scss-export-pagination-bg: #ffffff;--quarto-scss-export-pagination-border-color: white;--quarto-scss-export-pagination-focus-color: #0a58ca;--quarto-scss-export-pagination-focus-bg: #e9ecef;--quarto-scss-export-pagination-hover-color: #0a58ca;--quarto-scss-export-pagination-hover-bg: #f8f9fa;--quarto-scss-export-pagination-hover-border-color: white;--quarto-scss-export-pagination-active-color: #ffffff;--quarto-scss-export-pagination-active-bg: #0d6efd;--quarto-scss-export-pagination-active-border-color: #0d6efd;--quarto-scss-export-pagination-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-pagination-disabled-bg: #e9ecef;--quarto-scss-export-pagination-disabled-border-color: white;--quarto-scss-export-card-title-color: ;--quarto-scss-export-card-subtitle-color: ;--quarto-scss-export-card-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-card-box-shadow: ;--quarto-scss-export-card-cap-bg: rgba(33, 37, 41, 0.03);--quarto-scss-export-card-cap-color: ;--quarto-scss-export-card-height: ;--quarto-scss-export-card-color: ;--quarto-scss-export-card-bg: #ffffff;--quarto-scss-export-accordion-color: #212529;--quarto-scss-export-accordion-bg: #ffffff;--quarto-scss-export-accordion-border-color: white;--quarto-scss-export-accordion-button-color: #212529;--quarto-scss-export-accordion-button-bg: #ffffff;--quarto-scss-export-accordion-button-active-bg: #cfe2ff;--quarto-scss-export-accordion-button-active-color: #052c65;--quarto-scss-export-accordion-button-focus-border-color: #86b7fe;--quarto-scss-export-accordion-icon-color: #212529;--quarto-scss-export-accordion-icon-active-color: #052c65;--quarto-scss-export-tooltip-color: #ffffff;--quarto-scss-export-tooltip-bg: #000;--quarto-scss-export-tooltip-margin: ;--quarto-scss-export-tooltip-arrow-color: ;--quarto-scss-export-form-feedback-tooltip-line-height: ;--quarto-scss-export-popover-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-popover-header-bg: #e9ecef;--quarto-scss-export-popover-body-color: #212529;--quarto-scss-export-popover-arrow-color: #ffffff;--quarto-scss-export-popover-arrow-outer-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-toast-color: ;--quarto-scss-export-toast-background-color: rgba(255, 255, 255, 0.85);--quarto-scss-export-toast-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-toast-header-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-toast-header-background-color: rgba(255, 255, 255, 0.85);--quarto-scss-export-toast-header-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-badge-color: #ffffff;--quarto-scss-export-modal-content-color: ;--quarto-scss-export-modal-content-bg: #ffffff;--quarto-scss-export-modal-content-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-modal-backdrop-bg: #000;--quarto-scss-export-modal-header-border-color: white;--quarto-scss-export-modal-footer-bg: ;--quarto-scss-export-modal-footer-border-color: white;--quarto-scss-export-progress-bg: #e9ecef;--quarto-scss-export-progress-bar-color: #ffffff;--quarto-scss-export-progress-bar-bg: #0d6efd;--quarto-scss-export-list-group-color: #212529;--quarto-scss-export-list-group-bg: #ffffff;--quarto-scss-export-list-group-border-color: white;--quarto-scss-export-list-group-hover-bg: #f8f9fa;--quarto-scss-export-list-group-active-bg: #0d6efd;--quarto-scss-export-list-group-active-color: #ffffff;--quarto-scss-export-list-group-active-border-color: #0d6efd;--quarto-scss-export-list-group-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-list-group-disabled-bg: #ffffff;--quarto-scss-export-list-group-action-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-list-group-action-hover-color: #000;--quarto-scss-export-list-group-action-active-color: #212529;--quarto-scss-export-list-group-action-active-bg: #e9ecef;--quarto-scss-export-thumbnail-bg: #ffffff;--quarto-scss-export-thumbnail-border-color: white;--quarto-scss-export-figure-caption-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-font-size: ;--quarto-scss-export-breadcrumb-bg: ;--quarto-scss-export-breadcrumb-divider-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-active-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-border-radius: ;--quarto-scss-export-carousel-control-color: #ffffff;--quarto-scss-export-carousel-indicator-active-bg: #ffffff;--quarto-scss-export-carousel-caption-color: #ffffff;--quarto-scss-export-carousel-dark-indicator-active-bg: #000;--quarto-scss-export-carousel-dark-caption-color: #000;--quarto-scss-export-btn-close-color: #000;--quarto-scss-export-offcanvas-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-offcanvas-bg-color: #ffffff;--quarto-scss-export-offcanvas-color: #212529;--quarto-scss-export-offcanvas-backdrop-bg: #000;--quarto-scss-export-code-color-dark: white;--quarto-scss-export-kbd-color: #ffffff;--quarto-scss-export-kbd-bg: #212529;--quarto-scss-export-nested-kbd-font-weight: ;--quarto-scss-export-pre-bg: #f8f9fa;--quarto-scss-export-pre-color: #000;--quarto-scss-export-bslib-page-sidebar-title-bg: #517699;--quarto-scss-export-bslib-page-sidebar-title-color: #ffffff;--quarto-scss-export-bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--quarto-scss-export-bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--quarto-scss-export-mermaid-bg-color: #ffffff;--quarto-scss-export-mermaid-edge-color: #6c757d;--quarto-scss-export-mermaid-node-fg-color: #212529;--quarto-scss-export-mermaid-fg-color: #212529;--quarto-scss-export-mermaid-fg-color--lighter: #383f45;--quarto-scss-export-mermaid-fg-color--lightest: #4e5862;--quarto-scss-export-mermaid-label-bg-color: #ffffff;--quarto-scss-export-mermaid-label-fg-color: #0d6efd;--quarto-scss-export-mermaid-node-bg-color: rgba(13, 110, 253, 0.1);--quarto-scss-export-code-block-border-left-color: white;--quarto-scss-export-callout-color-note: #0d6efd;--quarto-scss-export-callout-color-tip: #198754;--quarto-scss-export-callout-color-important: #dc3545;--quarto-scss-export-callout-color-caution: #fd7e14;--quarto-scss-export-callout-color-warning: #ffc107} \ No newline at end of file diff --git a/docs/validmind/vm_models_files/libs/bootstrap/bootstrap-icons.css b/docs/validmind/vm_models_files/libs/bootstrap/bootstrap-icons.css deleted file mode 100644 index 285e4448f..000000000 --- a/docs/validmind/vm_models_files/libs/bootstrap/bootstrap-icons.css +++ /dev/null @@ -1,2078 +0,0 @@ -/*! - * Bootstrap Icons v1.11.1 (https://icons.getbootstrap.com/) - * Copyright 2019-2023 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) - */ - -@font-face { - font-display: block; - font-family: "bootstrap-icons"; - src: -url("./bootstrap-icons.woff?2820a3852bdb9a5832199cc61cec4e65") format("woff"); -} - -.bi::before, -[class^="bi-"]::before, -[class*=" bi-"]::before { - display: inline-block; - font-family: bootstrap-icons !important; - font-style: normal; - font-weight: normal !important; - font-variant: normal; - text-transform: none; - line-height: 1; - vertical-align: -.125em; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.bi-123::before { content: "\f67f"; } -.bi-alarm-fill::before { content: "\f101"; } -.bi-alarm::before { content: "\f102"; } -.bi-align-bottom::before { content: "\f103"; } -.bi-align-center::before { content: "\f104"; } -.bi-align-end::before { content: "\f105"; } -.bi-align-middle::before { content: "\f106"; } -.bi-align-start::before { content: "\f107"; } -.bi-align-top::before { content: "\f108"; } -.bi-alt::before { content: "\f109"; } -.bi-app-indicator::before { content: "\f10a"; } -.bi-app::before { content: "\f10b"; } -.bi-archive-fill::before { content: "\f10c"; } -.bi-archive::before { content: "\f10d"; } -.bi-arrow-90deg-down::before { content: "\f10e"; } -.bi-arrow-90deg-left::before { content: "\f10f"; } -.bi-arrow-90deg-right::before { content: "\f110"; } -.bi-arrow-90deg-up::before { content: "\f111"; } -.bi-arrow-bar-down::before { content: "\f112"; } -.bi-arrow-bar-left::before { content: "\f113"; } -.bi-arrow-bar-right::before { content: "\f114"; } -.bi-arrow-bar-up::before { content: "\f115"; } -.bi-arrow-clockwise::before { content: "\f116"; } -.bi-arrow-counterclockwise::before { content: "\f117"; } -.bi-arrow-down-circle-fill::before { content: "\f118"; } -.bi-arrow-down-circle::before { content: "\f119"; } -.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } -.bi-arrow-down-left-circle::before { content: "\f11b"; } -.bi-arrow-down-left-square-fill::before { content: "\f11c"; } -.bi-arrow-down-left-square::before { content: "\f11d"; } -.bi-arrow-down-left::before { content: "\f11e"; } -.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } -.bi-arrow-down-right-circle::before { content: "\f120"; } -.bi-arrow-down-right-square-fill::before { content: "\f121"; } -.bi-arrow-down-right-square::before { content: "\f122"; } -.bi-arrow-down-right::before { content: "\f123"; } -.bi-arrow-down-short::before { content: "\f124"; } -.bi-arrow-down-square-fill::before { content: "\f125"; } -.bi-arrow-down-square::before { content: "\f126"; } -.bi-arrow-down-up::before { content: "\f127"; } -.bi-arrow-down::before { content: "\f128"; } -.bi-arrow-left-circle-fill::before { content: "\f129"; } -.bi-arrow-left-circle::before { content: "\f12a"; } -.bi-arrow-left-right::before { content: "\f12b"; } -.bi-arrow-left-short::before { content: "\f12c"; } -.bi-arrow-left-square-fill::before { content: "\f12d"; } -.bi-arrow-left-square::before { content: "\f12e"; } -.bi-arrow-left::before { content: "\f12f"; } -.bi-arrow-repeat::before { content: "\f130"; } -.bi-arrow-return-left::before { content: "\f131"; } -.bi-arrow-return-right::before { content: "\f132"; } -.bi-arrow-right-circle-fill::before { content: "\f133"; } -.bi-arrow-right-circle::before { content: "\f134"; } -.bi-arrow-right-short::before { content: "\f135"; } -.bi-arrow-right-square-fill::before { content: "\f136"; } -.bi-arrow-right-square::before { content: "\f137"; } -.bi-arrow-right::before { content: "\f138"; } -.bi-arrow-up-circle-fill::before { content: "\f139"; } -.bi-arrow-up-circle::before { content: "\f13a"; } -.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } -.bi-arrow-up-left-circle::before { content: "\f13c"; } -.bi-arrow-up-left-square-fill::before { content: "\f13d"; } -.bi-arrow-up-left-square::before { content: "\f13e"; } -.bi-arrow-up-left::before { content: "\f13f"; } -.bi-arrow-up-right-circle-fill::before { content: "\f140"; } -.bi-arrow-up-right-circle::before { content: "\f141"; } -.bi-arrow-up-right-square-fill::before { content: "\f142"; } -.bi-arrow-up-right-square::before { content: "\f143"; } -.bi-arrow-up-right::before { content: "\f144"; } -.bi-arrow-up-short::before { content: "\f145"; } -.bi-arrow-up-square-fill::before { content: "\f146"; } -.bi-arrow-up-square::before { content: "\f147"; } -.bi-arrow-up::before { content: "\f148"; } -.bi-arrows-angle-contract::before { content: "\f149"; } -.bi-arrows-angle-expand::before { content: "\f14a"; } -.bi-arrows-collapse::before { content: "\f14b"; } -.bi-arrows-expand::before { content: "\f14c"; } -.bi-arrows-fullscreen::before { content: "\f14d"; } -.bi-arrows-move::before { content: "\f14e"; } -.bi-aspect-ratio-fill::before { content: "\f14f"; } -.bi-aspect-ratio::before { content: "\f150"; } -.bi-asterisk::before { content: "\f151"; } -.bi-at::before { content: "\f152"; } -.bi-award-fill::before { content: "\f153"; } -.bi-award::before { content: "\f154"; } -.bi-back::before { content: "\f155"; } -.bi-backspace-fill::before { content: "\f156"; } -.bi-backspace-reverse-fill::before { content: "\f157"; } -.bi-backspace-reverse::before { content: "\f158"; } -.bi-backspace::before { content: "\f159"; } -.bi-badge-3d-fill::before { content: "\f15a"; } -.bi-badge-3d::before { content: "\f15b"; } -.bi-badge-4k-fill::before { content: "\f15c"; } -.bi-badge-4k::before { content: "\f15d"; } -.bi-badge-8k-fill::before { content: "\f15e"; } -.bi-badge-8k::before { content: "\f15f"; } -.bi-badge-ad-fill::before { content: "\f160"; } -.bi-badge-ad::before { content: "\f161"; } -.bi-badge-ar-fill::before { content: "\f162"; } -.bi-badge-ar::before { content: "\f163"; } -.bi-badge-cc-fill::before { content: "\f164"; } -.bi-badge-cc::before { content: "\f165"; } -.bi-badge-hd-fill::before { content: "\f166"; } -.bi-badge-hd::before { content: "\f167"; } -.bi-badge-tm-fill::before { content: "\f168"; } -.bi-badge-tm::before { content: "\f169"; } -.bi-badge-vo-fill::before { content: "\f16a"; } -.bi-badge-vo::before { content: "\f16b"; } -.bi-badge-vr-fill::before { content: "\f16c"; } -.bi-badge-vr::before { content: "\f16d"; } -.bi-badge-wc-fill::before { content: "\f16e"; } -.bi-badge-wc::before { content: "\f16f"; } -.bi-bag-check-fill::before { content: "\f170"; } -.bi-bag-check::before { content: "\f171"; } -.bi-bag-dash-fill::before { content: "\f172"; } -.bi-bag-dash::before { content: "\f173"; } -.bi-bag-fill::before { content: "\f174"; } -.bi-bag-plus-fill::before { content: "\f175"; } -.bi-bag-plus::before { content: "\f176"; } -.bi-bag-x-fill::before { content: "\f177"; } -.bi-bag-x::before { content: "\f178"; } -.bi-bag::before { content: "\f179"; } -.bi-bar-chart-fill::before { content: "\f17a"; } -.bi-bar-chart-line-fill::before { content: "\f17b"; } -.bi-bar-chart-line::before { content: "\f17c"; } -.bi-bar-chart-steps::before { content: "\f17d"; } -.bi-bar-chart::before { content: "\f17e"; } -.bi-basket-fill::before { content: "\f17f"; } -.bi-basket::before { content: "\f180"; } -.bi-basket2-fill::before { content: "\f181"; } -.bi-basket2::before { content: "\f182"; } -.bi-basket3-fill::before { content: "\f183"; } -.bi-basket3::before { content: "\f184"; } -.bi-battery-charging::before { content: "\f185"; } -.bi-battery-full::before { content: "\f186"; } -.bi-battery-half::before { content: "\f187"; } -.bi-battery::before { content: "\f188"; } -.bi-bell-fill::before { content: "\f189"; } -.bi-bell::before { content: "\f18a"; } -.bi-bezier::before { content: "\f18b"; } -.bi-bezier2::before { content: "\f18c"; } -.bi-bicycle::before { content: "\f18d"; } -.bi-binoculars-fill::before { content: "\f18e"; } -.bi-binoculars::before { content: "\f18f"; } -.bi-blockquote-left::before { content: "\f190"; } -.bi-blockquote-right::before { content: "\f191"; } -.bi-book-fill::before { content: "\f192"; } -.bi-book-half::before { content: "\f193"; } -.bi-book::before { content: "\f194"; } -.bi-bookmark-check-fill::before { content: "\f195"; } -.bi-bookmark-check::before { content: "\f196"; } -.bi-bookmark-dash-fill::before { content: "\f197"; } -.bi-bookmark-dash::before { content: "\f198"; } -.bi-bookmark-fill::before { content: "\f199"; } -.bi-bookmark-heart-fill::before { content: "\f19a"; } -.bi-bookmark-heart::before { content: "\f19b"; } -.bi-bookmark-plus-fill::before { content: "\f19c"; } -.bi-bookmark-plus::before { content: "\f19d"; } -.bi-bookmark-star-fill::before { content: "\f19e"; } -.bi-bookmark-star::before { content: "\f19f"; } -.bi-bookmark-x-fill::before { content: "\f1a0"; } -.bi-bookmark-x::before { content: "\f1a1"; } -.bi-bookmark::before { content: "\f1a2"; } -.bi-bookmarks-fill::before { content: "\f1a3"; } -.bi-bookmarks::before { content: "\f1a4"; } -.bi-bookshelf::before { content: "\f1a5"; } -.bi-bootstrap-fill::before { content: "\f1a6"; } -.bi-bootstrap-reboot::before { content: "\f1a7"; } -.bi-bootstrap::before { content: "\f1a8"; } -.bi-border-all::before { content: "\f1a9"; } -.bi-border-bottom::before { content: "\f1aa"; } -.bi-border-center::before { content: "\f1ab"; } -.bi-border-inner::before { content: "\f1ac"; } -.bi-border-left::before { content: "\f1ad"; } -.bi-border-middle::before { content: "\f1ae"; } -.bi-border-outer::before { content: "\f1af"; } -.bi-border-right::before { content: "\f1b0"; } -.bi-border-style::before { content: "\f1b1"; } -.bi-border-top::before { content: "\f1b2"; } -.bi-border-width::before { content: "\f1b3"; } -.bi-border::before { content: "\f1b4"; } -.bi-bounding-box-circles::before { content: "\f1b5"; } -.bi-bounding-box::before { content: "\f1b6"; } -.bi-box-arrow-down-left::before { content: "\f1b7"; } -.bi-box-arrow-down-right::before { content: "\f1b8"; } -.bi-box-arrow-down::before { content: "\f1b9"; } -.bi-box-arrow-in-down-left::before { content: "\f1ba"; } -.bi-box-arrow-in-down-right::before { content: "\f1bb"; } -.bi-box-arrow-in-down::before { content: "\f1bc"; } -.bi-box-arrow-in-left::before { content: "\f1bd"; } -.bi-box-arrow-in-right::before { content: "\f1be"; } -.bi-box-arrow-in-up-left::before { content: "\f1bf"; } -.bi-box-arrow-in-up-right::before { content: "\f1c0"; } -.bi-box-arrow-in-up::before { content: "\f1c1"; } -.bi-box-arrow-left::before { content: "\f1c2"; } -.bi-box-arrow-right::before { content: "\f1c3"; } -.bi-box-arrow-up-left::before { content: "\f1c4"; } -.bi-box-arrow-up-right::before { content: "\f1c5"; } -.bi-box-arrow-up::before { content: "\f1c6"; } -.bi-box-seam::before { content: "\f1c7"; } -.bi-box::before { content: "\f1c8"; } -.bi-braces::before { content: "\f1c9"; } -.bi-bricks::before { content: "\f1ca"; } -.bi-briefcase-fill::before { content: "\f1cb"; } -.bi-briefcase::before { content: "\f1cc"; } -.bi-brightness-alt-high-fill::before { content: "\f1cd"; } -.bi-brightness-alt-high::before { content: "\f1ce"; } -.bi-brightness-alt-low-fill::before { content: "\f1cf"; } -.bi-brightness-alt-low::before { content: "\f1d0"; } -.bi-brightness-high-fill::before { content: "\f1d1"; } -.bi-brightness-high::before { content: "\f1d2"; } -.bi-brightness-low-fill::before { content: "\f1d3"; } -.bi-brightness-low::before { content: "\f1d4"; } -.bi-broadcast-pin::before { content: "\f1d5"; } -.bi-broadcast::before { content: "\f1d6"; } -.bi-brush-fill::before { content: "\f1d7"; } -.bi-brush::before { content: "\f1d8"; } -.bi-bucket-fill::before { content: "\f1d9"; } -.bi-bucket::before { content: "\f1da"; } -.bi-bug-fill::before { content: "\f1db"; } -.bi-bug::before { content: "\f1dc"; } -.bi-building::before { content: "\f1dd"; } -.bi-bullseye::before { content: "\f1de"; } -.bi-calculator-fill::before { content: "\f1df"; } -.bi-calculator::before { content: "\f1e0"; } -.bi-calendar-check-fill::before { content: "\f1e1"; } -.bi-calendar-check::before { content: "\f1e2"; } -.bi-calendar-date-fill::before { content: "\f1e3"; } -.bi-calendar-date::before { content: "\f1e4"; } -.bi-calendar-day-fill::before { content: "\f1e5"; } -.bi-calendar-day::before { content: "\f1e6"; } -.bi-calendar-event-fill::before { content: "\f1e7"; } -.bi-calendar-event::before { content: "\f1e8"; } -.bi-calendar-fill::before { content: "\f1e9"; } -.bi-calendar-minus-fill::before { content: "\f1ea"; } -.bi-calendar-minus::before { content: "\f1eb"; } -.bi-calendar-month-fill::before { content: "\f1ec"; } -.bi-calendar-month::before { content: "\f1ed"; } -.bi-calendar-plus-fill::before { content: "\f1ee"; } -.bi-calendar-plus::before { content: "\f1ef"; } -.bi-calendar-range-fill::before { content: "\f1f0"; } -.bi-calendar-range::before { content: "\f1f1"; } -.bi-calendar-week-fill::before { content: "\f1f2"; } -.bi-calendar-week::before { content: "\f1f3"; } -.bi-calendar-x-fill::before { content: "\f1f4"; } -.bi-calendar-x::before { content: "\f1f5"; } -.bi-calendar::before { content: "\f1f6"; } -.bi-calendar2-check-fill::before { content: "\f1f7"; } -.bi-calendar2-check::before { content: "\f1f8"; } -.bi-calendar2-date-fill::before { content: "\f1f9"; } -.bi-calendar2-date::before { content: "\f1fa"; } -.bi-calendar2-day-fill::before { content: "\f1fb"; } -.bi-calendar2-day::before { content: "\f1fc"; } -.bi-calendar2-event-fill::before { content: "\f1fd"; } -.bi-calendar2-event::before { content: "\f1fe"; } -.bi-calendar2-fill::before { content: "\f1ff"; } -.bi-calendar2-minus-fill::before { content: "\f200"; } -.bi-calendar2-minus::before { content: "\f201"; } -.bi-calendar2-month-fill::before { content: "\f202"; } -.bi-calendar2-month::before { content: "\f203"; } -.bi-calendar2-plus-fill::before { content: "\f204"; } -.bi-calendar2-plus::before { content: "\f205"; } -.bi-calendar2-range-fill::before { content: "\f206"; } -.bi-calendar2-range::before { content: "\f207"; } -.bi-calendar2-week-fill::before { content: "\f208"; } -.bi-calendar2-week::before { content: "\f209"; } -.bi-calendar2-x-fill::before { content: "\f20a"; } -.bi-calendar2-x::before { content: "\f20b"; } -.bi-calendar2::before { content: "\f20c"; } -.bi-calendar3-event-fill::before { content: "\f20d"; } -.bi-calendar3-event::before { content: "\f20e"; } -.bi-calendar3-fill::before { content: "\f20f"; } -.bi-calendar3-range-fill::before { content: "\f210"; } -.bi-calendar3-range::before { content: "\f211"; } -.bi-calendar3-week-fill::before { content: "\f212"; } -.bi-calendar3-week::before { content: "\f213"; } -.bi-calendar3::before { content: "\f214"; } -.bi-calendar4-event::before { content: "\f215"; } -.bi-calendar4-range::before { content: "\f216"; } -.bi-calendar4-week::before { content: "\f217"; } -.bi-calendar4::before { content: "\f218"; } -.bi-camera-fill::before { content: "\f219"; } -.bi-camera-reels-fill::before { content: "\f21a"; } -.bi-camera-reels::before { content: "\f21b"; } -.bi-camera-video-fill::before { content: "\f21c"; } -.bi-camera-video-off-fill::before { content: "\f21d"; } -.bi-camera-video-off::before { content: "\f21e"; } -.bi-camera-video::before { content: "\f21f"; } -.bi-camera::before { content: "\f220"; } -.bi-camera2::before { content: "\f221"; } -.bi-capslock-fill::before { content: "\f222"; } -.bi-capslock::before { content: "\f223"; } -.bi-card-checklist::before { content: "\f224"; } -.bi-card-heading::before { content: "\f225"; } -.bi-card-image::before { content: "\f226"; } -.bi-card-list::before { content: "\f227"; } -.bi-card-text::before { content: "\f228"; } -.bi-caret-down-fill::before { content: "\f229"; } -.bi-caret-down-square-fill::before { content: "\f22a"; } -.bi-caret-down-square::before { content: "\f22b"; } -.bi-caret-down::before { content: "\f22c"; } -.bi-caret-left-fill::before { content: "\f22d"; } -.bi-caret-left-square-fill::before { content: "\f22e"; } -.bi-caret-left-square::before { content: "\f22f"; } -.bi-caret-left::before { content: "\f230"; } -.bi-caret-right-fill::before { content: "\f231"; } -.bi-caret-right-square-fill::before { content: "\f232"; } -.bi-caret-right-square::before { content: "\f233"; } -.bi-caret-right::before { content: "\f234"; } -.bi-caret-up-fill::before { content: "\f235"; } -.bi-caret-up-square-fill::before { content: "\f236"; } -.bi-caret-up-square::before { content: "\f237"; } -.bi-caret-up::before { content: "\f238"; } -.bi-cart-check-fill::before { content: "\f239"; } -.bi-cart-check::before { content: "\f23a"; } -.bi-cart-dash-fill::before { content: "\f23b"; } -.bi-cart-dash::before { content: "\f23c"; } -.bi-cart-fill::before { content: "\f23d"; } -.bi-cart-plus-fill::before { content: "\f23e"; } -.bi-cart-plus::before { content: "\f23f"; } -.bi-cart-x-fill::before { content: "\f240"; } -.bi-cart-x::before { content: "\f241"; } -.bi-cart::before { content: "\f242"; } -.bi-cart2::before { content: "\f243"; } -.bi-cart3::before { content: "\f244"; } -.bi-cart4::before { content: "\f245"; } -.bi-cash-stack::before { content: "\f246"; } -.bi-cash::before { content: "\f247"; } -.bi-cast::before { content: "\f248"; } -.bi-chat-dots-fill::before { content: "\f249"; } -.bi-chat-dots::before { content: "\f24a"; } -.bi-chat-fill::before { content: "\f24b"; } -.bi-chat-left-dots-fill::before { content: "\f24c"; } -.bi-chat-left-dots::before { content: "\f24d"; } -.bi-chat-left-fill::before { content: "\f24e"; } -.bi-chat-left-quote-fill::before { content: "\f24f"; } -.bi-chat-left-quote::before { content: "\f250"; } -.bi-chat-left-text-fill::before { content: "\f251"; } -.bi-chat-left-text::before { content: "\f252"; } -.bi-chat-left::before { content: "\f253"; } -.bi-chat-quote-fill::before { content: "\f254"; } -.bi-chat-quote::before { content: "\f255"; } -.bi-chat-right-dots-fill::before { content: "\f256"; } -.bi-chat-right-dots::before { content: "\f257"; } -.bi-chat-right-fill::before { content: "\f258"; } -.bi-chat-right-quote-fill::before { content: "\f259"; } -.bi-chat-right-quote::before { content: "\f25a"; } -.bi-chat-right-text-fill::before { content: "\f25b"; } -.bi-chat-right-text::before { content: "\f25c"; } -.bi-chat-right::before { content: "\f25d"; } -.bi-chat-square-dots-fill::before { content: "\f25e"; } -.bi-chat-square-dots::before { content: "\f25f"; } -.bi-chat-square-fill::before { content: "\f260"; } -.bi-chat-square-quote-fill::before { content: "\f261"; } -.bi-chat-square-quote::before { content: "\f262"; } -.bi-chat-square-text-fill::before { content: "\f263"; } -.bi-chat-square-text::before { content: "\f264"; } -.bi-chat-square::before { content: "\f265"; } -.bi-chat-text-fill::before { content: "\f266"; } -.bi-chat-text::before { content: "\f267"; } -.bi-chat::before { content: "\f268"; } -.bi-check-all::before { content: "\f269"; } -.bi-check-circle-fill::before { content: "\f26a"; } -.bi-check-circle::before { content: "\f26b"; } -.bi-check-square-fill::before { content: "\f26c"; } -.bi-check-square::before { content: "\f26d"; } -.bi-check::before { content: "\f26e"; } -.bi-check2-all::before { content: "\f26f"; } -.bi-check2-circle::before { content: "\f270"; } -.bi-check2-square::before { content: "\f271"; } -.bi-check2::before { content: "\f272"; } -.bi-chevron-bar-contract::before { content: "\f273"; } -.bi-chevron-bar-down::before { content: "\f274"; } -.bi-chevron-bar-expand::before { content: "\f275"; } -.bi-chevron-bar-left::before { content: "\f276"; } -.bi-chevron-bar-right::before { content: "\f277"; } -.bi-chevron-bar-up::before { content: "\f278"; } -.bi-chevron-compact-down::before { content: "\f279"; } -.bi-chevron-compact-left::before { content: "\f27a"; } -.bi-chevron-compact-right::before { content: "\f27b"; } -.bi-chevron-compact-up::before { content: "\f27c"; } -.bi-chevron-contract::before { content: "\f27d"; } -.bi-chevron-double-down::before { content: "\f27e"; } -.bi-chevron-double-left::before { content: "\f27f"; } -.bi-chevron-double-right::before { content: "\f280"; } -.bi-chevron-double-up::before { content: "\f281"; } -.bi-chevron-down::before { content: "\f282"; } -.bi-chevron-expand::before { content: "\f283"; } -.bi-chevron-left::before { content: "\f284"; } -.bi-chevron-right::before { content: "\f285"; } -.bi-chevron-up::before { content: "\f286"; } -.bi-circle-fill::before { content: "\f287"; } -.bi-circle-half::before { content: "\f288"; } -.bi-circle-square::before { content: "\f289"; } -.bi-circle::before { content: "\f28a"; } -.bi-clipboard-check::before { content: "\f28b"; } -.bi-clipboard-data::before { content: "\f28c"; } -.bi-clipboard-minus::before { content: "\f28d"; } -.bi-clipboard-plus::before { content: "\f28e"; } -.bi-clipboard-x::before { content: "\f28f"; } -.bi-clipboard::before { content: "\f290"; } -.bi-clock-fill::before { content: "\f291"; } -.bi-clock-history::before { content: "\f292"; } -.bi-clock::before { content: "\f293"; } -.bi-cloud-arrow-down-fill::before { content: "\f294"; } -.bi-cloud-arrow-down::before { content: "\f295"; } -.bi-cloud-arrow-up-fill::before { content: "\f296"; } -.bi-cloud-arrow-up::before { content: "\f297"; } -.bi-cloud-check-fill::before { content: "\f298"; } -.bi-cloud-check::before { content: "\f299"; } -.bi-cloud-download-fill::before { content: "\f29a"; } -.bi-cloud-download::before { content: "\f29b"; } -.bi-cloud-drizzle-fill::before { content: "\f29c"; } -.bi-cloud-drizzle::before { content: "\f29d"; } -.bi-cloud-fill::before { content: "\f29e"; } -.bi-cloud-fog-fill::before { content: "\f29f"; } -.bi-cloud-fog::before { content: "\f2a0"; } -.bi-cloud-fog2-fill::before { content: "\f2a1"; } -.bi-cloud-fog2::before { content: "\f2a2"; } -.bi-cloud-hail-fill::before { content: "\f2a3"; } -.bi-cloud-hail::before { content: "\f2a4"; } -.bi-cloud-haze-fill::before { content: "\f2a6"; } -.bi-cloud-haze::before { content: "\f2a7"; } -.bi-cloud-haze2-fill::before { content: "\f2a8"; } -.bi-cloud-lightning-fill::before { content: "\f2a9"; } -.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } -.bi-cloud-lightning-rain::before { content: "\f2ab"; } -.bi-cloud-lightning::before { content: "\f2ac"; } -.bi-cloud-minus-fill::before { content: "\f2ad"; } -.bi-cloud-minus::before { content: "\f2ae"; } -.bi-cloud-moon-fill::before { content: "\f2af"; } -.bi-cloud-moon::before { content: "\f2b0"; } -.bi-cloud-plus-fill::before { content: "\f2b1"; } -.bi-cloud-plus::before { content: "\f2b2"; } -.bi-cloud-rain-fill::before { content: "\f2b3"; } -.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } -.bi-cloud-rain-heavy::before { content: "\f2b5"; } -.bi-cloud-rain::before { content: "\f2b6"; } -.bi-cloud-slash-fill::before { content: "\f2b7"; } -.bi-cloud-slash::before { content: "\f2b8"; } -.bi-cloud-sleet-fill::before { content: "\f2b9"; } -.bi-cloud-sleet::before { content: "\f2ba"; } -.bi-cloud-snow-fill::before { content: "\f2bb"; } -.bi-cloud-snow::before { content: "\f2bc"; } -.bi-cloud-sun-fill::before { content: "\f2bd"; } -.bi-cloud-sun::before { content: "\f2be"; } -.bi-cloud-upload-fill::before { content: "\f2bf"; } -.bi-cloud-upload::before { content: "\f2c0"; } -.bi-cloud::before { content: "\f2c1"; } -.bi-clouds-fill::before { content: "\f2c2"; } -.bi-clouds::before { content: "\f2c3"; } -.bi-cloudy-fill::before { content: "\f2c4"; } -.bi-cloudy::before { content: "\f2c5"; } -.bi-code-slash::before { content: "\f2c6"; } -.bi-code-square::before { content: "\f2c7"; } -.bi-code::before { content: "\f2c8"; } -.bi-collection-fill::before { content: "\f2c9"; } -.bi-collection-play-fill::before { content: "\f2ca"; } -.bi-collection-play::before { content: "\f2cb"; } -.bi-collection::before { content: "\f2cc"; } -.bi-columns-gap::before { content: "\f2cd"; } -.bi-columns::before { content: "\f2ce"; } -.bi-command::before { content: "\f2cf"; } -.bi-compass-fill::before { content: "\f2d0"; } -.bi-compass::before { content: "\f2d1"; } -.bi-cone-striped::before { content: "\f2d2"; } -.bi-cone::before { content: "\f2d3"; } -.bi-controller::before { content: "\f2d4"; } -.bi-cpu-fill::before { content: "\f2d5"; } -.bi-cpu::before { content: "\f2d6"; } -.bi-credit-card-2-back-fill::before { content: "\f2d7"; } -.bi-credit-card-2-back::before { content: "\f2d8"; } -.bi-credit-card-2-front-fill::before { content: "\f2d9"; } -.bi-credit-card-2-front::before { content: "\f2da"; } -.bi-credit-card-fill::before { content: "\f2db"; } -.bi-credit-card::before { content: "\f2dc"; } -.bi-crop::before { content: "\f2dd"; } -.bi-cup-fill::before { content: "\f2de"; } -.bi-cup-straw::before { content: "\f2df"; } -.bi-cup::before { content: "\f2e0"; } -.bi-cursor-fill::before { content: "\f2e1"; } -.bi-cursor-text::before { content: "\f2e2"; } -.bi-cursor::before { content: "\f2e3"; } -.bi-dash-circle-dotted::before { content: "\f2e4"; } -.bi-dash-circle-fill::before { content: "\f2e5"; } -.bi-dash-circle::before { content: "\f2e6"; } -.bi-dash-square-dotted::before { content: "\f2e7"; } -.bi-dash-square-fill::before { content: "\f2e8"; } -.bi-dash-square::before { content: "\f2e9"; } -.bi-dash::before { content: "\f2ea"; } -.bi-diagram-2-fill::before { content: "\f2eb"; } -.bi-diagram-2::before { content: "\f2ec"; } -.bi-diagram-3-fill::before { content: "\f2ed"; } -.bi-diagram-3::before { content: "\f2ee"; } -.bi-diamond-fill::before { content: "\f2ef"; } -.bi-diamond-half::before { content: "\f2f0"; } -.bi-diamond::before { content: "\f2f1"; } -.bi-dice-1-fill::before { content: "\f2f2"; } -.bi-dice-1::before { content: "\f2f3"; } -.bi-dice-2-fill::before { content: "\f2f4"; } -.bi-dice-2::before { content: "\f2f5"; } -.bi-dice-3-fill::before { content: "\f2f6"; } -.bi-dice-3::before { content: "\f2f7"; } -.bi-dice-4-fill::before { content: "\f2f8"; } -.bi-dice-4::before { content: "\f2f9"; } -.bi-dice-5-fill::before { content: "\f2fa"; } -.bi-dice-5::before { content: "\f2fb"; } -.bi-dice-6-fill::before { content: "\f2fc"; } -.bi-dice-6::before { content: "\f2fd"; } -.bi-disc-fill::before { content: "\f2fe"; } -.bi-disc::before { content: "\f2ff"; } -.bi-discord::before { content: "\f300"; } -.bi-display-fill::before { content: "\f301"; } -.bi-display::before { content: "\f302"; } -.bi-distribute-horizontal::before { content: "\f303"; } -.bi-distribute-vertical::before { content: "\f304"; } -.bi-door-closed-fill::before { content: "\f305"; } -.bi-door-closed::before { content: "\f306"; } -.bi-door-open-fill::before { content: "\f307"; } -.bi-door-open::before { content: "\f308"; } -.bi-dot::before { content: "\f309"; } -.bi-download::before { content: "\f30a"; } -.bi-droplet-fill::before { content: "\f30b"; } -.bi-droplet-half::before { content: "\f30c"; } -.bi-droplet::before { content: "\f30d"; } -.bi-earbuds::before { content: "\f30e"; } -.bi-easel-fill::before { content: "\f30f"; } -.bi-easel::before { content: "\f310"; } -.bi-egg-fill::before { content: "\f311"; } -.bi-egg-fried::before { content: "\f312"; } -.bi-egg::before { content: "\f313"; } -.bi-eject-fill::before { content: "\f314"; } -.bi-eject::before { content: "\f315"; } -.bi-emoji-angry-fill::before { content: "\f316"; } -.bi-emoji-angry::before { content: "\f317"; } -.bi-emoji-dizzy-fill::before { content: "\f318"; } -.bi-emoji-dizzy::before { content: "\f319"; } -.bi-emoji-expressionless-fill::before { content: "\f31a"; } -.bi-emoji-expressionless::before { content: "\f31b"; } -.bi-emoji-frown-fill::before { content: "\f31c"; } -.bi-emoji-frown::before { content: "\f31d"; } -.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } -.bi-emoji-heart-eyes::before { content: "\f31f"; } -.bi-emoji-laughing-fill::before { content: "\f320"; } -.bi-emoji-laughing::before { content: "\f321"; } -.bi-emoji-neutral-fill::before { content: "\f322"; } -.bi-emoji-neutral::before { content: "\f323"; } -.bi-emoji-smile-fill::before { content: "\f324"; } -.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } -.bi-emoji-smile-upside-down::before { content: "\f326"; } -.bi-emoji-smile::before { content: "\f327"; } -.bi-emoji-sunglasses-fill::before { content: "\f328"; } -.bi-emoji-sunglasses::before { content: "\f329"; } -.bi-emoji-wink-fill::before { content: "\f32a"; } -.bi-emoji-wink::before { content: "\f32b"; } -.bi-envelope-fill::before { content: "\f32c"; } -.bi-envelope-open-fill::before { content: "\f32d"; } -.bi-envelope-open::before { content: "\f32e"; } -.bi-envelope::before { content: "\f32f"; } -.bi-eraser-fill::before { content: "\f330"; } -.bi-eraser::before { content: "\f331"; } -.bi-exclamation-circle-fill::before { content: "\f332"; } -.bi-exclamation-circle::before { content: "\f333"; } -.bi-exclamation-diamond-fill::before { content: "\f334"; } -.bi-exclamation-diamond::before { content: "\f335"; } -.bi-exclamation-octagon-fill::before { content: "\f336"; } -.bi-exclamation-octagon::before { content: "\f337"; } -.bi-exclamation-square-fill::before { content: "\f338"; } -.bi-exclamation-square::before { content: "\f339"; } -.bi-exclamation-triangle-fill::before { content: "\f33a"; } -.bi-exclamation-triangle::before { content: "\f33b"; } -.bi-exclamation::before { content: "\f33c"; } -.bi-exclude::before { content: "\f33d"; } -.bi-eye-fill::before { content: "\f33e"; } -.bi-eye-slash-fill::before { content: "\f33f"; } -.bi-eye-slash::before { content: "\f340"; } -.bi-eye::before { content: "\f341"; } -.bi-eyedropper::before { content: "\f342"; } -.bi-eyeglasses::before { content: "\f343"; } -.bi-facebook::before { content: "\f344"; } -.bi-file-arrow-down-fill::before { content: "\f345"; } -.bi-file-arrow-down::before { content: "\f346"; } -.bi-file-arrow-up-fill::before { content: "\f347"; } -.bi-file-arrow-up::before { content: "\f348"; } -.bi-file-bar-graph-fill::before { content: "\f349"; } -.bi-file-bar-graph::before { content: "\f34a"; } -.bi-file-binary-fill::before { content: "\f34b"; } -.bi-file-binary::before { content: "\f34c"; } -.bi-file-break-fill::before { content: "\f34d"; } -.bi-file-break::before { content: "\f34e"; } -.bi-file-check-fill::before { content: "\f34f"; } -.bi-file-check::before { content: "\f350"; } -.bi-file-code-fill::before { content: "\f351"; } -.bi-file-code::before { content: "\f352"; } -.bi-file-diff-fill::before { content: "\f353"; } -.bi-file-diff::before { content: "\f354"; } -.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } -.bi-file-earmark-arrow-down::before { content: "\f356"; } -.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } -.bi-file-earmark-arrow-up::before { content: "\f358"; } -.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } -.bi-file-earmark-bar-graph::before { content: "\f35a"; } -.bi-file-earmark-binary-fill::before { content: "\f35b"; } -.bi-file-earmark-binary::before { content: "\f35c"; } -.bi-file-earmark-break-fill::before { content: "\f35d"; } -.bi-file-earmark-break::before { content: "\f35e"; } -.bi-file-earmark-check-fill::before { content: "\f35f"; } -.bi-file-earmark-check::before { content: "\f360"; } -.bi-file-earmark-code-fill::before { content: "\f361"; } -.bi-file-earmark-code::before { content: "\f362"; } -.bi-file-earmark-diff-fill::before { content: "\f363"; } -.bi-file-earmark-diff::before { content: "\f364"; } -.bi-file-earmark-easel-fill::before { content: "\f365"; } -.bi-file-earmark-easel::before { content: "\f366"; } -.bi-file-earmark-excel-fill::before { content: "\f367"; } -.bi-file-earmark-excel::before { content: "\f368"; } -.bi-file-earmark-fill::before { content: "\f369"; } -.bi-file-earmark-font-fill::before { content: "\f36a"; } -.bi-file-earmark-font::before { content: "\f36b"; } -.bi-file-earmark-image-fill::before { content: "\f36c"; } -.bi-file-earmark-image::before { content: "\f36d"; } -.bi-file-earmark-lock-fill::before { content: "\f36e"; } -.bi-file-earmark-lock::before { content: "\f36f"; } -.bi-file-earmark-lock2-fill::before { content: "\f370"; } -.bi-file-earmark-lock2::before { content: "\f371"; } -.bi-file-earmark-medical-fill::before { content: "\f372"; } -.bi-file-earmark-medical::before { content: "\f373"; } -.bi-file-earmark-minus-fill::before { content: "\f374"; } -.bi-file-earmark-minus::before { content: "\f375"; } -.bi-file-earmark-music-fill::before { content: "\f376"; } -.bi-file-earmark-music::before { content: "\f377"; } -.bi-file-earmark-person-fill::before { content: "\f378"; } -.bi-file-earmark-person::before { content: "\f379"; } -.bi-file-earmark-play-fill::before { content: "\f37a"; } -.bi-file-earmark-play::before { content: "\f37b"; } -.bi-file-earmark-plus-fill::before { content: "\f37c"; } -.bi-file-earmark-plus::before { content: "\f37d"; } -.bi-file-earmark-post-fill::before { content: "\f37e"; } -.bi-file-earmark-post::before { content: "\f37f"; } -.bi-file-earmark-ppt-fill::before { content: "\f380"; } -.bi-file-earmark-ppt::before { content: "\f381"; } -.bi-file-earmark-richtext-fill::before { content: "\f382"; } -.bi-file-earmark-richtext::before { content: "\f383"; } -.bi-file-earmark-ruled-fill::before { content: "\f384"; } -.bi-file-earmark-ruled::before { content: "\f385"; } -.bi-file-earmark-slides-fill::before { content: "\f386"; } -.bi-file-earmark-slides::before { content: "\f387"; } -.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } -.bi-file-earmark-spreadsheet::before { content: "\f389"; } -.bi-file-earmark-text-fill::before { content: "\f38a"; } -.bi-file-earmark-text::before { content: "\f38b"; } -.bi-file-earmark-word-fill::before { content: "\f38c"; } -.bi-file-earmark-word::before { content: "\f38d"; } -.bi-file-earmark-x-fill::before { content: "\f38e"; } -.bi-file-earmark-x::before { content: "\f38f"; } -.bi-file-earmark-zip-fill::before { content: "\f390"; } -.bi-file-earmark-zip::before { content: "\f391"; } -.bi-file-earmark::before { content: "\f392"; } -.bi-file-easel-fill::before { content: "\f393"; } -.bi-file-easel::before { content: "\f394"; } -.bi-file-excel-fill::before { content: "\f395"; } -.bi-file-excel::before { content: "\f396"; } -.bi-file-fill::before { content: "\f397"; } -.bi-file-font-fill::before { content: "\f398"; } -.bi-file-font::before { content: "\f399"; } -.bi-file-image-fill::before { content: "\f39a"; } -.bi-file-image::before { content: "\f39b"; } -.bi-file-lock-fill::before { content: "\f39c"; } -.bi-file-lock::before { content: "\f39d"; } -.bi-file-lock2-fill::before { content: "\f39e"; } -.bi-file-lock2::before { content: "\f39f"; } -.bi-file-medical-fill::before { content: "\f3a0"; } -.bi-file-medical::before { content: "\f3a1"; } -.bi-file-minus-fill::before { content: "\f3a2"; } -.bi-file-minus::before { content: "\f3a3"; } -.bi-file-music-fill::before { content: "\f3a4"; } -.bi-file-music::before { content: "\f3a5"; } -.bi-file-person-fill::before { content: "\f3a6"; } -.bi-file-person::before { content: "\f3a7"; } -.bi-file-play-fill::before { content: "\f3a8"; } -.bi-file-play::before { content: "\f3a9"; } -.bi-file-plus-fill::before { content: "\f3aa"; } -.bi-file-plus::before { content: "\f3ab"; } -.bi-file-post-fill::before { content: "\f3ac"; } -.bi-file-post::before { content: "\f3ad"; } -.bi-file-ppt-fill::before { content: "\f3ae"; } -.bi-file-ppt::before { content: "\f3af"; } -.bi-file-richtext-fill::before { content: "\f3b0"; } -.bi-file-richtext::before { content: "\f3b1"; } -.bi-file-ruled-fill::before { content: "\f3b2"; } -.bi-file-ruled::before { content: "\f3b3"; } -.bi-file-slides-fill::before { content: "\f3b4"; } -.bi-file-slides::before { content: "\f3b5"; } -.bi-file-spreadsheet-fill::before { content: "\f3b6"; } -.bi-file-spreadsheet::before { content: "\f3b7"; } -.bi-file-text-fill::before { content: "\f3b8"; } -.bi-file-text::before { content: "\f3b9"; } -.bi-file-word-fill::before { content: "\f3ba"; } -.bi-file-word::before { content: "\f3bb"; } -.bi-file-x-fill::before { content: "\f3bc"; } -.bi-file-x::before { content: "\f3bd"; } -.bi-file-zip-fill::before { content: "\f3be"; } -.bi-file-zip::before { content: "\f3bf"; } -.bi-file::before { content: "\f3c0"; } -.bi-files-alt::before { content: "\f3c1"; } -.bi-files::before { content: "\f3c2"; } -.bi-film::before { content: "\f3c3"; } -.bi-filter-circle-fill::before { content: "\f3c4"; } -.bi-filter-circle::before { content: "\f3c5"; } -.bi-filter-left::before { content: "\f3c6"; } -.bi-filter-right::before { content: "\f3c7"; } -.bi-filter-square-fill::before { content: "\f3c8"; } -.bi-filter-square::before { content: "\f3c9"; } -.bi-filter::before { content: "\f3ca"; } -.bi-flag-fill::before { content: "\f3cb"; } -.bi-flag::before { content: "\f3cc"; } -.bi-flower1::before { content: "\f3cd"; } -.bi-flower2::before { content: "\f3ce"; } -.bi-flower3::before { content: "\f3cf"; } -.bi-folder-check::before { content: "\f3d0"; } -.bi-folder-fill::before { content: "\f3d1"; } -.bi-folder-minus::before { content: "\f3d2"; } -.bi-folder-plus::before { content: "\f3d3"; } -.bi-folder-symlink-fill::before { content: "\f3d4"; } -.bi-folder-symlink::before { content: "\f3d5"; } -.bi-folder-x::before { content: "\f3d6"; } -.bi-folder::before { content: "\f3d7"; } -.bi-folder2-open::before { content: "\f3d8"; } -.bi-folder2::before { content: "\f3d9"; } -.bi-fonts::before { content: "\f3da"; } -.bi-forward-fill::before { content: "\f3db"; } -.bi-forward::before { content: "\f3dc"; } -.bi-front::before { content: "\f3dd"; } -.bi-fullscreen-exit::before { content: "\f3de"; } -.bi-fullscreen::before { content: "\f3df"; } -.bi-funnel-fill::before { content: "\f3e0"; } -.bi-funnel::before { content: "\f3e1"; } -.bi-gear-fill::before { content: "\f3e2"; } -.bi-gear-wide-connected::before { content: "\f3e3"; } -.bi-gear-wide::before { content: "\f3e4"; } -.bi-gear::before { content: "\f3e5"; } -.bi-gem::before { content: "\f3e6"; } -.bi-geo-alt-fill::before { content: "\f3e7"; } -.bi-geo-alt::before { content: "\f3e8"; } -.bi-geo-fill::before { content: "\f3e9"; } -.bi-geo::before { content: "\f3ea"; } -.bi-gift-fill::before { content: "\f3eb"; } -.bi-gift::before { content: "\f3ec"; } -.bi-github::before { content: "\f3ed"; } -.bi-globe::before { content: "\f3ee"; } -.bi-globe2::before { content: "\f3ef"; } -.bi-google::before { content: "\f3f0"; } -.bi-graph-down::before { content: "\f3f1"; } -.bi-graph-up::before { content: "\f3f2"; } -.bi-grid-1x2-fill::before { content: "\f3f3"; } -.bi-grid-1x2::before { content: "\f3f4"; } -.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } -.bi-grid-3x2-gap::before { content: "\f3f6"; } -.bi-grid-3x2::before { content: "\f3f7"; } -.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } -.bi-grid-3x3-gap::before { content: "\f3f9"; } -.bi-grid-3x3::before { content: "\f3fa"; } -.bi-grid-fill::before { content: "\f3fb"; } -.bi-grid::before { content: "\f3fc"; } -.bi-grip-horizontal::before { content: "\f3fd"; } -.bi-grip-vertical::before { content: "\f3fe"; } -.bi-hammer::before { content: "\f3ff"; } -.bi-hand-index-fill::before { content: "\f400"; } -.bi-hand-index-thumb-fill::before { content: "\f401"; } -.bi-hand-index-thumb::before { content: "\f402"; } -.bi-hand-index::before { content: "\f403"; } -.bi-hand-thumbs-down-fill::before { content: "\f404"; } -.bi-hand-thumbs-down::before { content: "\f405"; } -.bi-hand-thumbs-up-fill::before { content: "\f406"; } -.bi-hand-thumbs-up::before { content: "\f407"; } -.bi-handbag-fill::before { content: "\f408"; } -.bi-handbag::before { content: "\f409"; } -.bi-hash::before { content: "\f40a"; } -.bi-hdd-fill::before { content: "\f40b"; } -.bi-hdd-network-fill::before { content: "\f40c"; } -.bi-hdd-network::before { content: "\f40d"; } -.bi-hdd-rack-fill::before { content: "\f40e"; } -.bi-hdd-rack::before { content: "\f40f"; } -.bi-hdd-stack-fill::before { content: "\f410"; } -.bi-hdd-stack::before { content: "\f411"; } -.bi-hdd::before { content: "\f412"; } -.bi-headphones::before { content: "\f413"; } -.bi-headset::before { content: "\f414"; } -.bi-heart-fill::before { content: "\f415"; } -.bi-heart-half::before { content: "\f416"; } -.bi-heart::before { content: "\f417"; } -.bi-heptagon-fill::before { content: "\f418"; } -.bi-heptagon-half::before { content: "\f419"; } -.bi-heptagon::before { content: "\f41a"; } -.bi-hexagon-fill::before { content: "\f41b"; } -.bi-hexagon-half::before { content: "\f41c"; } -.bi-hexagon::before { content: "\f41d"; } -.bi-hourglass-bottom::before { content: "\f41e"; } -.bi-hourglass-split::before { content: "\f41f"; } -.bi-hourglass-top::before { content: "\f420"; } -.bi-hourglass::before { content: "\f421"; } -.bi-house-door-fill::before { content: "\f422"; } -.bi-house-door::before { content: "\f423"; } -.bi-house-fill::before { content: "\f424"; } -.bi-house::before { content: "\f425"; } -.bi-hr::before { content: "\f426"; } -.bi-hurricane::before { content: "\f427"; } -.bi-image-alt::before { content: "\f428"; } -.bi-image-fill::before { content: "\f429"; } -.bi-image::before { content: "\f42a"; } -.bi-images::before { content: "\f42b"; } -.bi-inbox-fill::before { content: "\f42c"; } -.bi-inbox::before { content: "\f42d"; } -.bi-inboxes-fill::before { content: "\f42e"; } -.bi-inboxes::before { content: "\f42f"; } -.bi-info-circle-fill::before { content: "\f430"; } -.bi-info-circle::before { content: "\f431"; } -.bi-info-square-fill::before { content: "\f432"; } -.bi-info-square::before { content: "\f433"; } -.bi-info::before { content: "\f434"; } -.bi-input-cursor-text::before { content: "\f435"; } -.bi-input-cursor::before { content: "\f436"; } -.bi-instagram::before { content: "\f437"; } -.bi-intersect::before { content: "\f438"; } -.bi-journal-album::before { content: "\f439"; } -.bi-journal-arrow-down::before { content: "\f43a"; } -.bi-journal-arrow-up::before { content: "\f43b"; } -.bi-journal-bookmark-fill::before { content: "\f43c"; } -.bi-journal-bookmark::before { content: "\f43d"; } -.bi-journal-check::before { content: "\f43e"; } -.bi-journal-code::before { content: "\f43f"; } -.bi-journal-medical::before { content: "\f440"; } -.bi-journal-minus::before { content: "\f441"; } -.bi-journal-plus::before { content: "\f442"; } -.bi-journal-richtext::before { content: "\f443"; } -.bi-journal-text::before { content: "\f444"; } -.bi-journal-x::before { content: "\f445"; } -.bi-journal::before { content: "\f446"; } -.bi-journals::before { content: "\f447"; } -.bi-joystick::before { content: "\f448"; } -.bi-justify-left::before { content: "\f449"; } -.bi-justify-right::before { content: "\f44a"; } -.bi-justify::before { content: "\f44b"; } -.bi-kanban-fill::before { content: "\f44c"; } -.bi-kanban::before { content: "\f44d"; } -.bi-key-fill::before { content: "\f44e"; } -.bi-key::before { content: "\f44f"; } -.bi-keyboard-fill::before { content: "\f450"; } -.bi-keyboard::before { content: "\f451"; } -.bi-ladder::before { content: "\f452"; } -.bi-lamp-fill::before { content: "\f453"; } -.bi-lamp::before { content: "\f454"; } -.bi-laptop-fill::before { content: "\f455"; } -.bi-laptop::before { content: "\f456"; } -.bi-layer-backward::before { content: "\f457"; } -.bi-layer-forward::before { content: "\f458"; } -.bi-layers-fill::before { content: "\f459"; } -.bi-layers-half::before { content: "\f45a"; } -.bi-layers::before { content: "\f45b"; } -.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } -.bi-layout-sidebar-inset::before { content: "\f45d"; } -.bi-layout-sidebar-reverse::before { content: "\f45e"; } -.bi-layout-sidebar::before { content: "\f45f"; } -.bi-layout-split::before { content: "\f460"; } -.bi-layout-text-sidebar-reverse::before { content: "\f461"; } -.bi-layout-text-sidebar::before { content: "\f462"; } -.bi-layout-text-window-reverse::before { content: "\f463"; } -.bi-layout-text-window::before { content: "\f464"; } -.bi-layout-three-columns::before { content: "\f465"; } -.bi-layout-wtf::before { content: "\f466"; } -.bi-life-preserver::before { content: "\f467"; } -.bi-lightbulb-fill::before { content: "\f468"; } -.bi-lightbulb-off-fill::before { content: "\f469"; } -.bi-lightbulb-off::before { content: "\f46a"; } -.bi-lightbulb::before { content: "\f46b"; } -.bi-lightning-charge-fill::before { content: "\f46c"; } -.bi-lightning-charge::before { content: "\f46d"; } -.bi-lightning-fill::before { content: "\f46e"; } -.bi-lightning::before { content: "\f46f"; } -.bi-link-45deg::before { content: "\f470"; } -.bi-link::before { content: "\f471"; } -.bi-linkedin::before { content: "\f472"; } -.bi-list-check::before { content: "\f473"; } -.bi-list-nested::before { content: "\f474"; } -.bi-list-ol::before { content: "\f475"; } -.bi-list-stars::before { content: "\f476"; } -.bi-list-task::before { content: "\f477"; } -.bi-list-ul::before { content: "\f478"; } -.bi-list::before { content: "\f479"; } -.bi-lock-fill::before { content: "\f47a"; } -.bi-lock::before { content: "\f47b"; } -.bi-mailbox::before { content: "\f47c"; } -.bi-mailbox2::before { content: "\f47d"; } -.bi-map-fill::before { content: "\f47e"; } -.bi-map::before { content: "\f47f"; } -.bi-markdown-fill::before { content: "\f480"; } -.bi-markdown::before { content: "\f481"; } -.bi-mask::before { content: "\f482"; } -.bi-megaphone-fill::before { content: "\f483"; } -.bi-megaphone::before { content: "\f484"; } -.bi-menu-app-fill::before { content: "\f485"; } -.bi-menu-app::before { content: "\f486"; } -.bi-menu-button-fill::before { content: "\f487"; } -.bi-menu-button-wide-fill::before { content: "\f488"; } -.bi-menu-button-wide::before { content: "\f489"; } -.bi-menu-button::before { content: "\f48a"; } -.bi-menu-down::before { content: "\f48b"; } -.bi-menu-up::before { content: "\f48c"; } -.bi-mic-fill::before { content: "\f48d"; } -.bi-mic-mute-fill::before { content: "\f48e"; } -.bi-mic-mute::before { content: "\f48f"; } -.bi-mic::before { content: "\f490"; } -.bi-minecart-loaded::before { content: "\f491"; } -.bi-minecart::before { content: "\f492"; } -.bi-moisture::before { content: "\f493"; } -.bi-moon-fill::before { content: "\f494"; } -.bi-moon-stars-fill::before { content: "\f495"; } -.bi-moon-stars::before { content: "\f496"; } -.bi-moon::before { content: "\f497"; } -.bi-mouse-fill::before { content: "\f498"; } -.bi-mouse::before { content: "\f499"; } -.bi-mouse2-fill::before { content: "\f49a"; } -.bi-mouse2::before { content: "\f49b"; } -.bi-mouse3-fill::before { content: "\f49c"; } -.bi-mouse3::before { content: "\f49d"; } -.bi-music-note-beamed::before { content: "\f49e"; } -.bi-music-note-list::before { content: "\f49f"; } -.bi-music-note::before { content: "\f4a0"; } -.bi-music-player-fill::before { content: "\f4a1"; } -.bi-music-player::before { content: "\f4a2"; } -.bi-newspaper::before { content: "\f4a3"; } -.bi-node-minus-fill::before { content: "\f4a4"; } -.bi-node-minus::before { content: "\f4a5"; } -.bi-node-plus-fill::before { content: "\f4a6"; } -.bi-node-plus::before { content: "\f4a7"; } -.bi-nut-fill::before { content: "\f4a8"; } -.bi-nut::before { content: "\f4a9"; } -.bi-octagon-fill::before { content: "\f4aa"; } -.bi-octagon-half::before { content: "\f4ab"; } -.bi-octagon::before { content: "\f4ac"; } -.bi-option::before { content: "\f4ad"; } -.bi-outlet::before { content: "\f4ae"; } -.bi-paint-bucket::before { content: "\f4af"; } -.bi-palette-fill::before { content: "\f4b0"; } -.bi-palette::before { content: "\f4b1"; } -.bi-palette2::before { content: "\f4b2"; } -.bi-paperclip::before { content: "\f4b3"; } -.bi-paragraph::before { content: "\f4b4"; } -.bi-patch-check-fill::before { content: "\f4b5"; } -.bi-patch-check::before { content: "\f4b6"; } -.bi-patch-exclamation-fill::before { content: "\f4b7"; } -.bi-patch-exclamation::before { content: "\f4b8"; } -.bi-patch-minus-fill::before { content: "\f4b9"; } -.bi-patch-minus::before { content: "\f4ba"; } -.bi-patch-plus-fill::before { content: "\f4bb"; } -.bi-patch-plus::before { content: "\f4bc"; } -.bi-patch-question-fill::before { content: "\f4bd"; } -.bi-patch-question::before { content: "\f4be"; } -.bi-pause-btn-fill::before { content: "\f4bf"; } -.bi-pause-btn::before { content: "\f4c0"; } -.bi-pause-circle-fill::before { content: "\f4c1"; } -.bi-pause-circle::before { content: "\f4c2"; } -.bi-pause-fill::before { content: "\f4c3"; } -.bi-pause::before { content: "\f4c4"; } -.bi-peace-fill::before { content: "\f4c5"; } -.bi-peace::before { content: "\f4c6"; } -.bi-pen-fill::before { content: "\f4c7"; } -.bi-pen::before { content: "\f4c8"; } -.bi-pencil-fill::before { content: "\f4c9"; } -.bi-pencil-square::before { content: "\f4ca"; } -.bi-pencil::before { content: "\f4cb"; } -.bi-pentagon-fill::before { content: "\f4cc"; } -.bi-pentagon-half::before { content: "\f4cd"; } -.bi-pentagon::before { content: "\f4ce"; } -.bi-people-fill::before { content: "\f4cf"; } -.bi-people::before { content: "\f4d0"; } -.bi-percent::before { content: "\f4d1"; } -.bi-person-badge-fill::before { content: "\f4d2"; } -.bi-person-badge::before { content: "\f4d3"; } -.bi-person-bounding-box::before { content: "\f4d4"; } -.bi-person-check-fill::before { content: "\f4d5"; } -.bi-person-check::before { content: "\f4d6"; } -.bi-person-circle::before { content: "\f4d7"; } -.bi-person-dash-fill::before { content: "\f4d8"; } -.bi-person-dash::before { content: "\f4d9"; } -.bi-person-fill::before { content: "\f4da"; } -.bi-person-lines-fill::before { content: "\f4db"; } -.bi-person-plus-fill::before { content: "\f4dc"; } -.bi-person-plus::before { content: "\f4dd"; } -.bi-person-square::before { content: "\f4de"; } -.bi-person-x-fill::before { content: "\f4df"; } -.bi-person-x::before { content: "\f4e0"; } -.bi-person::before { content: "\f4e1"; } -.bi-phone-fill::before { content: "\f4e2"; } -.bi-phone-landscape-fill::before { content: "\f4e3"; } -.bi-phone-landscape::before { content: "\f4e4"; } -.bi-phone-vibrate-fill::before { content: "\f4e5"; } -.bi-phone-vibrate::before { content: "\f4e6"; } -.bi-phone::before { content: "\f4e7"; } -.bi-pie-chart-fill::before { content: "\f4e8"; } -.bi-pie-chart::before { content: "\f4e9"; } -.bi-pin-angle-fill::before { content: "\f4ea"; } -.bi-pin-angle::before { content: "\f4eb"; } -.bi-pin-fill::before { content: "\f4ec"; } -.bi-pin::before { content: "\f4ed"; } -.bi-pip-fill::before { content: "\f4ee"; } -.bi-pip::before { content: "\f4ef"; } -.bi-play-btn-fill::before { content: "\f4f0"; } -.bi-play-btn::before { content: "\f4f1"; } -.bi-play-circle-fill::before { content: "\f4f2"; } -.bi-play-circle::before { content: "\f4f3"; } -.bi-play-fill::before { content: "\f4f4"; } -.bi-play::before { content: "\f4f5"; } -.bi-plug-fill::before { content: "\f4f6"; } -.bi-plug::before { content: "\f4f7"; } -.bi-plus-circle-dotted::before { content: "\f4f8"; } -.bi-plus-circle-fill::before { content: "\f4f9"; } -.bi-plus-circle::before { content: "\f4fa"; } -.bi-plus-square-dotted::before { content: "\f4fb"; } -.bi-plus-square-fill::before { content: "\f4fc"; } -.bi-plus-square::before { content: "\f4fd"; } -.bi-plus::before { content: "\f4fe"; } -.bi-power::before { content: "\f4ff"; } -.bi-printer-fill::before { content: "\f500"; } -.bi-printer::before { content: "\f501"; } -.bi-puzzle-fill::before { content: "\f502"; } -.bi-puzzle::before { content: "\f503"; } -.bi-question-circle-fill::before { content: "\f504"; } -.bi-question-circle::before { content: "\f505"; } -.bi-question-diamond-fill::before { content: "\f506"; } -.bi-question-diamond::before { content: "\f507"; } -.bi-question-octagon-fill::before { content: "\f508"; } -.bi-question-octagon::before { content: "\f509"; } -.bi-question-square-fill::before { content: "\f50a"; } -.bi-question-square::before { content: "\f50b"; } -.bi-question::before { content: "\f50c"; } -.bi-rainbow::before { content: "\f50d"; } -.bi-receipt-cutoff::before { content: "\f50e"; } -.bi-receipt::before { content: "\f50f"; } -.bi-reception-0::before { content: "\f510"; } -.bi-reception-1::before { content: "\f511"; } -.bi-reception-2::before { content: "\f512"; } -.bi-reception-3::before { content: "\f513"; } -.bi-reception-4::before { content: "\f514"; } -.bi-record-btn-fill::before { content: "\f515"; } -.bi-record-btn::before { content: "\f516"; } -.bi-record-circle-fill::before { content: "\f517"; } -.bi-record-circle::before { content: "\f518"; } -.bi-record-fill::before { content: "\f519"; } -.bi-record::before { content: "\f51a"; } -.bi-record2-fill::before { content: "\f51b"; } -.bi-record2::before { content: "\f51c"; } -.bi-reply-all-fill::before { content: "\f51d"; } -.bi-reply-all::before { content: "\f51e"; } -.bi-reply-fill::before { content: "\f51f"; } -.bi-reply::before { content: "\f520"; } -.bi-rss-fill::before { content: "\f521"; } -.bi-rss::before { content: "\f522"; } -.bi-rulers::before { content: "\f523"; } -.bi-save-fill::before { content: "\f524"; } -.bi-save::before { content: "\f525"; } -.bi-save2-fill::before { content: "\f526"; } -.bi-save2::before { content: "\f527"; } -.bi-scissors::before { content: "\f528"; } -.bi-screwdriver::before { content: "\f529"; } -.bi-search::before { content: "\f52a"; } -.bi-segmented-nav::before { content: "\f52b"; } -.bi-server::before { content: "\f52c"; } -.bi-share-fill::before { content: "\f52d"; } -.bi-share::before { content: "\f52e"; } -.bi-shield-check::before { content: "\f52f"; } -.bi-shield-exclamation::before { content: "\f530"; } -.bi-shield-fill-check::before { content: "\f531"; } -.bi-shield-fill-exclamation::before { content: "\f532"; } -.bi-shield-fill-minus::before { content: "\f533"; } -.bi-shield-fill-plus::before { content: "\f534"; } -.bi-shield-fill-x::before { content: "\f535"; } -.bi-shield-fill::before { content: "\f536"; } -.bi-shield-lock-fill::before { content: "\f537"; } -.bi-shield-lock::before { content: "\f538"; } -.bi-shield-minus::before { content: "\f539"; } -.bi-shield-plus::before { content: "\f53a"; } -.bi-shield-shaded::before { content: "\f53b"; } -.bi-shield-slash-fill::before { content: "\f53c"; } -.bi-shield-slash::before { content: "\f53d"; } -.bi-shield-x::before { content: "\f53e"; } -.bi-shield::before { content: "\f53f"; } -.bi-shift-fill::before { content: "\f540"; } -.bi-shift::before { content: "\f541"; } -.bi-shop-window::before { content: "\f542"; } -.bi-shop::before { content: "\f543"; } -.bi-shuffle::before { content: "\f544"; } -.bi-signpost-2-fill::before { content: "\f545"; } -.bi-signpost-2::before { content: "\f546"; } -.bi-signpost-fill::before { content: "\f547"; } -.bi-signpost-split-fill::before { content: "\f548"; } -.bi-signpost-split::before { content: "\f549"; } -.bi-signpost::before { content: "\f54a"; } -.bi-sim-fill::before { content: "\f54b"; } -.bi-sim::before { content: "\f54c"; } -.bi-skip-backward-btn-fill::before { content: "\f54d"; } -.bi-skip-backward-btn::before { content: "\f54e"; } -.bi-skip-backward-circle-fill::before { content: "\f54f"; } -.bi-skip-backward-circle::before { content: "\f550"; } -.bi-skip-backward-fill::before { content: "\f551"; } -.bi-skip-backward::before { content: "\f552"; } -.bi-skip-end-btn-fill::before { content: "\f553"; } -.bi-skip-end-btn::before { content: "\f554"; } -.bi-skip-end-circle-fill::before { content: "\f555"; } -.bi-skip-end-circle::before { content: "\f556"; } -.bi-skip-end-fill::before { content: "\f557"; } -.bi-skip-end::before { content: "\f558"; } -.bi-skip-forward-btn-fill::before { content: "\f559"; } -.bi-skip-forward-btn::before { content: "\f55a"; } -.bi-skip-forward-circle-fill::before { content: "\f55b"; } -.bi-skip-forward-circle::before { content: "\f55c"; } -.bi-skip-forward-fill::before { content: "\f55d"; } -.bi-skip-forward::before { content: "\f55e"; } -.bi-skip-start-btn-fill::before { content: "\f55f"; } -.bi-skip-start-btn::before { content: "\f560"; } -.bi-skip-start-circle-fill::before { content: "\f561"; } -.bi-skip-start-circle::before { content: "\f562"; } -.bi-skip-start-fill::before { content: "\f563"; } -.bi-skip-start::before { content: "\f564"; } -.bi-slack::before { content: "\f565"; } -.bi-slash-circle-fill::before { content: "\f566"; } -.bi-slash-circle::before { content: "\f567"; } -.bi-slash-square-fill::before { content: "\f568"; } -.bi-slash-square::before { content: "\f569"; } -.bi-slash::before { content: "\f56a"; } -.bi-sliders::before { content: "\f56b"; } -.bi-smartwatch::before { content: "\f56c"; } -.bi-snow::before { content: "\f56d"; } -.bi-snow2::before { content: "\f56e"; } -.bi-snow3::before { content: "\f56f"; } -.bi-sort-alpha-down-alt::before { content: "\f570"; } -.bi-sort-alpha-down::before { content: "\f571"; } -.bi-sort-alpha-up-alt::before { content: "\f572"; } -.bi-sort-alpha-up::before { content: "\f573"; } -.bi-sort-down-alt::before { content: "\f574"; } -.bi-sort-down::before { content: "\f575"; } -.bi-sort-numeric-down-alt::before { content: "\f576"; } -.bi-sort-numeric-down::before { content: "\f577"; } -.bi-sort-numeric-up-alt::before { content: "\f578"; } -.bi-sort-numeric-up::before { content: "\f579"; } -.bi-sort-up-alt::before { content: "\f57a"; } -.bi-sort-up::before { content: "\f57b"; } -.bi-soundwave::before { content: "\f57c"; } -.bi-speaker-fill::before { content: "\f57d"; } -.bi-speaker::before { content: "\f57e"; } -.bi-speedometer::before { content: "\f57f"; } -.bi-speedometer2::before { content: "\f580"; } -.bi-spellcheck::before { content: "\f581"; } -.bi-square-fill::before { content: "\f582"; } -.bi-square-half::before { content: "\f583"; } -.bi-square::before { content: "\f584"; } -.bi-stack::before { content: "\f585"; } -.bi-star-fill::before { content: "\f586"; } -.bi-star-half::before { content: "\f587"; } -.bi-star::before { content: "\f588"; } -.bi-stars::before { content: "\f589"; } -.bi-stickies-fill::before { content: "\f58a"; } -.bi-stickies::before { content: "\f58b"; } -.bi-sticky-fill::before { content: "\f58c"; } -.bi-sticky::before { content: "\f58d"; } -.bi-stop-btn-fill::before { content: "\f58e"; } -.bi-stop-btn::before { content: "\f58f"; } -.bi-stop-circle-fill::before { content: "\f590"; } -.bi-stop-circle::before { content: "\f591"; } -.bi-stop-fill::before { content: "\f592"; } -.bi-stop::before { content: "\f593"; } -.bi-stoplights-fill::before { content: "\f594"; } -.bi-stoplights::before { content: "\f595"; } -.bi-stopwatch-fill::before { content: "\f596"; } -.bi-stopwatch::before { content: "\f597"; } -.bi-subtract::before { content: "\f598"; } -.bi-suit-club-fill::before { content: "\f599"; } -.bi-suit-club::before { content: "\f59a"; } -.bi-suit-diamond-fill::before { content: "\f59b"; } -.bi-suit-diamond::before { content: "\f59c"; } -.bi-suit-heart-fill::before { content: "\f59d"; } -.bi-suit-heart::before { content: "\f59e"; } -.bi-suit-spade-fill::before { content: "\f59f"; } -.bi-suit-spade::before { content: "\f5a0"; } -.bi-sun-fill::before { content: "\f5a1"; } -.bi-sun::before { content: "\f5a2"; } -.bi-sunglasses::before { content: "\f5a3"; } -.bi-sunrise-fill::before { content: "\f5a4"; } -.bi-sunrise::before { content: "\f5a5"; } -.bi-sunset-fill::before { content: "\f5a6"; } -.bi-sunset::before { content: "\f5a7"; } -.bi-symmetry-horizontal::before { content: "\f5a8"; } -.bi-symmetry-vertical::before { content: "\f5a9"; } -.bi-table::before { content: "\f5aa"; } -.bi-tablet-fill::before { content: "\f5ab"; } -.bi-tablet-landscape-fill::before { content: "\f5ac"; } -.bi-tablet-landscape::before { content: "\f5ad"; } -.bi-tablet::before { content: "\f5ae"; } -.bi-tag-fill::before { content: "\f5af"; } -.bi-tag::before { content: "\f5b0"; } -.bi-tags-fill::before { content: "\f5b1"; } -.bi-tags::before { content: "\f5b2"; } -.bi-telegram::before { content: "\f5b3"; } -.bi-telephone-fill::before { content: "\f5b4"; } -.bi-telephone-forward-fill::before { content: "\f5b5"; } -.bi-telephone-forward::before { content: "\f5b6"; } -.bi-telephone-inbound-fill::before { content: "\f5b7"; } -.bi-telephone-inbound::before { content: "\f5b8"; } -.bi-telephone-minus-fill::before { content: "\f5b9"; } -.bi-telephone-minus::before { content: "\f5ba"; } -.bi-telephone-outbound-fill::before { content: "\f5bb"; } -.bi-telephone-outbound::before { content: "\f5bc"; } -.bi-telephone-plus-fill::before { content: "\f5bd"; } -.bi-telephone-plus::before { content: "\f5be"; } -.bi-telephone-x-fill::before { content: "\f5bf"; } -.bi-telephone-x::before { content: "\f5c0"; } -.bi-telephone::before { content: "\f5c1"; } -.bi-terminal-fill::before { content: "\f5c2"; } -.bi-terminal::before { content: "\f5c3"; } -.bi-text-center::before { content: "\f5c4"; } -.bi-text-indent-left::before { content: "\f5c5"; } -.bi-text-indent-right::before { content: "\f5c6"; } -.bi-text-left::before { content: "\f5c7"; } -.bi-text-paragraph::before { content: "\f5c8"; } -.bi-text-right::before { content: "\f5c9"; } -.bi-textarea-resize::before { content: "\f5ca"; } -.bi-textarea-t::before { content: "\f5cb"; } -.bi-textarea::before { content: "\f5cc"; } -.bi-thermometer-half::before { content: "\f5cd"; } -.bi-thermometer-high::before { content: "\f5ce"; } -.bi-thermometer-low::before { content: "\f5cf"; } -.bi-thermometer-snow::before { content: "\f5d0"; } -.bi-thermometer-sun::before { content: "\f5d1"; } -.bi-thermometer::before { content: "\f5d2"; } -.bi-three-dots-vertical::before { content: "\f5d3"; } -.bi-three-dots::before { content: "\f5d4"; } -.bi-toggle-off::before { content: "\f5d5"; } -.bi-toggle-on::before { content: "\f5d6"; } -.bi-toggle2-off::before { content: "\f5d7"; } -.bi-toggle2-on::before { content: "\f5d8"; } -.bi-toggles::before { content: "\f5d9"; } -.bi-toggles2::before { content: "\f5da"; } -.bi-tools::before { content: "\f5db"; } -.bi-tornado::before { content: "\f5dc"; } -.bi-trash-fill::before { content: "\f5dd"; } -.bi-trash::before { content: "\f5de"; } -.bi-trash2-fill::before { content: "\f5df"; } -.bi-trash2::before { content: "\f5e0"; } -.bi-tree-fill::before { content: "\f5e1"; } -.bi-tree::before { content: "\f5e2"; } -.bi-triangle-fill::before { content: "\f5e3"; } -.bi-triangle-half::before { content: "\f5e4"; } -.bi-triangle::before { content: "\f5e5"; } -.bi-trophy-fill::before { content: "\f5e6"; } -.bi-trophy::before { content: "\f5e7"; } -.bi-tropical-storm::before { content: "\f5e8"; } -.bi-truck-flatbed::before { content: "\f5e9"; } -.bi-truck::before { content: "\f5ea"; } -.bi-tsunami::before { content: "\f5eb"; } -.bi-tv-fill::before { content: "\f5ec"; } -.bi-tv::before { content: "\f5ed"; } -.bi-twitch::before { content: "\f5ee"; } -.bi-twitter::before { content: "\f5ef"; } -.bi-type-bold::before { content: "\f5f0"; } -.bi-type-h1::before { content: "\f5f1"; } -.bi-type-h2::before { content: "\f5f2"; } -.bi-type-h3::before { content: "\f5f3"; } -.bi-type-italic::before { content: "\f5f4"; } -.bi-type-strikethrough::before { content: "\f5f5"; } -.bi-type-underline::before { content: "\f5f6"; } -.bi-type::before { content: "\f5f7"; } -.bi-ui-checks-grid::before { content: "\f5f8"; } -.bi-ui-checks::before { content: "\f5f9"; } -.bi-ui-radios-grid::before { content: "\f5fa"; } -.bi-ui-radios::before { content: "\f5fb"; } -.bi-umbrella-fill::before { content: "\f5fc"; } -.bi-umbrella::before { content: "\f5fd"; } -.bi-union::before { content: "\f5fe"; } -.bi-unlock-fill::before { content: "\f5ff"; } -.bi-unlock::before { content: "\f600"; } -.bi-upc-scan::before { content: "\f601"; } -.bi-upc::before { content: "\f602"; } -.bi-upload::before { content: "\f603"; } -.bi-vector-pen::before { content: "\f604"; } -.bi-view-list::before { content: "\f605"; } -.bi-view-stacked::before { content: "\f606"; } -.bi-vinyl-fill::before { content: "\f607"; } -.bi-vinyl::before { content: "\f608"; } -.bi-voicemail::before { content: "\f609"; } -.bi-volume-down-fill::before { content: "\f60a"; } -.bi-volume-down::before { content: "\f60b"; } -.bi-volume-mute-fill::before { content: "\f60c"; } -.bi-volume-mute::before { content: "\f60d"; } -.bi-volume-off-fill::before { content: "\f60e"; } -.bi-volume-off::before { content: "\f60f"; } -.bi-volume-up-fill::before { content: "\f610"; } -.bi-volume-up::before { content: "\f611"; } -.bi-vr::before { content: "\f612"; } -.bi-wallet-fill::before { content: "\f613"; } -.bi-wallet::before { content: "\f614"; } -.bi-wallet2::before { content: "\f615"; } -.bi-watch::before { content: "\f616"; } -.bi-water::before { content: "\f617"; } -.bi-whatsapp::before { content: "\f618"; } -.bi-wifi-1::before { content: "\f619"; } -.bi-wifi-2::before { content: "\f61a"; } -.bi-wifi-off::before { content: "\f61b"; } -.bi-wifi::before { content: "\f61c"; } -.bi-wind::before { content: "\f61d"; } -.bi-window-dock::before { content: "\f61e"; } -.bi-window-sidebar::before { content: "\f61f"; } -.bi-window::before { content: "\f620"; } -.bi-wrench::before { content: "\f621"; } -.bi-x-circle-fill::before { content: "\f622"; } -.bi-x-circle::before { content: "\f623"; } -.bi-x-diamond-fill::before { content: "\f624"; } -.bi-x-diamond::before { content: "\f625"; } -.bi-x-octagon-fill::before { content: "\f626"; } -.bi-x-octagon::before { content: "\f627"; } -.bi-x-square-fill::before { content: "\f628"; } -.bi-x-square::before { content: "\f629"; } -.bi-x::before { content: "\f62a"; } -.bi-youtube::before { content: "\f62b"; } -.bi-zoom-in::before { content: "\f62c"; } -.bi-zoom-out::before { content: "\f62d"; } -.bi-bank::before { content: "\f62e"; } -.bi-bank2::before { content: "\f62f"; } -.bi-bell-slash-fill::before { content: "\f630"; } -.bi-bell-slash::before { content: "\f631"; } -.bi-cash-coin::before { content: "\f632"; } -.bi-check-lg::before { content: "\f633"; } -.bi-coin::before { content: "\f634"; } -.bi-currency-bitcoin::before { content: "\f635"; } -.bi-currency-dollar::before { content: "\f636"; } -.bi-currency-euro::before { content: "\f637"; } -.bi-currency-exchange::before { content: "\f638"; } -.bi-currency-pound::before { content: "\f639"; } -.bi-currency-yen::before { content: "\f63a"; } -.bi-dash-lg::before { content: "\f63b"; } -.bi-exclamation-lg::before { content: "\f63c"; } -.bi-file-earmark-pdf-fill::before { content: "\f63d"; } -.bi-file-earmark-pdf::before { content: "\f63e"; } -.bi-file-pdf-fill::before { content: "\f63f"; } -.bi-file-pdf::before { content: "\f640"; } -.bi-gender-ambiguous::before { content: "\f641"; } -.bi-gender-female::before { content: "\f642"; } -.bi-gender-male::before { content: "\f643"; } -.bi-gender-trans::before { content: "\f644"; } -.bi-headset-vr::before { content: "\f645"; } -.bi-info-lg::before { content: "\f646"; } -.bi-mastodon::before { content: "\f647"; } -.bi-messenger::before { content: "\f648"; } -.bi-piggy-bank-fill::before { content: "\f649"; } -.bi-piggy-bank::before { content: "\f64a"; } -.bi-pin-map-fill::before { content: "\f64b"; } -.bi-pin-map::before { content: "\f64c"; } -.bi-plus-lg::before { content: "\f64d"; } -.bi-question-lg::before { content: "\f64e"; } -.bi-recycle::before { content: "\f64f"; } -.bi-reddit::before { content: "\f650"; } -.bi-safe-fill::before { content: "\f651"; } -.bi-safe2-fill::before { content: "\f652"; } -.bi-safe2::before { content: "\f653"; } -.bi-sd-card-fill::before { content: "\f654"; } -.bi-sd-card::before { content: "\f655"; } -.bi-skype::before { content: "\f656"; } -.bi-slash-lg::before { content: "\f657"; } -.bi-translate::before { content: "\f658"; } -.bi-x-lg::before { content: "\f659"; } -.bi-safe::before { content: "\f65a"; } -.bi-apple::before { content: "\f65b"; } -.bi-microsoft::before { content: "\f65d"; } -.bi-windows::before { content: "\f65e"; } -.bi-behance::before { content: "\f65c"; } -.bi-dribbble::before { content: "\f65f"; } -.bi-line::before { content: "\f660"; } -.bi-medium::before { content: "\f661"; } -.bi-paypal::before { content: "\f662"; } -.bi-pinterest::before { content: "\f663"; } -.bi-signal::before { content: "\f664"; } -.bi-snapchat::before { content: "\f665"; } -.bi-spotify::before { content: "\f666"; } -.bi-stack-overflow::before { content: "\f667"; } -.bi-strava::before { content: "\f668"; } -.bi-wordpress::before { content: "\f669"; } -.bi-vimeo::before { content: "\f66a"; } -.bi-activity::before { content: "\f66b"; } -.bi-easel2-fill::before { content: "\f66c"; } -.bi-easel2::before { content: "\f66d"; } -.bi-easel3-fill::before { content: "\f66e"; } -.bi-easel3::before { content: "\f66f"; } -.bi-fan::before { content: "\f670"; } -.bi-fingerprint::before { content: "\f671"; } -.bi-graph-down-arrow::before { content: "\f672"; } -.bi-graph-up-arrow::before { content: "\f673"; } -.bi-hypnotize::before { content: "\f674"; } -.bi-magic::before { content: "\f675"; } -.bi-person-rolodex::before { content: "\f676"; } -.bi-person-video::before { content: "\f677"; } -.bi-person-video2::before { content: "\f678"; } -.bi-person-video3::before { content: "\f679"; } -.bi-person-workspace::before { content: "\f67a"; } -.bi-radioactive::before { content: "\f67b"; } -.bi-webcam-fill::before { content: "\f67c"; } -.bi-webcam::before { content: "\f67d"; } -.bi-yin-yang::before { content: "\f67e"; } -.bi-bandaid-fill::before { content: "\f680"; } -.bi-bandaid::before { content: "\f681"; } -.bi-bluetooth::before { content: "\f682"; } -.bi-body-text::before { content: "\f683"; } -.bi-boombox::before { content: "\f684"; } -.bi-boxes::before { content: "\f685"; } -.bi-dpad-fill::before { content: "\f686"; } -.bi-dpad::before { content: "\f687"; } -.bi-ear-fill::before { content: "\f688"; } -.bi-ear::before { content: "\f689"; } -.bi-envelope-check-fill::before { content: "\f68b"; } -.bi-envelope-check::before { content: "\f68c"; } -.bi-envelope-dash-fill::before { content: "\f68e"; } -.bi-envelope-dash::before { content: "\f68f"; } -.bi-envelope-exclamation-fill::before { content: "\f691"; } -.bi-envelope-exclamation::before { content: "\f692"; } -.bi-envelope-plus-fill::before { content: "\f693"; } -.bi-envelope-plus::before { content: "\f694"; } -.bi-envelope-slash-fill::before { content: "\f696"; } -.bi-envelope-slash::before { content: "\f697"; } -.bi-envelope-x-fill::before { content: "\f699"; } -.bi-envelope-x::before { content: "\f69a"; } -.bi-explicit-fill::before { content: "\f69b"; } -.bi-explicit::before { content: "\f69c"; } -.bi-git::before { content: "\f69d"; } -.bi-infinity::before { content: "\f69e"; } -.bi-list-columns-reverse::before { content: "\f69f"; } -.bi-list-columns::before { content: "\f6a0"; } -.bi-meta::before { content: "\f6a1"; } -.bi-nintendo-switch::before { content: "\f6a4"; } -.bi-pc-display-horizontal::before { content: "\f6a5"; } -.bi-pc-display::before { content: "\f6a6"; } -.bi-pc-horizontal::before { content: "\f6a7"; } -.bi-pc::before { content: "\f6a8"; } -.bi-playstation::before { content: "\f6a9"; } -.bi-plus-slash-minus::before { content: "\f6aa"; } -.bi-projector-fill::before { content: "\f6ab"; } -.bi-projector::before { content: "\f6ac"; } -.bi-qr-code-scan::before { content: "\f6ad"; } -.bi-qr-code::before { content: "\f6ae"; } -.bi-quora::before { content: "\f6af"; } -.bi-quote::before { content: "\f6b0"; } -.bi-robot::before { content: "\f6b1"; } -.bi-send-check-fill::before { content: "\f6b2"; } -.bi-send-check::before { content: "\f6b3"; } -.bi-send-dash-fill::before { content: "\f6b4"; } -.bi-send-dash::before { content: "\f6b5"; } -.bi-send-exclamation-fill::before { content: "\f6b7"; } -.bi-send-exclamation::before { content: "\f6b8"; } -.bi-send-fill::before { content: "\f6b9"; } -.bi-send-plus-fill::before { content: "\f6ba"; } -.bi-send-plus::before { content: "\f6bb"; } -.bi-send-slash-fill::before { content: "\f6bc"; } -.bi-send-slash::before { content: "\f6bd"; } -.bi-send-x-fill::before { content: "\f6be"; } -.bi-send-x::before { content: "\f6bf"; } -.bi-send::before { content: "\f6c0"; } -.bi-steam::before { content: "\f6c1"; } -.bi-terminal-dash::before { content: "\f6c3"; } -.bi-terminal-plus::before { content: "\f6c4"; } -.bi-terminal-split::before { content: "\f6c5"; } -.bi-ticket-detailed-fill::before { content: "\f6c6"; } -.bi-ticket-detailed::before { content: "\f6c7"; } -.bi-ticket-fill::before { content: "\f6c8"; } -.bi-ticket-perforated-fill::before { content: "\f6c9"; } -.bi-ticket-perforated::before { content: "\f6ca"; } -.bi-ticket::before { content: "\f6cb"; } -.bi-tiktok::before { content: "\f6cc"; } -.bi-window-dash::before { content: "\f6cd"; } -.bi-window-desktop::before { content: "\f6ce"; } -.bi-window-fullscreen::before { content: "\f6cf"; } -.bi-window-plus::before { content: "\f6d0"; } -.bi-window-split::before { content: "\f6d1"; } -.bi-window-stack::before { content: "\f6d2"; } -.bi-window-x::before { content: "\f6d3"; } -.bi-xbox::before { content: "\f6d4"; } -.bi-ethernet::before { content: "\f6d5"; } -.bi-hdmi-fill::before { content: "\f6d6"; } -.bi-hdmi::before { content: "\f6d7"; } -.bi-usb-c-fill::before { content: "\f6d8"; } -.bi-usb-c::before { content: "\f6d9"; } -.bi-usb-fill::before { content: "\f6da"; } -.bi-usb-plug-fill::before { content: "\f6db"; } -.bi-usb-plug::before { content: "\f6dc"; } -.bi-usb-symbol::before { content: "\f6dd"; } -.bi-usb::before { content: "\f6de"; } -.bi-boombox-fill::before { content: "\f6df"; } -.bi-displayport::before { content: "\f6e1"; } -.bi-gpu-card::before { content: "\f6e2"; } -.bi-memory::before { content: "\f6e3"; } -.bi-modem-fill::before { content: "\f6e4"; } -.bi-modem::before { content: "\f6e5"; } -.bi-motherboard-fill::before { content: "\f6e6"; } -.bi-motherboard::before { content: "\f6e7"; } -.bi-optical-audio-fill::before { content: "\f6e8"; } -.bi-optical-audio::before { content: "\f6e9"; } -.bi-pci-card::before { content: "\f6ea"; } -.bi-router-fill::before { content: "\f6eb"; } -.bi-router::before { content: "\f6ec"; } -.bi-thunderbolt-fill::before { content: "\f6ef"; } -.bi-thunderbolt::before { content: "\f6f0"; } -.bi-usb-drive-fill::before { content: "\f6f1"; } -.bi-usb-drive::before { content: "\f6f2"; } -.bi-usb-micro-fill::before { content: "\f6f3"; } -.bi-usb-micro::before { content: "\f6f4"; } -.bi-usb-mini-fill::before { content: "\f6f5"; } -.bi-usb-mini::before { content: "\f6f6"; } -.bi-cloud-haze2::before { content: "\f6f7"; } -.bi-device-hdd-fill::before { content: "\f6f8"; } -.bi-device-hdd::before { content: "\f6f9"; } -.bi-device-ssd-fill::before { content: "\f6fa"; } -.bi-device-ssd::before { content: "\f6fb"; } -.bi-displayport-fill::before { content: "\f6fc"; } -.bi-mortarboard-fill::before { content: "\f6fd"; } -.bi-mortarboard::before { content: "\f6fe"; } -.bi-terminal-x::before { content: "\f6ff"; } -.bi-arrow-through-heart-fill::before { content: "\f700"; } -.bi-arrow-through-heart::before { content: "\f701"; } -.bi-badge-sd-fill::before { content: "\f702"; } -.bi-badge-sd::before { content: "\f703"; } -.bi-bag-heart-fill::before { content: "\f704"; } -.bi-bag-heart::before { content: "\f705"; } -.bi-balloon-fill::before { content: "\f706"; } -.bi-balloon-heart-fill::before { content: "\f707"; } -.bi-balloon-heart::before { content: "\f708"; } -.bi-balloon::before { content: "\f709"; } -.bi-box2-fill::before { content: "\f70a"; } -.bi-box2-heart-fill::before { content: "\f70b"; } -.bi-box2-heart::before { content: "\f70c"; } -.bi-box2::before { content: "\f70d"; } -.bi-braces-asterisk::before { content: "\f70e"; } -.bi-calendar-heart-fill::before { content: "\f70f"; } -.bi-calendar-heart::before { content: "\f710"; } -.bi-calendar2-heart-fill::before { content: "\f711"; } -.bi-calendar2-heart::before { content: "\f712"; } -.bi-chat-heart-fill::before { content: "\f713"; } -.bi-chat-heart::before { content: "\f714"; } -.bi-chat-left-heart-fill::before { content: "\f715"; } -.bi-chat-left-heart::before { content: "\f716"; } -.bi-chat-right-heart-fill::before { content: "\f717"; } -.bi-chat-right-heart::before { content: "\f718"; } -.bi-chat-square-heart-fill::before { content: "\f719"; } -.bi-chat-square-heart::before { content: "\f71a"; } -.bi-clipboard-check-fill::before { content: "\f71b"; } -.bi-clipboard-data-fill::before { content: "\f71c"; } -.bi-clipboard-fill::before { content: "\f71d"; } -.bi-clipboard-heart-fill::before { content: "\f71e"; } -.bi-clipboard-heart::before { content: "\f71f"; } -.bi-clipboard-minus-fill::before { content: "\f720"; } -.bi-clipboard-plus-fill::before { content: "\f721"; } -.bi-clipboard-pulse::before { content: "\f722"; } -.bi-clipboard-x-fill::before { content: "\f723"; } -.bi-clipboard2-check-fill::before { content: "\f724"; } -.bi-clipboard2-check::before { content: "\f725"; } -.bi-clipboard2-data-fill::before { content: "\f726"; } -.bi-clipboard2-data::before { content: "\f727"; } -.bi-clipboard2-fill::before { content: "\f728"; } -.bi-clipboard2-heart-fill::before { content: "\f729"; } -.bi-clipboard2-heart::before { content: "\f72a"; } -.bi-clipboard2-minus-fill::before { content: "\f72b"; } -.bi-clipboard2-minus::before { content: "\f72c"; } -.bi-clipboard2-plus-fill::before { content: "\f72d"; } -.bi-clipboard2-plus::before { content: "\f72e"; } -.bi-clipboard2-pulse-fill::before { content: "\f72f"; } -.bi-clipboard2-pulse::before { content: "\f730"; } -.bi-clipboard2-x-fill::before { content: "\f731"; } -.bi-clipboard2-x::before { content: "\f732"; } -.bi-clipboard2::before { content: "\f733"; } -.bi-emoji-kiss-fill::before { content: "\f734"; } -.bi-emoji-kiss::before { content: "\f735"; } -.bi-envelope-heart-fill::before { content: "\f736"; } -.bi-envelope-heart::before { content: "\f737"; } -.bi-envelope-open-heart-fill::before { content: "\f738"; } -.bi-envelope-open-heart::before { content: "\f739"; } -.bi-envelope-paper-fill::before { content: "\f73a"; } -.bi-envelope-paper-heart-fill::before { content: "\f73b"; } -.bi-envelope-paper-heart::before { content: "\f73c"; } -.bi-envelope-paper::before { content: "\f73d"; } -.bi-filetype-aac::before { content: "\f73e"; } -.bi-filetype-ai::before { content: "\f73f"; } -.bi-filetype-bmp::before { content: "\f740"; } -.bi-filetype-cs::before { content: "\f741"; } -.bi-filetype-css::before { content: "\f742"; } -.bi-filetype-csv::before { content: "\f743"; } -.bi-filetype-doc::before { content: "\f744"; } -.bi-filetype-docx::before { content: "\f745"; } -.bi-filetype-exe::before { content: "\f746"; } -.bi-filetype-gif::before { content: "\f747"; } -.bi-filetype-heic::before { content: "\f748"; } -.bi-filetype-html::before { content: "\f749"; } -.bi-filetype-java::before { content: "\f74a"; } -.bi-filetype-jpg::before { content: "\f74b"; } -.bi-filetype-js::before { content: "\f74c"; } -.bi-filetype-jsx::before { content: "\f74d"; } -.bi-filetype-key::before { content: "\f74e"; } -.bi-filetype-m4p::before { content: "\f74f"; } -.bi-filetype-md::before { content: "\f750"; } -.bi-filetype-mdx::before { content: "\f751"; } -.bi-filetype-mov::before { content: "\f752"; } -.bi-filetype-mp3::before { content: "\f753"; } -.bi-filetype-mp4::before { content: "\f754"; } -.bi-filetype-otf::before { content: "\f755"; } -.bi-filetype-pdf::before { content: "\f756"; } -.bi-filetype-php::before { content: "\f757"; } -.bi-filetype-png::before { content: "\f758"; } -.bi-filetype-ppt::before { content: "\f75a"; } -.bi-filetype-psd::before { content: "\f75b"; } -.bi-filetype-py::before { content: "\f75c"; } -.bi-filetype-raw::before { content: "\f75d"; } -.bi-filetype-rb::before { content: "\f75e"; } -.bi-filetype-sass::before { content: "\f75f"; } -.bi-filetype-scss::before { content: "\f760"; } -.bi-filetype-sh::before { content: "\f761"; } -.bi-filetype-svg::before { content: "\f762"; } -.bi-filetype-tiff::before { content: "\f763"; } -.bi-filetype-tsx::before { content: "\f764"; } -.bi-filetype-ttf::before { content: "\f765"; } -.bi-filetype-txt::before { content: "\f766"; } -.bi-filetype-wav::before { content: "\f767"; } -.bi-filetype-woff::before { content: "\f768"; } -.bi-filetype-xls::before { content: "\f76a"; } -.bi-filetype-xml::before { content: "\f76b"; } -.bi-filetype-yml::before { content: "\f76c"; } -.bi-heart-arrow::before { content: "\f76d"; } -.bi-heart-pulse-fill::before { content: "\f76e"; } -.bi-heart-pulse::before { content: "\f76f"; } -.bi-heartbreak-fill::before { content: "\f770"; } -.bi-heartbreak::before { content: "\f771"; } -.bi-hearts::before { content: "\f772"; } -.bi-hospital-fill::before { content: "\f773"; } -.bi-hospital::before { content: "\f774"; } -.bi-house-heart-fill::before { content: "\f775"; } -.bi-house-heart::before { content: "\f776"; } -.bi-incognito::before { content: "\f777"; } -.bi-magnet-fill::before { content: "\f778"; } -.bi-magnet::before { content: "\f779"; } -.bi-person-heart::before { content: "\f77a"; } -.bi-person-hearts::before { content: "\f77b"; } -.bi-phone-flip::before { content: "\f77c"; } -.bi-plugin::before { content: "\f77d"; } -.bi-postage-fill::before { content: "\f77e"; } -.bi-postage-heart-fill::before { content: "\f77f"; } -.bi-postage-heart::before { content: "\f780"; } -.bi-postage::before { content: "\f781"; } -.bi-postcard-fill::before { content: "\f782"; } -.bi-postcard-heart-fill::before { content: "\f783"; } -.bi-postcard-heart::before { content: "\f784"; } -.bi-postcard::before { content: "\f785"; } -.bi-search-heart-fill::before { content: "\f786"; } -.bi-search-heart::before { content: "\f787"; } -.bi-sliders2-vertical::before { content: "\f788"; } -.bi-sliders2::before { content: "\f789"; } -.bi-trash3-fill::before { content: "\f78a"; } -.bi-trash3::before { content: "\f78b"; } -.bi-valentine::before { content: "\f78c"; } -.bi-valentine2::before { content: "\f78d"; } -.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } -.bi-wrench-adjustable-circle::before { content: "\f78f"; } -.bi-wrench-adjustable::before { content: "\f790"; } -.bi-filetype-json::before { content: "\f791"; } -.bi-filetype-pptx::before { content: "\f792"; } -.bi-filetype-xlsx::before { content: "\f793"; } -.bi-1-circle-fill::before { content: "\f796"; } -.bi-1-circle::before { content: "\f797"; } -.bi-1-square-fill::before { content: "\f798"; } -.bi-1-square::before { content: "\f799"; } -.bi-2-circle-fill::before { content: "\f79c"; } -.bi-2-circle::before { content: "\f79d"; } -.bi-2-square-fill::before { content: "\f79e"; } -.bi-2-square::before { content: "\f79f"; } -.bi-3-circle-fill::before { content: "\f7a2"; } -.bi-3-circle::before { content: "\f7a3"; } -.bi-3-square-fill::before { content: "\f7a4"; } -.bi-3-square::before { content: "\f7a5"; } -.bi-4-circle-fill::before { content: "\f7a8"; } -.bi-4-circle::before { content: "\f7a9"; } -.bi-4-square-fill::before { content: "\f7aa"; } -.bi-4-square::before { content: "\f7ab"; } -.bi-5-circle-fill::before { content: "\f7ae"; } -.bi-5-circle::before { content: "\f7af"; } -.bi-5-square-fill::before { content: "\f7b0"; } -.bi-5-square::before { content: "\f7b1"; } -.bi-6-circle-fill::before { content: "\f7b4"; } -.bi-6-circle::before { content: "\f7b5"; } -.bi-6-square-fill::before { content: "\f7b6"; } -.bi-6-square::before { content: "\f7b7"; } -.bi-7-circle-fill::before { content: "\f7ba"; } -.bi-7-circle::before { content: "\f7bb"; } -.bi-7-square-fill::before { content: "\f7bc"; } -.bi-7-square::before { content: "\f7bd"; } -.bi-8-circle-fill::before { content: "\f7c0"; } -.bi-8-circle::before { content: "\f7c1"; } -.bi-8-square-fill::before { content: "\f7c2"; } -.bi-8-square::before { content: "\f7c3"; } -.bi-9-circle-fill::before { content: "\f7c6"; } -.bi-9-circle::before { content: "\f7c7"; } -.bi-9-square-fill::before { content: "\f7c8"; } -.bi-9-square::before { content: "\f7c9"; } -.bi-airplane-engines-fill::before { content: "\f7ca"; } -.bi-airplane-engines::before { content: "\f7cb"; } -.bi-airplane-fill::before { content: "\f7cc"; } -.bi-airplane::before { content: "\f7cd"; } -.bi-alexa::before { content: "\f7ce"; } -.bi-alipay::before { content: "\f7cf"; } -.bi-android::before { content: "\f7d0"; } -.bi-android2::before { content: "\f7d1"; } -.bi-box-fill::before { content: "\f7d2"; } -.bi-box-seam-fill::before { content: "\f7d3"; } -.bi-browser-chrome::before { content: "\f7d4"; } -.bi-browser-edge::before { content: "\f7d5"; } -.bi-browser-firefox::before { content: "\f7d6"; } -.bi-browser-safari::before { content: "\f7d7"; } -.bi-c-circle-fill::before { content: "\f7da"; } -.bi-c-circle::before { content: "\f7db"; } -.bi-c-square-fill::before { content: "\f7dc"; } -.bi-c-square::before { content: "\f7dd"; } -.bi-capsule-pill::before { content: "\f7de"; } -.bi-capsule::before { content: "\f7df"; } -.bi-car-front-fill::before { content: "\f7e0"; } -.bi-car-front::before { content: "\f7e1"; } -.bi-cassette-fill::before { content: "\f7e2"; } -.bi-cassette::before { content: "\f7e3"; } -.bi-cc-circle-fill::before { content: "\f7e6"; } -.bi-cc-circle::before { content: "\f7e7"; } -.bi-cc-square-fill::before { content: "\f7e8"; } -.bi-cc-square::before { content: "\f7e9"; } -.bi-cup-hot-fill::before { content: "\f7ea"; } -.bi-cup-hot::before { content: "\f7eb"; } -.bi-currency-rupee::before { content: "\f7ec"; } -.bi-dropbox::before { content: "\f7ed"; } -.bi-escape::before { content: "\f7ee"; } -.bi-fast-forward-btn-fill::before { content: "\f7ef"; } -.bi-fast-forward-btn::before { content: "\f7f0"; } -.bi-fast-forward-circle-fill::before { content: "\f7f1"; } -.bi-fast-forward-circle::before { content: "\f7f2"; } -.bi-fast-forward-fill::before { content: "\f7f3"; } -.bi-fast-forward::before { content: "\f7f4"; } -.bi-filetype-sql::before { content: "\f7f5"; } -.bi-fire::before { content: "\f7f6"; } -.bi-google-play::before { content: "\f7f7"; } -.bi-h-circle-fill::before { content: "\f7fa"; } -.bi-h-circle::before { content: "\f7fb"; } -.bi-h-square-fill::before { content: "\f7fc"; } -.bi-h-square::before { content: "\f7fd"; } -.bi-indent::before { content: "\f7fe"; } -.bi-lungs-fill::before { content: "\f7ff"; } -.bi-lungs::before { content: "\f800"; } -.bi-microsoft-teams::before { content: "\f801"; } -.bi-p-circle-fill::before { content: "\f804"; } -.bi-p-circle::before { content: "\f805"; } -.bi-p-square-fill::before { content: "\f806"; } -.bi-p-square::before { content: "\f807"; } -.bi-pass-fill::before { content: "\f808"; } -.bi-pass::before { content: "\f809"; } -.bi-prescription::before { content: "\f80a"; } -.bi-prescription2::before { content: "\f80b"; } -.bi-r-circle-fill::before { content: "\f80e"; } -.bi-r-circle::before { content: "\f80f"; } -.bi-r-square-fill::before { content: "\f810"; } -.bi-r-square::before { content: "\f811"; } -.bi-repeat-1::before { content: "\f812"; } -.bi-repeat::before { content: "\f813"; } -.bi-rewind-btn-fill::before { content: "\f814"; } -.bi-rewind-btn::before { content: "\f815"; } -.bi-rewind-circle-fill::before { content: "\f816"; } -.bi-rewind-circle::before { content: "\f817"; } -.bi-rewind-fill::before { content: "\f818"; } -.bi-rewind::before { content: "\f819"; } -.bi-train-freight-front-fill::before { content: "\f81a"; } -.bi-train-freight-front::before { content: "\f81b"; } -.bi-train-front-fill::before { content: "\f81c"; } -.bi-train-front::before { content: "\f81d"; } -.bi-train-lightrail-front-fill::before { content: "\f81e"; } -.bi-train-lightrail-front::before { content: "\f81f"; } -.bi-truck-front-fill::before { content: "\f820"; } -.bi-truck-front::before { content: "\f821"; } -.bi-ubuntu::before { content: "\f822"; } -.bi-unindent::before { content: "\f823"; } -.bi-unity::before { content: "\f824"; } -.bi-universal-access-circle::before { content: "\f825"; } -.bi-universal-access::before { content: "\f826"; } -.bi-virus::before { content: "\f827"; } -.bi-virus2::before { content: "\f828"; } -.bi-wechat::before { content: "\f829"; } -.bi-yelp::before { content: "\f82a"; } -.bi-sign-stop-fill::before { content: "\f82b"; } -.bi-sign-stop-lights-fill::before { content: "\f82c"; } -.bi-sign-stop-lights::before { content: "\f82d"; } -.bi-sign-stop::before { content: "\f82e"; } -.bi-sign-turn-left-fill::before { content: "\f82f"; } -.bi-sign-turn-left::before { content: "\f830"; } -.bi-sign-turn-right-fill::before { content: "\f831"; } -.bi-sign-turn-right::before { content: "\f832"; } -.bi-sign-turn-slight-left-fill::before { content: "\f833"; } -.bi-sign-turn-slight-left::before { content: "\f834"; } -.bi-sign-turn-slight-right-fill::before { content: "\f835"; } -.bi-sign-turn-slight-right::before { content: "\f836"; } -.bi-sign-yield-fill::before { content: "\f837"; } -.bi-sign-yield::before { content: "\f838"; } -.bi-ev-station-fill::before { content: "\f839"; } -.bi-ev-station::before { content: "\f83a"; } -.bi-fuel-pump-diesel-fill::before { content: "\f83b"; } -.bi-fuel-pump-diesel::before { content: "\f83c"; } -.bi-fuel-pump-fill::before { content: "\f83d"; } -.bi-fuel-pump::before { content: "\f83e"; } -.bi-0-circle-fill::before { content: "\f83f"; } -.bi-0-circle::before { content: "\f840"; } -.bi-0-square-fill::before { content: "\f841"; } -.bi-0-square::before { content: "\f842"; } -.bi-rocket-fill::before { content: "\f843"; } -.bi-rocket-takeoff-fill::before { content: "\f844"; } -.bi-rocket-takeoff::before { content: "\f845"; } -.bi-rocket::before { content: "\f846"; } -.bi-stripe::before { content: "\f847"; } -.bi-subscript::before { content: "\f848"; } -.bi-superscript::before { content: "\f849"; } -.bi-trello::before { content: "\f84a"; } -.bi-envelope-at-fill::before { content: "\f84b"; } -.bi-envelope-at::before { content: "\f84c"; } -.bi-regex::before { content: "\f84d"; } -.bi-text-wrap::before { content: "\f84e"; } -.bi-sign-dead-end-fill::before { content: "\f84f"; } -.bi-sign-dead-end::before { content: "\f850"; } -.bi-sign-do-not-enter-fill::before { content: "\f851"; } -.bi-sign-do-not-enter::before { content: "\f852"; } -.bi-sign-intersection-fill::before { content: "\f853"; } -.bi-sign-intersection-side-fill::before { content: "\f854"; } -.bi-sign-intersection-side::before { content: "\f855"; } -.bi-sign-intersection-t-fill::before { content: "\f856"; } -.bi-sign-intersection-t::before { content: "\f857"; } -.bi-sign-intersection-y-fill::before { content: "\f858"; } -.bi-sign-intersection-y::before { content: "\f859"; } -.bi-sign-intersection::before { content: "\f85a"; } -.bi-sign-merge-left-fill::before { content: "\f85b"; } -.bi-sign-merge-left::before { content: "\f85c"; } -.bi-sign-merge-right-fill::before { content: "\f85d"; } -.bi-sign-merge-right::before { content: "\f85e"; } -.bi-sign-no-left-turn-fill::before { content: "\f85f"; } -.bi-sign-no-left-turn::before { content: "\f860"; } -.bi-sign-no-parking-fill::before { content: "\f861"; } -.bi-sign-no-parking::before { content: "\f862"; } -.bi-sign-no-right-turn-fill::before { content: "\f863"; } -.bi-sign-no-right-turn::before { content: "\f864"; } -.bi-sign-railroad-fill::before { content: "\f865"; } -.bi-sign-railroad::before { content: "\f866"; } -.bi-building-add::before { content: "\f867"; } -.bi-building-check::before { content: "\f868"; } -.bi-building-dash::before { content: "\f869"; } -.bi-building-down::before { content: "\f86a"; } -.bi-building-exclamation::before { content: "\f86b"; } -.bi-building-fill-add::before { content: "\f86c"; } -.bi-building-fill-check::before { content: "\f86d"; } -.bi-building-fill-dash::before { content: "\f86e"; } -.bi-building-fill-down::before { content: "\f86f"; } -.bi-building-fill-exclamation::before { content: "\f870"; } -.bi-building-fill-gear::before { content: "\f871"; } -.bi-building-fill-lock::before { content: "\f872"; } -.bi-building-fill-slash::before { content: "\f873"; } -.bi-building-fill-up::before { content: "\f874"; } -.bi-building-fill-x::before { content: "\f875"; } -.bi-building-fill::before { content: "\f876"; } -.bi-building-gear::before { content: "\f877"; } -.bi-building-lock::before { content: "\f878"; } -.bi-building-slash::before { content: "\f879"; } -.bi-building-up::before { content: "\f87a"; } -.bi-building-x::before { content: "\f87b"; } -.bi-buildings-fill::before { content: "\f87c"; } -.bi-buildings::before { content: "\f87d"; } -.bi-bus-front-fill::before { content: "\f87e"; } -.bi-bus-front::before { content: "\f87f"; } -.bi-ev-front-fill::before { content: "\f880"; } -.bi-ev-front::before { content: "\f881"; } -.bi-globe-americas::before { content: "\f882"; } -.bi-globe-asia-australia::before { content: "\f883"; } -.bi-globe-central-south-asia::before { content: "\f884"; } -.bi-globe-europe-africa::before { content: "\f885"; } -.bi-house-add-fill::before { content: "\f886"; } -.bi-house-add::before { content: "\f887"; } -.bi-house-check-fill::before { content: "\f888"; } -.bi-house-check::before { content: "\f889"; } -.bi-house-dash-fill::before { content: "\f88a"; } -.bi-house-dash::before { content: "\f88b"; } -.bi-house-down-fill::before { content: "\f88c"; } -.bi-house-down::before { content: "\f88d"; } -.bi-house-exclamation-fill::before { content: "\f88e"; } -.bi-house-exclamation::before { content: "\f88f"; } -.bi-house-gear-fill::before { content: "\f890"; } -.bi-house-gear::before { content: "\f891"; } -.bi-house-lock-fill::before { content: "\f892"; } -.bi-house-lock::before { content: "\f893"; } -.bi-house-slash-fill::before { content: "\f894"; } -.bi-house-slash::before { content: "\f895"; } -.bi-house-up-fill::before { content: "\f896"; } -.bi-house-up::before { content: "\f897"; } -.bi-house-x-fill::before { content: "\f898"; } -.bi-house-x::before { content: "\f899"; } -.bi-person-add::before { content: "\f89a"; } -.bi-person-down::before { content: "\f89b"; } -.bi-person-exclamation::before { content: "\f89c"; } -.bi-person-fill-add::before { content: "\f89d"; } -.bi-person-fill-check::before { content: "\f89e"; } -.bi-person-fill-dash::before { content: "\f89f"; } -.bi-person-fill-down::before { content: "\f8a0"; } -.bi-person-fill-exclamation::before { content: "\f8a1"; } -.bi-person-fill-gear::before { content: "\f8a2"; } -.bi-person-fill-lock::before { content: "\f8a3"; } -.bi-person-fill-slash::before { content: "\f8a4"; } -.bi-person-fill-up::before { content: "\f8a5"; } -.bi-person-fill-x::before { content: "\f8a6"; } -.bi-person-gear::before { content: "\f8a7"; } -.bi-person-lock::before { content: "\f8a8"; } -.bi-person-slash::before { content: "\f8a9"; } -.bi-person-up::before { content: "\f8aa"; } -.bi-scooter::before { content: "\f8ab"; } -.bi-taxi-front-fill::before { content: "\f8ac"; } -.bi-taxi-front::before { content: "\f8ad"; } -.bi-amd::before { content: "\f8ae"; } -.bi-database-add::before { content: "\f8af"; } -.bi-database-check::before { content: "\f8b0"; } -.bi-database-dash::before { content: "\f8b1"; } -.bi-database-down::before { content: "\f8b2"; } -.bi-database-exclamation::before { content: "\f8b3"; } -.bi-database-fill-add::before { content: "\f8b4"; } -.bi-database-fill-check::before { content: "\f8b5"; } -.bi-database-fill-dash::before { content: "\f8b6"; } -.bi-database-fill-down::before { content: "\f8b7"; } -.bi-database-fill-exclamation::before { content: "\f8b8"; } -.bi-database-fill-gear::before { content: "\f8b9"; } -.bi-database-fill-lock::before { content: "\f8ba"; } -.bi-database-fill-slash::before { content: "\f8bb"; } -.bi-database-fill-up::before { content: "\f8bc"; } -.bi-database-fill-x::before { content: "\f8bd"; } -.bi-database-fill::before { content: "\f8be"; } -.bi-database-gear::before { content: "\f8bf"; } -.bi-database-lock::before { content: "\f8c0"; } -.bi-database-slash::before { content: "\f8c1"; } -.bi-database-up::before { content: "\f8c2"; } -.bi-database-x::before { content: "\f8c3"; } -.bi-database::before { content: "\f8c4"; } -.bi-houses-fill::before { content: "\f8c5"; } -.bi-houses::before { content: "\f8c6"; } -.bi-nvidia::before { content: "\f8c7"; } -.bi-person-vcard-fill::before { content: "\f8c8"; } -.bi-person-vcard::before { content: "\f8c9"; } -.bi-sina-weibo::before { content: "\f8ca"; } -.bi-tencent-qq::before { content: "\f8cb"; } -.bi-wikipedia::before { content: "\f8cc"; } -.bi-alphabet-uppercase::before { content: "\f2a5"; } -.bi-alphabet::before { content: "\f68a"; } -.bi-amazon::before { content: "\f68d"; } -.bi-arrows-collapse-vertical::before { content: "\f690"; } -.bi-arrows-expand-vertical::before { content: "\f695"; } -.bi-arrows-vertical::before { content: "\f698"; } -.bi-arrows::before { content: "\f6a2"; } -.bi-ban-fill::before { content: "\f6a3"; } -.bi-ban::before { content: "\f6b6"; } -.bi-bing::before { content: "\f6c2"; } -.bi-cake::before { content: "\f6e0"; } -.bi-cake2::before { content: "\f6ed"; } -.bi-cookie::before { content: "\f6ee"; } -.bi-copy::before { content: "\f759"; } -.bi-crosshair::before { content: "\f769"; } -.bi-crosshair2::before { content: "\f794"; } -.bi-emoji-astonished-fill::before { content: "\f795"; } -.bi-emoji-astonished::before { content: "\f79a"; } -.bi-emoji-grimace-fill::before { content: "\f79b"; } -.bi-emoji-grimace::before { content: "\f7a0"; } -.bi-emoji-grin-fill::before { content: "\f7a1"; } -.bi-emoji-grin::before { content: "\f7a6"; } -.bi-emoji-surprise-fill::before { content: "\f7a7"; } -.bi-emoji-surprise::before { content: "\f7ac"; } -.bi-emoji-tear-fill::before { content: "\f7ad"; } -.bi-emoji-tear::before { content: "\f7b2"; } -.bi-envelope-arrow-down-fill::before { content: "\f7b3"; } -.bi-envelope-arrow-down::before { content: "\f7b8"; } -.bi-envelope-arrow-up-fill::before { content: "\f7b9"; } -.bi-envelope-arrow-up::before { content: "\f7be"; } -.bi-feather::before { content: "\f7bf"; } -.bi-feather2::before { content: "\f7c4"; } -.bi-floppy-fill::before { content: "\f7c5"; } -.bi-floppy::before { content: "\f7d8"; } -.bi-floppy2-fill::before { content: "\f7d9"; } -.bi-floppy2::before { content: "\f7e4"; } -.bi-gitlab::before { content: "\f7e5"; } -.bi-highlighter::before { content: "\f7f8"; } -.bi-marker-tip::before { content: "\f802"; } -.bi-nvme-fill::before { content: "\f803"; } -.bi-nvme::before { content: "\f80c"; } -.bi-opencollective::before { content: "\f80d"; } -.bi-pci-card-network::before { content: "\f8cd"; } -.bi-pci-card-sound::before { content: "\f8ce"; } -.bi-radar::before { content: "\f8cf"; } -.bi-send-arrow-down-fill::before { content: "\f8d0"; } -.bi-send-arrow-down::before { content: "\f8d1"; } -.bi-send-arrow-up-fill::before { content: "\f8d2"; } -.bi-send-arrow-up::before { content: "\f8d3"; } -.bi-sim-slash-fill::before { content: "\f8d4"; } -.bi-sim-slash::before { content: "\f8d5"; } -.bi-sourceforge::before { content: "\f8d6"; } -.bi-substack::before { content: "\f8d7"; } -.bi-threads-fill::before { content: "\f8d8"; } -.bi-threads::before { content: "\f8d9"; } -.bi-transparency::before { content: "\f8da"; } -.bi-twitter-x::before { content: "\f8db"; } -.bi-type-h4::before { content: "\f8dc"; } -.bi-type-h5::before { content: "\f8dd"; } -.bi-type-h6::before { content: "\f8de"; } -.bi-backpack-fill::before { content: "\f8df"; } -.bi-backpack::before { content: "\f8e0"; } -.bi-backpack2-fill::before { content: "\f8e1"; } -.bi-backpack2::before { content: "\f8e2"; } -.bi-backpack3-fill::before { content: "\f8e3"; } -.bi-backpack3::before { content: "\f8e4"; } -.bi-backpack4-fill::before { content: "\f8e5"; } -.bi-backpack4::before { content: "\f8e6"; } -.bi-brilliance::before { content: "\f8e7"; } -.bi-cake-fill::before { content: "\f8e8"; } -.bi-cake2-fill::before { content: "\f8e9"; } -.bi-duffle-fill::before { content: "\f8ea"; } -.bi-duffle::before { content: "\f8eb"; } -.bi-exposure::before { content: "\f8ec"; } -.bi-gender-neuter::before { content: "\f8ed"; } -.bi-highlights::before { content: "\f8ee"; } -.bi-luggage-fill::before { content: "\f8ef"; } -.bi-luggage::before { content: "\f8f0"; } -.bi-mailbox-flag::before { content: "\f8f1"; } -.bi-mailbox2-flag::before { content: "\f8f2"; } -.bi-noise-reduction::before { content: "\f8f3"; } -.bi-passport-fill::before { content: "\f8f4"; } -.bi-passport::before { content: "\f8f5"; } -.bi-person-arms-up::before { content: "\f8f6"; } -.bi-person-raised-hand::before { content: "\f8f7"; } -.bi-person-standing-dress::before { content: "\f8f8"; } -.bi-person-standing::before { content: "\f8f9"; } -.bi-person-walking::before { content: "\f8fa"; } -.bi-person-wheelchair::before { content: "\f8fb"; } -.bi-shadows::before { content: "\f8fc"; } -.bi-suitcase-fill::before { content: "\f8fd"; } -.bi-suitcase-lg-fill::before { content: "\f8fe"; } -.bi-suitcase-lg::before { content: "\f8ff"; } -.bi-suitcase::before { content: "\f900"; } -.bi-suitcase2-fill::before { content: "\f901"; } -.bi-suitcase2::before { content: "\f902"; } -.bi-vignette::before { content: "\f903"; } diff --git a/docs/validmind/vm_models_files/libs/bootstrap/bootstrap-icons.woff b/docs/validmind/vm_models_files/libs/bootstrap/bootstrap-icons.woff deleted file mode 100644 index dbeeb055674125ad78fda0f3d166b36e5cc92336..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176200 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

2+UrCZlNAp`)&G@jg{m-!Dn; zhYym7;-O&8glg>dkFUeu$1lk8mPmg_)x|9l{&e+csF?1#Jg9$uQ2X9BKRmV8)xB#h zw(pR|(=DVs6k|HjCDA+#o^ViggRb^OQ-hAv6nm=Pz4(HDJ~&TS=uM*ZEC#$h zD~UJJdsNkC10`vw?1Pg_r`@c4Iur>!QrC^=byk}`luLEA>K$ALygicMHP3^+!f499 zF{5$E6CsP50M;x4_;!b?y>S?}pT6<@V>d1Xe7m~e@JsLmA5RQJ7Q*l`eER7;252Ss zLkb}(rIfL0AQUd|#LT3fWImejLk+w_3|taFc;hkJH1PYq0pj z6}GN&-0Kf@vI-NvNRCAu0?O%%yIk74Nw3pS`fH?z>AOJwl71(X#g8b;4a(JckgvH$ zh7Y{h-0T{go5AL$(cRqC;l${6yN`9d|7({V6vahJy}2zZx2w{kD7M?|#_fvKzFCzX zXfzt$%vFuXRWlx(`d2lM9&KE8bE7fy3;ga;p_n6l9&7;IHKUi>R6U+&LrwER#Ow~+ z_ApAdf4be~R=1bgiV=@J!$nYibP4p)0|scLn}BwrsBYN`jbl`haZDB4`m3=!Z<@7d z4j!DbXM^nIYiD#+(sM+j=NA(*?lL79QrmpDUL7Z znXU68V7ZvWj;psg?7um7=W<~$#1rlnhk~oSGOue64_KSgcXx(T;HtX&hAyy*DWvL3q+q~gQ?dqE*4`At3rkCbauQ5 z#bAgx3P{q=6I&%Q4?0H808cnn>F(({SeeaNHWeHxWA zrBW^5dt3OUG{zWr5>$yLC zbdBx9h({r(Zl}0SS~9d}+K>bmFVaPOd=O2G7s+5L9})vE&}$f%F0i!4?6AXSQXUh{ z=Le_12eQdzQlg&~@u=eU=OrrD(9cnoJ`dxVDw92t$J4UX-!rkWvqKfWcBBwoNmvt? zhbzRU0M}?UrF7I_^noiDj|r!Rmq0&uPIw27+p?6UJU)7XC3orn(~uOShgaw4lL7jr z7n!nWvHaEfaKO6@FE)YUM^DGXl_5 z2_}a_-%k2j5X5VE0~~6Uf6Q_CW!@-1#y{S}+vdmlM?v1cXXr~WE0(u2^c`uaJRy}U z%J$F9a6ST7_-Ww|o{M0jT)hbBj|)xX%BV0d8(+9WVhsE>7LISbIlF=N9YDLA(tzFW z0x1fK#Q$aU*a5a1zyY=;z=31ULPBu3@@Jd)pgHR|kEP>zTt`GOgIpUZenvP8)Mm?o z7?n`J_Zi(BGI|RR3FZSp((<%2oBWo_{V$ju1McBeE8a_eGppoCP$~u32%;p3puM#m z({!-EL_1s5)CVPgicNw&ItUG@Q7U1oXo-FIhr>o$c3mK(?R_geym>fe`_uG~^>MqL zgHEU8pqs{CXfN23q8SoD#YW7ZLE~$jInzKO(yu@0MpDqINUy^t{5q*Lkv1=R(P@+Q zpx-@BHsiS{nu}j7a^U7ib1~l&IQ1*9K`Sk@wP-BAJ?(F`JKb18iNu|GF^!O#bdcFe zvrQe6u7sK)WM$!a>wv5p4=NYGx_I4ERi(aXYOl7=o{o23a=rH>mgxq4FOKJ+(%sh8 z%gTG5h7p8|*DpOF6Pe2Ts~fe`twp-ANEBM#M!@Ex94=hndP=ySWzXWtIlAi`Cs;-- z^ZK(0qhiV=OnC&{!WsUpZqn|o12=G4Tyl85&o&muWPvO_0VXc#ZT8^N zdW`v&;x9;w5gJA~A1b0k!kbstZuOi)n+Ge3LVlUJ{?&^b6@AOm%|>JyR5NT(r^#~d zD~c+KVtLUK6$$6MYlrKx66&_->;5~TU(iHSnh!l!H^k;rf5nfI#hPL(jRW%s4#|>C zOg}hu=zu{KqA64&!OSm+A|d)*Bq>CaXtG$ArTApU) zm?W->#|e4}K?F|{q!wVS&WeB=YE8u0Wf`MzrEm-{G17F_w-TI}U!ZFu5C?NL93h+> zSVH^1QD1Rnu)?ps`FN8MQE^p=DuhTbbiuMied>VNYN`Stdln{kF=~OQ8H%o`C076| zK-9l)hKfe1B*Ji8G3-zjWxeF6CYAqIj;v-|X&srNi>F$|FpP3ZcT|xYj^Z1EFWIUl zOCZS#RAZN+2qF{LJ{THQmPFGp0j)9VpBtE%eJb&E*GrH#<$^tkGQAF?KaBExweXPe zgTniSj|xu;|3dgx;kUr*{S)Co3jay?Z^R^JasV^<6}q6Xu$A7xtl5Y=TSy&;pqy_TPdon(fs4nx_)OitN(VM1Uu?+UIo=0hB`f6~#;7R3<{PfP8PJ|F(Dm1muVSH*I` z=BJ&3lf1o|6fY1W<|^Gnc=#D*PUIM!sO^4xaE_IVTQj07s_jlP1Od;r!z{HWE3{jvT)gkr7kmA4hU>O7i)PnzHl@Bqbmoe;Y3( zMS|0V87f5ly9^T|{yqT$$c!ML6Y(hF^;=U66!}zs#=e;n@#@0)BT($?Pb2>9gDemU zsD^D3j(-bBMom%7^7^A~(}vF(OyS9Mz~FCZRRYa|x@im7*W(^HTN`8v3XE=D2rGb( zs@si*Vo*t@It=p^t3+kPp1FTnR0;e`hu?f4)OF2-K8^yWD%EA#v~@Kg#45Y3d#Yl= z*Nrf23D*fX;9l*Q1Pg6<7AVW27PBO?ENKm#;TK(Ty}y2`z&-~WkYa8?-K~-@!IP$5`Sf#j`L+Wd7XYRmk(~hV)9KiTDX3sIvax-MXx(V~?PX#T`;tz+S7` z3qi18S7Cgh1g?8)_*tpCREDqO>+p7{;+l4gC$j@OJ^k4b?z1a+2xSGn#ov|H@=|rM zf7$`z`-Stu+k|)H90&9fV3+op<^~g~%Y2?&MOSpuC5;5Zzz04E&7AE;mvqrd%_*I9 zH`&T)%(sa12T+5!$#SUyhwhXpBbJ&Ha4Nmn?oHE3hE$iORwHP%Y%97dvTRgAGEgl@ zDH)QfwBa%}ovtD9K%$TAG?wMvU3s~&6M7A!R5BWv6v#~N2pp>|g7n=bJRrPTcwG3H z@N>ei2){jIE%c*lIcoA~oQ$4LpKmS_H76u=?T%k#5Nm!-i_gIVp74Hy?Eij}rCtAK zkPaIC*;0_uLocX% zK2HIF@#|T}L3S^N)1S z#n%#G0WF4)B;(Ie4EQ5?%||`P#ugac2hFUpk?q;_5#wF6Xs~yVh4&a6ua9RJ9q%qP zv^L`2_s^GAnbp;8A$7ffz85zlZrq5taU*Dw+Bm(Zz$UzoyOnz@_W<{C?latZ?)TI5 zR#3h3GkKw=^bI!v2dBcAvZ4L|tc@LZ1DXpyeEQCHG414cuAogWS(@PjJ7*{Q<2a zKtgw_7sZ@oP+6GWPx#58YlUV2Gy%UR`g&@-`lpwNzULyB;(b#XKV`1cCss{#Urq5C z0djfhZHDw_m8I6X+d|<=mxq?8BEBwzo=21J!N>fv-+DsldNp?^==>k%exCauxUX=3v=fc1g)YLx;uIiC zUuKnQC~G(oUGWhwb>2_2h7-}*zn@@@^zWTCZ;YaFra{CN+iG1OlS-B#g!B_jo+O?y)E{IpMeO)Q$OSQG&?44Y zj((e<_Y`-Mdo6bcte1~+pN3xjdn0RHFKHrYD_obG!kJpv<)v?hI}z*AzXm;e1dZz@ zP1>}=b-9Te*San*E$6tKxDD<;?x(q*;eLhtGOh|APvd$?({-4_b$RGJn$~sc=^g3V zdt=t{C%DgYUj%FE-^VnrmmV=kR=6$?NuSwT>$>E$+*;`h&72^>sMq&`%$)7Z$rwLHbe$)}kOWB=1)djW z9$ACO$~uCm!)1dIUe|HMo*{xL3mASR$n=C>=J(PRpG9(+_-S$g0J5Wo^e{hcv1t0T z25YHRK<{7UuH|0Gy~X#veHk^ukOQ%(nD;Nra86{{(GOz0Idh1otEFL~9mY*L=zF{- z&0Yc)sztA88LBhmVy)zL)mT%FmcjVp=M2fJ7bR_%xj+kzI_Xx`unVqRu>B&d8$?%a zTcs+4L1Pt`>AD^xOADND<$15KxJP-6FyS$d;iaqq5-~qp5wx4G%r!jm4zt;)YI?OX zJE5u{zl@UOt(s7o&3CTUMX%AwXo9h6WT2mk1$ts^8^vCmdRhxz>}FSgOKa5;zma}j?@ zCM_&#qJj@wJ~+NiqxojUVYk!o@&oWh^v89))ffjnNIBr&(e*V>k*>-L5-VUT>LSuF zs#1`dN3Gw9PB1mc!1IawtG!gU%yyS8;9*Z^JTUM9prx)JVj1h#5XI+Xbc>VL4$1YN zIAz0JYn=$SSVqmNPdqN01^=GxaADbYOILniI7~i7!kvZc6=}nUs6ljaK2tY z=r{ix?jK*`Uh_+&+Fx=f`<0hOtH1QV`CV7*V|sm@|K86%%KZ}e6wL)Y2LBCo>ootR z<;K>(2f2|RCsH36Nwv@BrrOR12oNJIG6j2ZPUHT##K#Mw@@ zzvPl*Ypwor%(RX$w?3X`{}LqgOJQz(1g-uukUOGv*1Y;RU*h_~cxwG6C+YgA8vUgw z>?kU|5$f|%-sGsK|7I-P(J;OJQjfp=6hrtj160wOQm_t{|%e- z_BzYs+A5XkW(|(#=?-s`rX=y}f^>L}h$5u}OImRY%^zMWJ&V6#zou!B*YM37HhTvk zqa5O+&Na9LppUF^SHSpn6?ZLn1B_y)xYu#72M)iRdkc3j@cFyo>5!L#0_j10b*wGl zD-cXv9oA_t7D#{zf8WnI4>9Ba#g8!yF>yqiN(0by9*+38Nt@#18ylq-U0&RJ_%ub> zJl(F-*0$&tvFKlzj~xKs76d7tDRJoYQi0VmygBMA@*#BJj7!O ziNHnq8p5^otH4WGAC2qBSE?pg>L%`hs<%Y)e4WP}EL*MX#TBc~E3U=OT(qWWZ*{Rs z!@*%c-Kmr5&e0B7eVyrnrMw4N6*Aj@2W;$UJG;9AQ|2Nx|@HU56@Eqkb3+V{FW zvZUO)e-F}n&uw(K?=HhK;NK?Oog;>d*^F^>UNue_Ww{k`OiQuh5~}wT)&vi|5O#*z z5JiG9_(asTJRFKBNyYHsoT}^aZZ+7!XTS{910F&=Vor%EZUv;#d$^C&oD!*Wc+l(r~po6P>HWJ9W z-$#t0+DRNPEbNgLNoM$!_uiVsKafY0Lh{I}e(u0NJ?AH(Gxhx&h!O*=C5jpyjx36! zvxB&_MWX4Fq-#Xn7@))aAidl4Y`0p# zY-JSENr%rBVmQK@c|m5Pn1-Tk30KPkGx&R0J@xIGppZq^`fDsZ`h3CN$Oa(F2{#4b zKN4m`9P-6rV$iU99s+ET^p|jV(r9U#;Hk}n*7Volc$CKkX{VkY{ZZG!K3R_6u?>=G}0uh%j z*DknB^>M8dbUl&3O_7W#L(0>wQqZM>q}S=Tuo4}|wz6K;{Ktc>R@KQ=p&%OKUe{W4 z3+veG^@0n?*ee=ul635gx@7CJtmEIUl4KaspHfu>EjrZ%rOI*fJbQE8%V5;Jhx;(# zO_7n5vD{OBianNl3N}YcJ5-#vz@Nj^Ym{V4HYyQu&TMx8p__)tBPvUl%bdO{ z@X?{`LXY6$cc2w676tUSX_C1f{AL;*(knf*diuSY#u5haFoWQ@l_T_$eaT0x!eELfI@7OlRRe z3l1KX1yR#wUO28+49O4`ebOY7DG_s0S46l{QB5%?86My|FY!Pj9`=gr8B$L08UJ>| zzfLp?uj9$>a7Hf$`!|v|z(4=&O{@GNULZu^j~rq9L;NZ(59SFGTau#Z&gFDPHVoN6 zlv*OeyTZ)0E=mF~$~v#&P^a>`Eb@XRYSTqY5F|lE)q*GrY$RC|@EWdT^yzyQ_crd6 z-0uWE2uU$Ta~dE|_pt|I3W#ntl}oxNl(2i0 z_Pk>cJ^1J0RLvPB_)5tLpB}~;taq;P@*w48ekEXmWr5!p9Piy59PQ(UW!T+X;z?B` zO)^j5Uy~QAgfB@lC?>Lq{S*`wdA>Z9#wA-3O;cQ46GR!sfGi4!hHy$W=ZJN}XTYY5 zypcc0{c6HHvL5*+SZQ}Qn(OoU9By6_IwoS%mB<(tEPzjAKupiToPNl86b- za1;886{<_c>ux;+{q_m&xBW`$kx>m6VamTZtR9!|Kicm6BI|nrx1=3XRQ;jF!!bvW zPq|F8Wgo`ePFb5nSwEFXTuHMd6>>QsAagO&$LB+*QFL@}#Jl#IPdnHo^>xgVxr)81 z73wLoL7Gl_#p}-cjNVqF6m8VuiZSS*S)lHVYezPpzwj4SNq)m29v#`TBDerFr~}eUP8U4)rYx_WIY6 zPG1jeSR?KlG_U!MTjDPWI*uU{_^nf?F%k#!L9ubCETc0G#;jgHjo3G7IkS{AKjP!} z1NkD!5nVGt`0F{loS!dWn=^7|E(6oQVLGPi8rM*Sw=5VXTw75~b$g{c_2#=@D{DDb ziR-T_$lAT2!JfkGyG>B6VBqXCSXXJH1TPNPYR`BHg4U$&tE zFoJ11*_SJs@bBSaM0(ZTikeg9*HmgiHmaTpiRlf(@Z#KyR%&%mJ`X(VzprW zG+9i4>%5PX6fF*pNQ*@N_+gYt=8YdpjSnU=)<^JQ#+iN+p18UdK&2p5EV)(|RKCxK z0=7nEI@X@c1`H8nJsSe|btJ@xwbE3n>^NoErEs-8D&N*gu&`|yroO(8OUc%OHHKp8 zcA6TO#o|RgYtq_^Tq3R57z}$x7K1O(4`W!Iu2g0DYuj+E62r|DP_6@G_ba%!Z-t|2 z(qz$DY<*5QhO=hB<2BoKe(9j^7XwqBPW^hUn$W?7y9^Vc<51L2W0)`03;)irb-k>2 zePsXlTr)S9*XJL~35I4CawSclNAIj)D*0kDuYm1l+BJ)0km8~J`xlIS&Xml2-n@#^ zW%=&A>&rKSA(P9k9m{+OwAB-`xG5C3#(?EBtnRxX$D|W|MV~>d0oAJ_uZ!!7u993V3#|&yaIy({N=3t zx-KbpQ7$4bH2s#mDI)U3T<+(#m4C_pc5KA{=J*{hV`2EP{`c4v_5#cg%T`B8Td1t> zt&!MsGET82`(%wff|^C&r$HPPIRIr0LT!pt8oE~wBg6R!CUFW&e8CU4(PjA)rrLVGf*52A+J|EeEvqWGxnkB+(X zhI;z6YHY3}Fzd@hk%j?vb)#TByB$Ny34ZKwFXwK?+@w3vUXrHhYAfX)sadi3myMXE zO(L(x()Nm&onb=9HcyQyr;d!s5ni7LHm4(&j*?-t{&mN}Dh95LQ9O==5k0Oe3dT^< zegJ*|mapSta2xzUQU%u$bs;IQCb=uPYiLa%G_SKjS{;Kp?-UTWK{$n>g!qCWFgRTY zL*ZN(gWw#OS3kZT;-mUaGdSltTtgm!^29J;1~ui>M}^oo5725t+kMqbsjdoJ93QTV z?`Ht>AN~wIsedNPau>02&_y3f4KoQ3fiLEJx(}&+5EDehFDST?TrF}dbOm0_s}eYK zwx@C0JDTd!fwLv>`eZm;D!!k~P@eNE%)#atcr4Twx`8&c8#r&MG}8fWT4CShl70(Z zm+~s^HXM6>kIS}=8X!)Vmjl$Vw(kh({1$V>ylE?%y*lOC$dTe6>h#Fn%X~3^uq_dP zZ>qXt*GuT(&}GAVGkQLh*Cym|;HSBbyJvSjHQUg62mYH(x*xrpHL7Y@@y0GNch2ME zu|W(kGqkD#%Cu8E>764ud$#Pb%R@ar+jrgDvwc62?GX8XFxGwx?@yhK?)}+@-sAX$ zG6{V=-WppJv5|M(_$%WPI4O6p+zDkspVpGNF-kk;eR3P> zHzR%bRJ=*aK6k}V`dk#^w{?H}SsFr*cJ2uM?Oej$x6U7kue)E%$ovL1>Ye^puUS*7SWRQDh z3y%SR->^nz(r7K++8T}5NVa!vXO=5VliyXAz#hVKt6Pfns}Z!*PZC{SUss13)^Rn; zu#DEas*{!xx9b>vuwK|MP$+UIGBS-yl?M~P#PJA%{>3Tubq?AoK}6HVYqRO)bjeTZ!{br%|@9 zJ&u2JELK|1h%9Pl2PJU>vU+_dTt*A7D!4ucV`pg%RzJDpmJIa43Gu5MScC5Pw(oW=8fng&(`DMndM&i(X;e(pN6j#a8*KJ2eMeuy>Q&zrj4N! zkSNcGHq#FybLm;SLdS@&+qf1((!Zf-n)0vls|6#zW<TL9B`b*zM&tfo3 z%+QMYr?HxOhz$v_5mcNB=+<%3M2ew=PMe*jpxuvw^9(JU8!dq995&|$LMP3{1YY(4 ze~f?`mnvIMzte4QfglFL=2_flW9cS@VSa6%Vk$niG5XJg6}+|$7bsz2;jqG|Qf8%v zC(>3I8S z9QRJ}w0$#2f;^_9VZG-$Zi&Wlgi}v}EMg0M0V*uk+QhnhO(hiniR{hK)LJ$8_jo8t z91A+LwFrNPWs0mC_j$i6GHf0zPfoULwd1aJmIm?PUvSyVWEiKI({L%u)8XsL{+c6P zue>h?ttST%VT4(~M=`k^OElNHe|C8m{;gGJX5hfn@(zDkD;BlGypw+vvG@YJ^9n*A zoU!v0qM<*k8{$OXb_@4gF6H;c_m`m8o@DjFeK^7q(i;Yc2fehNPNNt|=r(Iaqvb=p z;ZD2oZ*vgZA0B_kP#;A)!UoG{FVD>6+0%YQJPS|UlY(k|YnB)SN@`PC~ zJfUwttCH}IcV4NguJyLw(}kz6(#+U<6{)BJ$G}gG3;$o-mp={g?%@_uuS$Q#W4%jh z`&{k$0f~L7-R&#sFXwJi4dIKbq1=&so8@W>(T*Q~^#B|;AW)J%A?tufXzW?tl74yW z)l=UJ;Syqa#H>9-aoGp1Xr~7MLHs^<{P|tJt)z|f-Dz`hBBWa9L}NCXiwTv=A1Ju?lsN}DAV?E2cd^@eXP*l1$d+El5(Tn z3~=CE37wuB=6UeK_CZ@WDox92lt13el}fo*?W)=hc%bMih|*l`s?W<*R6Rej(7_sp zorQ_b!bHI?H?OyI@6Tb{4&2e41!RfAc{IwM;oBXvly}=$3vz{~Ok9Y}4Xl0LPdh|D zCR_4*C8DccLj~o!3(B(ea(YNNq$0}?Nd<#_*Cd$ldQfEy4#D?RAc3s^;5_VPcK_v8XEDH<;mOp?(O zt{QKxiaWr#3!pm}Qt+AGqWxgcHpOA$gxdM~c-qfU5~Ae| zCBRF2t&DEU#8}Tf@CN}DHz9Jb)`{&BSXrIdG(xc3akD;G>Wd7lQcm)nJ>`I8Cg7yIyG!+H115$G02X01!a2ptrukRNxTIc z8`HcLiAA@^sr)5US-|ovypCaPf-7uL-4sMi@^Y+iGCW|eh_SHHXgTru?NqcwH?zgH z2zFUK8*YMY!pt5Nf(KD zn^d~}j9k!VP+8B&@tEKOS_Z|z_!^A4#az)!Gs={+E=%INpbG1vByYwR(tp|%Pl@o) zB+2;{gX!M=R?h<+j|rV^vh`erul7Il$?P0GUxM!t`o%A2Cg$NoobWJias7_c_GnvZ z`hq-hulVY1Zvliz5q_RM1K5#$1ci9zz6EbVykeTNBdB>JUdz`;h)kh4iPy;tymo1V zK@4c_MU8vLkWLB0DanYTw6z)Gn&V=AeOylfI$3IAL}xG}idkUvTSN)aqma-jI4S#| z9kR6k2Z9{IfS>0>obc%5?{^ii-J&Bl^#p-3@bsD65RG6O$$*~_&43(TqDb=b`VT%{ z6`2nDG=;fa{y#1Pub7_(XWd$|6XEqt7G7g4yd%8Q%Lp#uHWRO(*%@B{f#MbUwd*N; z+7@b_*GcdGH{TX<=OFXO<-l`3UTFr2qnP%+m6ij4K1>c|;k85cI8^@Km>7uhW(>85 z4Dl90xJ5K}gjag#e=8HO-;CpJ2yXwQ`B3Ijy_Q=-WHQ0$*5Zi-4> z5P!%f2o$#a7%n0ZbwP9v3bGRU!?BG8nhW$gy7D1denATffZaD%tJ@tk(NZn{Hm2BJ zp%cY5fd1c%*6{t+|GE0UWaEDawZwyT#u(JkU)rMSUq5$lEz$ZcnqGhLG!3e90#ogb zo(~2&W5_tPe7_t7ct$idXjK2zH0uFt6>Y&T(CTg2?uc~f8N_GDrCHQI%q6lw zbFK!`Y8w6bg}|Y=jKO4H(5|q7%8JVx)M0Mk)t)3y0kFzO`Tg0I2Zar>3QE#9Ls;XVeDy?6!;Nvw>>POQh#7+T9u7t+U*> zbPX(~#l}duF&OaQvR@__`9`#wq*;Y;K?}AYMtHLc{W^)l8Fzs<&!^!KYftQ$NuL?S z$+!%grv0rKPy1oH+mDi+k^UZsE|+uY5;#A42xaOR~ojkYloIifhqmkK&aNhYKK#KD`+HY4De@P89>U+YcKOUK(hCMCPCY zhrQ2MzThVYUSbfPXOQp5*339Rh93xGU6IZTq9}Y)S~z`rlL1>|Q)vY|c^abuW`SR# zb28VZX@EgBURYo|pv5sVCM|49_-*-Dk?TT=SifHQ!blX^5F`yH42%uRpVx6Nih|mNJrDm+XnDt|&(E*HKSwjiqUpT< z-a^N@ z^mBpvkGajezPqm9>GhlV+)A(8!KB)*hfxAbe~Hf%*Xup&G|J`1UYyK$M>Uw40@0E) z6*F(>lFplXT`_XDWb!#(mQ+)b|3@@sZs3JQw@`4Ob_<4zHH3&Y>A_Le_FuQRQC^?$ zXSya97BqvXDltns&$~p^3{4}ZR**=A*Q$a7=xp+;Bops1Xu3Xl0xUOt{|VjvfNI=9 z@?|+!nNTZ{PK>@V#m^!ctjBZ0*rhhG`z$l#Fs(5d-I#yZbvo2d*6P|cdI_WMW*p~V zvoyLaFY%h+tb+RjO&-YTf0iW@)OB^U0FYS}JT5+WtI|rh!8+wS*#d$-LV&plXIwJu zb$5wR5gGu5xK+>0)m{n}E>1JBA#%uQ18IZr7PXGQ`>TocqMO7a72B;=UAqE@rf%eN_iJ#qTJow@uT+I=nwiVR^2);n zzF3~DR@vsa&g$NY-=!<%{kx#i56wmYC(s^app~zO z7MZD5X6L6Tr9$2+8X9l;tt;}HnRPAYZ`w~|_{Yjxzjgbfoc6yua+Bhbm-mg{kZ64# z`pu5`m8L$!{VvC)vh{Z7v)9D#sD=GY`0lu??!xyYFXEd<#^u!)`+~@ys6HRMD?c+T zRj#|3AIJLP1m^-xF*1fqlxCwXE0~V2kJEvy6An~636r9t=-BJJ^#g)POrgZ;xIF92 zRzFCW30&+94lKCSb#0C{$!6C?JxA?zi?-T{r0Cb_p~TA__IRU^T9|{)$H9iutk)24Y>_ zOn^Me-tmxXN`aiH>@Rwb$xBBxxzH-tSEr{}uUM@UP$G53_Wj}5HYcwCQJ86jLf_qt zpb$&|;y~TCV=u4Ocu6h9Ylh&vn#10f%&M62Za1;mJmX8}vvMdR&(QV!LvTEtCJA`f z1`(XgBE*9UAdhCDww*zPug5`;t+gm|lVFwXPtPl0#`tc3IIsI%{41)|6U|I6VzUmP zvRrsVR6fr%BbDt!|C%Xhiii3P;{et2o{Xz4;A6ObwA^X$&#;H#yp*zFvXsv zeifm4G6AT+L*a+4-1;t^r}!sDgy&srlO=pZph;>U&u3Z+$FVqkt@u}QoQb_Pn)hJ8 zpUHefGF?LAeW~0I$+xd(w3n{MDktOR`XeV@R3e%NAW5(*c46>RLN?SvyY6LEDQ2`NLyi-4Igt@n z@uVN2B#TKp{O@cEVi`~Z|CU)uNi@e0;C-1^bsGuu13@663n_6n6!Xt+0XuAlBORL! zjoBw)OJrdwipAv#_o5S3eV@q>VFxUP)?9}(Vi$t zz>XMH-%3V@j9*)k zdAVMe6}vo-<1-A>7TgrDt{h(q>h%F8s+|!!=#8>w+lnp_8OLlGxa;NC>v$sZrso7W zfU#RLe-%2X1)bAJMA<9n2d;2&S%fPU(RZD)Lokx1+s+s#!=UxR5-NO^cGXOsH8q~6 zhQv}ZqDS$`i80-dLDQw4IX}j~6|Mc)a!jX=jjvGFFEGyk3YuRt zw1iGN*)J2}9fZqX{H#v==dg-V3PGRec|{OQ!1zQkL{&rip(vunUl$xpA};5xBz`nH$@o41zrSc>>tR{&Di)Cj_sphc*L=N2<|s7$H<$_;;P9|iLxj_pG*U)t@Folmr5lokwuY>QDn;?W@1Vo*nG z_@5ZTj9b#BIk_ayN&1rIZf(t}%ZhS9ajo@CgD%p~D%=XqT=~klW`j}FOVMh-ew^)A z#RLel2o!21WS!sOR7?681NSMH2P8Fu3KG|3!fwj#z5`w?@z->@au@6?P;bcP*T zlL7p9j%ZMd33^ff0<7@YjBl;BM_bl1vau>} z(YAF_8re?${o!k0_(Z$MZt=)X85!1)kMrEOSv{c@VH&_WQCp%dqhw~;Ffe+OwOm`+%c{J4nG5*OsqriHykDL)m9^WKKG3z z{(a4eO&i-0oZlh|SVFx>;r^DhC`K`hS+sodpG451#D4|vybAGl=zH*H@th=Hjh}iM z$0c>XfY^; zEPObf;F)0k(%*9bE5MS#8Gh$kin8dPNrnsKZ~lR<4VxQW3(#rzy^yop9#9`B@prfa z^!=sT4D&H;U^bcU<BMI3z+@h5ewEKjcB|7pP}lR#gOfDycez$uekX$deyp~MMHjdb zHj7mO?MLNl*eDgFYtIi*YNsJwGm1rHlL~h~h#r6|8m~Q<0IgOuo;HebCrDCFH%9TM zb8(O&pOOM}DuN^!T+}NHhS5l(QNJJi-hUDBPWXY3G0h{R%>!Q;#KKP7e4ij(eKlr8gs0%<&B@b+M4P$qQJCs} z%@IGy8za1XEA1eoHA;#@xQ>Q6>L$K?%)x5>hf*tY?hIH=BtXNcN> z=Pd3yy83ZjntfZqQy7YXL|84gBV}qc;Iaq5lqbbFLeYw2ZXdnARQIy!$zYD~EAK&0<{B zW}0+NiDpXkh3`kNOxOhbFycS>F=|PP)OM|8`ZKq_dStauH~)8?u2&ExU9-&d7%STl zp04{h>#GOpJxQz+p@BEy2`#2qqm8hIg^+CyWUK#Nw03Gg)uRt3J@rg;cA{3byGKb! z8K@i*q)_$Jwb&m-_}6G?HfUmNSXy2ZmocSZ;c491ljXJY>>& zuJuh+z+q$CwVM6jfjaF`TP#0IV@9R+LEr}x682LK?xqluF5&*uu?ErXPETW;y?rLu z<`565s_tiEjWSeBJ%pQD)M`7zMYygepw%_ptGPQaie7>Kj4h|@OgtygGO)&!l+lQI zKU>XpHppJK9wbE_iI`_t`Yf!_xz3VgVNQF@l?(eriVa{UQkNL`Umi}ua+R!N@oSRXf8HX2y6fa;^pF~vgK$_7` zD2`H%e;Prh@X8xLsIX}#IqUTg=Z{xK%ShuDE>@LOpL~d>#5n3 zk=XCFR-7t2w(YCp(ZF;LlAPL9JhzgosNm8W-s zeiG9@wSm9^7b-gDVUWh1l5Vq48Y1z-M&W?&rnl;m<-R7CO?n! zoTOahO`(~i*_~!}VL@Q| zGSd8h^F{IduoA`Ih~q z4AI^wp$}B_b1vRzgzGU$(KL9_22JZj2`hq?o>XN?)Ua(Dyg<|~^LYdpHo%Hzv1n@2 z`(x&VOzoba9gCbt>%U{Z^|G5pG>C~Hv28DqOY!Eg$<$s*4@n@_54J#9ky~8gPooJjYEz?&Z&y8BL=XX!FqS;q*yDVaZsuiNhn7c>{nAcG8FbS=&Yn*TDCKNZ_B1U5Qet+JY`Xq z3K;6%=Q^kO2mwx(FDUo(OQ|Le1F9*_5E1*%=kV0 z5DhKyYvYdIsUHj*m88X1ytW-J2GVpz_Rom4$ufXOBhp<_2CSI|frbAc_G<0nLlB$+Qcp)E*pG+r0~l5Y$WsY8RunkN&+V3J2(brJo3s2w;WR}3`- zN8^KsGb|?G5KQvG#xC(ddssp@Wqh)4WSNX`JQk(jooO@5La3MR=N7qZ25kMfvJk0Z zfwIsa$_^(6G=)$-^Becz0O0{$L-m8H0Wx!3GUl(Aj`{P;or66@v;D>+{;*V)bb>}i z9f{35F5t`0NWwhND+=G_IOE0t{^F16`$bOYiohXtZjM{v4uZCL1GQ-y&2GnQwfi9C zaO)`^+xaJ}uyd4N*OQgD((7Xe0@y0;21aecQJyRbNBNF|=mpV`Ct#Q&!#yEM#+;^! zhHi_ZrmMz;q~rl6o-ay5QRZ#lAvO{0f+QA2xgiJz^`5Ejd_kY>ysYQsDo0PetYwxK z4mSW*M+9C}gcFiXs&-A}OT0KO@I_fEOe(6WYIBmPYKGj>;cG@+l6b?AnyRMiT22&9 z^&czy*A5++l5BXZD>Zt@k9TToviQa(qKKatuvUE{zORP0HTx;#J45q~#YquS;!DvC z=ns-a`FMyQQ#}n z_N@KIVy!ss@{z%`m~136o~~*FTi!o zvh>L`Xo8n-*wuwe-kpX9d=VNlUEvF!ZmQ*py8FdawOZ2LIcNF}gOCbm%$&Q&6KB0* z&4PAS=VjBAw6dlVeyUxsHmX{=>2TxVnaO%z(ep)qZ^ave=R`XY>BI2+hBV|Y>T<}y za}=Wx2cm!Z@cd^Pcs{ukJntKkpSNP91O(u`c^CyJdeM zo^ouA{-Gcwz`1uceEz;bV@?D34vvIMp4#|}w7%gg9pB=349gq__!MHjv+1y&8OP`~ zzyq%cusTBll2v|hX)g|@WHD#zo+-5|_6)86C7!Wrme&vfwHLla8!ZWYjvn2^!jNLH zU4iirb{dbZNabLNQ(_49mF@u7_7Jgha~!uTAWVf$h|r2*P!!{`6LGJP_mg3xpsB1` zwwd$V6`|olYd~IC0JToDT-F>-1zhi$Lfx@6V^>;|>0S6y(9X{z0zMzKReJHo7cY<{ zQll|3Ep7$Ff_oHDDM(Q9(IaI zbfO%EJFpAx;A4iu!?Q(s|B;?qnsxZ%wEdJjBh=P;1%11)of1S6KdBSk3G|Z4q}!YPLDCUMG#%wX9`Ze>8xhWfqRyV1d$K^BY;8heqyi`1vrR?_WI*1OaKoB>4ep zM+9vc@wNo{iq@1Mxzlb$l_?|%YX|oN@Gi~(Q+0H~mp-kw@4RUB{R3dxqvY|%s_fQ; z8J9X1zNtxHLP&p`=O4xMk81OdvHZfqtk77T1~^m$WQV4qKh_Z@ro*viiTh_7aejp6 zSN&)AAq+wokC5FoD-760;xc&j*_yG$Zi-gSKANbt+K=^PZ{&+C)r?hva4Y%#}nDYm%TrHx*8fbm_w>K3BuG7wO7(%o2_H>+gZqkIL1; z#i8lHjm-bYcZ$I84DTwMNW02~3p>Rq7s`rde~eg5$%+JPd&2|=npEo%|E~EFsIUM< zK)Sz~-%3`TV!~iHAsYU2dap7)1?`=iEs<#$#{4ytaTs5{Vx%iMW{Dpe@;;wb%plw4!FbFy-NxU!N2AO=D{SdS7PV5+jE!pA4IXYf?eiMZR)r z=4uL1AxOTCT2K=gjifl}VL>iQGA|WmNu1{uNg%QX=bsp0k6Yn81w&dA2rr8hs`MLa z#+JkHvzXL_U?biZ>SwKC>e=9p_Gpl=P!)_xm9NDWwU5WtvEPX+Z66-Bt*5C_p*oj9 z@K_K9s-I28q)l)`7U9I(4m)&g3-RLt-z{^;x!bvSWMZf_1VQw;J*p5;G7;GyL>xOF zz#Fdv4->^0SyTww2p&MEe>{Lq|M*w77cPI0!Z$~2j{Eq<@$*D-)Z7W4Mjs7_wEM4j z)Q-4cVt%+^qCjHPuGub$`Dm7Ph&SR4ThAZ!K~z8kU!YMYABOl}6bH+3U<1yeJ9Io(ZxswNII;@v}?QlkM7X@Up}c zy*o_=d)~C$(1nvxN?y39#$t`p$Hup{&Tr% zNmrztTQr`~i@H(L1sF=^?isgPo4Q@e1N#COTY9Nn(nP_jt&QK-IKOtc@}q4rHJ#1B zTE&EP;+YpAaU2GX4w#P=}`)5*Zg4gUB(P&K#Ab`ysVYpm@+v#{yGF|-+uh3y+YY`~)kk$6oCT0QJ|7&eC3 z3uF8EvQ93-$H&+oPXhiAbjPhbz{oznL)5KzDCO|mqHkpT_yXCM=XBsD%=RLO61U&( z^#e&JEA77bGM-Su`q2|#nV4qssWA0??)g8HWF|)SuM~+##g8?)05`bU`)zIs?Y7wa z+f-;C6Ox~yVxGyyh8O>6>D_L9qO6jcT=?-^Ue8fkxcH$s7T_V6)M3#um6G`Up1^&Y`Em zRiY&fe$C;lCNQumhp%7J4YTa3s%AE3ZKrsXoQH8UFG|OvwGC>B5A+-L!9u)|yMucR z_pY%#NV|or5j{;8i^A<4Q5TKZC|}HCR*X^@JQv2Z#p0E^9V&nlF-m)bWPU7;CyZBW zl<0EtSdh|Pd;COxEM(`dC|v2kp1}F2IBXXmqvQ<<$-CS!N(pLu*Q^N611 zk^IU2oEgBgOf)|yR@9R)sjjz#b1e#;5yTNGAv-1~TZ)@g=2j+*y-Q8GIH?xS)j|8M z@s0g6WU@V(H!WeJWl4@B*F936tuwzc^_6O1voEolHMkTEdm(6NUHp8*|DM}M%usiw zg8mAM7C-_5*lf`_UpnjqfbdJQSTH5UFyyi!s=PBZW0)p|t2}kynXm8!JL(heEMNDu zh10VK_kzJC=p_TX^%H6ybazXUl*e0M zsDQ5V0^L5tt9TQ7&T*PPQ%Ie29G9r$G0h#sm3!M}dmRDd%nYy};rW#nJ``a4lcz%x z!eXYgm6b?B3aN80%0>4*824wxEUzqADP76ILSLfVKYq+URcj{!ibF?!} z>YeEa^ES!lczenc`8lG=xe`5{v;@9IG-Z!yDjMnYT3#n}4`e1eTlU`z8!dbkTHJ`6v5E`sXalC&<0>yl1>z!KlLm}>A`2$vxU%YqJn zlDr{BdGMRm4?WLy>3qb{_Is_MrrBy+iI)4)T)f?6`RGnIhE^qAM;L!IEEp|HVV=`C z%I+0pX+xGMv~Tu-hm8$y!PzKyRa`~{cxS{RlH8~2uaB;FXLJ}<61xC+Wl;`JP0-Q{AoO-ni7C&?1ZeJE_(1p4WILhXXy#n zkFUWISz`}fPvSpWC+uyd_4QKtD_pNu!#ed|k;Uo%7{=TETp6R5=gWD1i9ZU%0Odoa z&bJGs4=p`>^7vxT>oj;nYiR~wU!J_`bocb5b4T{bwf@PMAJnu$K~wjv?dzWI`r|m* zQ*HX*S&XIty&j}iC$s9-%x#_h7et9=mp%XquvE-({8@=Z~2!A_M%a zlI{WSt=yxrI9w$twbU8B)b2PPrwNSK>~`9%9*9M-E>}F{Qb4f_3bf~f7Ta#MVc>;L zLqSAfeKa`fALaYFa8LBGxH0~?k12RT*n^F_((f&ajpvx8srj`${Gt>!CMVxx!+)jH zBoW0qQ6Z(hwj$00?nJ?`O^h-ssD-?!sitA=vkX(!#5`PqCy8krf;3;TO6X{mG)+{r ze7?L|&gV5n)HDfaQcBi=qhDt+cQZ`TX-qE9Fx0J;@bgDN)zkq1o)>ZQP!$EiSXgx@ zELA0-?-`(RYnq%_bty-Ps#+87>VhGH25s%xzi3KC6IIO^YtHgn&U8N1kRglkt?|HigAT}FlZ=hn$<{YSEjdkk4 z@Zo!X*D2F_JD}Fc_haYwtXrU$RxC>(7M>Q#{NAP{)*JlHp_A9Fdd9vhD@H}qjrOdn z3As{Hbjr4nFBTM0b}P|EQF3few)N8E27QZVYWUWQbpp>(96aanf^+QJ6AL+~bJcY( zo4xSQvT71XES7SDrp~q}57?TnSw&fmt`!TKtl4D)L}P3%70a!4I3rVGS~HHHcbs^- z4riTKWT6#WXj;n6P&kK`TU@IY*4DwgT(qtk-d;D60de-Ab%&4-Y&O+0D`8QQE^;xxPQw%$^D)`rgnm5 zYpMN;8wN2A*@LAJ#1;+N0~ZEiM?>~79KiRKG^=jI${XU2kiQ*HNiMjEW)it%I%3TrP+yyKf+pX3dq7LW(n^G2$~(})LKD7t@mPkR3kPzs&q;G5dBXvlt3lo?6o4q>%(RQXXrb5j<72t3={Ab};{`d?}&}W;z zwpS;Q1J!4G4W8zw(fLMiX5hjDd~InGu1+r1c$OX{ec=q?cLr!o6TS?2i+|z4;cp2p zEIBjqIw!JS+1yK)JIbBpUWqe&ls3>lpFGe$pF+?+pFV&G90%c62W-I(_0aKc&{Gu$ zZed;bCcL1}kg(DN%x{AQi2`a1%Z*ZFS+Eh-Q*eS89|$fiQ!K#W;x<@-3oZNs{4o8F z;H75~r;Zc&wGVJFa4zOi3D)M|{B~Pmvpir4v5Hf?AijXJq^_s6TtS$y-d?PV)8wBD z6~)T`S5c8la(l5V8rT&ck>1G{r>e9YvUO!>8#vq)cNKRJ_p|UN%#y<<^p3HxsD7{2 zRvOJd{dTiJQ;2w=^cQ#<;l{6mS#}WTVUF=Q5utPr7KoeiOgDPQJDB~N*drQrnrX3G ze7iLv2yRQSxHuK834)a`h|ZUZC}2#vh_UI4Lcmx9(@9W+(?eiJk?_6@7!rsepvPR| zVT|a}iEDZnPx<8Cr@`iX1d(Nk)y1}40#on7>qM_s`b$|6cuf|u*tUWb>nctu@{%YS zYT`=9GXfd+AwRY#pii5-iF+6K+3hH#v^ze3^j{*h`cG4TRpTw~?RsJQUxaGa4}MTL z%?p>Ac2tI84yPHgxsP(kLFc*-uDEi6M^w_%tF)SEe!Ex~vX2Gf zmvLDK7OU;{6}f%jVCSF$wC?nX1lZfB7>ZsZns=h2l9H~N-b}d&*8h^I++Y>!jx0-x zQ@8S9?#_5>fe^cA6H8U^e;Dh+19UAwQgIG&sC~&$EK4!Iq$#2x@%u#HCc@3UOn^WV zDGD;bDUe)_2%9`V!3#v?!@0>oMzyw~(cy>#9_4iYJL4Uhu@wFk6tB%yvKN#pN z9M)mFk-G(RKlPoMVICZT_OMD*WclI7zGJ-^9fewNSjUz6-LV{vQ;rO^GXig8%nxh@ zGS&1-g<`!*=tV=|ix}%72t2Otmh*UYO^5OAGGuPWCHZ1eKfW@n1|{POhh@!nJCAPw(hR;b5rG+`N^rA zRTd`sxmtO$F;M};3iI_+VFHX7`_4)oL7AQKCKd4{Z<%f#SXG$y%2Tqi&KGmnDqha! zk2fUCv~2#QU%%*kpvz&!B^YgiXS=|&t#$_;dEF*X)_Yy7Dy=lp!M9$PItx}ISE|oR z>o?qRy*yVd`}XV?D#FZE$tz7x2^DdnRr0v7UhER+0*An6c_UUW>6Tp& zYoxa6SGpbg9fy7g-H7mqaVq^KKF>=DXYF|NcMG#b%N2MH{u3u0RZ*2(QJ9;bpA)RY z!6~V}u-t}0zqY(~U~=-n+H&pZh+Wi+NH=OD@hZ3A7T@E_{Oej5yK!j56$D$t63nX$y;85=Vys3%?XC2 z@&|dv)X0oai|2tBSOc@;BGDa04l)VSqt(WyQF63or|dP?=Y_KUsWXNy9DO+m(#d_c z?Kbx)GmqqR2HoWck)MZ^G4}e|-z&$O(|rH0Ll#WXz*Pdp?!Oq1T3rW_lH~CQ`k# zgSEs%mkb~p4n1W<63e!#mK;Y@nap8K2r+&F8uoocy)j_`i6{r~wokxaiXiG_F15b?TaIIil)lP$ss zW^yI2Li6kG;|_2=u%AzG*K)4_S&RMf4EJ{Ko!kT5L)=HWN9d{w%)RIJJQ%1H55zo- zQ?A#i+csWd*ZUp3GED}qOZ19VcKWTpwAxi%#gpjorCuMNW5*sIgUS*+j$esiU+J{v zWfJpXY{HnMX{4=dAfm6=bU{`3s+y`Qk7%l{sCyM9FUx?i+)zT}VT3my9M$LNQu^rI&!0CTzy&>RY9 zNXa6;RG{z7u}{)>P0;sB^o_9>R%0*B(HC0ug&J$5O)t6hb|v3x8=km}STyBEKgzV>5=`8fi!8Too9&t0+>$h`v zaCd4yTCMi}fDpAMou3;;r=CAj6vQTQBw3juCTN z5(Qap7K@Eyu~{lL=)nZ&HGU2vJyZ z9?kS1em!FTA+c34e)jdX4E|q_UK4vh@YPMg^Lw~^fvdSrB8q8?_1SIEJ-Ok$ zEkuu{V_uz~t=bh-kaA7^r@GA3hT?H`otrBb~)T`W#d+Bg+$ zvq}Pzh?4+CP0bg292ZoxSn^M9d&JDuUJb|o z&i_KQUfQ5@4Aj}`f9MubuIL((Uzu~%d|q{O=W~uy;1xY5<>aa?7IZBq=Oj4F6Jlxt zoX8bP%CEsb2meg?Bc_~7;C2c|(|4qCtI*7|ET1FV*q0ii2diREDqyId?&1o;y}ORh zQ+s7z%44QTV;&RW-f<~#S>av}dPx$O?O12+Ut%;GhmbFESg-Cn0@vBR$Gw*VZ*yQ* zJwVqCkZ_3i`eE`)#8X%s{!+7Ih1N1Pp{XWDX4ZJHopuM8=O`ZOXYQNA_)>F~t}0kH zF}!w)|J-h&){pT*+`gPU1^xRz&-0?Q)%k~Xk$NM*QQ7=1CD>$u;%WZvkan6tmF%L@7>bDIm;yQ$bKRy z^n}r(xYd~RyMWLMhF9F3E$FIcsd~ZGWZNYL#W{j!c|dr%WhsV5QJ;^^qp&e%39PqQ zV)V~8$Nwev0#8U5`A`sU72 z@`+(GoK$y&iCezifj*Y_AkS9KpUTbBuF})(~@~aD{OdP5Ouh05W>?{z&d*d zy>EgfijpAH6MC87TV(N)JEXdd%kFR!b{nrgI+G)6zGIQa;vm`qUB^5psemzusT2x7s1C|^+xT1FGzJ5QGb zU_Cus)u|kK@yEbU6QJ=K@lj;HmFK-auI*{Vu*ze2`YsG0M9j}t1ns6Pa}7_t!)!LH znqF#*(DoF{Bv9u8y(0I+jFo z^FCVc0EQ9?M-tR-YQmE{97yDhapa!ekdIyx+q4cvMiJfK%0-C1Ya>)krin}IOdMEY z%Lm6hlw?+f?c3>l_<{Ea{wam7qiF!2U5l$O!8GFO+&V6jz%WiQmHHUG#wOg`o)e%o zc1ez30&KUh3oRww+W~$|iW`cH_^JO~cy8q5jb6vrpFJJ;QZn)kE^?7r@mpg23jn_1)v#W?du7U0I%ZC zV2ob;TQcZiSd_u|FXv3OVV?O567#!)B}c&&8K$FRh8uj9Br)riS+|+J(gdy zd#H`!miYlcaH(YYsKfnkiRP!aANzMp+WzGT%77Hp1!h4PI7xE?B~Y~5^Drt#j<5(w zT}{vcB_&bT&LnUo#G)cwi1{_ zG5M91iJq&pgN2ywsC*_{ zj#8EpUl{)uEY)PYvfK}Dc{EQ9hG8A00e?;T^JPz(**7D*<#|Ek6@wNr-w0MExR%XU zVY2O0%=5y6@d8I$A?42sTLvHS?P41nOE4(Dmv-;=ni)J-z{>p{_m$@)< z>@7d`ul{ecSyXr}*X>T^mJYQrQLGl?1lQMMB;6u+0!G?9X+Hg+mCnG*)bN%UUBR|0 zvDRZo8f6uiKvJ|8Fynr@oOgO^_xTVJuzif-BF`?YvDV&PZj?(R!;9ybdnd}xvOTrX zR2h1WlJ}&K*UezLA#Q%mF!H~!Y1|x}d;Si)_%=oo8{Py6q&PB{S7zYUnH4AYwJ5Sn z()9iQ+6uSuy;3x(9OEloi(ljBxh1X-J?)J&V#`T0krHxBa6qw&I!U+ywVhf~!d4PC zyL2sZ>~FQVarRuqNt+CB=L1%vt@|1~`^5(_0uwjJSegh;XIMN>2f_bo@VzA-OeZwEXU~XBi^SC7A1D3`xHk@yxe;jxkiglWKe{ zznou!zx?y6d;(ttoAtG|Gl7$k?tU$~(CU1|D9=CdhbK@CZQd{fj0N#^|37W-0_8|{ z9fsAb->V<03ZFs&-Dse@(Ez4rdb+0@jYjwUXLe_Q*blio`{V8oX_4ZPT<&s)ACVl! zup>>Nq)$R&vZE zEpzXC^?3yp&^;@_@4owa_r81IAe7aWxR>P~gnf`dFx}cgU)W3&Sr{y0 zqjv|C-^Zz;V-N40w5Kn;zv??B)}wcW;dqGwy5abHMZ1if|H^jpDm$|G-{XyZOAZJk zzJWHSEPf5{8YpLx+6)W9sc17ay)mAHg{wtz$taA04nJqqjB5t`XD?(WImMT>Z^athyC{{@3RJu#R{Uk{ zzaRaT8RE;AROOm1UsF`^3*n;=!8HRuiuQWNd12#Fogvxh^s-QXnSDp}Rq`0jFC-t} z3xc2Kb9$K1Ig!^En|Zt8(o%Q}50`i?2eKBuhr?^U41<`CJ3uki1`!Cy!{7snBYNL)ViB;lYHU$=*dEjj22uf%o5K{wm?vG(MlD`GY?kst?~9`47a_xucLWIn5o53wOlliD;lRghejr zXGf=TuzAqVjHNI}#*{I7{I4}igNfl9+~IKLT)LAniw5h-3Hg-DaYqWkm)INMPZ94+ z@9|2_fafyX(YLk3G#Zw?Wt;nPbynPPaV6S;eib}M;Y7{F(nK{edk+!^+FdXp3D&4opxs>{o&N){IywxyEgRbo)$ z*o0_g<>3{g*#&Bl)n#Jte8u+t(DR>$m#XjoxvLREP4MFkxYs?rcIfDw;}nQSiCQeG zgleSVICIZE{F9}6Dfu7g^0PV`N73er3q(XMp|NHYZYai`uiXt~8Z4N`Vnr=-RddlC zzJdo=d(iQ*yt-}ZRJ&bB&h=5*^VhMP3^n5 z3)|5D*to4I$^C^Z?2Z%xe)T2U)UFtKzjhUSG{yG3^!rkYS*~2hv`BWF$D~_dHf&vO zsp_BLO2_wJXI}U%ToifTHcsfK?8&w#~<0rKvWueDGYNg-c!fAt%R>IL=O@(&O$u_fYtgWesu< zFxiRUhR+S8X12ylk{#R+tC6d4+pyCTr48G-N^RS-ZQNe-247fvgW6vsd?{7HDPVFk ztsf^oK^e5e*e}{;%WlFW$~SIY!Y6n(-{KQLDOoQ~H~w)^Y|;~BBeIX`%86o-5P zHBsno;Xy?k{OOk!?S=)k+lbcnqDA@dIlcuXEbGc&y#cIs$>QiGacQg{*pb#)4ff=_ zhaAluY7TdB(=LjipkKThJ!(y{q6H}qkEXn=`c_%{*{fIiqLUILrEww9RnKUOgSbbo|M=>Aoj4e2Gr#eb&MGCUC)(|ET zTlB`(^SHvPeQ~0`{f9Mm1KEt#x7tAC0M1sX)Ul6iz8;k}q!XY^AH&r!ZnGs72O^G7 zAQfg_my08|GQf*Vg}rW6Z6T@A%@7+>ogs!x2w;HeDzCt%>Z~A|_;!)##3QoO#7(Tp z3DF;^$#PBBw10vJI3sKMe;>bH&9@E6P79^3T~H=s$?gBcaNM6foGyPj8U&DqVW^K5OcsN2CpFz+3j zt9DkaCB3s=oZmR4>DuAtqU{%73Ra7T-&!XnvvyQg4XfS&xwIe}yBCV9RYg|RdZA?P z6+P1|*}WCjS?OA;+}yaVg06SW0&&}=QfcjdZow-q`WstTwNPp;sH&{YuZinc6ewfk zuK6JiX>ZsY2E&jJ;5CHzH%8+>-#W&B{^hY_8y||!BYA_hUP4@rLL+y`3hf|07@hQh zMdk4nsdWQOw7W)a&Z(HCpjdZ{&AwjHP1`Ekj@8_5RjP%#h2lc1R1KFJD~;xM^A8HT zQ!E=nF|G%~;!joZnXqOl4oLJbs4|aYfP=yx9rEM?xX>coQ2||wA2WD<+@K(JOIEdJ z6r%F(o!VN-uNAPKtml>dpjIlnwoxS&yLbWMqYP5AU{K4fhhA;2P_4AKn*ikMUZ-3M zT62q`rYfp#C^GPG(W#TF8$Jb~Q-(wa{v)gd@GST_a}MqZ^7`7=TK&#I-aJyTADPR6 zHtoT&0;78htN09$ox&o+tjsX{3mD*0y_;SaKL}aI980O=cWv?-IB4~P(MyM0*eayE zd`VVy%U|(9G0TT*b22exOaH!Z$p(?bXZu}2!VkF_iw6jIG&<_COv@u~H z{@++!DHH%HMOR6ouy}T{0M3r7XvY+VOcLNQQFI5$<6Hn5kWPolDz$4)`&7{|2{HaZ zaGFe`c^gWYny7Lx^(2oQnjI) zHm?Wxm&Am*Tn0~(Nk`_PV09+Uc3dZI8ZaNHNf;F(ui&&$6A;yNys5i}iQ&`v-aNecVG&EnG+wT)7-4nJv5tj%+s(^;oIQ$4L6m9gDhl+g z*pCIxdc^__!0MDEoNEAQ4|`STLb{Ev*cMCX)OkZv9_`r|ftz7B43-vjOS8JJ7W8T# z02q~p&AMLd7@BDw+Gt+3i&Ib{^=dDCxj3i!e%&h^D{UOET|{zh?}f)KXRaC=E48os z&OSIIPyQ9_wPS;vXt5gh(y$63_m0dKf3E zykyiC%4M=(g2QgB205l%^QDC@)fK~a;P?DKpMPiJkfEuM&8gs@!!18k28?O(Zc?2u zsX?Q7WcJ62-#*9eK&gzaw7j$c71i1BCAFDh>R^6tKQ?G?5>S-Heip6HrO@EqwX@Y7=L2JQoip{NgY6ZK*29<1J%^dXQFSdK-tFIyzZ#|Wz|<2MOP zQr^zC9UDs6B@it98wvpQ96q<51JE*7D|pT(+6%YI+89i{EUySt3vB1>*W()eJic>; z(Fx7-c3c+pNL+X%CRa)(wDyMm@V}59nLY&;7FbD7{T;-8$0sT5fiG+NuEc!hG zdZNPsIi59w8YD%9+stojFR^9BrJFiD&;eldOPpG)KIxnPhE?8}8wH9}ptRs9f$zNX zisRo(YwM=Z;vVUs9~E1Rzx)JY4t;>Lk`;_kDze?Y6yeXG0|;M=!T1cT!?FX9`zn7F zU>F1OzkU_({%SIZ(BATs71TkT5E&54Y=Pza{LXxR`D&!*pK7#Pji**|9T4Ou_5(Hm z^7{loa)=F^Xcv>XSkoq+Jq+SQud*!#E)KH{!i0@7mRv-k0@4O0%Z+epX?Lus}64Y!)VuQj)|s|hv*o#7#cH%_x^Bb$m5Q!7y4xrdP^kbqHXN^_{1dvbe_SJ$@qZf@(G1&o10@+82w?UZ z4c9=l3r13&R~5e7mlm|_4&;~%dIPoi(UAw13b%xCtJ2bM}= zeRl`w*2l<7c0cfG!h2Hic*77=Z`V;6f}vAoDWa@X;1CzUhrE+T#lr@Bf=9F@V}l8> z!EDdg%8H_coox5kd$yumirHLgnlgQ#0V6G|9c(kK*{S#QM+%k+G!>oVvWEe8ei^$F zhhbSWRlivD75Q=B0exk{ZJMo^MlBN?mk7CG z4`)k@HH+K<10AMB{>uIWNc;#d8lfu7U*M>D49~~G3{aHhZT>?4T{19#vE<>VZ-%l; ze<{W>!5NHP*)+rWLNh{@mss1|S7un^jir(zu7)PO?!n$u2YRflYe#N}wsG=02!`RjLFPLzltsH1xt8U+)|7mmg7OQ(sunO+b8I z;FD!V*U&;z3`%Uu8li%MrG^S8woDamI}?6-NHujZI*4wnq0qyO$8U}R&KFq^vsp2m z@reCSC{O`gf^LH42=CAfU>#QA&fX?|F4Cf%&jr;C(jP9kDOE7u( z4QXW>nV$EN7}c?Hud%L0)9XK^^|H3Xs*5Z8Z|?|WTjvGd;qW8L**lV|U@6GA#8mi^ z(6b;rK3&j2XZNj-7eg`-LCn6RR_GqYUYD3uze(gG{T*ND#rrZB8Rq2j_%1z#@~EKP$e>=^2X3;%0|?y^^x|HQ9A zvSKp+*r#k+Is`nh4L;pz>AZB0^nmoR^r-ZN^bVlhM}>VM0YHq3rRotNNRzeI zZU;joA#Q^JmoFS(QOC5rBIfA#gx~CbEs_7OXUVpU6e|>!=;fvs%GMW=Tp^O{GkDf0 zFEBDS7|D|JB_ZP@<w6;52nK^u1?4h9go0|jwyJm)?{6e$zpkjq z?>-LFNY;zpZhN(;%jCV`VNX7M-(lH1EHEM(_oj*46l{aVgiQ;>b@nPa(qLDq1xHqi zCOZZ7$w~>Wf>K3{necqyC22!C1sw7utH6)TN(uBmu!8u$Fx(}^GI(|dJYy$3ErYzE zDb~~b!2Vg~%=u%w?3l;z+A{$nZ}09sMPGe%Rj;m`Tq(3y+HXg+6(qp(Nm zsJq9Ou{Vki_=0Pq7qEEnqN2c1zuU0Agc!C+lmB_zILEpCTu&b2J<)~85yjSV7%S>x zPjOrf$EEO{C~283HRAiKFsAR-YQCaY767oy=XFE1dq;b?udiBf&IMLQvkMCqRrW(s zraWQECBGb6o)cOhgb9Gc5vBkrtPki`=y+CG_Dk}FoL>b?=iF>NCj;`ZmqAAWKUdIS z9)tcz16#UTM52DdbkKk=m>@$ip-dyP;nr>RfeHp#--@Dv&9A@(wOA>Fhh%Gp zWn82o)+e4bs1?#1?bC<7;@X)Dr&bH)uvD?Drt5%%tQjj@^}S7I>-*?FTdoF}Y2XCI z4K{^qvaTrx9NJH5mTFp-samF{Z5vv}E&6`Zt!M_L;}0S_E`Zd(!1~Luu249y<r&X+Fgor08&1{jVH9dG>yt&RU=^)V?9Gv(e|5{ z)-WnLZu{YS)27a)Aovo|eB&XCs`z1$wE-1PHvt&H_dSZ@tZl7<8Eubr7yjv9_O#yn%jXVvqYTxc7LLeVyhp zxnwx8!m_X5vU>n)`f{|T^WO2q_AI?tv9rb$dhMVCfRWCvL`}?cS7N(gv2-Oe`#&^= zeivj=^reyqOi`&;D~i!deU)s!FyGCPsmGU;F3a;$LjKuycLso>V-i6qYTGdwRRWWL z3`$LaG4ZD|mO)PhndU-zz;Qo-KSk=fEbz%m3{GUZA>z=E&davBO>MJc+D6~BL0JR^ z!>tlCFi6!k3W2gVjv1vX2ES{%wjslhVY_C{@hh&Xx)t9!l|f4(8Qw1fPuZD?2j8Y&;{r+Dt3D; zDLkc3{wSC2P@sZ=t-tF?ol<7>8@f_zf?WwzsW_^>p{XK~@|ofZHKmDHD050ZnBkN) zRZnQ73g=^UYnAO=%hjP6-^~aY^rSGUB)STx@^YRo%?aK;#}pLzab#+siJsvm4)al& z>mn{QJXJo4>wVn1rmD;rRVVe*eQ#Ya?KI`B({l2`9jm7$?rwnF7JD0arm4`C(KM5A z-%O!GY>om~WBo4di*XmLQ-caBq`hEBhv6{9Ky?Vb*a-kt+RHAVv0Pyc%tpn{Sipi3 zrBe8Ap`v{G#tZNNR2Wj%*FI*K$%@nN7U>b8%oM1cKxHkM44q;G;olaD#lkc9eE$3s zBiB`(<&x(*fA2ZZH#PRHw`O6-`r=;1q>K1lvh#%#Q%7^^C{b>J}zF_c4D0K!t$Krs$9X734+0CWkF zU({9ER>S`UW0sHFos8K8c6Tynxkyfq*|S)awG47S1Tojv1}(xcWDW3oG#r3#WI6#A zK--NIzfdvs2kB0wC<`C!m2C|JJx!zsH=YKSExx0u>%x$J8OHX_|M)`bQ)=1zG0k^r zc;f|H>@Ayc>R|0eYCE7vO+t#QLF)mj&bx(xxCZq}qrI{~8p{t>scI7n1N}^)_}_f~ zE_-A-u2))iRF^z=mtqvp_*JUwy6aeuM>T6zQ40mRRG+UYHP=>LWvQtyw3ljz>bVrl zQz!c};<10f^pRvQZQNlQ2mtJyZqD+^DLLj2I#!(n$uK}N^b$Ix8_3%0ajqW*4Ei9h z2irX1ZW)^h`J5@JC4ZoPoozh%rKec4_v;^X{pAK(SZOziPYsw?1$Vwmf;#AyBBsD1 z;V2fEbb7W*tKep_Zs5QrhJMa_DVZ-Tus(jRVw9-_ntJm!||St(d==& zF$1Rq4BCUUk;@ySy*nHuD(=EN;P715)VP_!fd-}+g^VZ1;-0_8SY#kS@GuCl-`M~Z z)3`Uyq5H0M{s5HEb}otcmkOKNgIPl$=)-w2pJ4hR2&(W>T&iC?sp_n}PqIHN9ghpr zBX=qd_r+-T&|I8?(*XwOOEZxZ))e?SRk4Q8YWuh$*+0yGiQ5J6%HJwnXYa(UGx zKS?f*$P)|xGiuqs4X`}pFIab(WOVVoIaiS#x7BhTxiZJVJ0_Q1({#)7Hj(?EU-us< zS9UFj5XaiBl2*73hw&_*zl6IBtdj6BGgK;a0B5eB0>^dtWn4 z<`vWabglMj+pIkQJORrjaK7sVZ+;uztf=Zqtz_vBxb6eGRnktKJ{dgr82B$sCr?YP zA93_N?0J2J(@J_Vdr*_%i1Z08c=$zlA*i{I$+ij0|1vxbHIWsRB1FSMMKHHuhG$5?3j4NX0V8&{A!k4zV}~v)ky%VexMXTtxpZ$B-ph9G|9%PdQC4#O zbe2H~MadVK;>eqUhD>7Hhh6vZdvU+aGd6OIRuiy%MqnKtryj!@qbqks8kymimc-e> z{p)Sc$DZ7yF+&CH>^FC$7-ullwrSRMc1&Isr3!+Rgx$+b)Gzf<1U2+Q$8(s z+n^U|cL#K#E6*COcNAFl{JABpa{sKe9z zW3+SPDZJ(>_8UYTr#|m%@SRV-`$=7Y&(sHhMAz{SPyb8`0mpHkAe{${yDHUwQ+Abg zo{|v2WQTLg875}Bq$<)^Rb5jTj?I(i)`|Y2jH9n~PF^^^EVuSfDO6Y9$+}65c-l!F z4)S9E1aRa0u?1Dr)#bgGynOt^$&{U%V+)COn`T^Xr5s0&t$hPt!G_a;NboDwsqOZse{D#ay zOWrKyUHpI2;_scfle&@A^rgIiR3t}RtnmXJ5m8=98R?@hV{eEaTMB30c5t6P)>-R% zthfx-t32^wxU->$?kC((_hgNlvQ8`jzN_eKr`Ool3ezIGY*J1Bl0x=~EQb!!KH8zCTWGXSy?+-uCub;ZCZi(tF;VAm9;q{pOn>AMV3$COI%+J@F@a5 z@53G#4y^_x7{42WPg1yB$;XE>0zjHb#|p!6$8M zS+s5I3SHC;+b4=rv<+>MD!MJDb*+cPqYJ_1R=Nr>d&1Qgc^TOa=a{H(9Z3)38TTMXyWvb(i4Y z|GsGX)|oS#n~9#8V>#{fAYu1SGbD$oq2h#!y}AOqfb1EhdZznbU1jOCMHZV}tv3e$*n<+=2*6_AL1NJD_9G%jG}|jBX02ko@{pI(*0YC`cYMRRDu7|$9n}RNcdm%S8U3}_IYYwv11{o3eS%DWjpKxyLhC%)b4f9$m77|ljX~Vkk8_Nz&GE-<7X@5 z(EZv3iFCN{4~b0R{~uZcpdknTlPVHPJul4HSEcWQWzFVmE)WyLkSih6{ttD~oKjJ! z^qDe58?9<)k%Qwf0Ef$~cA4Jxs~x|3`#LyhsKD@2hh43DUEoaHxQ?YtGd(8eb2z*Y zsuX?$_}!??&sSc@!{5Ac>C%OB=g3<09uD6OZUjdvqD;5p`>;}r@D2M}_b>79eS7kt z@A=N_s9E9gF7|+%=@U1i4}2%parj*H@V43RD_&nScbSW(mPNal*;kfmMbMBp!PVlM zlarHOZU$g^qf`z4!&K|t#*aFB`gi&zZX~=e=x`wyHDYyzVQT~{c(_rU0Unn^R+s?ipM)$)ZT|024fJLN+xcg?<)7Rx;j}?B7YwKc)JhRFkP6*u8-r`1JVg!tLWt zcDYyZZO4ou{$~jerephs9{c(s{)yZh;1_%f{!+jJ`K2$t9cxoEa;K%`!ks<`A8|s^ zDP}YRdWdNVSg^u$9Krq;T#3d77kw}Q2iSeTQZ&_={)4((sx;=RLD5wm&#E)vJr0@2 z!1NKm$25)I5LD+H<+3|QiPr)8r%Rz@BqQYNt{oHut>l^Y^jqwnpML*4RgK*cu$wdV z`7NYIqIZA~m!&=FJjUTWVwF9b9oUF9I|6?StT~Lgf@EeBSc|Yb3T1MWy2f$u`JTWc4N{+r+4#7vXRaJl!43^?2#T=MXQk&ilt_dX&2(< zynbd$4@35}{e8VmPq0!C!53s7bLjkKRsKSit+Sn=^!wLq*K1^v;!TRBR=*&t%RVN{ z`SKS6w!n9Smi1e3S0V@g7mx#6Y(8Nby=C0Jhe^S4y>;Bi675;TA~BIPW4nEqleTvw z@Hkk7{&U7sdrr1d64^?7Z2?ry!dhG57v#D2l3_Pr;_30X_>1lPv|a*fSDjZEt7sQg z7u9)iA+=JS`o7(bYTsjDqbQ!&X8S?OGB52EGCvOU_F5$1YKgXk({kj)EFE9z^_p{5 z!7dk^!?e9}eCf-p7gpha=j>tq{cB5&7LhvzyRr6u{qR{S?xPs*_wE2~&PWePkAWZg z0;@ycr5GWGc^ZTjx^o8C4}cA;0UlboS^_7_JpiLRtPXK%ZVzB|o4D3D#Nx4V+(7y! zJMP1&p3yC@;F)t~I9Dza(pt3CdPy;>hOE1O%PCff(>_c#Yxz5xZoq1Dk&KVAMF3B<}(V*)%?W&D?<>yPfcc==!B%SX#ln}?5Yj$M0 zM5}PmO4X{HG`?w`+ZI=HJuzYZ$&F?%o2H$# zz(7&YY1T>2x_u*QlDMKMN7}lkY$z7|YI^$!94_gZT#o=oaDY2&Slw%844gsD%)Pzw z(ps4;$DP5ivL{;6^Z!k{04>_Ezn4B)OX0aIS&F`qG_Fi*${}wpkMCXzbI2f8UMY)Y zuu=;DULFy&%wDPbY!AGbKL%5>=dwLeJCZk+k_ zgTnVdntdDP;cSp~X&tPlv#77w+97KI!OG0F2rCkW8mii7-6@dA!YW@w?QMg7#dKDC z8SY>jp4I>54JA;mkwdCyl*9SCX1`o4Dx@0V<_ftS7?xK&w7MY6ZcS62T3OZA|7&|t zt@c)2TmH|who~8v%`>|@>qn{Km5$BVY93iuH9|Da@zxgVTP2IittHIGR9j7z80D=6 zaQ|JED1~}xf;;m2_iTjWMv?wRvt(JJrJkAJI&#vjgyG!bf~_gBzLtI;N9T#&n9oD-Cc4!zKABi1efKl3VaeV_|{ReslSSLM2=ZuPVym z4C;q714X$SE>)CDL2t+pEkBml_(Nae5InD)Z4^n9{Q~h43NEMsCksO28C9!d$f5)I zcCg!aRTEv}OPYFbfO@nm%Ux8I!M&;`)NjU05W7)@{k$hlw1gcCH{6(f{Jlb#*F-qH zo(IRJ6wb2Hr8Y~K-XvWR#%{czn`Y_{1hTwm94aG2mQPQ>qN$RUM;CZtWTf!LE3{mI z6Mk59$sM29r_n_f=&}eh?`#gwjE5X)ejJIvcS&0y+92xe2=gy(6FExzkBSuh_ElEz z7Y`X749;RUL_apPg6u52zaX0Oa`br+nM=6vd zh3g!cHeCwN3J8Yrkw|uJ1#Bgr4#0DNpTD5g6x;hiO7$1Kc@O^I zw+9zO=hIECTG%Kwwf`vvtiu-YtC>xHV;wCoFB!5!Lf zOkv(sUz-eKsT_5R#!_rafUd{O+OlPY5j^pB5Zq=V`UbCP%Z|W?*I)Lkw>xa@rK=~k z*F>9O5%<8N-Mqv)oh&VPqeY!$f?!$Su$?@*9R+{}@pG`cEzXWIL%3XxPD+dvmwER1 zzd%rMS@2~B5bKAdm&ZPq>|dH9uSGD;bn_mdJTDmYk)qXHoZm{%S= zO$0)GRI#yKGCFo$MR^K-yXXmG0p-lX?+4Hsg!^KFn@C-_(^9f>vlY#iaVR49v=T>3 zCi=g(vukaCGYebh-EX8lx^E=}{2#`E%)b3Ve#iDKJ&$01=L9|DIA&bvJ1JhhRTYaI z3UqyR0h7xXKq>MxdpKDi;U$!YB4IB!^z~yr4Cb?Ho(U}&N{LQ6}2aT$&@Ua z=#oB8UC^K7FdhLp9l>}mkG{7txgZPewWzkqe>sJ?;@k-*c@?YE(*bUP#Et=z#?e;w z*WVq}lxP=pb+?0ZV!Gw=>xOoZcD}o7-+gZt6Nowr-l!|pdjV)E+ZSX7SLBCrMcjy^b!CE3>b+UH7lIEwjMjNik%`A2h*()brVxu+8}|m$Bxj;1 z_*fpXv<$7#lDuy^y}~hzt+$`WmP1G@vD`E=+jL9l`de3cN50sAixQsH4qoo?ywMa7 zpV=6vabN8)n;s&?xj@kAO*mrm5*>~$qXQkal@6U?epj}+IT!iX_}??ZY0GY2OkIP>7VD=d+?$0 zb}+CSU24BFX7!~uUzx=nqz(|I&2^8?pM8Ra>2v$BnI{53Xt`?_FEiur^7%4@fLnWi zn!@qz#~=5dPHgHiD44-FN(|7fjGXXXg*i`?vH(o6qUZ=X^JOi zTRtE?8(F47JKn;CwS}^Mk9Lx_M^sEpU_?2HNfsd`Q#%Kzb16Yy%^%ELIMxwrSdB9W zvqnmli}?ebmFHVCW>v`c(g`K@mwAo-Tmg3Xp+f)#Q4SxL0kq_es^*BV?PJFjjVfDx zg=z{v?{BG=EWn0Un{ltQ=)s0nma#KDn7{C%Vyo&HH0;gQeB%CwDqCt6BzFGvlzAd& z=$P0A)kMm2>wud9Bodrx3~<%|>ycPQ^*=Tyn={6wAGX)!BdlpQm;@M-!*1*}&whUF zMPkaD?P{96ZEKoqYqFUm&bqd#ypyWLvWQCGshC+Fsq>ET!#3@omKlYyzZRyM_klOU z{%{|)@_RWz?B!{ZTN7}c&(j>De5wGKv~k5UrhQcSLdUMTv2hkx(rTsLF%0>j^!1{) zvZNKX0UMW#ysX)=a}2z@kMVJOe_tnbtD+EX@H>38%DimUp>u~3KK-r*kzNMt9+|FM zh8gm(MXMpRkXZF3CJ>{-Tfdl4LJBcV0?%a7^f+hJTZd&L*LGE+ z^ezK=GJXvO9$E!!=|YrQwm@QG6-G2TL#Ekq!Pt&twjzLuXx$QajzzhG{aa7vxNC-0 zw0G^IWd@5?R@}T?!>Z*+WmT2`aGdRqR}{xMis=?d4M(YXRiWk|;t+tncT_ro9dU-a zFj3aXc^UUXFjh;79_{CtiD2$^0W%S?znw1|UY&r}E0^JuK11#(pqVcvRAEf&V2KUV z5t*h#XN#WeA~rM3`xR2KbsVyys(IfcL%h=DQP4? z8^BlKxfcAhZT4aywwOi%hi;P0m>$mOkM1|{vl$rM@X>u)WIK5SpVf!$S^9A10G^v% z08U2ciO9oEpM|+YYl*cR)uG-;zg-qA@I1A4og3Rv=j*a8o=0Z*)&Y%b)%01NTEm8EkV;k^SnoUhb)^yW$>l(dF z23|2`qL?d$R1Bk{Vh3dSX7U_`DQ6Kv=%>f6!+)r&dbJ3X$0fRDgY+SuUva5rDT->F zwL%c6o?!`eL!bXX=`rbP=|`mx;SSB&V~6!7crwd6;q3$}m=_naqMa^jW3x#{nIUU8 z8T5HpXSc_iD)YQBxMznYJi-lx<`4g~8d%j@-38A_mlc!R*oeWfojUk5AZLuSQ7)Mk zLj$6ix=dgU+NPyp6JAwUkp6`=h2SvAayN%@{#*tE8lD;iPTjOs1uRJFR(ubvN!7M= z;#sop)>XL+!(jr=O}(iQ!>~%40#+1^iF}?K02u)bbaMS+k?kdzHapWb)WpUVa$fT$ zDsQRDX`||<)PijJ8hryk->Jg@Vu+nTOZ6tZ+Iwt{x&y4V{iXV8T-U61#HeVv0b zHeW?}R2aCpji^BMUl-ue{*N5La+b{QCRuC4Jef@_?Yyd<*I+hG5Mx)k+TDR3r3rTTwOOtv51L~2{ewqz4W4AnhZOyb2Z$f_XW1sx$P9{!E$+gx*nSShE^Xk`HgL4 zo%VoHXsWgYqa7wg+W+_~VOS`apPkTL03pGhtl)SwgRAGt^X0FPYoM}iTw}>a%_B_# z7GJ7KT^?r|dsYwuw;zXH7oW}GdsiOuz9BsSB0_jMpS^?_6PMX&JKsNJRwlb>!eM5C zV26%z-wYdb!*C4v@7LS1vVy@!-Sa9@91?qpBjCHa7U-Iee`vIeZJCrs?j*tARqB>IopLur(>mCgE4-t7 zo~6WNZFJBN@Y!sgx6eA3!}G^2om-$ZuECSRq20R+%&C~~A#$8v)Ap-xEoYjJhS5%Fdnz~o; zap#9u*i$u=XdgR9NR22pLVkO4Azj66!YVJ=|^~ptYZ3z7#|01&aakBPhYoiZGk9v~VjQR&sBG-a~mxJjFwi0>EX1 z^^Fgv(>~?EmOUq$4{LjXq~V~hvp$$rY0_{l8Z z1h9YycXzMvPUX)I=TP{`uFG+~eT;Q1m`0(rD{VWIAQcK9kkgmBUjL&ApV!WHrrVUWqRb&{TEy0pF-+sKT8xyxbaU4SM&&ZmbdA6Z1wXP8 zzrmM=Y~+M$b|1cgy}T|wtg13qui*JT_u%o0P89*xmUNU!uXV!u-e9krkiYD#V|%(D z-*>&=)W1w@L(YQ5`ew&)zcR&A*Hl9nfm5lhsuAeJgT%pR#azNnUL~Cw$KM2R9MczA zDqIk-{H|(l4F43|iHQ&a%TKFf^ggJv%uZ?lIG9i~Y(J8Ib`lezv}-|CbEBdGOC|lU#+qA#dyVFLXgE% zJB95Af95D1q~B&V=qaXhXjP{2;i#|NGh;OXZ}b$R?$%@?A0Au#LErfFL8JP(iy|+k z8%&1tuL%3)#7OQf0LLiR;~+Qr7b&Dy0@*Q-+J%CB)O6$krHPcW2b#(LxOhuc$V16N zwnQ||-~b@*yA9C*Yh@iBSTh3kQB}aDo4ZvL&?r;8$Kb38kQe0$wWIP^^4U`5V@+4&Uxxnv7g$HUc?1$Sg&}NHq_{tNe-%3Nwz)Kh0b=L+ixe z<#=rVVd>IAWAmZ|DwY;Hh*^+>D8AX9L{Yt&XBvDvMK2FwcIEykB+pTOHQz!Ib=7>H zuF4&#mvXmay%Mc*iZS@cL=1jEUKV2TjXWl1OOTp2WqynJOhm1aS0^Ly0$%lvDB^DF z4I$zV&v6>~y03na=Ed4s^aJL>0?9sLxF5Q|W4h@>-;sy#zn5(@^YpV*W^1|* zYJnHrWV?FanT@nB(;XgaujYr^GbT=$gxLEB4zX+Mlo)$zE|m`yTz@}yhsWT$u|h1% zq!mTOa4~!txkOEBVsu@9DmA?RP*=3Ds40%C*_NiO#4A=@-Lhp_bkLO-|Tl%bj zHbu6GxJ_g>&EDZVdsnZB^Oejec&~u>eB?LIsPK0n)tmW#W#N-~>h;zHnD5(nf3C;J zWtIjVk9-T1`MYWU;bg=cNV6LU5>?cHco1zf)U!uf-lwQ(gF9WY7zxRb2^gI`0)3A! zdM`z=XzI83r4MEMOvOldR@qF6aHo3XJ~6!f3I>jErs97j2DLMGEA9*3!d2Jue(2L~ zLcEBL!-%oEc{KP00U^Xf-Pj8Sfh~l*=;j0+MurV=v8ci|1YFA09zmHonA{Py{T3qH z0!O`gr;%*nvbRMsY`-nbB{sO0W1q^{ky3W=XPw#2=h>R-bZFnIseC;T2QhFR;c+Ez zeEw*EWTqI!l4vKGQURZ{W`rzxwKK z;CFW62g&`w2-I1()GhB;{qAnbua4l27&r8#Ik4ZBfiI3p+nAFv$-6NW?b%=moZB_* zTP%zXKUWO7khdzuV$`L1y@CWq&rQLGO zi=%vo+>KchevmKi9KJlt`0}K5R=WF6xpNFmjCJFulbnjsvCzz3%kT&uAv zPUo-(U2epiN8*JKgdGD1VC)#mYXa;Cm9MvFA#r00gNt@#Uge#AqTmAIzj)B-H_-c; zhwsMV@!b!zRu5Ox(DGI6HJ{2htWI<;jZI7kWIv1h88wY^=fOwRLY^i5Eutz@K~?o9 z_FwbJ^S-7=yaj4r*)P%!&-@6xqGsaG_*YpUaGpiiq#>{Dl=t9$*MvW!MBh9f>CSau zep^xU08@+~o8rre>#sHN8Sg=D7RP?a&C-DCRbJQzcdJI*(uT2A>!-nB_=f(?5~0N+ zeLOW<&qNVnwS*C279%bv5nwou1-8+Yy*VDkw%-*8xXY!|L_B)~^9N_fv*rEd0O;w7 z==L=+p3R}}aO{ZSGQID7JPO8cg4Xna_9t_tLK4{?^PyY&ugc`Ep-fr!h?T_vv+%X&yWaU#hH7^6QonJ=IDc%D@4KjW_a4yFf{q=d+r)`23)o zU^qzXBf^NJ4IjY3x5#B49`gSN+aN=CwU%0o53?)rv%Gm^UC>{p@s`ztV`8toH!u{F|eksPKW)l z-)qxh*dB($Ip!Z=tRgOCQj-s(sx++s!H$2<4JyTVvje!I0M5QtsooY5uMXy=ka6YoFqP&Sg zKM!MtwgH3oh72gc{6G}0ToIA@ySfL!`MP2f^Q=1o;G5qok49y?**rQL34R6caM%W) z{UPaT={>V3u0%zO+k?|`4_Sj*B`)cqNyTjvF!jRzkclJOhU>#VuQ7}hd$_~+3C*u@ z>c7@999=b3MOTSqwY-9+D^#^y6<$pH94T5Q0!A+hyeFD)r|uY@*OMuA995r0^IMwf z7#hJHI;LgoR8xp8>xOP`t*&m3HaF2wb8T8bqNqBZQ`mfncyC_1pY3g$H45E9AD3E@ z7T7IJj+$#Azrk&oLfe!he(Z@n>dILb4Fk@iNQ}`)B*%-gOH>(*7qDn--BhVlbSNVR zCAw-;Q!@&t?$Cj(8o+QKm;({lQcE?6r|PCLNfzu5AJ2_`oZs227=b)u@v* z5lIcz))`I91AiZuC@B$E4 zlR>=&)Y5?KWt%Fh$>^7bmIR~sa`A={r?oST^gM@k+_CBspmL2=M~@r z>!eQ{`@@9yw#Rr6zB}T*VV?r~f!-Mc5B4)<%GOw~ zBX;npSN4E}6_0*y-T`8Iwrp7%mP0o`p%^F=67DM%xCx-VvskMYed7CJSn|lXuU$*o z?=LJJr=rfu>07{AF&X{A$SBr|=9w+vPu;NfnOu0d)19C1cIKtYJrL*inZs!Z!~T%z z-H`T~trH6Uk0z(&=ayQnrDMnL@qOZz!Vq5kVr>ns!1c*__OB~;#Tkv}=R4iGxlY{~ zITd?M-duoje{43abbDQnhfijmTrj1zpYp&CjJ}LDOoCwoJA%HuD}w$p7079MR5cu5 zvsJn2tJE?T7%EMb$szBEcWkLSfx};b;8#uGv}nPE@wPPGvo%hA%d&~0$%E0T*&I26 zgX=XBUS*I57kH1JJbtEn80>F{_M(j)Xc~#562jFCtI7(QW{G~(Yk6Ml$nxgq^5WtN zS7gK4wx>T@S^~UI7e-FmUIODUS&!m#w#DksotlE52swAlf=M$kVEdK?Jbr`$yXOUa z6;d)|^X*3$H#`yU?~E1~N3B-j^yxz3bZnkE&M02@E;0DJ;2UG)wJ_MRF+v>X&6#R&3349nI437i{P=pmTguEIuY&%S`@%4cw+^MAx?a zg@UTvk$v3+g|Zu+N3<5^$dl5$r59(<5>N(hHc@mz%rW+om)GTpyFgUJ9O8eEVWJ-9 zLF0ZMu6Ho=nSFmXn4J2GOgu%^fYU%IQq@~fsqGaEU^I|p#&0U1K^@oAY(;*!>3PiL z1~m#sjzj6hwEA}{m?2~X$evAl>cCavus6U;gXQyU^{8=M0j6r`zvv;ZQV6uIQB zTGtxTT-J2G-**ZMV{vYGR2ZM1lP-b>_EG7j>0JKTzSX9@IbM&p9A1&!+(HMg+jI!l>3^i~MBoEk4$WV@K2#dNRN*cxrY|H!`120RImRXa>Al48dmYE7U9$bRlkqo|rgR=nroKM)$_EcDl~W~( zWd%nE#$-Yw-II&ncQT_>PK1%ESyU-Sh>hcQisb>n1-!y2n*lfL&rovv;C7L@Y>g(H zdwhjmFBFtXEtf@Z7aTZrC6%&r4^JiRIC!_-6)^xDDrWOK8gj^E69 zI$s^9L5D0kF8toPlVfrT6S*~e{XS08yfMC)^|!rq-krkH+#^50@D9c=Y=d*YFXLu} z47%w_PMROB9UKPh>>P0JlT+3Y^7(NJn!1O9UYt|bSjRFkNT6bF=*R-)$=WS7dyZjF~860dn41YMP?)D z`0+K&t+f8t6rP{L4&1|tA_|u-WrBuH#7i9YJ+F>F(bNviYFvmVKKP z3I$^O6}ONxF&m9?dGx@70?6nqH5lTc*)+CCL--kOOJjO+mGx(Mkgr-O%M^PL`ScISYQ_gVM*PU!AsQ z((5Zp`LtpW~6@+M_R%BgZ+m3k?BkS8?#4V$0`*t^zON6 z?5TodZ)iM34c8`O)OWrFH#;++dk~#*K$gg^2k#@nrmTwQPQjrN%a{~k|L8yy2Z;A6 zW+=baHQ>9@SZ09%7Tp7LVi*D=u8hZe|>UYo)k+x)>S=q;`&>|us2}N9qTLt z?9A4L!zgewmX2d6ELN{s8e=vMgUSW3kcriQ1jM<)VyPaCv$m`nwgG6Xt|^0Gq>fta z-dnUR8ZJx$WG>UUOv^W9;}9C%1RQ%y16FegsEWc!T;E0dJt+Oy4~cphFWLkWRfG1r zvY$)xmWX#B%VsFP1RN);x@?$=34WospcsIep;8Yfd(N`Qfyft(PMj$0=dB2~56?YA zuX^8ANJJm!P?)R%&vKr>1pY<2jb0don{f(Xb7@-iJMr#WgiIm(=)jTqGvh=36Sk_(G!vmPI|%dJfP4O zixUna-!r=&y(tZN+W77C_EX?)e01>rtia4QLNW!L>8PSAT9 zUt|+oK-q)Fj}u#1MoW^|vI9S(!5}+v)l44clh|EiKh0e^m_^mgrnRuOuE}Y;CwnS0 zv~+Ezp|zJ`zR{w){+4w)awp8&`sq<($MT#7jFUVny=%%y-@yt&W+8;>>l3nYX)`n8 ztweA|+9%gTxR?o|Y=fr$86If#xEK@J;9zS3k??945;3L<^EAmWneJI>S*ayZh@{ni!xRAljQeY;<$HMyJ z;zlD2T!F!MlpK{j;HVI0RZG}|Hw2A+Mv{uWZ+lSWo!bZHXd9any;9+IIQAZ2ZLn=I z2mj6Q8}{hNjT^6b;-A~eS%=i)Tk!TPS8iM(dZ)A7DdX<8GTsUYw%cv5Blb6SSe?`@ zNs5@Avv*vC9T`8&Y#s%9Hs!Ls<-&x$rwjRk=T2Y9C1z?o3JU_)V8>_#+zMJ9j;)0MF|A zy{>APqY}3#GY`&rUI*9X+<12g-+C17RuSJ2swWR*&x#MPM^Bydz?5J3-pHM3zfHO^ zs2vw=nq---hWVQ6(gxFrX>WryqFh zI1X(FsC@Q8TnLS~vfgIq+{kBmIo@E7Cuf{zvIwNq;K+2jWB( z$8_A-h&30Hez^4&S08m`XI5mRLa`kAU}q4*_4Hnt29)oK?BcGt9`2Bg{%oD-tcoN2 z0nPjYenTa>0MiBj3a+_WWQ+X;wpZa5*Vy28d);liRn_?)b=ltx*`J7jz{8n489#iP z0=x(ud}VYI`?iSCvTqP!Lty?kkkhKOeVTPkTdLxcCm3HgmYa~z;fFOs4TaQ90^V{?;MWuVOO5lpOEAFm$96*%ETe)QcSx*Rsqd}%z~w|usqgjT*pLX5t!&kYrAPVbpmFr zMvI5%RbpDzVr5~wRa;c4Lv#(OQE?Sn^$lyWzP>m&zdUDoh9ZYMhqTZI3!&()*B968 z<@s8{Efz3>?JR_H$?_c<7HZ7*B+1^u0lcD^qrH&o?PY*>6DC6&iy3j2F7k?nL#!}X z4L7S{wT~IynjsAl4jPH;v)~OFV-A-eTF}7tP{=Qy_9?aH;$sDexVniNwJ==|^T8~A%B^wn?hmy4rFM;?uO9h{IZV1)bs=kDFZB)P8pu)1|`y`SCHRn;#yt zu6Lbt?(3X;&-tAIbjwbGxCFh7lagpD2-buhewVbDa+ns-x8q8JQ`Vvx7oeAZ<4*<6 z*MJbJFsQabIx(3dPf|uWS9KtrGq4v3eu%cSo6yf6tY2fwIov;|us>yVQceyY6wJK( zy>omg(@9o1PqPBEI24Gr*+>tBw=|@=$Eg=V!DuRg>in(bgZS}($Z;fqB;C4dB1M7+ zoAYzg)Nvkq+tSbP7V&9UIEH*5^^M?W<){id_A!xZA!@mPLjwE;L#=`FEYM{6y23kc z`=n%_R?<8!+q|K=eEuHomSfUDdZ+XO=~L2k(l1EACjGATN7A23|GV_p1mqhautAK2 zHfFY0HNFsuS}k^r?G8d5bohvjV`(2Xzdi=2#n3B8aZ?RJBpBI$O5SLrf9Dp4^mjQL zX1vx#)NdGFWdvN=?1;;F%(Z)H?pxUzHG<)LmB5aNZxblHVqe~B$9zGQpTIt%1KqNW zzwo8D+F#=|;DIn4;w?Pi#arcQi>C%mk4YzmdiyX7qJSAu#Uxe$L%V6)rpkBCN@QH` z;*xHGwGE@H4kcrKOe;kprD0UkFx4pmdq272Tklt)m}Clyp$^4pm=l`EpbH~%$+sC} zzojzG)3SRS!&etjE7eP-2}&nQrT>{Jng%K+m7(BO&1*B;FUbVToKoF1l>e47O)p%( zi+K*bB)w@~pb?Yk#@QUXNG)AUiP1G{PcRC$1~PhH2mvmk5VVC6;yOTFHK%QFn6~?e zul@*XTB&@`flR293&kIi=r4_2Zw-s|tbl1w*5sEt-Z=W=-6OqSdNR=g5??f7bcVw4 z?4b%!0hOiQ)Y=^ZSi7}>V2#4h07fn?TJLl8LV;bVR$@M+38>E~7T8yyFH~BU^zTT% zd!GwExb3@*)rRMJn&KF7qY)d9dQW;9v=UEMv-4e$t8ZDO?-9FKWvaR={3&qv=lx|L zv^jW%u4w7WSW&+p&cpDD=h-QImv0G-Dd{z^N_MzRo|Zl;eO~&q^fitXiVYG5>Ma36 zTtUoB7sqFg^ob1^6(r~axgr(u4DP6@chpehIN1m_0fIY8cw=ofv3QcURR_1Ud%g*PZfpM|I(h zWtJ-j=;7fk`YITevI&~)F{o3h0gIOT6!UN~7W7QVF+owEQazn%j^ij)(`0rxuY*hj z{gJU#xMNzLxI|Si1RWd~l0D1Bx@VZjMd9p$u01`e>lCyRv<5*(p}Iaf4a%QP6;MM> zMO-2wzowXQPNDaMiUE2zvup#E@Hq{&Zo@%DP3G+~=6axnKn-EE%F{#|CbS;MG@gOF zPl&ie8T$Z{p~rxhK&Wo%%6wA9**G>K&4KQMcs4Ol<8q9rDDNiF5~0@XZ=vGChc6hk zc!{N%odk#oiXQv=b%W@#jXuI31~tpJ^namSN?DO(f8fC~C+sHcAuazw4vKN$1?Q^-|l?W_cEvIf?^)h4u4Phx_4nOi{8yMfh;=;Dd2J}C-OS}I^*bKV z3EE#|JV|9SSL7i)d@j8ipAv~BQ-0F2#@XstN_3cV#`6xf1^vfh;FmR_XYu}oqwMw) zI5$EwLK99zeTct{B)@8 zGpzDLTv90*07yW$zt8eKHS+muq`M}qOJ{gy`vb}940Do~OPm&$sNJ1HIsGr=2>tdj zS9!5GysT_uX@3YM_efeuUl`B8y9=x$>swe{pVLfJ`@N*B3gv?JYyjM4%?>H{NUOh* zloB!)wnW?Ht#JxF`xteu1Ckt>Y4h~3*+LD=sQ>VXIcJ~dO%~ejLp)niNL5`P%3}1d zL>sR8oBf3LGB)i6Y|*m(clM=668q9{eLKQ2yGQuS`0Ydzk*bKstF5 zK;!wWq6;Q6Vv`QYNQ4coWL8CbGrGW*k)~3d+pV~_#gU`2#fllMgfz@iBaBW#RH%*6 z8u<2x9T~0zR)cN;Ws{|ElqP{v-3YF#>|7MM-Uj*yDz@yK-!OgIR+R68O+p;g^KF~? z#uMc@EU*7wR zuM$HxgFuHN{XQ7L^&l{1+-ViCFpQzZt0N zK(#;pY5Sf&b8(o{f_nlUODo2#vh;0`#~R1#6EX+|U{#XFc;h76EogAz_=-!+SxTgD z5U>oNd4?&J+(*chpqVQ?QQklS4gDG1d*)k22IFu`WdRKNeL~45y64b7@MX%|l>6zh zdzhM!p(_c_keItjdj8y=h!Yk8|@JEOJA)1_D|3yUFsC zs($Lc6;6d#wx+Sd*EA3}_lKm9k6CdUhr`h+Kwb+(;>}!&ViKYw&|%;f-U{=aR$(@y z&ha>tbd&4RnS@#3C}Ed6j%I+CYaR2Vf?#wDL}lXS1Y@C(rz}fmd>A)z?%R*NV9(Sq z!H}t`>9U)8Rj~cQDW=)F1Kiy&Ew`O%C%f%!*fs`@cEwoIoIC6W|U4__O|n? zKY!EgU$LO*&AnGL;P9sp69QHD2?6_;Yq?&9c6&uykWON3V32dqdEXLnB~emrQ9e7D zrEQ9mDxa-XZi&0pbbSeikdmG1-pZ3;C?=Y??JIx4e{kuCpL~H7?u3fEEbh{kTzSWZ z7`*3OLvQs8FM%^f-hzy`oTMz7YN5or6B6g5qfL|j3^#JooJ^-1x1eRhXMLLwACD%~ zsz{SUzQNQa0V|#*(@fk)_*IqElw1tF0u-;ZZzMa}%kwv@`5J}~x>a1n1okk2u*c^{ zJMGQ7%C1tCK1{$&RJ2DZ;XO*5(s#atDkLC^^1*jfnzVQEuGYbC>xWp&`OzV_;CuL9|-(q-w#r7uW7EB%7>OMIS~`+}j( zB6ydRJ#jByC%WQBL-F(wVr$ zCvp4mycT!VR>*OUX_Jt*(l)UwCwsWO0PUmT1@x=`85CmS?Z$F}sb?VGpez0zc< zG}*+>v0AeRfA=Xv&pffR!!<$xKH!yW5}dXsv#0M(%gPXpTE^zjYf`zOK-1S^f!X%FjXlbemo! z_~}6Hc0cAdpIA8mM4!wsHjp*?O~zi3RmxUYwzq?y`I%s4CHM^dmyF%GhP#OvH$j>x zKGk%zNZ9COCm~m5TxRTRtGvdYB;V$W26u0|T`x@sBN>Ehb9%h8RyujsS#6sW@Q>8E zGZxoRHctEVvmwPS3{$8D;A3stT3ZRt^2vt-xW8jetO$Cge-HH9JahPPyE-XP%hw}! zFJG4VP<3&AX_AIVY9fI=eva={I}xc>nhSW-LbEccE!E_BVQqOzZYP=KSr^D|%M*(Q ze~Sre2D9hwmmkJefShEM6A&u`EmuLgOL7M4>ixd%&39K@j@ei}8r=W+uo)8gelrZ4 zMB|QQTvb1Ne{giQVLGkV?!2e_4-7)Mr^0Vc=}6?#I8ZKvrUT>vpE{WLr@6IIPBL6nI`ZsKh9+tv)8Q7e0He*|c$*(e|vV*(vMf z#`SAlFkRA1HqIy74Jfk%HionFei?V5bpBml~M3tTCJ`sV#Le-we+f$djlgBeZt?4`=z*{@kesQ4~}ipATNU z`w8;Ha25RGZy`5>Io@S|jVFbJVF^!#==g;QVjbc2wG|D5#*t=3{h11u&wQ7$ip40dwwcv4 zRTJ0dD6=Xm)0NmQo4PZ3_oSnnWjAK()k?D>muEY3aZ;!0(%)v7*-*w8K&P!km(TMc zs+1t6J}BQ73=amF$hrkeI!pbH6TWn*&MlENam~Kg_PSWy6Ec7D7C0rfBun2L!Erht zw!-~1~RY>QLkq+)R9ew(FhA$xfZL zbLaUssr3D-PtNxV{9N?ybI;oT#aAkmlNJ1@FiQ_~ix6y=D!*6>{nyy&b+Hq3x7QQ8i$bSZE8a~oQC+|ljQqZ*}K@jSl&Iy z)X$w)*bqPSy7e3q{~X`l&r}@)47T?aX6!vD{QO8Z_jFW}<~z7j6NARD!3GB$((i<5 z6*SQ;XcG@LT;ajxovjVhzO4A_WK*+EN}HNz$X3Zw=!~W@$9H5+2j#cq*RUO|ZhOf;$%sk()e3!nJmW}2+R9}JHKCAk}wB090BJ|meqpcG}#VSvE zm5(Eya1-l0X6xi`8C&Zy)cs=wy?#ZTh(fIr^~J<020Ki2rxm5<>P&{(>FbOcu4&5p zj30W?6flU%a>|{uV?zB^i0noFvpKXP~m_YANoNU1|gij1hBbXBKFX$ZLNM{H;N~ngH2jjw;Mv)k=Qz z6eOgxfS3$q^5P^>HAP-9+{#6!vx^n?cgYVR;?B8qj8XRf>Y8_s(sSNgaqiT{sP5r$ zJmOxO@Ci)lDjYUrJPa$nlN37->}1pyLR+Hc5J4{^h64U0G?7Bc$j`HyJLwTcgXXU> z%VIjgd1Kve)>!P$s0xrMQzcZCvM&7OnPRJ+qZky1;jIS-U5YYIV>2H11Ji@XQpnm&9#d&v&BXn#@pTf1B zlV~AvqX-vVBkpS^rYbb3Sjj4_ii2EHUVUyhVV!StIe=Jr!Qg(ov$je$p~ZCC@Tz2u zSG+fwyF+hRG=9HT1!djREtwHx&D7vWrc{T2a>r0KT$!T^)d;;Um+UXQN?8pRPa&#o z>QhuUWM;^^Qqe#Pz_e0pTB@#_xF|&tCIUNO52M3X#g%Dwv)B2Dwrptd2pA3WCQ+bD z>eyGy=&rJ=$eIDqF^&9rF8_a8)u|dN@J-Jq%rzZmQA3p(6oZBk&hF}VT|pOHSp~h) zRH><&x(@fq#HQu>;(RvdsC;;|_EjPwA4EE7x3*Ba&`*k7JHq)S!ko&L8DYXEE9mgI zE|TiHaxq@%JqkfUI)j<8!^%^>rh}a&s{t5Xw4#_gg=Xo342WvLXi7Y4P>jna?uq;F zC|0{!hQ7c=Hoy)i)vq(zRPmiq0D-J3#HWg?7>q?ST~IVlS)g*nm~VS?E9(4kdwb6a z$GpCAdmEPo(a8x|7cSJ;rzK4gy0(h8rowNcbcyCB26rJ8o=BIQ0i+;-XQ6B?n{uxs zpe$e}LdC)u9@>$k>k6W~n9!?%7-l?6$0${q0eeslm>dFIL^CG3$8KAlM1SvGAYEIv zR0=hdsti4%2+?h5$3%7_yHr*%*)T{_a~##QND0&KP}Cm`8}wS0fy|-K1sa{+ns?p# z{_#z)Ow+k=TPjO6uyp32Wv=o_z}uy}I4a=VrFTi+FMU9gHnV9WjxYj!c(1j^(^^B{ z-cq%`D#p)^j#i2J9*m(Vp-ryCwxT|6W(dDo?S$OdtcOSZLfnbsUb_?Vo5P&x=PJI! zR&EDA)VZiilm%11Tiq^it3Rx+m)F&gGR3bfsL-poB4|@x*}O6rwcze9K39diyX2^B zE+{0{lvXr{&Bm`33hUR@DX4v}p}VtZYCQRPwcD-6r>k+d8`aKO#+2G$)eYC1?Zwqv zblRPTo7;VL%CLf{R$atr-sSkSuHH6HxEDoQlxqNENki&LD~VLkN)JH)|2Wi1%un(0 zadM3i!UFapjc2YFl5KL)@?_U2TpUn^bX5&=t!NRKal94dGfHvsL-!UO+2L={@wurkoL45N-(})$rry+bd@NbV zdhJy*NmfB)ba@^}X`auqX|dMPrsaNT6Q^6yzmixuQ`kFxytMNP*$woi4}S0yJ3poe z?hmV#iaNdBH#aVsj;yTw(R)92Y2#r6RaIg%&{P1sjUUR2X60wn$V9Byu+f$P*PmkT( zq!fP+eb02@Xa&a6QzG*~Kbw4nFLHw=S*47_%-OjPQ=3e=5Y$mYUY+br64<$PMrEr^9Spcn{GM=sJ|f=2 zCp)@4K!H!T{H1cX-mb%6H^6QE0(ZI(a9fy*SO(2u0h&~=)Ce2>e2o~_?6`K^!AUBi z4aAtrD-7bzZlw@a@QEI66DKGSJdJDaD3c;qfe5lDqvF#{<%1(wFGTd+`f3D~yWzy-;khac{9q+8z{dy84P<7#qw{ATC6 zSCMTy&;l z+i$e22lLzG=-w4lDoRZ32kpIE1I@4tT7J0Z8iSVT{Cgm+*PnRSgj z0%9M2CKwFPpGo$)D`3gqvq~lFt13G^*yUFSnCye!dm23ujBMV#SciXzM?a6|D88AR z+-VKp-)X5M_p5({HUB0Xhlq7=XEk7CZ##XdIa-zYi%4?Eb=yxllY8EN-U?dg1?l}D z{l5k6=Mzu{m!&UBUz2_dO5)JA6kVrnjk^A+QNLHbztGm;U)I)!+uaE=>UB3#nm5=E z_qE6arI@tMJ>E2v7MhjB&bX#Zw08Sy_Ko-E@B03%^nPpKW&CV@eHBw?@8YJtEn4!6 zc?Gzb6E|OM)oBiLfxQs%jNkJ~Ci)clWSoyLwC-av!m^}|9PO~Ag(F-N77$KsjT^KMk9`!**Xuev6yk zG3P|=)!6=NKfR*<#XUYB(r(53uZsxNbaRG9lFQ}{k5WxuVh*29ZvSe2HU&=^zPE5Tucs5zOWYorfSzZWuQ;O@ z*V{S51?sUITiH&0<7dENN_S$OZMAq0HZTv`i}<-+H%%Xo#Lw*_GE5gg;)s}f@_Tyd z$vuwmWo_fW2R}T1>&A{uk{@QWkX}e^vwgA%1mR$jr8^wjBRL~>v~l+wdgijAVMh?S z^E!_RMv;0L{+fssWF@3X4iKs-WNMnX4?S75Emk-Vk~A;oH^f{=Cr9k>6(_iMYbR^) zSC}bio;Uoy%>DI~i%Jh5!)R;?W5bbH}8OF4=++$>4YX@_?yKH&!yCLop1NtAaI{zv}E088%I=4 zS66Mf=hqZdCAv;Y#&h!RAna{n6bde$@IXd23*?d8+{cOs8$VAR$Ad3;2D30GO4cT* zt39K;H0~i5J=WPhC@^D9*DMD4H#xcHZ zy=NM$Oj&)9YK*QhMg4-RpXR0W?35JF_PepZ|irnUH=oL~T9h|Y~ z3$IVUk6Tc$w_)pTsnGov!xtWG*U++k>bd7?(BCOf5)MwwOy;TSdt)h$^Jv5WA% zzBRCYs#f%pT1xuP3iQ`IILqBvg;xaMoJe@!$WO<39={4sX5&A;I1Hp~YM1cepp`L{ z=wpJRn8$PRwZFKBtIqh&E>2Y;peFC-`s*N?f8az!1_rfqWctLj9aA+x-M0KQc3`6C z9Og@+gqSL|waTPnT5#{m8QZ|yG}~8HO__{zo8qFK!iep`uWXoAV3jaKRdK;kg({?K z8o?dkodE&pp#r5ku)tv{vlX()XSIZdEd~kT8V?;nlVUZ`59-Ulqm3Ip(R?r&HQ=fRe%`NP&Hmt;K#?BLMi3fKK;>QA_N2z!Nvpwe&ZAsMFJ0 zzlh|Rv7%amS+%T+fssIqP@r(OVykM&j4f3OOn%#9ebHPz1;Y-I(^C|)TfuBEj2&H~ zaE2W=2}tgj=E!zP{Dz ziLlF6grZM%@YMOSm+o*){At@4E^)qHwo8QXUm(8C!{YuYL2*OCHF79rFWN5I7#xQo zar}3O6TTxtHam(I?oUYDKJ8XMB&L$KEpw^;0V)%IrM7Q3<4+vIbaVG8&) zes(QEMy(1Iw(Ugl7m8e!b8atiaNVnk_J1)4V|`KZV2ZaXSSAN>o%!HdKbt%?sB#V+ub%Q zpnAqnYO9~+>kRK7SE9M;on5*CzJ)_%>NGhFn~D&mXr~UBZd(wUG%01QJc0x?HM8(= zZ+maJd_OPb;|PvlI6y}2yr};!pY!C$cX0XS=r zzq7w=*AF;e;~_scxH(;<)grX+L?Ekh97~!M-NuF_QTh=_L`5nv_BU8-hVq zMZ9DYstnKTV5ceiALFNBU;l0fj{KsfpHM-6h9Q#?T|KE;^LhPA=4#+u7JRGAzm`V+ zw~{*E@5SQF$>K*#X@oeb!eL6f8QS!Bkq5<9^napbi{$ITJpYyRPaOE*74gw|zRE*f zMR7sx+|jJ^j^a24pI{B@@}h`18-b8O$8<8>yKukS+Hx(aKISy~{#!|Hsx4o`OZY+4 z)OTksj_0wBUULD4XM?ZgluqKUW7ng z3hJ0f#!{GX^D6<|1Eh%(NeoqhL+_0KCQv-Rq2K<$B|#>g_DMO~^NuVwD}=cIY-?kqHS4>CRGN!NNZ?yqty7(tnwgzz zHs@w%rY5SLn!xOoUwakay9)1h_)K4z#Hn<67-ar(?nsh;bZ>QL(zOZE&4p#(*=WM2 zWUwoa9Pugjj~r)n{i~f{yPY zJ~_17GDpMV&Tqn#rO6>Np%nUjVhzKYz$8pvyF2I;TAzRP(fO`QC#Q*`Dr9DoDz|~v z*t@+-Y4!FV=)4;(er2jITeNj~8~#)8d>Y}7?_XrW;#{K>G8T3kbBm8rIQzakp>O|y4AqBJ_*GflT*Xei%jYqJ|0v$f7$cYV0P0s@w^GYXxY;U}jjsd@%a z9sdumuT&~tsS>qkry6pFv5MT7nr%mwl843cvvYHEt?ugTujhPX>afN8@%ZUGaXc8V z7d3(M#JLth0`U#i5zZ7?w6;4rvwDLShSTl`akXBboxS18BWMNF67+>>XdPOtr6lsG zS~wI_3qa$q&eiAZYt88reA%tfcUD{Vdb2w-2BVdy}qp;KC`L3bNe*G%Y^ zOTqNo`ckJ=jV%uepFX~(8>gFwQaw_ene806%$1eS+-w|rFjfO6^-$B-?tn2fR-;v9ZG%?kH|E4CQDNag)!@DX~ zkQP269Az`dI1}_m#x5~ZC-eczKE+@Q`;08f^0v%AsnDkwdx|QbWHQ!`{9UyJ-WK=z zT{8BSAGz(GiT90p@BeoGBfa5wPagDc?clfD6Zd?0{QKRHoabLC;+kW>kN%5dYB-H& z;lM=CGZS79t^ZQGLl!8#LpGGpD29ATzFWj1r%3aBsFnH$yp?E|jD0Wu=byQQsQ&nu z=kHdeDgN%x<|%UU+b>=m`~EvVbH@Q6Kwkyk)|bceNyS&l$2Vd!Yg&^g z=v`MR(Pc}Skm)v~KUewjvtMxu+%u`b-QU@migSAfea1^t1ah5~<^^r@S!R}XXgnb_ zn|`a^=|QK^3p*Qq*lgvSURYdF-MhoJ9{+%A*Xmp&+cQhHAM#l-ecX6J-Cl+7abQu_em zt~U8vDb`{QOi5POeI{=FfjGWN)P0P2!5H_$I z4){9=fAc&>4^h5Z%)a>c!VQbbRVr6=dayY1+(;#EnWJU3K(~omMK-kw|J&{o~^#ODLnH++{cVk=#=#Q zP`SK66S!Lte0K8NV@l1<54O1ra8dz;+bueewc9)8i-B+j8w}>RU)+9iY!S(Xjwykp zTn71P#+Ko~TIyiTN2!L=66mCW0&-QQ?%b8kTfRraF}^y%ch!CS5Jp7I4kO z#YLZmT3J}A!zTkp34&Rjd4|hFnGBEVv$*=5$FfgIeb8<0m)?n1>jAW1pXXKwbmSgX zH;rEmg+g{J3AmmS@9B=RG?wuz+B4b!S!7JnP1`NIwy7(iumk(S81BZfjB>aZc#h)* z9~0~{g{f2_$Bq#NbA2-|kkNAO7Z3wCvehXRLo%T)wEDCV6ER>4gH&9+T+{2Xt6b}2 ziuC{<)$;ygEf4YZ*c(w-lc#zkBDopvkg?CDJFlzeCft>W4hwa7nM5!iACd0BtR6#o z-1-NAUGN2fHutP4VD4s~ww;)Rx%0`1@0O>_<>}T;sWdYgAihNa)QTV&p!s3Y4?c;I z6rcPg0%I)mL2Uc6>Oxg^p0rEJgRSZEF0Z|OrapQ8zf=_d%qRKt%O~+#)p(4=i`|NE zKbWn#M4(^vrE`f+CJbK}Kh?O;Vi?3tS=n1NVh7%C6+Z@lAxERRT1=f(@_yW_|^eMtH2qwZVR zFO(ui6G)dCtqCcv z%km}4GcRWI_xRm;?t3uwZk|YJ389IDtyv#6=P=3*jz#^Zk3ZPF0QCPzpBA z=GJ9>aQ%vUnHMO3`Uj_YH@Lw)v^RJWPRXwv(#4PT7Z2WKe{lmsxQT9KKlg`q9R4Bf z=ea4pKGJ=U&QXb&I4TGIYoyv*hgDXk2&XM9Oq;;GvX5cb6fF;d~d zB>sDqe{WrSR=RwUEJdwv^R=v)gPf|Orr^oA^Twb#YHG6nJz4^sgMVz4p^YepWf_Y6 zUb}SZ?N(`y$fikPqfo_UlpulzSS)C2-~m4^6Jp}V68C_KtRi$JZe&^9W4Trd!?*X9 z9~W9lp_*DYWG`^3X@b};K1Qs{>-rAaNAG<+Zansdzpp5ZMd?G*58qsWlpyw}7`Rc2 zfk{%>TQvp1Bq@AMJ4L@FDY)%cKNc-ueXDa=Blwfo!|a&CS>WuK$YD*V`o@S`-4Z2j zr~Q8`=^r<)U-LWZqJC$yGc;{KwyOU1rHdkY-bG`gBHQlFjBCr4iSgAdyqL5`uP}8l z73p)NHJ)o@=)?Ve7D;DwpDB{{5&gX(N}_`0fpj`~#~~6??_Mbovs*AU((*`plG~rb zO7YBY)-SJcc^&~>;qF8FFW!+%30U}kI#F5(_Ci-nG=tI0aeNo|_Ue>um>2BQOMb-t zI|gXzMjj?vKWLPZ=VGO7&V#s>$P4m_!oZ8l=php5X71a-+u~{I-kWQS8$6><27b>k zc0?>2+VY3Btlu#8XeQzz`npMWQf98#INr(WFYvP?SmA5W3ipriCiQ$7`uUr%BHFGT z_qFJxjOmkQ1oAn|fcTegqe_hjZg-k7dzam6)(o@OY)t6-VdH*i&}zf&-EOkD*>nt} z)`Vwa+Yogt;X#osVNJ}BA?+p%3BnGdvwcYUyzd}7fBi74Vyr$rJZF;79A?lK2no9N zH=$4GI?WIAEN7rkDyUAPEnAnrdYCqStNQc}2;oiDr@wT4{>Rwj55CU%k_;)fFu>qq zHFOy_ZksE%z;+cFt^ybq_iw^df2S?*T=N&n4!&rAS-$mF%JN`tZ=yV}$LVfR$ zI(Lh&bKcyz`n5wx(xG{}gNILC=jLP14D@fu_tU}Ai_xKFTuFq(Mew6Q)DNHo6!mSB zXa;4n*;jm zq_oz-t{kMR!>DO;FMXbiwAgkJBl#4`y(T{hl-i7%%s$64pn*(m#J_SN10Ox7usuY5 zRaKjr6rOtqvz=fqpeXFe4rb-?bD{*KqMv;L`pX99>f)2P8R1+b$){j?83!Gnv2 zAFuA|Ryp+d(98V4D_i;=cR7Va9>^h5dtbBkZWp~dyItLS7Bi^gaTxmDdEp|OVe{eq z6H>A@E%Vvq4A*#C?yIYE0?|4x0)JNJJlwguwK@Uqps{^syHRc|gd@ju(JbN{|FtdG zyOT&#W4i%=VSCb49DWX@m7MELm``|!Y#ilSD$5dq{!o`p9&3C7C|v9BkZ?0x3)fn` z%^~o_Es>xeMrzVQSV;|`1Q9Y2Y+fGlwgx6*tim1#5JcZV3|vBAo;7rb+Ukc}JfLk2 z%*3B1gyhTePqyYQJM_z~kj!{2bSulgy0}xLvD@$}5wW$oiDuifD&h`bsd$y8(#Rcq zxQIi3u7IjoQmpAx+%{=_b2@6d6S_@|Qpxbz(+sT7`M_OXb?}~Y+%{N!YbtDcHN%q4 zvakE?8Is(zvLY2R7ImKeEpwOW5LsxHg`(!1AeSc*MtAZ-S(Wcvrz*Wuz#zRM;KQCE z^sx<@$d7RS?p)qSuW+1(CiYyT5h{5CGX5plX#KSQKwT1X65iD`9^!2J`g&##D7dQun+G&U*BuSoQIQUe*+#EIF~uSldPY{nL!>Vy$Ky-hm(tG- zl4$VAD-g40>ED7c!S~=}cPHe)2AbBh89B>WK-Fa#9lA6Pbet}DZ|6?iTfHH~992NS zB{M)sY(JUypW&Vv=WK2+{$AvN6J5|FUwmJ;uK1B=S^q}2)_}HfZ^cQB{f$s^&pA5LoS^4amHq`)|NHCHwTu1UQK~3(Z-hdc z<%vhR;Of*3N+uMJ6WML+#jA&ljk2ec>rXQ!J56fz?v(1gDS}Z^b_^3u9%FpA9WkGn zs-^U!-BqB!#a9uZ8qdRx$oRTE&7=qjeetH7Es*gXSH$hAczBrq^QAB>ttF*)eM#6y zaY_0pw(WFIdV<7K1ZBD@y&JPH23nYn7YXu06FVzttI;|~Gr<#Zx+hk}Q}3rd$wIsp zi%<+~<{2;`2EK}93jLuc-(ITKIjBXwR+1gPIu+}VOy!B&>Ie`!d3;iq<9Vh+TUM)t z;7EAd@<|X7-{K26vJ5>k^E?LK_4E8jUm@BF!femhb=a_zx-KhkC3Z%Y@!X zKzTvofCghK3`S!Y11ntg3s!<)ax$PqK>%9Vn=0I!%?m?I{f-o4hLpajIegNNXGuW? z3Z&7`Q4u$`wpI4&BdA7gW2$RVppJZ+soxM2)q6}?pcZ=PVOncYkrtE(IqoFiVB32I zeSM`rhrYDIV=7`z3|%pTN4ql5xC4XoNtyfp_64$L=lwG?{^IoX;<0IGes0n*CgB4?lT=su|Zr+<-nx1dD{5)KBTYR72>8{P;RWH}c(C2RoF+_*0Wldej#oAU=OlO`V zS%!&RN4TvldkSH`UQt|v*bX%T&yo-LzwwxfdGczfv7oex6s?98zFh+upnrBT7nC+c z3XhkDqUfR1xe5fOL;ZLNmD?6E_L;a!MfVv|Jh>teW(sI5L4iVOm4vd>HPmX&&x~Nm zNWTL*Ynkg8DHSp1wGx6!>G-dAWD9itK$|o}Rb~b=vN!Qby{h78s9ZL@^vDpU&h z>(FvT&y$ApJkD|i&QTp>AK&RJN*@3EtE0RUQ34_lB?n{qyF(0qFar$A%K&54j!HWi zy)fj&xG&PolMg6}u>oiAI-nei&@n*{RP)0J6oe>;E7D&|KKef&TpRYuBKh6{C7jCN zm(ECU;}{^AQxc;yg!30h7iDfXQ5+>_c_fF(u-V`0r}4C#9KXAryMcz86RNhEd#EO1 zLA_mtRRUcvhuAB4uEKaWP1v{|?u6xW*BqZIy9h0+4NwX4?;W64=iN8pV%Ml@DT;+z zqGa|EaQYBfc5pOul7UgTY3cWJ(+OS^z|Xy0O@%iX^i9+YHhA{l8)9gvcYNU>A}@)^ z$`=p%{s8PZZp2|fndb(nNyk7(d00BnSB@YEiO#Qwk+H6^uoD(chPYc13&aIX93Z@(62mFDI7MZ&m(S^X+9Rt zh2h*H#*&3j)q%foYKkn6zE12;idO~ahTr^Fekj*WY>{SInOmHzgssI^IO$X;s?OBn zRH2WkaS!O5%HrG~LRds|;5vDop#XlCPj4TR;(3ol3xc-2>qQx6Y=TjBN_s2UtDh*u z>E^z>dGz8C<-H-Q(>Vbxnd47dAA*zh;^A|=1>(68ufN`fGzFHxSLPUW&!(15VCpX* zFE8k35MhQ}gD23Hbmz^YnjIh-bi`JElTZ0 zg`MT0f^AuD^Ps}B(1G2u;0}=6)`@hUcxZC(|ATVd9VfS2uW-5COt9e7F%M_ja7b(S z-)u=;x@fY+Ma3jLwx2ck9itAeRzYP4~bka|!*@dSQPHT3#lfH(fmC zhN8>{LPp!SD5AZ~9||Z9K9maTD{q>dhC3?gx!!C!{Zm=qk#))!p`taaf8iEI^^drj zM)|r_v`#PHvZU04oDkRJonVJw<{kz`ixL!-WZ`j!h;9o}rQT%O{R-8gM}dAtS23nL z96o&X7A5(IH17rBbs8Nx{@|@wLM@XmYNw~A_evj^o|Aq#8#mL{u)+c-7xpRL&QZ^EmWoXmBb*%+)_ACmWfQ7(ecv75E z6z$LHMnANEfuDV`9Df5r-LPg9s=Jdyre3+sWouoA_U-x^C-wtJIQ-vB*Ve+Yi0b zExIUwd!PIToK!MrRh06<2XD6gcXJ7k>sa5oF7^Twz;cT$!3X0KPmUgYBW=W@buBb4 zoCMqF`SE5;_HV&}9)`@KEaG4=VaQ=(B6_PD>p!CK7Dg?Wy)k+FGq);5mdOxTiUx?9 z7re<*x>aGM_}#bEW^=x`q2dd?I;AG!$lSrM5%p}}ox>I=T( z_|a_WIiAO=QvrEFWuMT?`X`u5Kl-FB|B&bXkSss>QA#u?r0*g+jtn|^7u;KxBk!kX zRYN|>*h$$?XDR6gM+hZdP3ywXk)TJia@3@2S>HRXP2FIh+s05Ns4qM;DMKL}vzLTj z98Z6EmzMlUL-aV(L^4aojWzXh?|Q7I1Jax#Sd<-WG9Q@|MLlw*mjauh9d&(@&1VSOu1fKr1ilR z4?SNA+B^h(VKjfhXf~5qIP^f;SUDS)bK(d2?q0roz&cUNP_nt4Z8%ft^MUKDE$Pps z0Q1V>x+20`^)Txq{@-#*CtXN8Q=8W&y35v&*XuzLl!KtA&$h)1+PT@Ii*6<27vR5A z*cGcunQzBmz<9zVq%emjynib-@4HFbJhADt5TOon^QHyhcrtuvn@)=_z^7{L%v#s^ z1kOkBOa|yui5tGhOsBgxGYDtZ_(&>Ua(URXLJ8t=ts;t$0kyB)^w%`OYCPcv5 z61*k-N8-R)czAMQ&MpOtU%2E2idWhe{HJ+DrK@9dX+1CfSJLlGFG>GW`nS?+#Jiq< zlo&=v(K|+QX0vQI2VcJ~8puAhki(uIxqjI5H}QU4cIo6RwAXU{kUz>mI^rSZ4np>y zezJ)8lI)$qO`U_1`2EK?tKAU5RaFCG;9C8Ge7XLi9vbSg7Y!yC~ z?ofKj$@!ed=?l^?OTQ`of%MPd z+W$=mDUpUG%^$MHtqFT(7|`;@d%6=O9)7`QXE+U9XR~#aedp-)8#pcw9{aA3=D18O zxYY4_bL?V%d0%aWz1_TY+ey`eO^}~GPYPvKs0;IX1$;4oU3=t)>z&=szE=R@nNO?o z1)08>C$|ieYQ5`4A4y?!WVtIBs_g#F{Egn(-6xiV_GGf}GzT`S^5r{;22?Z z(h+Gn8Iwi$6J`qKb49`jtAqenJjGh}?;KMv3Kf|DxEGWENDXvjt|7nrSGjskG^V^f zAIt~say#*TdF?f#^R; !AecqWWwnu>dq_2UYMO7s#;oOKS7v(^z{gR}Q$;jJQk z8MzVsi(=&`K;??#vx(HW7g5^^DE&k34bH9VbK+;WcyJCcQ||sJ!`=25^LWQEf-V(+ zR(3bfvWV!)!t6v~ZINOz&r6)}7qkoMuu@ca;k?dGX^z3Pwb3c)J(vpt(cV{)KNWSS zu;mtmJl_ER5QOpi48l>);5^AV%T-4&rUhtFZYx3!tww!)Bn@of6@kH3#3nD#g9)j`G)qI|ANY?xt z`)!-l6;94D4KsCr_X@uI1tHl3z98M=H=chQzwzt^eBXrwzoBLRofh|OJ}TWV-HUiz z{o*uUaX&?aLj-fJaG^gc`#IeM?{<86qiXR{)J zhN@cHHK^VJ6kX!2SMyR1aOzsKw!f)cFG6GgW}#m0H8{Q} zH()TOC9=AGeSSWk^+3?=fW(0ztsOu)6&X@T_`zb`$4}9Zx+YCwoYC0)$VhW3D78xY zyunZ+WQCpC<@wHGXE^ooHOz5`SsPycUg8^@b*4gT7tEAJ9;ywZrbLb9? zYmCPPDg25#7l#wp$KpA2)0+5u@Gp$#esaRvg!3D5qp{j(<4U$G$4ljFdlkKD=#b$#Z{cKS}Et0DKj_9bfRgugVEk4?G{b-qOy_ zg(7wT4+h6vMbDpPtV22xD;N<;)etl5!Pk2{xR-C@G+!of3kLJJgx|2rwJkQMXuw_A`}~-T+-dqQCC!=5|Fl5SYKR zy*VpMBA=rK))&+&DZo``p7_+|25<|3$xo6$p)zTnQWdsGRW;uwOJHsOprt%7gCUyi zh`EI1ea!>ksPR*MessXwKf9@@a_#+mJMK%*>&ja{1phJ~{yls%&d_2?uq6I+Yo`TT_zxkmP-H2fp#t5Elo${?y_rgb94?w4#v4 z{%?KhCv@fROK>j3m|KQ^uqz!0tp+nxigcwSO(iB`*n+Af;|heoVKH4t3U>h^kS*Cm5*R+JS!4t5XY(2w9}E zOJr)v@(Ds_z&C z`)DS|eGd5`T!Zt(3d9z@r@xdGi(FPWWe z^T4UK%~qs^jzJ{Dag5hsdwwOdUE;*9YdtQ@wqaWIxKPtUHeW>Z`b||LBi? z*{Qg0#rg7m8fa|3clQI+GrD31`t7HXwA8;=OV)Z3kM^)ZL?wSn zhZYEw_k$EJNFSDdMEXhTE7I4c-@axS4C*(d-5u#H#WC zulgZ+!yB$2Y4Kmn3*=f}q{C;^A{{=P25aBQ+3{c7O(s+i|J;9)3X@m&IO^w;6UdHmEM>@KgPaPe{?vXwq{nU+*V_Qk) zNley+i&ZdQAQ_&5Yjp!CLRaL zPjVSHLAQ8!UN?b%Q8&B5|LGfVuc>=gyl>}_+O)0l;Cy}PXKcy40>@x5^dtH;p!zSz z_G<@I+|4_)ahn03-GomUf3kTX=^D=+KRqUM{BYrBS>d@CA8at^JBG<$9H4SONZb@) zldZR8?_NFh?V}Eb`@Z&>Y?ki8?*@s}1Z*TNS?`*F+J96!Aq}LrLGAy6%=%4Y&|5=M z=3y&YFi#Rs)6JGvga$y;HG%yW_BK1cY`K^Z=phee-%P!fq3&-p)v)~_nTzVybz3(~ z-!{wbwjqk)_j!_aV|SaQ0@CxoZNL*(44gaVSy|W_Je9b<28yb~fJi;#vhDBe<}<^A zfq>q&v9}k9Me?rg@A-Be{_WaaozjQoaa{U7>D|y{UzDCrR^yUI+c-@{lIMU;EhCYT z3=DPPww=PGZ}zA6WtQFI;XiRt3ww!lwNQ=t0=62)n6)a4^Y1dnw0+Y6!PI#wA`nyn zd;k;ec9O|?&-U9Wjy>GWm+W%A&HIVdM6mj~-DkPWH2Q{sur3=ORZ&bJE#aYy5u#t#J}P|jN+sB>m8;aav)qN<`0;s%X|4K_HHy9zOt1=nsg z0+$d)QE3TGPIn?OmD?4QC|#K%yH9E>PGA|XJz+Stsc6RW{gN8Fea8vq1_S$Ty6;A6 z$@iU^XsYHI6SiwufwQ7L$&_EEa6>~5r8K7n@`!UZqHr~ArF@=7OY&r>>h$B>%5Wjah%a)yn zh#<0NeBg%=#AyJ-)Sz|zUHd*sYOUjQ+uMAiYa4ESaX$&^_c8bD6i14Y`k?>k(L9|> zv$NL5`OT)lO$4=TIspuCZ6-OqlT?A2TwE2GzU5PqLV_{S>Onp9tzb~Ioy(25(yEBO zey|faE;gQfyHAsN(K`3X#XReG1lE*)=~CPX;I2!!#B~XFf<}zzq%4OB*kC$HZBAMT z8(rv@JS$mmA7L5IID%y3MVA13*wF~)21rl5SD^4NPBPor<*BV0{i&RvtAdze0u!pw zmAN`dmotV6ehVn;C61dvEa~e@_UKx)p1`WE_t&=8Qwi_x7wZhC4=F9k_QF_+KER1X z?AdJYlEa?|Z6NipaBg-0l{Bc=64`NAoUNlTymcLJvW$3V5(18X) zKot7wUuC=c%d-43A;iZGd0EE%&xvncHSsQ$2%p;ZNVC<^RPIiCimdnI{+8AW<6eK$ zBb!=C7N8qCFUyZV4xdkU-ZvPO2ZM_PvPjvhe?=AkO_dQX*`4=Z_TcZ&U-n)u_zHT! zb$^V{i%9t-)+N!MDoOmK^?-&Rs6s7m4ZD!syW-nS4Y6l!b07l@7*u|qOuCb#63@=Y zm8-miKoHE!2&sboWD!zj{=|vF#e43#DCJmF8ux8llTP9~<$<2!NrqA_nI6vPi-%CK zw9R3<$GShg6FTOZX^ePm%Lw?=6%#gJ$ho*?rBQPU*fHS<$RDPNsgQxhoJin~z*4z5 z$ob0KE9MF70#C&hJz58S2r<7qjA*z{!WSU>h;NtVJc*0xe9u*(I-P-%tUb<`TPK!JD!vCSruS8d^%c>PE-8r)~ zyEIb^s|aOT4QprFlpoHP?0V#zs_YQrpl_~Mjy7(aS+q=t1i$82efSHu2bEJt_Yj%PyIt26s34|l$hB9{x_A*ce=wnbSXSfN z50S{j+sLc|V(&`%ILh<7twWE07tf@YQ*eT`J8}BK)N?q^N)XjR_h_TXE^PcGsh|y;t6Xd z!=MkTvz-SpH83dRJAGuy%EmIxXul)fBi%1OEIlf{T{;hz=X;CuP{J*`;M=p$oGiwl zfB`kq^J*bz6bJm{af5Hu6%G0)P0>Grhp%u{HH^l5GTkHUW8w^&>|YPIgPmXyY?rs; zpXk9vnp0Ur*YF}ha8l^>34dq}TGv96_C@dJt z`S=p#j(9+6tQq;3WSrBNPVlG6+g&^HpEMpTQLtIw&8(Z zV+UoteqG$vSsG4#=5;aJ&6h4N-!#uF94Byz`~2MpHF*C&X1F>`F(v^A4aywjVZ~gNZI>c?tw3fs}O^ou~M@uQ24Nj{-XR|RSbILIngpkF2BLlZD&VX$mcreVf zclS7+weK9tGc=)An6tdIQ*Ng$x6kvil<_PlI{XT^lh;I)eTv`P;fs_|c;=xxI&a~TS-g>6364{}e zHleUe|M*=Lx`8=ao=}-y*e~RFnC4!s5~`CpV}l6MtC*?Bl@Z5_yG4Qa3pNMW!#OT5 zI^T9VxCp|>r+cQWtE=bN0}Q@I10+CVAOaAYBuMS>&l!mn$>9f- zh7v`IkVH^y?j9Wz)XI`ES}yIwvs`^JG$mOOy;=*{Bd?Z_kL;t7btEsi(y>f8#AGtjHHHB3`_B@!oy9_a3Y2PFH+1t$KC$kE)h4fAW@&GdZ!) zoow3en@_h@)w;>HqOf_i8H9#o*6)>rXeF*1VNgHPEcUH1Zen9ZUuS0wG8qRDyK+g6 zge}0ymSy~Mn|nmV2(7jbwW`o=Nw;=fxJjtW@me?0UPRm7HXa(Pf`%KkF|obI+QNj~ z;WJ7{o>-`{%;}jv?~)auZ5cF$Q_L<_)w}DQo>*TUq}q6b1nq+uJ)dEH%kuYh(?Rz| z)g$np?KE`b`Ur&vP=EJ(wE07mjr+Zcsh_@9xwhlGo^CKQw=1qUN+z$!l^=d@l;|_R zdVkBC@V*AW8m0Y|bQkk?zERrIUaDnP(D2(Es7RPhr9P{SYlglV-dK&I*T4cL_Iy?` zm&z7&zo@8Ru_uXh_-!KI^MJhtmYvJusdy+m@Y((P&&PQ>r4IMh|LXPoP=lFB*hI1+ zdfqk~Ts5JS9bvh2P$#EPZyt``OIg&l>H-1pZe6Nq9>ksg6ZZW-x%&Q2hxPpg4tyQbPQNuieL({ zpAUU=nPinso@2l!|q?@tPF*U=3zlNb%x}(Unp~LdDYDe4= zAi|Vd)5-AF|EcIONx^?RigWq$hG|)*WfDi%9aLI$RiV13SQcAv=JLJFlb6qtmr>h; z*Cdmf(sMv@v+&jsD~+C}i?HBLg4VAbK_#O+JIT#L`JKyl;Mq=y=4-mmkVZns_Aqmb z%6-k)hst-E#eO`l7oK%|+mtnyx?47Fc4I@tK=Z*Wl)9dPE7MB!ACcBshTHo}o(3@9 z&>F{hx{NS7gK-*fMt{8b$$41EjIC6$EVg)ccK_q*>#n+etI&Ext%hL$#Z@Vv!4X*T z-v(>`hglnOw}~u*d;B$MssYxJCnna5ls?d&py{W_dZ=Zz))Dk_&_n<6W%>J9nTCLc zYwWsUb^VeKN}lXE&FT7LZ?QhpbSgyGbz+!_`z|*&&pID>Ks3+AWC^N*t+l4IKi+aI z=UziYKpMAmw!b_vvD`n~@jOkd+IFK}Z`eN(O->wcLziz$gzY;_ur@|(uMQnZq^lUp^j!N)n-Z#9v@vz~j>AV^ z8$v5eLwhSt=`^!1?Dw8&rZrB9Oh2wr98rD4FoDfXs}ynTLah`q1cSY41VtHSysamc zCb|tP8@QCSOZjF(iArr(mR*~w<%@mlw$6WR5S183QQ76|c9$hC*xXR!$uj68@4O!O zdG~^;aG>$K>8rw~c(w~wZS*43TDU0^B0ZHjkPAYgflCfS9g6;fd&RWyJ6Zw8trZuVHVnt&2ZXbYc=p z&#`}Ssw;N_^T}E2Ajr<*du_eb(d{2sWryBO6gq=3O^7h1DKju}O=ADb>1o1h==i=g zbqDDfy5s?Fai;oi@;>{44}9S3V@Q0Ba+cDw%4_x_b+9rR93Mlj;noSMyHjP`3T6IW zcS`q5Zrq@2$u3vt^D&V$GHh!%foPs4uN9)!E@Z*X5p_Sgh97&z7*!!zc##oo{-wo~lKUUj9hcM>>mA_F6(Vag8XzgT>N!ae!Kxr|lTJjamR62&YI^PFY@nJ{jplt{ zPUfeQ&@t$H^R+V4gzLH`ko%~G>*%qGmWwHwQPl6EZ)HdCGxvZd>Be0i<){PIVjY70 z0lhV0Wx^irUj||=$973ZDj`7NjN;p&WuLnlvr>9%*zO%@aZ`txUL&>vwIO6FaMMLg zEh_L%q}cn>hpA?IetqUW54oMlvfey9;JiI%R1^}-M=CYdVAgXBtnfNpv&I}(CP&9F zVDkIDxQjRsNc%d}OuvXpkh_hic#`BWd@3@H9m9EggJ-5reD>j8xw3Qhs;pa}Mc76V z<@S^m-seb|;T^rii#PVmFY(C19PzIKAwW)KYR3(C`&m`tco=wieAht`_~oltL1U6_ zVw*_h5~-GfT~3TFkpe#3OP$CY37AIwEi}xYCv$HER#onsU_J|Pi7RMPw0vW}T#BrUQ zDT@A((>^*ejjpe^1jGj%q6-2g_9kut-r$yuH;cN!p_8LFy;$J&ZfsoPm5ORJSb@{r zobg<~$?%t90r`v7a&w>i2GnX*T9-~po6=e7c4k?9z4UKVq(%(S*>3e*#MZe-I2%*5X46ni1726!oJpJ_3TkO9_I-TR~_VHau<_GeO4NDEN zC5G3gLG@?2)j)f$6CMwvDEcHv8b%mm_McSFb6l0?q4uwn-omZ*%yYhpt1XwI|Mv&W zED5=WK1=JUY2$qaD4dqLZ&#OPhi?+@bYIdcB2agj6FJJa0fw3Xw`5(b&8dVCS#Krk zs{BS+m^m?~+l?JhBfn1#*&?!Hs!##TR;ocVi!zL;(>1j-qr=Her&mu@>ct2a5L7g$ zTHEHn6dq($c8CPQsnr9p?L-QK1=CF^AmaI#c8 zw7S@kJH8WPlfa=PHx^e9)!JH?AVS-zAFk7+TgL}N79mpaCKPTKF+jrh3h#HM!_YtP zKs#YM>m~sqBuilhA$n&C(rmR^_o`tDTP8W_XHHSGnad?(56>tH< z3{VJ#RXe=8I7#C}b)bs`Kps3^>n4w5qKl0G1PT>6ysi_$-l{;BlO zq<`UHS_~?E)U0mNd z>dU%D6dlxQg{p`!A5pbV^l9iKc?CN;SA`g5qk~@SLF#>UvaBp$JMV zj*KZfpc@+sCUc*heny0)^O|YtezhL`l5Z}IWpqUL;q+x*dEs>9@=`tV5)W+8*}A)*g*1z4vm zz*0o!MW!kk2Sru1Xi){<1ANrv@I)?y4}-pwGK5j|%|=6729AYMNXw)JGd_-Ov_EPO zsHS`~0!f?dCyLX#%G9LiSE@%+2gBShDprP5!A}0A?oCWh7`Aihh>)xJPE~433oI8( zs<*m>{$6kAqm5}5Iwn`(ZW(i(e|OVOpSbC!vGhD(J5Ex!11svRnk1ZVO$Whr3*^nk z3l}biy9xYZEt!Zby4jhv-r%>UL-@s1806SAIbj=R&7{-R31qK1c`9+P zlCP^lPyua7)pU5ut>Dfi47mx-Fe~n_Q_B6zJvv#bn6~9%Xq@cR$gSG?lB-Ts91Y!c zJz^-TVd>VVJH*r-(>5*Ja$()(!^|@&>n03SyVALKM+gJe)D0a03N%9=$eQBOSl1Oj zk4^eZwx2u@v#r=k7S=H_X>x5vTouzO6WV+DtrpjqnXP{@g5|`<(_9x(A`Ca;XPWYT zK6njgyDY=2WM0EpI-Sn8s<3&J!XQ&_Rv1#+io!6?;8R`U9?Hc5jgW;;G1PH|)$d`L zRo^$XYGO&m3%ZMVUhW~4ndsnKp;|CSv(JWRf49$FZ&%InUSp`1-`~ZBj;5HF>sn?+ zwHH_xm4Xpb)Gk;NZ9G3xbL0!~LslpTercFqK5{|#Xi_iqXtR;?WCf$CbKb0QpKFra zRMGZ?J3K&l4sZx{2Z7N0Hwt|{g@4NXvlFs3bjeO~ENCpNSs<*B6ga?Gqi*Zm=+Eir z*6+Dz9i8V!O8$d;-hIzd+0%QLeTL{Pl&QPB^hfT2V(uAJ{8_vYZ{T}C-y;iTL9)43 z1)&JnI$b@9bskpHTTNjJ=7I{kKIm$#7rnOYdv4czq`o*Yu~=^=?WsF&Uk$?5+wYue z*CwBssI{XbM~_rH^~pyjaPQUcq*iTk#~p*3opwCFZzp6O>VO!NBn`6sR4LbhRzZ1X zvG&;E5VRw!I*X-=6RkC*8trhy!eO4s=8~cYaU2lZk(Ey>a)-X#a0xfnr>k=dLT#4#x;3XghV{fI^CwAiOG7?qU}hXv z5m;no!h>iG~OhbSZAZWV@TmEw^K?hwa_uL;500bcK&*+t(uILp6 zbE_1mvx;n^NU~++r;F3KQx=~5I{ra7I>68uP1BE>r<#$Uoq%TK`V(stK5n=26H3|| zZL;kKmX=hU-H&*?Wejp2&z2zK#!x(47pUdXcsdu+aXEbLnc8$RQBRbL>sA`2K()D@ z{^a81-R`72D8&*x%znCvV?7%_FqG7x*JUfp)2YMr|CREr%*z4Yddq&|^M*Vg!} z=fxwfQ}ZP%fQJ5EjEGV_mtgiyS?>{V*p-JUr{R}b;Sc7Kg-?o?ejdyGLSaPQ!WR{G z3tVHGAYW#g9dlQWMj>lP@z&1|Rqe6D7rdOj>sns7A1y3>Sumtg(4vzz^If_Rb2JVx z3{Q)(yE60y4i#~RfW&1sRy+MjT3wldHB=n&~t{Zmn z!S{o@6nIo~H$iLHtV5Bd+uA$Oie-5=A(5xpha%IkwZl%uwN#l}zDJ>VyIxg+r}c+H zm-pMILf!|OzZQg!X<4v>_)igNVWwj^)%s}-w7uw%trAUTpxl6A|{Y1Foi=#Zts z?TTHkR0Gid@2OW5YST(R*5NDVVWOCAA65;Is4AgmSaAr|^r(ahicx+?rQ-}~mc=jj zbAV*@K3MA>>-1rSW8@w4Lq`9u%=p~R*4_D?f1g;sX^F155O_qELF=s;(Hk5Lee>_M zgCGrpe+&l#0?y=j-=|?H+ho>>JZ zY55`k@m@}##VcrEwM^eiBBP=j$OA9PDz~Gnn4hO&dS*qdL>T-ai&6Y6ua&4O+KAx# zqk;k3lNiXUX}}ZHH{+_|dD-GyCMwJ{=A@5Ff6!4LR)%gS9GDLxv;8iC#xyG(mX@Kt zS4(jpc|!SeuBS7Ib($#$X}_h@_&Cq(aSt`KEx_^HYDNX%n-gWn* z42Dj5>pc`6GUR)hC2=-U;Gy^M3QcTn5&zqnUMM|JT1;Y;<1EE_9#WZ~XMVxB$9O+X zrobi+LJS4N9F5itoUvbo89QR;@xn*o3Py`u!7undHZg~}ek#2P>((jenc3~Pa@!v3 z4B5;Icb@^p7L7B)clbQpbjF?KZ-1LvPnqHZWW1oLr9I1-p^RW=P?)J(#nuieCxzr) z7DmR*-T5kdc&;!r-&5SExsw40mcky%5{9K0K}g%eVZDjd z7QpygWpXsvM7dC0CPO^tnXn z=(nFO?Vmw4Px5u(@5;XQ$3S=DKWzo7SqbD-k?Qtop0hJs^BiI5w^FpsqWD{L=pmqU zZ8@&uPIfxQEH}N?P5Cr#?%;$8qEKGUqGZ-`5QDE9)daX3*j3+fbko!w!>_{S_}dz$ z1!|(5D_*6#MjD2JsmS;FMfvuRY#=7Cp~}fB)eNb$h6|)0!x?Q9f_DJ3ImWR!u|^10 z5m#NP1hZ1Fut@jQq`S;Ea{FtWP;ri^q@%wq8v-mz59?QH9x}y1esERs`#j50UL84f z56TCA+qI^wu;#^~WreX<3x_U$o9AK5>U%TH<_F~yyImPqXntAJi3dC%>C5R2I=Za$ z_@B;tnk_SLtV^si-ylQNp^x*`*bVlI72CKOWzEfoeSuiG5G&`(!M%_~`VgCQIDx`_ zC1!gB{a3e(T;>ZySurd_!CLlT(LS<`m@)8%52>aK{}>xCyuux2L~h*jGJ8sCuDh}R z@k3j3Pp2K&WDZqS#?a>9|`JA&@`>bC!Rn70M_551x-FZ{*c^@=xkxvk&uGTVBe zecl^u`vtzD7uzzRdl~8tc7pqdevHKp^@oP^ap9@A7s;<~|A1y3t>Vfn+E1PtVIRD0 z;}!2S<+hqUr8^H`Ifsxd5JmbyT$$ zxv@fts_InrOj{3OF=5_dfBGt$qKGx6Tbf%7(~7M*x)s2ej%UfBloa#MwDc3w&tmV| zw?eOO|I)Kb?+Yf`g9Wc_e|v!Q`$Nti{Q0R@w(~tHCO~NjC#)eYNYW^R&7d4R+ACia z=BE!>6-*+rVPPVP%GOSX1opX#br!xFJ{0kj9E%&#cBH-Eay^^a@VkF+yiM%cafC!U zU|GIEFotZN4AXen=D8=CW!vX(4v|zcetP@!qwuE(eq^u20N-*#u5KxMyc|hB-q7js zb7dtVdS&eC8{tMz$q*?A}bc)@or;39SCkn2LyGpxLc{mScI z95!gbPzF564q49R!@#pPt|r^-9R|I?VqH$c;7<4^I_o@q%evd?>f-8{fWhTI5FLvc zFw&#m!>Ud?M5SvAlyX!viKWPTw`Lm^YJ{5k^OQ~=o@kny;%Ry*sj$l}NiC@-osw>sUXQle9J6Lj zX4>9fuC9C$&GtC>NxxfC9fuM)Fua;`+eMDrNA72Kh0L6w{wp<4po>iLjv1!!o4`r6rrBC)Jqc=Y;e?9)pSiiF_Y7 zGg9Q%if-8|Q?^`m%WPx07K;dvosu&xr=wj&#&V;<`NFdCIAajACp4J(<~*t6uMsTM zHq4=V{bymO5m18l0J(sLZ!u0pY=4f|Rk|wby39QOhTFEK^JZhCfm@7+vuBoCGb);H zr5yZ9)c;&mLdlv+zFKM|UTc1|_-|`6w1*-~MIQ7cWjdiZB2H!=6-!qW?yT0!2ri+z zER!;w+j*YC^TIJn1nDjoWSV*JB1;*Ev1%`Uw@m5_qJFj9U{~PKRbU3W1y_u=%&pC*9x;sGFO3bt9NMBQgbH>i)xoeb^tsUxH}V)Db2%- zaE2i`{Ub>_0~OmdqE;FeO_#R~!s<%>vK@HZESkEik>u0t9 zdBdR8b?HxvAZ<-lTKOiGJx{Gr+oqL@tn1WODID9j5?8S@)mX7tfC(#9Gq+d;e?_0y z_E1y((NN2vufTUPA2W*;vLzoqHrmYTJ5IYXjN86Gg}NuG zuQAaZ?(FT04?R?0dFY{V<+V+`>dl;c-70+bQpA1r2hQm2cz-PL&LvBw^2+;!XH z|9jNX8RzA$RUhaiUylJm0P0mSYz~hI73)O=`zDDP1jeyPZh^8 zP^ufm_&r(P(sU9L@-?c_(~3=%O(QXlm^4xB8;%2yrN-|OctqE>Wch0{kv9=5b`yTB zXYs%M{YMW-0V?$}OW1xeS`@0&Z+IuZLFvJ$ie>p5C%kXS2E~~7mjq6dDa{~O4$CE< z@@QK=EBEpg1MHx$iKxT!p~W&)VjAg;MSDG##P2!jHsHI`T}Jvi*)C0pANcdSC30v?t0J@ zFhDHh@L$Qy2K;o+gWp)JEozIGIB(U{a`R3ZbJAeM8uAm((N}X0{{lRG@8Ts@aJDYr z*^~)JegRi=Kdr++qoA&YJ~H@4=xINv%4_iaSD@@QStVUrzNl!whWNa{#$4fYJIY~( zMJ`3DC}OZKQ13G*(810}RCx)?dd)A%>dy@qO{#BGFn0T&Xv)Rn4Ov_PqpvlNLUq?m zkme8Y_dEdwF9FTo?$>#;{3iB7N*_l!j-j`f*K}2>$@~gH!)akmKFcM66H<(Rc->W$ zVd$Wap=bl1zYw>e(!!hlvP@M&x1#h`Sg>MdjIG)XnO&KkJ*PxL7|w~iH&-!&Zn7gA zM#ZZ-p667(iebnXW>?tb7YwV~uBiEK?ph=jxkZrHIfjpk_=peVo_Kq;w@G+BWQnl3 zV{0sH1gk}N*t32UeIz>FxvU~5`DQqrwpi7B-CQ-#cDz6o!;;>BmH4e`Wa$XwLa1U? z@2lzx-Qod&ch0hqvrpQNuCWS7uT!deGuWVtUhUq*zMT~zbGtYYYPxNvq-NT>c9BPY zwbNO~mfF1vVULA|HB~pXiD?WDPS1(0H2$zu?Aal{QB~mFh@GNkhC!igxLt%fcXKy_ zIh^y#=se$pF{oA)^=ZZWHQe&|N#O8C`+~#v>jOK&Hkte$492HbrJ_DfZ(;XSKjO`G zQS9u8JYF)NAJKMz(SRqUbE6rn_c5b(vnI(Xn~1=?%ciO6mI)n# zSh}3Gr6jQVr2oYHH`Ypi8ydYQsA><%F2o*aF}oZqK5lS4Hbqn$lcpmuEfK z3l}H8G`PZ>WzECbbx&b7oq{f#MfR=bNI;B?JmzMXyH`fMAn#H^3xCU{Xp&Ldh`toq zpR@zrn0j=|&~aZ5X}QQLer&S(Ev(JAs*@`?_x+Koc%Gt`ah4wm2P zldfv5vY&KEgc5dmuBXB+oc&<7;5MJR8T7(fQJf8ihKRLfRl5XLWOF&whM!TiY>@&t z$&`{k25T1WZ%|GfcG7qNI=gAAsu&X(1Cjp**O}!X{T~0w-&cCs#;6>7N(_+PR*pWd z0mvfI4BNYQt<~}KP3FmzP4o@Q_nnQG{sR-kPSQBnNF1C|9>Mp`&ZhrUv4;##%1`Yz z!<6)Olt)}j-Zd(ZST-R+C87+zTp@I<4g%7{U2`jeg_pc}qY~);1x;36+!(jpR95sK zKcM_6?+M2&&s!cZHtbuB@mpe^#93arTa*KPIycRlDRBJt!12_az3FO=ar|^CO6t(9 zTT_wk63>pNwr)Knm2K3HG|Rk1hw|U;-|Wv8$mdV*)!t8XOUMTf*v>WPA$HqHJD2Tk zgO}OF_HmqN7$)P5Htv=P$2wq}mg_UmP~h&vnI&sWOdvDJbAq5VPM7C(N>*QP_pLRk zrc;cXad2EUWMk%Fb-c{#$4Yr`6C>uFHHPZ3=1>jYNS;1mm2-K^ef%+7#qBI||3)e_ z*mFA|pUs{wHD>y3 z&VvK#L{DMdqw2Y$t_M+pz5-RMc;T$WDmX$v%GHg7OV#~|-b04&N%3AHb6ulnK>w`R6sXM-szfCMlCd5{$3hKTrE1Hb8go7-@8USwFm^8)01AhhEc3WQHj@V>8Yu0x?PhQr0*SV{>Bjx>gg7LF1Yz)Kv?00f@rfch2O1yGhph%V1 zDe-2TcwW{=Z6lsZFj!*Cus005W0z}}ROc%~0NW8lW<|EaQ1iD5tj{CE;(hf8-$zJt zII}ZJ(C)Z$I?$6%8DXYbvZeim08!l88Z}>gQ)Mny-sH6A>ZVnno1HL>>9H;P4wKeq z-QG=>lFrRlOtU@*zkuWHyT%WxG4fzowx(#WSjnaaL_ERp!&g`y6hrO3%vlq}fr`=q zg>!>GvWGNKMr6S)`;Mt}xLP88n5dqpR~ILd@k8Ygidw0TgL%Uo6jpGQv-9!2|F)uX z53|SQT|dw5fV!}m?PV_$itNVdVr!ePF84Hl@xGYJAJli=&%Cy7NZWa}WYYDNqyOer z5>or>ROem=nN_S?4XFXEhLPSX4_O-rXi$R_xQ4mw3ODjyfrZM`YH8u}eIxN@%bBP< zwj3no4p{CAKWBJ#H-P`#x|h$P%Vd(-Kn{Vvk9!yE#q0C~)5U-g7!<+tYG9~Z6zQrF zEF6g1mSSs0#W8?yv8H%d#c?W@r`&UZN-Qd}<(Z~ujp*_wLn0cm?6k}_#@BsgmxV*< zXS))|r@dXV9v8(5@sZJ`W3j5VvM7^0P`rHD$&AsX!}Jft&V2zPLU4;*0C(s3a(wJA zN;jijVa(W#anqewv$vXRdUuZFC&ax2&41ZA^tV+mT^2pp)ZAv`+aS9y?l~Qbada`v zs)bN>1{+e^o|9v-j;}(SoxGmJ>+S1c8tt{1e_Y{S9Stq_-`rD1ZVWxf+(Cx)O;ZYC z?Xk|{d`ls5S(F@*yC@IUK<7}3ovao1twPqhI-HqXqeCa6ieU%w$vChLg}$)6URmc7 z`vAW_GI}aP#))>>8CO~1=S7Y%#3N~t<>*^yK$R%5`7!J9)^$rtH}W4k#Uaa!#6+Uba&CYBV`Uk%Q6#Y*h*+0*IPS0 zeEkA<@Zp#aPvNJgDkk3i<%(w9d#|e+zf7oAaaB7^&!(ZRx)qC(pX5M>UqHlGo0L)P zE#sP&`>=!(p$w7<4^fLZ&x`s4Lx-|H%r`rMae=L49N@Ssr6eP!O3y1HzaWU04qvEaI&ro)61`A>jK!j}r-WL*_3i z{XN@5IaQ8*?Q?|TZok)s)kC(Cf?Zs=6XshiO``K>#a;>xv7bjFO!*YFAInzdsyYQK z3WmVYStr zjb&o%KS{*&QRH8~q;OqA?eS=rUIuj54yFU#0yNdf_>58bpmOYxIgqP2p&w=e`<7`; zI!x6=S=xr+6Z`qd&eAoP8I#3>>)ZUb4_~KtpU=nqcUaOhTYnSb72e@>W!{!p$wgkn zMXpRKUn=En&M;9`mDhS$7q8(S(&+qAP~Tzjo_Ya7#O0KjCLYP@ON^*~cRex^6i19w zF&F$)iIV41w@M;6Epkg|{(VQ7e_vgik&a0lBKKBCQ*SIw<5nut(Ibs5BoYBunY&`Y z*N4BW5!+#phM3sd*t(+Inigx>&wA!cxbskI%6KF?3}xv~b9)us#@KWs-9FPjntcd=WH+4=EVw=SAz0XJ{9Y z__r$By9HliEGGUX?iz7P*D$#{3{%Iq9LMsVzhlg{Ou^tMbeO*3hOim^;3erLHWw|x zTy&F&FlQ96i8hqTrm>SWX-G^*XG4?onu<(tC9%;j1n`tRNHJH<`rsO;LsP94J=7Of*{G=PpcBr!)o^7__NoDgC;TCZjRaZbRy38T)C{va+0tJ>I7|3@Tg|USj33EobPj;yFt6pjoQtw zHwAz7;D)q)=i$zQ>}r|62d_W#L&;ZfIST3l7H#ABZ!bQBQC-`Fd z#uj6eRL%>D{`RB3GCZdOss$T~kMa-?7kQjm$?pY&0eqfEO%;A^OVT9hCvTQMB7F)o z(~Y{56iy^*?l#gHR?O#ELd0dlI|RqD(vcPpOW8sDUyCDMLC0|!%r(QmV#&{VzISA1 z$&&IctgSHRAl3rrYMX}!lh^b7a$CG;BPZF}-Nb;>5dN_O4Pvu# z)TRb)qvLOEsp!uiBkm+oRCp^j6`~o6YQhpd(zUl0*dfB7Q+kQF<6uN-=w^O@9kEDB z{E$cNpG`cZ5)T)6%DGJ5u(GD5L%VV1TO&zI)U208LIJ_`kC^x|3Qp%e=6U?;B62~z zF!2y)&chf$Eys`Z7{>mFbUV`l_v(*b^e{tgGY0wFS!?4Ongth3VYaw6eZ3>TUPmaj zk#DyWe+!Ab%TKmBZJ&~{t%HD};d;d2pB}&aw=!mq!n9Gc{!NTGAi7SduFFQD@J0s0 z+}j^hbcNE{yJistRB4=Ti_eC*4^xG#Ru5NI*;M`clv1iG{=Bbfa8^BB*5J*uLrIo`r2Iv&sWGf z)#knB0xh@#y!s9;cm{X>L_y97X6aw2I{Ostda+PFqmp8JmFEZeyjXVlFN}$|xHPjq_p>Z2W2F>nk-g6c9q2ac ze(4eP`$J3AoN&xWAT|-in5+&s63z8e_1y}u5s6NA+T3PB5jc`fO}{Q=8Z z;NnJp4(R>)$zv^;d2FJ}o~@V_7i4D#B&Zp7LtEB5u;%vwaX^m0{7?stP*r4j2oaTa zRc-a&0jf47RK9|6)Y0KcQJ~GkRtMBl_(!~GKB<_Kmg_ppib3gws!o8ETyfh~G-*(V zwnZ77m*T3l-c9a=JD?j|m{dm9P^8L;vW?}HbQhnk(H@X~Li%($uL@4oo7^9hp^E=Q zSf+2vB1yCk1+?%BbeToi1{N*a;V$zmy&PxmHm`IX%m<2wLtufiqw{ik`$?s_RBs-g z^gUH};8C4c7pjU*tk5By{_1uKqhOg**V}CBK%`!3PH~@IYHGG3Yym8!!I5_ zjL7pVD%}7!z4X_hGQB36Jv5h4f4YjO8SRG@mi7!3C1p#sEcH*Sb5%K<>CUI}+ffI5 zJ6&WkRXIH!X6@XMqCr$3husiqzr@w~NB5_YSYk;tj?!|zvIS`ovyU9S?XW|pF?@@9 za<9Ws72zwGs#;TIzlNPbOBe30DNiVtZfb;Bs{C$QJ5YnysP>3PRn3I|G?i-G8i+2L zoBe+9|Nh`VlVebqTiNWxGCANd>htJc78th5Avj!&GsQq9jV;#^f|*T(&^leHPO=G0 zsh#=F#Y(g?OO-&DeH)fJDs}DZWUEn~_B9ow*c3NNk4#S-u2<(1y9#=?d-&YRO8YLd zG`(^At!tHrw*?~3kDV}y?4Ua}ITua^W&{)m3eo4n+Cn`!w7OWgjCrqCsh$0y`;O+h zR6uX@*}Ofho$0M~Bv`)TaM2dH%g!C>=ay3=4uRtjLdH zKEbn!QXq0X0X<m!|&J|Nn@}sLJM&ej)%`MF&i5ELx|e3*cpFJ*=tuA z2~sZC|5Ex};HfmwHP+$qJ%9E=!}E*}8lS#RHO-$jP4zY<%xwVI;CWec;TPSQ2U&4c zhkyN^j~K=Wb>G)_&V2lCSm0(q#@x&BvK3~R!dz8STl3^TEGU>GC$7JzT35K zEQ7nvh78N4u!(B`)p8eJqg${T`TE(6|ksMbn+fV&{;Ok+Tn zRAq%lZm(#{28a*O2&{@jDwb25~ zc|+80tspe(is0!Fz6UbtDD!~BiIBQ7VlRX4E0Tu{*3l`eD?YGapx&!tUjS(hkF%}B zsJ?vS#7cwIjvPN(165@%Iu=e)T4|ycq&eACWLs&vptDYd)SEMj)i`^0ZBm|IKYO;{ zgjsWEs^4)d^Zk?SUC#=MPUk!&n1tsmQ`Dx)6qI07wOIkZG&okBHETxI370l+J-y)i zi>K!>sJ||9X7jaI2(n-b`t)JxDD>-7&?SNw2jm$6W`_3=>`TmTbZx)nMg4FTz&b1NJn4Us%yLTg#WP80`QMvK~Kji={Dkd5( zUE+zB*LQ+UzDXk?GLwJ#JvhUEGomP=HTSf0uCmA5qIeE0E^pQ zY1^Jv@;rdELMKC+VZqE9N{KW9ce~ONX-zsQodLOchqMKf;|(m^%$uaQO7D~|N*|Oy zCVdiQ$1g~qlfEGRvh<|%G|CVioyU73<<7|8Niyi9Oi;AB&{*s0Q0+EmoIZ`HjeWJ> ziq-OGuisL4-LIyD(*#bNBwa5_8IU9J?nRQqvJ{g6z;9Fd>%s3*alT)NUQrdQ8Lc3g z3xZY{&asmT!_cTQry7=`{6I2PPfs(KWXm;Rjn zn($x$jiN%4|CYV$%j^|%VZc6n`4vTE`an=qJxSW36XNr^&7{Y#V+`%9_auNo_P3ORxG{)F_4Ilfhq zi5=mEu;&gRW0uHp=*YH^#CePDMU6T3*{0H-#~$~TD({rspX0*s0F!Lr4l(tN?b!_k zLo~)68u0DNlg#mK=&xbRg?0VKV)@n{ek>}L6(aZ|yD?f=`KhRQsC^Z~*{>S5ElEWj z4Dz}uJudxMySXh~wNvi6&0MZP2C-1`p(8E}vhyBx{&B}XgZs*lu=XE1ws`5KBOTcR zD_DPa+I8gWglSGxWygKX-aH*;JXD|k?cG3)A_sEO2s_nk&f6i)b}qy-~V}>d;bgf^>nED&%S#7eS4@qK@7bbeg2E3MjY+`5zOYlG^YOpTmFkn z9OgoK2@mRp3!ixvg^rVVOe^TdsBZH1PGdUZ$?-wRb1Rv+}tT#2zNT|-0JjrE`Ba% zo{=+r_g=s!-jShGaD2DIClYOKn4|L+>E2y-#a3o^W}yJ+aK!^;WMTb7$few6lH)H8 zT@-4@1s?Np)<}F}IrRz0B0=&S9F0!RQ?FSM79$`a|aZY8ykne@tI^V}U}s(Ghxc1=f2M z?aUF({yL($gNT%I<5lMY36F>8CsJ#6Dm;Dn>3C|^jB1)cb9iaKO6r#{KT%(*_~9LQ zt&rur?udN5y>xim(I>l-RNzV-ft4C&0=KEE__p zpS9vlw}uu;b1BjVsdS#zPi^O}acbr=SGQdP3Ih+P*%C83L+~-IHe=S6t5>fI|Kvt{ z#KR7XsmVd&5yU>Y%p8jh`x!LeKLe7KEk>SUzOv<RAvYc-*OffK-;QVx;T3qh5 z+wkv^y{PQ8JDv94RAhbz+|L+MhIzln7_e46f`B?Se*2lhpE(z2-Wo8Fu7bqMd^Y}F z=Fr4EH$q={X2XIc@uJ8}b`W+J=8)sM-9ewD4d|Kp*-8Aih;+;Gaaml?5=h&7rMHwl z(1)N}bKVT$o#sQcC4gN!!y6_;fbgK z5*EVjGFArb#e?1wf5XEnve38A1`C7B(RbnYalsAT0TDR?rE4q`bdPy|3shh(BT%Ve zpCkDPSyIw0i@Qh45{5|=jJPxG3pO6HKHn0K_Nw~lA|CcH)Xe!_y~aq+G=aoB4peg4 z*<^97#CO7M*2w)cfM%0r>^g%{m+d^Eec9u0D4$cQuP2!!8~-fN6G`S4F39{=MtA9O zNpv}4=asa|GsBY^)y<(90K46AMYmYrgkqpM5cgEf13!ZMU>UU@!~9zvU>bq0=sN2O zW}?C!Qtr70y=@U5)4IIdogu=9)FW}4&lYE}3*%-f^ZJ6{o+Kwo;2cr3KqfLZCrk>T zfuZ{KNa1nxt~7v5Vn&pJe=63J8n>S zJKRA)xSirpdHEs?4aE- z)P*HQhtD)ikdF7@kA0%L!e&@RvhJ~f7}T-gS-1tWZj8$nv8%oUQsEju$CZHkJlkXA zHxTJAf9&5z(Z(Z>Y#l$|iJ~?;*@2Vo?Py~=iaKG`IUYvQ7JO`Vwm=PQWd#;K1gsSP z#?npp&`xxGdkYHMfO4;}^NsB`6pQa_hZ|8ChL1#&6z6tD%n@(1m2V0f+BD0Xy8_xf zTD$L)eyFrdCPj=Ttv<3!M|R;kW=2PLF;+1}gefE#2&wl4+qjA%{(5l=2mF1XF&RUU zke_%11Cn@IEoi)0ysy^>jb-cN_SP2Ep>r|Xx(qtXg=lMonQJ$ITiaX5!!0;{5zWKx zXbWnK72b$8;37I6ZEauKXcN7&bpd{M8Onk}wyy9?D73Tj2o%hI!~Vn5P8)c|?agqu zf%i5T8;5dwFzleA-6E7AEICY!a!W5OL?QtViw7vOqzzG@^cNdzvn(B;vO^vDQ#ub^$P1C|U zka>8#_*FpV#5Uu&V(EcpqU*D)IF{}!m|(#%izX2{;xpU+9n2<><5M#v$}?oNHaFTb zKPd>~AD^cNy(G(*_{YCENc)s)2Osare~lllgEo`!i}+t)?#Go2#xx8zWnP7%O*-o= zf!Q4Mj>yMH?|zucl=fzK*0)u~qZ;u7*QriL6ehhz!*K$~G5=6i>QiKHvK5=YLr@|r zLCrG#$=1|cpt!& zb!o9USQT14CQlsnSg6@txAR|HM#a}P!>GB5@7PXjtJP{dNf6AP4y)Dh^sVqQnd*Mk zCRM6B-ci4DwrW&lUpFixs2}e4`|n(f)w$;M)^u|YJ~}gNp###%astbB3OV>9{GT!e z^vvq8wkh}eb0WE3YwTUtXcN?^SV7I#ZDUJk*QR6nb#`qV%erk<1FPxQr-GaC@sS(S zknS=8n)ZmN3o2`Aue-^uATjd^XbmYS^_j`$wBt8wvrX6c%h|~0c21nwR1!a~SNoL- zw~$Xf_gRVYxvG|b8@C$=VXjkK<4VP zpD3FrPW&VzsE{Q(aKDY{H2f{QfVzih`2>5zhYGn-y!?-`+&7gr$g>w_witL<1$1p5 zGdi}0*ULwDezdAz9Pc1|ZK$p%3LNuHP8h`jYp`O~RK;>EMMZ?1+4WgvVwI$-+g@+t3_jJHCXHjK*5>3$ZZ57ar1HdJ=0#Pw z(noZDsVUDUc-M<**sRkkbug;Np&!GWmOQt9^NB+xY;^34m>-Pc6GdF%nkHZ`?2jb{^!_4aHH&*HgibuPxU z+HA)*@B{}KexeL>#Mqh_KG|sLyjyys^fu{&^ik=n(w~kXdhfk|!Y-!B_??xphR30E zmy9<~vUEbizX}twakDZ9HDr#nV-9jEb}9Baz%qCPQ`~4bbof#p$9&Mke@`tLQxF2L z32PvWn6iZt@fZ+K^<8JaC9`Wot~k5TEPCyEZtWf3C7Kf%+{ERt4rS33Ce}8GzRE8D zloBAO54EQ4Jbb4W7v8u2Q10bnrZ(8*Nq^%RuveG0?_YUX>EG}ldEMt6QWLttLrr=cCz zGp^Gc@`pe{zD~!W`S(s`_t}BF_|8H5HffFTEe`Kj*XZ6Iia$cHVV|q3f3EJ?zxMp< z(0+s91N(iM`=@|zo5{NjCu&Sf?|o6gNN!#4RBUA_<30*{wgq<8`fl8+-YZVh{n&~O zXJIT+8BJecYc9kn*^Q-jU>aW*S$X2gQFi6DJtyM5PFHD9p+sgk9Ow9 z=^MR%#YlV>zkQZ_(v)M?YGY#7GJ{c}APdBmB3`Y#Ypl17($DqTxqagXvS|15izHFxcss11AdfGG{~hF2 zsrVhx{_0Dsc-Ro1a475q{5SReDBP*Gs!Vr;&!V&~aSIO7P{A}W7cu6hSUf-1$A{~k znS8Etox4*MT^EcMO7(k-;zi1d(mM{qU$Gh(Ta7dP?c-~+ovHP_Jr9u49RajTR6Xzt^h>H?ggR437+y9vAaMb)Oqk(Vn`Su|dAt_4A)^JEfhu;tLMwiS z&d9Q6$TQTUM{BA<)n%#^n4v9M`}N|QD7sFxqf}EjaU5>y6+`(RwN*L;x8C7kTvtOR zH*(&AUy>@q5)Bkxk?Dr2zClB11}H{3f@Rja8qwJ`h2mv}*6wEsVU3EXZ>W}X99D#i zEz_oqaEb`Ygx{2W1sG=86wBN2Cg$P5?Mf-j%guls(8@EXF`S`1;qy?U6@5(SC zS<5j^TbJ8}+O4`4fO@2-hmIbq!IHVM!+&%u0i8)9D1?cu5S@}W%{1Y6RxvaqEg&np zW)gT_RdgcDYb4Mt&!xKG2!e*MQ%g51Y)vTk)>SEFR=J0OGq^lq7+YQJp9r(f_qo~b zH8X>)p*c+F`Iq5a?ts=s0H$f8bNn|E9l~HTRxmXR_NL=#4nz3NI89^4qW_ZeQ>tr} zef1dOm@3=QursV9%*|oG6J-_``qap77Ts@TE)A62x_i_w?SZYcqr7ey`EYPOd(#(|w+|Z`nOF5*F zD>Kg?F<6*S(5BpFH*!w&pVj0g8UAS(>W3#}o51Tp+pW%3|DZU%F!anP9c2~=NdUaK zHc2UT3zf8GN+)Xz#}WpL6Le>z+5BwunMqBB5@1LKcd&_2F4YaOXZx%+93*H{W*ggi zBr?JQVZB(EW(JtbcEzDyo%LrgpdrO1z)WJJZ6&AsPC9xgd-M+{quFl2pnZ~K3$+rd zMBa6aiiagh_O=}ypUr2&h@PkQS)ZF8+-X_s$R!Sa5sm#!i_4F1p3By#c@ zDk-iDt9klF94!1gVfhQz5YX};6U14tBY)1T&j%53A7mpXP>n}rnfP83Bo!I@z83kl z$$8CkRE}w?I+k`fNJU;x#gbL5IVI16V2EM0AS+hVt0Cls1#%^p$p)cEh@v@Oor0jJ z$7Uz}fH)efylGoldCk%uqlAiUMYSpXXoGThUhZ$m+HBtzd*1_^_JCfghtqMxbVEP# za7(VTXFKFJ`$+H{Ij+Zu^ftfPP#!{4$4i;2-Z@+Dds$=J;x#RZk&m$SF&`Sy66QujLN7$-Jz! z76mlHVoTr?tWc?}%Vw75^)as*Tu-t6lxmgUef!=x47 z6z7pa`BMLK4*l?hy+9ydKY|I7`OzMcD$!8EVIh!yQ9T;h=F9H|k; zDq1dCx)-Kwv^1SrJDC>2buC1KX^LLh%bjt>J`4`;MN)FK-9$H5P~R>REsxCDXhzG+ zQPa@d_qTQ9oGb@nfNZi3Z}yC za4IBO(yljzHS~n5g$ZV_#jLe$A_oMMSEH|^J0lZ0L|`VoLA)9HN3uvvS{DCD_Ca z-L#=*-Fw0{d5Jv(i?5;8T zL0YrS@ElgShgd07grySaIfvmN=r5acqUlMB{vT{te~|puhNHry2;{127!OV#37jRk z)M(4Fe65{;-V9%9@)1YY>_(uZ4PW^MFEne>0{jB8Q9pcUJq}^Qq%xvBtCe+Cc9vk} z0#&41+ExQgpQjp>dBhHW%u#|y3V(0+&@mC4FRGc5#4s&I-3+MPO`uV}S$Ypt~Jx_7TSKdEE-s zcB*lH(ZzpwFuiQmcEl4{-5`hNnA8I%2p{xBH zd%6nk1FHo`XQp^9@B4Oz5o^cy)EL$18ym#M9XrWs!>d1Dua&ODobBHM<1&!HMXDwqQ zNQq}yv#P28uLPPenOPX54*Zv{ADT%$>pxN)dXi)cIXwYuzd7k%=|SM%yQKF^ACrC> zxX7IyV5Nfw1r`jGBI@BPdN$9oYxo8M3o}(fr~_H7Kpq$|SZ7#?+yfHon6Fu6H8Uvigp2wf|`jp z7H1KLwDsdl++KNa7Hh|3b8TqL=p2u8`i=$vDb!Z%O2wvzS~CoU!FFNctQ}UVslLs3 zI(8szph{qO9RF>qN!535u!tr@HHGzE9k~|y8z0S#^VSgW7nwgOW`X^f^tiNhAnq6Z zSCH<$v)hI24|)%*+MW%HALRb$0mqkjV+{TsR-ky|RdjRjTJRc4M?G4i%@4hwGckD?{ z!G>+@Ri`~1#{~BO=M1}4zgrEvRKI*JiMsh3<9-|<{e6*RV(70I@BTwqAS`WrYpc`Y zf9RXd|7?RSVF*3wSW$L&YpdPne~+-h%%Tt2&;uUAc+3IMU4Tv6EyJOVewG=HgIA!} zCpgV80DGpJF${ZLWpy^0#+pU){-z#PUC>1A>Ev^c&-T@=^3ivYfzDG^Z{B70v#MoP znQ6_P_o`@A#T$xj|0*ATAAw2Qtwx5GO#PbgU;?hQD*Mwi7{dEm2{5dn$fAV&hGNmf zneMEW`dgRfpm`7T^B-O*76=|ApJTB{vZ{AcIXwWo)>4cGU1x!rk>JL)ahzh|mDlhP zaUuLgnN?{Yw$a0!Te=MjfuF-Pmbumz5(*BF6pM-mrTcS{f*#Ks)|o=599!^lg5}-{ zV4c^5HRuA%D$6y+7OESA?)o6s2K^+}JLw=vTb;BAI^envI&Xhnk2~E#0%}XQmlRXz zo_%xBi$_FQzOemBlLE1RwGyZ`-;I^9YRL^5{#jMok6mA_1(m7_cWILZ94dZ$pWb;9 z7A$FZxs#@yo#Kb&dN1*Gh6w*lzGDK%F|9QI5lb}jM%q~xO9G()B@K8^j2dl)@UL*GXIG*QJAo9k1(s1Z3(CI^7ls(Xty@w!Lt` zuKCp_fsT?^RW+DbmDruE%A6-M+>I60Z>egvGEt?#yriiA{hU+Z7jM8h6&NO%7HPcf zYl?QU_%*%WnGH|vsk3#=~xr)Q#W@^A6 zjE7YmS(&$?mpJ|t$ME)9Sw4%;9n0UzG6RpyyxamMWCRa-K)KN$M;U{aDFQRk!HhFZ zNaCH#sa(#IH(bkq@abW?K3(`odI_dpD0nl!H*Xj^IO7b^KEjudrYb8y%?erfAjZ5B zcMf^_r3l`pR1SYS*t(?ZpzQKTnwq`zO zVtladQP@qoDNCEemJ-o%Lw#4ETFMz!ozgt@3@kR)cd`Uf{|xh;Y{&+#$fE_#ly&W$ zXy87hdfJoBPp@W-Wm2L`qLXMM= z!YsTZ-OMtsmXSyfaE>17dd#ECp}y$Iw^jrT@fFtxIME#>**4olS0DUHj>Aldam4tn zrT~|ZPzEIR!mjF!Kb#jT%QtOf*??(AUZ(V$+#Lq@)I@)Y(Y`)d9UK!V7g>TlhDuz{ zwS4K&%w4K)t6R0%jk6oGvm3JyknLa4Odq*Vh+oml`XL#>&Rg$;qS7 zm)^aS5gu6X{OVwJ)~U3PT^0{+tTdRv$q&BA_;FOKBAz2!nbCIxGD4qP%z3PoG$*gi9w+9Ziggk@-YHS-#gGU1O26%^{B|6gM1ekzrn- zqkplPa&c?xDO*2&T(_^XTr6yVC)(QR==PSK?c<}JF_I=h#=(q+0Hy4AQv0 zuAf113_@XOM}^H7m>^xi4YNsACkrYagmaUgOwFl(q!5+VwJVRC$>Ta9KU&I$2{T8m zC>-8L$N7;gDB90byEYp-RC8BuqKfHxy~}dxDj#V#`~F(k*}((%B;++ z>ZQ+A`S#p=&w4S!w!Y|1WLAMQ-E${f%8ZfMz@i0t#mt~O60Co?|;t{*} z>>%I_UK^HS+Q2SrA7D5upPk*ooEc_zb@rTLkhK4QZ$xBdR#sI@Z5X8Lc;~(U|KI<< z|Nr~1l#MGYAs-qA&T1-3MKxuW&Y@bibVNkS=3B@|ELEfqM=mV$*zTtYs0h%SvNB}J z4RW!8D-H`+Y6`WK#sx-n5@^42WpUz0%VHl+Zm=+R zGjdRA?7_sSJVFWQ2-|Q6T@ZCK)FOJAox~W&xJrDABon~zUOu4Z##3ZjF|=3zZz|Jw z&l-yC)mveVl4MuPwGka1mC0oj(Rn=Ts8v}eP0dg)%C>TP)zuU`oUd5QlUR7_7323t zY`e0obS%^%m&)1_8b3_Re^{Vh1P31C5gl<^cY4;1etod*dvqmoX@vd?ScUeZ*?s$yY86=$n`@jhZ*9A#e@3rFI(pI~48 z_ah!Jh_LR^BHjWQ46d_r;Yh}7IDgqo%E^tAKULhnyC3;e<^ARTX_xc;I~zs^1*vml zxxfq3#3uHhRFWf!y&GQrf2pjd)s5S3xJ}vZ?ug%n3V(T(_XwBRIjFS0(I=QSI}%MEt4brw^%SKgaP77x!XR8 zk#0AWAxv%eDFNp2xc9Yr3}F9Od)_@`C?y`(en08|jFbJO+M2f&Th&q+h zE9AbiU(2;0xl^V5pZ6zss(?@LN$eZfckIEYU4zQIzQcT5nM6b!AFySG>L% z-9MPE19g9Yz7DDZdvm4aJUNn&u?$I>DK5!IddaZI5*)|z9MbXIwT(xeKfNCZX@YJs zJo}CN|I~SOL(1*UO6lIzDvuL_a+pcyRfCz-m-Yk^{`84B^)id@C9Yxj zdbu@YTeI`l$5i!W*21hFw&p$hF=M741oau?WAZCOO$+Ac0?j$@y2o7_x92Q(J~(DE zvoc#TnRP51@1^29`EjE{B@87#NP&n{jO3wOs4qVIX}-EXG*rq$Fi>0qjF6JI`= z?Vx6Q+5|mqNXMkRfCFJ#!wozJXkZD-J}7BTd8R)2M|fd*QH@L`p$Zd z66RRduxjXx=>}X_4kNTtU1%)z=6aP`9Rn)c^-|p^*(C$cw#SI2*FP=G+rq1XDdjaq zCoY33y}8<(s|E~h$5>FE>#c6W6p7(ZIWuKPKi*$%*GigcYNc9xxqn=DWaA!~TWzI2 z7xB8Bw_zF2w@UZl9M>a54&fcncbEq^!TKo?npakJQ&*V=72%EY{vx7ULt-DM28F*f zsuuwxS7l7?;;znQzj61?wV@%l-tjrN;ghzR_A6oPErG-tqzOL0W^pln>Qy8oi;Vksin0)^yYpe z3^QspL$_acUjBc!)|OhLx;y^zZ%}Fp0*ii{H?zVcBw(1%HgZ(DND7gib8{)FiF0XJJ{ZT2O7YmX7p%s+l?I^X}|? zZ&^t6FE|?$y8YnI>9!c%PU(;~ZbGxs9${K{rM&TxuPjgN$rQcN{|b5Bj5Kb7(eR%oa61Z_qUs)a!;8l_HHFjCws_ z4|rt{T3UY8yx5c1KEEcz8CuH|s`e7R;znJs{$Jd*iyp!_FuKOQ+B5xJW$J(i6+`1gLf4tg7;{W3sBI&$c!7qCl<@<6O8lsd^S2jnuQ~5p-6>Khwr! z`a$U#>4&BN`mal_V&i&G31jrYNxYAC+<(I&4tex~OOt}`Z*5)R?os@()#-d!gna=~ z5+9!s`Lq0~h$OL{wxfqg41K|!()nyJpSK*m&FII7D!{O{fJ@#^@U|sG5?{wg$q@@W`ea+U>l|tmZ~$AIG8of*&wdWR7;^{8g@{sHH0}~5{LLMj1#zjnaYO= zIV{uc{2djlVaf44r(}7NZMLGQW!ll`8L*i>rE_l{xnuu);Tl=aaMV^LD(RBTBR?OK zHl>r&ZPInhadcbKqI3lMkK3ekAcZHSivlNd zqb->4=cej$f5Ho!TKY96K)3*_c(z3dI^yq;lo`597lZ~J_h_Sltmxd4l5N? z5v+p_RI*q11VRFVriHW(PoaUf;xXBcqdmXa?P_(Knp)R1K^D~a6MVA8CE}wz>YYw! zu3rE7F#(PPK1+VO=8EzPxQ#PLRX)q{_nwg6FMUY*nDnF4=cF&9#WV7n3`QnZ!@_mU zPSEAw zGFrAhx4rDE&;P&-EI-ozt|scrXtGOe(_ww7WIJ zJd=V#c?oN{!_u~NJIrn$mEIw}5BinopuBz(%IkkXB#DuZ7H#-gu?(jc$>bNjcnbBP z_$%=?DZcF&%12bCU68Ef$UX%uo?D@KQ1{bPVWJ3Y#ga;&RiMEB+n`WlRVXk$^2csff>yn7cjR zmhuL4ct9KYgOFx*pXThPtB}F1`!!WJzzdhqI4@tnc&Kq`f|rHHlTYr!3+Lvb_WS}Q zxv&o}*CGAJLpRJzWeP6|Hij@89cSik(MDq?%$xEe44AXwx6bO-F_XqvN%P)Z4Cdz zv(^}D4XzO2*l?n9C5kLB$SVAkm84--iPJEdIwAj%3Q!$NF5co)iCcF~eY`BH(h^59 zk2&@*WW$FKo2d&lnzSDz6_uF{hg8kR7)7o9#s`sZ0x6{G+;S-=@ICtptthjlDKd+3 z0L^g!w>=n>-?-2|F`d>)p-m%is?7Gv^&px3>~uQzQ?1u8Gv&4a{MvseYh(>Z+Z|rt zj*ycwx`XxFIrbFHG)~GG8B&evKt;feWoW)wbMDJ%}QYt{4*DIcXic_v|DOtP9F{3wm6kf z$vN3`K&G0@32B@|{Yw2c6OK_Yz}c2b3>UMq)`P(~4j<9F>^})fRL@rCo_fG`s^zVX znVmOp#laV>TBqT-W+uxsPY>>XfF@qK?rp%MtvB!7XOV@_bu72w7m4{FlKO~pI*wp7 zK>{m~m(v2H(IW4+adLX&oNrX-D5vYNWff$4J5Bt!?)Ao{y7Ba&EJzgbMtA8`2d&=G zv8{jumZYR1)C!dADUu8btL~vt)i>*UWEB)jzA=4TDeBX>Ek;k{dYp#++#F6Ju?Hlr z6gA2Yzsnkx#b(7a)nK-ZJ`;z4+HL7gY1@?y6H#pKAvU^D?}~u^gBUu-^7;@|ZJkF) zKsTdOGUUr8={MN0_3yaDG*oJkJMQS~dS5qTLT?#{iMJK~2Mt|S75=JS(oId_@35_d z-#y|}MZZma$Z*t3N@2MEA^!Cjd|jcBiFd1p&0hgKMjk^5;|#Qbqhrz;=}zfh5la~u zC>ICTNO-SEarSUHE$|QsgbSj_Qq~2_|655n2&JZ_8>XonRQ;zTPD}&tH+Kac>K{8+ zI(Dot%Xh#L?jPhg|19J25HhEyT=AQaPDUL{Q^wr<)bukVz%P6ji+KNA=;2#XNdf8Vrh+ropVJFM}! z$rw5hD8FVKR0G*5it3xTWx#ZS>as$8(>Z(kv}Kh|KMZ|51a9os&W&QCu1JOy@=@0D z0>Vl^&aqZ9>)c(vWp{i9@T#ye(8Z}P%sa?fU-`?#(z%ObS2the;<2{Gceu#so93^N z&ln2OVR_7K99vX5vW7r$oSf6 z9JJUQ(rM|O^nmnU=>t42*6Y{8vB`I?kq0XLu%E=N-8+5*n&}ATE~g4w-$TiNO$2xP z{u|cLTCV8>2lRAd4|RWnhnyN4Z}xVLH+yUx;u53x4iGRey%DXhS_Qv15o-%Q)X|%87g{Lh+uJ{aTkm?k)W}J&{phZJ0<>L;8d(?C zfuU$4uvWjmPc*j4b%ALz8gT5G_F!Xk3@3D4Mju7O3Up422nksoqivde#&b9!P-~`l zGzAJTOvq>9Z&p4?6(X#l19p;*zq_jwI`ofajg(}0TTzH(n|7#clR*IMva%_wrmB>g zR<>7GbX#RpWVBay2gvBN-Yx>F`-tgUZ8tTaI!I21*o3`ZaS4Zl6cIX!Lj{ZNqv3eC z!JpVo=R`O`GKI7$a!RJ>c2HgWsonW|-(@+m6pI&eKM;$&#XSy=Wvkyjz!=bSgtX^d z=&sGzpOYa%cnpe5pyE2=3$S0)G;;^zddZ(u6-$5hRozn5cQVIdhOVG5x!iHiR-~E763iQ$i ze*EXQ=2EL9yQ=ES|GOTPl=3~|#)Rj#{oztcE|(v+eGuHDZ`*G8b$T?u=lR?F zW|+%lOP^VAs7YOFoGd9`5GhgkrunV;$X;)p-fk%~^;xpW)71F!WT^}kyva0`q%4~s z;^}?HG+|<|m`6BmcL5oydTSw9L4n1|6mMVs4{S!6(Jh&6sHG6{3=UIAF@Os5FXp#y zn_ag9GCMrI9Y!O2298M^2|ppRs2{hpiVD~L5pEe=rGriETaOU!N3_RrjP>|=Lknd& z)Qt08+`45K&YKvsC8XwgW?H1F=_Vh{g?dHNehOj%|}xeQ3U*Ui&DzMDPFEEmM(?gfKJ$ej5&@bb8c zHxV@-f3ZNe{#43RzK@P+FYpzc+@c_Druj^%oi^5+(6qFn${;?+Wk`OMS2xe;;ziH9 zc*%7yU3&_%GIgFWd+`FR%1FRgCkh{rqO4y>na!ZbM6qQ1)64MkF1Y~>Pc@rgBf+HP z;KQ9xcV{%$L~IESX50a^q)llJX53=D6Spxl;FyW#6G!5`n1`(A8(OnOfMJtz1;m2D!?#r0=}@&1b;B8zcDq!a`PCFE z;`eO$bSto)vjTod@gZwGwt6I$p`C0{kt*a>Ox`hnDt0y^&$lHg} zNd9F!kcD851lGH{U$y;r)!x!p+OxF?$nfp2cHd%8Kg@aQO)#^buy%}pXyAmKB={$=J9aV0k#`0HZg?=xoD(SObE+01caEZj zwb^#$+s{ToYsmS2UQryuW~ix`Rl0g+l1V3!sruyzxZEQA_rTn7o&a!vhB(M@^ktP^ zhf?ia#6taVMl7duMg}~GP`8$)b!n6HeLh1f;^?xa6s%+%0!u7!aOP4hy+mw__fZPa zv%~ax5*)mXoPr*u_$4#xeyFmbsBZ)ALMTJy;>A_aP%O@dP)a-?>=CN!?{VlBBSlyH zJyltdw~(_=L#11w+VJ}>FnJ|a(!j#86ps5=Nkb|@E$&LI(0^Z$E{Rx`Y>hh`Z61-) zFmaRR?nh+=lXgj&Wf#M>G`OpVCT=)RJSn4@U%8K15^!edLW$5I!y_Wf1tgDgR)(A1 z-;Eb%3`Pt?B~*(W9?VqlD^KMJ2?HBUL%>S1q+PJ6E-7 zY4*L0$%KL4D9kjNqN-+TH1`qllUAq1PhtaskDf0kq^RjBbovOxE@-rXRi8$h8V7+dtZJnA@CTvR{{bSkkJ0n|-pKVA zIBC=9+n$PGKkj3=G8rxR0D%=3v>)3gvcd|sdt)*av7V0Y8;eNLvo}%GV?cdBrIYkc zj{s3XuD=KMuarIHCuq&_<)nYdZMmn*WkjODcKt!!`;hK=`iDII2et2{fxk}NMh#Ygl(i!$fJ!>7KXXD?4eD#jLi~5>JMk>%y+c(Nmc()_{LnV85vQ`|~e!{^-6sznOyt6=c($ zuIbPrjYLBBQSwQdNU3g1e-3&V=V)T%d=I`ubt-fjE?&y@_(yYf%G;DQoyuM*^%BMt z^5D3D0nZ=_*Y3VHB${lI*n zX(sWokXzoizxwji&8H8@GX5Ag><72&Vt<9jg`TW98v2z!R8Imj-Zc=~)voRpt7q5H z=b+m0D_rdaEY9VF>cxnR>9t|sc6}=I#TxLTBKzZmntk}ck#;>B#*Ak^UDLmZ(gGbf z)vk}mo_Vnhc7%S3QNs(f$#amZL=SN3VwIiBGmD3>|uQH)ESY@*9jTw*Z2apiWa zr=e}mU;{B)PZIQJQey7AB{o9K!!ky#-xR?!dKl9laXL9v33@BEd2IMcs&Vsp62-)F zs&hdlZk{NYV&dwtJy)ZKRdWrmWSG>}87;-WhhUbLVcQBkGYIib<}t-!x}%wfR}aaG zqr~N?-!RNl63kT{TaA;bU$@Na@si_QHZ*22Lo-a3D$LR`R! z6A;@cM6A%%k^NLyiz27#ti{M)x*kUJuECo6l>qZh#hkY4~42{pljSEJWSNL?*8>H%>Wn6rq{Bklr*zT%JeGs zhlBnvE2G$-3;FXi4%cj0S7?+6`--0TQn9SA@r8Zwv zyImDd%0D@81wjIDj)~iUB3{DBK76}9_9UAyJ;>r|0p-^V-}f^vJWSc=&l9MP>B-g~IoQ7JiV*p*AUp zNN6eg_KjT4$NcPB(J9?cwV4&a;QPuvlE7e(G`=<>>+^I98_$zzd{DCc7o^H%N@(VV zzM96gFL<}_D49^_37sa@(Hvi_Ss#l+PK-k@Q@1GxHOQ@llpIkt48ROCpwM~53H>szN2o@6Yh(-P0S`jH#UsIef~htCIlrbdXv-bE zIm;P0(?{LHy1V?^D||iku=F13e}?v4ghA_d2RtBH4`Z<~^hd_Nm^&DvyE633+-tc> z*2^N+RSuD{KC2|<{u(+a;u0suJ6=QYM07tq1>E;H`IENBT%|3bHCh5pqjf~a?w>m| z4*DBBJQ@6u=h7SS(SryL41X-v`sjHN*+AZMoJQR&lVxbIV_T7l?CPpU;Ygv6mNhl7 z{5sJcdFJpzM(tHKgouAAgM-o4}A%V9=0_s_3+J`cxYvt*Svx4H{FTo3e4bhT9!B)NThmH29%x>XW}a-AaF_Vg%^? zmlznzh6-49(80fYuG3aju3kJ!xvfGWlfDk6FDI>~Hv7n|G z*hIliFTaUmoK~DXz5y>)J~xxprl>Th$6VAPtd?;%ghI^=5GF7=^P^a>wHnEZZU>kVxqPIY`b0>7MI3IEo^afq_F$O$E%!Z=dXBeQFI!n0;e7L{-v4`U zZS{_|^-aChO6Fr-wTb;SFj>Z6R~?u#bvP8=HRpB`IBz1)R^RcCs<*iKOE^^dN{scR z3*B9pgQQ4BdKmWuMtWFILsB4ZFM58hK*+kF?fKpG{ATr?@2q-DOTS>hiTLpEw+^I7 z$mhsj^6~NoK-6&&2?d+6y~KmzPWBd06N~sO95iN(oL%xcvZs95bb9s@&p17k;$eHy zBRZm*^l}=()NpM2 zl8yK`xD`VQrmmyw^!XHa&Wz|aM_i0^#u>$!J?hVKc%qJinye}19~V>~5)0?s>B3^l zTdFIs67(vb6R{yuyL~jMfJr8wX02m?+snNY(C~>3hI`enKlB0;5uI8VG%JQ1mRhET zQT|NNG;0w_Dxcb2*S_eQDlK`M9yTM(8Pxk`V8Y-1@3_wogCCe)@iN*`&zpkwC?$;@ z#KT^+{~6Lp_F>?oyJ;uRJMRZ7|7^rUXpUI;`KiQD%Kg;qkoz9B_Qu3MUWfM;`(t}l z=t;SsdL44#gZ3K}`#A0Ui+yoA@zdL)jHq-8E2HXfxGlmZgUQ9KtEC|wiUBV5->vUeb_y?^t3x~?NuZ0=P> zY~H8E)1MTluZWT1ze!($Y}Mm0cO}2St3cayo&!OJPcY%|)QhP<0mTz^qDNplTM)#FaJq9#xT zEj{0uWd7~i1CN}IU2WbU+&1v%HT~+`c1Jgr&>Ef_TA^aWS6queuDixx5vSC}1WqrVORG7GTV5lHFx={(ju&kNr;QxG3>BeOv zu-FnM(9k;Ss;2r{`>bNWwNi3QiNV$`d%96_EZcHjM|Yf(uGwb--*ZgH48QJ&%w{Gt zEW2ixDkWFb9rzN2YO5D0p{q1dwT1gB$?+y|53(*D=3`E=wEtSY~A&=i#T9EZFm6g!62sL2ZZ^ep1mw_pw%a#urG2K@zQz^uX z^&}~nu+}ITWUxHIYH@E9_wuA+koKtUxETAjRPJBBgxihzFC(JyhAbMTJGM{SJa{*A z>IUW>?PIFP0mnJAcznYI_hN?w;TtyW4>&+Vj|UME|NgB0AM3Rr`k@cU_r*W{WbkDF zS?eP+m+9sDeeZkUef8R(`0w*q9*Q5lZ>zHPaJ|+T+4_(pk}nYZJ0jA8=!ZGjK;}Bi z9S-T_YhuhP%8ya{V~R5OPUf=`zZ4IMHvaBupD_6j8UBF#HC6o!ae0TL+yO88{^;6Y zS5=9mzH)7D#i1btaCh^R3~ih&@Nt2R+cblCXJL5omLRFE%+5@J{*dwQ? zO`Q8R?S6;Y^wcAa$q2S2r%a4Q%b?%l@=%PZTG~*I7B@CE^U(2m-h|$F>ymQ6<#bxB z^M+rx2E+{G$dMa%#WX5*WHLQ8LVAB02TSFy9Rx63dT;Y+oj0AG)4h2{Het}#O6=G- zI#y^ax^Kp+S*e(+u7)8~bn7F~vNVmo~E*!?iHE$A;R1u^t>++io(utl3MK1vjD z1zpxo_p8y9d|>HR{c}tImhGQKYb4+PfMvW@_wDN!E&Ty#?!Q;oi2p6!BHvM|ZuxOw zU$=ezt%mghJ0Q>NmIhxaN)ZPM>DUl4CV0D<5rY%ENlIAO*b9Gl4E4&tZrFZG*bC!S znS9!F-u9nVwdbgMA6fD3oVv~!aeP4Yq;H?6D!otDGMh4P7ZC9140*er(vy+H1+$7i zHy^Nd%=Ut%e-F${P!?5RYys@^}I zUx6j0JIJzfl*bFx z?JBR2GK{7h7Z>fg8k2ThlO1zmAo4<>~eMl=pBFOL{^iXGg!~%EPgnuV*RS&!$f<^7^6X z^UgIM_vkLJ#c>-=7RHWQ251A(9u$t*Y#Fy^^VpP3+?TXVez^lJm^V7W#M3K#macS0 zhq7;oX=FN?OoLdhz;n}~9Wy&b9uDWIW15}(;FZs&mR1k*v;RSU1MTD}4m-~MYrxxE z3z$6#UO+*okUci&-o|? zwVNOALiOK4^NQ=Dq2EE1Fh2=aQ~th)wdr7igckb-B6EL(Sy^401sN=*?K8Lg!Z3)~ z2?7h)*FndQXauZ_xNCetF3t=;kBhy|XSrq1{GdS>j_jPV=R$O_gSTNw2+v7#=XD zJzm(~DA+9J%b{@@M$KX`mT#vr=&BW592gF8nXxcC!d;|o4iB%=PPPOF)Zijv9rr*P zD|tq%e{5^9#AerEM%!riXJ`8-`^{$mtN8UMF2<=>`J$XfYw%O1DK(WdUf$kbo1yWc z;qmo3)uQvw{)vs**^LwZW>#-sO|gTei1mj_e~tCp$?#*3Y%DBn)M~vmXUWPh+;-c> z#wR~HHYeHMZM(@@aVa%j;{KWKR&RjI-h+)a;t#s$t|##kGP3M^f552Y>n<}E=V$6p z(=O?BR(CX`J6Eq*jiR~dyDXTv1E0*a!+O(RV}{Kr7M5Xqjiz~2W25#nl3wO>n+}e` z`$@moW{7bvT&zkkT#PyNC|XNl9h)I1!dt`2>EzT-ZL|IZn#m}gzjdJmL*K9&o*fKc zc;R#R-uuIZGJMr?LlWyM(`}CgHYx7oD;#}8>deRUG#(}=2wafrtA9zfSO4dSHfLeT{w=R&I)Os9a~f3w$2+_f z*_}jlTZdY%7B(XiHqY8tqed-If<|bR53MvvX|YmSERmquZiZrR@K=0pfGE*Vh+&D^A?D!tNo5N6Ccdfsp$M30)bcIf`C&@S|YHcNE2MRCK1wmVS?pf#g{E z$h_q(B&58svQQ@Rd?=R}Vh@HNjew~dq*Gh!mGnSH{Vo9GGoGOUx|CFy;=g%*s}|6UUvhM&(Lpsa?v-LMC(A@12?e=sEJJ7HW^GsyKb& z8OENWHWjCQJRsIa+f#5-ah*1s$F%q)W%!R|Q+|k$hs5cFs%_iqgPQhWc0poQ{fMF| z9}%a&ix|_->Y@H@c9Hkh+_n~RBvA6{KtW554O_zakPjesO6^jqz1S{!o^jMkN{X(O z66dJld8Ia~mgYiPJH3 zI&U#P598qz*196sLXZVPn8w!7KQO>>2+6!3#jB0RY8?6V2@jnhsDinL3uG;Zu8q*z zwi_bdF3dTcY5bl z+zQ8L#af0AJ))GHQ2!UIhP(5 zXDO?oSiG_5;nUg)JxMP$KSdc|1%eW{Mk|IFG#5e_Diu4πR(XEyYV3az{Ot$Y*f93mYq^Lnu{qbYp!X!TA9&! zE-IItGEKZ{gMP4Nd#xGUa1=;JG3Pv}=~igMHBlVHo@se@2@*-F)x;^M`yc7LKu=nh zhA_grH$yzgP~Jdm()hD&SH=^MgaTh61QR<#GK=rQaO4x6U2~|tOMDBiVFfUVF-$`{ zM<|?NloMDpTixy!w|>^OBf`pPm2YOj_yE1m)YZVcW_SuUG!acvGpOPj*Q}t^SxvY6 zMw@@dD@iJ>i?)HcRjHqjUAt+&$qDU?<9a&##C}v@AjXWNIrQVpFoMK^u?a-Ih|y&6 z=4{#968MJCMOP#2CpnTs0ELJ9iK@U9fx#`V3x4B8_-}*}d01MIR-{eoG)8!ivO(o$ zI%4N8Hf?cCy{r4fzL-U^tjot~B7zSB-3Tyoq3m^2DlydUix~QaQyJ}W_{9hLb_FiV zBRa%Yv1%%yC)6>536NXkNE9!=fCo(j!nIUK4)ZxtPr6&WU;5sO9g6)()bis7tAirkm@kH)(n*}lhV+HnJ;M8R_7%gBj^6CN-l#Q*Co`X z5m#ya<-R7)lZ>Gz!2p@$Re;__w5$p=INcYnLKWXz+c`xSqe!e*aXLCMV(+K%gI}k7 z`@Iytabxq@8<6JJ%XqLjfd@+L68t6%Ie4-$HkTgln?EUi5Vfc18dX%7q-*)=uW4GkCT3cDubQN#OR zQkYUl8^)UQOVC~N2}@nxNz;YHOH&iOFqYxFClW#9k-B_nJVP`sf%|OSFMUHAV2d#< z%z4sjcNT_9%mw#BwMTz9EML17-HIKcWd9??}rG#6vLb&&H3?O}N$|=*M5^lwJ^cA=P>aYVnbJ!tJ*?!H zs{4qfr2C6{o(}>QV&IY?8aWQRaa}%?O5*V1j$Nm0joSqXTM=I~87EN$?E`=T+CI9Vj2(a|=eUl1b5h`w-Aby?L z=j)~`VlYY)MqH!xXCpM2mC%gX$YS44jR~T3m5v)ah=iva zY6&XRJV!QS2U>?I*;@BLsqSIK@akU*$nw#CQ^@zZa-Z@7uzefnk9^rbhWQe`toigI z3Mbv<>)6~*;vrqTOyRK)r!$$ubUud*xqo(;qF&~ywKJLZ`o;AkfnhT2wJ(YELt)vu z^Q7kdZ=rFaISnee&R&wX(84(Z zE~gM9Hd$Q4a;h-uO)i}N)^iVDerl4k)QnUW6y8ZcLx8^LKvIM~1d)(A|!u(Me?xuPj>HcX<)2BWg4C9Z1e z@BL9t31v-lwpv?`rpcj#ErV~pC@SBzbpPd?&Z|Y_J1vU1luZgVxstZP{hJ8keohNo z3FcC?sXK~7TaF(wYl|*WgUB*5-~wl<9;8LGGvnvcxCdp2u^BJ|DkhuIB} zQw6-SgLog_ytu{ESd%-r3vcHW@{k7(KS|z#lIm^sxSX_iYSCV@ie6V4eD8;KS9Phy zppCZ9+<)5g;L4(&;{GonK2=5GJw9D{Uw#8+V(4v4Q`j6@G7v=}Xk;+Q6wPYu#>8Ip z>SWv<6e~&y9mLDrlN?QEhU?rB94EJ0ar^o2m(N%P#!kLxoKR&lZ!y{EX}XGrbec?5 zJuYlZ%SMATActy8L{^)oX3!dppuFmA$5((gPS$I$y!HxTPr~(Q?DhHH0T3h%?1cp* z-~8DewyhZhBqN(LJwn+M^R#7KwjyiB-MLhw%pxsIwwE;zUcm?O8A!;Ofe#q1UD|PH zaIdhC-`0US78mhxUY=qj^tu}dk@Bwd}P31uP0{8|0Axx#4&@?q= zj!ROY`4nIA6*jUwH2G%QLE*4$mHT)?)q0~`-L6_RVyaSo?;U!`B9$&f+3A6HL_=!T zTi+1V5mh4=>UX@is;DfYmeNu&1xPf|mo$3p4awy7mE*93+=`e+ZCv_2NmAF=168W3 zD0golD;%;yr}rrOfyG#pbp^x3k_@|I<8EcF94kQcBPrg^G^*Im74VQO?WX$MH&?b~ zX$n)-n=9Ihay)!+IgUY+3=S&1UrZ@QAskd@9pR6nj+K)GG~Jz#d(&KdH(59@j;Q+3 z&6UY_Qks`;x)@$}yEvK&6g;A!Avvf>eqCVX=-S=rhIP-z4U|kN6_%!M+=KJ>yS2ZT zHgPYGZn90B!thNth*RZJEWcZBp!|x6Ksk00PU;66n+KKQAE{cSfXKsvd=4x{bNqV_ z{IjbZ-}+rB$Nf0F$+Dcv_)V7P9&&konZ)JIZgTVl;m(*XG)kBu!XdNV2i|Z4 z5WY;x{q-UKLug72qneb5>xhH}GQm{=t-Z#9s|F`Ye{H?oO@!YJ zFc~ypC!{b0g1-;8b$X6PWDD@**ph+lz!Ow#!l;tCqoBe31Dnj!Zktokn6xf#k9@Ox8M>uFNNpCNuV2^_?%104QQ>{9aOdmh%V?nbA|4(T zD@qzZ77q1L-{3u%Hym`BYYacZz3$1NPFYuQWEJ1-+g!o zDd+K7Ydl`dDo3zwaZsgR(*zY_Xwl+(6Jh!6z{iJn!E^oAoN!O1Tp_n{X z^>B1%+e#N`<6SWj^$hOY*nAhqhc7t)czAiF5<;lqQ@Ggu9~H%;mg@7pC0o|lQ)7=! zl!VQ9ntW)cX9TqTYOXZju=E#o^QD(eI9Y#lx+0{;m7Sygu4b`%pi#alU3rUwg5*4> zLQMto#x+J)cBjU#bNi?o%++S4Bhtw{{_AMAR^SxboG>{~CN>x@5mCqSu*mCoGp+4+ zj=UmsPsz*a6zna$rZ=;S|3q50a0q$vW`&#jB1kXi_9Wx8%if;*mSb;rMu-RIu8>VNx>g_>LcC|ya?7g-h zN$NOFj#QHtIV%2mJ>Qd#RWi1jQpok(RAMMOw@X$Wgk?k-Zy>m|l!C0*c+P|T5Dt)c`B{zIq!n-KrR$|SKX5-k?t29z>Md0EEoiP4#XwTv@Ga!x zxu{M^J^K6z`u1U{5nI@@Zp&+MY2c;F#Ys~iXtWg{N~fhaOYbP`J@c`B?yYnL?d$sK zvy^WBEVUeqS+?Wd&n|jx);}o^F+LqyK;sHQe^yTVjlg=*3XqTdBEkbzUxXGcyD-Fd z%^!)=)+c0LX1>RmbJAhV^O>x_g5Tb%lxijA*3qT7$8t+w@zN9fOyX~=V_PbDMyEvA zVVdv^Q7v0icgf)bMzz(d8ioyOs94Ob%vMZhDgIf@SDZLf9zseUQrs6% zTdz2+dHA+E-*T?`_Ep(zGKG(xvpEJysv@u_OxJnaijC^)mQtvx6+SqwErc9A)VF1s<=~-VXvn(70brRd z+djt*4Hs&BxLZkkPi!L%E^9xR^%?0NXeBR7e@FV!H!k(udU?z&ncKpnD;|c(;PWaN zP>qfH#*lrA3B8^|KyjW|6bE}bSJoe*YGr<&vy5{EmBOG=%sf@C4E=?JLUiT6_~GlW zO;8SELW}rEd1`Hy&L5eFjy|3%(`8}iyf&gKqS=o|zMQ;18XU7m8fK;{{QxD5C`K6E zd4NDwya2e$wm1ZD=0+P8s$c_Aw+fZ8OVXGLY>b&JX`fr*sNnN$!uSa1%^UsogvYn+ zvi>-B%orzEGJ&vj1$*&ol0DviCa!&R)R)%@la=`r>X`~b*C280ypw? zx58k=_3@Hi(lz}Vkq{n!%`$5hMb#6hG#3%ePU`p7Dz;?>%XH2)R*x5&yc zuBJhBUs1Fi3taPUNhFtxjY{>?7sJY2ZsqWgcWm>ADlO;nd zYg9Mus+5jHrC%m~>IXi;e;e$&c%kTrF8;QJTloV*DIX94JftjLNcETVbTc%z{;rFu zi9EYIvyr{s3XGd0^miO)=4M4)i3#L@NVh1|&9Cd)9JTaseklz%iwjXdqSHAFe{f-K zjcRsIKjz~J{EA&z4^wic^D%4p&Sn{?-yF*sU2x~VK6h<|KDjeaLG&YYbE7%SVaU6e zw$R1#wy;*7SbSLDJi-w)hQhKk9l4E`Rb4VDuCelH&fMC~R%v#F!JuJ6GYvg)}Wj&!&5p0WAP5yGc3vm=a-X)AI2 z^DV49r;TCTQ#p!Kek}d^KEi0ggE;nipkZ_kDCe{R=aOM|_nAB{KbMFQvp5xTG!h|rD3D&aS4p4rz@b7DTm(D8%ElMwb zKY;&Qc$m+xKD~D#HpVn4yUf}|QMR|fj*{G`&b+QVv3JSst^6ZjXha_BLqFS(v5SrK zwdN#7;-PQ7)}di}HYo*Ob-BM>tuEJKfVVnNR+37iW9t4VYWT3fTq7NPJXaa@KZnzG zpJnt%;3ziBqTE;!*``ebEDT!(UHfId*sa9@LCk@B=hsh)e&2z>T;FTglI2RPgY?h8;!DwMwyTE z6G*d&t1lYsZZ9ieFvk z8xnjI;UauT8t_kp-x0VmD)ov952De|#b_-VBxCX@TYZk)p4yW@v9QeDpq~I$C*@T0 zMsh<*&XWF6h>w5p&yL~@=BQ!_ai1 zszlcevJxF*+WI;)O^NF_Tv~4WYaz@f)svLYLh5LJtc7a|^(zizi)?;T)#Dj&eVyvW z)Sg!$Wtg)KVJ<(Jw1F84Uue+J!_uA7=cHf2nZkyEm`G;|BC1v*79P?lTN<~P<`4;k zu7HW^im+OF^vqs&n8w25YZh&-$8D^|#9jm^s1Dt1JvCHio)mrk)ahihGY z#*Nj7-PB6L<8UeK_#&1Km{Tk~wGdjGuF4pXhA5g0a@TAa;yHHRDVegaDjuUU8ZJ1i+_wL=fBRQ=F3EK5;zeU?D#x{h9A=~>GB!m#`?Vj`kOoRn^d8uPI91deJW zZjLiUhIuE9Ur`?w4<{V8hi9f#osB_KjSM;)=OJk83g?M4uP_VzN#KF#9qWNilvWFi;?T) z)YWN4nN=PADQg=Wm2K-O-BD+i|FLI!!hW3f~O(JSr~!myChw&&MrpM%Ua>LY3w`~V7>IEQe9`NZ}0d@X9vbO z=N11cLT{0k^NM_n7I6VbXHkA$4HjK&OE__rE|8gbL}xClM3`Sx7pT6uKC zI9oAsdQ5sJ=-wx|&pB_cXL46jY)6OFCAUjDsS?GR z10Kw*ds7TV*k~A@8Ij~F`kq?17S5Qaz)c~hIdgGBm>(+&F4Zc2ZT(%8*LKLoR@fFh zn=2;qL6$x(*-|T2|WSNT<+b=i#MuW*RYrsX>w=0XL70KG=u-tCPk<6HUfvAu?{HZ@S z2A?r;lB8Yb@uYM~dJaY>|M-T>11ka(FnKVv>xz(}O~kCk0mKpB><%}f&a^j&I3PKW z;9AEC+DA^7LBcCUT17U~*glix*zV=!$l^VVsCCS+h;5L(G}iMnBZf^ZH7UD+pw%HSuI;8 z`X-CDTA$awBhqmmmn18YA}Ed6N6B{7#cI+Nz^Ek7g5a!|SFtRNvVYMp<5s$UhQnE9 z%dCB&Rkvh_Vd#^qTi0-&ea+G%W^u&SY2Z&r{z%IFZT%GAsv}|K`-f9}tLYRLz|DrK zvqY|p!nQEQ5QCq^-be_m1QhYf>C~ScWAv;57dxX{UzPbHt^DQd*T1GImyint#>%gZ z{N~y&-YwQ8UqS=AFOew9@e*oM1SN$LefShR=D>*DOipzFY3$=}7lvpEb4upq*nP;2 z<)55=WY*R+Tb%xbEQ_#Kvi$29toe5=m>*FUN(WlxiM%>_9;+nH7SYp_K28Bq#_(yD z%Uqi6zibeTJ;W^1@K-liUruxR^)%P{FEO1Eoxw?$QXD(p{x_vV*^WUJr$auL306qN{&hf~5(ipO{qhF%HiBd$(yo3A01Jq+!j z`P|rS7xnvDU}c9s!a1A9^NerlKcHLw5d}EZH3RoMfNN7*Nx4PeM&Pa?_)IzXehWGO zIx|i7^^o&Q;HYw^NFfB3j`1zlM|Fu{Kj%?gUp8roYN%YFxHz@l6UNU|lE8;C4{t%!2I3A$gXX^cUCFLOF zmUblvL!tkJ$mEaBVzPyFISzWXfopDM4^nIQx~FjY7uTU?Nq>I*BCMk%-8jzfmyD8P3)3TT{gSEFK!`ElTU~)bwUzY9>CB{eady^PhV)8u*HU z%k*3&nwd>Zr2}p zkeigweXcWT&$t#<*ECaR#4rexO>IrpOn0U|aNI(?Je~U;WH|B|iVESQ(>+AV%kk2DIKOpv3yo`PM>Z?P`})zX(Hi!%&5e1b8}l9jIF-fkl|Uq3(w}^kNaUBZOo+0=u53qzTf_BzM{8*8a)(4ZKy)KfJr%s zB=EA^EHZ6^_;OV|OTMMj$kiK~Z{u?N1t3nhu4_LfCf;8VQ~HXhQn?}1$P8Y>;X_+D z7op#XWBw1uG8p%wXbwr$MOAJq=ZIO{E5ZGSTcq2i`}5If5@%RP{c)g^v4sf{9Zg{7 z;8J65lF{p@yYZmqXG?XAn~mNY7twJ;)6IJ61->rk>PI$?=x!vK`7v>NH=jv#aY8^= z>ZNNIbhEtYoZ)b1TFJUrs&C;pZ-)6DV=$3>0%57d0v8;+WVF_m#h(;$3TB|iA432C zp4?6a#!>lVl}oY(mdsg0gnLV^LSkTcyBN7*WCPnSSi=@=nR|oHZu^3ee7bsdNiYY8 z3pxKFi>pV6t6O~jYU)}pDi|58+JRW)A%T5?3y7HMN=wEvxmpm#n{_LCGh+|nJakfY zEV91l+t;`yx9#Wl&gk#6nXW?P?r*~Jba!j7OOD7xU@$>PNBC%%51mTGS-#?$Y42{` zhHP!WsLoap2PTa7Dl{ww^eGtnsMl0_-3(}^($~f`{X0Sgje?4sp-IfpQd~m^WdW(s zkMo&{=EF^@=#Nj@0_Xkz63kS72K0c#o1VhB^rIt3n-i|E*%2m{H~i(0dzH4jn*#1< zGqw7{FbX|afQX6JR9rHFnJDAG;<55D*&*MR;h^O3KOsz=H?1fLBh!q+AhOJPYRGgR zAHZXL0FUQYMZV!L`#Li$g;63Kj4>VBiAH z0G@p$v^)c&+v~RJmuB2fsZuh^Ny%1JquxO8J=cl-c?bFu*^n7ia6tsR6{gyHV7am1 za_R+pFCKq(QJV01>Zhx?eA#xHaK!l&xRQI4h(1-=p}$0#rdxz4s&Buf{r|;%3y>vO zd0wA$y8HC&cK7YR-F@HlxO4B_-I<-)o!Pnf&aQT}TCIe%gQNv52us>UDiaDWM>ximPmEsR~KqGImP1pb}KBkg8QBPMHwOHXBz=#UlTI zPQUIvRx5)l(rkC%ex3K}|3Clte}8_wA_eyUB7RgJDK4bPrFcIM%&;eSq&{Bj(oSw? zK8cp*H8kSliWy9~C@H{*!v3=^*4s)s`X1`MAW*(2cE;7K6<>w#v~9q{SDpMg&EU5P z+|}2 z;f{Nk-+AfHx7^fxszti*`@);w{41Zm?+bsHW1HYJh4@w>>7e0L=lE|KEu_n2sK*H+ zKH>!9b%1P&IGka8adc=9)q+YjsPVAo9qd=N{;i2)*StzQG7MeQXKMa|n!y*tR^#A- zLq;Vus1w_&$7_Qco$Ev^E~wP;Jk&{0uehX@;~f7?`D+Cud<%X`Oq4Nns`y;_y4JrRPGtMO*ikS=+9$=)~}3H z0!WE8>T!5|^r^;$M&rV#8;2LkD|5}+FJ;dj5YG;$pUuLr@jduDKiPPo z(Rko|&<(k2-S+-_SAET#U7wl!-raZq-ud(Yh`3?Zb!=|mcnWZbsaS+l) z2FhcK((k1x;k6Vt9Lai4F~Tv=7Rt+cAPaTMO*gC))vg4wAM{#&%dCXe*?RZQ@mvIw z@mOT#PYjI@7Hn>MeycNAapS>itKN8P5Z8va`0g}QGN#tIq2EUUd_aT0$ODT@PCd|P zWLU$s@iN`+5YwZtp_WNVhZ=YYO5p20YHAd1<{JN~p%cr3qYNXh{BIaTeU!kG-az!v zM6ePjGSI8osIqfm3UC^Z8%-pJLqNxay_;={>1ABrv7DB^jO>Ce0(wk39YKUp>|x47!iK zKW??+w}(o$KHF9PT&%12a5kEX%2UL~-OOUqA!2TrN5?%B+!7?4$>!PSdh;tJYArWt zM7*ZgOB#)^71@5JG9QkQ9sAnX{_)*+U#?!L)sw(-+=?45#DN3XWo$KF$Z9L89E%q5 zRpe*MBW~pf9OuO$@_DQchPl0ZEEGx}!{2a}NNc6OSZy?VjmCcn8jXc|{pO@^L%ogW zJl`Rk^3q*_XZeO-p`QO@&3BiY#5s7!2OA6UK;t6b&})22gGp7LJuFPG&ejnJ9sK&bV{wR9HlL>+r=hpUX<{wE^K0&*;mPopE)f?om}TI5ouJf2u_nj`t{22~`nV zrs6`Y%5?e&wQH_hbBG8TXmL=iD#jyJXBw{4N*Ed;ps)3gFHlR>a^LJFfo^$^^1)ZJ z29OPDw2HvPWF#D%a7|Re7UAbI`MFh4GMsRK5TKG290+tXNlg6~A0Dg@s(kYEtiA($ zb>1}NxP7N()oSxWFkibPY)6S{&aY;&$2H|e&=?j(#6>i5AnH{{SVIgf8biup|JzMs_M^5s2EhxK@15w$voH(YWEZ#DM~5sd!xiKzsuks``ccO6Q%!I zKkjF7;QQhyOrEijHwt|HQIJE|hfz7k`8to*g=&$m5FM4V)Mf8e}f2*W}BYs7u9HyEnH zNkk0z#|_mazI1@Q&q%>5#5nz!s#8sUhYEih)z!z+cIByE5PROv={g zre4C$#krMPe0NM5DEj!~yMED+B}yNM%$66IV+-`sxM44w%1$|C&s2X$#7IJc>3Zp3 zwhg4X#*I>rqZC4YpHyBi@MiBmPJd~+N!3bbGAU@J+7-0^u^W%@y9n+xtAwNSIuslz%&0NMLVW| zh<^4ncO0G|%G40%<@_CnZcV-98*-PYUrPM(T^?{Rw@K{_V*ayX2E@K_vydHrrV5(e zU_oDaIvF!7L&E19YoRgy&$w= z2bC+V*u&xIDM~kl-1`)sed+){QChzQ4IJxGDT6@EnA{1DfGfCpHuq0`UdlNu5>==a z{yzAwy7(fM-?oGOKEF`7qy8XG0ydMJMeIrWdQ%ErCu5{7jMKSVc~SVNS3qN(E5#V; z<(_prM*SthP<#Ph^xl9@qcDUuRhl2SZb6s5ElqtEtL|BW(Utw{YAKDS8%c$)<<^=~ zf?Ect+FOnfsa}xG&E<4$<4J^Le39G17X@&3x@~0a@YEl0E>CB=%a{VFETSF#?F%5| z&=)AB&uc11H^WVv(Ev}wMoHtAqD?XNQ%*w=q;D6IL3TRk8QL61oY0}xW_9DKyk}p< zpXadN&Y>sqq;Me4;&Wg+`}!&Gm2wizt)I_F&QsGV|KT6bzVwrloAP8j{c!f&xx9SW zpjT(!t9&}0^->-36dVRxdXW-xuQXlXSHqN{w-3xxI05(9rowW&1uH&@v*pn&lNaYkx_xJ-D9Na zz9(#kp0Dp3FAv&QQWu_|og}gB2i25&Z7S`JSC%@~2|}=YD58v~2ayq47Eic|kt<** zskKT-oSH^<45!z-PR9#%%hE%yBE;oeyDPlDqR9=f#2mvAzthBfo zBs6CcjRVmXNk%9FiiUJ)+QB<gzR!%I87o<+d9BvPKu_)I5yyMsIgt?89JArHkGie*fmy=MEwNtC%)kdMOW@_UEb= zVtnpr7!C1yNLf3bO+d-n%5`{@nUSY(MLDIsPI)UxK#B-z%n{a$ak^6-1TFj$_O_O@ zdFEFCWs>JoXfitk$oEC{qx4_SI*gocvst5#J2T@twATDZe94|Xh}=UYY5jPqfB#y8cIX>A~JKj zhUCKK`tYa-f)OWW*#<`1bOoI(a(%ui9Q~NsiW;havRu~Zh{c~V9E|6Jg$k}bYmsWV z8r5nM?8qd2NYrytv0s&Ysre@94bTMNH{fZ4@Yiej!fV&ArTw)>dSXRvkjGr~D2}T! z+5{3*_R&_!Q;jV0$RAOIfl{>KQOo$oacc8TdXq+uen}(VzkOI3_3t5M7IY_O(1lHI z)8qf1Tht3ZqJ8No(QbP0J!rKz9;Suv*Cc+yAvfOXhqQA>-B*@Q#- zj?D|PFPCEdIJEP%+S8I?_4`?L!7Oh}`TA>$FWn<=*=X8%ecHXEw^t6Y>~Ri*Cui%% zVQFc3J6$%0(?MyKSy9|vA97L;#5LuFa;sR^y8ylZ-O8iFyKY}~xrmpP9gKBJea+MT zSQoe&s2jP@nOl0qM5 zf9bXN9QlPKZZK>Tb!}2vKHQG98ng)Lup-LZ6?wK=r^HoAq+Lhnz} zSw%}+Ejffsfqz2+Y{H`c4oBm zQtVY&G;vrIBhCAu6xnzu=M2={CzQ`B|4jLp%D>5C0>(nf5Kd@<`&q2mxTIJe(1lon zS%zj6_9Z+P(o3=4Fwo`F4!l6D2x3);7Y~XB1@Q=00K8(82*Zqc^(c3wz|XS?BadI9 z!rCXz6RV?b!`4k&Q9V~xD@--in0toG6P0LM6X%4crV%y4u5M{DTxUr7X_>Gyb*PCQ z55ph;;r4n@s|XMh4=>A_-%2rRDa7xsDNv6rWlwX}@c7P$Wy;L7ka_evNtYhpmGAP? zQ>D&ObRC(cTcuy*Byajs+h^X!AIa8=#H!pfh=v7@SBgKP6G*P-P3e>@#ez*4(8Y0#LcR6c|j*kXrXi(GhHI!L7h*6%#xMM_EA(7#5rg@s} zX>i>$p)lf3&9k-Z-PV=uv>|ID%<80Qrt}Gr4Y*~oSM=_^Zo6nm*y7>5LmFU96U{pq0K-)N`w8)y>yq+2)r zm7yCPT<&Ic{gTonlxDabGw`DF!<3`s*uX2i1d>?zE%Bk?ff;wnGq!qo5tY8h!>T=T zoQi2#mg_iIK^N=kY)jQa^U=4eGmdN4n|0H5W-=WhO`|1|X**LHj-^xo+G?_IdTX<@ zRP7JgyZ1}?9nJSN=%hWBdWJRnA;@#f$R3E3(n{ffHI_t-JENVXR^bn8mbQe>D(cdb z_Hia@%2{^?4XkiXZFQ#0jK84zw#bOO#ULYxSVl;Vx8pGy$KhB}3NB;JPg{H!cIOBN zm*78uEZk_`43I7Rea2>g>jpE~ZPE#C{Nlb@&9E?-&%N^at#ax+-kq-(rO&rtrj*~> zvm|?FIQ`BWgs1DQBY|o~mLkDwGu-cZcls|R^?FjNMR8cE20^vr`o8Nrm5S(GX1$!J zescWO@x%>}ZLGn~hmRbtR=ob9zE^Q(=CjWBYrE?}o673~|;`6@(|F&==>wO$pn za}`+&jg=L_ytA@m*pIKEp0OephPR}hdJBmoMBwGnwu49>AZmV6*8lT$NW^j1MTA|< z20BmHgfF7Z8%R<;ttY5m2E$$?Rgv|!Gf)@ z6~b24ehj*&arLTUUlY+E`eNy|Rr~a(Awf-ja$wj4J72dXhm@Mq6r~2WI@+OCjYYw| zosk#*TO}fbl>iFp+jo6}YyUA<`pAG)D~Z6zBU0WcAl{HQflU{iV!o0bxacjZ>{<%p z(iLE{#5aOa5ZMb{q;Ek(Qzqetq9mht$pzI9QFWkF&EzZc-)X#^H>tW|mI|clj{2sQ@Zc&U124%8A4cVKHo7cLl2=m1o~G(r zRyI&ZwAkCiwHTy3*x+_MmAic`UhJt^Y!1CNr_U=(%2^n(50*7%j3S`VkQ%xzED}U~ zigj_lmgGl6^dj&?S;r&vbr>KL=LA9eMi-Uo6n&c&_dAV4_4=Wshw4>VrO=ho7M6Db-}HiM3Sa?yo#g| zKaIwn1GgQhMfc1NV4r+=zN0NWES#UrHxBngGPlu-42HDq8ub&CBDn~zqGHfJLsvDX zaaA+zC^nOd?rVgqM2V6EXU_HRih=`Y4s^$VT4j}Gt$W+XT-ZC@nA@0p(56&3ahi!d z=w~`*&{Nt_$+~7FF7%s<9h)krwqr4x$&uexo=CX}GQySQD1Pq+0|76Qu&j>1&4}7O z-c$*roJB_>#%UjtFl#1kE6iYTXP_{H?hJDhXlI1=;SNoMn=6PgmAcCRRj$DIZb2aa z@$I@Gau*(QtNdlN@P8nsrC(ZNMB{9Dame`a&S} z-&d3k!9}5r2g0WY*OahVBz!*2_c$5HiCl%`;t09}2uC;L#385^xmekxc(4CJTC$2L=L3l2{bStx zNKayFLNRL*o9~DMhZ^^|B@XRFRVcbB_XDnBiyNIsWx*?03BQY~%^%|?UngIHdA+9e zMI9*p5weRHm4Kw=qr7!)ya{owzWbW3tl+nuYB4@|#m)NrP?$K$3mnxbh+GEibZ)Gn ziI8ECvlO}JSJ#rL2JP$78G)?p4MFgt;-o7Y4}@K@u8j2RAd-#o5{!IF9{iWEt9~=`n{7kWZI#?g7&ocWYS6CU zM*PKU^ak%%qj^YsjyI`iVe7jK4@MZ1tpw&e*WX&x-mR|rg5=H49~ys_}D9gXMu4j+V7ZhVhSBR-me9V zj*ImL-EXwU*VmA!GFeBMST8O4!RZz~S&qmEeUJxR6T`mvw9T)|Vwuy;Iu(@>Bcgu$ ziEYc;e!?hm6#W0q|Ko2n>`y%Yv*dqCaMFZI8^+FQ<+UOTO5R6HN12rarh@VUQ8pn6 z9j+8JCS#vq*}3y+D7=m|zpH(j$1NWb!~Sz}7x~ZF#&ghnnznHTRkSOHePxOkHRC}$ z2lpc&KHWWk*^jZ)Z5#I1MKrTt3`HmG@B2-9HOAugVx;~|V{zXYsej)QxqpPzLWeE) z>&;iztE0J$ZVYR0?nZiai2eCRZvR+*7hbMI_eFr>|7;mgh~8ZI!(=fbgbzGV)_XJb zBq(TWzaswo82R#-zf1!Et?#QoMjlH(^@Zevd3l$VBg#my>Yh_B2(Gw+QM`Zz|Q-6qwht>7gi{r>_jk$}SJm^3(CpFJL! zl?YTw=B>1A74)Q;ck#FCF4x!#2j({I3xk8hcN1&anI|v(MPUo)gVT4P9*E5sEK4`3 zrGf(P`oT<#fb{+G^J9tvFdY8o8LNM@|8!&fk$>oZlk0KgQuX+m*^(80n7(IlS}E6O zB35cn2<_1$$rv8JnTXAh%TrUXa>#HVCwvB7h=zP1OabHChpDQznP{H-vnLoW$?+0(~gqyEhC>O)0y^}Nh6ut1LIRa&C2?ijgFUl74Rp^#uL9>7=B8F~@ zG3OW(FX8$C3xk^>oXU|TWU1=a$K-tAH^Mt=C)aBB`)ot6HJj!`u4#L!N^Os|4Li7|7${gByg)^x*upZ@x)23nD?nHF?&aa`3*lW5Nt96uR% z*@`HI66#$FW2Z|oveq)?!x3x}Xoj^J=4mTzeK=mf8I(UNnEO9aruu)B@wnq2;B()# zG|AhK9R7Kr07BhP%-N$w*ntmtoybrR%<*5_i|t=4_(u*){*nIFG(Qz0dU~QKOGW4S zBb-uKS8>{2T`e7N7mXk9x+srJ@!1e}GrAt;W|({V?zXQU+Z%BcvprK?WqSi|{uA4) z7;r55V#>>-D;1>%Eh%{fVHU(G@z{_LIW9>I(a)@w{41kwjLx2|oIN`>j5BA?j^Ot@ z#SgMz7-MmzIG5g#+8@(&e3+5CN*{d&*75+kX~b!U{%nJJu^g~MusWcDusWc*wjJYf z1ODoA7miMz95ExfX~fv*EFQAamiSTJgF6zBZi3U7%Xg%=izZ5KiX2NmE_qzm_1b zW4wsN%I#<&7~`rR5|0bIvMv(Y!rxHX0gz&Ali(ttJR1*j`EW&YKZ&S~aSd6a==yM( z>M}q}mmuFf*Lxpbm~o7D)1A}TDz&PrF8J>3hb#w;0IcR}8uuHvUK^MyW8^PsWf&P| zwW3vYM-LFR#hIl(VKqFLTGhbmB~1gSo1Q}mL(1#Qa?9(GRlhzkd911GZT>ubgT30p z3P^ccV)4eQ*ojQ4+6Qj|<;FLd<`}J6YrzTvt*Vnh(M(3DW`JC1YLrxU5!d>sKUMw; zzK@Br0y62ll#dA(lTEA)>0}C;R8&j4^k$S(;S_=sDVoo22I+Hs#L=%7=Lop!QMegv zF8v#?jmBI+7zGM)Mi|~!$7`GLGI$^nvaeW!7nnJ`9a*jDvB5nR%5{x$^|%J2DkbQw zW1HX7(blG0+M@8fw)9QYV&uKZb<50_Wi_FA_`lxQkp!2hOl6h^GErYeKs=>k!r(tB zJ0s+ss*-Rc%2m z;ld~UvX1d}bhA=|oUSF@pZUCTYvYSC8P9>lIRpTRk2V7HpByWuNHh)TV% zYJ>p|Lp7|q3>Uwt?$+Q}NCV%lh91;2At&!YoXQSMDF^w2uw+kxiKis>9FM6FQ}_6k zg*^3-7jT)u=<)VSyS*}jY#!MbgrQ=yO2{3WZ);ojeX6#Sf-v-DaX|E~^nuAr`)zaS z6LXWxgxsmwzIN98ZCzak?X&!xqA0uafAmK4U-oHux%~dNj5vdvm&@jTQvLsbQoMRf z0C=2ZU}Rum0OE?8jfdm;ZN4&aGwJ|E7;02EG{ETpKmR{w^kg&!ayb~7K&k;!1`J04 z0C=2ZU}Rum)L~!%k^g`Gf6VB~z{r3CI2ZwDk_3tX0C=43S=$bSAPjZ?v;Y6MiNc(V zQIOIW4vGm6jfsO^PHS%)hGBTUpGwXyz%Vj!@oM88@XJcTxl zxmYX3n)Bl(zlsi1J~p}bQnsP(tI505HProfJvRM&iC`kklSk~r+(YFf?!EL}D&L`V zVGfTN9#WpI#v^5mipPxC$%_w$KU}`O-(S=>fzE9dFHL{W#Zd2II!TDi`>}IUep>l= z*j!!4e3%8Ne3{PNA0u#V%>>9*-gxJ8y?X+hyGDgH#D;p%BEDm+5+Zb z{Xy7Pir2PB2z&n2lltu{ogutT{F#au3JcG-iky$ydn9Xxa-R;Ly^Wxj+5L%>O<|Bb zM|gQt_#a7#Z5Ea6auRyfz*>qWtFt|m#I{;Gm0*8IZ>!k@hW$X6JZ0WH%lQH#J$Z!y z0C=1|*L%2EWAg^^`L4qjLJ>kQAtWIxIv0vi*$7cO5Q<7~Qqe(_3hAtNN{S>2QAk3O zN-9MNQFM^R8;THqAOHOJbCt`oG`%jKIpfVd3abQIzwscdrGU6aU2bW?CBMyOICS(6z z=SP%vU$$q&q3{mf8*$joh;joX4lm949|7ZteGx~>UEcjsgCmYc`DnS1fn8xs#D6-n zf%_BZ#~-7$EUs=4fLj= zJPpM*DrWMX*OK9NzIx7|9&v%|1+ya>$do`)35gG>0ll@z`cR*jWBQ2*N)C_vc8FSH`DGG2|B5#6D>N|WBA@` zhHiC!n_9cz+tmzqb>B^G-Eh90KDXo9-F|oL|I(?4Ts`>QVMgwtVNbog(|#}9d*jnv zUwW(QE_L6HLtnW4aO~&4zu5j}Xn@#z)G*K--P*s--QSPj{qrJ*z!-x2 zP%%Tz^Dwy{AkG8sAENbebNev8MyP$HT1V4uw6ig48f#7-f%yoW@%T-^VS<n8F!ruG( zxso=ka9J&8HGXSgtQGSi+>cy8!uw;IeB%5QHGQhS^?JHNuQvF7e5vlQCb$2)B9Jmvsa!!aN1}8Z}!i=C?x%&khO|JQMD+P zst|<(%17bA^-(CjJqia`jlv<7qfn-M6v|p3+9?W$m1e`EP_9N44!1sHWfaQKj>6Fk zqfi0PvEq-N6NTeiMxmnE<4dvSQ8-~-6i%$j_*HVP#OI`DY+V#ihI7iWC{%WKs{1O= ztH3gj;v z4bE=l+fgrWf_F2YTUe(yQRuAKo$t{4bmy zxb_s+6URH%)=PXZ+>YJ4 zQQNz;e;2={@+?#1axu%*{T{#f-LHhblD4bxTBVlNus=}y8qbflc&_F55v+CUS?4+M zvHefkXEfR%-&eS9a{jg7`8T+IV|F*|$!6CrW@@Xmt>U)9-=+uO>dST-Z5Q{Q{T=3e z2jB1I-Kpjurhm}! z&n;2#tStN`=AY@2#IQ&TrP!`W68GLcldK%;$JRxXmuJP16qR9ZA}Q5{EsDfDXR?2% zNDl1C=0{T6y0rB{OCmXhZ<(f%l!fn|GAUO%lEbZ!Xc@_ogCp^5O^$|h%FWI%AZQ7obSA`*d~qHs7Nl9_d@zyBu`WIUQDw~;9jD(OJO#H z-E31N&7HTvsRcc}%O#iLU5r<;JjHx37k35RE9Gu!|0-Bl^SP!O+Ym{sl1Q$#z7BS4 z*EZrjN0YWaBWcIK9gZFFzhPV?H{#Y&u8xx(;;NQ&OdtB1Vey1&wbf(>{G{1Fs zB>tTzU8^#)&`ob{7uTKc-r15KINgCmPkHW?x0m={bnLD6KCL3T%N*P#=iRXT>SJGX z)KAX-6`1-5;4(mtdvF-2ANQ*NK3WWtZ;+l0R@?n%V2JvM&~d05hT3~T&Ie&UB!0NO z4_iO%e1x1M_>YulBp##W9i{fs`ZUH&je$QF_E_^V7S1^L@W-3e@nR>azeGwZfM;k*I!&410@zNMFM zxh~S5#eCm31MldoSFU8qzgIQ9OTVS&X(_*DG+U-`%k6m&OjgLZ0`B{8-j{zRpH=o& zsdY83AHe+p#u_}=%DLA4hxmPj^Ex%GQ{%_#_(V;gT7N3`Q+lk&bG@_Ae7wC}tC%Z)p1s?9KRWHji8McMF}jdj4$H^KJNSGc%sG$#%2! zojSi$=MH{5aQxnk>@>4Gar!|Yew6=5zk&a$ahKljQrAy@3qSMw8NXlf`~{cY_V@7p z)%^S>@9%v7(1Sna+^6QhJmdZr^ADeY_D1S^KP_yDG}#nsRxi@LC9_|&F4Fx5Mp~*k z(*3JOdO)j453CVs>5OfN^q~2X9=s^hL&il~hF@9hL)%1p7~gW`B0U`Dk-H-;&-dsG zksc%d80!k`KRqKowhR-0-0Vmzvg5^{(4Os!^u&3QR%#mQNphXU_as;+%W+C$#;*#_ zr*)6iH+Xt_u<4PW(TBl4Q|#GrtFMo==E6wN>Bn|PdTvRiwK_#wyJDnu#ME(K7e+nn zdgAM;xqdY!wt+eu(xK6)NY8_NKD)r$vo&puM`L(R*hMfd=HpqKHltlLd(Gu*fp-ho zmknd~iYG^UxjL@s80nSe8J;c0UB&0Bm62Y}TB+AFG`)@nt<`vaBQ`bCwzO-T=R2C8qA1X@3jfPW0@I@2%>(ZBC?J@asyeuDEwy6KOZG-PC!z ze7DQhU5|YKrak!etjy@$OMI{Gk@lV$sb^{0$KG8yd+$v9>T^GQ`imdXEYf@Q@*eAf zrI_oz^t~7N`^?UL;s?=n(DFzJ%XxnnMzm^#vrN>;H=338FulLCGWxQU|k5}P%k4#^4zCiu22l^ zR-}vkzTS3yhn7q5TPo)=G2Rc;_vpC-*84D5(rG14J@e94;#bq^1A9Kn(+~CFW14-8 z_b1LirT2O{*W3FHzt3s&x!5n{{6dZmt{ddt;5YH5^DpK3$}DY^XOp_VHX~oF^&2z2 znZ}!GvPJ*4>ho4Ho^9ziv-B;l->PvtO}>NkowFTk{9f!2&i_ZVU9|m4?LXu83)^ju z_u#fi+^@L*hRa@fznkqp%-^4$OZ(*Cr>4Ke{q6Vhw;0c}^q=*SMKRkMSz$?JNqe?1 zvUGN2S!FgevV34Tsi6k{nx&Z>=cw!4Mr?XywfNTB9a(MhwfWbZ6d4Bw}HG3@N0lyL+eK3 z8maxf$&sDU_X4<$heg(8U1S%EyJ%5lP2pY)^HRB+(a5teYtE-RPAzb4AbR{E)2l9UyTa@W zr(4U&Zr79U=H|b6_7K-&OJsMLiJoe_Q_P+Gdg)bfK7E|`(Z9RoyW4qR`TDB0AMX9l z*8sc*=+!-DVW9rp`>%<=Pwxkr%fV_MtS9%=#rtJ8)SL~a|493g z)AnK5Bh0`^{q+r=jgn)O^(eTbX*F6+qxEqN{$ptFT{9c!ew^3|t`o$U$X^0`qV**D zOcFC0{$w1cRE_L$+@`rcp)SwFY&tEUf-^&(W~k?B`ps0|OqkEeI}7Hsc+WN)&(mWL zPA}5>CHlO?f38`Xr*|)_0dm0%r^8;QcUr9o9nEH^jf8hBw(_ zeS3%QOT;Xp$Gdnf#c?Sv%j8=o_cAlLTs__iv*lvmGso}Yvx1Lz!fcgU^*)%b#^nRC zYv`~>jce7m7LO0beW;#~V1EQ_o%4^ye?s3+;jTBYpYi*mQ)FNIoqcKMzJj$8&rN3N zYdU?ye~VhSz}TvvTlHvLEoQF1^?cZ_Z@#Ou@940DhCAf@-Yk6&Yp1$@!1+hmKYB*| z55_J%-G%#4>igMz{vy{e=4`j#?bhc#wExxqZ|d2rKHu5dUf93uyR7A}`t<`F`^vFBPmy4jp%*eoXF3Y=K|+VoL^Kg@{7e@IxzBPe49;;yg3b<^YMJmFKZKdvD%91 za=G;t%_6^&o>$`6QZKH8do`Zd!0~RGUyI9i!y|9qp2^#qPa9`#;9l=~y*ye%H> z#I{#!2R-iK{svdi*8B$A-`J0>kGvx-JHqRzS2y8#GrwEp=+v0GcE+u<^Ult0H5a$h z={D;wX2UZ#?`p5BI=hLxosQkjV0YaAt4}@j;0`%^^7G8idpYZEZu-FWtj+J%v%B%Q zTd(`lt1k`u=|?{`^w;11W}!c<0qVcU{y z1A67XGk-|E!^J%;&j{L%gf|L?Z~1(TI>zepIJG^3(|9$FSH}diUjnPdyicUVM72E1 zZ<6{Z%k`K(K1SauwD640rUv6_X6X0RdiS*1nF;$DeVzq( z7QAQ8*R%GX-52?6JfEY(HP`ISOUmv155H|X<* zvp3cC7LDKXyI6$7Vlj)&#bTPi?fz}pOYmRf{9SpM@?YkUS9wd-oV^G=$7K%WoH(i(AV+^^N&wbmc;Sx5Je_2(0uKBe<|c)q>!&(!fb z?w_me3pu|qzZ=B+{?5OWcOyMEnwyQZ+eEWX`tda$U&HuDf4r;an_V~4WQ+Z+YT7D( zn>^p@$#xvJtL;13-#h!>41I4_cFOxB-n;xZcDeop<0lwD)8c3I`!n9Z;O*Tt->uF) z?)T94SAF```Zt_@H&1_9|0(Z2dH&M(zvTQ|KmKVGMNuz`3XP&DsT4)&zcw$5vQbf# zSB;{g;waj$3|kXLrRGP`{@bJIfXQrq6dkxTib~IpqJxG-(ZT!`9s(eAR$pk+klWzoF7r8p-Vc7 z6zOee?KrZ%)_M~u4JY6voPZN>1Wv*Mm@HelAp7L?_h#PgS~7qee8IzMdAPRwX?1YH z?vJ~qJI6ipz2iOtJUbpxe{t;N39pU=+~UX+yxt|1A>JK#aD@-YUFx5Xd*pA&ect-x zcz~hjJNB{m9vugG@ZMsjOk;FZkMcxS%}QqbBGN6j)vl#(a#e|GIB7XcSxFrkxe@VE zG>2?vOe#{XO0iItkwu|It<_E@CfpiR&&T7`>0zQu#851QhL1*s8YARLs8!TfkjSt{ zK}VmN{oh^lB+Ykjdx0rJOwMGM%v3fP(U;gT7xVuJdIx^jjH*G(KIM!;Nm|(KX}Vx3 zDz)`?R1)eTwl-B`jxj53&4>2(@)y9?b&vo60C=2rT?KUGMgr~d*p4BzP-afsO}5O; z+$)o8D~TK1axFWsWoBk(zA`g2Gcz+Y-H@b_o!j?f{r?9wjM~}YZ2BLXZPI@n00m>bLk<^}VC`N0BU zL9h^57%T!71&e{j!4hCe&VWf~~;TU>oosur1gQY!7w-JA$3S z&R`d?E7%R}4jhmN1yBSo7z9IL7?i*sU<8yw1yq3tYG6-L2R>+kCKv@{U>r<}?I0PID4g-gSBfyd1C~!151{@2H1IL3Cz=_}_a56XroC;0@ zr-L)VncysNHaG{I3(f=QgA2fg;39A_xCC4ZE(4c?E5McDD)3)$HMj;`3$6p#gB!q& z;3jZ0xCPt_ZUeW2JHVabE^s%v2iyzp1NVamz=Pl+@Gy7;JPIBIkAo+`li(@vG%ev4dT@QX0o)L71UH78z)j(1aC5i?+!AgDw}#um|G;hGc5r*R1Kbhr1b2qJz+K^P zaChjyJS@N>bm1Tzg2S)`_kbg?3@fk-Jy?T#!aDR}12*9(9E0O<0?vYa!M))=a9_9| z+#enQ4}=H7gW)0YPFFN7Dti{T~kQg|7>99{vhgjd1;!mHsm@LG5sydK^FZ-h6&o8c|+ zR(Kn{9o_-&gm=Na;XUwPcptnUJ^&wt55b4wBk)o97+04 zUxY8gm*Fe$Rrnfw9linIgm1yO;XCkM_#S*8egHp&AHk2|C-77F8T=f60l$P_!LQ*r z@LTvD{2u-Qe}q55pW!d?SNI$J9sU9Tgnz-m;Xm+SG#dg4B7`s^h$4nKN}wc4p$?Qr z8I(mi)QP%KH|jyXXbPH&rlIL*b~Fc?6U~L@M)RO~(R^rrv;bNVErb?Ei=ai(VrX%+ z1X>dHp{3B$Xc;sE^`ika6D^CDL(8KT(28g!v@%)+t%_DdtD`m0nrJPwHd+U*i`GNy zqYco8Xd|>S+5~NiHba}EEzp)|E3`G*2K@(Zi?&1CqaDzWXeYEY+6C>3c0;=(2jx)# z6_JYu(GVI&CA0?`L1k1yRpg->+7s20j~b|nM$s4=M-ylk+6(QC_Cfoi{m}mC0CXTa z2px(KS+26Q933EhltLARpY(Cz3B zbSJtC-Hq-+_oDmI{pbPoAbJQrj2=OcqQ}tV=n3>BdI~*_oy^Y>M@1pn6`{)DoA^He?j6Ol1qR-Ih=nM2E`U-uGzCquj@6h+? z2lONQ3H^+ILBFEk(C_FE^e6fY{f+)X|Kiy&zz`#hF~Jlw%y9xIaSC_fG|u2G&f!kn zg}ZSN?!{B^R6Gq&$Ft)(@SJ!qJU5;P&x_~7^Wz2Zf_NdkFkS>NiWkF+<0bHtxDPLd zm&VKB8Mq%0;F)+?yc}L0uYgy?E8&&#DtJ}A8eSc*f!D-q;kEHPcwM|6ULS9OH^dv^ zjqxUUQ@k189B+ZQ#9QI5@izEBcw4+3-X8COcf>p4o$)SsSG*hE9XmLW3%H0~Jcx(z zFfQRe@CYvB3a(-g*YKXWj(yy~O+1Rn@Hn2pv+!PcZ@drQ7w?Dn#|Pj8@j>`td*zlLAO zZ{RoaTlj7K4t^KEhu_B^;1BUf_+$JD{uFBuP@FgQQ7@WJ!*6k}lFsdPpys zLZ*^wWICCh%t7WPbCJ2pJY-%nADN#lKo%qmk%h@3WKpshS)43EmLz>-DY7(KhRh)S zWPr>h%aY~D@?-_FB3X&7OjaSQlGVuSWDT+=S&OVq)*_J9I znN&!Xc%(-5Bz5AG25FK}GDgP91erzlB72j4$i8GhvOhV197ql#2a`j{q2w@fI5~nG zNsb~%lVixSRBHiXxJGq10N$w(dlY7X$r{B2SZN$g|`*@;rHgyhvUmFOyfutK>EEI(dVIf0KX6zjQVVD5QvDN+_j_a+;t?nxY*vO*1r0bF`Co(Qev9d+8K9 zl}@A6>Fjh4Iwzfr&Q0f`^V0d~{B!}jAYF(qOc$Yx(#7cFbP2j7?W0T4rRg$s2JNQ< zbS7PvE=QNAE6^3`N_1tq3SE`1Mpvh6&^75=bZxp0U6-y$*QXoM4e3U7W4a05lx{{h zr(4i1=~i@Wx()pg-Ii`gx2HSM9qCSVXSxgBmF`A&rw+~20xeRP4$>hyOiOeRIzr2| zLaWrHHM%FQQ=c|ylaA6cI!-6(EV>uno9;vRrTfwS=>haWdJsLB9zqYLhtb375%frU z6g`?ALyx7$(c|d}^hA0RJ(-?DPo<~P)9D%XOnMeQo1R0@rRUM}=>_ycdJ(;tUP3RW zm(k1V74%Aa75y*0nqEV%rPtBx=?(NodK0~w-a>Dsx6#|_9rR9m7rmR_L+_>c(fjEG z^g;R%eV9H%AEl4c$LSOFN%|Chnm$9HrO(ml=?nBl`VxJazCvH6uhG}(8}v>37JZw( zL*J$E(f8>G^h5d){g{42Kc%11&*>NROZpZ4ntnsSrQgx-=@0Zr`V;+`{z8AHztP|6 zAM{W97yX<5L;q#7F~A^03^T$gV~n!|OR^N}U}=_NS(am+tc!KC9@fjIu&Hbso6cru zbFewtTx@PO51W_G$L41Xum#ydY+<$tTa+!v7H3PaC0QR^iY?8SVKZ1i8(=fpvTQlF zJX?XS$W~%2vsKutY&EtzTZ661)?#b3b=bOWJ+?mEfNjV&VjHtf*rseVwmI8^ZOOJ` zTeEH0f7rHcJGMRBf$hk4Vmq^4*sg3hwmWlJo)uV;xonUPv0+wXd$18!W))Ut9;>lE zS)KW;!J2H8jj?ey!Dg|&*xqa(wlCX{?avNi2eO0M!R!!rC_9WD&W>P5vZL71>=>hS6yN}(^9$*i$huFjH z5%ws1j6KetU{A8A*wgG8_AGmjJ>c(ldyl=( zK42fRkJ!iT6ZR?ljD60&U|+JY*w^eE_AUF4eb0ViKeC_L&+HfWEBlT8&i-J3vcK5h z>>u_o7xO<3IpUZTPC4V8CwP*lcn44O4A1f$@8n&)oA>ZuK7~)^)A)2gJD-Ek$>-v8 z^LhBZd_F!uUw|*j7vc-^Mfjq8F}^rof-lMY_)>gnz6_ti`}qK$$(QBJ@#Xmnd_}$z zUzxAMSLLhm)%hBHO}-Xio3F#y@4|QGyYbz*!}Gkri`?ade25S865oT5@G`IPD))Ge@5$@j=MCQE zqkN2y^9eqS@5T4#`|y4Fetds^06&l)#1H0&@I(1w{BV8*KawBCkLJhlWBGCXczyyu zk)Om*=BMye`Dy%geg;32pT*DS=kRm+dHj5S0l$!6#4qNT@Jsn+{BnK;zmi|Y|I4rD z*YIokb^LmM1HX~q#Bb)e@LTz9{C0i^zmwm^@8+)1OJi##DC_$@L&0F{CEBb|C9g4|K|Vje-pDM zKmyK&X7mrFm+32%>V>k~H&`l{dBBA1@7Z+fp{!YYM$C4=glyXmSh_!EJ77Y#Z3iqp z5VIXHA=|bCmYx~29WWu=wgZ-4HfB3uLbh!OEWKRJcEE&e+YVTI`Izm13E8$Cu=ENs z+W`}@Z98D;6=SvoCS==oz_?RrltxR9iC(8vua%vu+viq?N>$fa_HwOiIuw*Q0ZTe% zr(RJSQBeH4<4%WDE)7-t@?N9iRSYS()rMP7XyR6jMy`~K#j=~y#BVtDhOyG{YE+<_ zGtuRgYr{_7ZS*y3HMd@Hd=Y&kA*bA+PQ{t!RgqIEGN)Rsd!-^b&;GPitM!$t#Ztj( zcy%Ng5r1X3!>JdBOQZUAm?1f*UiZfOR$Qj&4)qniv1&{xyMv8RTd0?Yh8r1MY1RzQ zJ9XuOMWyp>M3v)?h&OA-uu%32BV#4sonpAxlnK`=OW*Ab?`)IjuoM}%ZF|b(W^GQa zqSNL?n`K+%IW4Z<(GGU%|1oTLWCh&rNE_x_bzAUp<3nrm zb+*YlOR*!PQ_6}=YqEB>$;n7D<)iM_Tqh`db+^&1>$L8QDJoc#SZyia)vkBil8R!? zu@%Rzc0FZD(==`j*S+S@aNn>iDzS3cJ&8e&)|xdtcG(tjddOQ-zGpI%7VB2bdnPkU z$Hdt~)|P0!lNz-;u!3uKpp7zdHKHofqbOP)Wm`lZa2sC`nsd%Gq;AP;J zYToJiHMbxtgwrT_>b*K_g*(1z*h>BgbQ(!#%&8YmM}7tl0v5v{x8ZG2Nn+vG&3h&UF9+`fTg5J%07JafdBXO0+o zg_yiTAUiQnoWK*&J=k*H$c2I}7Yarmj(IX1c;d%oKad+0TW(a0JnGreatRPZ#sIM^Wnv6??G%Zol@rMKZnkgU^6pX}6MkwJ!i%c#qFQuHI?0$JqDWRpi2RWStuEduZ0I6dE}1b> zCaz^8DoTCLPlP;`cl;4odqg$v(2xEgctwmjV2cB}ywebsXhL}cM%y^ys|9uu`?^ z)>DSatP8B^(RyIbYg%sffYuPdF;RAdK*dNt(8o%}#xT{SCoe{}MNx$MrF~`Yusa=#vr05)$#_is~zd7Ggda^wLyw z@hFL|FC!lApqz`DG8@ooc@;e|XB1A$jlN;QOm%BFnA)P1#oOpsyG`%0q|nc7i)e=t z_?3xkNkPlyl57Ff`MT#6MWh>jwNf<^GT}muUSzEhBiD*3?uNRecgqH3uvB*kWgRr! zcLtq$N%-D0O%G8pm2VcJ)?HzqZw{HBrYYL%W~r-R|MyT31MmPD2Nij!B&s zo6tjUTZw`Y!&vjCnYb4Drz&m8tUfZXMOG@Ms_7&%am}(K5_GuLiqxVvi+b9a6!}pX z(;Tyu`q3{+V9l4!r)jhd>yV%+TDY1V zT^b@@qHZ^cA(aM2T@T77ztN$nD0#9yO)65VI76}}6j0jGNRIABLe)iQsK#DuzHM=P zQLIf)MvC!6E$CQ&v@NW)$;n8`X{c9er0uD;U@v{O>nTf0Yuu~_1rGfR{iI8T*+*D>=BZz81HPVSBku@TXc(;No8$&NL zam}JS8$xO~l5x?pq-UfpmXv6PElY1}*lNBSQtdeMEE#bfm@Y)&OJrL_o9pTx@#sBr zt*UJ;3Ov`U+EEDKCEFquqJ*w9DOdYhh3YuTm4C==npdsAjLNqVle*Rc+RC zkz`h&1EJ_O^JP~B(WsJ# zEH`d6%gsfw-+n74^k`gG%QL~Ge|oD}cS_ZuI<=c*TSOCJRE|=XU@TXH&4FaZjZs*z zk`XsXVLW;*E(-AIgq`P+nv4Wv7Ok+SEFm;>%`#ES5=_{B)huQuBW^O$Z&vM06tq*L zW-Tl#9kxOg(Si78n5eLpCM-$3gI9FT3X6uS*~AiKIdaU(T|~DamxW9oMZ8uv^WJQW zn2fmawcM;!{k|cm#tatEN<}sFvcK_l9GM|Ptcqwf>ZO`n#F8XcA0&OO(}L%Xlw{0m z6TDDsDwjxrsfD^*EQ!&zZ2kKC^1+s3SGztfE=3cd?nw-Cwx;tg5^$mJ)e_>z_eCwK zCqvZF3#JX|kYLzrm{-&!A)j*Dehd|4yU?uH-D+W?FJEftBoBn5+`+Aqq-tR_Vsc;;GJ9b(6lGXyVKlDj)wQ^$ z7DihnxiA`+?1j;|iCP$qOKM>>F6lNPu8GNETo_Nsc*NAgXvoyUXvlQ64QaEM4DmP* zV7BOvmI`v8SQp@A!~-MWj~fY|DVCg}x>M;hJMbY54F=){104cYysBxB0;2XM4M`QH z=QDKkqp_CyEva8i1C}(PrJ0sAQ%lQQ(z04w&XSfBvGeuLHI|6UAFo~%vGc>Wiy4wL z&zfh3F)2&v6`3SKl=ah9zVa_G+$a(L;(v zrQtzGpD5N$vyLU=qI=Kh^Rl*y<|glrcgSbi^d%wDDXmGW*c==*^_6POU9;ee1YqJX zFFJ&zD+-A2?TLaZ^=tA&V=WC>(g1gd%(y~5O~Ra8@%AXmLo0Qi z)+tNqHCT+bswIEeq*ks~H9}F0aAJNaVY6nxanHgI|+`Nk(0=pBz8Ov7H_%Kp3kxWLsTf?%`92yP=N}0H3B3N~s zqUR{v5j2ts&##nB*3W4R&6-~-y3r7J>i;oJS-N>IG2|F3%O#@Ndqrw@Ak=I1l4-#* zam~DXBPfN*h#RA^Qgy^Ol6;z59d*m1g0zmmyC*T2(xRCjxU)^pMT)8EmJs=D?a{=w zu8>Bj5Mt8wkXe0)DVCF%M2_RHW^KsCwI~8%Q!*_sSx59HF-XU>$VSbnxjK8Mw`h@n zJ(HPa;$jrPXsahCML|X*=1g46hScojM4SgO<<=eF#F%PKUB4irz}?2MTd%s}RY$E6 z9uHVn0KXCCOETh9?L4y&ShnlaY{~Bax+gKn*jjlg=GH4ToFT8;?$#K@;$$ygx9ihw zNpw#7#GuZ(Nla3f$RutS-Lz;m%cVjoNHfDE@I-wUi8~S0@d-Nz6Cp(cCB>iYjzoEo z&@>f%P_(4-&6{9QDyt4CwY>Gz|6@4&B)Un3-bsz-h^g^ZnKHTAw749l zQuibV@rXvL*43`ZtwyQX)vm{57N%-vn;f?orgCSS91lDiYjw5jEmp@1lUtQ~Je>A4 z9SmB#&New7irU1RBow8`{S24LI@{!_ZA$+neky%>Oscr@(uRJ`p2}RuTyKp>u|kP7!Eg2dM7oCr)a%dHUspoc0Ha{ep!qp{YjEa8_X5g#PHlHigCV~ z%}o1$rt$O$uwi>J)2Qf-p76>5hqWDN=GdNSh1D6HGb zi0c+Qib7b26Cu^EqdJ?6xONlP(L_kIA?ml>D6SL4u7e%6qFqLHE*WuS6xOk1#C4|_ z)F~b?onlrUN?C%Ad{}1^Aq@OjmEzs5SoK^f!$!xAWm>Kr9eNabW>Le6KL zLMkGq$RJ;-MFs`SMZu4e(TEg1oxcGYkBr=LHzGr&!N}gQTe4gYH!9_b?ct0%k+VH& zLs5+O@GWbikXY7yE8G!xA|jQU)+<$tmO;^SQt_-;s?-K-GBYAxV=yA32wP;hW|8WU zMQV+-O{`FBeldz$&5Cs08H)_+`N+L5hRYTc*%I0Fha(UCJk=3pt&)7x-_H;~28Ky468LaoC z4Y6iA>6k<{6CPBDT)DtdZD4s^H!)Z?_e`)vsX;MIteO1|jXU(iT)Z$uKF8ep4D$@Q zC>vf`ot>A%!;~Sqsnl4thk=2b*c$AMLf>A?tKk5t5xG6)i^N}tlM-e zG$t2|3Z5`3G~8k$)UZTo$gSjt+^V{cP|25unqJdS8)49`I3ni_lQ=Mui&!Ex3~SV# zsxOGAPKT@aH-rzF({dslFCiKmZHy&CL!|~4f5XkZe3YGhW~l7tMblStMPu*yJ%;)v zr_X81Etqo2nWjZ~LqaaB`ChXztgLiv1G(!Wo6kY%1yLGRzx}Bp&l@t`71fvz)tYK^ zD5vK6O8Tt@PMUbn>##Ubl9ngw9XF8n}#KkmAVt_wYbQgN?sS& zRy7$3+J#bmYu~+9?Y4zr-#xB%NE+NfV}{^ic`Gg06Uj+XbsM7ZHCywRke0X}-cbx# zMgn!BPFJmvB7p>}lynM9l$3`jYr|gE^%eBRP+_#r3{2_OHC;%oBXSzbb^V-%(RqiI zB@l(P>epI9h&WZyPY=7bXqhQuG5{X1j$wB^v=b7ww_r$0Uc*qk@oqgCV&S{z*GdgD zmgE7;4SUVHTKh5gk+PBC*UF_vI^qqlmIzr!AiXtck~g3^jjUr7mXOsrT$fEoJTUTt zbNLYujZ7&^Mtq8ft?Rg*ZL)DA4UKnUo0*KbiF}mFDN8W!!f|{u;>MkIzQ7XF8k^G3 z1Jc z+)W}1cBo(DJ2NCvsusMVYN_E-S-qHbz!G<_Yj4xDoU(V&NnMvAqyA2a&f6y>kWk1HN#x1 z8hWhCWJk!nqMHqfnP-Jo)led|D#sF`x4|?eG*!n^12WDG;^yfKFyV`~TZAmSxYFQ+ zK1df3HN;|urAC};a4(i>%*Ci$cd!Da#b0#ZjR%aDMNM?;2~qlWslyVb%1%vGV(pp6 z8PPM!yNIG)l!KSFre-LUQq0V&43N2w87*Xi8laHpk*x)lB>-RwATWUSUqEG3(4_ zi>~4$T>gl1T20DB{^p#ZhUQR@dGiiiOerF|Ix#e43VUVkfxIs3ClqWr{)jegin1fG z5QNPhRu>k^&7q;7y19W=Tu~m?3HN>{lue zm;k!SA_3B}{)Qa^4_HzHIV=@3?uv-IFz_2*(W_EfkDHZD#T5fA*}>~{4XH4%c=d^N z#jQ5`>UT{$zt6}RE=idm>h zOHgSBhyDYG1jvfNy61c9%)3+Z6CoESVwA5gxqD90E%JaTE223wUj|Z;S3HrAO)(1# zkKbh#QrWJ1w1{H~b0Td7i5i%cB?v>gLlZL$1>sZB-4X>;>erlH&{#_YmNd|*m#wPu zFnV6Rs9VfhiY$l8h#Si_(`Ly5k*y@E?wGIkJF`{Ur-=IA=Z}>dh2d;fZXQ^RXA#dR z7%ggrRJf5_=XJN(ROjY+wW&)q5`b1mOU06tsE$_5)kBFo>}|u4sIi(M89Ap6&f<-_ zU0zKM>BZEiXuj8xj!9H9QK&`hBqsCe*e6_gz|yhXFFar!HAkdEpS}SrNIAS-!VKZ& z*`H9UCXe6>RCmwD1Th?Q$|E9x zz}vB5*DV+1QQqK{Wlhqb12V$6X_*Y88YH7ZKmbKE*P~%syoEZRqC3YHu}kyOQobHu z{fIjnmNqYAwe(@Vum33(S(|s zFNxMo*frxM0n(~P3Ys|{u$%(+WX=*2;U*83NEw+!H^Rt#G673OcjB9F|BQsNG|r4;Uv2gLfyP)uTmDK#vV-669MbHz0t zP*RhN&K+_xP^gzwN1V1ve}`J=HbW6+NTyczUDtwrn&xqZwj*Q%yMp*$2hv4<(SRy7LVzEayF@_>^)n_k@^>e^sBwza?m zmX7Tk@PLuJQ*`Pn@muoLr!ie7FK*<$u}s}9xFU)B3eAR?Q!ztR@~INOZy5{EuyDVH z2P`}@E3juBX-Y=C%RqZqBqpT{Q~9QGhklq%3q#~nexym*DHcl&Qg?^kajw54*f)b} zAl|K3o{%>db?FFcQX|#*D=4BYr>u6A1Kwp|Jj#}oGR#C-Vp8|=o=8J4{5DFr!3}4` z4Q8{MxJESjO7qdkTtMy@ zO1|&aedZTDPi`m4{g1I?U6hS_hhL2Dd@w^geOG=+)T+xJwn8;Y`|eOher-vNz?{(@ zF%xUMK9+3}yDT1@FN;aqfprKh;u!^_tK=c=Rj73|oNHCJ1C<*JMRSvo>d>vvhebT4 zpxLR`7|RFM3mVKHcEk(%N%1r_k|@~W50~7sd4(=R?E4%>ipEt_ZRP*jRIPo^R%HCs zwlJQuSYS0=d`MYB5J$bsXNc{ed^xumL?B9^4qM@dj8hFnQUrTeL_y)RS2OEHSYnZA z>d1bVFF%u8be&>fkVWa3G(|H{&Q|-}uxsdSleNWg;WH=;bF|BTu;ws{6KOWBT{hKw z5`#%BPy9d26P;~Zk5VeGT+Isa{%2dnUW-Rp>vOHDex0gk?)A&hsYXd<%RPZ2W~L*- zI$5?woEmU*vp(>yt6kTU=xWOK;IdviCS`p6VPvyz+8a^5v0}ZCr6xi_r)BubSW}Z@ zT2DlyB+9mkvq#)lVMN~bPHHqqn;LmOWpXne=0sTik`bp8IyzSBXitA+L-TY9!y=@Z zTE>lDJJNVS1*ilTD)xcpkRpLZP*taI%q``;DgKBU>jsO~VV~I9CQpwm_IGS2GwF(p zx-i(14#Bnh;SO8r35h*cYZ22SR|BAc^(xSI*t%7n78C5l){_`?#Cf9w6oHf;5reqUWKYnb-*Ds?`%`MV~P$T+oGiu*JjM%gjzHj69Xn;+N>8`k+(yl`xc|i zkzgufNJ>22qE~U{ISvbpM5?*vvg*Z!T~F;h*)y-;t08jh$9&&IZ>)PFz2#XPqG%%g z0;fjm%b^kxwW2J3U8j;(J6|QUc)Rm3_! z5OHnf*BsNiCnKJgF#O76E@b5)^YW3v1Dpv!e-uMSd2m-f8C?z&ajb^7!k8h#TeX>| zvqNDa$t4t(7Tx|tMHHR7z2?~&YC$C=4JR)qAL`e1R0hWvT5_!_)dFvrLm^0jg!nV- z&k|)D&UneXIh2ezZ@6Vw?j&at8EsI+!HC*mqS{_sSy`b zrO3OkcD*~2qK}NkwOmBaM@1|l5#nUSt;$8*zCHI$iyAH>;^@WBh^fvkWa`{*$W-^7 z4Cy!zU`p+s>TlKN6xOE&^mlMDIf$>KjZ!*-l29 z2%ss?#N|D65-w#4J+dj2-%WEHVmxWiFK1iCl;OIRYAouSD2`6U4GLeYOtm5&BMomP z+3<$s@}b;x4xo55h5DtM3~`ld=yUVzCk@Xl`$Dc)#cXg|Lw{(a?&{%U^!>8^Ex2`^05?bq>)F`2j6_&;8btojti~KS|Qjp-At_r5quh~r0SW5$zG$4F) z%>si&LKVH7myTV!iRxSlBJfS(jC`oAIQjLNig4JJb5ar6yj#o}W+y`^ z5QSMolr^VPVvSK{12#r!Lv2SUS8Pa-#nWh>Vg{>6AMNSW?=|H>-_irdiSxd0$?cE+#@M4b-w+WT0uf zS;@;J)!!oG0prc8ZUcw_URC}!CZ>vCc@#nJWEKkY7P#5#Y1LEBYB<@a8uMnYpq50D z091cNCE4`zeR|uRD43DIYHdjOc_HNzsg_g%wQnBTP&BPkwPfDIFeQiU-aKF`WYO1& z+(7~+M&+j^8}f8Ui29SGdd0WqRuiKocTDYEcPONW5N?r=mgG5zhD%0E71v9SmZ}rx zqQ8RTx8C%r`t47QdZmIZ&qL%!khKLCO-c1_w)f$%tnRG%H()kiyY= zYRoAIy*JgE=|?|N!zKAEhL&S)zF@w2O*Iw|IoRf7;>UMtH9A%rEcMOMkAAKmB5*80 zVyrYGKPOXiuv}+JnR7d`!^#BM^+h{Z3ytJ%o59x6Xrrj!%;4ZqQ9xza7802m+>mjq z0n-mZA#Zx9&lAiwCYzz*KBp*8Wy!ILJ^q~b|4cjE45(Jp z2~&HaJ`qyko4ueOFffkC^WHd~aLYA5A==sr(Xuglu&J4M*(}eih_0Her_g4b?SHsI F?~0aZ)an2L diff --git a/docs/validmind/vm_models_files/libs/bootstrap/bootstrap.min.js b/docs/validmind/vm_models_files/libs/bootstrap/bootstrap.min.js deleted file mode 100644 index e8f21f703..000000000 --- a/docs/validmind/vm_models_files/libs/bootstrap/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v5.3.1 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.1"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return n(e)},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"

"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=":not(.dropdown-toggle)",zs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Rs=`.nav-link${Bs}, .list-group-item${Bs}, [role="tab"]${Bs}, ${zs}`,qs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Vs extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Vs.getOrCreateInstance(i).show())}_getChildren(){return z.find(Rs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(Rs)?t:z.findOne(Rs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Vs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,zs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Vs.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(qs))Vs.getOrCreateInstance(t)})),m(Vs);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Ys=`focusin${Ks}`,Us=`focusout${Ks}`,Gs=`hide${Ks}`,Js=`hidden${Ks}`,Zs=`show${Ks}`,to=`shown${Ks}`,eo="hide",io="show",no="showing",so={animation:"boolean",autohide:"boolean",delay:"number"},oo={animation:!0,autohide:!0,delay:5e3};class ro extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return oo}static get DefaultType(){return so}static get NAME(){return"toast"}show(){N.trigger(this._element,Zs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(eo),d(this._element),this._element.classList.add(io,no),this._queueCallback((()=>{this._element.classList.remove(no),N.trigger(this._element,to),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Gs).defaultPrevented||(this._element.classList.add(no),this._queueCallback((()=>{this._element.classList.add(eo),this._element.classList.remove(no,io),N.trigger(this._element,Js)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(io),super.dispose()}isShown(){return this._element.classList.contains(io)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Qs,(t=>this._onInteraction(t,!0))),N.on(this._element,Xs,(t=>this._onInteraction(t,!1))),N.on(this._element,Ys,(t=>this._onInteraction(t,!0))),N.on(this._element,Us,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ro.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ro),m(ro),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Vs,Toast:ro,Tooltip:cs}})); -//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/docs/validmind/vm_models_files/libs/clipboard/clipboard.min.js b/docs/validmind/vm_models_files/libs/clipboard/clipboard.min.js deleted file mode 100644 index 1103f811e..000000000 --- a/docs/validmind/vm_models_files/libs/clipboard/clipboard.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * clipboard.js v2.0.11 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1.anchorjs-link,.anchorjs-link:focus{opacity:1}",A.sheet.cssRules.length),A.sheet.insertRule("[data-anchorjs-icon]::after{content:attr(data-anchorjs-icon)}",A.sheet.cssRules.length),A.sheet.insertRule('@font-face{font-family:anchorjs-icons;src:url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype")}',A.sheet.cssRules.length)),h=document.querySelectorAll("[id]"),t=[].map.call(h,function(A){return A.id}),i=0;i\]./()*\\\n\t\b\v\u00A0]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),A=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||A||!1}}}); -// @license-end \ No newline at end of file diff --git a/docs/validmind/vm_models_files/libs/quarto-html/popper.min.js b/docs/validmind/vm_models_files/libs/quarto-html/popper.min.js deleted file mode 100644 index e3726d728..000000000 --- a/docs/validmind/vm_models_files/libs/quarto-html/popper.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/** - * @popperjs/core v2.11.7 - MIT License - */ - -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){"use strict";function t(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function n(e){return e instanceof t(e).Element||e instanceof Element}function r(e){return e instanceof t(e).HTMLElement||e instanceof HTMLElement}function o(e){return"undefined"!=typeof ShadowRoot&&(e instanceof t(e).ShadowRoot||e instanceof ShadowRoot)}var i=Math.max,a=Math.min,s=Math.round;function f(){var e=navigator.userAgentData;return null!=e&&e.brands&&Array.isArray(e.brands)?e.brands.map((function(e){return e.brand+"/"+e.version})).join(" "):navigator.userAgent}function c(){return!/^((?!chrome|android).)*safari/i.test(f())}function p(e,o,i){void 0===o&&(o=!1),void 0===i&&(i=!1);var a=e.getBoundingClientRect(),f=1,p=1;o&&r(e)&&(f=e.offsetWidth>0&&s(a.width)/e.offsetWidth||1,p=e.offsetHeight>0&&s(a.height)/e.offsetHeight||1);var u=(n(e)?t(e):window).visualViewport,l=!c()&&i,d=(a.left+(l&&u?u.offsetLeft:0))/f,h=(a.top+(l&&u?u.offsetTop:0))/p,m=a.width/f,v=a.height/p;return{width:m,height:v,top:h,right:d+m,bottom:h+v,left:d,x:d,y:h}}function u(e){var n=t(e);return{scrollLeft:n.pageXOffset,scrollTop:n.pageYOffset}}function l(e){return e?(e.nodeName||"").toLowerCase():null}function d(e){return((n(e)?e.ownerDocument:e.document)||window.document).documentElement}function h(e){return p(d(e)).left+u(e).scrollLeft}function m(e){return t(e).getComputedStyle(e)}function v(e){var t=m(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function y(e,n,o){void 0===o&&(o=!1);var i,a,f=r(n),c=r(n)&&function(e){var t=e.getBoundingClientRect(),n=s(t.width)/e.offsetWidth||1,r=s(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(n),m=d(n),y=p(e,c,o),g={scrollLeft:0,scrollTop:0},b={x:0,y:0};return(f||!f&&!o)&&(("body"!==l(n)||v(m))&&(g=(i=n)!==t(i)&&r(i)?{scrollLeft:(a=i).scrollLeft,scrollTop:a.scrollTop}:u(i)),r(n)?((b=p(n,!0)).x+=n.clientLeft,b.y+=n.clientTop):m&&(b.x=h(m))),{x:y.left+g.scrollLeft-b.x,y:y.top+g.scrollTop-b.y,width:y.width,height:y.height}}function g(e){var t=p(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function b(e){return"html"===l(e)?e:e.assignedSlot||e.parentNode||(o(e)?e.host:null)||d(e)}function x(e){return["html","body","#document"].indexOf(l(e))>=0?e.ownerDocument.body:r(e)&&v(e)?e:x(b(e))}function w(e,n){var r;void 0===n&&(n=[]);var o=x(e),i=o===(null==(r=e.ownerDocument)?void 0:r.body),a=t(o),s=i?[a].concat(a.visualViewport||[],v(o)?o:[]):o,f=n.concat(s);return i?f:f.concat(w(b(s)))}function O(e){return["table","td","th"].indexOf(l(e))>=0}function j(e){return r(e)&&"fixed"!==m(e).position?e.offsetParent:null}function E(e){for(var n=t(e),i=j(e);i&&O(i)&&"static"===m(i).position;)i=j(i);return i&&("html"===l(i)||"body"===l(i)&&"static"===m(i).position)?n:i||function(e){var t=/firefox/i.test(f());if(/Trident/i.test(f())&&r(e)&&"fixed"===m(e).position)return null;var n=b(e);for(o(n)&&(n=n.host);r(n)&&["html","body"].indexOf(l(n))<0;){var i=m(n);if("none"!==i.transform||"none"!==i.perspective||"paint"===i.contain||-1!==["transform","perspective"].indexOf(i.willChange)||t&&"filter"===i.willChange||t&&i.filter&&"none"!==i.filter)return n;n=n.parentNode}return null}(e)||n}var D="top",A="bottom",L="right",P="left",M="auto",k=[D,A,L,P],W="start",B="end",H="viewport",T="popper",R=k.reduce((function(e,t){return e.concat([t+"-"+W,t+"-"+B])}),[]),S=[].concat(k,[M]).reduce((function(e,t){return e.concat([t,t+"-"+W,t+"-"+B])}),[]),V=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function q(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}function C(e){return e.split("-")[0]}function N(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&o(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function I(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function _(e,r,o){return r===H?I(function(e,n){var r=t(e),o=d(e),i=r.visualViewport,a=o.clientWidth,s=o.clientHeight,f=0,p=0;if(i){a=i.width,s=i.height;var u=c();(u||!u&&"fixed"===n)&&(f=i.offsetLeft,p=i.offsetTop)}return{width:a,height:s,x:f+h(e),y:p}}(e,o)):n(r)?function(e,t){var n=p(e,!1,"fixed"===t);return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}(r,o):I(function(e){var t,n=d(e),r=u(e),o=null==(t=e.ownerDocument)?void 0:t.body,a=i(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=i(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),f=-r.scrollLeft+h(e),c=-r.scrollTop;return"rtl"===m(o||n).direction&&(f+=i(n.clientWidth,o?o.clientWidth:0)-a),{width:a,height:s,x:f,y:c}}(d(e)))}function F(e,t,o,s){var f="clippingParents"===t?function(e){var t=w(b(e)),o=["absolute","fixed"].indexOf(m(e).position)>=0&&r(e)?E(e):e;return n(o)?t.filter((function(e){return n(e)&&N(e,o)&&"body"!==l(e)})):[]}(e):[].concat(t),c=[].concat(f,[o]),p=c[0],u=c.reduce((function(t,n){var r=_(e,n,s);return t.top=i(r.top,t.top),t.right=a(r.right,t.right),t.bottom=a(r.bottom,t.bottom),t.left=i(r.left,t.left),t}),_(e,p,s));return u.width=u.right-u.left,u.height=u.bottom-u.top,u.x=u.left,u.y=u.top,u}function U(e){return e.split("-")[1]}function z(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function X(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?C(o):null,a=o?U(o):null,s=n.x+n.width/2-r.width/2,f=n.y+n.height/2-r.height/2;switch(i){case D:t={x:s,y:n.y-r.height};break;case A:t={x:s,y:n.y+n.height};break;case L:t={x:n.x+n.width,y:f};break;case P:t={x:n.x-r.width,y:f};break;default:t={x:n.x,y:n.y}}var c=i?z(i):null;if(null!=c){var p="y"===c?"height":"width";switch(a){case W:t[c]=t[c]-(n[p]/2-r[p]/2);break;case B:t[c]=t[c]+(n[p]/2-r[p]/2)}}return t}function Y(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function G(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function J(e,t){void 0===t&&(t={});var r=t,o=r.placement,i=void 0===o?e.placement:o,a=r.strategy,s=void 0===a?e.strategy:a,f=r.boundary,c=void 0===f?"clippingParents":f,u=r.rootBoundary,l=void 0===u?H:u,h=r.elementContext,m=void 0===h?T:h,v=r.altBoundary,y=void 0!==v&&v,g=r.padding,b=void 0===g?0:g,x=Y("number"!=typeof b?b:G(b,k)),w=m===T?"reference":T,O=e.rects.popper,j=e.elements[y?w:m],E=F(n(j)?j:j.contextElement||d(e.elements.popper),c,l,s),P=p(e.elements.reference),M=X({reference:P,element:O,strategy:"absolute",placement:i}),W=I(Object.assign({},O,M)),B=m===T?W:P,R={top:E.top-B.top+x.top,bottom:B.bottom-E.bottom+x.bottom,left:E.left-B.left+x.left,right:B.right-E.right+x.right},S=e.modifiersData.offset;if(m===T&&S){var V=S[i];Object.keys(R).forEach((function(e){var t=[L,A].indexOf(e)>=0?1:-1,n=[D,A].indexOf(e)>=0?"y":"x";R[e]+=V[n]*t}))}return R}var K={placement:"bottom",modifiers:[],strategy:"absolute"};function Q(){for(var e=arguments.length,t=new Array(e),n=0;n=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],s=i[1];return a=a||0,s=(s||0)*o,[P,L].indexOf(r)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,i),e}),{}),s=a[t.placement],f=s.x,c=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=f,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=a}},se={left:"right",right:"left",bottom:"top",top:"bottom"};function fe(e){return e.replace(/left|right|bottom|top/g,(function(e){return se[e]}))}var ce={start:"end",end:"start"};function pe(e){return e.replace(/start|end/g,(function(e){return ce[e]}))}function ue(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,f=n.allowedAutoPlacements,c=void 0===f?S:f,p=U(r),u=p?s?R:R.filter((function(e){return U(e)===p})):k,l=u.filter((function(e){return c.indexOf(e)>=0}));0===l.length&&(l=u);var d=l.reduce((function(t,n){return t[n]=J(e,{placement:n,boundary:o,rootBoundary:i,padding:a})[C(n)],t}),{});return Object.keys(d).sort((function(e,t){return d[e]-d[t]}))}var le={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,a=n.altAxis,s=void 0===a||a,f=n.fallbackPlacements,c=n.padding,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.flipVariations,h=void 0===d||d,m=n.allowedAutoPlacements,v=t.options.placement,y=C(v),g=f||(y===v||!h?[fe(v)]:function(e){if(C(e)===M)return[];var t=fe(e);return[pe(e),t,pe(t)]}(v)),b=[v].concat(g).reduce((function(e,n){return e.concat(C(n)===M?ue(t,{placement:n,boundary:p,rootBoundary:u,padding:c,flipVariations:h,allowedAutoPlacements:m}):n)}),[]),x=t.rects.reference,w=t.rects.popper,O=new Map,j=!0,E=b[0],k=0;k=0,S=R?"width":"height",V=J(t,{placement:B,boundary:p,rootBoundary:u,altBoundary:l,padding:c}),q=R?T?L:P:T?A:D;x[S]>w[S]&&(q=fe(q));var N=fe(q),I=[];if(i&&I.push(V[H]<=0),s&&I.push(V[q]<=0,V[N]<=0),I.every((function(e){return e}))){E=B,j=!1;break}O.set(B,I)}if(j)for(var _=function(e){var t=b.find((function(t){var n=O.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return E=t,"break"},F=h?3:1;F>0;F--){if("break"===_(F))break}t.placement!==E&&(t.modifiersData[r]._skip=!0,t.placement=E,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function de(e,t,n){return i(e,a(t,n))}var he={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,s=void 0===o||o,f=n.altAxis,c=void 0!==f&&f,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.padding,h=n.tether,m=void 0===h||h,v=n.tetherOffset,y=void 0===v?0:v,b=J(t,{boundary:p,rootBoundary:u,padding:d,altBoundary:l}),x=C(t.placement),w=U(t.placement),O=!w,j=z(x),M="x"===j?"y":"x",k=t.modifiersData.popperOffsets,B=t.rects.reference,H=t.rects.popper,T="function"==typeof y?y(Object.assign({},t.rects,{placement:t.placement})):y,R="number"==typeof T?{mainAxis:T,altAxis:T}:Object.assign({mainAxis:0,altAxis:0},T),S=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,V={x:0,y:0};if(k){if(s){var q,N="y"===j?D:P,I="y"===j?A:L,_="y"===j?"height":"width",F=k[j],X=F+b[N],Y=F-b[I],G=m?-H[_]/2:0,K=w===W?B[_]:H[_],Q=w===W?-H[_]:-B[_],Z=t.elements.arrow,$=m&&Z?g(Z):{width:0,height:0},ee=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},te=ee[N],ne=ee[I],re=de(0,B[_],$[_]),oe=O?B[_]/2-G-re-te-R.mainAxis:K-re-te-R.mainAxis,ie=O?-B[_]/2+G+re+ne+R.mainAxis:Q+re+ne+R.mainAxis,ae=t.elements.arrow&&E(t.elements.arrow),se=ae?"y"===j?ae.clientTop||0:ae.clientLeft||0:0,fe=null!=(q=null==S?void 0:S[j])?q:0,ce=F+ie-fe,pe=de(m?a(X,F+oe-fe-se):X,F,m?i(Y,ce):Y);k[j]=pe,V[j]=pe-F}if(c){var ue,le="x"===j?D:P,he="x"===j?A:L,me=k[M],ve="y"===M?"height":"width",ye=me+b[le],ge=me-b[he],be=-1!==[D,P].indexOf(x),xe=null!=(ue=null==S?void 0:S[M])?ue:0,we=be?ye:me-B[ve]-H[ve]-xe+R.altAxis,Oe=be?me+B[ve]+H[ve]-xe-R.altAxis:ge,je=m&&be?function(e,t,n){var r=de(e,t,n);return r>n?n:r}(we,me,Oe):de(m?we:ye,me,m?Oe:ge);k[M]=je,V[M]=je-me}t.modifiersData[r]=V}},requiresIfExists:["offset"]};var me={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=C(n.placement),f=z(s),c=[P,L].indexOf(s)>=0?"height":"width";if(i&&a){var p=function(e,t){return Y("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:G(e,k))}(o.padding,n),u=g(i),l="y"===f?D:P,d="y"===f?A:L,h=n.rects.reference[c]+n.rects.reference[f]-a[f]-n.rects.popper[c],m=a[f]-n.rects.reference[f],v=E(i),y=v?"y"===f?v.clientHeight||0:v.clientWidth||0:0,b=h/2-m/2,x=p[l],w=y-u[c]-p[d],O=y/2-u[c]/2+b,j=de(x,O,w),M=f;n.modifiersData[r]=((t={})[M]=j,t.centerOffset=j-O,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&N(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ve(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function ye(e){return[D,L,A,P].some((function(t){return e[t]>=0}))}var ge={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=J(t,{elementContext:"reference"}),s=J(t,{altBoundary:!0}),f=ve(a,r),c=ve(s,o,i),p=ye(f),u=ye(c);t.modifiersData[n]={referenceClippingOffsets:f,popperEscapeOffsets:c,isReferenceHidden:p,hasPopperEscaped:u},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":u})}},be=Z({defaultModifiers:[ee,te,oe,ie]}),xe=[ee,te,oe,ie,ae,le,he,me,ge],we=Z({defaultModifiers:xe});e.applyStyles=ie,e.arrow=me,e.computeStyles=oe,e.createPopper=we,e.createPopperLite=be,e.defaultModifiers=xe,e.detectOverflow=J,e.eventListeners=ee,e.flip=le,e.hide=ge,e.offset=ae,e.popperGenerator=Z,e.popperOffsets=te,e.preventOverflow=he,Object.defineProperty(e,"__esModule",{value:!0})})); - diff --git a/docs/validmind/vm_models_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css b/docs/validmind/vm_models_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css deleted file mode 100644 index 80e34e41a..000000000 --- a/docs/validmind/vm_models_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css +++ /dev/null @@ -1,205 +0,0 @@ -/* quarto syntax highlight colors */ -:root { - --quarto-hl-ot-color: #003B4F; - --quarto-hl-at-color: #657422; - --quarto-hl-ss-color: #20794D; - --quarto-hl-an-color: #5E5E5E; - --quarto-hl-fu-color: #4758AB; - --quarto-hl-st-color: #20794D; - --quarto-hl-cf-color: #003B4F; - --quarto-hl-op-color: #5E5E5E; - --quarto-hl-er-color: #AD0000; - --quarto-hl-bn-color: #AD0000; - --quarto-hl-al-color: #AD0000; - --quarto-hl-va-color: #111111; - --quarto-hl-bu-color: inherit; - --quarto-hl-ex-color: inherit; - --quarto-hl-pp-color: #AD0000; - --quarto-hl-in-color: #5E5E5E; - --quarto-hl-vs-color: #20794D; - --quarto-hl-wa-color: #5E5E5E; - --quarto-hl-do-color: #5E5E5E; - --quarto-hl-im-color: #00769E; - --quarto-hl-ch-color: #20794D; - --quarto-hl-dt-color: #AD0000; - --quarto-hl-fl-color: #AD0000; - --quarto-hl-co-color: #5E5E5E; - --quarto-hl-cv-color: #5E5E5E; - --quarto-hl-cn-color: #8f5902; - --quarto-hl-sc-color: #5E5E5E; - --quarto-hl-dv-color: #AD0000; - --quarto-hl-kw-color: #003B4F; -} - -/* other quarto variables */ -:root { - --quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; -} - -pre > code.sourceCode > span { - color: #003B4F; -} - -code span { - color: #003B4F; -} - -code.sourceCode > span { - color: #003B4F; -} - -div.sourceCode, -div.sourceCode pre.sourceCode { - color: #003B4F; -} - -code span.ot { - color: #003B4F; - font-style: inherit; -} - -code span.at { - color: #657422; - font-style: inherit; -} - -code span.ss { - color: #20794D; - font-style: inherit; -} - -code span.an { - color: #5E5E5E; - font-style: inherit; -} - -code span.fu { - color: #4758AB; - font-style: inherit; -} - -code span.st { - color: #20794D; - font-style: inherit; -} - -code span.cf { - color: #003B4F; - font-weight: bold; - font-style: inherit; -} - -code span.op { - color: #5E5E5E; - font-style: inherit; -} - -code span.er { - color: #AD0000; - font-style: inherit; -} - -code span.bn { - color: #AD0000; - font-style: inherit; -} - -code span.al { - color: #AD0000; - font-style: inherit; -} - -code span.va { - color: #111111; - font-style: inherit; -} - -code span.bu { - font-style: inherit; -} - -code span.ex { - font-style: inherit; -} - -code span.pp { - color: #AD0000; - font-style: inherit; -} - -code span.in { - color: #5E5E5E; - font-style: inherit; -} - -code span.vs { - color: #20794D; - font-style: inherit; -} - -code span.wa { - color: #5E5E5E; - font-style: italic; -} - -code span.do { - color: #5E5E5E; - font-style: italic; -} - -code span.im { - color: #00769E; - font-style: inherit; -} - -code span.ch { - color: #20794D; - font-style: inherit; -} - -code span.dt { - color: #AD0000; - font-style: inherit; -} - -code span.fl { - color: #AD0000; - font-style: inherit; -} - -code span.co { - color: #5E5E5E; - font-style: inherit; -} - -code span.cv { - color: #5E5E5E; - font-style: italic; -} - -code span.cn { - color: #8f5902; - font-style: inherit; -} - -code span.sc { - color: #5E5E5E; - font-style: inherit; -} - -code span.dv { - color: #AD0000; - font-style: inherit; -} - -code span.kw { - color: #003B4F; - font-weight: bold; - font-style: inherit; -} - -.prevent-inlining { - content: " { - // Find any conflicting margin elements and add margins to the - // top to prevent overlap - const marginChildren = window.document.querySelectorAll( - ".column-margin.column-container > *, .margin-caption, .aside" - ); - - let lastBottom = 0; - for (const marginChild of marginChildren) { - if (marginChild.offsetParent !== null) { - // clear the top margin so we recompute it - marginChild.style.marginTop = null; - const top = marginChild.getBoundingClientRect().top + window.scrollY; - if (top < lastBottom) { - const marginChildStyle = window.getComputedStyle(marginChild); - const marginBottom = parseFloat(marginChildStyle["marginBottom"]); - const margin = lastBottom - top + marginBottom; - marginChild.style.marginTop = `${margin}px`; - } - const styles = window.getComputedStyle(marginChild); - const marginTop = parseFloat(styles["marginTop"]); - lastBottom = top + marginChild.getBoundingClientRect().height + marginTop; - } - } -}; - -window.document.addEventListener("DOMContentLoaded", function (_event) { - // Recompute the position of margin elements anytime the body size changes - if (window.ResizeObserver) { - const resizeObserver = new window.ResizeObserver( - throttle(() => { - layoutMarginEls(); - if ( - window.document.body.getBoundingClientRect().width < 990 && - isReaderMode() - ) { - quartoToggleReader(); - } - }, 50) - ); - resizeObserver.observe(window.document.body); - } - - const tocEl = window.document.querySelector('nav.toc-active[role="doc-toc"]'); - const sidebarEl = window.document.getElementById("quarto-sidebar"); - const leftTocEl = window.document.getElementById("quarto-sidebar-toc-left"); - const marginSidebarEl = window.document.getElementById( - "quarto-margin-sidebar" - ); - // function to determine whether the element has a previous sibling that is active - const prevSiblingIsActiveLink = (el) => { - const sibling = el.previousElementSibling; - if (sibling && sibling.tagName === "A") { - return sibling.classList.contains("active"); - } else { - return false; - } - }; - - // fire slideEnter for bootstrap tab activations (for htmlwidget resize behavior) - function fireSlideEnter(e) { - const event = window.document.createEvent("Event"); - event.initEvent("slideenter", true, true); - window.document.dispatchEvent(event); - } - const tabs = window.document.querySelectorAll('a[data-bs-toggle="tab"]'); - tabs.forEach((tab) => { - tab.addEventListener("shown.bs.tab", fireSlideEnter); - }); - - // fire slideEnter for tabby tab activations (for htmlwidget resize behavior) - document.addEventListener("tabby", fireSlideEnter, false); - - // Track scrolling and mark TOC links as active - // get table of contents and sidebar (bail if we don't have at least one) - const tocLinks = tocEl - ? [...tocEl.querySelectorAll("a[data-scroll-target]")] - : []; - const makeActive = (link) => tocLinks[link].classList.add("active"); - const removeActive = (link) => tocLinks[link].classList.remove("active"); - const removeAllActive = () => - [...Array(tocLinks.length).keys()].forEach((link) => removeActive(link)); - - // activate the anchor for a section associated with this TOC entry - tocLinks.forEach((link) => { - link.addEventListener("click", () => { - if (link.href.indexOf("#") !== -1) { - const anchor = link.href.split("#")[1]; - const heading = window.document.querySelector( - `[data-anchor-id="${anchor}"]` - ); - if (heading) { - // Add the class - heading.classList.add("reveal-anchorjs-link"); - - // function to show the anchor - const handleMouseout = () => { - heading.classList.remove("reveal-anchorjs-link"); - heading.removeEventListener("mouseout", handleMouseout); - }; - - // add a function to clear the anchor when the user mouses out of it - heading.addEventListener("mouseout", handleMouseout); - } - } - }); - }); - - const sections = tocLinks.map((link) => { - const target = link.getAttribute("data-scroll-target"); - if (target.startsWith("#")) { - return window.document.getElementById(decodeURI(`${target.slice(1)}`)); - } else { - return window.document.querySelector(decodeURI(`${target}`)); - } - }); - - const sectionMargin = 200; - let currentActive = 0; - // track whether we've initialized state the first time - let init = false; - - const updateActiveLink = () => { - // The index from bottom to top (e.g. reversed list) - let sectionIndex = -1; - if ( - window.innerHeight + window.pageYOffset >= - window.document.body.offsetHeight - ) { - // This is the no-scroll case where last section should be the active one - sectionIndex = 0; - } else { - // This finds the last section visible on screen that should be made active - sectionIndex = [...sections].reverse().findIndex((section) => { - if (section) { - return window.pageYOffset >= section.offsetTop - sectionMargin; - } else { - return false; - } - }); - } - if (sectionIndex > -1) { - const current = sections.length - sectionIndex - 1; - if (current !== currentActive) { - removeAllActive(); - currentActive = current; - makeActive(current); - if (init) { - window.dispatchEvent(sectionChanged); - } - init = true; - } - } - }; - - const inHiddenRegion = (top, bottom, hiddenRegions) => { - for (const region of hiddenRegions) { - if (top <= region.bottom && bottom >= region.top) { - return true; - } - } - return false; - }; - - const categorySelector = "header.quarto-title-block .quarto-category"; - const activateCategories = (href) => { - // Find any categories - // Surround them with a link pointing back to: - // #category=Authoring - try { - const categoryEls = window.document.querySelectorAll(categorySelector); - for (const categoryEl of categoryEls) { - const categoryText = categoryEl.textContent; - if (categoryText) { - const link = `${href}#category=${encodeURIComponent(categoryText)}`; - const linkEl = window.document.createElement("a"); - linkEl.setAttribute("href", link); - for (const child of categoryEl.childNodes) { - linkEl.append(child); - } - categoryEl.appendChild(linkEl); - } - } - } catch { - // Ignore errors - } - }; - function hasTitleCategories() { - return window.document.querySelector(categorySelector) !== null; - } - - function offsetRelativeUrl(url) { - const offset = getMeta("quarto:offset"); - return offset ? offset + url : url; - } - - function offsetAbsoluteUrl(url) { - const offset = getMeta("quarto:offset"); - const baseUrl = new URL(offset, window.location); - - const projRelativeUrl = url.replace(baseUrl, ""); - if (projRelativeUrl.startsWith("/")) { - return projRelativeUrl; - } else { - return "/" + projRelativeUrl; - } - } - - // read a meta tag value - function getMeta(metaName) { - const metas = window.document.getElementsByTagName("meta"); - for (let i = 0; i < metas.length; i++) { - if (metas[i].getAttribute("name") === metaName) { - return metas[i].getAttribute("content"); - } - } - return ""; - } - - async function findAndActivateCategories() { - // Categories search with listing only use path without query - const currentPagePath = offsetAbsoluteUrl( - window.location.origin + window.location.pathname - ); - const response = await fetch(offsetRelativeUrl("listings.json")); - if (response.status == 200) { - return response.json().then(function (listingPaths) { - const listingHrefs = []; - for (const listingPath of listingPaths) { - const pathWithoutLeadingSlash = listingPath.listing.substring(1); - for (const item of listingPath.items) { - if ( - item === currentPagePath || - item === currentPagePath + "index.html" - ) { - // Resolve this path against the offset to be sure - // we already are using the correct path to the listing - // (this adjusts the listing urls to be rooted against - // whatever root the page is actually running against) - const relative = offsetRelativeUrl(pathWithoutLeadingSlash); - const baseUrl = window.location; - const resolvedPath = new URL(relative, baseUrl); - listingHrefs.push(resolvedPath.pathname); - break; - } - } - } - - // Look up the tree for a nearby linting and use that if we find one - const nearestListing = findNearestParentListing( - offsetAbsoluteUrl(window.location.pathname), - listingHrefs - ); - if (nearestListing) { - activateCategories(nearestListing); - } else { - // See if the referrer is a listing page for this item - const referredRelativePath = offsetAbsoluteUrl(document.referrer); - const referrerListing = listingHrefs.find((listingHref) => { - const isListingReferrer = - listingHref === referredRelativePath || - listingHref === referredRelativePath + "index.html"; - return isListingReferrer; - }); - - if (referrerListing) { - // Try to use the referrer if possible - activateCategories(referrerListing); - } else if (listingHrefs.length > 0) { - // Otherwise, just fall back to the first listing - activateCategories(listingHrefs[0]); - } - } - }); - } - } - if (hasTitleCategories()) { - findAndActivateCategories(); - } - - const findNearestParentListing = (href, listingHrefs) => { - if (!href || !listingHrefs) { - return undefined; - } - // Look up the tree for a nearby linting and use that if we find one - const relativeParts = href.substring(1).split("/"); - while (relativeParts.length > 0) { - const path = relativeParts.join("/"); - for (const listingHref of listingHrefs) { - if (listingHref.startsWith(path)) { - return listingHref; - } - } - relativeParts.pop(); - } - - return undefined; - }; - - const manageSidebarVisiblity = (el, placeholderDescriptor) => { - let isVisible = true; - let elRect; - - return (hiddenRegions) => { - if (el === null) { - return; - } - - // Find the last element of the TOC - const lastChildEl = el.lastElementChild; - - if (lastChildEl) { - // Converts the sidebar to a menu - const convertToMenu = () => { - for (const child of el.children) { - child.style.opacity = 0; - child.style.overflow = "hidden"; - child.style.pointerEvents = "none"; - } - - nexttick(() => { - const toggleContainer = window.document.createElement("div"); - toggleContainer.style.width = "100%"; - toggleContainer.classList.add("zindex-over-content"); - toggleContainer.classList.add("quarto-sidebar-toggle"); - toggleContainer.classList.add("headroom-target"); // Marks this to be managed by headeroom - toggleContainer.id = placeholderDescriptor.id; - toggleContainer.style.position = "fixed"; - - const toggleIcon = window.document.createElement("i"); - toggleIcon.classList.add("quarto-sidebar-toggle-icon"); - toggleIcon.classList.add("bi"); - toggleIcon.classList.add("bi-caret-down-fill"); - - const toggleTitle = window.document.createElement("div"); - const titleEl = window.document.body.querySelector( - placeholderDescriptor.titleSelector - ); - if (titleEl) { - toggleTitle.append( - titleEl.textContent || titleEl.innerText, - toggleIcon - ); - } - toggleTitle.classList.add("zindex-over-content"); - toggleTitle.classList.add("quarto-sidebar-toggle-title"); - toggleContainer.append(toggleTitle); - - const toggleContents = window.document.createElement("div"); - toggleContents.classList = el.classList; - toggleContents.classList.add("zindex-over-content"); - toggleContents.classList.add("quarto-sidebar-toggle-contents"); - for (const child of el.children) { - if (child.id === "toc-title") { - continue; - } - - const clone = child.cloneNode(true); - clone.style.opacity = 1; - clone.style.pointerEvents = null; - clone.style.display = null; - toggleContents.append(clone); - } - toggleContents.style.height = "0px"; - const positionToggle = () => { - // position the element (top left of parent, same width as parent) - if (!elRect) { - elRect = el.getBoundingClientRect(); - } - toggleContainer.style.left = `${elRect.left}px`; - toggleContainer.style.top = `${elRect.top}px`; - toggleContainer.style.width = `${elRect.width}px`; - }; - positionToggle(); - - toggleContainer.append(toggleContents); - el.parentElement.prepend(toggleContainer); - - // Process clicks - let tocShowing = false; - // Allow the caller to control whether this is dismissed - // when it is clicked (e.g. sidebar navigation supports - // opening and closing the nav tree, so don't dismiss on click) - const clickEl = placeholderDescriptor.dismissOnClick - ? toggleContainer - : toggleTitle; - - const closeToggle = () => { - if (tocShowing) { - toggleContainer.classList.remove("expanded"); - toggleContents.style.height = "0px"; - tocShowing = false; - } - }; - - // Get rid of any expanded toggle if the user scrolls - window.document.addEventListener( - "scroll", - throttle(() => { - closeToggle(); - }, 50) - ); - - // Handle positioning of the toggle - window.addEventListener( - "resize", - throttle(() => { - elRect = undefined; - positionToggle(); - }, 50) - ); - - window.addEventListener("quarto-hrChanged", () => { - elRect = undefined; - }); - - // Process the click - clickEl.onclick = () => { - if (!tocShowing) { - toggleContainer.classList.add("expanded"); - toggleContents.style.height = null; - tocShowing = true; - } else { - closeToggle(); - } - }; - }); - }; - - // Converts a sidebar from a menu back to a sidebar - const convertToSidebar = () => { - for (const child of el.children) { - child.style.opacity = 1; - child.style.overflow = null; - child.style.pointerEvents = null; - } - - const placeholderEl = window.document.getElementById( - placeholderDescriptor.id - ); - if (placeholderEl) { - placeholderEl.remove(); - } - - el.classList.remove("rollup"); - }; - - if (isReaderMode()) { - convertToMenu(); - isVisible = false; - } else { - // Find the top and bottom o the element that is being managed - const elTop = el.offsetTop; - const elBottom = - elTop + lastChildEl.offsetTop + lastChildEl.offsetHeight; - - if (!isVisible) { - // If the element is current not visible reveal if there are - // no conflicts with overlay regions - if (!inHiddenRegion(elTop, elBottom, hiddenRegions)) { - convertToSidebar(); - isVisible = true; - } - } else { - // If the element is visible, hide it if it conflicts with overlay regions - // and insert a placeholder toggle (or if we're in reader mode) - if (inHiddenRegion(elTop, elBottom, hiddenRegions)) { - convertToMenu(); - isVisible = false; - } - } - } - } - }; - }; - - const tabEls = document.querySelectorAll('a[data-bs-toggle="tab"]'); - for (const tabEl of tabEls) { - const id = tabEl.getAttribute("data-bs-target"); - if (id) { - const columnEl = document.querySelector( - `${id} .column-margin, .tabset-margin-content` - ); - if (columnEl) - tabEl.addEventListener("shown.bs.tab", function (event) { - const el = event.srcElement; - if (el) { - const visibleCls = `${el.id}-margin-content`; - // walk up until we find a parent tabset - let panelTabsetEl = el.parentElement; - while (panelTabsetEl) { - if (panelTabsetEl.classList.contains("panel-tabset")) { - break; - } - panelTabsetEl = panelTabsetEl.parentElement; - } - - if (panelTabsetEl) { - const prevSib = panelTabsetEl.previousElementSibling; - if ( - prevSib && - prevSib.classList.contains("tabset-margin-container") - ) { - const childNodes = prevSib.querySelectorAll( - ".tabset-margin-content" - ); - for (const childEl of childNodes) { - if (childEl.classList.contains(visibleCls)) { - childEl.classList.remove("collapse"); - } else { - childEl.classList.add("collapse"); - } - } - } - } - } - - layoutMarginEls(); - }); - } - } - - // Manage the visibility of the toc and the sidebar - const marginScrollVisibility = manageSidebarVisiblity(marginSidebarEl, { - id: "quarto-toc-toggle", - titleSelector: "#toc-title", - dismissOnClick: true, - }); - const sidebarScrollVisiblity = manageSidebarVisiblity(sidebarEl, { - id: "quarto-sidebarnav-toggle", - titleSelector: ".title", - dismissOnClick: false, - }); - let tocLeftScrollVisibility; - if (leftTocEl) { - tocLeftScrollVisibility = manageSidebarVisiblity(leftTocEl, { - id: "quarto-lefttoc-toggle", - titleSelector: "#toc-title", - dismissOnClick: true, - }); - } - - // Find the first element that uses formatting in special columns - const conflictingEls = window.document.body.querySelectorAll( - '[class^="column-"], [class*=" column-"], aside, [class*="margin-caption"], [class*=" margin-caption"], [class*="margin-ref"], [class*=" margin-ref"]' - ); - - // Filter all the possibly conflicting elements into ones - // the do conflict on the left or ride side - const arrConflictingEls = Array.from(conflictingEls); - const leftSideConflictEls = arrConflictingEls.filter((el) => { - if (el.tagName === "ASIDE") { - return false; - } - return Array.from(el.classList).find((className) => { - return ( - className !== "column-body" && - className.startsWith("column-") && - !className.endsWith("right") && - !className.endsWith("container") && - className !== "column-margin" - ); - }); - }); - const rightSideConflictEls = arrConflictingEls.filter((el) => { - if (el.tagName === "ASIDE") { - return true; - } - - const hasMarginCaption = Array.from(el.classList).find((className) => { - return className == "margin-caption"; - }); - if (hasMarginCaption) { - return true; - } - - return Array.from(el.classList).find((className) => { - return ( - className !== "column-body" && - !className.endsWith("container") && - className.startsWith("column-") && - !className.endsWith("left") - ); - }); - }); - - const kOverlapPaddingSize = 10; - function toRegions(els) { - return els.map((el) => { - const boundRect = el.getBoundingClientRect(); - const top = - boundRect.top + - document.documentElement.scrollTop - - kOverlapPaddingSize; - return { - top, - bottom: top + el.scrollHeight + 2 * kOverlapPaddingSize, - }; - }); - } - - let hasObserved = false; - const visibleItemObserver = (els) => { - let visibleElements = [...els]; - const intersectionObserver = new IntersectionObserver( - (entries, _observer) => { - entries.forEach((entry) => { - if (entry.isIntersecting) { - if (visibleElements.indexOf(entry.target) === -1) { - visibleElements.push(entry.target); - } - } else { - visibleElements = visibleElements.filter((visibleEntry) => { - return visibleEntry !== entry; - }); - } - }); - - if (!hasObserved) { - hideOverlappedSidebars(); - } - hasObserved = true; - }, - {} - ); - els.forEach((el) => { - intersectionObserver.observe(el); - }); - - return { - getVisibleEntries: () => { - return visibleElements; - }, - }; - }; - - const rightElementObserver = visibleItemObserver(rightSideConflictEls); - const leftElementObserver = visibleItemObserver(leftSideConflictEls); - - const hideOverlappedSidebars = () => { - marginScrollVisibility(toRegions(rightElementObserver.getVisibleEntries())); - sidebarScrollVisiblity(toRegions(leftElementObserver.getVisibleEntries())); - if (tocLeftScrollVisibility) { - tocLeftScrollVisibility( - toRegions(leftElementObserver.getVisibleEntries()) - ); - } - }; - - window.quartoToggleReader = () => { - // Applies a slow class (or removes it) - // to update the transition speed - const slowTransition = (slow) => { - const manageTransition = (id, slow) => { - const el = document.getElementById(id); - if (el) { - if (slow) { - el.classList.add("slow"); - } else { - el.classList.remove("slow"); - } - } - }; - - manageTransition("TOC", slow); - manageTransition("quarto-sidebar", slow); - }; - const readerMode = !isReaderMode(); - setReaderModeValue(readerMode); - - // If we're entering reader mode, slow the transition - if (readerMode) { - slowTransition(readerMode); - } - highlightReaderToggle(readerMode); - hideOverlappedSidebars(); - - // If we're exiting reader mode, restore the non-slow transition - if (!readerMode) { - slowTransition(!readerMode); - } - }; - - const highlightReaderToggle = (readerMode) => { - const els = document.querySelectorAll(".quarto-reader-toggle"); - if (els) { - els.forEach((el) => { - if (readerMode) { - el.classList.add("reader"); - } else { - el.classList.remove("reader"); - } - }); - } - }; - - const setReaderModeValue = (val) => { - if (window.location.protocol !== "file:") { - window.localStorage.setItem("quarto-reader-mode", val); - } else { - localReaderMode = val; - } - }; - - const isReaderMode = () => { - if (window.location.protocol !== "file:") { - return window.localStorage.getItem("quarto-reader-mode") === "true"; - } else { - return localReaderMode; - } - }; - let localReaderMode = null; - - const tocOpenDepthStr = tocEl?.getAttribute("data-toc-expanded"); - const tocOpenDepth = tocOpenDepthStr ? Number(tocOpenDepthStr) : 1; - - // Walk the TOC and collapse/expand nodes - // Nodes are expanded if: - // - they are top level - // - they have children that are 'active' links - // - they are directly below an link that is 'active' - const walk = (el, depth) => { - // Tick depth when we enter a UL - if (el.tagName === "UL") { - depth = depth + 1; - } - - // It this is active link - let isActiveNode = false; - if (el.tagName === "A" && el.classList.contains("active")) { - isActiveNode = true; - } - - // See if there is an active child to this element - let hasActiveChild = false; - for (child of el.children) { - hasActiveChild = walk(child, depth) || hasActiveChild; - } - - // Process the collapse state if this is an UL - if (el.tagName === "UL") { - if (tocOpenDepth === -1 && depth > 1) { - // toc-expand: false - el.classList.add("collapse"); - } else if ( - depth <= tocOpenDepth || - hasActiveChild || - prevSiblingIsActiveLink(el) - ) { - el.classList.remove("collapse"); - } else { - el.classList.add("collapse"); - } - - // untick depth when we leave a UL - depth = depth - 1; - } - return hasActiveChild || isActiveNode; - }; - - // walk the TOC and expand / collapse any items that should be shown - if (tocEl) { - updateActiveLink(); - walk(tocEl, 0); - } - - // Throttle the scroll event and walk peridiocally - window.document.addEventListener( - "scroll", - throttle(() => { - if (tocEl) { - updateActiveLink(); - walk(tocEl, 0); - } - if (!isReaderMode()) { - hideOverlappedSidebars(); - } - }, 5) - ); - window.addEventListener( - "resize", - throttle(() => { - if (tocEl) { - updateActiveLink(); - walk(tocEl, 0); - } - if (!isReaderMode()) { - hideOverlappedSidebars(); - } - }, 10) - ); - hideOverlappedSidebars(); - highlightReaderToggle(isReaderMode()); -}); - -// grouped tabsets -window.addEventListener("pageshow", (_event) => { - function getTabSettings() { - const data = localStorage.getItem("quarto-persistent-tabsets-data"); - if (!data) { - localStorage.setItem("quarto-persistent-tabsets-data", "{}"); - return {}; - } - if (data) { - return JSON.parse(data); - } - } - - function setTabSettings(data) { - localStorage.setItem( - "quarto-persistent-tabsets-data", - JSON.stringify(data) - ); - } - - function setTabState(groupName, groupValue) { - const data = getTabSettings(); - data[groupName] = groupValue; - setTabSettings(data); - } - - function toggleTab(tab, active) { - const tabPanelId = tab.getAttribute("aria-controls"); - const tabPanel = document.getElementById(tabPanelId); - if (active) { - tab.classList.add("active"); - tabPanel.classList.add("active"); - } else { - tab.classList.remove("active"); - tabPanel.classList.remove("active"); - } - } - - function toggleAll(selectedGroup, selectorsToSync) { - for (const [thisGroup, tabs] of Object.entries(selectorsToSync)) { - const active = selectedGroup === thisGroup; - for (const tab of tabs) { - toggleTab(tab, active); - } - } - } - - function findSelectorsToSyncByLanguage() { - const result = {}; - const tabs = Array.from( - document.querySelectorAll(`div[data-group] a[id^='tabset-']`) - ); - for (const item of tabs) { - const div = item.parentElement.parentElement.parentElement; - const group = div.getAttribute("data-group"); - if (!result[group]) { - result[group] = {}; - } - const selectorsToSync = result[group]; - const value = item.innerHTML; - if (!selectorsToSync[value]) { - selectorsToSync[value] = []; - } - selectorsToSync[value].push(item); - } - return result; - } - - function setupSelectorSync() { - const selectorsToSync = findSelectorsToSyncByLanguage(); - Object.entries(selectorsToSync).forEach(([group, tabSetsByValue]) => { - Object.entries(tabSetsByValue).forEach(([value, items]) => { - items.forEach((item) => { - item.addEventListener("click", (_event) => { - setTabState(group, value); - toggleAll(value, selectorsToSync[group]); - }); - }); - }); - }); - return selectorsToSync; - } - - const selectorsToSync = setupSelectorSync(); - for (const [group, selectedName] of Object.entries(getTabSettings())) { - const selectors = selectorsToSync[group]; - // it's possible that stale state gives us empty selections, so we explicitly check here. - if (selectors) { - toggleAll(selectedName, selectors); - } - } -}); - -function throttle(func, wait) { - let waiting = false; - return function () { - if (!waiting) { - func.apply(this, arguments); - waiting = true; - setTimeout(function () { - waiting = false; - }, wait); - } - }; -} - -function nexttick(func) { - return setTimeout(func, 0); -} diff --git a/docs/validmind/vm_models_files/libs/quarto-html/tippy.css b/docs/validmind/vm_models_files/libs/quarto-html/tippy.css deleted file mode 100644 index e6ae635cb..000000000 --- a/docs/validmind/vm_models_files/libs/quarto-html/tippy.css +++ /dev/null @@ -1 +0,0 @@ -.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1} \ No newline at end of file diff --git a/docs/validmind/vm_models_files/libs/quarto-html/tippy.umd.min.js b/docs/validmind/vm_models_files/libs/quarto-html/tippy.umd.min.js deleted file mode 100644 index ca292be32..000000000 --- a/docs/validmind/vm_models_files/libs/quarto-html/tippy.umd.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],t):(e=e||self).tippy=t(e.Popper)}(this,(function(e){"use strict";var t={passive:!0,capture:!0},n=function(){return document.body};function r(e,t,n){if(Array.isArray(e)){var r=e[t];return null==r?Array.isArray(n)?n[t]:n:r}return e}function o(e,t){var n={}.toString.call(e);return 0===n.indexOf("[object")&&n.indexOf(t+"]")>-1}function i(e,t){return"function"==typeof e?e.apply(void 0,t):e}function a(e,t){return 0===t?e:function(r){clearTimeout(n),n=setTimeout((function(){e(r)}),t)};var n}function s(e,t){var n=Object.assign({},e);return t.forEach((function(e){delete n[e]})),n}function u(e){return[].concat(e)}function c(e,t){-1===e.indexOf(t)&&e.push(t)}function p(e){return e.split("-")[0]}function f(e){return[].slice.call(e)}function l(e){return Object.keys(e).reduce((function(t,n){return void 0!==e[n]&&(t[n]=e[n]),t}),{})}function d(){return document.createElement("div")}function v(e){return["Element","Fragment"].some((function(t){return o(e,t)}))}function m(e){return o(e,"MouseEvent")}function g(e){return!(!e||!e._tippy||e._tippy.reference!==e)}function h(e){return v(e)?[e]:function(e){return o(e,"NodeList")}(e)?f(e):Array.isArray(e)?e:f(document.querySelectorAll(e))}function b(e,t){e.forEach((function(e){e&&(e.style.transitionDuration=t+"ms")}))}function y(e,t){e.forEach((function(e){e&&e.setAttribute("data-state",t)}))}function w(e){var t,n=u(e)[0];return null!=n&&null!=(t=n.ownerDocument)&&t.body?n.ownerDocument:document}function E(e,t,n){var r=t+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(t){e[r](t,n)}))}function O(e,t){for(var n=t;n;){var r;if(e.contains(n))return!0;n=null==n.getRootNode||null==(r=n.getRootNode())?void 0:r.host}return!1}var x={isTouch:!1},C=0;function T(){x.isTouch||(x.isTouch=!0,window.performance&&document.addEventListener("mousemove",A))}function A(){var e=performance.now();e-C<20&&(x.isTouch=!1,document.removeEventListener("mousemove",A)),C=e}function L(){var e=document.activeElement;if(g(e)){var t=e._tippy;e.blur&&!t.state.isVisible&&e.blur()}}var D=!!("undefined"!=typeof window&&"undefined"!=typeof document)&&!!window.msCrypto,R=Object.assign({appendTo:n,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),k=Object.keys(R);function P(e){var t=(e.plugins||[]).reduce((function(t,n){var r,o=n.name,i=n.defaultValue;o&&(t[o]=void 0!==e[o]?e[o]:null!=(r=R[o])?r:i);return t}),{});return Object.assign({},e,t)}function j(e,t){var n=Object.assign({},t,{content:i(t.content,[e])},t.ignoreAttributes?{}:function(e,t){return(t?Object.keys(P(Object.assign({},R,{plugins:t}))):k).reduce((function(t,n){var r=(e.getAttribute("data-tippy-"+n)||"").trim();if(!r)return t;if("content"===n)t[n]=r;else try{t[n]=JSON.parse(r)}catch(e){t[n]=r}return t}),{})}(e,t.plugins));return n.aria=Object.assign({},R.aria,n.aria),n.aria={expanded:"auto"===n.aria.expanded?t.interactive:n.aria.expanded,content:"auto"===n.aria.content?t.interactive?null:"describedby":n.aria.content},n}function M(e,t){e.innerHTML=t}function V(e){var t=d();return!0===e?t.className="tippy-arrow":(t.className="tippy-svg-arrow",v(e)?t.appendChild(e):M(t,e)),t}function I(e,t){v(t.content)?(M(e,""),e.appendChild(t.content)):"function"!=typeof t.content&&(t.allowHTML?M(e,t.content):e.textContent=t.content)}function S(e){var t=e.firstElementChild,n=f(t.children);return{box:t,content:n.find((function(e){return e.classList.contains("tippy-content")})),arrow:n.find((function(e){return e.classList.contains("tippy-arrow")||e.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(e){return e.classList.contains("tippy-backdrop")}))}}function N(e){var t=d(),n=d();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=d();function o(n,r){var o=S(t),i=o.box,a=o.content,s=o.arrow;r.theme?i.setAttribute("data-theme",r.theme):i.removeAttribute("data-theme"),"string"==typeof r.animation?i.setAttribute("data-animation",r.animation):i.removeAttribute("data-animation"),r.inertia?i.setAttribute("data-inertia",""):i.removeAttribute("data-inertia"),i.style.maxWidth="number"==typeof r.maxWidth?r.maxWidth+"px":r.maxWidth,r.role?i.setAttribute("role",r.role):i.removeAttribute("role"),n.content===r.content&&n.allowHTML===r.allowHTML||I(a,e.props),r.arrow?s?n.arrow!==r.arrow&&(i.removeChild(s),i.appendChild(V(r.arrow))):i.appendChild(V(r.arrow)):s&&i.removeChild(s)}return r.className="tippy-content",r.setAttribute("data-state","hidden"),I(r,e.props),t.appendChild(n),n.appendChild(r),o(e.props,e.props),{popper:t,onUpdate:o}}N.$$tippy=!0;var B=1,H=[],U=[];function _(o,s){var v,g,h,C,T,A,L,k,M=j(o,Object.assign({},R,P(l(s)))),V=!1,I=!1,N=!1,_=!1,F=[],W=a(we,M.interactiveDebounce),X=B++,Y=(k=M.plugins).filter((function(e,t){return k.indexOf(e)===t})),$={id:X,reference:o,popper:d(),popperInstance:null,props:M,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:Y,clearDelayTimeouts:function(){clearTimeout(v),clearTimeout(g),cancelAnimationFrame(h)},setProps:function(e){if($.state.isDestroyed)return;ae("onBeforeUpdate",[$,e]),be();var t=$.props,n=j(o,Object.assign({},t,l(e),{ignoreAttributes:!0}));$.props=n,he(),t.interactiveDebounce!==n.interactiveDebounce&&(ce(),W=a(we,n.interactiveDebounce));t.triggerTarget&&!n.triggerTarget?u(t.triggerTarget).forEach((function(e){e.removeAttribute("aria-expanded")})):n.triggerTarget&&o.removeAttribute("aria-expanded");ue(),ie(),J&&J(t,n);$.popperInstance&&(Ce(),Ae().forEach((function(e){requestAnimationFrame(e._tippy.popperInstance.forceUpdate)})));ae("onAfterUpdate",[$,e])},setContent:function(e){$.setProps({content:e})},show:function(){var e=$.state.isVisible,t=$.state.isDestroyed,o=!$.state.isEnabled,a=x.isTouch&&!$.props.touch,s=r($.props.duration,0,R.duration);if(e||t||o||a)return;if(te().hasAttribute("disabled"))return;if(ae("onShow",[$],!1),!1===$.props.onShow($))return;$.state.isVisible=!0,ee()&&(z.style.visibility="visible");ie(),de(),$.state.isMounted||(z.style.transition="none");if(ee()){var u=re(),p=u.box,f=u.content;b([p,f],0)}A=function(){var e;if($.state.isVisible&&!_){if(_=!0,z.offsetHeight,z.style.transition=$.props.moveTransition,ee()&&$.props.animation){var t=re(),n=t.box,r=t.content;b([n,r],s),y([n,r],"visible")}se(),ue(),c(U,$),null==(e=$.popperInstance)||e.forceUpdate(),ae("onMount",[$]),$.props.animation&&ee()&&function(e,t){me(e,t)}(s,(function(){$.state.isShown=!0,ae("onShown",[$])}))}},function(){var e,t=$.props.appendTo,r=te();e=$.props.interactive&&t===n||"parent"===t?r.parentNode:i(t,[r]);e.contains(z)||e.appendChild(z);$.state.isMounted=!0,Ce()}()},hide:function(){var e=!$.state.isVisible,t=$.state.isDestroyed,n=!$.state.isEnabled,o=r($.props.duration,1,R.duration);if(e||t||n)return;if(ae("onHide",[$],!1),!1===$.props.onHide($))return;$.state.isVisible=!1,$.state.isShown=!1,_=!1,V=!1,ee()&&(z.style.visibility="hidden");if(ce(),ve(),ie(!0),ee()){var i=re(),a=i.box,s=i.content;$.props.animation&&(b([a,s],o),y([a,s],"hidden"))}se(),ue(),$.props.animation?ee()&&function(e,t){me(e,(function(){!$.state.isVisible&&z.parentNode&&z.parentNode.contains(z)&&t()}))}(o,$.unmount):$.unmount()},hideWithInteractivity:function(e){ne().addEventListener("mousemove",W),c(H,W),W(e)},enable:function(){$.state.isEnabled=!0},disable:function(){$.hide(),$.state.isEnabled=!1},unmount:function(){$.state.isVisible&&$.hide();if(!$.state.isMounted)return;Te(),Ae().forEach((function(e){e._tippy.unmount()})),z.parentNode&&z.parentNode.removeChild(z);U=U.filter((function(e){return e!==$})),$.state.isMounted=!1,ae("onHidden",[$])},destroy:function(){if($.state.isDestroyed)return;$.clearDelayTimeouts(),$.unmount(),be(),delete o._tippy,$.state.isDestroyed=!0,ae("onDestroy",[$])}};if(!M.render)return $;var q=M.render($),z=q.popper,J=q.onUpdate;z.setAttribute("data-tippy-root",""),z.id="tippy-"+$.id,$.popper=z,o._tippy=$,z._tippy=$;var G=Y.map((function(e){return e.fn($)})),K=o.hasAttribute("aria-expanded");return he(),ue(),ie(),ae("onCreate",[$]),M.showOnCreate&&Le(),z.addEventListener("mouseenter",(function(){$.props.interactive&&$.state.isVisible&&$.clearDelayTimeouts()})),z.addEventListener("mouseleave",(function(){$.props.interactive&&$.props.trigger.indexOf("mouseenter")>=0&&ne().addEventListener("mousemove",W)})),$;function Q(){var e=$.props.touch;return Array.isArray(e)?e:[e,0]}function Z(){return"hold"===Q()[0]}function ee(){var e;return!(null==(e=$.props.render)||!e.$$tippy)}function te(){return L||o}function ne(){var e=te().parentNode;return e?w(e):document}function re(){return S(z)}function oe(e){return $.state.isMounted&&!$.state.isVisible||x.isTouch||C&&"focus"===C.type?0:r($.props.delay,e?0:1,R.delay)}function ie(e){void 0===e&&(e=!1),z.style.pointerEvents=$.props.interactive&&!e?"":"none",z.style.zIndex=""+$.props.zIndex}function ae(e,t,n){var r;(void 0===n&&(n=!0),G.forEach((function(n){n[e]&&n[e].apply(n,t)})),n)&&(r=$.props)[e].apply(r,t)}function se(){var e=$.props.aria;if(e.content){var t="aria-"+e.content,n=z.id;u($.props.triggerTarget||o).forEach((function(e){var r=e.getAttribute(t);if($.state.isVisible)e.setAttribute(t,r?r+" "+n:n);else{var o=r&&r.replace(n,"").trim();o?e.setAttribute(t,o):e.removeAttribute(t)}}))}}function ue(){!K&&$.props.aria.expanded&&u($.props.triggerTarget||o).forEach((function(e){$.props.interactive?e.setAttribute("aria-expanded",$.state.isVisible&&e===te()?"true":"false"):e.removeAttribute("aria-expanded")}))}function ce(){ne().removeEventListener("mousemove",W),H=H.filter((function(e){return e!==W}))}function pe(e){if(!x.isTouch||!N&&"mousedown"!==e.type){var t=e.composedPath&&e.composedPath()[0]||e.target;if(!$.props.interactive||!O(z,t)){if(u($.props.triggerTarget||o).some((function(e){return O(e,t)}))){if(x.isTouch)return;if($.state.isVisible&&$.props.trigger.indexOf("click")>=0)return}else ae("onClickOutside",[$,e]);!0===$.props.hideOnClick&&($.clearDelayTimeouts(),$.hide(),I=!0,setTimeout((function(){I=!1})),$.state.isMounted||ve())}}}function fe(){N=!0}function le(){N=!1}function de(){var e=ne();e.addEventListener("mousedown",pe,!0),e.addEventListener("touchend",pe,t),e.addEventListener("touchstart",le,t),e.addEventListener("touchmove",fe,t)}function ve(){var e=ne();e.removeEventListener("mousedown",pe,!0),e.removeEventListener("touchend",pe,t),e.removeEventListener("touchstart",le,t),e.removeEventListener("touchmove",fe,t)}function me(e,t){var n=re().box;function r(e){e.target===n&&(E(n,"remove",r),t())}if(0===e)return t();E(n,"remove",T),E(n,"add",r),T=r}function ge(e,t,n){void 0===n&&(n=!1),u($.props.triggerTarget||o).forEach((function(r){r.addEventListener(e,t,n),F.push({node:r,eventType:e,handler:t,options:n})}))}function he(){var e;Z()&&(ge("touchstart",ye,{passive:!0}),ge("touchend",Ee,{passive:!0})),(e=$.props.trigger,e.split(/\s+/).filter(Boolean)).forEach((function(e){if("manual"!==e)switch(ge(e,ye),e){case"mouseenter":ge("mouseleave",Ee);break;case"focus":ge(D?"focusout":"blur",Oe);break;case"focusin":ge("focusout",Oe)}}))}function be(){F.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),F=[]}function ye(e){var t,n=!1;if($.state.isEnabled&&!xe(e)&&!I){var r="focus"===(null==(t=C)?void 0:t.type);C=e,L=e.currentTarget,ue(),!$.state.isVisible&&m(e)&&H.forEach((function(t){return t(e)})),"click"===e.type&&($.props.trigger.indexOf("mouseenter")<0||V)&&!1!==$.props.hideOnClick&&$.state.isVisible?n=!0:Le(e),"click"===e.type&&(V=!n),n&&!r&&De(e)}}function we(e){var t=e.target,n=te().contains(t)||z.contains(t);"mousemove"===e.type&&n||function(e,t){var n=t.clientX,r=t.clientY;return e.every((function(e){var t=e.popperRect,o=e.popperState,i=e.props.interactiveBorder,a=p(o.placement),s=o.modifiersData.offset;if(!s)return!0;var u="bottom"===a?s.top.y:0,c="top"===a?s.bottom.y:0,f="right"===a?s.left.x:0,l="left"===a?s.right.x:0,d=t.top-r+u>i,v=r-t.bottom-c>i,m=t.left-n+f>i,g=n-t.right-l>i;return d||v||m||g}))}(Ae().concat(z).map((function(e){var t,n=null==(t=e._tippy.popperInstance)?void 0:t.state;return n?{popperRect:e.getBoundingClientRect(),popperState:n,props:M}:null})).filter(Boolean),e)&&(ce(),De(e))}function Ee(e){xe(e)||$.props.trigger.indexOf("click")>=0&&V||($.props.interactive?$.hideWithInteractivity(e):De(e))}function Oe(e){$.props.trigger.indexOf("focusin")<0&&e.target!==te()||$.props.interactive&&e.relatedTarget&&z.contains(e.relatedTarget)||De(e)}function xe(e){return!!x.isTouch&&Z()!==e.type.indexOf("touch")>=0}function Ce(){Te();var t=$.props,n=t.popperOptions,r=t.placement,i=t.offset,a=t.getReferenceClientRect,s=t.moveTransition,u=ee()?S(z).arrow:null,c=a?{getBoundingClientRect:a,contextElement:a.contextElement||te()}:o,p=[{name:"offset",options:{offset:i}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(e){var t=e.state;if(ee()){var n=re().box;["placement","reference-hidden","escaped"].forEach((function(e){"placement"===e?n.setAttribute("data-placement",t.placement):t.attributes.popper["data-popper-"+e]?n.setAttribute("data-"+e,""):n.removeAttribute("data-"+e)})),t.attributes.popper={}}}}];ee()&&u&&p.push({name:"arrow",options:{element:u,padding:3}}),p.push.apply(p,(null==n?void 0:n.modifiers)||[]),$.popperInstance=e.createPopper(c,z,Object.assign({},n,{placement:r,onFirstUpdate:A,modifiers:p}))}function Te(){$.popperInstance&&($.popperInstance.destroy(),$.popperInstance=null)}function Ae(){return f(z.querySelectorAll("[data-tippy-root]"))}function Le(e){$.clearDelayTimeouts(),e&&ae("onTrigger",[$,e]),de();var t=oe(!0),n=Q(),r=n[0],o=n[1];x.isTouch&&"hold"===r&&o&&(t=o),t?v=setTimeout((function(){$.show()}),t):$.show()}function De(e){if($.clearDelayTimeouts(),ae("onUntrigger",[$,e]),$.state.isVisible){if(!($.props.trigger.indexOf("mouseenter")>=0&&$.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(e.type)>=0&&V)){var t=oe(!1);t?g=setTimeout((function(){$.state.isVisible&&$.hide()}),t):h=requestAnimationFrame((function(){$.hide()}))}}else ve()}}function F(e,n){void 0===n&&(n={});var r=R.plugins.concat(n.plugins||[]);document.addEventListener("touchstart",T,t),window.addEventListener("blur",L);var o=Object.assign({},n,{plugins:r}),i=h(e).reduce((function(e,t){var n=t&&_(t,o);return n&&e.push(n),e}),[]);return v(e)?i[0]:i}F.defaultProps=R,F.setDefaultProps=function(e){Object.keys(e).forEach((function(t){R[t]=e[t]}))},F.currentInput=x;var W=Object.assign({},e.applyStyles,{effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow)}}),X={mouseover:"mouseenter",focusin:"focus",click:"click"};var Y={name:"animateFill",defaultValue:!1,fn:function(e){var t;if(null==(t=e.props.render)||!t.$$tippy)return{};var n=S(e.popper),r=n.box,o=n.content,i=e.props.animateFill?function(){var e=d();return e.className="tippy-backdrop",y([e],"hidden"),e}():null;return{onCreate:function(){i&&(r.insertBefore(i,r.firstElementChild),r.setAttribute("data-animatefill",""),r.style.overflow="hidden",e.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(i){var e=r.style.transitionDuration,t=Number(e.replace("ms",""));o.style.transitionDelay=Math.round(t/10)+"ms",i.style.transitionDuration=e,y([i],"visible")}},onShow:function(){i&&(i.style.transitionDuration="0ms")},onHide:function(){i&&y([i],"hidden")}}}};var $={clientX:0,clientY:0},q=[];function z(e){var t=e.clientX,n=e.clientY;$={clientX:t,clientY:n}}var J={name:"followCursor",defaultValue:!1,fn:function(e){var t=e.reference,n=w(e.props.triggerTarget||t),r=!1,o=!1,i=!0,a=e.props;function s(){return"initial"===e.props.followCursor&&e.state.isVisible}function u(){n.addEventListener("mousemove",f)}function c(){n.removeEventListener("mousemove",f)}function p(){r=!0,e.setProps({getReferenceClientRect:null}),r=!1}function f(n){var r=!n.target||t.contains(n.target),o=e.props.followCursor,i=n.clientX,a=n.clientY,s=t.getBoundingClientRect(),u=i-s.left,c=a-s.top;!r&&e.props.interactive||e.setProps({getReferenceClientRect:function(){var e=t.getBoundingClientRect(),n=i,r=a;"initial"===o&&(n=e.left+u,r=e.top+c);var s="horizontal"===o?e.top:r,p="vertical"===o?e.right:n,f="horizontal"===o?e.bottom:r,l="vertical"===o?e.left:n;return{width:p-l,height:f-s,top:s,right:p,bottom:f,left:l}}})}function l(){e.props.followCursor&&(q.push({instance:e,doc:n}),function(e){e.addEventListener("mousemove",z)}(n))}function d(){0===(q=q.filter((function(t){return t.instance!==e}))).filter((function(e){return e.doc===n})).length&&function(e){e.removeEventListener("mousemove",z)}(n)}return{onCreate:l,onDestroy:d,onBeforeUpdate:function(){a=e.props},onAfterUpdate:function(t,n){var i=n.followCursor;r||void 0!==i&&a.followCursor!==i&&(d(),i?(l(),!e.state.isMounted||o||s()||u()):(c(),p()))},onMount:function(){e.props.followCursor&&!o&&(i&&(f($),i=!1),s()||u())},onTrigger:function(e,t){m(t)&&($={clientX:t.clientX,clientY:t.clientY}),o="focus"===t.type},onHidden:function(){e.props.followCursor&&(p(),c(),i=!0)}}}};var G={name:"inlinePositioning",defaultValue:!1,fn:function(e){var t,n=e.reference;var r=-1,o=!1,i=[],a={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(o){var a=o.state;e.props.inlinePositioning&&(-1!==i.indexOf(a.placement)&&(i=[]),t!==a.placement&&-1===i.indexOf(a.placement)&&(i.push(a.placement),e.setProps({getReferenceClientRect:function(){return function(e){return function(e,t,n,r){if(n.length<2||null===e)return t;if(2===n.length&&r>=0&&n[0].left>n[1].right)return n[r]||t;switch(e){case"top":case"bottom":var o=n[0],i=n[n.length-1],a="top"===e,s=o.top,u=i.bottom,c=a?o.left:i.left,p=a?o.right:i.right;return{top:s,bottom:u,left:c,right:p,width:p-c,height:u-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(e){return e.left}))),l=Math.max.apply(Math,n.map((function(e){return e.right}))),d=n.filter((function(t){return"left"===e?t.left===f:t.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return t}}(p(e),n.getBoundingClientRect(),f(n.getClientRects()),r)}(a.placement)}})),t=a.placement)}};function s(){var t;o||(t=function(e,t){var n;return{popperOptions:Object.assign({},e.popperOptions,{modifiers:[].concat(((null==(n=e.popperOptions)?void 0:n.modifiers)||[]).filter((function(e){return e.name!==t.name})),[t])})}}(e.props,a),o=!0,e.setProps(t),o=!1)}return{onCreate:s,onAfterUpdate:s,onTrigger:function(t,n){if(m(n)){var o=f(e.reference.getClientRects()),i=o.find((function(e){return e.left-2<=n.clientX&&e.right+2>=n.clientX&&e.top-2<=n.clientY&&e.bottom+2>=n.clientY})),a=o.indexOf(i);r=a>-1?a:r}},onHidden:function(){r=-1}}}};var K={name:"sticky",defaultValue:!1,fn:function(e){var t=e.reference,n=e.popper;function r(t){return!0===e.props.sticky||e.props.sticky===t}var o=null,i=null;function a(){var s=r("reference")?(e.popperInstance?e.popperInstance.state.elements.reference:t).getBoundingClientRect():null,u=r("popper")?n.getBoundingClientRect():null;(s&&Q(o,s)||u&&Q(i,u))&&e.popperInstance&&e.popperInstance.update(),o=s,i=u,e.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){e.props.sticky&&a()}}}};function Q(e,t){return!e||!t||(e.top!==t.top||e.right!==t.right||e.bottom!==t.bottom||e.left!==t.left)}return F.setDefaultProps({plugins:[Y,J,G,K],render:N}),F.createSingleton=function(e,t){var n;void 0===t&&(t={});var r,o=e,i=[],a=[],c=t.overrides,p=[],f=!1;function l(){a=o.map((function(e){return u(e.props.triggerTarget||e.reference)})).reduce((function(e,t){return e.concat(t)}),[])}function v(){i=o.map((function(e){return e.reference}))}function m(e){o.forEach((function(t){e?t.enable():t.disable()}))}function g(e){return o.map((function(t){var n=t.setProps;return t.setProps=function(o){n(o),t.reference===r&&e.setProps(o)},function(){t.setProps=n}}))}function h(e,t){var n=a.indexOf(t);if(t!==r){r=t;var s=(c||[]).concat("content").reduce((function(e,t){return e[t]=o[n].props[t],e}),{});e.setProps(Object.assign({},s,{getReferenceClientRect:"function"==typeof s.getReferenceClientRect?s.getReferenceClientRect:function(){var e;return null==(e=i[n])?void 0:e.getBoundingClientRect()}}))}}m(!1),v(),l();var b={fn:function(){return{onDestroy:function(){m(!0)},onHidden:function(){r=null},onClickOutside:function(e){e.props.showOnCreate&&!f&&(f=!0,r=null)},onShow:function(e){e.props.showOnCreate&&!f&&(f=!0,h(e,i[0]))},onTrigger:function(e,t){h(e,t.currentTarget)}}}},y=F(d(),Object.assign({},s(t,["overrides"]),{plugins:[b].concat(t.plugins||[]),triggerTarget:a,popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat((null==(n=t.popperOptions)?void 0:n.modifiers)||[],[W])})})),w=y.show;y.show=function(e){if(w(),!r&&null==e)return h(y,i[0]);if(!r||null!=e){if("number"==typeof e)return i[e]&&h(y,i[e]);if(o.indexOf(e)>=0){var t=e.reference;return h(y,t)}return i.indexOf(e)>=0?h(y,e):void 0}},y.showNext=function(){var e=i[0];if(!r)return y.show(0);var t=i.indexOf(r);y.show(i[t+1]||e)},y.showPrevious=function(){var e=i[i.length-1];if(!r)return y.show(e);var t=i.indexOf(r),n=i[t-1]||e;y.show(n)};var E=y.setProps;return y.setProps=function(e){c=e.overrides||c,E(e)},y.setInstances=function(e){m(!0),p.forEach((function(e){return e()})),o=e,m(!1),v(),l(),p=g(y),y.setProps({triggerTarget:a})},p=g(y),y},F.delegate=function(e,n){var r=[],o=[],i=!1,a=n.target,c=s(n,["target"]),p=Object.assign({},c,{trigger:"manual",touch:!1}),f=Object.assign({touch:R.touch},c,{showOnCreate:!0}),l=F(e,p);function d(e){if(e.target&&!i){var t=e.target.closest(a);if(t){var r=t.getAttribute("data-tippy-trigger")||n.trigger||R.trigger;if(!t._tippy&&!("touchstart"===e.type&&"boolean"==typeof f.touch||"touchstart"!==e.type&&r.indexOf(X[e.type])<0)){var s=F(t,f);s&&(o=o.concat(s))}}}}function v(e,t,n,o){void 0===o&&(o=!1),e.addEventListener(t,n,o),r.push({node:e,eventType:t,handler:n,options:o})}return u(l).forEach((function(e){var n=e.destroy,a=e.enable,s=e.disable;e.destroy=function(e){void 0===e&&(e=!0),e&&o.forEach((function(e){e.destroy()})),o=[],r.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),r=[],n()},e.enable=function(){a(),o.forEach((function(e){return e.enable()})),i=!1},e.disable=function(){s(),o.forEach((function(e){return e.disable()})),i=!0},function(e){var n=e.reference;v(n,"touchstart",d,t),v(n,"mouseover",d),v(n,"focusin",d),v(n,"click",d)}(e)})),l},F.hideAll=function(e){var t=void 0===e?{}:e,n=t.exclude,r=t.duration;U.forEach((function(e){var t=!1;if(n&&(t=g(n)?e.reference===n:e.popper===n.popper),!t){var o=e.props.duration;e.setProps({duration:r}),e.hide(),e.state.isDestroyed||e.setProps({duration:o})}}))},F.roundArrow='',F})); - From 5e945bea15a5dd28281ffdda61ae0751da836767 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Mon, 27 Jan 2025 15:33:44 -0800 Subject: [PATCH 023/207] Got vm_models working --- docs/templates/class.qmd.jinja2 | 5 +- docs/templates/errors.qmd.jinja2 | 12 - docs/templates/function.qmd.jinja2 | 4 +- docs/templates/macros/docstring.jinja2 | 6 +- docs/templates/module.qmd.jinja2 | 30 +- docs/validmind.html | 813 +++++++ .../classification/customer_churn.qmd | 54 + .../datasets/classification/taiwan_credit.qmd | 54 + docs/validmind/datasets/regression/fred.qmd | 8 +- .../datasets/regression/lending_club.qmd | 8 +- docs/validmind/errors.qmd | 88 +- docs/validmind/test_suites.qmd | 155 +- docs/validmind/test_suites/classifier.qmd | 28 +- docs/validmind/test_suites/cluster.qmd | 16 +- docs/validmind/test_suites/embeddings.qmd | 12 +- docs/validmind/test_suites/llm.qmd | 24 +- docs/validmind/test_suites/nlp.qmd | 20 +- .../test_suites/parameters_optimization.qmd | 4 +- docs/validmind/test_suites/regression.qmd | 20 +- .../test_suites/statsmodels_timeseries.qmd | 8 +- docs/validmind/test_suites/summarization.qmd | 4 +- .../test_suites/tabular_datasets.qmd | 12 +- docs/validmind/test_suites/text_data.qmd | 4 +- docs/validmind/test_suites/time_series.qmd | 28 +- docs/validmind/tests.qmd | 183 +- docs/validmind/tests/data_validation/ADF.qmd | 9 + .../tests/data_validation/AutoAR.qmd | 9 + .../tests/data_validation/AutoMA.qmd | 9 + .../ChiSquaredFeaturesTable.qmd | 2 +- .../tests/data_validation/ClassImbalance.qmd | 2 +- .../data_validation/DatasetDescription.qmd | 11 +- .../data_validation/DescriptiveStatistics.qmd | 17 +- .../tests/data_validation/DickeyFullerGLS.qmd | 12 +- .../data_validation/EngleGrangerCoint.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 12 +- .../data_validation/PhillipsPerronArch.qmd | 12 +- .../ProtectedClassesCombination.qmd | 14 +- .../ProtectedClassesDescription.qmd | 9 + .../ProtectedClassesDisparity.qmd | 14 +- .../ProtectedClassesThresholdOptimizer.qmd | 14 +- .../data_validation/RollingStatsPlot.qmd | 2 +- .../data_validation/SeasonalDecompose.qmd | 12 +- .../tests/data_validation/SpreadPlot.qmd | 2 +- .../TabularCategoricalBarPlots.qmd | 2 +- .../TabularDateTimeHistograms.qmd | 2 +- .../data_validation/TargetRateBarPlots.qmd | 2 +- .../data_validation/TimeSeriesFrequency.qmd | 2 +- .../data_validation/TimeSeriesHistogram.qmd | 9 + .../data_validation/TimeSeriesLinePlot.qmd | 2 +- .../TimeSeriesMissingValues.qmd | 2 +- .../data_validation/TimeSeriesOutliers.qmd | 2 +- .../tests/data_validation/WOEBinPlots.qmd | 12 +- .../tests/data_validation/WOEBinTable.qmd | 2 +- .../data_validation/ZivotAndrewsArch.qmd | 12 +- .../tests/data_validation/nlp/Hashtags.qmd | 2 +- .../tests/data_validation/nlp/Mentions.qmd | 2 +- .../tests/model_validation/BertScore.qmd | 19 + .../tests/model_validation/BleuScore.qmd | 19 + .../model_validation/ContextualRecall.qmd | 19 + .../tests/model_validation/FeaturesAUC.qmd | 12 +- .../tests/model_validation/MeteorScore.qmd | 19 + .../tests/model_validation/ModelMetadata.qmd | 9 + .../tests/model_validation/RegardScore.qmd | 19 + .../sklearn/ClusterCosineSimilarity.qmd | 2 +- .../sklearn/KMeansClustersOptimization.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 7 + .../sklearn/OverfitDiagnosis.qmd | 9 + .../sklearn/PermutationFeatureImportance.qmd | 12 +- .../sklearn/PopulationStabilityIndex.qmd | 12 +- .../sklearn/PrecisionRecallCurve.qmd | 2 +- .../model_validation/sklearn/ROCCurve.qmd | 2 +- .../sklearn/RegressionErrorsComparison.qmd | 9 + .../sklearn/RegressionPerformance.qmd | 9 + .../sklearn/RegressionR2Square.qmd | 9 + .../sklearn/RegressionR2SquareComparison.qmd | 9 + .../sklearn/RobustnessDiagnosis.qmd | 12 +- .../sklearn/SHAPGlobalImportance.qmd | 12 +- .../statsmodels/AutoARIMA.qmd | 9 + .../statsmodels/KolmogorovSmirnov.qmd | 2 +- .../statsmodels/RegressionCoeffs.qmd | 2 +- .../RegressionFeatureSignificance.qmd | 12 +- .../RegressionModelForecastPlot.qmd | 9 + .../RegressionModelSensitivityPlot.qmd | 9 + .../statsmodels/RegressionModelSummary.qmd | 9 + ...RegressionPermutationFeatureImportance.qmd | 9 + .../tests/prompt_validation/Bias.qmd | 42 +- .../tests/prompt_validation/Clarity.qmd | 42 +- .../tests/prompt_validation/Conciseness.qmd | 42 +- .../tests/prompt_validation/Delimitation.qmd | 42 +- .../prompt_validation/NegativeInstruction.qmd | 42 +- .../tests/prompt_validation/Robustness.qmd | 14 +- .../tests/prompt_validation/Specificity.qmd | 42 +- docs/validmind/vm_models.qmd | 60 +- ...p-973236bd072d72a04ee9cd82dcc9cb29.min.css | 12 + .../libs/bootstrap/bootstrap-icons.css | 2078 +++++++++++++++++ .../libs/bootstrap/bootstrap-icons.woff | Bin 0 -> 176200 bytes .../libs/bootstrap/bootstrap.min.js | 7 + .../libs/clipboard/clipboard.min.js | 7 + .../libs/quarto-html/anchor.min.js | 9 + .../libs/quarto-html/popper.min.js | 6 + ...hting-549806ee2085284f45b00abea8c6df48.css | 205 ++ .../libs/quarto-html/quarto.js | 911 ++++++++ .../libs/quarto-html/tippy.css | 1 + .../libs/quarto-html/tippy.umd.min.js | 2 + scripts/generate_quarto_docs.py | 23 +- 105 files changed, 5284 insertions(+), 405 deletions(-) create mode 100644 docs/validmind.html create mode 100644 docs/validmind_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css create mode 100644 docs/validmind_files/libs/bootstrap/bootstrap-icons.css create mode 100644 docs/validmind_files/libs/bootstrap/bootstrap-icons.woff create mode 100644 docs/validmind_files/libs/bootstrap/bootstrap.min.js create mode 100644 docs/validmind_files/libs/clipboard/clipboard.min.js create mode 100644 docs/validmind_files/libs/quarto-html/anchor.min.js create mode 100644 docs/validmind_files/libs/quarto-html/popper.min.js create mode 100644 docs/validmind_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css create mode 100644 docs/validmind_files/libs/quarto-html/quarto.js create mode 100644 docs/validmind_files/libs/quarto-html/tippy.css create mode 100644 docs/validmind_files/libs/quarto-html/tippy.umd.min.js diff --git a/docs/templates/class.qmd.jinja2 b/docs/templates/class.qmd.jinja2 index 1d42c12ae..442647a5b 100644 --- a/docs/templates/class.qmd.jinja2 +++ b/docs/templates/class.qmd.jinja2 @@ -1,4 +1,4 @@ -### [class]{.muted} {{ resolved.name }} +## [class]{.muted} {{ resolved.name }} ```python class {{ resolved.name }}({% for base in resolved.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): @@ -28,8 +28,6 @@ class {{ resolved.name }}({% for base in resolved.bases %}{{ base.name }}{% if n {% endif %} {% if resolved.members %} -**Methods** - {% for member in resolved.members.values() | sort(attribute='name') %} {% if member.kind in ['method', 'function'] and not member.name.startswith('_') %} ### [{{ member.name }}[()]{.muted}](#{{ member.name }}) @@ -41,6 +39,7 @@ class {{ resolved.name }}({% for base in resolved.bases %}{{ base.name }}{% if n {% if member.docstring %} {{ doc.format_docstring(member.docstring) }} {% endif %} + {% endif %} {% endfor %} {% endif %} \ No newline at end of file diff --git a/docs/templates/errors.qmd.jinja2 b/docs/templates/errors.qmd.jinja2 index b8ecfe0e3..dd8a4c851 100644 --- a/docs/templates/errors.qmd.jinja2 +++ b/docs/templates/errors.qmd.jinja2 @@ -25,8 +25,6 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% endif %} {% if member.members %} -**Methods** - {% for method in member.members.values() | sort(attribute='name') %} {% if method.kind == 'method' and not method.name.startswith('_') %} #### [{{ method.name }}[()]{.muted}](#{{ method.name }}) @@ -54,8 +52,6 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% endif %} {% if member.members %} -**Methods** - {% for method in member.members.values() | sort(attribute='name') %} {% if method.kind == 'method' and not method.name.startswith('_') %} #### [{{ method.name }}[()]{.muted}](#{{ method.name }}) @@ -83,8 +79,6 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% endif %} {% if member.members %} -**Methods** - {% for method in member.members.values() | sort(attribute='name') %} {% if method.kind == 'method' and not method.name.startswith('_') %} #### [{{ method.name }}[()]{.muted}](#{{ method.name }}) @@ -112,8 +106,6 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% endif %} {% if member.members %} -**Methods** - {% for method in member.members.values() | sort(attribute='name') %} {% if method.kind == 'method' and not method.name.startswith('_') %} #### [{{ method.name }}[()]{.muted}](#{{ method.name }}) @@ -141,8 +133,6 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% endif %} {% if member.members %} -**Methods** - {% for method in member.members.values() | sort(attribute='name') %} {% if method.kind == 'method' and not method.name.startswith('_') %} #### [{{ method.name }}[()]{.muted}](#{{ method.name }}) @@ -170,8 +160,6 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% endif %} {% if member.members %} -**Methods** - {% for method in member.members.values() | sort(attribute='name') %} {% if method.kind == 'method' and not method.name.startswith('_') %} #### [{{ method.name }}[()]{.muted}](#{{ method.name }}) diff --git a/docs/templates/function.qmd.jinja2 b/docs/templates/function.qmd.jinja2 index 35b45638e..936b6c284 100644 --- a/docs/templates/function.qmd.jinja2 +++ b/docs/templates/function.qmd.jinja2 @@ -1,9 +1,9 @@ {% if member.kind == "function" %} -## {{ member.name }}[()]{.muted} +## {{ member_name | default(member.name) }}[()]{.muted} ```python -{% if member.labels and "async" in member.labels %}async {% endif %}def {{ member.name }}( +{% if member.labels and "async" in member.labels %}async {% endif %}def {{ member_name | default(member.name) }}( {% for param in member.parameters %} {{ '**' if param.kind == 'variadic keyword' else '*' if param.kind == 'variadic positional' else '' }}{{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation.left.name if param.annotation.cls == "ExprSubscript" else "" }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %}, {% endif %} diff --git a/docs/templates/macros/docstring.jinja2 b/docs/templates/macros/docstring.jinja2 index 9ffb53063..372cf4768 100644 --- a/docs/templates/macros/docstring.jinja2 +++ b/docs/templates/macros/docstring.jinja2 @@ -21,7 +21,11 @@ {%- if desc.endswith(')') and '(default:' in desc -%} {%- set desc = desc[:-1] ~ ')' -%} {%- endif -%} - {%- set _ = sections.append("- **" ~ param.arg_name ~ "**: " ~ desc) -%} + {%- if param.type_name -%} + {%- set _ = sections.append("- **" ~ param.arg_name ~ "** (" ~ param.type_name ~ "): " ~ desc) -%} + {%- else -%} + {%- set _ = sections.append("- **" ~ param.arg_name ~ "**: " ~ desc) -%} + {%- endif -%} {%- endif -%} {%- endfor -%} {%- endif -%} diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index 5598e0b2e..041269c1d 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -26,6 +26,7 @@ aliases: ``` {% endif %} +{# Process root-level aliases #} {% for member in module.members | sort_members %} {% if is_public(member, module, full_data, is_root) and member.kind == "alias" %} {% set target = resolve_alias(member, full_data) %} @@ -67,15 +68,40 @@ def {{ member.name }}( {% endfor %} {% endif %} +{# Process module-level aliases #} +{% if not is_root %} +{% for member in module.members | sort_members %} +{% if is_public(member, module, full_data, is_root) and member.kind == "alias" %} +{% set resolved = resolve_alias(member, full_data) %} +{% if resolved.kind == "function" %} +## {{ member.name }}[()]{.muted} + +```python +{% if resolved.labels and "async" in resolved.labels %}async {% endif %}def {{ member.name }}( +{% for param in resolved.parameters %} + {{ param.name }}{% if param.annotation %}: {{ param.annotation }}{% endif %}{% if param.default %} = {{ param.default }}{% endif %}{% if not loop.last %},{% endif %} +{% endfor %} +){% if resolved.returns %} -> {{ resolved.returns }}{% endif %}: +``` + +{% if resolved.docstring %} +{{ doc.format_docstring(resolved.docstring) }} +{% endif %} +{% endif %} +{% endif %} +{% endfor %} +{% endif %} + {# List classes and functions #} {% for member in module.members | sort_members %} {% if is_public(member, module, full_data, is_root) %} {% set resolved = resolve_alias(member, full_data) %} {% if resolved.kind == "class" %} + {% include "class.qmd.jinja2" %} -{% elif resolved.kind == "function" %} +{% elif resolved.kind == "function" and member.kind != "alias" %} {% include "function.qmd.jinja2" %} {% endif %} {% endif %} {% endfor %} -{% endif %} \ No newline at end of file +{% endif %} diff --git a/docs/validmind.html b/docs/validmind.html new file mode 100644 index 000000000..17f03fe64 --- /dev/null +++ b/docs/validmind.html @@ -0,0 +1,813 @@ + + + + + + + + + +validmind + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index f934eb06a..f57bd4558 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -4,6 +4,60 @@ toc-depth: 3 toc-expand: 3 --- +## simple_preprocess_booleans[()]{.muted} + +```python +def simple_preprocess_booleans( + df, columns): +``` + +Preprocess boolean columns. + +**Parameters** + +- **(pandas.DataFrame)**: Dataframe to preprocess. columns +- **(list)**: List of columns to preprocess. + +**Returns** + +- Preprocessed dataframe. + +## simple_preprocess_categoricals[()]{.muted} + +```python +def simple_preprocess_categoricals( + df, columns): +``` + +Preprocess categorical columns. + +**Parameters** + +- **(pandas.DataFrame)**: Dataframe to preprocess. columns +- **(list)**: List of columns to preprocess. + +**Returns** + +- Preprocessed dataframe. + +## simple_preprocess_numericals[()]{.muted} + +```python +def simple_preprocess_numericals( + df, columns): +``` + +Preprocess numerical columns. + +**Parameters** + +- **(pandas.DataFrame)**: Dataframe to preprocess. columns +- **(list)**: List of columns to preprocess. + +**Returns** + +- Preprocessed dataframe. + ## get_demo_test_config[()]{.muted} ```python diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index e9f640e0e..05d94e9ed 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -4,6 +4,60 @@ toc-depth: 3 toc-expand: 3 --- +## simple_preprocess_booleans[()]{.muted} + +```python +def simple_preprocess_booleans( + df, columns): +``` + +Preprocess boolean columns. + +**Parameters** + +- **(pandas.DataFrame)**: Dataframe to preprocess. columns +- **(list)**: List of columns to preprocess. + +**Returns** + +- Preprocessed dataframe. + +## simple_preprocess_categoricals[()]{.muted} + +```python +def simple_preprocess_categoricals( + df, columns): +``` + +Preprocess categorical columns. + +**Parameters** + +- **(pandas.DataFrame)**: Dataframe to preprocess. columns +- **(list)**: List of columns to preprocess. + +**Returns** + +- Preprocessed dataframe. + +## simple_preprocess_numericals[()]{.muted} + +```python +def simple_preprocess_numericals( + df, columns): +``` + +Preprocess numerical columns. + +**Parameters** + +- **(pandas.DataFrame)**: Dataframe to preprocess. columns +- **(list)**: List of columns to preprocess. + +**Returns** + +- Preprocessed dataframe. + ## load_data[()]{.muted} ```python diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index 6a42ad114..a496874a4 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -60,10 +60,10 @@ Split a time series DataFrame into train, validation, and test sets. **Parameters** -- **df**: The time series DataFrame to be split. -- **split_option**: The split option to choose from: 'train_test_val' (default) or 'train_test'. -- **train_size**: The proportion of the dataset to include in the training set. Default is 0.6. -- **test_size**: The proportion of the dataset to include in the test set. Default is 0.2. +- **df** (pandas.DataFrame): The time series DataFrame to be split. +- **split_option** (str): The split option to choose from: 'train_test_val' (default) or 'train_test'. +- **train_size** (float): The proportion of the dataset to include in the training set. Default is 0.6. +- **test_size** (float): The proportion of the dataset to include in the test set. Default is 0.2. **Returns** diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 374627c01..bd0ca5de3 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -25,10 +25,10 @@ Split a time series DataFrame into train, validation, and test sets. **Parameters** -- **df**: The time series DataFrame to be split. -- **split_option**: The split option to choose from: 'train_test_val' (default) or 'train_test'. -- **train_size**: The proportion of the dataset to include in the training set. Default is 0.6. -- **test_size**: The proportion of the dataset to include in the test set. Default is 0.2. +- **df** (pandas.DataFrame): The time series DataFrame to be split. +- **split_option** (str): The split option to choose from: 'train_test_val' (default) or 'train_test'. +- **train_size** (float): The proportion of the dataset to include in the training set. Default is 0.6. +- **test_size** (float): The proportion of the dataset to include in the test set. Default is 0.2. **Returns** diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index c09f5c02f..ce9877fcc 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -9,7 +9,7 @@ This module contains all the custom errors that are used in the ValidMind Librar - BaseError - APIRequestError -### [class]{.muted} APIRequestError +## [class]{.muted} APIRequestError ```python class APIRequestError(BaseError): @@ -22,7 +22,7 @@ Generic error for API request errors that are not known. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} BaseError +## [class]{.muted} BaseError ```python class BaseError(Exception): @@ -32,15 +32,13 @@ class BaseError(Exception): - **From builtins.BaseException**: with_traceback, add_note -**Methods** - ### [description[()]{.muted}](#description) ```python description(self, args, kwargs) ``` -### [class]{.muted} GetTestSuiteError +## [class]{.muted} GetTestSuiteError ```python class GetTestSuiteError(BaseError): @@ -53,7 +51,7 @@ When the test suite could not be found. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} InitializeTestSuiteError +## [class]{.muted} InitializeTestSuiteError ```python class InitializeTestSuiteError(BaseError): @@ -66,7 +64,7 @@ When the test suite was found but could not be initialized. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} InvalidAPICredentialsError +## [class]{.muted} InvalidAPICredentialsError ```python class InvalidAPICredentialsError(APIRequestError): @@ -77,15 +75,13 @@ class InvalidAPICredentialsError(APIRequestError): - **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note -**Methods** - ### [description[()]{.muted}](#description) ```python description(self, args, kwargs) ``` -### [class]{.muted} InvalidContentIdPrefixError +## [class]{.muted} InvalidContentIdPrefixError ```python class InvalidContentIdPrefixError(APIRequestError): @@ -98,7 +94,7 @@ When an invalid text content_id is sent to the API. - **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} InvalidInputError +## [class]{.muted} InvalidInputError ```python class InvalidInputError(BaseError): @@ -111,7 +107,7 @@ When an invalid input object. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} InvalidMetricResultsError +## [class]{.muted} InvalidMetricResultsError ```python class InvalidMetricResultsError(APIRequestError): @@ -124,7 +120,7 @@ When an invalid metric results object is sent to the API. - **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} InvalidProjectError +## [class]{.muted} InvalidProjectError ```python class InvalidProjectError(APIRequestError): @@ -135,15 +131,13 @@ class InvalidProjectError(APIRequestError): - **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note -**Methods** - ### [description[()]{.muted}](#description) ```python description(self, args, kwargs) ``` -### [class]{.muted} InvalidRequestBodyError +## [class]{.muted} InvalidRequestBodyError ```python class InvalidRequestBodyError(APIRequestError): @@ -156,7 +150,7 @@ When a POST/PUT request is made with an invalid request body. - **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} InvalidTestParametersError +## [class]{.muted} InvalidTestParametersError ```python class InvalidTestParametersError(BaseError): @@ -169,7 +163,7 @@ When an invalid parameters for the test. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} InvalidTestResultsError +## [class]{.muted} InvalidTestResultsError ```python class InvalidTestResultsError(APIRequestError): @@ -182,7 +176,7 @@ When an invalid test results object is sent to the API. - **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} InvalidTextObjectError +## [class]{.muted} InvalidTextObjectError ```python class InvalidTextObjectError(APIRequestError): @@ -195,7 +189,7 @@ When an invalid Metadat (Text) object is sent to the API. - **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} InvalidValueFormatterError +## [class]{.muted} InvalidValueFormatterError ```python class InvalidValueFormatterError(BaseError): @@ -208,7 +202,7 @@ When an invalid value formatter is provided when serializing results. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} InvalidXGBoostTrainedModelError +## [class]{.muted} InvalidXGBoostTrainedModelError ```python class InvalidXGBoostTrainedModelError(BaseError): @@ -221,7 +215,7 @@ When an invalid XGBoost trained model is used when calling init_r_model. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} LoadTestError +## [class]{.muted} LoadTestError ```python class LoadTestError(BaseError): @@ -234,9 +228,7 @@ Exception raised when an error occurs while loading a test - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -**Methods** - -### [class]{.muted} MismatchingClassLabelsError +## [class]{.muted} MismatchingClassLabelsError ```python class MismatchingClassLabelsError(BaseError): @@ -249,7 +241,7 @@ When the class labels found in the dataset don't match the provided target label - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} MissingAPICredentialsError +## [class]{.muted} MissingAPICredentialsError ```python class MissingAPICredentialsError(BaseError): @@ -260,15 +252,13 @@ class MissingAPICredentialsError(BaseError): - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -**Methods** - ### [description[()]{.muted}](#description) ```python description(self, args, kwargs) ``` -### [class]{.muted} MissingCacheResultsArgumentsError +## [class]{.muted} MissingCacheResultsArgumentsError ```python class MissingCacheResultsArgumentsError(BaseError): @@ -281,7 +271,7 @@ When the cache_results function is missing arguments. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} MissingClassLabelError +## [class]{.muted} MissingClassLabelError ```python class MissingClassLabelError(BaseError): @@ -294,7 +284,7 @@ When the one or more class labels are missing from provided dataset targets. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} MissingDependencyError +## [class]{.muted} MissingDependencyError ```python class MissingDependencyError(BaseError): @@ -307,9 +297,7 @@ When a required dependency is missing. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -**Methods** - -### [class]{.muted} MissingDocumentationTemplate +## [class]{.muted} MissingDocumentationTemplate ```python class MissingDocumentationTemplate(BaseError): @@ -322,7 +310,7 @@ When the client config is missing the documentation template. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} MissingModelIdError +## [class]{.muted} MissingModelIdError ```python class MissingModelIdError(BaseError): @@ -333,15 +321,13 @@ class MissingModelIdError(BaseError): - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -**Methods** - ### [description[()]{.muted}](#description) ```python description(self, args, kwargs) ``` -### [class]{.muted} MissingOrInvalidModelPredictFnError +## [class]{.muted} MissingOrInvalidModelPredictFnError ```python class MissingOrInvalidModelPredictFnError(BaseError): @@ -354,7 +340,7 @@ When the pytorch model is missing a predict function or its predict method does - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} MissingRequiredTestInputError +## [class]{.muted} MissingRequiredTestInputError ```python class MissingRequiredTestInputError(BaseError): @@ -367,7 +353,7 @@ When a required test context variable is missing. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} MissingRExtrasError +## [class]{.muted} MissingRExtrasError ```python class MissingRExtrasError(BaseError): @@ -380,15 +366,13 @@ When the R extras have not been installed. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -**Methods** - ### [description[()]{.muted}](#description) ```python description(self, args, kwargs) ``` -### [class]{.muted} MissingTextContentIdError +## [class]{.muted} MissingTextContentIdError ```python class MissingTextContentIdError(APIRequestError): @@ -401,7 +385,7 @@ When a Text object is sent to the API without a content_id. - **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} MissingTextContentsError +## [class]{.muted} MissingTextContentsError ```python class MissingTextContentsError(APIRequestError): @@ -414,7 +398,7 @@ When a Text object is sent to the API without a "text" attribute. - **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): @@ -427,7 +411,7 @@ Useful error to throw when a test cannot be executed. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} TestInputInvalidDatasetError +## [class]{.muted} TestInputInvalidDatasetError ```python class TestInputInvalidDatasetError(BaseError): @@ -440,7 +424,7 @@ When an invalid dataset is used in a test context. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} UnsupportedColumnTypeError +## [class]{.muted} UnsupportedColumnTypeError ```python class UnsupportedColumnTypeError(BaseError): @@ -453,7 +437,7 @@ When an unsupported column type is found on a dataset. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} UnsupportedDatasetError +## [class]{.muted} UnsupportedDatasetError ```python class UnsupportedDatasetError(BaseError): @@ -466,7 +450,7 @@ When an unsupported dataset is used. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} UnsupportedFigureError +## [class]{.muted} UnsupportedFigureError ```python class UnsupportedFigureError(BaseError): @@ -479,7 +463,7 @@ When an unsupported figure object is constructed. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} UnsupportedModelError +## [class]{.muted} UnsupportedModelError ```python class UnsupportedModelError(BaseError): @@ -492,7 +476,7 @@ When an unsupported model is used. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} UnsupportedModelForSHAPError +## [class]{.muted} UnsupportedModelForSHAPError ```python class UnsupportedModelForSHAPError(BaseError): @@ -505,7 +489,7 @@ When an unsupported model is used for SHAP importance. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} UnsupportedRModelError +## [class]{.muted} UnsupportedRModelError ```python class UnsupportedRModelError(BaseError): diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 4aacff6eb..7f6f2bdae 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -19,6 +19,41 @@ Entrypoint for test suites. - [text_data](test_suites/text_data.qmd) - [time_series](test_suites/time_series.qmd) +## format_dataframe[()]{.muted} + +```python +def format_dataframe( + df: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +``` + +Format a pandas DataFrame for display purposes + +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + +## test_id_to_name[()]{.muted} + +```python +def test_id_to_name( + test_id: {'cls': 'ExprName', 'name': 'str'}) -> {'cls': 'ExprName', 'name': 'str'}: +``` + +Convert a test ID to a human-readable name. + +**Parameters** + +- **(str)**: The test identifier, typically in CamelCase or snake_case. + +**Returns** + +- A human-readable name derived from the test ID. + ## describe_suite[()]{.muted} ```python @@ -66,7 +101,7 @@ def register_test_suite( Registers a custom test suite -### [class]{.muted} ClassifierDiagnosis +## [class]{.muted} ClassifierDiagnosis ```python class ClassifierDiagnosis(TestSuite): @@ -76,9 +111,7 @@ Test suite for sklearn classifier model diagnosis tests **Inherited members** -**Methods** - -### [class]{.muted} ClassifierFullSuite +## [class]{.muted} ClassifierFullSuite ```python class ClassifierFullSuite(TestSuite): @@ -88,9 +121,7 @@ Full test suite for binary classification models. **Inherited members** -**Methods** - -### [class]{.muted} ClassifierMetrics +## [class]{.muted} ClassifierMetrics ```python class ClassifierMetrics(TestSuite): @@ -100,9 +131,7 @@ Test suite for sklearn classifier metrics **Inherited members** -**Methods** - -### [class]{.muted} ClassifierModelValidation +## [class]{.muted} ClassifierModelValidation ```python class ClassifierModelValidation(TestSuite): @@ -112,9 +141,7 @@ Test suite for binary classification models. **Inherited members** -**Methods** - -### [class]{.muted} ClassifierPerformance +## [class]{.muted} ClassifierPerformance ```python class ClassifierPerformance(TestSuite): @@ -124,9 +151,7 @@ Test suite for sklearn classifier models **Inherited members** -**Methods** - -### [class]{.muted} ClusterFullSuite +## [class]{.muted} ClusterFullSuite ```python class ClusterFullSuite(TestSuite): @@ -136,9 +161,7 @@ Full test suite for clustering models. **Inherited members** -**Methods** - -### [class]{.muted} ClusterMetrics +## [class]{.muted} ClusterMetrics ```python class ClusterMetrics(TestSuite): @@ -148,9 +171,7 @@ Test suite for sklearn clustering metrics **Inherited members** -**Methods** - -### [class]{.muted} ClusterPerformance +## [class]{.muted} ClusterPerformance ```python class ClusterPerformance(TestSuite): @@ -160,9 +181,7 @@ Test suite for sklearn cluster performance **Inherited members** -**Methods** - -### [class]{.muted} EmbeddingsFullSuite +## [class]{.muted} EmbeddingsFullSuite ```python class EmbeddingsFullSuite(TestSuite): @@ -172,9 +191,7 @@ Full test suite for embeddings models. **Inherited members** -**Methods** - -### [class]{.muted} EmbeddingsMetrics +## [class]{.muted} EmbeddingsMetrics ```python class EmbeddingsMetrics(TestSuite): @@ -184,9 +201,7 @@ Test suite for embeddings metrics **Inherited members** -**Methods** - -### [class]{.muted} EmbeddingsPerformance +## [class]{.muted} EmbeddingsPerformance ```python class EmbeddingsPerformance(TestSuite): @@ -196,9 +211,7 @@ Test suite for embeddings model performance **Inherited members** -**Methods** - -### [class]{.muted} KmeansParametersOptimization +## [class]{.muted} KmeansParametersOptimization ```python class KmeansParametersOptimization(TestSuite): @@ -208,9 +221,7 @@ Test suite for sklearn hyperparameters optimization **Inherited members** -**Methods** - -### [class]{.muted} LLMClassifierFullSuite +## [class]{.muted} LLMClassifierFullSuite ```python class LLMClassifierFullSuite(TestSuite): @@ -220,9 +231,7 @@ Full test suite for LLM classification models. **Inherited members** -**Methods** - -### [class]{.muted} NLPClassifierFullSuite +## [class]{.muted} NLPClassifierFullSuite ```python class NLPClassifierFullSuite(TestSuite): @@ -232,9 +241,7 @@ Full test suite for NLP classification models. **Inherited members** -**Methods** - -### [class]{.muted} PromptValidation +## [class]{.muted} PromptValidation ```python class PromptValidation(TestSuite): @@ -244,9 +251,7 @@ Test suite for prompt validation **Inherited members** -**Methods** - -### [class]{.muted} RegressionFullSuite +## [class]{.muted} RegressionFullSuite ```python class RegressionFullSuite(TestSuite): @@ -256,9 +261,7 @@ Full test suite for regression models. **Inherited members** -**Methods** - -### [class]{.muted} RegressionMetrics +## [class]{.muted} RegressionMetrics ```python class RegressionMetrics(TestSuite): @@ -268,9 +271,7 @@ Test suite for performance metrics of regression metrics **Inherited members** -**Methods** - -### [class]{.muted} RegressionModelDescription +## [class]{.muted} RegressionModelDescription ```python class RegressionModelDescription(TestSuite): @@ -280,9 +281,7 @@ Test suite for performance metric of regression model of statsmodels library **Inherited members** -**Methods** - -### [class]{.muted} RegressionModelsEvaluation +## [class]{.muted} RegressionModelsEvaluation ```python class RegressionModelsEvaluation(TestSuite): @@ -292,9 +291,7 @@ Test suite for metrics comparison of regression model of statsmodels library **Inherited members** -**Methods** - -### [class]{.muted} RegressionPerformance +## [class]{.muted} RegressionPerformance ```python class RegressionPerformance(TestSuite): @@ -304,9 +301,7 @@ Test suite for regression model performance **Inherited members** -**Methods** - -### [class]{.muted} SummarizationMetrics +## [class]{.muted} SummarizationMetrics ```python class SummarizationMetrics(TestSuite): @@ -316,9 +311,7 @@ Test suite for Summarization metrics **Inherited members** -**Methods** - -### [class]{.muted} TabularDataQuality +## [class]{.muted} TabularDataQuality ```python class TabularDataQuality(TestSuite): @@ -328,9 +321,7 @@ Test suite for data quality on tabular datasets **Inherited members** -**Methods** - -### [class]{.muted} TabularDataset +## [class]{.muted} TabularDataset ```python class TabularDataset(TestSuite): @@ -340,9 +331,7 @@ Test suite for tabular datasets. **Inherited members** -**Methods** - -### [class]{.muted} TabularDatasetDescription +## [class]{.muted} TabularDatasetDescription ```python class TabularDatasetDescription(TestSuite): @@ -352,9 +341,7 @@ Test suite to extract metadata and descriptive statistics from a tabular dataset **Inherited members** -**Methods** - -### [class]{.muted} TextDataQuality +## [class]{.muted} TextDataQuality ```python class TextDataQuality(TestSuite): @@ -364,9 +351,7 @@ Test suite for data quality on text data **Inherited members** -**Methods** - -### [class]{.muted} TimeSeriesDataQuality +## [class]{.muted} TimeSeriesDataQuality ```python class TimeSeriesDataQuality(TestSuite): @@ -376,9 +361,7 @@ Test suite for data quality on time series datasets **Inherited members** -**Methods** - -### [class]{.muted} TimeSeriesDataset +## [class]{.muted} TimeSeriesDataset ```python class TimeSeriesDataset(TestSuite): @@ -388,9 +371,7 @@ Test suite for time series datasets. **Inherited members** -**Methods** - -### [class]{.muted} TimeSeriesModelValidation +## [class]{.muted} TimeSeriesModelValidation ```python class TimeSeriesModelValidation(TestSuite): @@ -400,9 +381,7 @@ Test suite for time series model validation. **Inherited members** -**Methods** - -### [class]{.muted} TimeSeriesMultivariate +## [class]{.muted} TimeSeriesMultivariate ```python class TimeSeriesMultivariate(TestSuite): @@ -412,9 +391,7 @@ This test suite provides a preliminary understanding of the features and relatio **Inherited members** -**Methods** - -### [class]{.muted} TimeSeriesUnivariate +## [class]{.muted} TimeSeriesUnivariate ```python class TimeSeriesUnivariate(TestSuite): @@ -425,5 +402,3 @@ This test suite provides a preliminary understanding of the target variable(s) u The raw time series data provides a visual inspection of the target variable's behavior over time. This helps to identify any patterns or trends in the data, as well as any potential outliers or anomalies. The histogram of the target variable displays the distribution of values, providing insight into the range and frequency of values observed in the data. **Inherited members** - -**Methods** diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index 8cc9fe4a6..797c4933e 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -6,7 +6,7 @@ toc-expand: 3 Test suites for sklearn-compatible classifier models Ideal setup is to have the API client to read a custom test suite from the project's configuration -### [class]{.muted} ClassifierDiagnosis +## [class]{.muted} ClassifierDiagnosis ```python class ClassifierDiagnosis(TestSuite): @@ -16,9 +16,7 @@ Test suite for sklearn classifier model diagnosis tests **Inherited members** -**Methods** - -### [class]{.muted} ClassifierFullSuite +## [class]{.muted} ClassifierFullSuite ```python class ClassifierFullSuite(TestSuite): @@ -28,9 +26,7 @@ Full test suite for binary classification models. **Inherited members** -**Methods** - -### [class]{.muted} ClassifierMetrics +## [class]{.muted} ClassifierMetrics ```python class ClassifierMetrics(TestSuite): @@ -40,9 +36,7 @@ Test suite for sklearn classifier metrics **Inherited members** -**Methods** - -### [class]{.muted} ClassifierModelValidation +## [class]{.muted} ClassifierModelValidation ```python class ClassifierModelValidation(TestSuite): @@ -52,9 +46,7 @@ Test suite for binary classification models. **Inherited members** -**Methods** - -### [class]{.muted} ClassifierPerformance +## [class]{.muted} ClassifierPerformance ```python class ClassifierPerformance(TestSuite): @@ -64,9 +56,7 @@ Test suite for sklearn classifier models **Inherited members** -**Methods** - -### [class]{.muted} TabularDataQuality +## [class]{.muted} TabularDataQuality ```python class TabularDataQuality(TestSuite): @@ -76,9 +66,7 @@ Test suite for data quality on tabular datasets **Inherited members** -**Methods** - -### [class]{.muted} TabularDatasetDescription +## [class]{.muted} TabularDatasetDescription ```python class TabularDatasetDescription(TestSuite): @@ -87,5 +75,3 @@ class TabularDatasetDescription(TestSuite): Test suite to extract metadata and descriptive statistics from a tabular dataset **Inherited members** - -**Methods** diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index db8429f83..5cbb3fa6d 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -6,7 +6,7 @@ toc-expand: 3 Test suites for sklearn-compatible clustering models Ideal setup is to have the API client to read a custom test suite from the project's configuration -### [class]{.muted} ClusterFullSuite +## [class]{.muted} ClusterFullSuite ```python class ClusterFullSuite(TestSuite): @@ -16,9 +16,7 @@ Full test suite for clustering models. **Inherited members** -**Methods** - -### [class]{.muted} ClusterMetrics +## [class]{.muted} ClusterMetrics ```python class ClusterMetrics(TestSuite): @@ -28,9 +26,7 @@ Test suite for sklearn clustering metrics **Inherited members** -**Methods** - -### [class]{.muted} ClusterPerformance +## [class]{.muted} ClusterPerformance ```python class ClusterPerformance(TestSuite): @@ -40,9 +36,7 @@ Test suite for sklearn cluster performance **Inherited members** -**Methods** - -### [class]{.muted} KmeansParametersOptimization +## [class]{.muted} KmeansParametersOptimization ```python class KmeansParametersOptimization(TestSuite): @@ -51,5 +45,3 @@ class KmeansParametersOptimization(TestSuite): Test suite for sklearn hyperparameters optimization **Inherited members** - -**Methods** diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index c78b2482c..0c23f7de1 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -6,7 +6,7 @@ toc-expand: 3 Test suites for embeddings models Ideal setup is to have the API client to read a custom test suite from the project's configuration -### [class]{.muted} EmbeddingsFullSuite +## [class]{.muted} EmbeddingsFullSuite ```python class EmbeddingsFullSuite(TestSuite): @@ -16,9 +16,7 @@ Full test suite for embeddings models. **Inherited members** -**Methods** - -### [class]{.muted} EmbeddingsMetrics +## [class]{.muted} EmbeddingsMetrics ```python class EmbeddingsMetrics(TestSuite): @@ -28,9 +26,7 @@ Test suite for embeddings metrics **Inherited members** -**Methods** - -### [class]{.muted} EmbeddingsPerformance +## [class]{.muted} EmbeddingsPerformance ```python class EmbeddingsPerformance(TestSuite): @@ -39,5 +35,3 @@ class EmbeddingsPerformance(TestSuite): Test suite for embeddings model performance **Inherited members** - -**Methods** diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index 1d4a9aa78..31e95f0a1 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -6,7 +6,7 @@ toc-expand: 3 Test suites for LLMs -### [class]{.muted} LLMClassifierFullSuite +## [class]{.muted} LLMClassifierFullSuite ```python class LLMClassifierFullSuite(TestSuite): @@ -16,9 +16,7 @@ Full test suite for LLM classification models. **Inherited members** -**Methods** - -### [class]{.muted} PromptValidation +## [class]{.muted} PromptValidation ```python class PromptValidation(TestSuite): @@ -28,9 +26,7 @@ Test suite for prompt validation **Inherited members** -**Methods** - -### [class]{.muted} ClassifierDiagnosis +## [class]{.muted} ClassifierDiagnosis ```python class ClassifierDiagnosis(TestSuite): @@ -40,9 +36,7 @@ Test suite for sklearn classifier model diagnosis tests **Inherited members** -**Methods** - -### [class]{.muted} ClassifierMetrics +## [class]{.muted} ClassifierMetrics ```python class ClassifierMetrics(TestSuite): @@ -52,9 +46,7 @@ Test suite for sklearn classifier metrics **Inherited members** -**Methods** - -### [class]{.muted} ClassifierPerformance +## [class]{.muted} ClassifierPerformance ```python class ClassifierPerformance(TestSuite): @@ -64,9 +56,7 @@ Test suite for sklearn classifier models **Inherited members** -**Methods** - -### [class]{.muted} TextDataQuality +## [class]{.muted} TextDataQuality ```python class TextDataQuality(TestSuite): @@ -75,5 +65,3 @@ class TextDataQuality(TestSuite): Test suite for data quality on text data **Inherited members** - -**Methods** diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index 3c05f812d..39d2acb65 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -6,7 +6,7 @@ toc-expand: 3 Test suites for NLP models -### [class]{.muted} NLPClassifierFullSuite +## [class]{.muted} NLPClassifierFullSuite ```python class NLPClassifierFullSuite(TestSuite): @@ -16,9 +16,7 @@ Full test suite for NLP classification models. **Inherited members** -**Methods** - -### [class]{.muted} ClassifierDiagnosis +## [class]{.muted} ClassifierDiagnosis ```python class ClassifierDiagnosis(TestSuite): @@ -28,9 +26,7 @@ Test suite for sklearn classifier model diagnosis tests **Inherited members** -**Methods** - -### [class]{.muted} ClassifierMetrics +## [class]{.muted} ClassifierMetrics ```python class ClassifierMetrics(TestSuite): @@ -40,9 +36,7 @@ Test suite for sklearn classifier metrics **Inherited members** -**Methods** - -### [class]{.muted} ClassifierPerformance +## [class]{.muted} ClassifierPerformance ```python class ClassifierPerformance(TestSuite): @@ -52,9 +46,7 @@ Test suite for sklearn classifier models **Inherited members** -**Methods** - -### [class]{.muted} TextDataQuality +## [class]{.muted} TextDataQuality ```python class TextDataQuality(TestSuite): @@ -63,5 +55,3 @@ class TextDataQuality(TestSuite): Test suite for data quality on text data **Inherited members** - -**Methods** diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index bcdc06f8c..185d01e58 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -6,7 +6,7 @@ toc-expand: 3 Test suites for sklearn-compatible hyper parameters tunning Ideal setup is to have the API client to read a custom test suite from the project's configuration -### [class]{.muted} KmeansParametersOptimization +## [class]{.muted} KmeansParametersOptimization ```python class KmeansParametersOptimization(TestSuite): @@ -15,5 +15,3 @@ class KmeansParametersOptimization(TestSuite): Test suite for sklearn hyperparameters optimization **Inherited members** - -**Methods** diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index 9e3939c1e..1bc2b19ca 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -4,7 +4,7 @@ toc-depth: 3 toc-expand: 3 --- -### [class]{.muted} RegressionFullSuite +## [class]{.muted} RegressionFullSuite ```python class RegressionFullSuite(TestSuite): @@ -14,9 +14,7 @@ Full test suite for regression models. **Inherited members** -**Methods** - -### [class]{.muted} RegressionMetrics +## [class]{.muted} RegressionMetrics ```python class RegressionMetrics(TestSuite): @@ -26,9 +24,7 @@ Test suite for performance metrics of regression metrics **Inherited members** -**Methods** - -### [class]{.muted} RegressionPerformance +## [class]{.muted} RegressionPerformance ```python class RegressionPerformance(TestSuite): @@ -38,9 +34,7 @@ Test suite for regression model performance **Inherited members** -**Methods** - -### [class]{.muted} TabularDataQuality +## [class]{.muted} TabularDataQuality ```python class TabularDataQuality(TestSuite): @@ -50,9 +44,7 @@ Test suite for data quality on tabular datasets **Inherited members** -**Methods** - -### [class]{.muted} TabularDatasetDescription +## [class]{.muted} TabularDatasetDescription ```python class TabularDatasetDescription(TestSuite): @@ -61,5 +53,3 @@ class TabularDatasetDescription(TestSuite): Test suite to extract metadata and descriptive statistics from a tabular dataset **Inherited members** - -**Methods** diff --git a/docs/validmind/test_suites/statsmodels_timeseries.qmd b/docs/validmind/test_suites/statsmodels_timeseries.qmd index 4d3bc8f89..c18e8878a 100644 --- a/docs/validmind/test_suites/statsmodels_timeseries.qmd +++ b/docs/validmind/test_suites/statsmodels_timeseries.qmd @@ -6,7 +6,7 @@ toc-expand: 3 Time Series Test Suites from statsmodels -### [class]{.muted} RegressionModelDescription +## [class]{.muted} RegressionModelDescription ```python class RegressionModelDescription(TestSuite): @@ -16,9 +16,7 @@ Test suite for performance metric of regression model of statsmodels library **Inherited members** -**Methods** - -### [class]{.muted} RegressionModelsEvaluation +## [class]{.muted} RegressionModelsEvaluation ```python class RegressionModelsEvaluation(TestSuite): @@ -27,5 +25,3 @@ class RegressionModelsEvaluation(TestSuite): Test suite for metrics comparison of regression model of statsmodels library **Inherited members** - -**Methods** diff --git a/docs/validmind/test_suites/summarization.qmd b/docs/validmind/test_suites/summarization.qmd index 91e7ab61c..c60e59821 100644 --- a/docs/validmind/test_suites/summarization.qmd +++ b/docs/validmind/test_suites/summarization.qmd @@ -6,7 +6,7 @@ toc-expand: 3 Test suites for llm summarization models -### [class]{.muted} SummarizationMetrics +## [class]{.muted} SummarizationMetrics ```python class SummarizationMetrics(TestSuite): @@ -15,5 +15,3 @@ class SummarizationMetrics(TestSuite): Test suite for Summarization metrics **Inherited members** - -**Methods** diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd index 7fc6cfc3b..ac42b160b 100644 --- a/docs/validmind/test_suites/tabular_datasets.qmd +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -6,7 +6,7 @@ toc-expand: 3 Test suites for tabular datasets -### [class]{.muted} TabularDataQuality +## [class]{.muted} TabularDataQuality ```python class TabularDataQuality(TestSuite): @@ -16,9 +16,7 @@ Test suite for data quality on tabular datasets **Inherited members** -**Methods** - -### [class]{.muted} TabularDataset +## [class]{.muted} TabularDataset ```python class TabularDataset(TestSuite): @@ -28,9 +26,7 @@ Test suite for tabular datasets. **Inherited members** -**Methods** - -### [class]{.muted} TabularDatasetDescription +## [class]{.muted} TabularDatasetDescription ```python class TabularDatasetDescription(TestSuite): @@ -39,5 +35,3 @@ class TabularDatasetDescription(TestSuite): Test suite to extract metadata and descriptive statistics from a tabular dataset **Inherited members** - -**Methods** diff --git a/docs/validmind/test_suites/text_data.qmd b/docs/validmind/test_suites/text_data.qmd index 7bb75ef4d..609d00266 100644 --- a/docs/validmind/test_suites/text_data.qmd +++ b/docs/validmind/test_suites/text_data.qmd @@ -6,7 +6,7 @@ toc-expand: 3 Test suites for text datasets -### [class]{.muted} TextDataQuality +## [class]{.muted} TextDataQuality ```python class TextDataQuality(TestSuite): @@ -15,5 +15,3 @@ class TextDataQuality(TestSuite): Test suite for data quality on text data **Inherited members** - -**Methods** diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index 57e18e4c4..39f721861 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -6,7 +6,7 @@ toc-expand: 3 Time Series Test Suites -### [class]{.muted} TimeSeriesDataQuality +## [class]{.muted} TimeSeriesDataQuality ```python class TimeSeriesDataQuality(TestSuite): @@ -16,9 +16,7 @@ Test suite for data quality on time series datasets **Inherited members** -**Methods** - -### [class]{.muted} TimeSeriesDataset +## [class]{.muted} TimeSeriesDataset ```python class TimeSeriesDataset(TestSuite): @@ -28,9 +26,7 @@ Test suite for time series datasets. **Inherited members** -**Methods** - -### [class]{.muted} TimeSeriesModelValidation +## [class]{.muted} TimeSeriesModelValidation ```python class TimeSeriesModelValidation(TestSuite): @@ -40,9 +36,7 @@ Test suite for time series model validation. **Inherited members** -**Methods** - -### [class]{.muted} TimeSeriesMultivariate +## [class]{.muted} TimeSeriesMultivariate ```python class TimeSeriesMultivariate(TestSuite): @@ -52,9 +46,7 @@ This test suite provides a preliminary understanding of the features and relatio **Inherited members** -**Methods** - -### [class]{.muted} TimeSeriesUnivariate +## [class]{.muted} TimeSeriesUnivariate ```python class TimeSeriesUnivariate(TestSuite): @@ -66,9 +58,7 @@ The raw time series data provides a visual inspection of the target variable's b **Inherited members** -**Methods** - -### [class]{.muted} RegressionModelDescription +## [class]{.muted} RegressionModelDescription ```python class RegressionModelDescription(TestSuite): @@ -78,9 +68,7 @@ Test suite for performance metric of regression model of statsmodels library **Inherited members** -**Methods** - -### [class]{.muted} RegressionModelsEvaluation +## [class]{.muted} RegressionModelsEvaluation ```python class RegressionModelsEvaluation(TestSuite): @@ -89,5 +77,3 @@ class RegressionModelsEvaluation(TestSuite): Test suite for metrics comparison of regression model of statsmodels library **Inherited members** - -**Methods** diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 7e4344739..6135dd30e 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -10,6 +10,172 @@ ValidMind Tests Module - [model_validation](tests/model_validation.qmd) - [prompt_validation](tests/prompt_validation.qmd) +## describe_test[()]{.muted} + +```python +def describe_test( + test_id: {'cls': 'ExprName', 'name': 'TestID'} = None, raw: {'cls': 'ExprName', 'name': 'bool'} = False, show: {'cls': 'ExprName', 'name': 'bool'} = True): +``` + +Get or show details about the test This function can be used to see test details including the test name, description, required inputs and default params. It can also be used to get a dictionary of the above information for programmatic use. + +**Parameters** + +- **optional)**: The test ID. Defaults to None. raw (bool, +- **optional)**: If True, returns a dictionary with the test details. Defaults to False. + +## list_tags[()]{.muted} + +```python +def list_tags( +): +``` + +List unique tags from all test classes. + +## list_tasks[()]{.muted} + +```python +def list_tasks( +): +``` + +List unique tasks from all test classes. + +## list_tasks_and_tags[()]{.muted} + +```python +def list_tasks_and_tags( + as_json = False): +``` + +List all task types and their associated tags, with one row per task type and all tags for a task type in one row. + +**Returns** + +- A DataFrame with 'Task Type' and concatenated 'Tags'. + +## list_tests[()]{.muted} + +```python +def list_tests( + filter = None, task = None, tags = None, pretty = True, truncate = True): +``` + +List all tests in the tests directory. + +**Parameters** + +- **optional)**: Find tests where the ID, tasks or tags match the filter string. Defaults to None. task (str, +- **optional)**: Find tests that match the task. Can be used to narrow down matches from the filter string. Defaults to None. tags (list, +- **optional)**: Find tests that match list of tags. Can be used to narrow down matches from the filter string. Defaults to None. pretty (bool, +- **optional)**: If True, returns a pandas DataFrame with a formatted table. Defaults to True. truncate (bool, +- **optional)**: If True, truncates the test description to the first line. Defaults to True. (only used if pretty=True) + +**Returns** + +- list or pandas.DataFrame: A list of all tests or a formatted table. + +## load_test[()]{.muted} + +```python +def load_test( + test_id: {'cls': 'ExprName', 'name': 'str'}, test_func: {'cls': 'ExprName', 'name': 'callable'} = None, reload: {'cls': 'ExprName', 'name': 'bool'} = False): +``` + +Load a test by test ID Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. The tag is optional and is used to distinguish between multiple results from the same test. + +**Parameters** + +- **(str)**: The test ID in the format +- \*\*`namespace.path_to_module.TestName[**: tag]` test_func (callable, +- **optional)**: The test function to load. If not provided, the test will be loaded from the test provider. Defaults to None. + +## run_test[()]{.muted} + +```python +def run_test( + test_id: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'TestID'}, 'None'], 'implicit': True}} = None, name: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None, unit_metrics: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'TestID'}}, 'None'], 'implicit': True}} = None, inputs: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, 'None'], 'implicit': True}} = None, input_grid: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'Any'}}], 'implicit': True}}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}, 'None'], 'implicit': True}} = None, params: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, 'None'], 'implicit': True}} = None, param_grid: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'Any'}}], 'implicit': True}}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}, 'None'], 'implicit': True}} = None, show: {'cls': 'ExprName', 'name': 'bool'} = True, generate_description: {'cls': 'ExprName', 'name': 'bool'} = True, title: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, post_process_fn: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Callable'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, 'None'], 'implicit': True}}, 'None'], 'implicit': True}} = None, kwargs = {}) -> {'cls': 'ExprName', 'name': 'TestResult'}: +``` + +Run a ValidMind or custom test This function is the main entry point for running tests. It can run simple unit metrics, ValidMind and custom tests, composite tests made up of multiple unit metrics and comparison tests made up of multiple tests. + +**Parameters** + +- **optional)**: Test ID to run. Not required if `name` and `unit_metrics` provided. params (dict, +- **optional)**: Parameters to customize test behavior. See test details for available parameters. param_grid (Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\], +- **optional)**: For comparison tests, +- **either**: - Dict mapping parameter names to lists of values (creates Cartesian product) - List of parameter dictionaries to test inputs (Dict[str, Any], +- **optional)**: Test inputs (models/datasets initialized with vm.init_model/dataset) input_grid (Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\], +- **optional)**: For comparison tests, +- **either**: - Dict mapping input names to lists of values (creates Cartesian product) - List of input dictionaries to test name (str, +- **optional)**: Test name (required for composite metrics) unit_metrics (list, +- **optional)**: Unit metric IDs to run as composite metric show (bool, +- **optional)**: Whether to display results. Defaults to True. generate_description (bool, +- **optional)**: Whether to generate a description. Defaults to True. title (str, +- **optional)**: Custom title for the test result post_process_fn (Callable\[[TestResult], None\], +- **optional)**: Function to post-process the test result + +**Returns** + +- A TestResult object containing the test results + +**Raises** + +- **ValueError**: If the test inputs are invalid +- **LoadTestError**: If the test class fails to load + +## tags[()]{.muted} + +```python +def tags( + tags = ()): +``` + +Decorator for specifying tags for a test. + +**Parameters** + +- \***tags**: The tags to apply to the test. + +## tasks[()]{.muted} + +```python +def tasks( + tasks = ()): +``` + +Decorator for specifying the task types that a test is designed for. + +**Parameters** + +- \***tasks**: The task types that the test is designed for. + +## test[()]{.muted} + +```python +def test( + func_or_id): +``` + +Decorator for creating and registering custom tests This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. The function can take two different types of arguments: + +- Inputs: ValidMind model or dataset (or list of models/datasets). These arguments must use the following names: `model`, `models`, `dataset`, `datasets`. +- Parameters: Any additional keyword arguments of any type (must have a default value) that can have any name. The function should return one of the following types: +- Table: Either a list of dictionaries or a pandas DataFrame +- Plot: Either a matplotlib figure or a plotly figure +- Scalar: A single number (int or float) +- Boolean: A single boolean value indicating whether the test passed or failed The function may also include a docstring. This docstring will be used and logged as the metric's description. + +**Parameters** + +- **func**: The function to decorate +- **test_id**: The identifier for the metric. If not provided, the function name is used. + +**Returns** + +- The decorated function. + ## register_test_provider[()]{.muted} ```python @@ -23,7 +189,9 @@ Register an external test provider **Parameters** - **(str)**: The namespace of the test provider test_provider -- **(TestProvider)**: The test provider ### [class]{.muted} LoadTestError +- **(TestProvider)**: The test provider + +## [class]{.muted} LoadTestError ```python class LoadTestError(BaseError): @@ -36,9 +204,7 @@ Exception raised when an error occurs while loading a test - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -**Methods** - -### [class]{.muted} LocalTestProvider +## [class]{.muted} LocalTestProvider ```python class LocalTestProvider(): @@ -69,9 +235,7 @@ test = test_provider.load_test("my_namespace.my_test_class") **Parameters** -- **root_folder**: The root directory for local tests. - -**Methods** +- **root_folder** (str): The root directory for local tests. ### [list_tests[()]{.muted}](#list_tests) @@ -105,7 +269,8 @@ Load the test identified by the given test_id. - **LocalTestProviderLoadModuleError**: If the test module cannot be imported - **LocalTestProviderLoadTestError**: If the test class cannot be found in the module - ### [class]{.muted} TestProvider + +## [class]{.muted} TestProvider ```python class TestProvider(Protocol): @@ -115,8 +280,6 @@ Protocol for user-defined test providers **Inherited members** -**Methods** - ### [list_tests[()]{.muted}](#list_tests) ```python diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 455136d2d..bd6e6d5fa 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## ADF[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 718f42280..841d3edce 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## AutoAR[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index e27910d89..5702203f2 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## AutoMA[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index f1b0c2747..7eb8517f7 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -40,7 +40,7 @@ The function creates a contingency table for each categorical feature and the ta - As with all hypothesis tests, the Chi-Squared test can only detect associations, not causal relationships. - The choice of p-value threshold can affect the interpretation of feature relevance, and different thresholds may lead to different conclusions. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 326eb5b43..9db47fa77 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -46,7 +46,7 @@ This Class Imbalance test operates by calculating the frequency (expressed as a - While it can identify imbalances in class distribution, it doesn't provide direct methods to address or correct these imbalances. - The test is only applicable for classification operations and unsuitable for regression or clustering tasks. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index e0263ca97..dd4c1e4d5 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## DatasetDescription[()]{.muted} ```python @@ -83,7 +92,7 @@ def infer_datatypes( df): ``` -### [class]{.muted} UnsupportedColumnTypeError +## [class]{.muted} UnsupportedColumnTypeError ```python class UnsupportedColumnTypeError(BaseError): diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 069a0f51a..7ed4b42ad 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -4,6 +4,21 @@ toc-depth: 3 toc-expand: 3 --- +## format_records[()]{.muted} + +```python +def format_records( + df: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}: +``` + +Round the values on each dataframe's column to a given number of decimal places. The returned value is converted to a dict in "records" with Pandas's to_dict() function. + +We do this for display purposes before sending data to ValidMind. Rules: + +- Check if we are rendering "big" numbers greater than 10 or just numbers between 0 and 1 +- If the column's smallest number has more decimals 6, use that number's precision so we can avoid rendering a 0 instead +- If the column's smallest number has less decimals than 6, use 6 decimal places + ## DescriptiveStatistics[()]{.muted} ```python @@ -55,7 +70,7 @@ def get_summary_statistics_numerical( numerical_fields): ``` -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 58210ad8a..4bebade2a 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## DickeyFullerGLS[()]{.muted} ```python @@ -36,7 +45,8 @@ This code implements the Dickey-Fuller GLS unit root test on each attribute of t - Despite its benefits, the DFGLS test does present some drawbacks. It can potentially lead to inaccurate conclusions if the time series data incorporates a structural break. - If the time series tends to follow a trend while still being stationary, the test might misinterpret it, necessitating further detrending. - The test also presents challenges when dealing with shorter time series data or volatile data, not producing reliable results in these cases. - ### [class]{.muted} SkipTestError + +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 45bc85047..b083e5ea6 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -38,7 +38,7 @@ The test first drops any non-applicable values from the input dataset and then i - The presence of non-stationary characteristics in the series or structural breaks can result in falsely positive or negative cointegration results. - May not perform well for small sample sizes due to lack of statistical power and should be supplemented with other predictive indicators for a more robust model evaluation. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 2679b8e5d..bc57a7853 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## KPSS[()]{.muted} ```python @@ -36,7 +45,8 @@ This test calculates the KPSS score for each feature in the dataset. The KPSS sc - Assumes the absence of a unit root in the series and doesn't differentiate between series that are stationary and those border-lining stationarity. - The test may have restricted power against certain alternatives. - The reliability of the test is contingent on the number of lags selected, which introduces potential bias in the measurement. - ### [class]{.muted} SkipTestError + +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 0db61d612..ad9c3352d 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## PhillipsPerronArch[()]{.muted} ```python @@ -42,7 +51,8 @@ The PP test is conducted for each feature in the dataset as follows: - Applicable only within a univariate time series framework. - Relies on asymptotic theory, which may reduce the test’s power for small sample sizes. - Non-stationary time series must be converted to stationary series through differencing, potentially leading to loss of important data points. - ### [class]{.muted} SkipTestError + +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index b0b806b82..29d889c85 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## ProtectedClassesCombination[()]{.muted} ```python @@ -44,7 +53,8 @@ The test performs the following steps: - May become complex and difficult to interpret with a large number of protected classes or combinations. - Does not provide statistical significance of observed differences. - Visualization alone may not capture all nuances of intersectional fairness. - ### [class]{.muted} MissingDependencyError + +## [class]{.muted} MissingDependencyError ```python class MissingDependencyError(BaseError): @@ -56,5 +66,3 @@ When a required dependency is missing. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note - -**Methods** diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index f71a1b44d..6a0e1c9f1 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## ProtectedClassesDescription[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 07cf7e8ea..53ddf82c6 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## ProtectedClassesDisparity[()]{.muted} ```python @@ -48,7 +57,8 @@ The test performs the following steps: - Relies on a predefined reference group for each protected class, which may not always be the most appropriate choice. - Does not account for intersectionality between different protected attributes. - The interpretation of results may require domain expertise to understand the implications of observed disparities. - ### [class]{.muted} MissingDependencyError + +## [class]{.muted} MissingDependencyError ```python class MissingDependencyError(BaseError): @@ -60,5 +70,3 @@ When a required dependency is missing. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note - -**Methods** diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 3c895b5ed..97370b88e 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## calculate_fairness_metrics[()]{.muted} ```python @@ -100,7 +109,8 @@ The test uses Fairlearn's ThresholdOptimizer to: - May lead to a decrease in overall model performance while improving fairness. - Requires access to protected attribute information at prediction time. - The effectiveness can vary depending on the chosen fairness constraint and objective. - ### [class]{.muted} MissingDependencyError + +## [class]{.muted} MissingDependencyError ```python class MissingDependencyError(BaseError): @@ -112,5 +122,3 @@ When a required dependency is missing. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note - -**Methods** diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 92ac776a9..95a89f7f8 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -50,7 +50,7 @@ This mechanism is comprised of two steps. Initially, the rolling mean and standa - Requires the dataset to be indexed by date and time, hence it may not be usable for datasets without a timestamp index. - Primarily serves for data visualization as it does not facilitate any quantitative measures for stationarity, such as through statistical tests. Therefore, the interpretation is subjective and depends heavily on modeler discretion. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 7ba4cbaee..af3f6c928 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## SeasonalDecompose[()]{.muted} ```python @@ -39,7 +48,8 @@ The testing process leverages the `seasonal_decompose` function from the `statsm - **Dependence on Assumptions**: Assumes that dataset features are periodically distributed. Features with no inferable frequency are excluded from the test. - **Handling Non-Finite Values**: Disregards non-finite values during analysis, potentially resulting in an incomplete understanding of the dataset. - **Unreliability with Noisy Datasets**: Produces unreliable results when used with datasets that contain heavy noise. - ### [class]{.muted} SkipTestError + +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 9d00f425a..aea8ded22 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -41,7 +41,7 @@ The SpreadPlot test computes and represents the spread between each pair of time - Can become inefficient or difficult to interpret with a high number of variables due to the profuse number of plots. - Might not completely capture intricate non-linear relationships between the variables. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 0b6f39139..7af1564cf 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -38,7 +38,7 @@ The provided dataset is first checked to determine if it contains any categorica - It does not provide informative value when there are too many categories, as the bar chart could become cluttered and hard to interpret. - Offers no insights into the model's performance or precision, but rather provides a descriptive analysis of the input. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 5fac50195..f70ce9cfa 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -39,7 +39,7 @@ This test operates by first identifying all datetime columns and extracting them - The test is only applicable to datasets containing datetime columns and will fail if such columns are unavailable. - The interpretation of the histograms relies heavily on the domain expertise and experience of the reviewer. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 56ae72244..f877e1a47 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -35,7 +35,7 @@ The test involves creating a pair of bar plots for each categorical feature in t - The readability of the bar plots drops as the number of distinct categories increases in the dataset, which can make them harder to understand and less useful. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 4f7d8f77f..1f4ee28d1 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -38,7 +38,7 @@ Initially, the test checks if the dataframe index is in datetime format. Subsequ - The `infer_freq` method might not always correctly infer frequency when faced with missing or irregular data points. - Depending on context or the model under development, mixed frequencies might sometimes be acceptable, but this test considers them a failing condition. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 419a468dc..a97b04b30 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## TimeSeriesHistogram[()]{.muted} ```python diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index bc8e89129..aa4aed0d8 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -40,7 +40,7 @@ The mechanism for this Python class involves extracting the column names from th - The metric necessitates that the time-specific data has been transformed into a datetime index, with the data formatted correctly. - The metric has an inherent limitation in that it cannot extract deeper statistical insights from the time series data, which can limit its efficacy with complex data structures and phenomena. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 64a85e8be..55b5291a6 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -39,7 +39,7 @@ The test method commences by validating if the dataset has a datetime index; if - The test's sensitivity to the 'min_threshold' parameter may raise false alarms if set too strictly or may overlook problematic data if set too loosely. - Solely focuses on the 'missingness' of the data and might fall short in addressing other aspects of data quality. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 685e5cb36..1acb094ba 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -44,7 +44,7 @@ The test processes a given dataset which must have datetime indexing, checks if - It does not address possible ways to handle identified outliers in the data. - The requirement for a datetime index could limit its application. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index bd6e051c3..00d3a07ec 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## WOEBinPlots[()]{.muted} ```python @@ -42,7 +51,8 @@ The test implementation follows defined steps. Initially, it selects non-numeric - While excellent for categorical data, the encoding of continuous variables into categorical can sometimes lead to information loss. - Extreme or outlier values can dramatically affect the computation of WoE and IV, skewing results. - The method requires a sufficient number of events per bin to generate a reliable information value and weight of evidence. - ### [class]{.muted} SkipTestError + +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 91bbf926f..31c9bfe58 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -38,7 +38,7 @@ The test uses the `scorecardpy.woebin` method to perform automatic binning of th - Potential difficulties if the dataset has many features, non-binnable features, or non-numeric features. - The metric does not help in distinguishing whether the observed predictive factor is due to data randomness or a true phenomenon. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index d4a02fce0..45986aa56 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## ZivotAndrewsArch[()]{.muted} ```python @@ -35,7 +44,8 @@ The Zivot-Andrews unit root test is performed on each feature in the dataset usi - Assumes data is derived from a single-equation, autoregressive model, making it less appropriate for multivariate time series data or data not aligning with this model. - May not account for unexpected shocks or changes in the series trend, both of which can significantly impact data stationarity. - ### [class]{.muted} SkipTestError + +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 2a2411e89..1c15d583a 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -41,7 +41,7 @@ The test implements a regular expression (regex) to extract all hashtags from th - Does not account for typographical errors, variations, or synonyms in hashtags. - Does not provide context or sentiment associated with the hashtags, so the information provided may have limited utility on its own. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index a72148a1e..0eee33be5 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -39,7 +39,7 @@ The test first verifies the existence of a text column in the provided dataset. - This test isn't suited for datasets devoid of textual data. - It does not provide insights on less frequently occurring data or outliers, which means potentially significant patterns could be overlooked. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 687c64be3..f477270fc 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -4,6 +4,25 @@ toc-depth: 3 toc-expand: 3 --- +## validate_prediction[()]{.muted} + +```python +def validate_prediction( + y_true, y_pred, dataset_id = None): +``` + +Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. + +**Parameters** + +- **y_true**: List or array of true values +- **y_pred**: List or array of predicted values +- **dataset_id**: Optional identifier for the dataset (for logging) + +**Returns** + +- (cleaned_y_true, cleaned_y_pred) with matching lengths and no NaN values + ## BertScore[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 7b2d005e2..4f5caf9d9 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -4,6 +4,25 @@ toc-depth: 3 toc-expand: 3 --- +## validate_prediction[()]{.muted} + +```python +def validate_prediction( + y_true, y_pred, dataset_id = None): +``` + +Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. + +**Parameters** + +- **y_true**: List or array of true values +- **y_pred**: List or array of predicted values +- **dataset_id**: Optional identifier for the dataset (for logging) + +**Returns** + +- (cleaned_y_true, cleaned_y_pred) with matching lengths and no NaN values + ## BleuScore[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 161951a2f..5d80ae6d3 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -4,6 +4,25 @@ toc-depth: 3 toc-expand: 3 --- +## validate_prediction[()]{.muted} + +```python +def validate_prediction( + y_true, y_pred, dataset_id = None): +``` + +Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. + +**Parameters** + +- **y_true**: List or array of true values +- **y_pred**: List or array of predicted values +- **dataset_id**: Optional identifier for the dataset (for logging) + +**Returns** + +- (cleaned_y_true, cleaned_y_pred) with matching lengths and no NaN values + ## ContextualRecall[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index e41a4bce8..f9f05f7ea 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## FeaturesAUC[()]{.muted} ```python @@ -38,7 +47,8 @@ For each feature, the metric treats the feature values as raw scores to compute - Does not reflect the combined effects of features or any interaction between them, which can be critical in certain models. - The AUC values are calculated without considering the model's use of the features, which could lead to different interpretations of feature importance when considering the model holistically. - This metric is applicable only to binary classification tasks and cannot be directly extended to multiclass classification or regression without modifications. - ### [class]{.muted} SkipTestError + +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index c22690720..2e1887195 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -4,6 +4,25 @@ toc-depth: 3 toc-expand: 3 --- +## validate_prediction[()]{.muted} + +```python +def validate_prediction( + y_true, y_pred, dataset_id = None): +``` + +Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. + +**Parameters** + +- **y_true**: List or array of true values +- **y_pred**: List or array of predicted values +- **dataset_id**: Optional identifier for the dataset (for logging) + +**Returns** + +- (cleaned_y_true, cleaned_y_pred) with matching lengths and no NaN values + ## MeteorScore[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index 35c4d1b41..006fe1566 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_model_info[()]{.muted} + +```python +def get_model_info( + model): +``` + +Attempts to extract all model info from a model object instance + ## ModelMetadata[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 831304931..1a5ba0268 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -4,6 +4,25 @@ toc-depth: 3 toc-expand: 3 --- +## validate_prediction[()]{.muted} + +```python +def validate_prediction( + y_true, y_pred, dataset_id = None): +``` + +Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. + +**Parameters** + +- **y_true**: List or array of true values +- **y_pred**: List or array of predicted values +- **dataset_id**: Optional identifier for the dataset (for logging) + +**Returns** + +- (cleaned_y_true, cleaned_y_pred) with matching lengths and no NaN values + ## RegardScore[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index fe8c716ad..f1e703c59 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -40,7 +40,7 @@ This test works by first extracting the true and predicted clusters of the model - It primarily works with continuous variables and is not suitable for binary or categorical variables. - Lastly, although rare, perfect perpendicular vectors (cosine similarity = 0) could be within the same cluster, which may give an inaccurate representation of a 'bad' cluster due to low cosine similarity score. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 14d020741..d3b52d06c 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -42,7 +42,7 @@ The test mechanism involves iterating over a predefined range of cluster numbers - Might not be straightforward to determine the 'elbow' point or maximize the silhouette average score, especially in larger and complicated datasets. - Assumes spherical clusters (due to using the Euclidean distance in the Elbow method), which might not align with the actual structure of the data. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index c2e8ef2e7..248b4bc56 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -4,6 +4,13 @@ toc-depth: 3 toc-expand: 3 --- +## multiclass_roc_auc_score[()]{.muted} + +```python +def multiclass_roc_auc_score( + y_test, y_pred, average = 'macro'): +``` + ## ModelsPerformanceComparison[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 828ce192d..c384e9e13 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## OverfitDiagnosis[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index abb3cbde9..ebffc4309 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## PermutationFeatureImportance[()]{.muted} ```python @@ -40,7 +49,8 @@ PFI is calculated via the `permutation_importance` method from the `sklearn.insp - Does not imply causality; it only presents the amount of information that a feature provides for the prediction task. - Does not account for interactions between features. If features are correlated, the permutation importance may allocate importance to one and not the other. - Cannot interact with certain libraries like statsmodels, pytorch, catboost, etc., thus limiting its applicability. - ### [class]{.muted} SkipTestError + +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index e08135588..269ed2bff 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## calculate_psi[()]{.muted} ```python @@ -54,7 +63,8 @@ The implementation of the PSI in this script involves calculating the PSI for ea - The PSI test does not inherently provide insights into why there are differences in distributions or why the PSI values may have changed. - The test may not handle features with significant outliers adequately. - Additionally, the PSI test is performed on model predictions, not on the underlying data distributions which can lead to misinterpretations. Any changes in PSI could be due to shifts in the model (model drift), changes in the relationships between features and the target variable (concept drift), or both. However, distinguishing between these causes is non-trivial. - ### [class]{.muted} SkipTestError + +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index d1283f2c2..5a5a29ece 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -38,7 +38,7 @@ The test extracts ground truth labels and prediction probabilities from the mode - This metric is only applicable to binary classification models - it raises errors for multiclass classification models or Foundation models. - It may not fully represent the overall accuracy of the model if the cost of false positives and false negatives are extremely different, or if the dataset is heavily imbalanced. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 6545d7010..80e0e55a0 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -39,7 +39,7 @@ First, this script selects the target model and datasets that require binary cla - Furthermore, its performance might be subpar with models that output probabilities highly skewed towards 0 or 1. - At the extreme, the ROC curve could reflect high performance even when the majority of classifications are incorrect, provided that the model's ranking format is retained. This phenomenon is commonly termed the "Class Imbalance Problem". -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 373fd97aa..53bd58c21 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## RegressionErrorsComparison[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 4c3307d9d..4aeed614f 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## RegressionPerformance[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 9c29844f1..4ff4dd805 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## adj_r2_score[()]{.muted} + +```python +def adj_r2_score( + actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: {'cls': 'ExprName', 'name': 'int'}, featurecount: {'cls': 'ExprName', 'name': 'int'}): +``` + +Adjusted R2 Score + ## RegressionR2Square[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 33ca2b4ce..e1dfa4d93 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## adj_r2_score[()]{.muted} + +```python +def adj_r2_score( + actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: {'cls': 'ExprName', 'name': 'int'}, featurecount: {'cls': 'ExprName', 'name': 'int'}): +``` + +Adjusted R2 Score + ## RegressionR2SquareComparison[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index f1f41b096..52a290dc1 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## RobustnessDiagnosis[()]{.muted} ```python @@ -46,7 +55,8 @@ This test introduces Gaussian noise to the numeric input features of the dataset - Gaussian noise might not adequately represent all types of real-world data perturbations. - Performance thresholds are somewhat arbitrary and might need tuning. - The test may not account for more complex or unstructured noise patterns that could affect model robustness. - ### [class]{.muted} MissingOrInvalidModelPredictFnError + +## [class]{.muted} MissingOrInvalidModelPredictFnError ```python class MissingOrInvalidModelPredictFnError(BaseError): diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 5d05bc5e3..e99f6ed56 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## generate_shap_plot[()]{.muted} ```python @@ -88,7 +97,8 @@ The exam begins with the selection of a suitable explainer which aligns with the - High-dimensional data can convolute interpretations. - Associating importance with tangible real-world impact still involves a certain degree of subjectivity. - ### [class]{.muted} UnsupportedModelForSHAPError + +## [class]{.muted} UnsupportedModelForSHAPError ```python class UnsupportedModelForSHAPError(BaseError): diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index c0e3464c4..13a20b015 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## AutoARIMA[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 6721ef662..a91338aa1 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -40,7 +40,7 @@ This test calculates the KS statistic and corresponding p-value for each feature - Less effective for multivariate distributions, as it is designed for univariate distributions. - Does not identify specific types of non-normality, such as skewness or kurtosis, which could impact model fitting. -### [class]{.muted} InvalidTestParametersError +## [class]{.muted} InvalidTestParametersError ```python class InvalidTestParametersError(BaseError): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index e18d10c37..8bbffb997 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -38,7 +38,7 @@ The function operates by extracting the estimated coefficients and their standar - It does not address issues related to multi-collinearity among predictor variables, which can affect the interpretation of coefficients. - This metric is limited to regression tasks using tabular data and is not applicable to other types of machine learning tasks or data structures. -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 5f94ee8a8..2e4af5002 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## RegressionFeatureSignificance[()]{.muted} ```python @@ -39,7 +48,8 @@ The test mechanism involves extracting the model's coefficients and p-values for - The p-value strategy for feature selection doesn't take into account the magnitude of the effect, focusing solely on whether the feature is likely non-zero. - This test is specific to regression models and wouldn't be suitable for other types of ML models. - P-value thresholds are somewhat arbitrary and do not always indicate practical significance, only statistical significance. - ### [class]{.muted} SkipTestError + +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 85f1c9656..f821dca66 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## RegressionModelForecastPlot[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 1c1ab6575..ebb7290c5 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## integrate_diff[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index e3390fdf0..6415fce91 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## adj_r2_score[()]{.muted} + +```python +def adj_r2_score( + actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: {'cls': 'ExprName', 'name': 'int'}, featurecount: {'cls': 'ExprName', 'name': 'int'}): +``` + +Adjusted R2 Score + ## RegressionModelSummary[()]{.muted} ```python diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 93ff8c26b..db078f624 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## get_logger[()]{.muted} + +```python +def get_logger( + name = 'validmind', log_level = None): +``` + +Get a logger for the given module name + ## RegressionPermutationFeatureImportance[()]{.muted} ```python diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 6a045d008..2d03f0137 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -4,6 +4,45 @@ toc-depth: 3 toc-expand: 3 --- +## call_model[()]{.muted} + +```python +def call_model( + system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): +``` + +Call LLM with the given prompts and return the response + +## get_explanation[()]{.muted} + +```python +def get_explanation( + response: {'cls': 'ExprName', 'name': 'str'}): +``` + +Get just the explanation from the response string TODO: use json response mode instead of this + +``` +e.g. "Score: 8 +``` + +Explanation: " -> "" + +## get_score[()]{.muted} + +```python +def get_score( + response: {'cls': 'ExprName', 'name': 'str'}): +``` + +Get just the score from the response string TODO: use json response mode instead of this + +``` +e.g. "Score: 8 +``` + +Explanation: " -> 8 + ## Bias[()]{.muted} ```python @@ -43,7 +82,8 @@ For each test case, the LLM grades the input prompt on a scale of 1 to 10. It ev - The test may not pick up on more subtle forms of bias or biases that are not directly related to the distribution or order of exemplars. - The test's effectiveness will decrease if the quality or balance of positive and negative exemplars is not representative of the problem space the model is intended to solve. - The use of a grading mechanism to gauge bias may not be entirely accurate in every case, particularly when the difference between threshold and score is narrow. - ### [class]{.muted} MissingRequiredTestInputError + +## [class]{.muted} MissingRequiredTestInputError ```python class MissingRequiredTestInputError(BaseError): diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 92574e5c1..1da1de2d8 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -4,6 +4,45 @@ toc-depth: 3 toc-expand: 3 --- +## call_model[()]{.muted} + +```python +def call_model( + system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): +``` + +Call LLM with the given prompts and return the response + +## get_explanation[()]{.muted} + +```python +def get_explanation( + response: {'cls': 'ExprName', 'name': 'str'}): +``` + +Get just the explanation from the response string TODO: use json response mode instead of this + +``` +e.g. "Score: 8 +``` + +Explanation: " -> "" + +## get_score[()]{.muted} + +```python +def get_score( + response: {'cls': 'ExprName', 'name': 'str'}): +``` + +Get just the score from the response string TODO: use json response mode instead of this + +``` +e.g. "Score: 8 +``` + +Explanation: " -> 8 + ## Clarity[()]{.muted} ```python @@ -38,7 +77,8 @@ The evaluation uses an LLM to scrutinize the clarity of prompts, factoring in co - Scoring system is subjective and relies on the AI’s interpretation of 'clarity' - The test assumes that all required factors (detail inclusion, persona adoption, step-by-step instructions, use of examples, and specification of output length) contribute equally to clarity, which might not always be the case - The evaluation may not be as effective if used on non-textual models - ### [class]{.muted} MissingRequiredTestInputError + +## [class]{.muted} MissingRequiredTestInputError ```python class MissingRequiredTestInputError(BaseError): diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 06a28c4b8..a1e298592 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -4,6 +4,45 @@ toc-depth: 3 toc-expand: 3 --- +## call_model[()]{.muted} + +```python +def call_model( + system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): +``` + +Call LLM with the given prompts and return the response + +## get_explanation[()]{.muted} + +```python +def get_explanation( + response: {'cls': 'ExprName', 'name': 'str'}): +``` + +Get just the explanation from the response string TODO: use json response mode instead of this + +``` +e.g. "Score: 8 +``` + +Explanation: " -> "" + +## get_score[()]{.muted} + +```python +def get_score( + response: {'cls': 'ExprName', 'name': 'str'}): +``` + +Get just the score from the response string TODO: use json response mode instead of this + +``` +e.g. "Score: 8 +``` + +Explanation: " -> 8 + ## Conciseness[()]{.muted} ```python @@ -40,7 +79,8 @@ Using an LLM, this test conducts a conciseness analysis on input prompts. The an - The conciseness score is based on an AI's assessment, which might not fully capture human interpretation of conciseness. - The predefined threshold for conciseness could be subjective and might need adjustment based on application. - The test is dependent on the LLM’s understanding of conciseness, which might vary from model to model. - ### [class]{.muted} MissingRequiredTestInputError + +## [class]{.muted} MissingRequiredTestInputError ```python class MissingRequiredTestInputError(BaseError): diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index ca6e309c4..8490e0b8b 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -4,6 +4,45 @@ toc-depth: 3 toc-expand: 3 --- +## call_model[()]{.muted} + +```python +def call_model( + system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): +``` + +Call LLM with the given prompts and return the response + +## get_explanation[()]{.muted} + +```python +def get_explanation( + response: {'cls': 'ExprName', 'name': 'str'}): +``` + +Get just the explanation from the response string TODO: use json response mode instead of this + +``` +e.g. "Score: 8 +``` + +Explanation: " -> "" + +## get_score[()]{.muted} + +```python +def get_score( + response: {'cls': 'ExprName', 'name': 'str'}): +``` + +Get just the score from the response string TODO: use json response mode instead of this + +``` +e.g. "Score: 8 +``` + +Explanation: " -> 8 + ## Delimitation[()]{.muted} ```python @@ -39,7 +78,8 @@ The test employs an LLM to examine prompts for appropriate use of delimiters suc - Only checks for the presence and placement of delimiters, not whether the correct delimiter type is used for the specific data or task. - May not fully reveal the impacts of poor delimitation on the LLM's final performance. - The preset score threshold may not be refined enough for complex tasks and prompts, requiring regular manual adjustment. - ### [class]{.muted} MissingRequiredTestInputError + +## [class]{.muted} MissingRequiredTestInputError ```python class MissingRequiredTestInputError(BaseError): diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index fbc97bda1..3927f4ac0 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -4,6 +4,45 @@ toc-depth: 3 toc-expand: 3 --- +## call_model[()]{.muted} + +```python +def call_model( + system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): +``` + +Call LLM with the given prompts and return the response + +## get_explanation[()]{.muted} + +```python +def get_explanation( + response: {'cls': 'ExprName', 'name': 'str'}): +``` + +Get just the explanation from the response string TODO: use json response mode instead of this + +``` +e.g. "Score: 8 +``` + +Explanation: " -> "" + +## get_score[()]{.muted} + +```python +def get_score( + response: {'cls': 'ExprName', 'name': 'str'}): +``` + +Get just the score from the response string TODO: use json response mode instead of this + +``` +e.g. "Score: 8 +``` + +Explanation: " -> 8 + ## NegativeInstruction[()]{.muted} ```python @@ -39,7 +78,8 @@ An LLM is employed to evaluate each prompt. The prompt is graded based on its us - The test necessitates an LLM for evaluation, which might not be available or feasible in certain scenarios. - A numeric scoring system, while straightforward, may oversimplify complex issues related to prompt designing and instruction clarity. - The effectiveness of the test hinges significantly on the predetermined threshold level, which can be subjective and may need to be adjusted according to specific use-cases. - ### [class]{.muted} MissingRequiredTestInputError + +## [class]{.muted} MissingRequiredTestInputError ```python class MissingRequiredTestInputError(BaseError): diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index f53a9ae1b..2054176bf 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -4,6 +4,15 @@ toc-depth: 3 toc-expand: 3 --- +## call_model[()]{.muted} + +```python +def call_model( + system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): +``` + +Call LLM with the given prompts and return the response + ## Robustness[()]{.muted} ```python @@ -39,7 +48,8 @@ The Robustness test appraises prompts under various conditions, alterations, and - Currently, the test only supports single-variable prompts, which restricts its application to more complex models. - When there are too many target classes (over 10), the test is skipped, which can leave potential vulnerabilities unchecked in complex multi-class models. - The test may not account for all potential conditions or alterations that could show up in practical use scenarios. - ### [class]{.muted} MissingRequiredTestInputError + +## [class]{.muted} MissingRequiredTestInputError ```python class MissingRequiredTestInputError(BaseError): @@ -52,7 +62,7 @@ When a required test context variable is missing. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note -### [class]{.muted} SkipTestError +## [class]{.muted} SkipTestError ```python class SkipTestError(BaseError): diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index ac170fce1..acf5edf23 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -4,6 +4,45 @@ toc-depth: 3 toc-expand: 3 --- +## call_model[()]{.muted} + +```python +def call_model( + system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): +``` + +Call LLM with the given prompts and return the response + +## get_explanation[()]{.muted} + +```python +def get_explanation( + response: {'cls': 'ExprName', 'name': 'str'}): +``` + +Get just the explanation from the response string TODO: use json response mode instead of this + +``` +e.g. "Score: 8 +``` + +Explanation: " -> "" + +## get_score[()]{.muted} + +```python +def get_score( + response: {'cls': 'ExprName', 'name': 'str'}): +``` + +Get just the score from the response string TODO: use json response mode instead of this + +``` +e.g. "Score: 8 +``` + +Explanation: " -> 8 + ## Specificity[()]{.muted} ```python @@ -39,7 +78,8 @@ The Specificity Test employs an LLM to grade each prompt based on clarity, detai - This test doesn't consider the content comprehension capability of the LLM - High specificity score doesn't guarantee a high-quality response from the LLM, as the model's performance is also dependent on various other factors - Striking a balance between specificity and verbosity can be challenging, as overly detailed prompts might confuse or mislead the model - ### [class]{.muted} MissingRequiredTestInputError + +## [class]{.muted} MissingRequiredTestInputError ```python class MissingRequiredTestInputError(BaseError): diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index d4060a64c..a7eb5bfe8 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -6,7 +6,7 @@ toc-expand: 3 Models entrypoint -### [class]{.muted} Figure +## [class]{.muted} Figure ```python class Figure(): @@ -14,8 +14,6 @@ class Figure(): Figure objects track the schema supported by the ValidMind API -**Methods** - ### [serialize[()]{.muted}](#serialize) ```python @@ -40,7 +38,7 @@ to_widget(self) Returns the ipywidget compatible representation of the figure. Ideally we would render images as-is, but Plotly FigureWidgets don't work well on Google Colab when they are combined with ipywidgets. -### [class]{.muted} ModelAttributes +## [class]{.muted} ModelAttributes ```python class ModelAttributes(): @@ -48,8 +46,6 @@ class ModelAttributes(): Model attributes definition -**Methods** - ### [from_dict[()]{.muted}](#from_dict) ```python @@ -58,7 +54,7 @@ from_dict(cls, data) Creates a ModelAttributes instance from a dictionary -### [class]{.muted} TestSuite +## [class]{.muted} TestSuite ```python class TestSuite(): @@ -68,8 +64,6 @@ Base class for test suites. Test suites are used to define a grouping of tests t Tests can be a flat list of strings or may be nested into sections by using a dict -**Methods** - ### [get_default_config[()]{.muted}](#get_default_config) ```python @@ -98,7 +92,7 @@ num_tests(self) Returns the total number of tests in the test suite -### [class]{.muted} TestSuiteRunner +## [class]{.muted} TestSuiteRunner ```python class TestSuiteRunner(): @@ -106,8 +100,6 @@ class TestSuiteRunner(): Runs a test suite -**Methods** - ### [log_results[()]{.muted}](#log_results) ```python @@ -135,7 +127,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind summarize(self, show_link) ``` -### [class]{.muted} VMDataset +## [class]{.muted} VMDataset ```python class VMDataset(VMInput): @@ -147,23 +139,21 @@ This way we can support multiple dataset types but under the hood we only need t **Parameters** -- **raw_dataset**: The raw dataset as a NumPy array. -- **input_id**: Identifier for the dataset. -- **index**: The raw dataset index as a NumPy array. -- **columns**: The column names of the dataset. -- **target_column**: The target column name of the dataset. -- **feature_columns**: The feature column names of the dataset. -- **feature_columns_numeric**: The numeric feature column names of the dataset. -- **feature_columns_categorical**: The categorical feature column names of the dataset. -- **text_column**: The text column name of the dataset for NLP tasks. -- **target_class_labels**: The class labels for the target columns. -- **df**: The dataset as a pandas DataFrame. -- **extra_columns**: Extra columns to include in the dataset. +- **raw_dataset** (np.ndarray): The raw dataset as a NumPy array. +- **input_id** (str): Identifier for the dataset. +- **index** (np.ndarray): The raw dataset index as a NumPy array. +- **columns** (Set[str]): The column names of the dataset. +- **target_column** (str): The target column name of the dataset. +- **feature_columns** (List[str]): The feature column names of the dataset. +- **feature_columns_numeric** (List[str]): The numeric feature column names of the dataset. +- **feature_columns_categorical** (List[str]): The categorical feature column names of the dataset. +- **text_column** (str): The text column name of the dataset for NLP tasks. +- **target_class_labels** (Dict): The class labels for the target columns. +- **df** (pd.DataFrame): The dataset as a pandas DataFrame. +- **extra_columns** (Dict): Extra columns to include in the dataset. **Inherited members** -**Methods** - ### [add_extra_column[()]{.muted}](#add_extra_column) ```python @@ -300,7 +290,7 @@ y_prob_df(self, model) Returns a dataframe containing the probabilities for a given model -### [class]{.muted} VMInput +## [class]{.muted} VMInput ```python class VMInput(ABC): @@ -310,8 +300,6 @@ Base class for ValidMind Input types **Inherited members** -**Methods** - ### [with_options[()]{.muted}](#with_options) ```python @@ -328,7 +316,7 @@ Allows for setting options on the input object that are passed by the user when - A new instance of the input with the specified options set -### [class]{.muted} VMModel +## [class]{.muted} VMModel ```python class VMModel(VMInput): @@ -338,15 +326,13 @@ An base class that wraps a trained model instance and its associated data. **Parameters** -- **model**: The trained model instance. Defaults to None. -- **input_id**: The input ID for the model. Defaults to None. -- **attributes**: The attributes of the model. Defaults to None. -- **name**: The name of the model. Defaults to the class name. +- **model** (object): The trained model instance. Defaults to None. +- **input_id** (str): The input ID for the model. Defaults to None. +- **attributes** (ModelAttributes): The attributes of the model. Defaults to None. +- **name** (str): The name of the model. Defaults to the class name. **Inherited members** -**Methods** - ### [predict[()]{.muted}](#predict) ```python diff --git a/docs/validmind_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css b/docs/validmind_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css new file mode 100644 index 000000000..d6064cbbb --- /dev/null +++ b/docs/validmind_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css @@ -0,0 +1,12 @@ +/*! + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root,[data-bs-theme=light]{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-black: #000;--bs-white: #ffffff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #dee2e6;--bs-primary: #0d6efd;--bs-secondary: #6c757d;--bs-success: #198754;--bs-info: #0dcaf0;--bs-warning: #ffc107;--bs-danger: #dc3545;--bs-light: #f8f9fa;--bs-dark: #212529;--bs-default-rgb: 222, 226, 230;--bs-primary-rgb: 13, 110, 253;--bs-secondary-rgb: 108, 117, 125;--bs-success-rgb: 25, 135, 84;--bs-info-rgb: 13, 202, 240;--bs-warning-rgb: 255, 193, 7;--bs-danger-rgb: 220, 53, 69;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 33, 37, 41;--bs-primary-text-emphasis: #052c65;--bs-secondary-text-emphasis: #2b2f32;--bs-success-text-emphasis: #0a3622;--bs-info-text-emphasis: #055160;--bs-warning-text-emphasis: #664d03;--bs-danger-text-emphasis: #58151c;--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: #cfe2ff;--bs-secondary-bg-subtle: #e2e3e5;--bs-success-bg-subtle: #d1e7dd;--bs-info-bg-subtle: #cff4fc;--bs-warning-bg-subtle: #fff3cd;--bs-danger-bg-subtle: #f8d7da;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #9ec5fe;--bs-secondary-border-subtle: #c4c8cb;--bs-success-border-subtle: #a3cfbb;--bs-info-border-subtle: #9eeaf9;--bs-warning-border-subtle: #ffe69c;--bs-danger-border-subtle: #f1aeb5;--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #212529;--bs-body-color-rgb: 33, 37, 41;--bs-body-bg: #ffffff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb: 33, 37, 41;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233, 236, 239;--bs-tertiary-color: rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb: 33, 37, 41;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #0d6efd;--bs-link-color-rgb: 13, 110, 253;--bs-link-decoration: underline;--bs-link-hover-color: #0a58ca;--bs-link-hover-color-rgb: 10, 88, 202;--bs-code-color: #7d12ba;--bs-highlight-bg: #fff3cd;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: white;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.375rem;--bs-border-radius-sm: 0.25rem;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(13, 110, 253, 0.25);--bs-form-valid-color: #198754;--bs-form-valid-border-color: #198754;--bs-form-invalid-color: #dc3545;--bs-form-invalid-border-color: #dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #ffffff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: #6ea8fe;--bs-secondary-text-emphasis: #a7acb1;--bs-success-text-emphasis: #75b798;--bs-info-text-emphasis: #6edff6;--bs-warning-text-emphasis: #ffda6a;--bs-danger-text-emphasis: #ea868f;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #031633;--bs-secondary-bg-subtle: #161719;--bs-success-bg-subtle: #051b11;--bs-info-bg-subtle: #032830;--bs-warning-bg-subtle: #332701;--bs-danger-bg-subtle: #2c0b0e;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #084298;--bs-secondary-border-subtle: #41464b;--bs-success-border-subtle: #0f5132;--bs-info-border-subtle: #087990;--bs-warning-border-subtle: #997404;--bs-danger-border-subtle: #842029;--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #6ea8fe;--bs-link-hover-color: #8bb9fe;--bs-link-color-rgb: 110, 168, 254;--bs-link-hover-color-rgb: 139, 185, 254;--bs-code-color: white;--bs-border-color: #495057;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #75b798;--bs-form-valid-border-color: #75b798;--bs-form-invalid-color: #ea868f;--bs-form-invalid-border-color: #ea868f}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #e9ecef}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f8f9fa;line-height:1.5;padding:.5rem;border:1px solid var(--bs-border-color, white);border-radius:.375rem}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;border-radius:.375rem;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#212529;border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(33,37,41,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #fff;border-radius:.375rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(33,37,41,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #212529;--bs-table-bg: #ffffff;--bs-table-border-color: white;--bs-table-accent-bg: transparent;--bs-table-striped-color: #212529;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #212529;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #212529;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #909294}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #000;--bs-table-bg: #cfe2ff;--bs-table-border-color: #bacbe6;--bs-table-striped-bg: #c5d7f2;--bs-table-striped-color: #000;--bs-table-active-bg: #bacbe6;--bs-table-active-color: #000;--bs-table-hover-bg: #bfd1ec;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #000;--bs-table-bg: #e2e3e5;--bs-table-border-color: #cbccce;--bs-table-striped-bg: #d7d8da;--bs-table-striped-color: #000;--bs-table-active-bg: #cbccce;--bs-table-active-color: #000;--bs-table-hover-bg: #d1d2d4;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #000;--bs-table-bg: #d1e7dd;--bs-table-border-color: #bcd0c7;--bs-table-striped-bg: #c7dbd2;--bs-table-striped-color: #000;--bs-table-active-bg: #bcd0c7;--bs-table-active-color: #000;--bs-table-hover-bg: #c1d6cc;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #000;--bs-table-bg: #cff4fc;--bs-table-border-color: #badce3;--bs-table-striped-bg: #c5e8ef;--bs-table-striped-color: #000;--bs-table-active-bg: #badce3;--bs-table-active-color: #000;--bs-table-hover-bg: #bfe2e9;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #000;--bs-table-bg: #fff3cd;--bs-table-border-color: #e6dbb9;--bs-table-striped-bg: #f2e7c3;--bs-table-striped-color: #000;--bs-table-active-bg: #e6dbb9;--bs-table-active-color: #000;--bs-table-hover-bg: #ece1be;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #000;--bs-table-bg: #f8d7da;--bs-table-border-color: #dfc2c4;--bs-table-striped-bg: #eccccf;--bs-table-striped-color: #000;--bs-table-active-bg: #dfc2c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e5c7ca;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #f8f9fa;--bs-table-border-color: #dfe0e1;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #ffffff;--bs-table-bg: #212529;--bs-table-border-color: #373b3e;--bs-table-striped-bg: #2c3034;--bs-table-striped-color: #ffffff;--bs-table-active-bg: #373b3e;--bs-table-active-color: #ffffff;--bs-table-hover-bg: #323539;--bs-table-hover-color: #ffffff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(33,37,41,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #fff;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:rgba(33,37,41,.75);opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#212529;background-color:#f8f9fa;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e9ecef}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem;border-radius:.25rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:.375rem}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:.375rem}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #fff;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem;border-radius:.25rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #ffffff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid #fff;print-color-adjust:exact}.form-check-input[type=checkbox],.shiny-input-container .checkbox input[type=checkbox],.shiny-input-container .checkbox-inline input[type=checkbox],.shiny-input-container .radio input[type=checkbox],.shiny-input-container .radio-inline input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23ffffff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(33,37,41,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(33,37,41,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff;border-radius:.375rem}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#e9ecef}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:1px solid #fff;border-radius:.375rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;border-radius:.25rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#198754;border-radius:.375rem}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#198754;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#198754}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#198754}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#198754}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#dc3545;border-radius:.375rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#dc3545}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#dc3545}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#dc3545}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #212529;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.375rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #000;--bs-btn-bg: #dee2e6;--bs-btn-border-color: #dee2e6;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #e3e6ea;--bs-btn-hover-border-color: #e1e5e9;--bs-btn-focus-shadow-rgb: 189, 192, 196;--bs-btn-active-color: #000;--bs-btn-active-bg: #e5e8eb;--bs-btn-active-border-color: #e1e5e9;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #dee2e6;--bs-btn-disabled-border-color: #dee2e6}.btn-primary{--bs-btn-color: #ffffff;--bs-btn-bg: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #0b5ed7;--bs-btn-hover-border-color: #0a58ca;--bs-btn-focus-shadow-rgb: 49, 132, 253;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #0a58ca;--bs-btn-active-border-color: #0a53be;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #0d6efd;--bs-btn-disabled-border-color: #0d6efd}.btn-secondary{--bs-btn-color: #ffffff;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #5c636a;--bs-btn-hover-border-color: #565e64;--bs-btn-focus-shadow-rgb: 130, 138, 145;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #565e64;--bs-btn-active-border-color: #51585e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}.btn-success{--bs-btn-color: #ffffff;--bs-btn-bg: #198754;--bs-btn-border-color: #198754;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #157347;--bs-btn-hover-border-color: #146c43;--bs-btn-focus-shadow-rgb: 60, 153, 110;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #146c43;--bs-btn-active-border-color: #13653f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #198754;--bs-btn-disabled-border-color: #198754}.btn-info{--bs-btn-color: #000;--bs-btn-bg: #0dcaf0;--bs-btn-border-color: #0dcaf0;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #31d2f2;--bs-btn-hover-border-color: #25cff2;--bs-btn-focus-shadow-rgb: 11, 172, 204;--bs-btn-active-color: #000;--bs-btn-active-bg: #3dd5f3;--bs-btn-active-border-color: #25cff2;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #0dcaf0;--bs-btn-disabled-border-color: #0dcaf0}.btn-warning{--bs-btn-color: #000;--bs-btn-bg: #ffc107;--bs-btn-border-color: #ffc107;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ffca2c;--bs-btn-hover-border-color: #ffc720;--bs-btn-focus-shadow-rgb: 217, 164, 6;--bs-btn-active-color: #000;--bs-btn-active-bg: #ffcd39;--bs-btn-active-border-color: #ffc720;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #ffc107;--bs-btn-disabled-border-color: #ffc107}.btn-danger{--bs-btn-color: #ffffff;--bs-btn-bg: #dc3545;--bs-btn-border-color: #dc3545;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #bb2d3b;--bs-btn-hover-border-color: #b02a37;--bs-btn-focus-shadow-rgb: 225, 83, 97;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #b02a37;--bs-btn-active-border-color: #a52834;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #dc3545;--bs-btn-disabled-border-color: #dc3545}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #d3d4d5;--bs-btn-hover-border-color: #c6c7c8;--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: #c6c7c8;--bs-btn-active-border-color: #babbbc;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}.btn-dark{--bs-btn-color: #ffffff;--bs-btn-bg: #212529;--bs-btn-border-color: #212529;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #424649;--bs-btn-hover-border-color: #373b3e;--bs-btn-focus-shadow-rgb: 66, 70, 73;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #4d5154;--bs-btn-active-border-color: #373b3e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #212529;--bs-btn-disabled-border-color: #212529}.btn-outline-default{--bs-btn-color: #dee2e6;--bs-btn-border-color: #dee2e6;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #dee2e6;--bs-btn-hover-border-color: #dee2e6;--bs-btn-focus-shadow-rgb: 222, 226, 230;--bs-btn-active-color: #000;--bs-btn-active-bg: #dee2e6;--bs-btn-active-border-color: #dee2e6;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #dee2e6;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #dee2e6;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #0d6efd;--bs-btn-hover-border-color: #0d6efd;--bs-btn-focus-shadow-rgb: 13, 110, 253;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #0d6efd;--bs-btn-active-border-color: #0d6efd;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #0d6efd;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #0d6efd;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #6c757d;--bs-btn-hover-border-color: #6c757d;--bs-btn-focus-shadow-rgb: 108, 117, 125;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #6c757d;--bs-btn-active-border-color: #6c757d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6c757d;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #198754;--bs-btn-border-color: #198754;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #198754;--bs-btn-hover-border-color: #198754;--bs-btn-focus-shadow-rgb: 25, 135, 84;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #198754;--bs-btn-active-border-color: #198754;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #198754;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #198754;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #0dcaf0;--bs-btn-border-color: #0dcaf0;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #0dcaf0;--bs-btn-hover-border-color: #0dcaf0;--bs-btn-focus-shadow-rgb: 13, 202, 240;--bs-btn-active-color: #000;--bs-btn-active-bg: #0dcaf0;--bs-btn-active-border-color: #0dcaf0;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #0dcaf0;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #0dcaf0;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #ffc107;--bs-btn-border-color: #ffc107;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ffc107;--bs-btn-hover-border-color: #ffc107;--bs-btn-focus-shadow-rgb: 255, 193, 7;--bs-btn-active-color: #000;--bs-btn-active-bg: #ffc107;--bs-btn-active-border-color: #ffc107;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffc107;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ffc107;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #dc3545;--bs-btn-border-color: #dc3545;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #dc3545;--bs-btn-hover-border-color: #dc3545;--bs-btn-focus-shadow-rgb: 220, 53, 69;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #dc3545;--bs-btn-active-border-color: #dc3545;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #dc3545;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #dc3545;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #f8f9fa;--bs-btn-hover-border-color: #f8f9fa;--bs-btn-focus-shadow-rgb: 248, 249, 250;--bs-btn-active-color: #000;--bs-btn-active-bg: #f8f9fa;--bs-btn-active-border-color: #f8f9fa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f8f9fa;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f8f9fa;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #212529;--bs-btn-border-color: #212529;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #212529;--bs-btn-hover-border-color: #212529;--bs-btn-focus-shadow-rgb: 33, 37, 41;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #212529;--bs-btn-active-border-color: #212529;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #212529;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #212529;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #0d6efd;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #0a58ca;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #0a58ca;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 49, 132, 253;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.25rem}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #212529;--bs-dropdown-bg: #ffffff;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-border-radius: 0.375rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.375rem - 1px);--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #212529;--bs-dropdown-link-hover-color: #212529;--bs-dropdown-link-hover-bg: #f8f9fa;--bs-dropdown-link-active-color: #ffffff;--bs-dropdown-link-active-bg: #0d6efd;--bs-dropdown-link-disabled-color: rgba(33, 37, 41, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #ffffff;--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #ffffff;--bs-dropdown-link-active-bg: #0d6efd;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.375rem}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #0d6efd;--bs-nav-link-hover-color: #0a58ca;--bs-nav-link-disabled-color: rgba(33, 37, 41, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: white;--bs-nav-tabs-border-radius: 0.375rem;--bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef white;--bs-nav-tabs-link-active-color: #000;--bs-nav-tabs-link-active-bg: #ffffff;--bs-nav-tabs-link-active-border-color: white white #ffffff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: 0.375rem;--bs-nav-pills-link-active-color: #ffffff;--bs-nav-pills-link-active-bg: #0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 0.5rem;--bs-navbar-color: #fdfefe;--bs-navbar-hover-color: rgba(253, 254, 255, 0.8);--bs-navbar-disabled-color: rgba(253, 254, 254, 0.75);--bs-navbar-active-color: #fdfeff;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #fdfefe;--bs-navbar-brand-hover-color: #fdfeff;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfefe' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(253, 254, 254, 0);--bs-navbar-toggler-border-radius: 0.375rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #fdfefe;--bs-navbar-hover-color: rgba(253, 254, 255, 0.8);--bs-navbar-disabled-color: rgba(253, 254, 254, 0.75);--bs-navbar-active-color: #fdfeff;--bs-navbar-brand-color: #fdfefe;--bs-navbar-brand-hover-color: #fdfeff;--bs-navbar-toggler-border-color: rgba(253, 254, 254, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfefe' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfefe' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.375rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.375rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(33, 37, 41, 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #ffffff;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color: #212529;--bs-accordion-bg: #ffffff;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: white;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.375rem;--bs-accordion-inner-border-radius: calc(0.375rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #212529;--bs-accordion-btn-bg: #ffffff;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23052c65'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #86b7fe;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #052c65;--bs-accordion-active-bg: #cfe2ff}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: rgba(33, 37, 41, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(33, 37, 41, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #0d6efd;--bs-pagination-bg: #ffffff;--bs-pagination-border-width: 1px;--bs-pagination-border-color: white;--bs-pagination-border-radius: 0.375rem;--bs-pagination-hover-color: #0a58ca;--bs-pagination-hover-bg: #f8f9fa;--bs-pagination-hover-border-color: white;--bs-pagination-focus-color: #0a58ca;--bs-pagination-focus-bg: #e9ecef;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color: #ffffff;--bs-pagination-active-bg: #0d6efd;--bs-pagination-active-border-color: #0d6efd;--bs-pagination-disabled-color: rgba(33, 37, 41, 0.75);--bs-pagination-disabled-bg: #e9ecef;--bs-pagination-disabled-border-color: white;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(1px*-1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.25rem}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #ffffff;--bs-badge-border-radius: 0.375rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 1px solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.375rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #e9ecef;--bs-progress-border-radius: 0.375rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #ffffff;--bs-progress-bar-bg: #0d6efd;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #212529;--bs-list-group-bg: #ffffff;--bs-list-group-border-color: white;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.375rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(33, 37, 41, 0.75);--bs-list-group-action-hover-color: #000;--bs-list-group-action-hover-bg: #f8f9fa;--bs-list-group-action-active-color: #212529;--bs-list-group-action-active-bg: #e9ecef;--bs-list-group-disabled-color: rgba(33, 37, 41, 0.75);--bs-list-group-disabled-bg: #ffffff;--bs-list-group-active-color: #ffffff;--bs-list-group-active-bg: #0d6efd;--bs-list-group-active-border-color: #0d6efd;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #000;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.5;--bs-btn-close-hover-opacity: 0.75;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(255, 255, 255, 0.85);--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.375rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(33, 37, 41, 0.75);--bs-toast-header-bg: rgba(255, 255, 255, 0.85);--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #ffffff;--bs-modal-border-color: rgba(0, 0, 0, 0.175);--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: white;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: white;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #ffffff;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.375rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #ffffff;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #e9ecef;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #212529;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ffffff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ffffff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #212529;--bs-offcanvas-bg: #ffffff;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: rgba(0, 0, 0, 0.175);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#000 !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#000 !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#000 !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(229, 232, 235, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(229, 232, 235, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#000}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#000}.bg-warning{color:#000}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #0d6efd;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #d63384;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #d63384;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #dc3545;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ffc107;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ffc107;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #198754;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #0dcaf0;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #dee2e6}.bg-default{--bslib-color-bg: #dee2e6;--bslib-color-fg: #000}.text-primary{--bslib-color-fg: #0d6efd}.bg-primary{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #ffffff}.text-success{--bslib-color-fg: #198754}.bg-success{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff}.text-info{--bslib-color-fg: #0dcaf0}.bg-info{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000}.text-warning{--bslib-color-fg: #ffc107}.bg-warning{--bslib-color-bg: #ffc107;--bslib-color-fg: #000}.text-danger{--bslib-color-fg: #dc3545}.bg-danger{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #212529}.bg-dark{--bslib-color-bg: #212529;--bslib-color-fg: #ffffff}.bg-gradient-blue-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #3148f9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3148f9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #345ce5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #345ce5;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #5d56cd;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #5d56cd;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #6057b3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #6057b3;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #6d74a0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #6d74a0;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #000;--bslib-color-bg: #6e8f9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #6e8f9b;color:#000}.bg-gradient-blue-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #1278b9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #1278b9;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #000;--bslib-color-bg: #1592d4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1592d4;color:#000}.bg-gradient-blue-cyan{--bslib-color-fg: #000;--bslib-color-bg: #0d93f8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #0d93f8;color:#000}.bg-gradient-indigo-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #4236f6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #4236f6;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #931ec6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #931ec6;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #951fad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #951fad;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #ffffff;--bslib-color-bg: #a35794;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #a35794;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #4740b3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #4740b3;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #ffffff;--bslib-color-bg: #425af1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #425af1;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #4854d9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #4854d9;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #983ca9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #983ca9;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #9b3d8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #9b3d8f;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #000;--bslib-color-bg: #a97577;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #a97577;color:#000}.bg-gradient-purple-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #4d5e95;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #4d5e95;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #000;--bslib-color-bg: #4878d4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #4878d4;color:#000}.bg-gradient-pink-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #864bb4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #864bb4;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #a925b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #a925b0;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #ad399c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #ad399c;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #d8346b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #d8346b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #000;--bslib-color-bg: #e65157;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #e65157;color:#000}.bg-gradient-pink-yellow{--bslib-color-fg: #000;--bslib-color-bg: #e66c52;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #e66c52;color:#000}.bg-gradient-pink-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #8a5571;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #8a5571;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #000;--bslib-color-bg: #8d6f8c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #8d6f8c;color:#000}.bg-gradient-pink-cyan{--bslib-color-fg: #000;--bslib-color-bg: #866faf;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #866faf;color:#000}.bg-gradient-red-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #894c8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #894c8f;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #ad268a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #ad268a;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #b03a77;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b03a77;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #da345e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #da345e;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #000;--bslib-color-bg: #e95231;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #e95231;color:#000}.bg-gradient-red-yellow{--bslib-color-fg: #000;--bslib-color-bg: #ea6d2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #ea6d2c;color:#000}.bg-gradient-red-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #8e564b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #8e564b;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #000;--bslib-color-bg: #917066;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #917066;color:#000}.bg-gradient-red-cyan{--bslib-color-fg: #000;--bslib-color-bg: #897189;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #897189;color:#000}.bg-gradient-orange-blue{--bslib-color-fg: #000;--bslib-color-bg: #9d7871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #9d7871;color:#000}.bg-gradient-orange-indigo{--bslib-color-fg: #000;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#000}.bg-gradient-orange-purple{--bslib-color-fg: #000;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#000}.bg-gradient-orange-pink{--bslib-color-fg: #000;--bslib-color-bg: #ed6041;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #ed6041;color:#000}.bg-gradient-orange-red{--bslib-color-fg: #000;--bslib-color-bg: #f06128;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #f06128;color:#000}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #fe990f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #fe990f;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a2822e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #a2822e;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #000;--bslib-color-bg: #9d9c6c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #9d9c6c;color:#000}.bg-gradient-yellow-blue{--bslib-color-fg: #000;--bslib-color-bg: #9ea069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #9ea069;color:#000}.bg-gradient-yellow-indigo{--bslib-color-fg: #000;--bslib-color-bg: #c27a65;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c27a65;color:#000}.bg-gradient-yellow-purple{--bslib-color-fg: #000;--bslib-color-bg: #c58e51;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c58e51;color:#000}.bg-gradient-yellow-pink{--bslib-color-fg: #000;--bslib-color-bg: #ef8839;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #ef8839;color:#000}.bg-gradient-yellow-red{--bslib-color-fg: #000;--bslib-color-bg: #f18920;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #f18920;color:#000}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #fea60c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #fea60c;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #000;--bslib-color-bg: #a3aa26;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #a3aa26;color:#000}.bg-gradient-yellow-teal{--bslib-color-fg: #000;--bslib-color-bg: #a6c441;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6c441;color:#000}.bg-gradient-yellow-cyan{--bslib-color-fg: #000;--bslib-color-bg: #9ec564;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #9ec564;color:#000}.bg-gradient-green-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #147d98;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #147d98;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #385793;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #385793;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #3b6b80;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3b6b80;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #656567;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #656567;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #67664e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #67664e;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #74833a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #74833a;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #000;--bslib-color-bg: #759e35;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #759e35;color:#000}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #1ca16f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1ca16f;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #000;--bslib-color-bg: #14a292;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #14a292;color:#000}.bg-gradient-teal-blue{--bslib-color-fg: #000;--bslib-color-bg: #18a5c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #18a5c0;color:#000}.bg-gradient-teal-indigo{--bslib-color-fg: #000;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#000}.bg-gradient-teal-purple{--bslib-color-fg: #000;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#000}.bg-gradient-teal-pink{--bslib-color-fg: #000;--bslib-color-bg: #698d8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #698d8f;color:#000}.bg-gradient-teal-red{--bslib-color-fg: #000;--bslib-color-bg: #6b8e76;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #6b8e76;color:#000}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #000;--bslib-color-bg: #79c65d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #79c65d;color:#000}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #1daf7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #1daf7c;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #000;--bslib-color-bg: #18c9bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #18c9bb;color:#000}.bg-gradient-cyan-blue{--bslib-color-fg: #000;--bslib-color-bg: #0da5f5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #0da5f5;color:#000}.bg-gradient-cyan-indigo{--bslib-color-fg: #000;--bslib-color-bg: #3180f1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3180f1;color:#000}.bg-gradient-cyan-purple{--bslib-color-fg: #000;--bslib-color-bg: #3494dd;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3494dd;color:#000}.bg-gradient-cyan-pink{--bslib-color-fg: #000;--bslib-color-bg: #5d8ec5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #5d8ec5;color:#000}.bg-gradient-cyan-red{--bslib-color-fg: #000;--bslib-color-bg: #608eac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #608eac;color:#000}.bg-gradient-cyan-orange{--bslib-color-fg: #000;--bslib-color-bg: #6dac98;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #6dac98;color:#000}.bg-gradient-cyan-yellow{--bslib-color-fg: #000;--bslib-color-bg: #6ec693;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #6ec693;color:#000}.bg-gradient-cyan-green{--bslib-color-fg: #000;--bslib-color-bg: #12afb2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #12afb2;color:#000}.bg-gradient-cyan-teal{--bslib-color-fg: #000;--bslib-color-bg: #15cacc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #15cacc;color:#000}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.bg-blue{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #0d6efd;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #d63384;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #d63384;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #dc3545;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ffc107;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ffc107;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #198754;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #0dcaf0;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #dee2e6}.bg-default{--bslib-color-bg: #dee2e6;--bslib-color-fg: #000}.text-primary{--bslib-color-fg: #0d6efd}.bg-primary{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #ffffff}.text-success{--bslib-color-fg: #198754}.bg-success{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff}.text-info{--bslib-color-fg: #0dcaf0}.bg-info{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000}.text-warning{--bslib-color-fg: #ffc107}.bg-warning{--bslib-color-bg: #ffc107;--bslib-color-fg: #000}.text-danger{--bslib-color-fg: #dc3545}.bg-danger{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #212529}.bg-dark{--bslib-color-bg: #212529;--bslib-color-fg: #ffffff}.bg-gradient-blue-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #3148f9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3148f9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #345ce5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #345ce5;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #5d56cd;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #5d56cd;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #6057b3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #6057b3;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #6d74a0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #6d74a0;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #000;--bslib-color-bg: #6e8f9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #6e8f9b;color:#000}.bg-gradient-blue-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #1278b9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #1278b9;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #000;--bslib-color-bg: #1592d4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1592d4;color:#000}.bg-gradient-blue-cyan{--bslib-color-fg: #000;--bslib-color-bg: #0d93f8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #0d93f8;color:#000}.bg-gradient-indigo-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #4236f6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #4236f6;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #931ec6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #931ec6;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #951fad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #951fad;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #ffffff;--bslib-color-bg: #a35794;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #a35794;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #4740b3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #4740b3;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #ffffff;--bslib-color-bg: #425af1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #425af1;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #4854d9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #4854d9;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #983ca9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #983ca9;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #9b3d8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #9b3d8f;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #000;--bslib-color-bg: #a97577;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #a97577;color:#000}.bg-gradient-purple-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #4d5e95;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #4d5e95;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #000;--bslib-color-bg: #4878d4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #4878d4;color:#000}.bg-gradient-pink-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #864bb4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #864bb4;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #a925b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #a925b0;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #ad399c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #ad399c;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #d8346b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #d8346b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #000;--bslib-color-bg: #e65157;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #e65157;color:#000}.bg-gradient-pink-yellow{--bslib-color-fg: #000;--bslib-color-bg: #e66c52;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #e66c52;color:#000}.bg-gradient-pink-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #8a5571;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #8a5571;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #000;--bslib-color-bg: #8d6f8c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #8d6f8c;color:#000}.bg-gradient-pink-cyan{--bslib-color-fg: #000;--bslib-color-bg: #866faf;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #866faf;color:#000}.bg-gradient-red-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #894c8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #894c8f;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #ad268a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #ad268a;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #b03a77;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b03a77;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #da345e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #da345e;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #000;--bslib-color-bg: #e95231;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #e95231;color:#000}.bg-gradient-red-yellow{--bslib-color-fg: #000;--bslib-color-bg: #ea6d2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #ea6d2c;color:#000}.bg-gradient-red-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #8e564b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #8e564b;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #000;--bslib-color-bg: #917066;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #917066;color:#000}.bg-gradient-red-cyan{--bslib-color-fg: #000;--bslib-color-bg: #897189;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #897189;color:#000}.bg-gradient-orange-blue{--bslib-color-fg: #000;--bslib-color-bg: #9d7871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #9d7871;color:#000}.bg-gradient-orange-indigo{--bslib-color-fg: #000;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#000}.bg-gradient-orange-purple{--bslib-color-fg: #000;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#000}.bg-gradient-orange-pink{--bslib-color-fg: #000;--bslib-color-bg: #ed6041;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #ed6041;color:#000}.bg-gradient-orange-red{--bslib-color-fg: #000;--bslib-color-bg: #f06128;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #f06128;color:#000}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #fe990f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #fe990f;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a2822e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #a2822e;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #000;--bslib-color-bg: #9d9c6c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #9d9c6c;color:#000}.bg-gradient-yellow-blue{--bslib-color-fg: #000;--bslib-color-bg: #9ea069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #9ea069;color:#000}.bg-gradient-yellow-indigo{--bslib-color-fg: #000;--bslib-color-bg: #c27a65;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c27a65;color:#000}.bg-gradient-yellow-purple{--bslib-color-fg: #000;--bslib-color-bg: #c58e51;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c58e51;color:#000}.bg-gradient-yellow-pink{--bslib-color-fg: #000;--bslib-color-bg: #ef8839;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #ef8839;color:#000}.bg-gradient-yellow-red{--bslib-color-fg: #000;--bslib-color-bg: #f18920;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #f18920;color:#000}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #fea60c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #fea60c;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #000;--bslib-color-bg: #a3aa26;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #a3aa26;color:#000}.bg-gradient-yellow-teal{--bslib-color-fg: #000;--bslib-color-bg: #a6c441;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6c441;color:#000}.bg-gradient-yellow-cyan{--bslib-color-fg: #000;--bslib-color-bg: #9ec564;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #9ec564;color:#000}.bg-gradient-green-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #147d98;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #147d98;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #385793;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #385793;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #3b6b80;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3b6b80;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #656567;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #656567;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #67664e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #67664e;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #74833a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #74833a;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #000;--bslib-color-bg: #759e35;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #759e35;color:#000}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #1ca16f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1ca16f;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #000;--bslib-color-bg: #14a292;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #14a292;color:#000}.bg-gradient-teal-blue{--bslib-color-fg: #000;--bslib-color-bg: #18a5c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #18a5c0;color:#000}.bg-gradient-teal-indigo{--bslib-color-fg: #000;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#000}.bg-gradient-teal-purple{--bslib-color-fg: #000;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#000}.bg-gradient-teal-pink{--bslib-color-fg: #000;--bslib-color-bg: #698d8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #698d8f;color:#000}.bg-gradient-teal-red{--bslib-color-fg: #000;--bslib-color-bg: #6b8e76;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #6b8e76;color:#000}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #000;--bslib-color-bg: #79c65d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #79c65d;color:#000}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #1daf7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #1daf7c;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #000;--bslib-color-bg: #18c9bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #18c9bb;color:#000}.bg-gradient-cyan-blue{--bslib-color-fg: #000;--bslib-color-bg: #0da5f5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #0da5f5;color:#000}.bg-gradient-cyan-indigo{--bslib-color-fg: #000;--bslib-color-bg: #3180f1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3180f1;color:#000}.bg-gradient-cyan-purple{--bslib-color-fg: #000;--bslib-color-bg: #3494dd;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3494dd;color:#000}.bg-gradient-cyan-pink{--bslib-color-fg: #000;--bslib-color-bg: #5d8ec5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #5d8ec5;color:#000}.bg-gradient-cyan-red{--bslib-color-fg: #000;--bslib-color-bg: #608eac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #608eac;color:#000}.bg-gradient-cyan-orange{--bslib-color-fg: #000;--bslib-color-bg: #6dac98;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #6dac98;color:#000}.bg-gradient-cyan-yellow{--bslib-color-fg: #000;--bslib-color-bg: #6ec693;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #6ec693;color:#000}.bg-gradient-cyan-green{--bslib-color-fg: #000;--bslib-color-bg: #12afb2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #12afb2;color:#000}.bg-gradient-cyan-teal{--bslib-color-fg: #000;--bslib-color-bg: #15cacc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #15cacc;color:#000}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #ffffff);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}:root{--bslib-page-sidebar-title-bg: #517699;--bslib-page-sidebar-title-color: #ffffff}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #fff}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.375rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px #fff;border-radius:.375rem;color:#212529;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#fff;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#fff;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#fff;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#212529}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:rgba(33,37,41,.75)}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}dd code:not(.sourceCode),p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}.callout pre.sourceCode{padding-left:0}div.ansi-escaped-output{font-family:monospace;display:block}/*! +* +* ansi colors from IPython notebook's +* +* we also add `bright-[color]-` synonyms for the `-[color]-intense` classes since +* that seems to be what ansi_up emits +* +*/.ansi-black-fg{color:#3e424d}.ansi-black-bg{background-color:#3e424d}.ansi-black-intense-black,.ansi-bright-black-fg{color:#282c36}.ansi-black-intense-black,.ansi-bright-black-bg{background-color:#282c36}.ansi-red-fg{color:#e75c58}.ansi-red-bg{background-color:#e75c58}.ansi-red-intense-red,.ansi-bright-red-fg{color:#b22b31}.ansi-red-intense-red,.ansi-bright-red-bg{background-color:#b22b31}.ansi-green-fg{color:#00a250}.ansi-green-bg{background-color:#00a250}.ansi-green-intense-green,.ansi-bright-green-fg{color:#007427}.ansi-green-intense-green,.ansi-bright-green-bg{background-color:#007427}.ansi-yellow-fg{color:#ddb62b}.ansi-yellow-bg{background-color:#ddb62b}.ansi-yellow-intense-yellow,.ansi-bright-yellow-fg{color:#b27d12}.ansi-yellow-intense-yellow,.ansi-bright-yellow-bg{background-color:#b27d12}.ansi-blue-fg{color:#208ffb}.ansi-blue-bg{background-color:#208ffb}.ansi-blue-intense-blue,.ansi-bright-blue-fg{color:#0065ca}.ansi-blue-intense-blue,.ansi-bright-blue-bg{background-color:#0065ca}.ansi-magenta-fg{color:#d160c4}.ansi-magenta-bg{background-color:#d160c4}.ansi-magenta-intense-magenta,.ansi-bright-magenta-fg{color:#a03196}.ansi-magenta-intense-magenta,.ansi-bright-magenta-bg{background-color:#a03196}.ansi-cyan-fg{color:#60c6c8}.ansi-cyan-bg{background-color:#60c6c8}.ansi-cyan-intense-cyan,.ansi-bright-cyan-fg{color:#258f8f}.ansi-cyan-intense-cyan,.ansi-bright-cyan-bg{background-color:#258f8f}.ansi-white-fg{color:#c5c1b4}.ansi-white-bg{background-color:#c5c1b4}.ansi-white-intense-white,.ansi-bright-white-fg{color:#a1a6b2}.ansi-white-intense-white,.ansi-bright-white-bg{background-color:#a1a6b2}.ansi-default-inverse-fg{color:#fff}.ansi-default-inverse-bg{background-color:#000}.ansi-bold{font-weight:bold}.ansi-underline{text-decoration:underline}:root{--quarto-body-bg: #ffffff;--quarto-body-color: #212529;--quarto-text-muted: rgba(33, 37, 41, 0.75);--quarto-border-color: white;--quarto-border-width: 1px;--quarto-border-radius: 0.375rem}table.gt_table{color:var(--quarto-body-color);font-size:1em;width:100%;background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_column_spanner_outer{color:var(--quarto-body-color);background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_col_heading{color:var(--quarto-body-color);font-weight:bold;background-color:rgba(0,0,0,0)}table.gt_table thead.gt_col_headings{border-bottom:1px solid currentColor;border-top-width:inherit;border-top-color:var(--quarto-border-color)}table.gt_table thead.gt_col_headings:not(:first-child){border-top-width:1px;border-top-color:var(--quarto-border-color)}table.gt_table td.gt_row{border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-width:0px}table.gt_table tbody.gt_table_body{border-top-width:1px;border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-color:currentColor}div.columns{display:initial;gap:initial}div.column{display:inline-block;overflow-x:initial;vertical-align:top;width:50%}.code-annotation-tip-content{word-wrap:break-word}.code-annotation-container-hidden{display:none !important}dl.code-annotation-container-grid{display:grid;grid-template-columns:min-content auto}dl.code-annotation-container-grid dt{grid-column:1}dl.code-annotation-container-grid dd{grid-column:2}pre.sourceCode.code-annotation-code{padding-right:0}code.sourceCode .code-annotation-anchor{z-index:100;position:relative;float:right;background-color:rgba(0,0,0,0)}input[type=checkbox]{margin-right:.5ch}:root{--mermaid-bg-color: #ffffff;--mermaid-edge-color: #6c757d;--mermaid-node-fg-color: #212529;--mermaid-fg-color: #212529;--mermaid-fg-color--lighter: #383f45;--mermaid-fg-color--lightest: #4e5862;--mermaid-font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, Noto Sans, Liberation Sans, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;--mermaid-label-bg-color: #ffffff;--mermaid-label-fg-color: #0d6efd;--mermaid-node-bg-color: rgba(13, 110, 253, 0.1);--mermaid-node-fg-color: #212529}@media print{:root{font-size:11pt}#quarto-sidebar,#TOC,.nav-page{display:none}.page-columns .content{grid-column-start:page-start}.fixed-top{position:relative}.panel-caption,.figure-caption,figcaption{color:#666}}.code-copy-button{position:absolute;top:0;right:0;border:0;margin-top:5px;margin-right:5px;background-color:rgba(0,0,0,0);z-index:3}.code-copy-button:focus{outline:none}.code-copy-button-tooltip{font-size:.75em}pre.sourceCode:hover>.code-copy-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}pre.sourceCode:hover>.code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button-checked:hover>.bi::before{background-image:url('data:image/svg+xml,')}main ol ol,main ul ul,main ol ul,main ul ol{margin-bottom:1em}ul>li:not(:has(>p))>ul,ol>li:not(:has(>p))>ul,ul>li:not(:has(>p))>ol,ol>li:not(:has(>p))>ol{margin-bottom:0}ul>li:not(:has(>p))>ul>li:has(>p),ol>li:not(:has(>p))>ul>li:has(>p),ul>li:not(:has(>p))>ol>li:has(>p),ol>li:not(:has(>p))>ol>li:has(>p){margin-top:1rem}body{margin:0}main.page-columns>header>h1.title,main.page-columns>header>.title.h1{margin-bottom:0}@media(min-width: 992px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] 35px [page-end-inset page-end] 5fr [screen-end-inset] 1.5em}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 3em [body-end] 50px [body-end-outset] minmax(0px, 250px) [page-end-inset] minmax(50px, 100px) [page-end] 1fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 100px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 150px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 991.98px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(1250px - 3em)) [body-content-end body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 767.98px){body .page-columns,body.fullcontent:not(.floating):not(.docked) .page-columns,body.slimcontent:not(.floating):not(.docked) .page-columns,body.docked .page-columns,body.docked.slimcontent .page-columns,body.docked.fullcontent .page-columns,body.floating .page-columns,body.floating.slimcontent .page-columns,body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}nav[role=doc-toc]{display:none}}body,.page-row-navigation{grid-template-rows:[page-top] max-content [contents-top] max-content [contents-bottom] max-content [page-bottom]}.page-rows-contents{grid-template-rows:[content-top] minmax(max-content, 1fr) [content-bottom] minmax(60px, max-content) [page-bottom]}.page-full{grid-column:screen-start/screen-end !important}.page-columns>*{grid-column:body-content-start/body-content-end}.page-columns.column-page>*{grid-column:page-start/page-end}.page-columns.column-page-left .page-columns.page-full>*,.page-columns.column-page-left>*{grid-column:page-start/body-content-end}.page-columns.column-page-right .page-columns.page-full>*,.page-columns.column-page-right>*{grid-column:body-content-start/page-end}.page-rows{grid-auto-rows:auto}.header{grid-column:screen-start/screen-end;grid-row:page-top/contents-top}#quarto-content{padding:0;grid-column:screen-start/screen-end;grid-row:contents-top/contents-bottom}body.floating .sidebar.sidebar-navigation{grid-column:page-start/body-start;grid-row:content-top/page-bottom}body.docked .sidebar.sidebar-navigation{grid-column:screen-start/body-start;grid-row:content-top/page-bottom}.sidebar.toc-left{grid-column:page-start/body-start;grid-row:content-top/page-bottom}.sidebar.margin-sidebar{grid-column:body-end/page-end;grid-row:content-top/page-bottom}.page-columns .content{grid-column:body-content-start/body-content-end;grid-row:content-top/content-bottom;align-content:flex-start}.page-columns .page-navigation{grid-column:body-content-start/body-content-end;grid-row:content-bottom/page-bottom}.page-columns .footer{grid-column:screen-start/screen-end;grid-row:contents-bottom/page-bottom}.page-columns .column-body{grid-column:body-content-start/body-content-end}.page-columns .column-body-fullbleed{grid-column:body-start/body-end}.page-columns .column-body-outset{grid-column:body-start-outset/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset table{background:#fff}.page-columns .column-body-outset-left{grid-column:body-start-outset/body-content-end;z-index:998;opacity:.999}.page-columns .column-body-outset-left table{background:#fff}.page-columns .column-body-outset-right{grid-column:body-content-start/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset-right table{background:#fff}.page-columns .column-page{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-page table{background:#fff}.page-columns .column-page-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset table{background:#fff}.page-columns .column-page-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-inset-left table{background:#fff}.page-columns .column-page-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset-right figcaption table{background:#fff}.page-columns .column-page-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-left table{background:#fff}.page-columns .column-page-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-page-right figcaption table{background:#fff}#quarto-content.page-columns #quarto-margin-sidebar,#quarto-content.page-columns #quarto-sidebar{z-index:1}@media(max-width: 991.98px){#quarto-content.page-columns #quarto-margin-sidebar.collapse,#quarto-content.page-columns #quarto-sidebar.collapse,#quarto-content.page-columns #quarto-margin-sidebar.collapsing,#quarto-content.page-columns #quarto-sidebar.collapsing{z-index:1055}}#quarto-content.page-columns main.column-page,#quarto-content.page-columns main.column-page-right,#quarto-content.page-columns main.column-page-left{z-index:0}.page-columns .column-screen-inset{grid-column:screen-start-inset/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:screen-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:screen-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:screen-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:screen-start/screen-end;padding:1em;background:#f8f9fa;z-index:998;opacity:.999;margin-bottom:1em}.zindex-content{z-index:998;opacity:.999}.zindex-modal{z-index:1055;opacity:.999}.zindex-over-content{z-index:999;opacity:.999}img.img-fluid.column-screen,img.img-fluid.column-screen-inset-shaded,img.img-fluid.column-screen-inset,img.img-fluid.column-screen-inset-left,img.img-fluid.column-screen-inset-right,img.img-fluid.column-screen-left,img.img-fluid.column-screen-right{width:100%}@media(min-width: 992px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.column-sidebar{grid-column:page-start/body-start !important;z-index:998}.column-leftmargin{grid-column:screen-start-inset/body-start !important;z-index:998}.no-row-height{height:1em;overflow:visible}}@media(max-width: 991.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.no-row-height{height:1em;overflow:visible}.page-columns.page-full{overflow:visible}.page-columns.toc-left .margin-caption,.page-columns.toc-left div.aside,.page-columns.toc-left aside:not(.footnotes):not(.sidebar),.page-columns.toc-left .column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.page-columns.toc-left .no-row-height{height:initial;overflow:initial}}@media(max-width: 767.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.no-row-height{height:initial;overflow:initial}#quarto-margin-sidebar{display:none}#quarto-sidebar-toc-left{display:none}.hidden-sm{display:none}}.panel-grid{display:grid;grid-template-rows:repeat(1, 1fr);grid-template-columns:repeat(24, 1fr);gap:1em}.panel-grid .g-col-1{grid-column:auto/span 1}.panel-grid .g-col-2{grid-column:auto/span 2}.panel-grid .g-col-3{grid-column:auto/span 3}.panel-grid .g-col-4{grid-column:auto/span 4}.panel-grid .g-col-5{grid-column:auto/span 5}.panel-grid .g-col-6{grid-column:auto/span 6}.panel-grid .g-col-7{grid-column:auto/span 7}.panel-grid .g-col-8{grid-column:auto/span 8}.panel-grid .g-col-9{grid-column:auto/span 9}.panel-grid .g-col-10{grid-column:auto/span 10}.panel-grid .g-col-11{grid-column:auto/span 11}.panel-grid .g-col-12{grid-column:auto/span 12}.panel-grid .g-col-13{grid-column:auto/span 13}.panel-grid .g-col-14{grid-column:auto/span 14}.panel-grid .g-col-15{grid-column:auto/span 15}.panel-grid .g-col-16{grid-column:auto/span 16}.panel-grid .g-col-17{grid-column:auto/span 17}.panel-grid .g-col-18{grid-column:auto/span 18}.panel-grid .g-col-19{grid-column:auto/span 19}.panel-grid .g-col-20{grid-column:auto/span 20}.panel-grid .g-col-21{grid-column:auto/span 21}.panel-grid .g-col-22{grid-column:auto/span 22}.panel-grid .g-col-23{grid-column:auto/span 23}.panel-grid .g-col-24{grid-column:auto/span 24}.panel-grid .g-start-1{grid-column-start:1}.panel-grid .g-start-2{grid-column-start:2}.panel-grid .g-start-3{grid-column-start:3}.panel-grid .g-start-4{grid-column-start:4}.panel-grid .g-start-5{grid-column-start:5}.panel-grid .g-start-6{grid-column-start:6}.panel-grid .g-start-7{grid-column-start:7}.panel-grid .g-start-8{grid-column-start:8}.panel-grid .g-start-9{grid-column-start:9}.panel-grid .g-start-10{grid-column-start:10}.panel-grid .g-start-11{grid-column-start:11}.panel-grid .g-start-12{grid-column-start:12}.panel-grid .g-start-13{grid-column-start:13}.panel-grid .g-start-14{grid-column-start:14}.panel-grid .g-start-15{grid-column-start:15}.panel-grid .g-start-16{grid-column-start:16}.panel-grid .g-start-17{grid-column-start:17}.panel-grid .g-start-18{grid-column-start:18}.panel-grid .g-start-19{grid-column-start:19}.panel-grid .g-start-20{grid-column-start:20}.panel-grid .g-start-21{grid-column-start:21}.panel-grid .g-start-22{grid-column-start:22}.panel-grid .g-start-23{grid-column-start:23}@media(min-width: 576px){.panel-grid .g-col-sm-1{grid-column:auto/span 1}.panel-grid .g-col-sm-2{grid-column:auto/span 2}.panel-grid .g-col-sm-3{grid-column:auto/span 3}.panel-grid .g-col-sm-4{grid-column:auto/span 4}.panel-grid .g-col-sm-5{grid-column:auto/span 5}.panel-grid .g-col-sm-6{grid-column:auto/span 6}.panel-grid .g-col-sm-7{grid-column:auto/span 7}.panel-grid .g-col-sm-8{grid-column:auto/span 8}.panel-grid .g-col-sm-9{grid-column:auto/span 9}.panel-grid .g-col-sm-10{grid-column:auto/span 10}.panel-grid .g-col-sm-11{grid-column:auto/span 11}.panel-grid .g-col-sm-12{grid-column:auto/span 12}.panel-grid .g-col-sm-13{grid-column:auto/span 13}.panel-grid .g-col-sm-14{grid-column:auto/span 14}.panel-grid .g-col-sm-15{grid-column:auto/span 15}.panel-grid .g-col-sm-16{grid-column:auto/span 16}.panel-grid .g-col-sm-17{grid-column:auto/span 17}.panel-grid .g-col-sm-18{grid-column:auto/span 18}.panel-grid .g-col-sm-19{grid-column:auto/span 19}.panel-grid .g-col-sm-20{grid-column:auto/span 20}.panel-grid .g-col-sm-21{grid-column:auto/span 21}.panel-grid .g-col-sm-22{grid-column:auto/span 22}.panel-grid .g-col-sm-23{grid-column:auto/span 23}.panel-grid .g-col-sm-24{grid-column:auto/span 24}.panel-grid .g-start-sm-1{grid-column-start:1}.panel-grid .g-start-sm-2{grid-column-start:2}.panel-grid .g-start-sm-3{grid-column-start:3}.panel-grid .g-start-sm-4{grid-column-start:4}.panel-grid .g-start-sm-5{grid-column-start:5}.panel-grid .g-start-sm-6{grid-column-start:6}.panel-grid .g-start-sm-7{grid-column-start:7}.panel-grid .g-start-sm-8{grid-column-start:8}.panel-grid .g-start-sm-9{grid-column-start:9}.panel-grid .g-start-sm-10{grid-column-start:10}.panel-grid .g-start-sm-11{grid-column-start:11}.panel-grid .g-start-sm-12{grid-column-start:12}.panel-grid .g-start-sm-13{grid-column-start:13}.panel-grid .g-start-sm-14{grid-column-start:14}.panel-grid .g-start-sm-15{grid-column-start:15}.panel-grid .g-start-sm-16{grid-column-start:16}.panel-grid .g-start-sm-17{grid-column-start:17}.panel-grid .g-start-sm-18{grid-column-start:18}.panel-grid .g-start-sm-19{grid-column-start:19}.panel-grid .g-start-sm-20{grid-column-start:20}.panel-grid .g-start-sm-21{grid-column-start:21}.panel-grid .g-start-sm-22{grid-column-start:22}.panel-grid .g-start-sm-23{grid-column-start:23}}@media(min-width: 768px){.panel-grid .g-col-md-1{grid-column:auto/span 1}.panel-grid .g-col-md-2{grid-column:auto/span 2}.panel-grid .g-col-md-3{grid-column:auto/span 3}.panel-grid .g-col-md-4{grid-column:auto/span 4}.panel-grid .g-col-md-5{grid-column:auto/span 5}.panel-grid .g-col-md-6{grid-column:auto/span 6}.panel-grid .g-col-md-7{grid-column:auto/span 7}.panel-grid .g-col-md-8{grid-column:auto/span 8}.panel-grid .g-col-md-9{grid-column:auto/span 9}.panel-grid .g-col-md-10{grid-column:auto/span 10}.panel-grid .g-col-md-11{grid-column:auto/span 11}.panel-grid .g-col-md-12{grid-column:auto/span 12}.panel-grid .g-col-md-13{grid-column:auto/span 13}.panel-grid .g-col-md-14{grid-column:auto/span 14}.panel-grid .g-col-md-15{grid-column:auto/span 15}.panel-grid .g-col-md-16{grid-column:auto/span 16}.panel-grid .g-col-md-17{grid-column:auto/span 17}.panel-grid .g-col-md-18{grid-column:auto/span 18}.panel-grid .g-col-md-19{grid-column:auto/span 19}.panel-grid .g-col-md-20{grid-column:auto/span 20}.panel-grid .g-col-md-21{grid-column:auto/span 21}.panel-grid .g-col-md-22{grid-column:auto/span 22}.panel-grid .g-col-md-23{grid-column:auto/span 23}.panel-grid .g-col-md-24{grid-column:auto/span 24}.panel-grid .g-start-md-1{grid-column-start:1}.panel-grid .g-start-md-2{grid-column-start:2}.panel-grid .g-start-md-3{grid-column-start:3}.panel-grid .g-start-md-4{grid-column-start:4}.panel-grid .g-start-md-5{grid-column-start:5}.panel-grid .g-start-md-6{grid-column-start:6}.panel-grid .g-start-md-7{grid-column-start:7}.panel-grid .g-start-md-8{grid-column-start:8}.panel-grid .g-start-md-9{grid-column-start:9}.panel-grid .g-start-md-10{grid-column-start:10}.panel-grid .g-start-md-11{grid-column-start:11}.panel-grid .g-start-md-12{grid-column-start:12}.panel-grid .g-start-md-13{grid-column-start:13}.panel-grid .g-start-md-14{grid-column-start:14}.panel-grid .g-start-md-15{grid-column-start:15}.panel-grid .g-start-md-16{grid-column-start:16}.panel-grid .g-start-md-17{grid-column-start:17}.panel-grid .g-start-md-18{grid-column-start:18}.panel-grid .g-start-md-19{grid-column-start:19}.panel-grid .g-start-md-20{grid-column-start:20}.panel-grid .g-start-md-21{grid-column-start:21}.panel-grid .g-start-md-22{grid-column-start:22}.panel-grid .g-start-md-23{grid-column-start:23}}@media(min-width: 992px){.panel-grid .g-col-lg-1{grid-column:auto/span 1}.panel-grid .g-col-lg-2{grid-column:auto/span 2}.panel-grid .g-col-lg-3{grid-column:auto/span 3}.panel-grid .g-col-lg-4{grid-column:auto/span 4}.panel-grid .g-col-lg-5{grid-column:auto/span 5}.panel-grid .g-col-lg-6{grid-column:auto/span 6}.panel-grid .g-col-lg-7{grid-column:auto/span 7}.panel-grid .g-col-lg-8{grid-column:auto/span 8}.panel-grid .g-col-lg-9{grid-column:auto/span 9}.panel-grid .g-col-lg-10{grid-column:auto/span 10}.panel-grid .g-col-lg-11{grid-column:auto/span 11}.panel-grid .g-col-lg-12{grid-column:auto/span 12}.panel-grid .g-col-lg-13{grid-column:auto/span 13}.panel-grid .g-col-lg-14{grid-column:auto/span 14}.panel-grid .g-col-lg-15{grid-column:auto/span 15}.panel-grid .g-col-lg-16{grid-column:auto/span 16}.panel-grid .g-col-lg-17{grid-column:auto/span 17}.panel-grid .g-col-lg-18{grid-column:auto/span 18}.panel-grid .g-col-lg-19{grid-column:auto/span 19}.panel-grid .g-col-lg-20{grid-column:auto/span 20}.panel-grid .g-col-lg-21{grid-column:auto/span 21}.panel-grid .g-col-lg-22{grid-column:auto/span 22}.panel-grid .g-col-lg-23{grid-column:auto/span 23}.panel-grid .g-col-lg-24{grid-column:auto/span 24}.panel-grid .g-start-lg-1{grid-column-start:1}.panel-grid .g-start-lg-2{grid-column-start:2}.panel-grid .g-start-lg-3{grid-column-start:3}.panel-grid .g-start-lg-4{grid-column-start:4}.panel-grid .g-start-lg-5{grid-column-start:5}.panel-grid .g-start-lg-6{grid-column-start:6}.panel-grid .g-start-lg-7{grid-column-start:7}.panel-grid .g-start-lg-8{grid-column-start:8}.panel-grid .g-start-lg-9{grid-column-start:9}.panel-grid .g-start-lg-10{grid-column-start:10}.panel-grid .g-start-lg-11{grid-column-start:11}.panel-grid .g-start-lg-12{grid-column-start:12}.panel-grid .g-start-lg-13{grid-column-start:13}.panel-grid .g-start-lg-14{grid-column-start:14}.panel-grid .g-start-lg-15{grid-column-start:15}.panel-grid .g-start-lg-16{grid-column-start:16}.panel-grid .g-start-lg-17{grid-column-start:17}.panel-grid .g-start-lg-18{grid-column-start:18}.panel-grid .g-start-lg-19{grid-column-start:19}.panel-grid .g-start-lg-20{grid-column-start:20}.panel-grid .g-start-lg-21{grid-column-start:21}.panel-grid .g-start-lg-22{grid-column-start:22}.panel-grid .g-start-lg-23{grid-column-start:23}}@media(min-width: 1200px){.panel-grid .g-col-xl-1{grid-column:auto/span 1}.panel-grid .g-col-xl-2{grid-column:auto/span 2}.panel-grid .g-col-xl-3{grid-column:auto/span 3}.panel-grid .g-col-xl-4{grid-column:auto/span 4}.panel-grid .g-col-xl-5{grid-column:auto/span 5}.panel-grid .g-col-xl-6{grid-column:auto/span 6}.panel-grid .g-col-xl-7{grid-column:auto/span 7}.panel-grid .g-col-xl-8{grid-column:auto/span 8}.panel-grid .g-col-xl-9{grid-column:auto/span 9}.panel-grid .g-col-xl-10{grid-column:auto/span 10}.panel-grid .g-col-xl-11{grid-column:auto/span 11}.panel-grid .g-col-xl-12{grid-column:auto/span 12}.panel-grid .g-col-xl-13{grid-column:auto/span 13}.panel-grid .g-col-xl-14{grid-column:auto/span 14}.panel-grid .g-col-xl-15{grid-column:auto/span 15}.panel-grid .g-col-xl-16{grid-column:auto/span 16}.panel-grid .g-col-xl-17{grid-column:auto/span 17}.panel-grid .g-col-xl-18{grid-column:auto/span 18}.panel-grid .g-col-xl-19{grid-column:auto/span 19}.panel-grid .g-col-xl-20{grid-column:auto/span 20}.panel-grid .g-col-xl-21{grid-column:auto/span 21}.panel-grid .g-col-xl-22{grid-column:auto/span 22}.panel-grid .g-col-xl-23{grid-column:auto/span 23}.panel-grid .g-col-xl-24{grid-column:auto/span 24}.panel-grid .g-start-xl-1{grid-column-start:1}.panel-grid .g-start-xl-2{grid-column-start:2}.panel-grid .g-start-xl-3{grid-column-start:3}.panel-grid .g-start-xl-4{grid-column-start:4}.panel-grid .g-start-xl-5{grid-column-start:5}.panel-grid .g-start-xl-6{grid-column-start:6}.panel-grid .g-start-xl-7{grid-column-start:7}.panel-grid .g-start-xl-8{grid-column-start:8}.panel-grid .g-start-xl-9{grid-column-start:9}.panel-grid .g-start-xl-10{grid-column-start:10}.panel-grid .g-start-xl-11{grid-column-start:11}.panel-grid .g-start-xl-12{grid-column-start:12}.panel-grid .g-start-xl-13{grid-column-start:13}.panel-grid .g-start-xl-14{grid-column-start:14}.panel-grid .g-start-xl-15{grid-column-start:15}.panel-grid .g-start-xl-16{grid-column-start:16}.panel-grid .g-start-xl-17{grid-column-start:17}.panel-grid .g-start-xl-18{grid-column-start:18}.panel-grid .g-start-xl-19{grid-column-start:19}.panel-grid .g-start-xl-20{grid-column-start:20}.panel-grid .g-start-xl-21{grid-column-start:21}.panel-grid .g-start-xl-22{grid-column-start:22}.panel-grid .g-start-xl-23{grid-column-start:23}}@media(min-width: 1400px){.panel-grid .g-col-xxl-1{grid-column:auto/span 1}.panel-grid .g-col-xxl-2{grid-column:auto/span 2}.panel-grid .g-col-xxl-3{grid-column:auto/span 3}.panel-grid .g-col-xxl-4{grid-column:auto/span 4}.panel-grid .g-col-xxl-5{grid-column:auto/span 5}.panel-grid .g-col-xxl-6{grid-column:auto/span 6}.panel-grid .g-col-xxl-7{grid-column:auto/span 7}.panel-grid .g-col-xxl-8{grid-column:auto/span 8}.panel-grid .g-col-xxl-9{grid-column:auto/span 9}.panel-grid .g-col-xxl-10{grid-column:auto/span 10}.panel-grid .g-col-xxl-11{grid-column:auto/span 11}.panel-grid .g-col-xxl-12{grid-column:auto/span 12}.panel-grid .g-col-xxl-13{grid-column:auto/span 13}.panel-grid .g-col-xxl-14{grid-column:auto/span 14}.panel-grid .g-col-xxl-15{grid-column:auto/span 15}.panel-grid .g-col-xxl-16{grid-column:auto/span 16}.panel-grid .g-col-xxl-17{grid-column:auto/span 17}.panel-grid .g-col-xxl-18{grid-column:auto/span 18}.panel-grid .g-col-xxl-19{grid-column:auto/span 19}.panel-grid .g-col-xxl-20{grid-column:auto/span 20}.panel-grid .g-col-xxl-21{grid-column:auto/span 21}.panel-grid .g-col-xxl-22{grid-column:auto/span 22}.panel-grid .g-col-xxl-23{grid-column:auto/span 23}.panel-grid .g-col-xxl-24{grid-column:auto/span 24}.panel-grid .g-start-xxl-1{grid-column-start:1}.panel-grid .g-start-xxl-2{grid-column-start:2}.panel-grid .g-start-xxl-3{grid-column-start:3}.panel-grid .g-start-xxl-4{grid-column-start:4}.panel-grid .g-start-xxl-5{grid-column-start:5}.panel-grid .g-start-xxl-6{grid-column-start:6}.panel-grid .g-start-xxl-7{grid-column-start:7}.panel-grid .g-start-xxl-8{grid-column-start:8}.panel-grid .g-start-xxl-9{grid-column-start:9}.panel-grid .g-start-xxl-10{grid-column-start:10}.panel-grid .g-start-xxl-11{grid-column-start:11}.panel-grid .g-start-xxl-12{grid-column-start:12}.panel-grid .g-start-xxl-13{grid-column-start:13}.panel-grid .g-start-xxl-14{grid-column-start:14}.panel-grid .g-start-xxl-15{grid-column-start:15}.panel-grid .g-start-xxl-16{grid-column-start:16}.panel-grid .g-start-xxl-17{grid-column-start:17}.panel-grid .g-start-xxl-18{grid-column-start:18}.panel-grid .g-start-xxl-19{grid-column-start:19}.panel-grid .g-start-xxl-20{grid-column-start:20}.panel-grid .g-start-xxl-21{grid-column-start:21}.panel-grid .g-start-xxl-22{grid-column-start:22}.panel-grid .g-start-xxl-23{grid-column-start:23}}main{margin-top:1em;margin-bottom:1em}h1,.h1,h2,.h2{color:inherit;margin-top:2rem;margin-bottom:1rem;font-weight:600}h1.title,.title.h1{margin-top:0}main.content>section:first-of-type>h2:first-child,main.content>section:first-of-type>.h2:first-child{margin-top:0}h2,.h2{border-bottom:1px solid #fff;padding-bottom:.5rem}h3,.h3{font-weight:600}h3,.h3,h4,.h4{opacity:.9;margin-top:1.5rem}h5,.h5,h6,.h6{opacity:.9}.header-section-number{color:#5a6570}.nav-link.active .header-section-number{color:inherit}mark,.mark{padding:0em}.panel-caption,.figure-caption,.subfigure-caption,.table-caption,figcaption,caption{font-size:.9rem;color:#5a6570}.quarto-layout-cell[data-ref-parent] caption{color:#5a6570}.column-margin figcaption,.margin-caption,div.aside,aside,.column-margin{color:#5a6570;font-size:.825rem}.panel-caption.margin-caption{text-align:inherit}.column-margin.column-container p{margin-bottom:0}.column-margin.column-container>*:not(.collapse):first-child{padding-bottom:.5em;display:block}.column-margin.column-container>*:not(.collapse):not(:first-child){padding-top:.5em;padding-bottom:.5em;display:block}.column-margin.column-container>*.collapse:not(.show){display:none}@media(min-width: 768px){.column-margin.column-container .callout-margin-content:first-child{margin-top:4.5em}.column-margin.column-container .callout-margin-content-simple:first-child{margin-top:3.5em}}.margin-caption>*{padding-top:.5em;padding-bottom:.5em}@media(max-width: 767.98px){.quarto-layout-row{flex-direction:column}}.nav-tabs .nav-item{margin-top:1px;cursor:pointer}.tab-content{margin-top:0px;border-left:#fff 1px solid;border-right:#fff 1px solid;border-bottom:#fff 1px solid;margin-left:0;padding:1em;margin-bottom:1em}@media(max-width: 767.98px){.layout-sidebar{margin-left:0;margin-right:0}}.panel-sidebar,.panel-sidebar .form-control,.panel-input,.panel-input .form-control,.selectize-dropdown{font-size:.9rem}.panel-sidebar .form-control,.panel-input .form-control{padding-top:.1rem}.tab-pane div.sourceCode{margin-top:0px}.tab-pane>p{padding-top:0}.tab-pane>p:nth-child(1){padding-top:0}.tab-pane>p:last-child{margin-bottom:0}.tab-pane>pre:last-child{margin-bottom:0}.tab-content>.tab-pane:not(.active){display:none !important}div.sourceCode{background-color:rgba(233,236,239,.65);border:1px solid rgba(233,236,239,.65);border-radius:.375rem}pre.sourceCode{background-color:rgba(0,0,0,0)}pre.sourceCode{border:none;font-size:.875em;overflow:visible !important;padding:.4em}div.sourceCode{overflow-y:hidden}.callout div.sourceCode{margin-left:initial}.blockquote{font-size:inherit;padding-left:1rem;padding-right:1.5rem;color:#5a6570}.blockquote h1:first-child,.blockquote .h1:first-child,.blockquote h2:first-child,.blockquote .h2:first-child,.blockquote h3:first-child,.blockquote .h3:first-child,.blockquote h4:first-child,.blockquote .h4:first-child,.blockquote h5:first-child,.blockquote .h5:first-child{margin-top:0}pre{background-color:initial;padding:initial;border:initial}p pre code:not(.sourceCode),li pre code:not(.sourceCode),pre code:not(.sourceCode){background-color:initial}p code:not(.sourceCode),li code:not(.sourceCode),td code:not(.sourceCode){background-color:#f8f9fa;padding:.2em}nav p code:not(.sourceCode),nav li code:not(.sourceCode),nav td code:not(.sourceCode){background-color:rgba(0,0,0,0);padding:0}td code:not(.sourceCode){white-space:pre-wrap}#quarto-embedded-source-code-modal>.modal-dialog{max-width:1000px;padding-left:1.75rem;padding-right:1.75rem}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body{padding:0}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body div.sourceCode{margin:0;padding:.2rem .2rem;border-radius:0px;border:none}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-header{padding:.7rem}.code-tools-button{font-size:1rem;padding:.15rem .15rem;margin-left:5px;color:rgba(33,37,41,.75);background-color:rgba(0,0,0,0);transition:initial;cursor:pointer}.code-tools-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}.code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}.sidebar{will-change:top;transition:top 200ms linear;position:sticky;overflow-y:auto;padding-top:1.2em;max-height:100vh}.sidebar.toc-left,.sidebar.margin-sidebar{top:0px;padding-top:1em}.sidebar.quarto-banner-title-block-sidebar>*{padding-top:1.65em}figure .quarto-notebook-link{margin-top:.5em}.quarto-notebook-link{font-size:.75em;color:rgba(33,37,41,.75);margin-bottom:1em;text-decoration:none;display:block}.quarto-notebook-link:hover{text-decoration:underline;color:#0d6efd}.quarto-notebook-link::before{display:inline-block;height:.75rem;width:.75rem;margin-bottom:0em;margin-right:.25em;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:.75rem .75rem}.toc-actions i.bi,.quarto-code-links i.bi,.quarto-other-links i.bi,.quarto-alternate-notebooks i.bi,.quarto-alternate-formats i.bi{margin-right:.4em;font-size:.8rem}.quarto-other-links-text-target .quarto-code-links i.bi,.quarto-other-links-text-target .quarto-other-links i.bi{margin-right:.2em}.quarto-other-formats-text-target .quarto-alternate-formats i.bi{margin-right:.1em}.toc-actions i.bi.empty,.quarto-code-links i.bi.empty,.quarto-other-links i.bi.empty,.quarto-alternate-notebooks i.bi.empty,.quarto-alternate-formats i.bi.empty{padding-left:1em}.quarto-notebook h2,.quarto-notebook .h2{border-bottom:none}.quarto-notebook .cell-container{display:flex}.quarto-notebook .cell-container .cell{flex-grow:4}.quarto-notebook .cell-container .cell-decorator{padding-top:1.5em;padding-right:1em;text-align:right}.quarto-notebook .cell-container.code-fold .cell-decorator{padding-top:3em}.quarto-notebook .cell-code code{white-space:pre-wrap}.quarto-notebook .cell .cell-output-stderr pre code,.quarto-notebook .cell .cell-output-stdout pre code{white-space:pre-wrap;overflow-wrap:anywhere}.toc-actions,.quarto-alternate-formats,.quarto-other-links,.quarto-code-links,.quarto-alternate-notebooks{padding-left:0em}.sidebar .toc-actions a,.sidebar .quarto-alternate-formats a,.sidebar .quarto-other-links a,.sidebar .quarto-code-links a,.sidebar .quarto-alternate-notebooks a,.sidebar nav[role=doc-toc] a{text-decoration:none}.sidebar .toc-actions a:hover,.sidebar .quarto-other-links a:hover,.sidebar .quarto-code-links a:hover,.sidebar .quarto-alternate-formats a:hover,.sidebar .quarto-alternate-notebooks a:hover{color:#0d6efd}.sidebar .toc-actions h2,.sidebar .toc-actions .h2,.sidebar .quarto-code-links h2,.sidebar .quarto-code-links .h2,.sidebar .quarto-other-links h2,.sidebar .quarto-other-links .h2,.sidebar .quarto-alternate-notebooks h2,.sidebar .quarto-alternate-notebooks .h2,.sidebar .quarto-alternate-formats h2,.sidebar .quarto-alternate-formats .h2,.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-weight:500;margin-bottom:.2rem;margin-top:.3rem;font-family:inherit;border-bottom:0;padding-bottom:0;padding-top:0px}.sidebar .toc-actions>h2,.sidebar .toc-actions>.h2,.sidebar .quarto-code-links>h2,.sidebar .quarto-code-links>.h2,.sidebar .quarto-other-links>h2,.sidebar .quarto-other-links>.h2,.sidebar .quarto-alternate-notebooks>h2,.sidebar .quarto-alternate-notebooks>.h2,.sidebar .quarto-alternate-formats>h2,.sidebar .quarto-alternate-formats>.h2{font-size:.8rem}.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-size:.875rem}.sidebar nav[role=doc-toc]>ul a{border-left:1px solid #e9ecef;padding-left:.6rem}.sidebar .toc-actions h2>ul a,.sidebar .toc-actions .h2>ul a,.sidebar .quarto-code-links h2>ul a,.sidebar .quarto-code-links .h2>ul a,.sidebar .quarto-other-links h2>ul a,.sidebar .quarto-other-links .h2>ul a,.sidebar .quarto-alternate-notebooks h2>ul a,.sidebar .quarto-alternate-notebooks .h2>ul a,.sidebar .quarto-alternate-formats h2>ul a,.sidebar .quarto-alternate-formats .h2>ul a{border-left:none;padding-left:.6rem}.sidebar .toc-actions ul a:empty,.sidebar .quarto-code-links ul a:empty,.sidebar .quarto-other-links ul a:empty,.sidebar .quarto-alternate-notebooks ul a:empty,.sidebar .quarto-alternate-formats ul a:empty,.sidebar nav[role=doc-toc]>ul a:empty{display:none}.sidebar .toc-actions ul,.sidebar .quarto-code-links ul,.sidebar .quarto-other-links ul,.sidebar .quarto-alternate-notebooks ul,.sidebar .quarto-alternate-formats ul{padding-left:0;list-style:none}.sidebar nav[role=doc-toc] ul{list-style:none;padding-left:0;list-style:none}.sidebar nav[role=doc-toc]>ul{margin-left:.45em}.quarto-margin-sidebar nav[role=doc-toc]{padding-left:.5em}.sidebar .toc-actions>ul,.sidebar .quarto-code-links>ul,.sidebar .quarto-other-links>ul,.sidebar .quarto-alternate-notebooks>ul,.sidebar .quarto-alternate-formats>ul{font-size:.8rem}.sidebar nav[role=doc-toc]>ul{font-size:.875rem}.sidebar .toc-actions ul li a,.sidebar .quarto-code-links ul li a,.sidebar .quarto-other-links ul li a,.sidebar .quarto-alternate-notebooks ul li a,.sidebar .quarto-alternate-formats ul li a,.sidebar nav[role=doc-toc]>ul li a{line-height:1.1rem;padding-bottom:.2rem;padding-top:.2rem;color:inherit}.sidebar nav[role=doc-toc] ul>li>ul>li>a{padding-left:1.2em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>a{padding-left:2.4em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>a{padding-left:3.6em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:4.8em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:6em}.sidebar nav[role=doc-toc] ul>li>a.active,.sidebar nav[role=doc-toc] ul>li>ul>li>a.active{border-left:1px solid #0d6efd;color:#0d6efd !important}.sidebar nav[role=doc-toc] ul>li>a:hover,.sidebar nav[role=doc-toc] ul>li>ul>li>a:hover{color:#0d6efd !important}kbd,.kbd{color:#212529;background-color:#f8f9fa;border:1px solid;border-radius:5px;border-color:#fff}.quarto-appendix-contents div.hanging-indent{margin-left:0em}.quarto-appendix-contents div.hanging-indent div.csl-entry{margin-left:1em;text-indent:-1em}.citation a,.footnote-ref{text-decoration:none}.footnotes ol{padding-left:1em}.tippy-content>*{margin-bottom:.7em}.tippy-content>*:last-child{margin-bottom:0}.callout{margin-top:1.25rem;margin-bottom:1.25rem;border-radius:.375rem;overflow-wrap:break-word}.callout .callout-title-container{overflow-wrap:anywhere}.callout.callout-style-simple{padding:.4em .7em;border-left:5px solid;border-right:1px solid #fff;border-top:1px solid #fff;border-bottom:1px solid #fff}.callout.callout-style-default{border-left:5px solid;border-right:1px solid #fff;border-top:1px solid #fff;border-bottom:1px solid #fff}.callout .callout-body-container{flex-grow:1}.callout.callout-style-simple .callout-body{font-size:.9rem;font-weight:400}.callout.callout-style-default .callout-body{font-size:.9rem;font-weight:400}.callout:not(.no-icon).callout-titled.callout-style-simple .callout-body{padding-left:1.6em}.callout.callout-titled>.callout-header{padding-top:.2em;margin-bottom:-0.2em}.callout.callout-style-simple>div.callout-header{border-bottom:none;font-size:.9rem;font-weight:600;opacity:75%}.callout.callout-style-default>div.callout-header{border-bottom:none;font-weight:600;opacity:85%;font-size:.9rem;padding-left:.5em;padding-right:.5em}.callout.callout-style-default .callout-body{padding-left:.5em;padding-right:.5em}.callout.callout-style-default .callout-body>:first-child{padding-top:.5rem;margin-top:0}.callout>div.callout-header[data-bs-toggle=collapse]{cursor:pointer}.callout.callout-style-default .callout-header[aria-expanded=false],.callout.callout-style-default .callout-header[aria-expanded=true]{padding-top:0px;margin-bottom:0px;align-items:center}.callout.callout-titled .callout-body>:last-child:not(.sourceCode),.callout.callout-titled .callout-body>div>:last-child:not(.sourceCode){padding-bottom:.5rem;margin-bottom:0}.callout:not(.callout-titled) .callout-body>:first-child,.callout:not(.callout-titled) .callout-body>div>:first-child{margin-top:.25rem}.callout:not(.callout-titled) .callout-body>:last-child,.callout:not(.callout-titled) .callout-body>div>:last-child{margin-bottom:.2rem}.callout.callout-style-simple .callout-icon::before,.callout.callout-style-simple .callout-toggle::before{height:1rem;width:1rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.callout.callout-style-default .callout-icon::before,.callout.callout-style-default .callout-toggle::before{height:.9rem;width:.9rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:.9rem .9rem}.callout.callout-style-default .callout-toggle::before{margin-top:5px}.callout .callout-btn-toggle .callout-toggle::before{transition:transform .2s linear}.callout .callout-header[aria-expanded=false] .callout-toggle::before{transform:rotate(-90deg)}.callout .callout-header[aria-expanded=true] .callout-toggle::before{transform:none}.callout.callout-style-simple:not(.no-icon) div.callout-icon-container{padding-top:.2em;padding-right:.55em}.callout.callout-style-default:not(.no-icon) div.callout-icon-container{padding-top:.1em;padding-right:.35em}.callout.callout-style-default:not(.no-icon) div.callout-title-container{margin-top:-1px}.callout.callout-style-default.callout-caution:not(.no-icon) div.callout-icon-container{padding-top:.3em;padding-right:.35em}.callout>.callout-body>.callout-icon-container>.no-icon,.callout>.callout-header>.callout-icon-container>.no-icon{display:none}div.callout.callout{border-left-color:rgba(33,37,41,.75)}div.callout.callout-style-default>.callout-header{background-color:rgba(33,37,41,.75)}div.callout-note.callout{border-left-color:#0d6efd}div.callout-note.callout-style-default>.callout-header{background-color:#e7f1ff}div.callout-note:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-tip.callout{border-left-color:#198754}div.callout-tip.callout-style-default>.callout-header{background-color:#e8f3ee}div.callout-tip:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-warning.callout{border-left-color:#ffc107}div.callout-warning.callout-style-default>.callout-header{background-color:#fff9e6}div.callout-warning:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-caution.callout{border-left-color:#fd7e14}div.callout-caution.callout-style-default>.callout-header{background-color:#fff2e8}div.callout-caution:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-important.callout{border-left-color:#dc3545}div.callout-important.callout-style-default>.callout-header{background-color:#fcebec}div.callout-important:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important .callout-toggle::before{background-image:url('data:image/svg+xml,')}.quarto-toggle-container{display:flex;align-items:center}.quarto-reader-toggle .bi::before,.quarto-color-scheme-toggle .bi::before{display:inline-block;height:1rem;width:1rem;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.sidebar-navigation{padding-left:20px}.navbar{background-color:#517699;color:#fdfefe}.navbar .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.quarto-sidebar-toggle{border-color:#fff;border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem;border-style:solid;border-width:1px;overflow:hidden;border-top-width:0px;padding-top:0px !important}.quarto-sidebar-toggle-title{cursor:pointer;padding-bottom:2px;margin-left:.25em;text-align:center;font-weight:400;font-size:.775em}#quarto-content .quarto-sidebar-toggle{background:#fafafa}#quarto-content .quarto-sidebar-toggle-title{color:#212529}.quarto-sidebar-toggle-icon{color:#fff;margin-right:.5em;float:right;transition:transform .2s ease}.quarto-sidebar-toggle-icon::before{padding-top:5px}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-icon{transform:rotate(-180deg)}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-title{border-bottom:solid #fff 1px}.quarto-sidebar-toggle-contents{background-color:#fff;padding-right:10px;padding-left:10px;margin-top:0px !important;transition:max-height .5s ease}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-contents{padding-top:1em;padding-bottom:10px}@media(max-width: 767.98px){.sidebar-menu-container{padding-bottom:5em}}.quarto-sidebar-toggle:not(.expanded) .quarto-sidebar-toggle-contents{padding-top:0px !important;padding-bottom:0px}nav[role=doc-toc]{z-index:1020}#quarto-sidebar>*,nav[role=doc-toc]>*{transition:opacity .1s ease,border .1s ease}#quarto-sidebar.slow>*,nav[role=doc-toc].slow>*{transition:opacity .4s ease,border .4s ease}.quarto-color-scheme-toggle:not(.alternate).top-right .bi::before{background-image:url('data:image/svg+xml,')}.quarto-color-scheme-toggle.alternate.top-right .bi::before{background-image:url('data:image/svg+xml,')}#quarto-appendix.default{border-top:1px solid #fff}#quarto-appendix.default{background-color:#fff;padding-top:1.5em;margin-top:2em;z-index:998}#quarto-appendix.default .quarto-appendix-heading{margin-top:0;line-height:1.4em;font-weight:600;opacity:.9;border-bottom:none;margin-bottom:0}#quarto-appendix.default .footnotes ol,#quarto-appendix.default .footnotes ol li>p:last-of-type,#quarto-appendix.default .quarto-appendix-contents>p:last-of-type{margin-bottom:0}#quarto-appendix.default .footnotes ol{margin-left:.5em}#quarto-appendix.default .quarto-appendix-secondary-label{margin-bottom:.4em}#quarto-appendix.default .quarto-appendix-bibtex{font-size:.7em;padding:1em;border:solid 1px #fff;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-bibtex code.sourceCode{white-space:pre-wrap}#quarto-appendix.default .quarto-appendix-citeas{font-size:.9em;padding:1em;border:solid 1px #fff;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-heading{font-size:1em !important}#quarto-appendix.default *[role=doc-endnotes]>ol,#quarto-appendix.default .quarto-appendix-contents>*:not(h2):not(.h2){font-size:.9em}#quarto-appendix.default section{padding-bottom:1.5em}#quarto-appendix.default section *[role=doc-endnotes],#quarto-appendix.default section>*:not(a){opacity:.9;word-wrap:break-word}.btn.btn-quarto,div.cell-output-display .btn-quarto{--bs-btn-color: #fefefe;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fefefe;--bs-btn-hover-bg: #828a91;--bs-btn-hover-border-color: #7b838a;--bs-btn-focus-shadow-rgb: 130, 138, 144;--bs-btn-active-color: #000;--bs-btn-active-bg: #899197;--bs-btn-active-border-color: #7b838a;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}nav.quarto-secondary-nav.color-navbar{background-color:#517699;color:#fdfefe}nav.quarto-secondary-nav.color-navbar h1,nav.quarto-secondary-nav.color-navbar .h1,nav.quarto-secondary-nav.color-navbar .quarto-btn-toggle{color:#fdfefe}@media(max-width: 991.98px){body.nav-sidebar .quarto-title-banner{margin-bottom:0;padding-bottom:1em}body.nav-sidebar #title-block-header{margin-block-end:0}}p.subtitle{margin-top:.25em;margin-bottom:.5em}code a:any-link{color:inherit;text-decoration-color:#6c757d}/*! light */div.observablehq table thead tr th{background-color:var(--bs-body-bg)}input,button,select,optgroup,textarea{background-color:var(--bs-body-bg)}.code-annotated .code-copy-button{margin-right:1.25em;margin-top:0;padding-bottom:0;padding-top:3px}.code-annotation-gutter-bg{background-color:#fff}.code-annotation-gutter{background-color:rgba(233,236,239,.65)}.code-annotation-gutter,.code-annotation-gutter-bg{height:100%;width:calc(20px + .5em);position:absolute;top:0;right:0}dl.code-annotation-container-grid dt{margin-right:1em;margin-top:.25rem}dl.code-annotation-container-grid dt{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:#383f45;border:solid #383f45 1px;border-radius:50%;height:22px;width:22px;line-height:22px;font-size:11px;text-align:center;vertical-align:middle;text-decoration:none}dl.code-annotation-container-grid dt[data-target-cell]{cursor:pointer}dl.code-annotation-container-grid dt[data-target-cell].code-annotation-active{color:#fff;border:solid #aaa 1px;background-color:#aaa}pre.code-annotation-code{padding-top:0;padding-bottom:0}pre.code-annotation-code code{z-index:3}#code-annotation-line-highlight-gutter{width:100%;border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}#code-annotation-line-highlight{margin-left:-4em;width:calc(100% + 4em);border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}code.sourceCode .code-annotation-anchor.code-annotation-active{background-color:var(--quarto-hl-normal-color, #aaaaaa);border:solid var(--quarto-hl-normal-color, #aaaaaa) 1px;color:#e9ecef;font-weight:bolder}code.sourceCode .code-annotation-anchor{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:var(--quarto-hl-co-color);border:solid var(--quarto-hl-co-color) 1px;border-radius:50%;height:18px;width:18px;font-size:9px;margin-top:2px}code.sourceCode button.code-annotation-anchor{padding:2px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none}code.sourceCode a.code-annotation-anchor{line-height:18px;text-align:center;vertical-align:middle;cursor:default;text-decoration:none}@media print{.page-columns .column-screen-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:page-start-inset/page-end-inset;padding:1em;background:#f8f9fa;z-index:998;opacity:.999;margin-bottom:1em}}.quarto-video{margin-bottom:1em}.table{border-top:1px solid #d3d3d4;border-bottom:1px solid #d3d3d4}.table>thead{border-top-width:0;border-bottom:1px solid #909294}.table a{word-break:break-word}.table>:not(caption)>*>*{background-color:unset;color:unset}#quarto-document-content .crosstalk-input .checkbox input[type=checkbox],#quarto-document-content .crosstalk-input .checkbox-inline input[type=checkbox]{position:unset;margin-top:unset;margin-left:unset}#quarto-document-content .row{margin-left:unset;margin-right:unset}.quarto-xref{white-space:nowrap}#quarto-draft-alert{margin-top:0px;margin-bottom:0px;padding:.3em;text-align:center;font-size:.9em}#quarto-draft-alert i{margin-right:.3em}#quarto-back-to-top{z-index:1000}pre{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:0.875em;font-weight:400}pre code{font-family:inherit;font-size:inherit;font-weight:inherit}code{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:0.875em;font-weight:400}a{background-color:rgba(0,0,0,0);font-weight:400;text-decoration:underline}a.external:after{content:"";background-image:url('data:image/svg+xml,');background-size:contain;background-repeat:no-repeat;background-position:center center;margin-left:.2em;padding-right:.75em}div.sourceCode code a.external:after{content:none}a.external:after:hover{cursor:pointer}.quarto-ext-icon{display:inline-block;font-size:.75em;padding-left:.3em}.code-with-filename .code-with-filename-file{margin-bottom:0;padding-bottom:2px;padding-top:2px;padding-left:.7em;border:var(--quarto-border-width) solid var(--quarto-border-color);border-radius:var(--quarto-border-radius);border-bottom:0;border-bottom-left-radius:0%;border-bottom-right-radius:0%}.code-with-filename div.sourceCode,.reveal .code-with-filename div.sourceCode{margin-top:0;border-top-left-radius:0%;border-top-right-radius:0%}.code-with-filename .code-with-filename-file pre{margin-bottom:0}.code-with-filename .code-with-filename-file{background-color:rgba(219,219,219,.8)}.quarto-dark .code-with-filename .code-with-filename-file{background-color:#555}.code-with-filename .code-with-filename-file strong{font-weight:400}.quarto-title-banner{margin-bottom:1em;color:#fdfefe;background:#517699}.quarto-title-banner a{color:#fdfefe}.quarto-title-banner h1,.quarto-title-banner .h1,.quarto-title-banner h2,.quarto-title-banner .h2{color:#fdfefe}.quarto-title-banner .code-tools-button{color:#b9dcdc}.quarto-title-banner .code-tools-button:hover{color:#fdfefe}.quarto-title-banner .code-tools-button>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .quarto-title .title{font-weight:600}.quarto-title-banner .quarto-categories{margin-top:.75em}@media(min-width: 992px){.quarto-title-banner{padding-top:2.5em;padding-bottom:2.5em}}@media(max-width: 991.98px){.quarto-title-banner{padding-top:1em;padding-bottom:1em}}@media(max-width: 767.98px){body.hypothesis-enabled #title-block-header>*{padding-right:20px}}main.quarto-banner-title-block>section:first-child>h2,main.quarto-banner-title-block>section:first-child>.h2,main.quarto-banner-title-block>section:first-child>h3,main.quarto-banner-title-block>section:first-child>.h3,main.quarto-banner-title-block>section:first-child>h4,main.quarto-banner-title-block>section:first-child>.h4{margin-top:0}.quarto-title .quarto-categories{display:flex;flex-wrap:wrap;row-gap:.5em;column-gap:.4em;padding-bottom:.5em;margin-top:.75em}.quarto-title .quarto-categories .quarto-category{padding:.25em .75em;font-size:.65em;text-transform:uppercase;border:solid 1px;border-radius:.375rem;opacity:.6}.quarto-title .quarto-categories .quarto-category a{color:inherit}.quarto-title-meta-container{display:grid;grid-template-columns:1fr auto}.quarto-title-meta-column-end{display:flex;flex-direction:column;padding-left:1em}.quarto-title-meta-column-end a .bi{margin-right:.3em}#title-block-header.quarto-title-block.default .quarto-title-meta{display:grid;grid-template-columns:repeat(2, 1fr);grid-column-gap:1em}#title-block-header.quarto-title-block.default .quarto-title .title{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-author-orcid img{margin-top:-0.2em;height:.8em;width:.8em}#title-block-header.quarto-title-block.default .quarto-title-author-email{opacity:.7}#title-block-header.quarto-title-block.default .quarto-description p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p,#title-block-header.quarto-title-block.default .quarto-title-authors p,#title-block-header.quarto-title-block.default .quarto-title-affiliations p{margin-bottom:.1em}#title-block-header.quarto-title-block.default .quarto-title-meta-heading{text-transform:uppercase;margin-top:1em;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-contents{font-size:.9em}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p.affiliation:last-of-type{margin-bottom:.1em}#title-block-header.quarto-title-block.default p.affiliation{margin-bottom:.1em}#title-block-header.quarto-title-block.default .keywords,#title-block-header.quarto-title-block.default .description,#title-block-header.quarto-title-block.default .abstract{margin-top:0}#title-block-header.quarto-title-block.default .keywords>p,#title-block-header.quarto-title-block.default .description>p,#title-block-header.quarto-title-block.default .abstract>p{font-size:.9em}#title-block-header.quarto-title-block.default .keywords>p:last-of-type,#title-block-header.quarto-title-block.default .description>p:last-of-type,#title-block-header.quarto-title-block.default .abstract>p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .keywords .block-title,#title-block-header.quarto-title-block.default .description .block-title,#title-block-header.quarto-title-block.default .abstract .block-title{margin-top:1em;text-transform:uppercase;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-author{display:grid;grid-template-columns:minmax(max-content, 1fr) 1fr;grid-column-gap:1em}.quarto-title-tools-only{display:flex;justify-content:right}:root{--quarto-scss-export-title-banner-color: ;--quarto-scss-export-title-banner-bg: ;--quarto-scss-export-btn-code-copy-color: #5E5E5E;--quarto-scss-export-btn-code-copy-color-active: #4758AB;--quarto-scss-export-sidebar-bg: #fff;--quarto-scss-export-blue: #0d6efd;--quarto-scss-export-primary: #0d6efd;--quarto-scss-export-white: #ffffff;--quarto-scss-export-gray-200: #e9ecef;--quarto-scss-export-gray-100: #f8f9fa;--quarto-scss-export-gray-900: #212529;--quarto-scss-export-link-color: #0d6efd;--quarto-scss-export-link-color-bg: transparent;--quarto-scss-export-code-color: #7d12ba;--quarto-scss-export-code-bg: #f8f9fa;--quarto-scss-export-toc-color: #0d6efd;--quarto-scss-export-toc-active-border: #0d6efd;--quarto-scss-export-toc-inactive-border: #e9ecef;--quarto-scss-export-navbar-default: #517699;--quarto-scss-export-navbar-hl-override: false;--quarto-scss-export-navbar-bg: #517699;--quarto-scss-export-btn-bg: #6c757d;--quarto-scss-export-btn-fg: #fefefe;--quarto-scss-export-body-contrast-bg: #ffffff;--quarto-scss-export-body-contrast-color: #212529;--quarto-scss-export-navbar-fg: #fdfefe;--quarto-scss-export-navbar-hl: #fdfeff;--quarto-scss-export-navbar-brand: #fdfefe;--quarto-scss-export-navbar-brand-hl: #fdfeff;--quarto-scss-export-navbar-toggler-border-color: rgba(253, 254, 254, 0);--quarto-scss-export-navbar-hover-color: rgba(253, 254, 255, 0.8);--quarto-scss-export-navbar-disabled-color: rgba(253, 254, 254, 0.75);--quarto-scss-export-sidebar-fg: #595959;--quarto-scss-export-sidebar-hl: ;--quarto-scss-export-title-block-color: #212529;--quarto-scss-export-title-block-contast-color: #ffffff;--quarto-scss-export-footer-bg: #fff;--quarto-scss-export-footer-fg: #757575;--quarto-scss-export-popover-bg: #ffffff;--quarto-scss-export-input-bg: #ffffff;--quarto-scss-export-input-border-color: white;--quarto-scss-export-code-annotation-higlight-color: rgba(170, 170, 170, 0.2666666667);--quarto-scss-export-code-annotation-higlight-bg: rgba(170, 170, 170, 0.1333333333);--quarto-scss-export-table-group-separator-color: #909294;--quarto-scss-export-table-group-separator-color-lighter: #d3d3d4;--quarto-scss-export-link-decoration: underline;--quarto-scss-export-border-color: white;--quarto-scss-export-table-border-color: white;--quarto-scss-export-gray-300: #dee2e6;--quarto-scss-export-gray-400: #ced4da;--quarto-scss-export-gray-500: #adb5bd;--quarto-scss-export-gray-600: #6c757d;--quarto-scss-export-gray-700: #495057;--quarto-scss-export-gray-800: #343a40;--quarto-scss-export-black: #000;--quarto-scss-export-indigo: #6610f2;--quarto-scss-export-purple: #6f42c1;--quarto-scss-export-pink: #d63384;--quarto-scss-export-red: #dc3545;--quarto-scss-export-orange: #fd7e14;--quarto-scss-export-yellow: #ffc107;--quarto-scss-export-green: #198754;--quarto-scss-export-teal: #20c997;--quarto-scss-export-cyan: #0dcaf0;--quarto-scss-export-color-contrast-dark: #000;--quarto-scss-export-color-contrast-light: #ffffff;--quarto-scss-export-blue-100: #cfe2ff;--quarto-scss-export-blue-200: #9ec5fe;--quarto-scss-export-blue-300: #6ea8fe;--quarto-scss-export-blue-400: #3d8bfd;--quarto-scss-export-blue-500: #0d6efd;--quarto-scss-export-blue-600: #0a58ca;--quarto-scss-export-blue-700: #084298;--quarto-scss-export-blue-800: #052c65;--quarto-scss-export-blue-900: #031633;--quarto-scss-export-indigo-100: #e0cffc;--quarto-scss-export-indigo-200: #c29ffa;--quarto-scss-export-indigo-300: #a370f7;--quarto-scss-export-indigo-400: #8540f5;--quarto-scss-export-indigo-500: #6610f2;--quarto-scss-export-indigo-600: #520dc2;--quarto-scss-export-indigo-700: #3d0a91;--quarto-scss-export-indigo-800: #290661;--quarto-scss-export-indigo-900: #140330;--quarto-scss-export-purple-100: #e2d9f3;--quarto-scss-export-purple-200: #c5b3e6;--quarto-scss-export-purple-300: #a98eda;--quarto-scss-export-purple-400: #8c68cd;--quarto-scss-export-purple-500: #6f42c1;--quarto-scss-export-purple-600: #59359a;--quarto-scss-export-purple-700: #432874;--quarto-scss-export-purple-800: #2c1a4d;--quarto-scss-export-purple-900: #160d27;--quarto-scss-export-pink-100: #f7d6e6;--quarto-scss-export-pink-200: #efadce;--quarto-scss-export-pink-300: #e685b5;--quarto-scss-export-pink-400: #de5c9d;--quarto-scss-export-pink-500: #d63384;--quarto-scss-export-pink-600: #ab296a;--quarto-scss-export-pink-700: #801f4f;--quarto-scss-export-pink-800: #561435;--quarto-scss-export-pink-900: #2b0a1a;--quarto-scss-export-red-100: #f8d7da;--quarto-scss-export-red-200: #f1aeb5;--quarto-scss-export-red-300: #ea868f;--quarto-scss-export-red-400: #e35d6a;--quarto-scss-export-red-500: #dc3545;--quarto-scss-export-red-600: #b02a37;--quarto-scss-export-red-700: #842029;--quarto-scss-export-red-800: #58151c;--quarto-scss-export-red-900: #2c0b0e;--quarto-scss-export-orange-100: #ffe5d0;--quarto-scss-export-orange-200: #fecba1;--quarto-scss-export-orange-300: #feb272;--quarto-scss-export-orange-400: #fd9843;--quarto-scss-export-orange-500: #fd7e14;--quarto-scss-export-orange-600: #ca6510;--quarto-scss-export-orange-700: #984c0c;--quarto-scss-export-orange-800: #653208;--quarto-scss-export-orange-900: #331904;--quarto-scss-export-yellow-100: #fff3cd;--quarto-scss-export-yellow-200: #ffe69c;--quarto-scss-export-yellow-300: #ffda6a;--quarto-scss-export-yellow-400: #ffcd39;--quarto-scss-export-yellow-500: #ffc107;--quarto-scss-export-yellow-600: #cc9a06;--quarto-scss-export-yellow-700: #997404;--quarto-scss-export-yellow-800: #664d03;--quarto-scss-export-yellow-900: #332701;--quarto-scss-export-green-100: #d1e7dd;--quarto-scss-export-green-200: #a3cfbb;--quarto-scss-export-green-300: #75b798;--quarto-scss-export-green-400: #479f76;--quarto-scss-export-green-500: #198754;--quarto-scss-export-green-600: #146c43;--quarto-scss-export-green-700: #0f5132;--quarto-scss-export-green-800: #0a3622;--quarto-scss-export-green-900: #051b11;--quarto-scss-export-teal-100: #d2f4ea;--quarto-scss-export-teal-200: #a6e9d5;--quarto-scss-export-teal-300: #79dfc1;--quarto-scss-export-teal-400: #4dd4ac;--quarto-scss-export-teal-500: #20c997;--quarto-scss-export-teal-600: #1aa179;--quarto-scss-export-teal-700: #13795b;--quarto-scss-export-teal-800: #0d503c;--quarto-scss-export-teal-900: #06281e;--quarto-scss-export-cyan-100: #cff4fc;--quarto-scss-export-cyan-200: #9eeaf9;--quarto-scss-export-cyan-300: #6edff6;--quarto-scss-export-cyan-400: #3dd5f3;--quarto-scss-export-cyan-500: #0dcaf0;--quarto-scss-export-cyan-600: #0aa2c0;--quarto-scss-export-cyan-700: #087990;--quarto-scss-export-cyan-800: #055160;--quarto-scss-export-cyan-900: #032830;--quarto-scss-export-default: #dee2e6;--quarto-scss-export-secondary: #6c757d;--quarto-scss-export-success: #198754;--quarto-scss-export-info: #0dcaf0;--quarto-scss-export-warning: #ffc107;--quarto-scss-export-danger: #dc3545;--quarto-scss-export-light: #f8f9fa;--quarto-scss-export-dark: #212529;--quarto-scss-export-primary-text-emphasis: #052c65;--quarto-scss-export-secondary-text-emphasis: #2b2f32;--quarto-scss-export-success-text-emphasis: #0a3622;--quarto-scss-export-info-text-emphasis: #055160;--quarto-scss-export-warning-text-emphasis: #664d03;--quarto-scss-export-danger-text-emphasis: #58151c;--quarto-scss-export-light-text-emphasis: #495057;--quarto-scss-export-dark-text-emphasis: #495057;--quarto-scss-export-primary-bg-subtle: #cfe2ff;--quarto-scss-export-secondary-bg-subtle: #e2e3e5;--quarto-scss-export-success-bg-subtle: #d1e7dd;--quarto-scss-export-info-bg-subtle: #cff4fc;--quarto-scss-export-warning-bg-subtle: #fff3cd;--quarto-scss-export-danger-bg-subtle: #f8d7da;--quarto-scss-export-light-bg-subtle: #fcfcfd;--quarto-scss-export-dark-bg-subtle: #ced4da;--quarto-scss-export-primary-border-subtle: #9ec5fe;--quarto-scss-export-secondary-border-subtle: #c4c8cb;--quarto-scss-export-success-border-subtle: #a3cfbb;--quarto-scss-export-info-border-subtle: #9eeaf9;--quarto-scss-export-warning-border-subtle: #ffe69c;--quarto-scss-export-danger-border-subtle: #f1aeb5;--quarto-scss-export-light-border-subtle: #e9ecef;--quarto-scss-export-dark-border-subtle: #adb5bd;--quarto-scss-export-body-text-align: ;--quarto-scss-export-body-color: #212529;--quarto-scss-export-body-bg: #ffffff;--quarto-scss-export-body-secondary-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-body-secondary-bg: #e9ecef;--quarto-scss-export-body-tertiary-color: rgba(33, 37, 41, 0.5);--quarto-scss-export-body-tertiary-bg: #f8f9fa;--quarto-scss-export-body-emphasis-color: #000;--quarto-scss-export-link-hover-color: #0a58ca;--quarto-scss-export-link-hover-decoration: ;--quarto-scss-export-border-color-translucent: rgba(0, 0, 0, 0.175);--quarto-scss-export-component-active-bg: #0d6efd;--quarto-scss-export-component-active-color: #ffffff;--quarto-scss-export-focus-ring-color: rgba(13, 110, 253, 0.25);--quarto-scss-export-headings-font-family: ;--quarto-scss-export-headings-font-style: ;--quarto-scss-export-display-font-family: ;--quarto-scss-export-display-font-style: ;--quarto-scss-export-text-muted: rgba(33, 37, 41, 0.75);--quarto-scss-export-blockquote-footer-color: #6c757d;--quarto-scss-export-blockquote-border-color: #e9ecef;--quarto-scss-export-hr-bg-color: ;--quarto-scss-export-hr-height: ;--quarto-scss-export-hr-border-color: ;--quarto-scss-export-legend-font-weight: ;--quarto-scss-export-mark-bg: #fff3cd;--quarto-scss-export-table-color: #212529;--quarto-scss-export-table-bg: #ffffff;--quarto-scss-export-table-accent-bg: transparent;--quarto-scss-export-table-th-font-weight: ;--quarto-scss-export-table-striped-color: #212529;--quarto-scss-export-table-striped-bg: rgba(0, 0, 0, 0.05);--quarto-scss-export-table-active-color: #212529;--quarto-scss-export-table-active-bg: rgba(0, 0, 0, 0.1);--quarto-scss-export-table-hover-color: #212529;--quarto-scss-export-table-hover-bg: rgba(0, 0, 0, 0.075);--quarto-scss-export-table-caption-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-input-btn-font-family: ;--quarto-scss-export-input-btn-focus-color: rgba(13, 110, 253, 0.25);--quarto-scss-export-btn-color: #212529;--quarto-scss-export-btn-font-family: ;--quarto-scss-export-btn-white-space: ;--quarto-scss-export-btn-link-color: #0d6efd;--quarto-scss-export-btn-link-hover-color: #0a58ca;--quarto-scss-export-btn-link-disabled-color: #6c757d;--quarto-scss-export-form-text-font-style: ;--quarto-scss-export-form-text-font-weight: ;--quarto-scss-export-form-text-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-form-label-font-size: ;--quarto-scss-export-form-label-font-style: ;--quarto-scss-export-form-label-font-weight: ;--quarto-scss-export-form-label-color: ;--quarto-scss-export-input-font-family: ;--quarto-scss-export-input-disabled-color: ;--quarto-scss-export-input-disabled-bg: #e9ecef;--quarto-scss-export-input-disabled-border-color: ;--quarto-scss-export-input-color: #212529;--quarto-scss-export-input-focus-bg: #ffffff;--quarto-scss-export-input-focus-border-color: #86b7fe;--quarto-scss-export-input-focus-color: #212529;--quarto-scss-export-input-placeholder-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-input-plaintext-color: #212529;--quarto-scss-export-form-check-label-color: ;--quarto-scss-export-form-check-transition: ;--quarto-scss-export-form-check-input-bg: #ffffff;--quarto-scss-export-form-check-input-focus-border: #86b7fe;--quarto-scss-export-form-check-input-checked-color: #ffffff;--quarto-scss-export-form-check-input-checked-bg-color: #0d6efd;--quarto-scss-export-form-check-input-checked-border-color: #0d6efd;--quarto-scss-export-form-check-input-indeterminate-color: #ffffff;--quarto-scss-export-form-check-input-indeterminate-bg-color: #0d6efd;--quarto-scss-export-form-check-input-indeterminate-border-color: #0d6efd;--quarto-scss-export-form-switch-color: rgba(0, 0, 0, 0.25);--quarto-scss-export-form-switch-focus-color: #86b7fe;--quarto-scss-export-form-switch-checked-color: #ffffff;--quarto-scss-export-input-group-addon-color: #212529;--quarto-scss-export-input-group-addon-bg: #f8f9fa;--quarto-scss-export-input-group-addon-border-color: white;--quarto-scss-export-form-select-font-family: ;--quarto-scss-export-form-select-color: #212529;--quarto-scss-export-form-select-bg: #ffffff;--quarto-scss-export-form-select-disabled-color: ;--quarto-scss-export-form-select-disabled-bg: #e9ecef;--quarto-scss-export-form-select-disabled-border-color: ;--quarto-scss-export-form-select-indicator-color: #343a40;--quarto-scss-export-form-select-border-color: white;--quarto-scss-export-form-select-focus-border-color: #86b7fe;--quarto-scss-export-form-range-track-bg: #f8f9fa;--quarto-scss-export-form-range-thumb-bg: #0d6efd;--quarto-scss-export-form-range-thumb-active-bg: #b6d4fe;--quarto-scss-export-form-range-thumb-disabled-bg: rgba(33, 37, 41, 0.75);--quarto-scss-export-form-file-button-color: #212529;--quarto-scss-export-form-file-button-bg: #f8f9fa;--quarto-scss-export-form-file-button-hover-bg: #e9ecef;--quarto-scss-export-form-floating-label-disabled-color: #6c757d;--quarto-scss-export-form-feedback-font-style: ;--quarto-scss-export-form-feedback-valid-color: #198754;--quarto-scss-export-form-feedback-invalid-color: #dc3545;--quarto-scss-export-form-feedback-icon-valid-color: #198754;--quarto-scss-export-form-feedback-icon-invalid-color: #dc3545;--quarto-scss-export-form-valid-color: #198754;--quarto-scss-export-form-valid-border-color: #198754;--quarto-scss-export-form-invalid-color: #dc3545;--quarto-scss-export-form-invalid-border-color: #dc3545;--quarto-scss-export-nav-link-font-size: ;--quarto-scss-export-nav-link-font-weight: ;--quarto-scss-export-nav-link-color: #0d6efd;--quarto-scss-export-nav-link-hover-color: #0a58ca;--quarto-scss-export-nav-link-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-nav-tabs-border-color: white;--quarto-scss-export-nav-tabs-link-hover-border-color: #e9ecef #e9ecef white;--quarto-scss-export-nav-tabs-link-active-color: #000;--quarto-scss-export-nav-tabs-link-active-bg: #ffffff;--quarto-scss-export-nav-pills-link-active-bg: #0d6efd;--quarto-scss-export-nav-pills-link-active-color: #ffffff;--quarto-scss-export-nav-underline-link-active-color: #000;--quarto-scss-export-navbar-padding-x: ;--quarto-scss-export-navbar-light-contrast: #ffffff;--quarto-scss-export-navbar-dark-contrast: #ffffff;--quarto-scss-export-navbar-light-icon-color: rgba(255, 255, 255, 0.75);--quarto-scss-export-navbar-dark-icon-color: rgba(255, 255, 255, 0.75);--quarto-scss-export-dropdown-color: #212529;--quarto-scss-export-dropdown-bg: #ffffff;--quarto-scss-export-dropdown-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-link-color: #212529;--quarto-scss-export-dropdown-link-hover-color: #212529;--quarto-scss-export-dropdown-link-hover-bg: #f8f9fa;--quarto-scss-export-dropdown-link-active-bg: #0d6efd;--quarto-scss-export-dropdown-link-active-color: #ffffff;--quarto-scss-export-dropdown-link-disabled-color: rgba(33, 37, 41, 0.5);--quarto-scss-export-dropdown-header-color: #6c757d;--quarto-scss-export-dropdown-dark-color: #dee2e6;--quarto-scss-export-dropdown-dark-bg: #343a40;--quarto-scss-export-dropdown-dark-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-dark-divider-bg: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-dark-box-shadow: ;--quarto-scss-export-dropdown-dark-link-color: #dee2e6;--quarto-scss-export-dropdown-dark-link-hover-color: #ffffff;--quarto-scss-export-dropdown-dark-link-hover-bg: rgba(255, 255, 255, 0.15);--quarto-scss-export-dropdown-dark-link-active-color: #ffffff;--quarto-scss-export-dropdown-dark-link-active-bg: #0d6efd;--quarto-scss-export-dropdown-dark-link-disabled-color: #adb5bd;--quarto-scss-export-dropdown-dark-header-color: #adb5bd;--quarto-scss-export-pagination-color: #0d6efd;--quarto-scss-export-pagination-bg: #ffffff;--quarto-scss-export-pagination-border-color: white;--quarto-scss-export-pagination-focus-color: #0a58ca;--quarto-scss-export-pagination-focus-bg: #e9ecef;--quarto-scss-export-pagination-hover-color: #0a58ca;--quarto-scss-export-pagination-hover-bg: #f8f9fa;--quarto-scss-export-pagination-hover-border-color: white;--quarto-scss-export-pagination-active-color: #ffffff;--quarto-scss-export-pagination-active-bg: #0d6efd;--quarto-scss-export-pagination-active-border-color: #0d6efd;--quarto-scss-export-pagination-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-pagination-disabled-bg: #e9ecef;--quarto-scss-export-pagination-disabled-border-color: white;--quarto-scss-export-card-title-color: ;--quarto-scss-export-card-subtitle-color: ;--quarto-scss-export-card-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-card-box-shadow: ;--quarto-scss-export-card-cap-bg: rgba(33, 37, 41, 0.03);--quarto-scss-export-card-cap-color: ;--quarto-scss-export-card-height: ;--quarto-scss-export-card-color: ;--quarto-scss-export-card-bg: #ffffff;--quarto-scss-export-accordion-color: #212529;--quarto-scss-export-accordion-bg: #ffffff;--quarto-scss-export-accordion-border-color: white;--quarto-scss-export-accordion-button-color: #212529;--quarto-scss-export-accordion-button-bg: #ffffff;--quarto-scss-export-accordion-button-active-bg: #cfe2ff;--quarto-scss-export-accordion-button-active-color: #052c65;--quarto-scss-export-accordion-button-focus-border-color: #86b7fe;--quarto-scss-export-accordion-icon-color: #212529;--quarto-scss-export-accordion-icon-active-color: #052c65;--quarto-scss-export-tooltip-color: #ffffff;--quarto-scss-export-tooltip-bg: #000;--quarto-scss-export-tooltip-margin: ;--quarto-scss-export-tooltip-arrow-color: ;--quarto-scss-export-form-feedback-tooltip-line-height: ;--quarto-scss-export-popover-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-popover-header-bg: #e9ecef;--quarto-scss-export-popover-body-color: #212529;--quarto-scss-export-popover-arrow-color: #ffffff;--quarto-scss-export-popover-arrow-outer-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-toast-color: ;--quarto-scss-export-toast-background-color: rgba(255, 255, 255, 0.85);--quarto-scss-export-toast-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-toast-header-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-toast-header-background-color: rgba(255, 255, 255, 0.85);--quarto-scss-export-toast-header-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-badge-color: #ffffff;--quarto-scss-export-modal-content-color: ;--quarto-scss-export-modal-content-bg: #ffffff;--quarto-scss-export-modal-content-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-modal-backdrop-bg: #000;--quarto-scss-export-modal-header-border-color: white;--quarto-scss-export-modal-footer-bg: ;--quarto-scss-export-modal-footer-border-color: white;--quarto-scss-export-progress-bg: #e9ecef;--quarto-scss-export-progress-bar-color: #ffffff;--quarto-scss-export-progress-bar-bg: #0d6efd;--quarto-scss-export-list-group-color: #212529;--quarto-scss-export-list-group-bg: #ffffff;--quarto-scss-export-list-group-border-color: white;--quarto-scss-export-list-group-hover-bg: #f8f9fa;--quarto-scss-export-list-group-active-bg: #0d6efd;--quarto-scss-export-list-group-active-color: #ffffff;--quarto-scss-export-list-group-active-border-color: #0d6efd;--quarto-scss-export-list-group-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-list-group-disabled-bg: #ffffff;--quarto-scss-export-list-group-action-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-list-group-action-hover-color: #000;--quarto-scss-export-list-group-action-active-color: #212529;--quarto-scss-export-list-group-action-active-bg: #e9ecef;--quarto-scss-export-thumbnail-bg: #ffffff;--quarto-scss-export-thumbnail-border-color: white;--quarto-scss-export-figure-caption-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-font-size: ;--quarto-scss-export-breadcrumb-bg: ;--quarto-scss-export-breadcrumb-divider-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-active-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-border-radius: ;--quarto-scss-export-carousel-control-color: #ffffff;--quarto-scss-export-carousel-indicator-active-bg: #ffffff;--quarto-scss-export-carousel-caption-color: #ffffff;--quarto-scss-export-carousel-dark-indicator-active-bg: #000;--quarto-scss-export-carousel-dark-caption-color: #000;--quarto-scss-export-btn-close-color: #000;--quarto-scss-export-offcanvas-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-offcanvas-bg-color: #ffffff;--quarto-scss-export-offcanvas-color: #212529;--quarto-scss-export-offcanvas-backdrop-bg: #000;--quarto-scss-export-code-color-dark: white;--quarto-scss-export-kbd-color: #ffffff;--quarto-scss-export-kbd-bg: #212529;--quarto-scss-export-nested-kbd-font-weight: ;--quarto-scss-export-pre-bg: #f8f9fa;--quarto-scss-export-pre-color: #000;--quarto-scss-export-bslib-page-sidebar-title-bg: #517699;--quarto-scss-export-bslib-page-sidebar-title-color: #ffffff;--quarto-scss-export-bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--quarto-scss-export-bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--quarto-scss-export-mermaid-bg-color: #ffffff;--quarto-scss-export-mermaid-edge-color: #6c757d;--quarto-scss-export-mermaid-node-fg-color: #212529;--quarto-scss-export-mermaid-fg-color: #212529;--quarto-scss-export-mermaid-fg-color--lighter: #383f45;--quarto-scss-export-mermaid-fg-color--lightest: #4e5862;--quarto-scss-export-mermaid-label-bg-color: #ffffff;--quarto-scss-export-mermaid-label-fg-color: #0d6efd;--quarto-scss-export-mermaid-node-bg-color: rgba(13, 110, 253, 0.1);--quarto-scss-export-code-block-border-left-color: white;--quarto-scss-export-callout-color-note: #0d6efd;--quarto-scss-export-callout-color-tip: #198754;--quarto-scss-export-callout-color-important: #dc3545;--quarto-scss-export-callout-color-caution: #fd7e14;--quarto-scss-export-callout-color-warning: #ffc107} \ No newline at end of file diff --git a/docs/validmind_files/libs/bootstrap/bootstrap-icons.css b/docs/validmind_files/libs/bootstrap/bootstrap-icons.css new file mode 100644 index 000000000..285e4448f --- /dev/null +++ b/docs/validmind_files/libs/bootstrap/bootstrap-icons.css @@ -0,0 +1,2078 @@ +/*! + * Bootstrap Icons v1.11.1 (https://icons.getbootstrap.com/) + * Copyright 2019-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) + */ + +@font-face { + font-display: block; + font-family: "bootstrap-icons"; + src: +url("./bootstrap-icons.woff?2820a3852bdb9a5832199cc61cec4e65") format("woff"); +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-family: bootstrap-icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-123::before { content: "\f67f"; } +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-3d-fill::before { content: "\f15a"; } +.bi-badge-3d::before { content: "\f15b"; } +.bi-badge-4k-fill::before { content: "\f15c"; } +.bi-badge-4k::before { content: "\f15d"; } +.bi-badge-8k-fill::before { content: "\f15e"; } +.bi-badge-8k::before { content: "\f15f"; } +.bi-badge-ad-fill::before { content: "\f160"; } +.bi-badge-ad::before { content: "\f161"; } +.bi-badge-ar-fill::before { content: "\f162"; } +.bi-badge-ar::before { content: "\f163"; } +.bi-badge-cc-fill::before { content: "\f164"; } +.bi-badge-cc::before { content: "\f165"; } +.bi-badge-hd-fill::before { content: "\f166"; } +.bi-badge-hd::before { content: "\f167"; } +.bi-badge-tm-fill::before { content: "\f168"; } +.bi-badge-tm::before { content: "\f169"; } +.bi-badge-vo-fill::before { content: "\f16a"; } +.bi-badge-vo::before { content: "\f16b"; } +.bi-badge-vr-fill::before { content: "\f16c"; } +.bi-badge-vr::before { content: "\f16d"; } +.bi-badge-wc-fill::before { content: "\f16e"; } +.bi-badge-wc::before { content: "\f16f"; } +.bi-bag-check-fill::before { content: "\f170"; } +.bi-bag-check::before { content: "\f171"; } +.bi-bag-dash-fill::before { content: "\f172"; } +.bi-bag-dash::before { content: "\f173"; } +.bi-bag-fill::before { content: "\f174"; } +.bi-bag-plus-fill::before { content: "\f175"; } +.bi-bag-plus::before { content: "\f176"; } +.bi-bag-x-fill::before { content: "\f177"; } +.bi-bag-x::before { content: "\f178"; } +.bi-bag::before { content: "\f179"; } +.bi-bar-chart-fill::before { content: "\f17a"; } +.bi-bar-chart-line-fill::before { content: "\f17b"; } +.bi-bar-chart-line::before { content: "\f17c"; } +.bi-bar-chart-steps::before { content: "\f17d"; } +.bi-bar-chart::before { content: "\f17e"; } +.bi-basket-fill::before { content: "\f17f"; } +.bi-basket::before { content: "\f180"; } +.bi-basket2-fill::before { content: "\f181"; } +.bi-basket2::before { content: "\f182"; } +.bi-basket3-fill::before { content: "\f183"; } +.bi-basket3::before { content: "\f184"; } +.bi-battery-charging::before { content: "\f185"; } +.bi-battery-full::before { content: "\f186"; } +.bi-battery-half::before { content: "\f187"; } +.bi-battery::before { content: "\f188"; } +.bi-bell-fill::before { content: "\f189"; } +.bi-bell::before { content: "\f18a"; } +.bi-bezier::before { content: "\f18b"; } +.bi-bezier2::before { content: "\f18c"; } +.bi-bicycle::before { content: "\f18d"; } +.bi-binoculars-fill::before { content: "\f18e"; } +.bi-binoculars::before { content: "\f18f"; } +.bi-blockquote-left::before { content: "\f190"; } +.bi-blockquote-right::before { content: "\f191"; } +.bi-book-fill::before { content: "\f192"; } +.bi-book-half::before { content: "\f193"; } +.bi-book::before { content: "\f194"; } +.bi-bookmark-check-fill::before { content: "\f195"; } +.bi-bookmark-check::before { content: "\f196"; } +.bi-bookmark-dash-fill::before { content: "\f197"; } +.bi-bookmark-dash::before { content: "\f198"; } +.bi-bookmark-fill::before { content: "\f199"; } +.bi-bookmark-heart-fill::before { content: "\f19a"; } +.bi-bookmark-heart::before { content: "\f19b"; } +.bi-bookmark-plus-fill::before { content: "\f19c"; } +.bi-bookmark-plus::before { content: "\f19d"; } +.bi-bookmark-star-fill::before { content: "\f19e"; } +.bi-bookmark-star::before { content: "\f19f"; } +.bi-bookmark-x-fill::before { content: "\f1a0"; } +.bi-bookmark-x::before { content: "\f1a1"; } +.bi-bookmark::before { content: "\f1a2"; } +.bi-bookmarks-fill::before { content: "\f1a3"; } +.bi-bookmarks::before { content: "\f1a4"; } +.bi-bookshelf::before { content: "\f1a5"; } +.bi-bootstrap-fill::before { content: "\f1a6"; } +.bi-bootstrap-reboot::before { content: "\f1a7"; } +.bi-bootstrap::before { content: "\f1a8"; } +.bi-border-all::before { content: "\f1a9"; } +.bi-border-bottom::before { content: "\f1aa"; } +.bi-border-center::before { content: "\f1ab"; } +.bi-border-inner::before { content: "\f1ac"; } +.bi-border-left::before { content: "\f1ad"; } +.bi-border-middle::before { content: "\f1ae"; } +.bi-border-outer::before { content: "\f1af"; } +.bi-border-right::before { content: "\f1b0"; } +.bi-border-style::before { content: "\f1b1"; } +.bi-border-top::before { content: "\f1b2"; } +.bi-border-width::before { content: "\f1b3"; } +.bi-border::before { content: "\f1b4"; } +.bi-bounding-box-circles::before { content: "\f1b5"; } +.bi-bounding-box::before { content: "\f1b6"; } +.bi-box-arrow-down-left::before { content: "\f1b7"; } +.bi-box-arrow-down-right::before { content: "\f1b8"; } +.bi-box-arrow-down::before { content: "\f1b9"; } +.bi-box-arrow-in-down-left::before { content: "\f1ba"; } +.bi-box-arrow-in-down-right::before { content: "\f1bb"; } +.bi-box-arrow-in-down::before { content: "\f1bc"; } +.bi-box-arrow-in-left::before { content: "\f1bd"; } +.bi-box-arrow-in-right::before { content: "\f1be"; } +.bi-box-arrow-in-up-left::before { content: "\f1bf"; } +.bi-box-arrow-in-up-right::before { content: "\f1c0"; } +.bi-box-arrow-in-up::before { content: "\f1c1"; } +.bi-box-arrow-left::before { content: "\f1c2"; } +.bi-box-arrow-right::before { content: "\f1c3"; } +.bi-box-arrow-up-left::before { content: "\f1c4"; } +.bi-box-arrow-up-right::before { content: "\f1c5"; } +.bi-box-arrow-up::before { content: "\f1c6"; } +.bi-box-seam::before { content: "\f1c7"; } +.bi-box::before { content: "\f1c8"; } +.bi-braces::before { content: "\f1c9"; } +.bi-bricks::before { content: "\f1ca"; } +.bi-briefcase-fill::before { content: "\f1cb"; } +.bi-briefcase::before { content: "\f1cc"; } +.bi-brightness-alt-high-fill::before { content: "\f1cd"; } +.bi-brightness-alt-high::before { content: "\f1ce"; } +.bi-brightness-alt-low-fill::before { content: "\f1cf"; } +.bi-brightness-alt-low::before { content: "\f1d0"; } +.bi-brightness-high-fill::before { content: "\f1d1"; } +.bi-brightness-high::before { content: "\f1d2"; } +.bi-brightness-low-fill::before { content: "\f1d3"; } +.bi-brightness-low::before { content: "\f1d4"; } +.bi-broadcast-pin::before { content: "\f1d5"; } +.bi-broadcast::before { content: "\f1d6"; } +.bi-brush-fill::before { content: "\f1d7"; } +.bi-brush::before { content: "\f1d8"; } +.bi-bucket-fill::before { content: "\f1d9"; } +.bi-bucket::before { content: "\f1da"; } +.bi-bug-fill::before { content: "\f1db"; } +.bi-bug::before { content: "\f1dc"; } +.bi-building::before { content: "\f1dd"; } +.bi-bullseye::before { content: "\f1de"; } +.bi-calculator-fill::before { content: "\f1df"; } +.bi-calculator::before { content: "\f1e0"; } +.bi-calendar-check-fill::before { content: "\f1e1"; } +.bi-calendar-check::before { content: "\f1e2"; } +.bi-calendar-date-fill::before { content: "\f1e3"; } +.bi-calendar-date::before { content: "\f1e4"; } +.bi-calendar-day-fill::before { content: "\f1e5"; } +.bi-calendar-day::before { content: "\f1e6"; } +.bi-calendar-event-fill::before { content: "\f1e7"; } +.bi-calendar-event::before { content: "\f1e8"; } +.bi-calendar-fill::before { content: "\f1e9"; } +.bi-calendar-minus-fill::before { content: "\f1ea"; } +.bi-calendar-minus::before { content: "\f1eb"; } +.bi-calendar-month-fill::before { content: "\f1ec"; } +.bi-calendar-month::before { content: "\f1ed"; } +.bi-calendar-plus-fill::before { content: "\f1ee"; } +.bi-calendar-plus::before { content: "\f1ef"; } +.bi-calendar-range-fill::before { content: "\f1f0"; } +.bi-calendar-range::before { content: "\f1f1"; } +.bi-calendar-week-fill::before { content: "\f1f2"; } +.bi-calendar-week::before { content: "\f1f3"; } +.bi-calendar-x-fill::before { content: "\f1f4"; } +.bi-calendar-x::before { content: "\f1f5"; } +.bi-calendar::before { content: "\f1f6"; } +.bi-calendar2-check-fill::before { content: "\f1f7"; } +.bi-calendar2-check::before { content: "\f1f8"; } +.bi-calendar2-date-fill::before { content: "\f1f9"; } +.bi-calendar2-date::before { content: "\f1fa"; } +.bi-calendar2-day-fill::before { content: "\f1fb"; } +.bi-calendar2-day::before { content: "\f1fc"; } +.bi-calendar2-event-fill::before { content: "\f1fd"; } +.bi-calendar2-event::before { content: "\f1fe"; } +.bi-calendar2-fill::before { content: "\f1ff"; } +.bi-calendar2-minus-fill::before { content: "\f200"; } +.bi-calendar2-minus::before { content: "\f201"; } +.bi-calendar2-month-fill::before { content: "\f202"; } +.bi-calendar2-month::before { content: "\f203"; } +.bi-calendar2-plus-fill::before { content: "\f204"; } +.bi-calendar2-plus::before { content: "\f205"; } +.bi-calendar2-range-fill::before { content: "\f206"; } +.bi-calendar2-range::before { content: "\f207"; } +.bi-calendar2-week-fill::before { content: "\f208"; } +.bi-calendar2-week::before { content: "\f209"; } +.bi-calendar2-x-fill::before { content: "\f20a"; } +.bi-calendar2-x::before { content: "\f20b"; } +.bi-calendar2::before { content: "\f20c"; } +.bi-calendar3-event-fill::before { content: "\f20d"; } +.bi-calendar3-event::before { content: "\f20e"; } +.bi-calendar3-fill::before { content: "\f20f"; } +.bi-calendar3-range-fill::before { content: "\f210"; } +.bi-calendar3-range::before { content: "\f211"; } +.bi-calendar3-week-fill::before { content: "\f212"; } +.bi-calendar3-week::before { content: "\f213"; } +.bi-calendar3::before { content: "\f214"; } +.bi-calendar4-event::before { content: "\f215"; } +.bi-calendar4-range::before { content: "\f216"; } +.bi-calendar4-week::before { content: "\f217"; } +.bi-calendar4::before { content: "\f218"; } +.bi-camera-fill::before { content: "\f219"; } +.bi-camera-reels-fill::before { content: "\f21a"; } +.bi-camera-reels::before { content: "\f21b"; } +.bi-camera-video-fill::before { content: "\f21c"; } +.bi-camera-video-off-fill::before { content: "\f21d"; } +.bi-camera-video-off::before { content: "\f21e"; } +.bi-camera-video::before { content: "\f21f"; } +.bi-camera::before { content: "\f220"; } +.bi-camera2::before { content: "\f221"; } +.bi-capslock-fill::before { content: "\f222"; } +.bi-capslock::before { content: "\f223"; } +.bi-card-checklist::before { content: "\f224"; } +.bi-card-heading::before { content: "\f225"; } +.bi-card-image::before { content: "\f226"; } +.bi-card-list::before { content: "\f227"; } +.bi-card-text::before { content: "\f228"; } +.bi-caret-down-fill::before { content: "\f229"; } +.bi-caret-down-square-fill::before { content: "\f22a"; } +.bi-caret-down-square::before { content: "\f22b"; } +.bi-caret-down::before { content: "\f22c"; } +.bi-caret-left-fill::before { content: "\f22d"; } +.bi-caret-left-square-fill::before { content: "\f22e"; } +.bi-caret-left-square::before { content: "\f22f"; } +.bi-caret-left::before { content: "\f230"; } +.bi-caret-right-fill::before { content: "\f231"; } +.bi-caret-right-square-fill::before { content: "\f232"; } +.bi-caret-right-square::before { content: "\f233"; } +.bi-caret-right::before { content: "\f234"; } +.bi-caret-up-fill::before { content: "\f235"; } +.bi-caret-up-square-fill::before { content: "\f236"; } +.bi-caret-up-square::before { content: "\f237"; } +.bi-caret-up::before { content: "\f238"; } +.bi-cart-check-fill::before { content: "\f239"; } +.bi-cart-check::before { content: "\f23a"; } +.bi-cart-dash-fill::before { content: "\f23b"; } +.bi-cart-dash::before { content: "\f23c"; } +.bi-cart-fill::before { content: "\f23d"; } +.bi-cart-plus-fill::before { content: "\f23e"; } +.bi-cart-plus::before { content: "\f23f"; } +.bi-cart-x-fill::before { content: "\f240"; } +.bi-cart-x::before { content: "\f241"; } +.bi-cart::before { content: "\f242"; } +.bi-cart2::before { content: "\f243"; } +.bi-cart3::before { content: "\f244"; } +.bi-cart4::before { content: "\f245"; } +.bi-cash-stack::before { content: "\f246"; } +.bi-cash::before { content: "\f247"; } +.bi-cast::before { content: "\f248"; } +.bi-chat-dots-fill::before { content: "\f249"; } +.bi-chat-dots::before { content: "\f24a"; } +.bi-chat-fill::before { content: "\f24b"; } +.bi-chat-left-dots-fill::before { content: "\f24c"; } +.bi-chat-left-dots::before { content: "\f24d"; } +.bi-chat-left-fill::before { content: "\f24e"; } +.bi-chat-left-quote-fill::before { content: "\f24f"; } +.bi-chat-left-quote::before { content: "\f250"; } +.bi-chat-left-text-fill::before { content: "\f251"; } +.bi-chat-left-text::before { content: "\f252"; } +.bi-chat-left::before { content: "\f253"; } +.bi-chat-quote-fill::before { content: "\f254"; } +.bi-chat-quote::before { content: "\f255"; } +.bi-chat-right-dots-fill::before { content: "\f256"; } +.bi-chat-right-dots::before { content: "\f257"; } +.bi-chat-right-fill::before { content: "\f258"; } +.bi-chat-right-quote-fill::before { content: "\f259"; } +.bi-chat-right-quote::before { content: "\f25a"; } +.bi-chat-right-text-fill::before { content: "\f25b"; } +.bi-chat-right-text::before { content: "\f25c"; } +.bi-chat-right::before { content: "\f25d"; } +.bi-chat-square-dots-fill::before { content: "\f25e"; } +.bi-chat-square-dots::before { content: "\f25f"; } +.bi-chat-square-fill::before { content: "\f260"; } +.bi-chat-square-quote-fill::before { content: "\f261"; } +.bi-chat-square-quote::before { content: "\f262"; } +.bi-chat-square-text-fill::before { content: "\f263"; } +.bi-chat-square-text::before { content: "\f264"; } +.bi-chat-square::before { content: "\f265"; } +.bi-chat-text-fill::before { content: "\f266"; } +.bi-chat-text::before { content: "\f267"; } +.bi-chat::before { content: "\f268"; } +.bi-check-all::before { content: "\f269"; } +.bi-check-circle-fill::before { content: "\f26a"; } +.bi-check-circle::before { content: "\f26b"; } +.bi-check-square-fill::before { content: "\f26c"; } +.bi-check-square::before { content: "\f26d"; } +.bi-check::before { content: "\f26e"; } +.bi-check2-all::before { content: "\f26f"; } +.bi-check2-circle::before { content: "\f270"; } +.bi-check2-square::before { content: "\f271"; } +.bi-check2::before { content: "\f272"; } +.bi-chevron-bar-contract::before { content: "\f273"; } +.bi-chevron-bar-down::before { content: "\f274"; } +.bi-chevron-bar-expand::before { content: "\f275"; } +.bi-chevron-bar-left::before { content: "\f276"; } +.bi-chevron-bar-right::before { content: "\f277"; } +.bi-chevron-bar-up::before { content: "\f278"; } +.bi-chevron-compact-down::before { content: "\f279"; } +.bi-chevron-compact-left::before { content: "\f27a"; } +.bi-chevron-compact-right::before { content: "\f27b"; } +.bi-chevron-compact-up::before { content: "\f27c"; } +.bi-chevron-contract::before { content: "\f27d"; } +.bi-chevron-double-down::before { content: "\f27e"; } +.bi-chevron-double-left::before { content: "\f27f"; } +.bi-chevron-double-right::before { content: "\f280"; } +.bi-chevron-double-up::before { content: "\f281"; } +.bi-chevron-down::before { content: "\f282"; } +.bi-chevron-expand::before { content: "\f283"; } +.bi-chevron-left::before { content: "\f284"; } +.bi-chevron-right::before { content: "\f285"; } +.bi-chevron-up::before { content: "\f286"; } +.bi-circle-fill::before { content: "\f287"; } +.bi-circle-half::before { content: "\f288"; } +.bi-circle-square::before { content: "\f289"; } +.bi-circle::before { content: "\f28a"; } +.bi-clipboard-check::before { content: "\f28b"; } +.bi-clipboard-data::before { content: "\f28c"; } +.bi-clipboard-minus::before { content: "\f28d"; } +.bi-clipboard-plus::before { content: "\f28e"; } +.bi-clipboard-x::before { content: "\f28f"; } +.bi-clipboard::before { content: "\f290"; } +.bi-clock-fill::before { content: "\f291"; } +.bi-clock-history::before { content: "\f292"; } +.bi-clock::before { content: "\f293"; } +.bi-cloud-arrow-down-fill::before { content: "\f294"; } +.bi-cloud-arrow-down::before { content: "\f295"; } +.bi-cloud-arrow-up-fill::before { content: "\f296"; } +.bi-cloud-arrow-up::before { content: "\f297"; } +.bi-cloud-check-fill::before { content: "\f298"; } +.bi-cloud-check::before { content: "\f299"; } +.bi-cloud-download-fill::before { content: "\f29a"; } +.bi-cloud-download::before { content: "\f29b"; } +.bi-cloud-drizzle-fill::before { content: "\f29c"; } +.bi-cloud-drizzle::before { content: "\f29d"; } +.bi-cloud-fill::before { content: "\f29e"; } +.bi-cloud-fog-fill::before { content: "\f29f"; } +.bi-cloud-fog::before { content: "\f2a0"; } +.bi-cloud-fog2-fill::before { content: "\f2a1"; } +.bi-cloud-fog2::before { content: "\f2a2"; } +.bi-cloud-hail-fill::before { content: "\f2a3"; } +.bi-cloud-hail::before { content: "\f2a4"; } +.bi-cloud-haze-fill::before { content: "\f2a6"; } +.bi-cloud-haze::before { content: "\f2a7"; } +.bi-cloud-haze2-fill::before { content: "\f2a8"; } +.bi-cloud-lightning-fill::before { content: "\f2a9"; } +.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } +.bi-cloud-lightning-rain::before { content: "\f2ab"; } +.bi-cloud-lightning::before { content: "\f2ac"; } +.bi-cloud-minus-fill::before { content: "\f2ad"; } +.bi-cloud-minus::before { content: "\f2ae"; } +.bi-cloud-moon-fill::before { content: "\f2af"; } +.bi-cloud-moon::before { content: "\f2b0"; } +.bi-cloud-plus-fill::before { content: "\f2b1"; } +.bi-cloud-plus::before { content: "\f2b2"; } +.bi-cloud-rain-fill::before { content: "\f2b3"; } +.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } +.bi-cloud-rain-heavy::before { content: "\f2b5"; } +.bi-cloud-rain::before { content: "\f2b6"; } +.bi-cloud-slash-fill::before { content: "\f2b7"; } +.bi-cloud-slash::before { content: "\f2b8"; } +.bi-cloud-sleet-fill::before { content: "\f2b9"; } +.bi-cloud-sleet::before { content: "\f2ba"; } +.bi-cloud-snow-fill::before { content: "\f2bb"; } +.bi-cloud-snow::before { content: "\f2bc"; } +.bi-cloud-sun-fill::before { content: "\f2bd"; } +.bi-cloud-sun::before { content: "\f2be"; } +.bi-cloud-upload-fill::before { content: "\f2bf"; } +.bi-cloud-upload::before { content: "\f2c0"; } +.bi-cloud::before { content: "\f2c1"; } +.bi-clouds-fill::before { content: "\f2c2"; } +.bi-clouds::before { content: "\f2c3"; } +.bi-cloudy-fill::before { content: "\f2c4"; } +.bi-cloudy::before { content: "\f2c5"; } +.bi-code-slash::before { content: "\f2c6"; } +.bi-code-square::before { content: "\f2c7"; } +.bi-code::before { content: "\f2c8"; } +.bi-collection-fill::before { content: "\f2c9"; } +.bi-collection-play-fill::before { content: "\f2ca"; } +.bi-collection-play::before { content: "\f2cb"; } +.bi-collection::before { content: "\f2cc"; } +.bi-columns-gap::before { content: "\f2cd"; } +.bi-columns::before { content: "\f2ce"; } +.bi-command::before { content: "\f2cf"; } +.bi-compass-fill::before { content: "\f2d0"; } +.bi-compass::before { content: "\f2d1"; } +.bi-cone-striped::before { content: "\f2d2"; } +.bi-cone::before { content: "\f2d3"; } +.bi-controller::before { content: "\f2d4"; } +.bi-cpu-fill::before { content: "\f2d5"; } +.bi-cpu::before { content: "\f2d6"; } +.bi-credit-card-2-back-fill::before { content: "\f2d7"; } +.bi-credit-card-2-back::before { content: "\f2d8"; } +.bi-credit-card-2-front-fill::before { content: "\f2d9"; } +.bi-credit-card-2-front::before { content: "\f2da"; } +.bi-credit-card-fill::before { content: "\f2db"; } +.bi-credit-card::before { content: "\f2dc"; } +.bi-crop::before { content: "\f2dd"; } +.bi-cup-fill::before { content: "\f2de"; } +.bi-cup-straw::before { content: "\f2df"; } +.bi-cup::before { content: "\f2e0"; } +.bi-cursor-fill::before { content: "\f2e1"; } +.bi-cursor-text::before { content: "\f2e2"; } +.bi-cursor::before { content: "\f2e3"; } +.bi-dash-circle-dotted::before { content: "\f2e4"; } +.bi-dash-circle-fill::before { content: "\f2e5"; } +.bi-dash-circle::before { content: "\f2e6"; } +.bi-dash-square-dotted::before { content: "\f2e7"; } +.bi-dash-square-fill::before { content: "\f2e8"; } +.bi-dash-square::before { content: "\f2e9"; } +.bi-dash::before { content: "\f2ea"; } +.bi-diagram-2-fill::before { content: "\f2eb"; } +.bi-diagram-2::before { content: "\f2ec"; } +.bi-diagram-3-fill::before { content: "\f2ed"; } +.bi-diagram-3::before { content: "\f2ee"; } +.bi-diamond-fill::before { content: "\f2ef"; } +.bi-diamond-half::before { content: "\f2f0"; } +.bi-diamond::before { content: "\f2f1"; } +.bi-dice-1-fill::before { content: "\f2f2"; } +.bi-dice-1::before { content: "\f2f3"; } +.bi-dice-2-fill::before { content: "\f2f4"; } +.bi-dice-2::before { content: "\f2f5"; } +.bi-dice-3-fill::before { content: "\f2f6"; } +.bi-dice-3::before { content: "\f2f7"; } +.bi-dice-4-fill::before { content: "\f2f8"; } +.bi-dice-4::before { content: "\f2f9"; } +.bi-dice-5-fill::before { content: "\f2fa"; } +.bi-dice-5::before { content: "\f2fb"; } +.bi-dice-6-fill::before { content: "\f2fc"; } +.bi-dice-6::before { content: "\f2fd"; } +.bi-disc-fill::before { content: "\f2fe"; } +.bi-disc::before { content: "\f2ff"; } +.bi-discord::before { content: "\f300"; } +.bi-display-fill::before { content: "\f301"; } +.bi-display::before { content: "\f302"; } +.bi-distribute-horizontal::before { content: "\f303"; } +.bi-distribute-vertical::before { content: "\f304"; } +.bi-door-closed-fill::before { content: "\f305"; } +.bi-door-closed::before { content: "\f306"; } +.bi-door-open-fill::before { content: "\f307"; } +.bi-door-open::before { content: "\f308"; } +.bi-dot::before { content: "\f309"; } +.bi-download::before { content: "\f30a"; } +.bi-droplet-fill::before { content: "\f30b"; } +.bi-droplet-half::before { content: "\f30c"; } +.bi-droplet::before { content: "\f30d"; } +.bi-earbuds::before { content: "\f30e"; } +.bi-easel-fill::before { content: "\f30f"; } +.bi-easel::before { content: "\f310"; } +.bi-egg-fill::before { content: "\f311"; } +.bi-egg-fried::before { content: "\f312"; } +.bi-egg::before { content: "\f313"; } +.bi-eject-fill::before { content: "\f314"; } +.bi-eject::before { content: "\f315"; } +.bi-emoji-angry-fill::before { content: "\f316"; } +.bi-emoji-angry::before { content: "\f317"; } +.bi-emoji-dizzy-fill::before { content: "\f318"; } +.bi-emoji-dizzy::before { content: "\f319"; } +.bi-emoji-expressionless-fill::before { content: "\f31a"; } +.bi-emoji-expressionless::before { content: "\f31b"; } +.bi-emoji-frown-fill::before { content: "\f31c"; } +.bi-emoji-frown::before { content: "\f31d"; } +.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } +.bi-emoji-heart-eyes::before { content: "\f31f"; } +.bi-emoji-laughing-fill::before { content: "\f320"; } +.bi-emoji-laughing::before { content: "\f321"; } +.bi-emoji-neutral-fill::before { content: "\f322"; } +.bi-emoji-neutral::before { content: "\f323"; } +.bi-emoji-smile-fill::before { content: "\f324"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } +.bi-emoji-smile-upside-down::before { content: "\f326"; } +.bi-emoji-smile::before { content: "\f327"; } +.bi-emoji-sunglasses-fill::before { content: "\f328"; } +.bi-emoji-sunglasses::before { content: "\f329"; } +.bi-emoji-wink-fill::before { content: "\f32a"; } +.bi-emoji-wink::before { content: "\f32b"; } +.bi-envelope-fill::before { content: "\f32c"; } +.bi-envelope-open-fill::before { content: "\f32d"; } +.bi-envelope-open::before { content: "\f32e"; } +.bi-envelope::before { content: "\f32f"; } +.bi-eraser-fill::before { content: "\f330"; } +.bi-eraser::before { content: "\f331"; } +.bi-exclamation-circle-fill::before { content: "\f332"; } +.bi-exclamation-circle::before { content: "\f333"; } +.bi-exclamation-diamond-fill::before { content: "\f334"; } +.bi-exclamation-diamond::before { content: "\f335"; } +.bi-exclamation-octagon-fill::before { content: "\f336"; } +.bi-exclamation-octagon::before { content: "\f337"; } +.bi-exclamation-square-fill::before { content: "\f338"; } +.bi-exclamation-square::before { content: "\f339"; } +.bi-exclamation-triangle-fill::before { content: "\f33a"; } +.bi-exclamation-triangle::before { content: "\f33b"; } +.bi-exclamation::before { content: "\f33c"; } +.bi-exclude::before { content: "\f33d"; } +.bi-eye-fill::before { content: "\f33e"; } +.bi-eye-slash-fill::before { content: "\f33f"; } +.bi-eye-slash::before { content: "\f340"; } +.bi-eye::before { content: "\f341"; } +.bi-eyedropper::before { content: "\f342"; } +.bi-eyeglasses::before { content: "\f343"; } +.bi-facebook::before { content: "\f344"; } +.bi-file-arrow-down-fill::before { content: "\f345"; } +.bi-file-arrow-down::before { content: "\f346"; } +.bi-file-arrow-up-fill::before { content: "\f347"; } +.bi-file-arrow-up::before { content: "\f348"; } +.bi-file-bar-graph-fill::before { content: "\f349"; } +.bi-file-bar-graph::before { content: "\f34a"; } +.bi-file-binary-fill::before { content: "\f34b"; } +.bi-file-binary::before { content: "\f34c"; } +.bi-file-break-fill::before { content: "\f34d"; } +.bi-file-break::before { content: "\f34e"; } +.bi-file-check-fill::before { content: "\f34f"; } +.bi-file-check::before { content: "\f350"; } +.bi-file-code-fill::before { content: "\f351"; } +.bi-file-code::before { content: "\f352"; } +.bi-file-diff-fill::before { content: "\f353"; } +.bi-file-diff::before { content: "\f354"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } +.bi-file-earmark-arrow-down::before { content: "\f356"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } +.bi-file-earmark-arrow-up::before { content: "\f358"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } +.bi-file-earmark-bar-graph::before { content: "\f35a"; } +.bi-file-earmark-binary-fill::before { content: "\f35b"; } +.bi-file-earmark-binary::before { content: "\f35c"; } +.bi-file-earmark-break-fill::before { content: "\f35d"; } +.bi-file-earmark-break::before { content: "\f35e"; } +.bi-file-earmark-check-fill::before { content: "\f35f"; } +.bi-file-earmark-check::before { content: "\f360"; } +.bi-file-earmark-code-fill::before { content: "\f361"; } +.bi-file-earmark-code::before { content: "\f362"; } +.bi-file-earmark-diff-fill::before { content: "\f363"; } +.bi-file-earmark-diff::before { content: "\f364"; } +.bi-file-earmark-easel-fill::before { content: "\f365"; } +.bi-file-earmark-easel::before { content: "\f366"; } +.bi-file-earmark-excel-fill::before { content: "\f367"; } +.bi-file-earmark-excel::before { content: "\f368"; } +.bi-file-earmark-fill::before { content: "\f369"; } +.bi-file-earmark-font-fill::before { content: "\f36a"; } +.bi-file-earmark-font::before { content: "\f36b"; } +.bi-file-earmark-image-fill::before { content: "\f36c"; } +.bi-file-earmark-image::before { content: "\f36d"; } +.bi-file-earmark-lock-fill::before { content: "\f36e"; } +.bi-file-earmark-lock::before { content: "\f36f"; } +.bi-file-earmark-lock2-fill::before { content: "\f370"; } +.bi-file-earmark-lock2::before { content: "\f371"; } +.bi-file-earmark-medical-fill::before { content: "\f372"; } +.bi-file-earmark-medical::before { content: "\f373"; } +.bi-file-earmark-minus-fill::before { content: "\f374"; } +.bi-file-earmark-minus::before { content: "\f375"; } +.bi-file-earmark-music-fill::before { content: "\f376"; } +.bi-file-earmark-music::before { content: "\f377"; } +.bi-file-earmark-person-fill::before { content: "\f378"; } +.bi-file-earmark-person::before { content: "\f379"; } +.bi-file-earmark-play-fill::before { content: "\f37a"; } +.bi-file-earmark-play::before { content: "\f37b"; } +.bi-file-earmark-plus-fill::before { content: "\f37c"; } +.bi-file-earmark-plus::before { content: "\f37d"; } +.bi-file-earmark-post-fill::before { content: "\f37e"; } +.bi-file-earmark-post::before { content: "\f37f"; } +.bi-file-earmark-ppt-fill::before { content: "\f380"; } +.bi-file-earmark-ppt::before { content: "\f381"; } +.bi-file-earmark-richtext-fill::before { content: "\f382"; } +.bi-file-earmark-richtext::before { content: "\f383"; } +.bi-file-earmark-ruled-fill::before { content: "\f384"; } +.bi-file-earmark-ruled::before { content: "\f385"; } +.bi-file-earmark-slides-fill::before { content: "\f386"; } +.bi-file-earmark-slides::before { content: "\f387"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } +.bi-file-earmark-spreadsheet::before { content: "\f389"; } +.bi-file-earmark-text-fill::before { content: "\f38a"; } +.bi-file-earmark-text::before { content: "\f38b"; } +.bi-file-earmark-word-fill::before { content: "\f38c"; } +.bi-file-earmark-word::before { content: "\f38d"; } +.bi-file-earmark-x-fill::before { content: "\f38e"; } +.bi-file-earmark-x::before { content: "\f38f"; } +.bi-file-earmark-zip-fill::before { content: "\f390"; } +.bi-file-earmark-zip::before { content: "\f391"; } +.bi-file-earmark::before { content: "\f392"; } +.bi-file-easel-fill::before { content: "\f393"; } +.bi-file-easel::before { content: "\f394"; } +.bi-file-excel-fill::before { content: "\f395"; } +.bi-file-excel::before { content: "\f396"; } +.bi-file-fill::before { content: "\f397"; } +.bi-file-font-fill::before { content: "\f398"; } +.bi-file-font::before { content: "\f399"; } +.bi-file-image-fill::before { content: "\f39a"; } +.bi-file-image::before { content: "\f39b"; } +.bi-file-lock-fill::before { content: "\f39c"; } +.bi-file-lock::before { content: "\f39d"; } +.bi-file-lock2-fill::before { content: "\f39e"; } +.bi-file-lock2::before { content: "\f39f"; } +.bi-file-medical-fill::before { content: "\f3a0"; } +.bi-file-medical::before { content: "\f3a1"; } +.bi-file-minus-fill::before { content: "\f3a2"; } +.bi-file-minus::before { content: "\f3a3"; } +.bi-file-music-fill::before { content: "\f3a4"; } +.bi-file-music::before { content: "\f3a5"; } +.bi-file-person-fill::before { content: "\f3a6"; } +.bi-file-person::before { content: "\f3a7"; } +.bi-file-play-fill::before { content: "\f3a8"; } +.bi-file-play::before { content: "\f3a9"; } +.bi-file-plus-fill::before { content: "\f3aa"; } +.bi-file-plus::before { content: "\f3ab"; } +.bi-file-post-fill::before { content: "\f3ac"; } +.bi-file-post::before { content: "\f3ad"; } +.bi-file-ppt-fill::before { content: "\f3ae"; } +.bi-file-ppt::before { content: "\f3af"; } +.bi-file-richtext-fill::before { content: "\f3b0"; } +.bi-file-richtext::before { content: "\f3b1"; } +.bi-file-ruled-fill::before { content: "\f3b2"; } +.bi-file-ruled::before { content: "\f3b3"; } +.bi-file-slides-fill::before { content: "\f3b4"; } +.bi-file-slides::before { content: "\f3b5"; } +.bi-file-spreadsheet-fill::before { content: "\f3b6"; } +.bi-file-spreadsheet::before { content: "\f3b7"; } +.bi-file-text-fill::before { content: "\f3b8"; } +.bi-file-text::before { content: "\f3b9"; } +.bi-file-word-fill::before { content: "\f3ba"; } +.bi-file-word::before { content: "\f3bb"; } +.bi-file-x-fill::before { content: "\f3bc"; } +.bi-file-x::before { content: "\f3bd"; } +.bi-file-zip-fill::before { content: "\f3be"; } +.bi-file-zip::before { content: "\f3bf"; } +.bi-file::before { content: "\f3c0"; } +.bi-files-alt::before { content: "\f3c1"; } +.bi-files::before { content: "\f3c2"; } +.bi-film::before { content: "\f3c3"; } +.bi-filter-circle-fill::before { content: "\f3c4"; } +.bi-filter-circle::before { content: "\f3c5"; } +.bi-filter-left::before { content: "\f3c6"; } +.bi-filter-right::before { content: "\f3c7"; } +.bi-filter-square-fill::before { content: "\f3c8"; } +.bi-filter-square::before { content: "\f3c9"; } +.bi-filter::before { content: "\f3ca"; } +.bi-flag-fill::before { content: "\f3cb"; } +.bi-flag::before { content: "\f3cc"; } +.bi-flower1::before { content: "\f3cd"; } +.bi-flower2::before { content: "\f3ce"; } +.bi-flower3::before { content: "\f3cf"; } +.bi-folder-check::before { content: "\f3d0"; } +.bi-folder-fill::before { content: "\f3d1"; } +.bi-folder-minus::before { content: "\f3d2"; } +.bi-folder-plus::before { content: "\f3d3"; } +.bi-folder-symlink-fill::before { content: "\f3d4"; } +.bi-folder-symlink::before { content: "\f3d5"; } +.bi-folder-x::before { content: "\f3d6"; } +.bi-folder::before { content: "\f3d7"; } +.bi-folder2-open::before { content: "\f3d8"; } +.bi-folder2::before { content: "\f3d9"; } +.bi-fonts::before { content: "\f3da"; } +.bi-forward-fill::before { content: "\f3db"; } +.bi-forward::before { content: "\f3dc"; } +.bi-front::before { content: "\f3dd"; } +.bi-fullscreen-exit::before { content: "\f3de"; } +.bi-fullscreen::before { content: "\f3df"; } +.bi-funnel-fill::before { content: "\f3e0"; } +.bi-funnel::before { content: "\f3e1"; } +.bi-gear-fill::before { content: "\f3e2"; } +.bi-gear-wide-connected::before { content: "\f3e3"; } +.bi-gear-wide::before { content: "\f3e4"; } +.bi-gear::before { content: "\f3e5"; } +.bi-gem::before { content: "\f3e6"; } +.bi-geo-alt-fill::before { content: "\f3e7"; } +.bi-geo-alt::before { content: "\f3e8"; } +.bi-geo-fill::before { content: "\f3e9"; } +.bi-geo::before { content: "\f3ea"; } +.bi-gift-fill::before { content: "\f3eb"; } +.bi-gift::before { content: "\f3ec"; } +.bi-github::before { content: "\f3ed"; } +.bi-globe::before { content: "\f3ee"; } +.bi-globe2::before { content: "\f3ef"; } +.bi-google::before { content: "\f3f0"; } +.bi-graph-down::before { content: "\f3f1"; } +.bi-graph-up::before { content: "\f3f2"; } +.bi-grid-1x2-fill::before { content: "\f3f3"; } +.bi-grid-1x2::before { content: "\f3f4"; } +.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } +.bi-grid-3x2-gap::before { content: "\f3f6"; } +.bi-grid-3x2::before { content: "\f3f7"; } +.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } +.bi-grid-3x3-gap::before { content: "\f3f9"; } +.bi-grid-3x3::before { content: "\f3fa"; } +.bi-grid-fill::before { content: "\f3fb"; } +.bi-grid::before { content: "\f3fc"; } +.bi-grip-horizontal::before { content: "\f3fd"; } +.bi-grip-vertical::before { content: "\f3fe"; } +.bi-hammer::before { content: "\f3ff"; } +.bi-hand-index-fill::before { content: "\f400"; } +.bi-hand-index-thumb-fill::before { content: "\f401"; } +.bi-hand-index-thumb::before { content: "\f402"; } +.bi-hand-index::before { content: "\f403"; } +.bi-hand-thumbs-down-fill::before { content: "\f404"; } +.bi-hand-thumbs-down::before { content: "\f405"; } +.bi-hand-thumbs-up-fill::before { content: "\f406"; } +.bi-hand-thumbs-up::before { content: "\f407"; } +.bi-handbag-fill::before { content: "\f408"; } +.bi-handbag::before { content: "\f409"; } +.bi-hash::before { content: "\f40a"; } +.bi-hdd-fill::before { content: "\f40b"; } +.bi-hdd-network-fill::before { content: "\f40c"; } +.bi-hdd-network::before { content: "\f40d"; } +.bi-hdd-rack-fill::before { content: "\f40e"; } +.bi-hdd-rack::before { content: "\f40f"; } +.bi-hdd-stack-fill::before { content: "\f410"; } +.bi-hdd-stack::before { content: "\f411"; } +.bi-hdd::before { content: "\f412"; } +.bi-headphones::before { content: "\f413"; } +.bi-headset::before { content: "\f414"; } +.bi-heart-fill::before { content: "\f415"; } +.bi-heart-half::before { content: "\f416"; } +.bi-heart::before { content: "\f417"; } +.bi-heptagon-fill::before { content: "\f418"; } +.bi-heptagon-half::before { content: "\f419"; } +.bi-heptagon::before { content: "\f41a"; } +.bi-hexagon-fill::before { content: "\f41b"; } +.bi-hexagon-half::before { content: "\f41c"; } +.bi-hexagon::before { content: "\f41d"; } +.bi-hourglass-bottom::before { content: "\f41e"; } +.bi-hourglass-split::before { content: "\f41f"; } +.bi-hourglass-top::before { content: "\f420"; } +.bi-hourglass::before { content: "\f421"; } +.bi-house-door-fill::before { content: "\f422"; } +.bi-house-door::before { content: "\f423"; } +.bi-house-fill::before { content: "\f424"; } +.bi-house::before { content: "\f425"; } +.bi-hr::before { content: "\f426"; } +.bi-hurricane::before { content: "\f427"; } +.bi-image-alt::before { content: "\f428"; } +.bi-image-fill::before { content: "\f429"; } +.bi-image::before { content: "\f42a"; } +.bi-images::before { content: "\f42b"; } +.bi-inbox-fill::before { content: "\f42c"; } +.bi-inbox::before { content: "\f42d"; } +.bi-inboxes-fill::before { content: "\f42e"; } +.bi-inboxes::before { content: "\f42f"; } +.bi-info-circle-fill::before { content: "\f430"; } +.bi-info-circle::before { content: "\f431"; } +.bi-info-square-fill::before { content: "\f432"; } +.bi-info-square::before { content: "\f433"; } +.bi-info::before { content: "\f434"; } +.bi-input-cursor-text::before { content: "\f435"; } +.bi-input-cursor::before { content: "\f436"; } +.bi-instagram::before { content: "\f437"; } +.bi-intersect::before { content: "\f438"; } +.bi-journal-album::before { content: "\f439"; } +.bi-journal-arrow-down::before { content: "\f43a"; } +.bi-journal-arrow-up::before { content: "\f43b"; } +.bi-journal-bookmark-fill::before { content: "\f43c"; } +.bi-journal-bookmark::before { content: "\f43d"; } +.bi-journal-check::before { content: "\f43e"; } +.bi-journal-code::before { content: "\f43f"; } +.bi-journal-medical::before { content: "\f440"; } +.bi-journal-minus::before { content: "\f441"; } +.bi-journal-plus::before { content: "\f442"; } +.bi-journal-richtext::before { content: "\f443"; } +.bi-journal-text::before { content: "\f444"; } +.bi-journal-x::before { content: "\f445"; } +.bi-journal::before { content: "\f446"; } +.bi-journals::before { content: "\f447"; } +.bi-joystick::before { content: "\f448"; } +.bi-justify-left::before { content: "\f449"; } +.bi-justify-right::before { content: "\f44a"; } +.bi-justify::before { content: "\f44b"; } +.bi-kanban-fill::before { content: "\f44c"; } +.bi-kanban::before { content: "\f44d"; } +.bi-key-fill::before { content: "\f44e"; } +.bi-key::before { content: "\f44f"; } +.bi-keyboard-fill::before { content: "\f450"; } +.bi-keyboard::before { content: "\f451"; } +.bi-ladder::before { content: "\f452"; } +.bi-lamp-fill::before { content: "\f453"; } +.bi-lamp::before { content: "\f454"; } +.bi-laptop-fill::before { content: "\f455"; } +.bi-laptop::before { content: "\f456"; } +.bi-layer-backward::before { content: "\f457"; } +.bi-layer-forward::before { content: "\f458"; } +.bi-layers-fill::before { content: "\f459"; } +.bi-layers-half::before { content: "\f45a"; } +.bi-layers::before { content: "\f45b"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } +.bi-layout-sidebar-inset::before { content: "\f45d"; } +.bi-layout-sidebar-reverse::before { content: "\f45e"; } +.bi-layout-sidebar::before { content: "\f45f"; } +.bi-layout-split::before { content: "\f460"; } +.bi-layout-text-sidebar-reverse::before { content: "\f461"; } +.bi-layout-text-sidebar::before { content: "\f462"; } +.bi-layout-text-window-reverse::before { content: "\f463"; } +.bi-layout-text-window::before { content: "\f464"; } +.bi-layout-three-columns::before { content: "\f465"; } +.bi-layout-wtf::before { content: "\f466"; } +.bi-life-preserver::before { content: "\f467"; } +.bi-lightbulb-fill::before { content: "\f468"; } +.bi-lightbulb-off-fill::before { content: "\f469"; } +.bi-lightbulb-off::before { content: "\f46a"; } +.bi-lightbulb::before { content: "\f46b"; } +.bi-lightning-charge-fill::before { content: "\f46c"; } +.bi-lightning-charge::before { content: "\f46d"; } +.bi-lightning-fill::before { content: "\f46e"; } +.bi-lightning::before { content: "\f46f"; } +.bi-link-45deg::before { content: "\f470"; } +.bi-link::before { content: "\f471"; } +.bi-linkedin::before { content: "\f472"; } +.bi-list-check::before { content: "\f473"; } +.bi-list-nested::before { content: "\f474"; } +.bi-list-ol::before { content: "\f475"; } +.bi-list-stars::before { content: "\f476"; } +.bi-list-task::before { content: "\f477"; } +.bi-list-ul::before { content: "\f478"; } +.bi-list::before { content: "\f479"; } +.bi-lock-fill::before { content: "\f47a"; } +.bi-lock::before { content: "\f47b"; } +.bi-mailbox::before { content: "\f47c"; } +.bi-mailbox2::before { content: "\f47d"; } +.bi-map-fill::before { content: "\f47e"; } +.bi-map::before { content: "\f47f"; } +.bi-markdown-fill::before { content: "\f480"; } +.bi-markdown::before { content: "\f481"; } +.bi-mask::before { content: "\f482"; } +.bi-megaphone-fill::before { content: "\f483"; } +.bi-megaphone::before { content: "\f484"; } +.bi-menu-app-fill::before { content: "\f485"; } +.bi-menu-app::before { content: "\f486"; } +.bi-menu-button-fill::before { content: "\f487"; } +.bi-menu-button-wide-fill::before { content: "\f488"; } +.bi-menu-button-wide::before { content: "\f489"; } +.bi-menu-button::before { content: "\f48a"; } +.bi-menu-down::before { content: "\f48b"; } +.bi-menu-up::before { content: "\f48c"; } +.bi-mic-fill::before { content: "\f48d"; } +.bi-mic-mute-fill::before { content: "\f48e"; } +.bi-mic-mute::before { content: "\f48f"; } +.bi-mic::before { content: "\f490"; } +.bi-minecart-loaded::before { content: "\f491"; } +.bi-minecart::before { content: "\f492"; } +.bi-moisture::before { content: "\f493"; } +.bi-moon-fill::before { content: "\f494"; } +.bi-moon-stars-fill::before { content: "\f495"; } +.bi-moon-stars::before { content: "\f496"; } +.bi-moon::before { content: "\f497"; } +.bi-mouse-fill::before { content: "\f498"; } +.bi-mouse::before { content: "\f499"; } +.bi-mouse2-fill::before { content: "\f49a"; } +.bi-mouse2::before { content: "\f49b"; } +.bi-mouse3-fill::before { content: "\f49c"; } +.bi-mouse3::before { content: "\f49d"; } +.bi-music-note-beamed::before { content: "\f49e"; } +.bi-music-note-list::before { content: "\f49f"; } +.bi-music-note::before { content: "\f4a0"; } +.bi-music-player-fill::before { content: "\f4a1"; } +.bi-music-player::before { content: "\f4a2"; } +.bi-newspaper::before { content: "\f4a3"; } +.bi-node-minus-fill::before { content: "\f4a4"; } +.bi-node-minus::before { content: "\f4a5"; } +.bi-node-plus-fill::before { content: "\f4a6"; } +.bi-node-plus::before { content: "\f4a7"; } +.bi-nut-fill::before { content: "\f4a8"; } +.bi-nut::before { content: "\f4a9"; } +.bi-octagon-fill::before { content: "\f4aa"; } +.bi-octagon-half::before { content: "\f4ab"; } +.bi-octagon::before { content: "\f4ac"; } +.bi-option::before { content: "\f4ad"; } +.bi-outlet::before { content: "\f4ae"; } +.bi-paint-bucket::before { content: "\f4af"; } +.bi-palette-fill::before { content: "\f4b0"; } +.bi-palette::before { content: "\f4b1"; } +.bi-palette2::before { content: "\f4b2"; } +.bi-paperclip::before { content: "\f4b3"; } +.bi-paragraph::before { content: "\f4b4"; } +.bi-patch-check-fill::before { content: "\f4b5"; } +.bi-patch-check::before { content: "\f4b6"; } +.bi-patch-exclamation-fill::before { content: "\f4b7"; } +.bi-patch-exclamation::before { content: "\f4b8"; } +.bi-patch-minus-fill::before { content: "\f4b9"; } +.bi-patch-minus::before { content: "\f4ba"; } +.bi-patch-plus-fill::before { content: "\f4bb"; } +.bi-patch-plus::before { content: "\f4bc"; } +.bi-patch-question-fill::before { content: "\f4bd"; } +.bi-patch-question::before { content: "\f4be"; } +.bi-pause-btn-fill::before { content: "\f4bf"; } +.bi-pause-btn::before { content: "\f4c0"; } +.bi-pause-circle-fill::before { content: "\f4c1"; } +.bi-pause-circle::before { content: "\f4c2"; } +.bi-pause-fill::before { content: "\f4c3"; } +.bi-pause::before { content: "\f4c4"; } +.bi-peace-fill::before { content: "\f4c5"; } +.bi-peace::before { content: "\f4c6"; } +.bi-pen-fill::before { content: "\f4c7"; } +.bi-pen::before { content: "\f4c8"; } +.bi-pencil-fill::before { content: "\f4c9"; } +.bi-pencil-square::before { content: "\f4ca"; } +.bi-pencil::before { content: "\f4cb"; } +.bi-pentagon-fill::before { content: "\f4cc"; } +.bi-pentagon-half::before { content: "\f4cd"; } +.bi-pentagon::before { content: "\f4ce"; } +.bi-people-fill::before { content: "\f4cf"; } +.bi-people::before { content: "\f4d0"; } +.bi-percent::before { content: "\f4d1"; } +.bi-person-badge-fill::before { content: "\f4d2"; } +.bi-person-badge::before { content: "\f4d3"; } +.bi-person-bounding-box::before { content: "\f4d4"; } +.bi-person-check-fill::before { content: "\f4d5"; } +.bi-person-check::before { content: "\f4d6"; } +.bi-person-circle::before { content: "\f4d7"; } +.bi-person-dash-fill::before { content: "\f4d8"; } +.bi-person-dash::before { content: "\f4d9"; } +.bi-person-fill::before { content: "\f4da"; } +.bi-person-lines-fill::before { content: "\f4db"; } +.bi-person-plus-fill::before { content: "\f4dc"; } +.bi-person-plus::before { content: "\f4dd"; } +.bi-person-square::before { content: "\f4de"; } +.bi-person-x-fill::before { content: "\f4df"; } +.bi-person-x::before { content: "\f4e0"; } +.bi-person::before { content: "\f4e1"; } +.bi-phone-fill::before { content: "\f4e2"; } +.bi-phone-landscape-fill::before { content: "\f4e3"; } +.bi-phone-landscape::before { content: "\f4e4"; } +.bi-phone-vibrate-fill::before { content: "\f4e5"; } +.bi-phone-vibrate::before { content: "\f4e6"; } +.bi-phone::before { content: "\f4e7"; } +.bi-pie-chart-fill::before { content: "\f4e8"; } +.bi-pie-chart::before { content: "\f4e9"; } +.bi-pin-angle-fill::before { content: "\f4ea"; } +.bi-pin-angle::before { content: "\f4eb"; } +.bi-pin-fill::before { content: "\f4ec"; } +.bi-pin::before { content: "\f4ed"; } +.bi-pip-fill::before { content: "\f4ee"; } +.bi-pip::before { content: "\f4ef"; } +.bi-play-btn-fill::before { content: "\f4f0"; } +.bi-play-btn::before { content: "\f4f1"; } +.bi-play-circle-fill::before { content: "\f4f2"; } +.bi-play-circle::before { content: "\f4f3"; } +.bi-play-fill::before { content: "\f4f4"; } +.bi-play::before { content: "\f4f5"; } +.bi-plug-fill::before { content: "\f4f6"; } +.bi-plug::before { content: "\f4f7"; } +.bi-plus-circle-dotted::before { content: "\f4f8"; } +.bi-plus-circle-fill::before { content: "\f4f9"; } +.bi-plus-circle::before { content: "\f4fa"; } +.bi-plus-square-dotted::before { content: "\f4fb"; } +.bi-plus-square-fill::before { content: "\f4fc"; } +.bi-plus-square::before { content: "\f4fd"; } +.bi-plus::before { content: "\f4fe"; } +.bi-power::before { content: "\f4ff"; } +.bi-printer-fill::before { content: "\f500"; } +.bi-printer::before { content: "\f501"; } +.bi-puzzle-fill::before { content: "\f502"; } +.bi-puzzle::before { content: "\f503"; } +.bi-question-circle-fill::before { content: "\f504"; } +.bi-question-circle::before { content: "\f505"; } +.bi-question-diamond-fill::before { content: "\f506"; } +.bi-question-diamond::before { content: "\f507"; } +.bi-question-octagon-fill::before { content: "\f508"; } +.bi-question-octagon::before { content: "\f509"; } +.bi-question-square-fill::before { content: "\f50a"; } +.bi-question-square::before { content: "\f50b"; } +.bi-question::before { content: "\f50c"; } +.bi-rainbow::before { content: "\f50d"; } +.bi-receipt-cutoff::before { content: "\f50e"; } +.bi-receipt::before { content: "\f50f"; } +.bi-reception-0::before { content: "\f510"; } +.bi-reception-1::before { content: "\f511"; } +.bi-reception-2::before { content: "\f512"; } +.bi-reception-3::before { content: "\f513"; } +.bi-reception-4::before { content: "\f514"; } +.bi-record-btn-fill::before { content: "\f515"; } +.bi-record-btn::before { content: "\f516"; } +.bi-record-circle-fill::before { content: "\f517"; } +.bi-record-circle::before { content: "\f518"; } +.bi-record-fill::before { content: "\f519"; } +.bi-record::before { content: "\f51a"; } +.bi-record2-fill::before { content: "\f51b"; } +.bi-record2::before { content: "\f51c"; } +.bi-reply-all-fill::before { content: "\f51d"; } +.bi-reply-all::before { content: "\f51e"; } +.bi-reply-fill::before { content: "\f51f"; } +.bi-reply::before { content: "\f520"; } +.bi-rss-fill::before { content: "\f521"; } +.bi-rss::before { content: "\f522"; } +.bi-rulers::before { content: "\f523"; } +.bi-save-fill::before { content: "\f524"; } +.bi-save::before { content: "\f525"; } +.bi-save2-fill::before { content: "\f526"; } +.bi-save2::before { content: "\f527"; } +.bi-scissors::before { content: "\f528"; } +.bi-screwdriver::before { content: "\f529"; } +.bi-search::before { content: "\f52a"; } +.bi-segmented-nav::before { content: "\f52b"; } +.bi-server::before { content: "\f52c"; } +.bi-share-fill::before { content: "\f52d"; } +.bi-share::before { content: "\f52e"; } +.bi-shield-check::before { content: "\f52f"; } +.bi-shield-exclamation::before { content: "\f530"; } +.bi-shield-fill-check::before { content: "\f531"; } +.bi-shield-fill-exclamation::before { content: "\f532"; } +.bi-shield-fill-minus::before { content: "\f533"; } +.bi-shield-fill-plus::before { content: "\f534"; } +.bi-shield-fill-x::before { content: "\f535"; } +.bi-shield-fill::before { content: "\f536"; } +.bi-shield-lock-fill::before { content: "\f537"; } +.bi-shield-lock::before { content: "\f538"; } +.bi-shield-minus::before { content: "\f539"; } +.bi-shield-plus::before { content: "\f53a"; } +.bi-shield-shaded::before { content: "\f53b"; } +.bi-shield-slash-fill::before { content: "\f53c"; } +.bi-shield-slash::before { content: "\f53d"; } +.bi-shield-x::before { content: "\f53e"; } +.bi-shield::before { content: "\f53f"; } +.bi-shift-fill::before { content: "\f540"; } +.bi-shift::before { content: "\f541"; } +.bi-shop-window::before { content: "\f542"; } +.bi-shop::before { content: "\f543"; } +.bi-shuffle::before { content: "\f544"; } +.bi-signpost-2-fill::before { content: "\f545"; } +.bi-signpost-2::before { content: "\f546"; } +.bi-signpost-fill::before { content: "\f547"; } +.bi-signpost-split-fill::before { content: "\f548"; } +.bi-signpost-split::before { content: "\f549"; } +.bi-signpost::before { content: "\f54a"; } +.bi-sim-fill::before { content: "\f54b"; } +.bi-sim::before { content: "\f54c"; } +.bi-skip-backward-btn-fill::before { content: "\f54d"; } +.bi-skip-backward-btn::before { content: "\f54e"; } +.bi-skip-backward-circle-fill::before { content: "\f54f"; } +.bi-skip-backward-circle::before { content: "\f550"; } +.bi-skip-backward-fill::before { content: "\f551"; } +.bi-skip-backward::before { content: "\f552"; } +.bi-skip-end-btn-fill::before { content: "\f553"; } +.bi-skip-end-btn::before { content: "\f554"; } +.bi-skip-end-circle-fill::before { content: "\f555"; } +.bi-skip-end-circle::before { content: "\f556"; } +.bi-skip-end-fill::before { content: "\f557"; } +.bi-skip-end::before { content: "\f558"; } +.bi-skip-forward-btn-fill::before { content: "\f559"; } +.bi-skip-forward-btn::before { content: "\f55a"; } +.bi-skip-forward-circle-fill::before { content: "\f55b"; } +.bi-skip-forward-circle::before { content: "\f55c"; } +.bi-skip-forward-fill::before { content: "\f55d"; } +.bi-skip-forward::before { content: "\f55e"; } +.bi-skip-start-btn-fill::before { content: "\f55f"; } +.bi-skip-start-btn::before { content: "\f560"; } +.bi-skip-start-circle-fill::before { content: "\f561"; } +.bi-skip-start-circle::before { content: "\f562"; } +.bi-skip-start-fill::before { content: "\f563"; } +.bi-skip-start::before { content: "\f564"; } +.bi-slack::before { content: "\f565"; } +.bi-slash-circle-fill::before { content: "\f566"; } +.bi-slash-circle::before { content: "\f567"; } +.bi-slash-square-fill::before { content: "\f568"; } +.bi-slash-square::before { content: "\f569"; } +.bi-slash::before { content: "\f56a"; } +.bi-sliders::before { content: "\f56b"; } +.bi-smartwatch::before { content: "\f56c"; } +.bi-snow::before { content: "\f56d"; } +.bi-snow2::before { content: "\f56e"; } +.bi-snow3::before { content: "\f56f"; } +.bi-sort-alpha-down-alt::before { content: "\f570"; } +.bi-sort-alpha-down::before { content: "\f571"; } +.bi-sort-alpha-up-alt::before { content: "\f572"; } +.bi-sort-alpha-up::before { content: "\f573"; } +.bi-sort-down-alt::before { content: "\f574"; } +.bi-sort-down::before { content: "\f575"; } +.bi-sort-numeric-down-alt::before { content: "\f576"; } +.bi-sort-numeric-down::before { content: "\f577"; } +.bi-sort-numeric-up-alt::before { content: "\f578"; } +.bi-sort-numeric-up::before { content: "\f579"; } +.bi-sort-up-alt::before { content: "\f57a"; } +.bi-sort-up::before { content: "\f57b"; } +.bi-soundwave::before { content: "\f57c"; } +.bi-speaker-fill::before { content: "\f57d"; } +.bi-speaker::before { content: "\f57e"; } +.bi-speedometer::before { content: "\f57f"; } +.bi-speedometer2::before { content: "\f580"; } +.bi-spellcheck::before { content: "\f581"; } +.bi-square-fill::before { content: "\f582"; } +.bi-square-half::before { content: "\f583"; } +.bi-square::before { content: "\f584"; } +.bi-stack::before { content: "\f585"; } +.bi-star-fill::before { content: "\f586"; } +.bi-star-half::before { content: "\f587"; } +.bi-star::before { content: "\f588"; } +.bi-stars::before { content: "\f589"; } +.bi-stickies-fill::before { content: "\f58a"; } +.bi-stickies::before { content: "\f58b"; } +.bi-sticky-fill::before { content: "\f58c"; } +.bi-sticky::before { content: "\f58d"; } +.bi-stop-btn-fill::before { content: "\f58e"; } +.bi-stop-btn::before { content: "\f58f"; } +.bi-stop-circle-fill::before { content: "\f590"; } +.bi-stop-circle::before { content: "\f591"; } +.bi-stop-fill::before { content: "\f592"; } +.bi-stop::before { content: "\f593"; } +.bi-stoplights-fill::before { content: "\f594"; } +.bi-stoplights::before { content: "\f595"; } +.bi-stopwatch-fill::before { content: "\f596"; } +.bi-stopwatch::before { content: "\f597"; } +.bi-subtract::before { content: "\f598"; } +.bi-suit-club-fill::before { content: "\f599"; } +.bi-suit-club::before { content: "\f59a"; } +.bi-suit-diamond-fill::before { content: "\f59b"; } +.bi-suit-diamond::before { content: "\f59c"; } +.bi-suit-heart-fill::before { content: "\f59d"; } +.bi-suit-heart::before { content: "\f59e"; } +.bi-suit-spade-fill::before { content: "\f59f"; } +.bi-suit-spade::before { content: "\f5a0"; } +.bi-sun-fill::before { content: "\f5a1"; } +.bi-sun::before { content: "\f5a2"; } +.bi-sunglasses::before { content: "\f5a3"; } +.bi-sunrise-fill::before { content: "\f5a4"; } +.bi-sunrise::before { content: "\f5a5"; } +.bi-sunset-fill::before { content: "\f5a6"; } +.bi-sunset::before { content: "\f5a7"; } +.bi-symmetry-horizontal::before { content: "\f5a8"; } +.bi-symmetry-vertical::before { content: "\f5a9"; } +.bi-table::before { content: "\f5aa"; } +.bi-tablet-fill::before { content: "\f5ab"; } +.bi-tablet-landscape-fill::before { content: "\f5ac"; } +.bi-tablet-landscape::before { content: "\f5ad"; } +.bi-tablet::before { content: "\f5ae"; } +.bi-tag-fill::before { content: "\f5af"; } +.bi-tag::before { content: "\f5b0"; } +.bi-tags-fill::before { content: "\f5b1"; } +.bi-tags::before { content: "\f5b2"; } +.bi-telegram::before { content: "\f5b3"; } +.bi-telephone-fill::before { content: "\f5b4"; } +.bi-telephone-forward-fill::before { content: "\f5b5"; } +.bi-telephone-forward::before { content: "\f5b6"; } +.bi-telephone-inbound-fill::before { content: "\f5b7"; } +.bi-telephone-inbound::before { content: "\f5b8"; } +.bi-telephone-minus-fill::before { content: "\f5b9"; } +.bi-telephone-minus::before { content: "\f5ba"; } +.bi-telephone-outbound-fill::before { content: "\f5bb"; } +.bi-telephone-outbound::before { content: "\f5bc"; } +.bi-telephone-plus-fill::before { content: "\f5bd"; } +.bi-telephone-plus::before { content: "\f5be"; } +.bi-telephone-x-fill::before { content: "\f5bf"; } +.bi-telephone-x::before { content: "\f5c0"; } +.bi-telephone::before { content: "\f5c1"; } +.bi-terminal-fill::before { content: "\f5c2"; } +.bi-terminal::before { content: "\f5c3"; } +.bi-text-center::before { content: "\f5c4"; } +.bi-text-indent-left::before { content: "\f5c5"; } +.bi-text-indent-right::before { content: "\f5c6"; } +.bi-text-left::before { content: "\f5c7"; } +.bi-text-paragraph::before { content: "\f5c8"; } +.bi-text-right::before { content: "\f5c9"; } +.bi-textarea-resize::before { content: "\f5ca"; } +.bi-textarea-t::before { content: "\f5cb"; } +.bi-textarea::before { content: "\f5cc"; } +.bi-thermometer-half::before { content: "\f5cd"; } +.bi-thermometer-high::before { content: "\f5ce"; } +.bi-thermometer-low::before { content: "\f5cf"; } +.bi-thermometer-snow::before { content: "\f5d0"; } +.bi-thermometer-sun::before { content: "\f5d1"; } +.bi-thermometer::before { content: "\f5d2"; } +.bi-three-dots-vertical::before { content: "\f5d3"; } +.bi-three-dots::before { content: "\f5d4"; } +.bi-toggle-off::before { content: "\f5d5"; } +.bi-toggle-on::before { content: "\f5d6"; } +.bi-toggle2-off::before { content: "\f5d7"; } +.bi-toggle2-on::before { content: "\f5d8"; } +.bi-toggles::before { content: "\f5d9"; } +.bi-toggles2::before { content: "\f5da"; } +.bi-tools::before { content: "\f5db"; } +.bi-tornado::before { content: "\f5dc"; } +.bi-trash-fill::before { content: "\f5dd"; } +.bi-trash::before { content: "\f5de"; } +.bi-trash2-fill::before { content: "\f5df"; } +.bi-trash2::before { content: "\f5e0"; } +.bi-tree-fill::before { content: "\f5e1"; } +.bi-tree::before { content: "\f5e2"; } +.bi-triangle-fill::before { content: "\f5e3"; } +.bi-triangle-half::before { content: "\f5e4"; } +.bi-triangle::before { content: "\f5e5"; } +.bi-trophy-fill::before { content: "\f5e6"; } +.bi-trophy::before { content: "\f5e7"; } +.bi-tropical-storm::before { content: "\f5e8"; } +.bi-truck-flatbed::before { content: "\f5e9"; } +.bi-truck::before { content: "\f5ea"; } +.bi-tsunami::before { content: "\f5eb"; } +.bi-tv-fill::before { content: "\f5ec"; } +.bi-tv::before { content: "\f5ed"; } +.bi-twitch::before { content: "\f5ee"; } +.bi-twitter::before { content: "\f5ef"; } +.bi-type-bold::before { content: "\f5f0"; } +.bi-type-h1::before { content: "\f5f1"; } +.bi-type-h2::before { content: "\f5f2"; } +.bi-type-h3::before { content: "\f5f3"; } +.bi-type-italic::before { content: "\f5f4"; } +.bi-type-strikethrough::before { content: "\f5f5"; } +.bi-type-underline::before { content: "\f5f6"; } +.bi-type::before { content: "\f5f7"; } +.bi-ui-checks-grid::before { content: "\f5f8"; } +.bi-ui-checks::before { content: "\f5f9"; } +.bi-ui-radios-grid::before { content: "\f5fa"; } +.bi-ui-radios::before { content: "\f5fb"; } +.bi-umbrella-fill::before { content: "\f5fc"; } +.bi-umbrella::before { content: "\f5fd"; } +.bi-union::before { content: "\f5fe"; } +.bi-unlock-fill::before { content: "\f5ff"; } +.bi-unlock::before { content: "\f600"; } +.bi-upc-scan::before { content: "\f601"; } +.bi-upc::before { content: "\f602"; } +.bi-upload::before { content: "\f603"; } +.bi-vector-pen::before { content: "\f604"; } +.bi-view-list::before { content: "\f605"; } +.bi-view-stacked::before { content: "\f606"; } +.bi-vinyl-fill::before { content: "\f607"; } +.bi-vinyl::before { content: "\f608"; } +.bi-voicemail::before { content: "\f609"; } +.bi-volume-down-fill::before { content: "\f60a"; } +.bi-volume-down::before { content: "\f60b"; } +.bi-volume-mute-fill::before { content: "\f60c"; } +.bi-volume-mute::before { content: "\f60d"; } +.bi-volume-off-fill::before { content: "\f60e"; } +.bi-volume-off::before { content: "\f60f"; } +.bi-volume-up-fill::before { content: "\f610"; } +.bi-volume-up::before { content: "\f611"; } +.bi-vr::before { content: "\f612"; } +.bi-wallet-fill::before { content: "\f613"; } +.bi-wallet::before { content: "\f614"; } +.bi-wallet2::before { content: "\f615"; } +.bi-watch::before { content: "\f616"; } +.bi-water::before { content: "\f617"; } +.bi-whatsapp::before { content: "\f618"; } +.bi-wifi-1::before { content: "\f619"; } +.bi-wifi-2::before { content: "\f61a"; } +.bi-wifi-off::before { content: "\f61b"; } +.bi-wifi::before { content: "\f61c"; } +.bi-wind::before { content: "\f61d"; } +.bi-window-dock::before { content: "\f61e"; } +.bi-window-sidebar::before { content: "\f61f"; } +.bi-window::before { content: "\f620"; } +.bi-wrench::before { content: "\f621"; } +.bi-x-circle-fill::before { content: "\f622"; } +.bi-x-circle::before { content: "\f623"; } +.bi-x-diamond-fill::before { content: "\f624"; } +.bi-x-diamond::before { content: "\f625"; } +.bi-x-octagon-fill::before { content: "\f626"; } +.bi-x-octagon::before { content: "\f627"; } +.bi-x-square-fill::before { content: "\f628"; } +.bi-x-square::before { content: "\f629"; } +.bi-x::before { content: "\f62a"; } +.bi-youtube::before { content: "\f62b"; } +.bi-zoom-in::before { content: "\f62c"; } +.bi-zoom-out::before { content: "\f62d"; } +.bi-bank::before { content: "\f62e"; } +.bi-bank2::before { content: "\f62f"; } +.bi-bell-slash-fill::before { content: "\f630"; } +.bi-bell-slash::before { content: "\f631"; } +.bi-cash-coin::before { content: "\f632"; } +.bi-check-lg::before { content: "\f633"; } +.bi-coin::before { content: "\f634"; } +.bi-currency-bitcoin::before { content: "\f635"; } +.bi-currency-dollar::before { content: "\f636"; } +.bi-currency-euro::before { content: "\f637"; } +.bi-currency-exchange::before { content: "\f638"; } +.bi-currency-pound::before { content: "\f639"; } +.bi-currency-yen::before { content: "\f63a"; } +.bi-dash-lg::before { content: "\f63b"; } +.bi-exclamation-lg::before { content: "\f63c"; } +.bi-file-earmark-pdf-fill::before { content: "\f63d"; } +.bi-file-earmark-pdf::before { content: "\f63e"; } +.bi-file-pdf-fill::before { content: "\f63f"; } +.bi-file-pdf::before { content: "\f640"; } +.bi-gender-ambiguous::before { content: "\f641"; } +.bi-gender-female::before { content: "\f642"; } +.bi-gender-male::before { content: "\f643"; } +.bi-gender-trans::before { content: "\f644"; } +.bi-headset-vr::before { content: "\f645"; } +.bi-info-lg::before { content: "\f646"; } +.bi-mastodon::before { content: "\f647"; } +.bi-messenger::before { content: "\f648"; } +.bi-piggy-bank-fill::before { content: "\f649"; } +.bi-piggy-bank::before { content: "\f64a"; } +.bi-pin-map-fill::before { content: "\f64b"; } +.bi-pin-map::before { content: "\f64c"; } +.bi-plus-lg::before { content: "\f64d"; } +.bi-question-lg::before { content: "\f64e"; } +.bi-recycle::before { content: "\f64f"; } +.bi-reddit::before { content: "\f650"; } +.bi-safe-fill::before { content: "\f651"; } +.bi-safe2-fill::before { content: "\f652"; } +.bi-safe2::before { content: "\f653"; } +.bi-sd-card-fill::before { content: "\f654"; } +.bi-sd-card::before { content: "\f655"; } +.bi-skype::before { content: "\f656"; } +.bi-slash-lg::before { content: "\f657"; } +.bi-translate::before { content: "\f658"; } +.bi-x-lg::before { content: "\f659"; } +.bi-safe::before { content: "\f65a"; } +.bi-apple::before { content: "\f65b"; } +.bi-microsoft::before { content: "\f65d"; } +.bi-windows::before { content: "\f65e"; } +.bi-behance::before { content: "\f65c"; } +.bi-dribbble::before { content: "\f65f"; } +.bi-line::before { content: "\f660"; } +.bi-medium::before { content: "\f661"; } +.bi-paypal::before { content: "\f662"; } +.bi-pinterest::before { content: "\f663"; } +.bi-signal::before { content: "\f664"; } +.bi-snapchat::before { content: "\f665"; } +.bi-spotify::before { content: "\f666"; } +.bi-stack-overflow::before { content: "\f667"; } +.bi-strava::before { content: "\f668"; } +.bi-wordpress::before { content: "\f669"; } +.bi-vimeo::before { content: "\f66a"; } +.bi-activity::before { content: "\f66b"; } +.bi-easel2-fill::before { content: "\f66c"; } +.bi-easel2::before { content: "\f66d"; } +.bi-easel3-fill::before { content: "\f66e"; } +.bi-easel3::before { content: "\f66f"; } +.bi-fan::before { content: "\f670"; } +.bi-fingerprint::before { content: "\f671"; } +.bi-graph-down-arrow::before { content: "\f672"; } +.bi-graph-up-arrow::before { content: "\f673"; } +.bi-hypnotize::before { content: "\f674"; } +.bi-magic::before { content: "\f675"; } +.bi-person-rolodex::before { content: "\f676"; } +.bi-person-video::before { content: "\f677"; } +.bi-person-video2::before { content: "\f678"; } +.bi-person-video3::before { content: "\f679"; } +.bi-person-workspace::before { content: "\f67a"; } +.bi-radioactive::before { content: "\f67b"; } +.bi-webcam-fill::before { content: "\f67c"; } +.bi-webcam::before { content: "\f67d"; } +.bi-yin-yang::before { content: "\f67e"; } +.bi-bandaid-fill::before { content: "\f680"; } +.bi-bandaid::before { content: "\f681"; } +.bi-bluetooth::before { content: "\f682"; } +.bi-body-text::before { content: "\f683"; } +.bi-boombox::before { content: "\f684"; } +.bi-boxes::before { content: "\f685"; } +.bi-dpad-fill::before { content: "\f686"; } +.bi-dpad::before { content: "\f687"; } +.bi-ear-fill::before { content: "\f688"; } +.bi-ear::before { content: "\f689"; } +.bi-envelope-check-fill::before { content: "\f68b"; } +.bi-envelope-check::before { content: "\f68c"; } +.bi-envelope-dash-fill::before { content: "\f68e"; } +.bi-envelope-dash::before { content: "\f68f"; } +.bi-envelope-exclamation-fill::before { content: "\f691"; } +.bi-envelope-exclamation::before { content: "\f692"; } +.bi-envelope-plus-fill::before { content: "\f693"; } +.bi-envelope-plus::before { content: "\f694"; } +.bi-envelope-slash-fill::before { content: "\f696"; } +.bi-envelope-slash::before { content: "\f697"; } +.bi-envelope-x-fill::before { content: "\f699"; } +.bi-envelope-x::before { content: "\f69a"; } +.bi-explicit-fill::before { content: "\f69b"; } +.bi-explicit::before { content: "\f69c"; } +.bi-git::before { content: "\f69d"; } +.bi-infinity::before { content: "\f69e"; } +.bi-list-columns-reverse::before { content: "\f69f"; } +.bi-list-columns::before { content: "\f6a0"; } +.bi-meta::before { content: "\f6a1"; } +.bi-nintendo-switch::before { content: "\f6a4"; } +.bi-pc-display-horizontal::before { content: "\f6a5"; } +.bi-pc-display::before { content: "\f6a6"; } +.bi-pc-horizontal::before { content: "\f6a7"; } +.bi-pc::before { content: "\f6a8"; } +.bi-playstation::before { content: "\f6a9"; } +.bi-plus-slash-minus::before { content: "\f6aa"; } +.bi-projector-fill::before { content: "\f6ab"; } +.bi-projector::before { content: "\f6ac"; } +.bi-qr-code-scan::before { content: "\f6ad"; } +.bi-qr-code::before { content: "\f6ae"; } +.bi-quora::before { content: "\f6af"; } +.bi-quote::before { content: "\f6b0"; } +.bi-robot::before { content: "\f6b1"; } +.bi-send-check-fill::before { content: "\f6b2"; } +.bi-send-check::before { content: "\f6b3"; } +.bi-send-dash-fill::before { content: "\f6b4"; } +.bi-send-dash::before { content: "\f6b5"; } +.bi-send-exclamation-fill::before { content: "\f6b7"; } +.bi-send-exclamation::before { content: "\f6b8"; } +.bi-send-fill::before { content: "\f6b9"; } +.bi-send-plus-fill::before { content: "\f6ba"; } +.bi-send-plus::before { content: "\f6bb"; } +.bi-send-slash-fill::before { content: "\f6bc"; } +.bi-send-slash::before { content: "\f6bd"; } +.bi-send-x-fill::before { content: "\f6be"; } +.bi-send-x::before { content: "\f6bf"; } +.bi-send::before { content: "\f6c0"; } +.bi-steam::before { content: "\f6c1"; } +.bi-terminal-dash::before { content: "\f6c3"; } +.bi-terminal-plus::before { content: "\f6c4"; } +.bi-terminal-split::before { content: "\f6c5"; } +.bi-ticket-detailed-fill::before { content: "\f6c6"; } +.bi-ticket-detailed::before { content: "\f6c7"; } +.bi-ticket-fill::before { content: "\f6c8"; } +.bi-ticket-perforated-fill::before { content: "\f6c9"; } +.bi-ticket-perforated::before { content: "\f6ca"; } +.bi-ticket::before { content: "\f6cb"; } +.bi-tiktok::before { content: "\f6cc"; } +.bi-window-dash::before { content: "\f6cd"; } +.bi-window-desktop::before { content: "\f6ce"; } +.bi-window-fullscreen::before { content: "\f6cf"; } +.bi-window-plus::before { content: "\f6d0"; } +.bi-window-split::before { content: "\f6d1"; } +.bi-window-stack::before { content: "\f6d2"; } +.bi-window-x::before { content: "\f6d3"; } +.bi-xbox::before { content: "\f6d4"; } +.bi-ethernet::before { content: "\f6d5"; } +.bi-hdmi-fill::before { content: "\f6d6"; } +.bi-hdmi::before { content: "\f6d7"; } +.bi-usb-c-fill::before { content: "\f6d8"; } +.bi-usb-c::before { content: "\f6d9"; } +.bi-usb-fill::before { content: "\f6da"; } +.bi-usb-plug-fill::before { content: "\f6db"; } +.bi-usb-plug::before { content: "\f6dc"; } +.bi-usb-symbol::before { content: "\f6dd"; } +.bi-usb::before { content: "\f6de"; } +.bi-boombox-fill::before { content: "\f6df"; } +.bi-displayport::before { content: "\f6e1"; } +.bi-gpu-card::before { content: "\f6e2"; } +.bi-memory::before { content: "\f6e3"; } +.bi-modem-fill::before { content: "\f6e4"; } +.bi-modem::before { content: "\f6e5"; } +.bi-motherboard-fill::before { content: "\f6e6"; } +.bi-motherboard::before { content: "\f6e7"; } +.bi-optical-audio-fill::before { content: "\f6e8"; } +.bi-optical-audio::before { content: "\f6e9"; } +.bi-pci-card::before { content: "\f6ea"; } +.bi-router-fill::before { content: "\f6eb"; } +.bi-router::before { content: "\f6ec"; } +.bi-thunderbolt-fill::before { content: "\f6ef"; } +.bi-thunderbolt::before { content: "\f6f0"; } +.bi-usb-drive-fill::before { content: "\f6f1"; } +.bi-usb-drive::before { content: "\f6f2"; } +.bi-usb-micro-fill::before { content: "\f6f3"; } +.bi-usb-micro::before { content: "\f6f4"; } +.bi-usb-mini-fill::before { content: "\f6f5"; } +.bi-usb-mini::before { content: "\f6f6"; } +.bi-cloud-haze2::before { content: "\f6f7"; } +.bi-device-hdd-fill::before { content: "\f6f8"; } +.bi-device-hdd::before { content: "\f6f9"; } +.bi-device-ssd-fill::before { content: "\f6fa"; } +.bi-device-ssd::before { content: "\f6fb"; } +.bi-displayport-fill::before { content: "\f6fc"; } +.bi-mortarboard-fill::before { content: "\f6fd"; } +.bi-mortarboard::before { content: "\f6fe"; } +.bi-terminal-x::before { content: "\f6ff"; } +.bi-arrow-through-heart-fill::before { content: "\f700"; } +.bi-arrow-through-heart::before { content: "\f701"; } +.bi-badge-sd-fill::before { content: "\f702"; } +.bi-badge-sd::before { content: "\f703"; } +.bi-bag-heart-fill::before { content: "\f704"; } +.bi-bag-heart::before { content: "\f705"; } +.bi-balloon-fill::before { content: "\f706"; } +.bi-balloon-heart-fill::before { content: "\f707"; } +.bi-balloon-heart::before { content: "\f708"; } +.bi-balloon::before { content: "\f709"; } +.bi-box2-fill::before { content: "\f70a"; } +.bi-box2-heart-fill::before { content: "\f70b"; } +.bi-box2-heart::before { content: "\f70c"; } +.bi-box2::before { content: "\f70d"; } +.bi-braces-asterisk::before { content: "\f70e"; } +.bi-calendar-heart-fill::before { content: "\f70f"; } +.bi-calendar-heart::before { content: "\f710"; } +.bi-calendar2-heart-fill::before { content: "\f711"; } +.bi-calendar2-heart::before { content: "\f712"; } +.bi-chat-heart-fill::before { content: "\f713"; } +.bi-chat-heart::before { content: "\f714"; } +.bi-chat-left-heart-fill::before { content: "\f715"; } +.bi-chat-left-heart::before { content: "\f716"; } +.bi-chat-right-heart-fill::before { content: "\f717"; } +.bi-chat-right-heart::before { content: "\f718"; } +.bi-chat-square-heart-fill::before { content: "\f719"; } +.bi-chat-square-heart::before { content: "\f71a"; } +.bi-clipboard-check-fill::before { content: "\f71b"; } +.bi-clipboard-data-fill::before { content: "\f71c"; } +.bi-clipboard-fill::before { content: "\f71d"; } +.bi-clipboard-heart-fill::before { content: "\f71e"; } +.bi-clipboard-heart::before { content: "\f71f"; } +.bi-clipboard-minus-fill::before { content: "\f720"; } +.bi-clipboard-plus-fill::before { content: "\f721"; } +.bi-clipboard-pulse::before { content: "\f722"; } +.bi-clipboard-x-fill::before { content: "\f723"; } +.bi-clipboard2-check-fill::before { content: "\f724"; } +.bi-clipboard2-check::before { content: "\f725"; } +.bi-clipboard2-data-fill::before { content: "\f726"; } +.bi-clipboard2-data::before { content: "\f727"; } +.bi-clipboard2-fill::before { content: "\f728"; } +.bi-clipboard2-heart-fill::before { content: "\f729"; } +.bi-clipboard2-heart::before { content: "\f72a"; } +.bi-clipboard2-minus-fill::before { content: "\f72b"; } +.bi-clipboard2-minus::before { content: "\f72c"; } +.bi-clipboard2-plus-fill::before { content: "\f72d"; } +.bi-clipboard2-plus::before { content: "\f72e"; } +.bi-clipboard2-pulse-fill::before { content: "\f72f"; } +.bi-clipboard2-pulse::before { content: "\f730"; } +.bi-clipboard2-x-fill::before { content: "\f731"; } +.bi-clipboard2-x::before { content: "\f732"; } +.bi-clipboard2::before { content: "\f733"; } +.bi-emoji-kiss-fill::before { content: "\f734"; } +.bi-emoji-kiss::before { content: "\f735"; } +.bi-envelope-heart-fill::before { content: "\f736"; } +.bi-envelope-heart::before { content: "\f737"; } +.bi-envelope-open-heart-fill::before { content: "\f738"; } +.bi-envelope-open-heart::before { content: "\f739"; } +.bi-envelope-paper-fill::before { content: "\f73a"; } +.bi-envelope-paper-heart-fill::before { content: "\f73b"; } +.bi-envelope-paper-heart::before { content: "\f73c"; } +.bi-envelope-paper::before { content: "\f73d"; } +.bi-filetype-aac::before { content: "\f73e"; } +.bi-filetype-ai::before { content: "\f73f"; } +.bi-filetype-bmp::before { content: "\f740"; } +.bi-filetype-cs::before { content: "\f741"; } +.bi-filetype-css::before { content: "\f742"; } +.bi-filetype-csv::before { content: "\f743"; } +.bi-filetype-doc::before { content: "\f744"; } +.bi-filetype-docx::before { content: "\f745"; } +.bi-filetype-exe::before { content: "\f746"; } +.bi-filetype-gif::before { content: "\f747"; } +.bi-filetype-heic::before { content: "\f748"; } +.bi-filetype-html::before { content: "\f749"; } +.bi-filetype-java::before { content: "\f74a"; } +.bi-filetype-jpg::before { content: "\f74b"; } +.bi-filetype-js::before { content: "\f74c"; } +.bi-filetype-jsx::before { content: "\f74d"; } +.bi-filetype-key::before { content: "\f74e"; } +.bi-filetype-m4p::before { content: "\f74f"; } +.bi-filetype-md::before { content: "\f750"; } +.bi-filetype-mdx::before { content: "\f751"; } +.bi-filetype-mov::before { content: "\f752"; } +.bi-filetype-mp3::before { content: "\f753"; } +.bi-filetype-mp4::before { content: "\f754"; } +.bi-filetype-otf::before { content: "\f755"; } +.bi-filetype-pdf::before { content: "\f756"; } +.bi-filetype-php::before { content: "\f757"; } +.bi-filetype-png::before { content: "\f758"; } +.bi-filetype-ppt::before { content: "\f75a"; } +.bi-filetype-psd::before { content: "\f75b"; } +.bi-filetype-py::before { content: "\f75c"; } +.bi-filetype-raw::before { content: "\f75d"; } +.bi-filetype-rb::before { content: "\f75e"; } +.bi-filetype-sass::before { content: "\f75f"; } +.bi-filetype-scss::before { content: "\f760"; } +.bi-filetype-sh::before { content: "\f761"; } +.bi-filetype-svg::before { content: "\f762"; } +.bi-filetype-tiff::before { content: "\f763"; } +.bi-filetype-tsx::before { content: "\f764"; } +.bi-filetype-ttf::before { content: "\f765"; } +.bi-filetype-txt::before { content: "\f766"; } +.bi-filetype-wav::before { content: "\f767"; } +.bi-filetype-woff::before { content: "\f768"; } +.bi-filetype-xls::before { content: "\f76a"; } +.bi-filetype-xml::before { content: "\f76b"; } +.bi-filetype-yml::before { content: "\f76c"; } +.bi-heart-arrow::before { content: "\f76d"; } +.bi-heart-pulse-fill::before { content: "\f76e"; } +.bi-heart-pulse::before { content: "\f76f"; } +.bi-heartbreak-fill::before { content: "\f770"; } +.bi-heartbreak::before { content: "\f771"; } +.bi-hearts::before { content: "\f772"; } +.bi-hospital-fill::before { content: "\f773"; } +.bi-hospital::before { content: "\f774"; } +.bi-house-heart-fill::before { content: "\f775"; } +.bi-house-heart::before { content: "\f776"; } +.bi-incognito::before { content: "\f777"; } +.bi-magnet-fill::before { content: "\f778"; } +.bi-magnet::before { content: "\f779"; } +.bi-person-heart::before { content: "\f77a"; } +.bi-person-hearts::before { content: "\f77b"; } +.bi-phone-flip::before { content: "\f77c"; } +.bi-plugin::before { content: "\f77d"; } +.bi-postage-fill::before { content: "\f77e"; } +.bi-postage-heart-fill::before { content: "\f77f"; } +.bi-postage-heart::before { content: "\f780"; } +.bi-postage::before { content: "\f781"; } +.bi-postcard-fill::before { content: "\f782"; } +.bi-postcard-heart-fill::before { content: "\f783"; } +.bi-postcard-heart::before { content: "\f784"; } +.bi-postcard::before { content: "\f785"; } +.bi-search-heart-fill::before { content: "\f786"; } +.bi-search-heart::before { content: "\f787"; } +.bi-sliders2-vertical::before { content: "\f788"; } +.bi-sliders2::before { content: "\f789"; } +.bi-trash3-fill::before { content: "\f78a"; } +.bi-trash3::before { content: "\f78b"; } +.bi-valentine::before { content: "\f78c"; } +.bi-valentine2::before { content: "\f78d"; } +.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } +.bi-wrench-adjustable-circle::before { content: "\f78f"; } +.bi-wrench-adjustable::before { content: "\f790"; } +.bi-filetype-json::before { content: "\f791"; } +.bi-filetype-pptx::before { content: "\f792"; } +.bi-filetype-xlsx::before { content: "\f793"; } +.bi-1-circle-fill::before { content: "\f796"; } +.bi-1-circle::before { content: "\f797"; } +.bi-1-square-fill::before { content: "\f798"; } +.bi-1-square::before { content: "\f799"; } +.bi-2-circle-fill::before { content: "\f79c"; } +.bi-2-circle::before { content: "\f79d"; } +.bi-2-square-fill::before { content: "\f79e"; } +.bi-2-square::before { content: "\f79f"; } +.bi-3-circle-fill::before { content: "\f7a2"; } +.bi-3-circle::before { content: "\f7a3"; } +.bi-3-square-fill::before { content: "\f7a4"; } +.bi-3-square::before { content: "\f7a5"; } +.bi-4-circle-fill::before { content: "\f7a8"; } +.bi-4-circle::before { content: "\f7a9"; } +.bi-4-square-fill::before { content: "\f7aa"; } +.bi-4-square::before { content: "\f7ab"; } +.bi-5-circle-fill::before { content: "\f7ae"; } +.bi-5-circle::before { content: "\f7af"; } +.bi-5-square-fill::before { content: "\f7b0"; } +.bi-5-square::before { content: "\f7b1"; } +.bi-6-circle-fill::before { content: "\f7b4"; } +.bi-6-circle::before { content: "\f7b5"; } +.bi-6-square-fill::before { content: "\f7b6"; } +.bi-6-square::before { content: "\f7b7"; } +.bi-7-circle-fill::before { content: "\f7ba"; } +.bi-7-circle::before { content: "\f7bb"; } +.bi-7-square-fill::before { content: "\f7bc"; } +.bi-7-square::before { content: "\f7bd"; } +.bi-8-circle-fill::before { content: "\f7c0"; } +.bi-8-circle::before { content: "\f7c1"; } +.bi-8-square-fill::before { content: "\f7c2"; } +.bi-8-square::before { content: "\f7c3"; } +.bi-9-circle-fill::before { content: "\f7c6"; } +.bi-9-circle::before { content: "\f7c7"; } +.bi-9-square-fill::before { content: "\f7c8"; } +.bi-9-square::before { content: "\f7c9"; } +.bi-airplane-engines-fill::before { content: "\f7ca"; } +.bi-airplane-engines::before { content: "\f7cb"; } +.bi-airplane-fill::before { content: "\f7cc"; } +.bi-airplane::before { content: "\f7cd"; } +.bi-alexa::before { content: "\f7ce"; } +.bi-alipay::before { content: "\f7cf"; } +.bi-android::before { content: "\f7d0"; } +.bi-android2::before { content: "\f7d1"; } +.bi-box-fill::before { content: "\f7d2"; } +.bi-box-seam-fill::before { content: "\f7d3"; } +.bi-browser-chrome::before { content: "\f7d4"; } +.bi-browser-edge::before { content: "\f7d5"; } +.bi-browser-firefox::before { content: "\f7d6"; } +.bi-browser-safari::before { content: "\f7d7"; } +.bi-c-circle-fill::before { content: "\f7da"; } +.bi-c-circle::before { content: "\f7db"; } +.bi-c-square-fill::before { content: "\f7dc"; } +.bi-c-square::before { content: "\f7dd"; } +.bi-capsule-pill::before { content: "\f7de"; } +.bi-capsule::before { content: "\f7df"; } +.bi-car-front-fill::before { content: "\f7e0"; } +.bi-car-front::before { content: "\f7e1"; } +.bi-cassette-fill::before { content: "\f7e2"; } +.bi-cassette::before { content: "\f7e3"; } +.bi-cc-circle-fill::before { content: "\f7e6"; } +.bi-cc-circle::before { content: "\f7e7"; } +.bi-cc-square-fill::before { content: "\f7e8"; } +.bi-cc-square::before { content: "\f7e9"; } +.bi-cup-hot-fill::before { content: "\f7ea"; } +.bi-cup-hot::before { content: "\f7eb"; } +.bi-currency-rupee::before { content: "\f7ec"; } +.bi-dropbox::before { content: "\f7ed"; } +.bi-escape::before { content: "\f7ee"; } +.bi-fast-forward-btn-fill::before { content: "\f7ef"; } +.bi-fast-forward-btn::before { content: "\f7f0"; } +.bi-fast-forward-circle-fill::before { content: "\f7f1"; } +.bi-fast-forward-circle::before { content: "\f7f2"; } +.bi-fast-forward-fill::before { content: "\f7f3"; } +.bi-fast-forward::before { content: "\f7f4"; } +.bi-filetype-sql::before { content: "\f7f5"; } +.bi-fire::before { content: "\f7f6"; } +.bi-google-play::before { content: "\f7f7"; } +.bi-h-circle-fill::before { content: "\f7fa"; } +.bi-h-circle::before { content: "\f7fb"; } +.bi-h-square-fill::before { content: "\f7fc"; } +.bi-h-square::before { content: "\f7fd"; } +.bi-indent::before { content: "\f7fe"; } +.bi-lungs-fill::before { content: "\f7ff"; } +.bi-lungs::before { content: "\f800"; } +.bi-microsoft-teams::before { content: "\f801"; } +.bi-p-circle-fill::before { content: "\f804"; } +.bi-p-circle::before { content: "\f805"; } +.bi-p-square-fill::before { content: "\f806"; } +.bi-p-square::before { content: "\f807"; } +.bi-pass-fill::before { content: "\f808"; } +.bi-pass::before { content: "\f809"; } +.bi-prescription::before { content: "\f80a"; } +.bi-prescription2::before { content: "\f80b"; } +.bi-r-circle-fill::before { content: "\f80e"; } +.bi-r-circle::before { content: "\f80f"; } +.bi-r-square-fill::before { content: "\f810"; } +.bi-r-square::before { content: "\f811"; } +.bi-repeat-1::before { content: "\f812"; } +.bi-repeat::before { content: "\f813"; } +.bi-rewind-btn-fill::before { content: "\f814"; } +.bi-rewind-btn::before { content: "\f815"; } +.bi-rewind-circle-fill::before { content: "\f816"; } +.bi-rewind-circle::before { content: "\f817"; } +.bi-rewind-fill::before { content: "\f818"; } +.bi-rewind::before { content: "\f819"; } +.bi-train-freight-front-fill::before { content: "\f81a"; } +.bi-train-freight-front::before { content: "\f81b"; } +.bi-train-front-fill::before { content: "\f81c"; } +.bi-train-front::before { content: "\f81d"; } +.bi-train-lightrail-front-fill::before { content: "\f81e"; } +.bi-train-lightrail-front::before { content: "\f81f"; } +.bi-truck-front-fill::before { content: "\f820"; } +.bi-truck-front::before { content: "\f821"; } +.bi-ubuntu::before { content: "\f822"; } +.bi-unindent::before { content: "\f823"; } +.bi-unity::before { content: "\f824"; } +.bi-universal-access-circle::before { content: "\f825"; } +.bi-universal-access::before { content: "\f826"; } +.bi-virus::before { content: "\f827"; } +.bi-virus2::before { content: "\f828"; } +.bi-wechat::before { content: "\f829"; } +.bi-yelp::before { content: "\f82a"; } +.bi-sign-stop-fill::before { content: "\f82b"; } +.bi-sign-stop-lights-fill::before { content: "\f82c"; } +.bi-sign-stop-lights::before { content: "\f82d"; } +.bi-sign-stop::before { content: "\f82e"; } +.bi-sign-turn-left-fill::before { content: "\f82f"; } +.bi-sign-turn-left::before { content: "\f830"; } +.bi-sign-turn-right-fill::before { content: "\f831"; } +.bi-sign-turn-right::before { content: "\f832"; } +.bi-sign-turn-slight-left-fill::before { content: "\f833"; } +.bi-sign-turn-slight-left::before { content: "\f834"; } +.bi-sign-turn-slight-right-fill::before { content: "\f835"; } +.bi-sign-turn-slight-right::before { content: "\f836"; } +.bi-sign-yield-fill::before { content: "\f837"; } +.bi-sign-yield::before { content: "\f838"; } +.bi-ev-station-fill::before { content: "\f839"; } +.bi-ev-station::before { content: "\f83a"; } +.bi-fuel-pump-diesel-fill::before { content: "\f83b"; } +.bi-fuel-pump-diesel::before { content: "\f83c"; } +.bi-fuel-pump-fill::before { content: "\f83d"; } +.bi-fuel-pump::before { content: "\f83e"; } +.bi-0-circle-fill::before { content: "\f83f"; } +.bi-0-circle::before { content: "\f840"; } +.bi-0-square-fill::before { content: "\f841"; } +.bi-0-square::before { content: "\f842"; } +.bi-rocket-fill::before { content: "\f843"; } +.bi-rocket-takeoff-fill::before { content: "\f844"; } +.bi-rocket-takeoff::before { content: "\f845"; } +.bi-rocket::before { content: "\f846"; } +.bi-stripe::before { content: "\f847"; } +.bi-subscript::before { content: "\f848"; } +.bi-superscript::before { content: "\f849"; } +.bi-trello::before { content: "\f84a"; } +.bi-envelope-at-fill::before { content: "\f84b"; } +.bi-envelope-at::before { content: "\f84c"; } +.bi-regex::before { content: "\f84d"; } +.bi-text-wrap::before { content: "\f84e"; } +.bi-sign-dead-end-fill::before { content: "\f84f"; } +.bi-sign-dead-end::before { content: "\f850"; } +.bi-sign-do-not-enter-fill::before { content: "\f851"; } +.bi-sign-do-not-enter::before { content: "\f852"; } +.bi-sign-intersection-fill::before { content: "\f853"; } +.bi-sign-intersection-side-fill::before { content: "\f854"; } +.bi-sign-intersection-side::before { content: "\f855"; } +.bi-sign-intersection-t-fill::before { content: "\f856"; } +.bi-sign-intersection-t::before { content: "\f857"; } +.bi-sign-intersection-y-fill::before { content: "\f858"; } +.bi-sign-intersection-y::before { content: "\f859"; } +.bi-sign-intersection::before { content: "\f85a"; } +.bi-sign-merge-left-fill::before { content: "\f85b"; } +.bi-sign-merge-left::before { content: "\f85c"; } +.bi-sign-merge-right-fill::before { content: "\f85d"; } +.bi-sign-merge-right::before { content: "\f85e"; } +.bi-sign-no-left-turn-fill::before { content: "\f85f"; } +.bi-sign-no-left-turn::before { content: "\f860"; } +.bi-sign-no-parking-fill::before { content: "\f861"; } +.bi-sign-no-parking::before { content: "\f862"; } +.bi-sign-no-right-turn-fill::before { content: "\f863"; } +.bi-sign-no-right-turn::before { content: "\f864"; } +.bi-sign-railroad-fill::before { content: "\f865"; } +.bi-sign-railroad::before { content: "\f866"; } +.bi-building-add::before { content: "\f867"; } +.bi-building-check::before { content: "\f868"; } +.bi-building-dash::before { content: "\f869"; } +.bi-building-down::before { content: "\f86a"; } +.bi-building-exclamation::before { content: "\f86b"; } +.bi-building-fill-add::before { content: "\f86c"; } +.bi-building-fill-check::before { content: "\f86d"; } +.bi-building-fill-dash::before { content: "\f86e"; } +.bi-building-fill-down::before { content: "\f86f"; } +.bi-building-fill-exclamation::before { content: "\f870"; } +.bi-building-fill-gear::before { content: "\f871"; } +.bi-building-fill-lock::before { content: "\f872"; } +.bi-building-fill-slash::before { content: "\f873"; } +.bi-building-fill-up::before { content: "\f874"; } +.bi-building-fill-x::before { content: "\f875"; } +.bi-building-fill::before { content: "\f876"; } +.bi-building-gear::before { content: "\f877"; } +.bi-building-lock::before { content: "\f878"; } +.bi-building-slash::before { content: "\f879"; } +.bi-building-up::before { content: "\f87a"; } +.bi-building-x::before { content: "\f87b"; } +.bi-buildings-fill::before { content: "\f87c"; } +.bi-buildings::before { content: "\f87d"; } +.bi-bus-front-fill::before { content: "\f87e"; } +.bi-bus-front::before { content: "\f87f"; } +.bi-ev-front-fill::before { content: "\f880"; } +.bi-ev-front::before { content: "\f881"; } +.bi-globe-americas::before { content: "\f882"; } +.bi-globe-asia-australia::before { content: "\f883"; } +.bi-globe-central-south-asia::before { content: "\f884"; } +.bi-globe-europe-africa::before { content: "\f885"; } +.bi-house-add-fill::before { content: "\f886"; } +.bi-house-add::before { content: "\f887"; } +.bi-house-check-fill::before { content: "\f888"; } +.bi-house-check::before { content: "\f889"; } +.bi-house-dash-fill::before { content: "\f88a"; } +.bi-house-dash::before { content: "\f88b"; } +.bi-house-down-fill::before { content: "\f88c"; } +.bi-house-down::before { content: "\f88d"; } +.bi-house-exclamation-fill::before { content: "\f88e"; } +.bi-house-exclamation::before { content: "\f88f"; } +.bi-house-gear-fill::before { content: "\f890"; } +.bi-house-gear::before { content: "\f891"; } +.bi-house-lock-fill::before { content: "\f892"; } +.bi-house-lock::before { content: "\f893"; } +.bi-house-slash-fill::before { content: "\f894"; } +.bi-house-slash::before { content: "\f895"; } +.bi-house-up-fill::before { content: "\f896"; } +.bi-house-up::before { content: "\f897"; } +.bi-house-x-fill::before { content: "\f898"; } +.bi-house-x::before { content: "\f899"; } +.bi-person-add::before { content: "\f89a"; } +.bi-person-down::before { content: "\f89b"; } +.bi-person-exclamation::before { content: "\f89c"; } +.bi-person-fill-add::before { content: "\f89d"; } +.bi-person-fill-check::before { content: "\f89e"; } +.bi-person-fill-dash::before { content: "\f89f"; } +.bi-person-fill-down::before { content: "\f8a0"; } +.bi-person-fill-exclamation::before { content: "\f8a1"; } +.bi-person-fill-gear::before { content: "\f8a2"; } +.bi-person-fill-lock::before { content: "\f8a3"; } +.bi-person-fill-slash::before { content: "\f8a4"; } +.bi-person-fill-up::before { content: "\f8a5"; } +.bi-person-fill-x::before { content: "\f8a6"; } +.bi-person-gear::before { content: "\f8a7"; } +.bi-person-lock::before { content: "\f8a8"; } +.bi-person-slash::before { content: "\f8a9"; } +.bi-person-up::before { content: "\f8aa"; } +.bi-scooter::before { content: "\f8ab"; } +.bi-taxi-front-fill::before { content: "\f8ac"; } +.bi-taxi-front::before { content: "\f8ad"; } +.bi-amd::before { content: "\f8ae"; } +.bi-database-add::before { content: "\f8af"; } +.bi-database-check::before { content: "\f8b0"; } +.bi-database-dash::before { content: "\f8b1"; } +.bi-database-down::before { content: "\f8b2"; } +.bi-database-exclamation::before { content: "\f8b3"; } +.bi-database-fill-add::before { content: "\f8b4"; } +.bi-database-fill-check::before { content: "\f8b5"; } +.bi-database-fill-dash::before { content: "\f8b6"; } +.bi-database-fill-down::before { content: "\f8b7"; } +.bi-database-fill-exclamation::before { content: "\f8b8"; } +.bi-database-fill-gear::before { content: "\f8b9"; } +.bi-database-fill-lock::before { content: "\f8ba"; } +.bi-database-fill-slash::before { content: "\f8bb"; } +.bi-database-fill-up::before { content: "\f8bc"; } +.bi-database-fill-x::before { content: "\f8bd"; } +.bi-database-fill::before { content: "\f8be"; } +.bi-database-gear::before { content: "\f8bf"; } +.bi-database-lock::before { content: "\f8c0"; } +.bi-database-slash::before { content: "\f8c1"; } +.bi-database-up::before { content: "\f8c2"; } +.bi-database-x::before { content: "\f8c3"; } +.bi-database::before { content: "\f8c4"; } +.bi-houses-fill::before { content: "\f8c5"; } +.bi-houses::before { content: "\f8c6"; } +.bi-nvidia::before { content: "\f8c7"; } +.bi-person-vcard-fill::before { content: "\f8c8"; } +.bi-person-vcard::before { content: "\f8c9"; } +.bi-sina-weibo::before { content: "\f8ca"; } +.bi-tencent-qq::before { content: "\f8cb"; } +.bi-wikipedia::before { content: "\f8cc"; } +.bi-alphabet-uppercase::before { content: "\f2a5"; } +.bi-alphabet::before { content: "\f68a"; } +.bi-amazon::before { content: "\f68d"; } +.bi-arrows-collapse-vertical::before { content: "\f690"; } +.bi-arrows-expand-vertical::before { content: "\f695"; } +.bi-arrows-vertical::before { content: "\f698"; } +.bi-arrows::before { content: "\f6a2"; } +.bi-ban-fill::before { content: "\f6a3"; } +.bi-ban::before { content: "\f6b6"; } +.bi-bing::before { content: "\f6c2"; } +.bi-cake::before { content: "\f6e0"; } +.bi-cake2::before { content: "\f6ed"; } +.bi-cookie::before { content: "\f6ee"; } +.bi-copy::before { content: "\f759"; } +.bi-crosshair::before { content: "\f769"; } +.bi-crosshair2::before { content: "\f794"; } +.bi-emoji-astonished-fill::before { content: "\f795"; } +.bi-emoji-astonished::before { content: "\f79a"; } +.bi-emoji-grimace-fill::before { content: "\f79b"; } +.bi-emoji-grimace::before { content: "\f7a0"; } +.bi-emoji-grin-fill::before { content: "\f7a1"; } +.bi-emoji-grin::before { content: "\f7a6"; } +.bi-emoji-surprise-fill::before { content: "\f7a7"; } +.bi-emoji-surprise::before { content: "\f7ac"; } +.bi-emoji-tear-fill::before { content: "\f7ad"; } +.bi-emoji-tear::before { content: "\f7b2"; } +.bi-envelope-arrow-down-fill::before { content: "\f7b3"; } +.bi-envelope-arrow-down::before { content: "\f7b8"; } +.bi-envelope-arrow-up-fill::before { content: "\f7b9"; } +.bi-envelope-arrow-up::before { content: "\f7be"; } +.bi-feather::before { content: "\f7bf"; } +.bi-feather2::before { content: "\f7c4"; } +.bi-floppy-fill::before { content: "\f7c5"; } +.bi-floppy::before { content: "\f7d8"; } +.bi-floppy2-fill::before { content: "\f7d9"; } +.bi-floppy2::before { content: "\f7e4"; } +.bi-gitlab::before { content: "\f7e5"; } +.bi-highlighter::before { content: "\f7f8"; } +.bi-marker-tip::before { content: "\f802"; } +.bi-nvme-fill::before { content: "\f803"; } +.bi-nvme::before { content: "\f80c"; } +.bi-opencollective::before { content: "\f80d"; } +.bi-pci-card-network::before { content: "\f8cd"; } +.bi-pci-card-sound::before { content: "\f8ce"; } +.bi-radar::before { content: "\f8cf"; } +.bi-send-arrow-down-fill::before { content: "\f8d0"; } +.bi-send-arrow-down::before { content: "\f8d1"; } +.bi-send-arrow-up-fill::before { content: "\f8d2"; } +.bi-send-arrow-up::before { content: "\f8d3"; } +.bi-sim-slash-fill::before { content: "\f8d4"; } +.bi-sim-slash::before { content: "\f8d5"; } +.bi-sourceforge::before { content: "\f8d6"; } +.bi-substack::before { content: "\f8d7"; } +.bi-threads-fill::before { content: "\f8d8"; } +.bi-threads::before { content: "\f8d9"; } +.bi-transparency::before { content: "\f8da"; } +.bi-twitter-x::before { content: "\f8db"; } +.bi-type-h4::before { content: "\f8dc"; } +.bi-type-h5::before { content: "\f8dd"; } +.bi-type-h6::before { content: "\f8de"; } +.bi-backpack-fill::before { content: "\f8df"; } +.bi-backpack::before { content: "\f8e0"; } +.bi-backpack2-fill::before { content: "\f8e1"; } +.bi-backpack2::before { content: "\f8e2"; } +.bi-backpack3-fill::before { content: "\f8e3"; } +.bi-backpack3::before { content: "\f8e4"; } +.bi-backpack4-fill::before { content: "\f8e5"; } +.bi-backpack4::before { content: "\f8e6"; } +.bi-brilliance::before { content: "\f8e7"; } +.bi-cake-fill::before { content: "\f8e8"; } +.bi-cake2-fill::before { content: "\f8e9"; } +.bi-duffle-fill::before { content: "\f8ea"; } +.bi-duffle::before { content: "\f8eb"; } +.bi-exposure::before { content: "\f8ec"; } +.bi-gender-neuter::before { content: "\f8ed"; } +.bi-highlights::before { content: "\f8ee"; } +.bi-luggage-fill::before { content: "\f8ef"; } +.bi-luggage::before { content: "\f8f0"; } +.bi-mailbox-flag::before { content: "\f8f1"; } +.bi-mailbox2-flag::before { content: "\f8f2"; } +.bi-noise-reduction::before { content: "\f8f3"; } +.bi-passport-fill::before { content: "\f8f4"; } +.bi-passport::before { content: "\f8f5"; } +.bi-person-arms-up::before { content: "\f8f6"; } +.bi-person-raised-hand::before { content: "\f8f7"; } +.bi-person-standing-dress::before { content: "\f8f8"; } +.bi-person-standing::before { content: "\f8f9"; } +.bi-person-walking::before { content: "\f8fa"; } +.bi-person-wheelchair::before { content: "\f8fb"; } +.bi-shadows::before { content: "\f8fc"; } +.bi-suitcase-fill::before { content: "\f8fd"; } +.bi-suitcase-lg-fill::before { content: "\f8fe"; } +.bi-suitcase-lg::before { content: "\f8ff"; } +.bi-suitcase::before { content: "\f900"; } +.bi-suitcase2-fill::before { content: "\f901"; } +.bi-suitcase2::before { content: "\f902"; } +.bi-vignette::before { content: "\f903"; } diff --git a/docs/validmind_files/libs/bootstrap/bootstrap-icons.woff b/docs/validmind_files/libs/bootstrap/bootstrap-icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..dbeeb055674125ad78fda0f3d166b36e5cc92336 GIT binary patch literal 176200 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

2+UrCZlNAp`)&G@jg{m-!Dn; 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πR(XEyYV3az{Ot$Y*f93mYq^Lnu{qbYp!X!TA9&! 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 F?~0aZ)an2L literal 0 HcmV?d00001 diff --git a/docs/validmind_files/libs/bootstrap/bootstrap.min.js b/docs/validmind_files/libs/bootstrap/bootstrap.min.js new file mode 100644 index 000000000..e8f21f703 --- /dev/null +++ b/docs/validmind_files/libs/bootstrap/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.1 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.1"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return n(e)},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"

"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=":not(.dropdown-toggle)",zs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Rs=`.nav-link${Bs}, .list-group-item${Bs}, [role="tab"]${Bs}, ${zs}`,qs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Vs extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Vs.getOrCreateInstance(i).show())}_getChildren(){return z.find(Rs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(Rs)?t:z.findOne(Rs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Vs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,zs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Vs.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(qs))Vs.getOrCreateInstance(t)})),m(Vs);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Ys=`focusin${Ks}`,Us=`focusout${Ks}`,Gs=`hide${Ks}`,Js=`hidden${Ks}`,Zs=`show${Ks}`,to=`shown${Ks}`,eo="hide",io="show",no="showing",so={animation:"boolean",autohide:"boolean",delay:"number"},oo={animation:!0,autohide:!0,delay:5e3};class ro extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return oo}static get DefaultType(){return so}static get NAME(){return"toast"}show(){N.trigger(this._element,Zs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(eo),d(this._element),this._element.classList.add(io,no),this._queueCallback((()=>{this._element.classList.remove(no),N.trigger(this._element,to),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Gs).defaultPrevented||(this._element.classList.add(no),this._queueCallback((()=>{this._element.classList.add(eo),this._element.classList.remove(no,io),N.trigger(this._element,Js)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(io),super.dispose()}isShown(){return this._element.classList.contains(io)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Qs,(t=>this._onInteraction(t,!0))),N.on(this._element,Xs,(t=>this._onInteraction(t,!1))),N.on(this._element,Ys,(t=>this._onInteraction(t,!0))),N.on(this._element,Us,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ro.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ro),m(ro),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Vs,Toast:ro,Tooltip:cs}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/docs/validmind_files/libs/clipboard/clipboard.min.js b/docs/validmind_files/libs/clipboard/clipboard.min.js new file mode 100644 index 000000000..1103f811e --- /dev/null +++ b/docs/validmind_files/libs/clipboard/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1.anchorjs-link,.anchorjs-link:focus{opacity:1}",A.sheet.cssRules.length),A.sheet.insertRule("[data-anchorjs-icon]::after{content:attr(data-anchorjs-icon)}",A.sheet.cssRules.length),A.sheet.insertRule('@font-face{font-family:anchorjs-icons;src:url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype")}',A.sheet.cssRules.length)),h=document.querySelectorAll("[id]"),t=[].map.call(h,function(A){return A.id}),i=0;i\]./()*\\\n\t\b\v\u00A0]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),A=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||A||!1}}}); +// @license-end \ No newline at end of file diff --git a/docs/validmind_files/libs/quarto-html/popper.min.js b/docs/validmind_files/libs/quarto-html/popper.min.js new file mode 100644 index 000000000..e3726d728 --- /dev/null +++ b/docs/validmind_files/libs/quarto-html/popper.min.js @@ -0,0 +1,6 @@ +/** + * @popperjs/core v2.11.7 - MIT License + */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){"use strict";function t(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function n(e){return e instanceof t(e).Element||e instanceof Element}function r(e){return e instanceof t(e).HTMLElement||e instanceof HTMLElement}function o(e){return"undefined"!=typeof ShadowRoot&&(e instanceof t(e).ShadowRoot||e instanceof ShadowRoot)}var i=Math.max,a=Math.min,s=Math.round;function f(){var e=navigator.userAgentData;return null!=e&&e.brands&&Array.isArray(e.brands)?e.brands.map((function(e){return e.brand+"/"+e.version})).join(" "):navigator.userAgent}function c(){return!/^((?!chrome|android).)*safari/i.test(f())}function p(e,o,i){void 0===o&&(o=!1),void 0===i&&(i=!1);var a=e.getBoundingClientRect(),f=1,p=1;o&&r(e)&&(f=e.offsetWidth>0&&s(a.width)/e.offsetWidth||1,p=e.offsetHeight>0&&s(a.height)/e.offsetHeight||1);var u=(n(e)?t(e):window).visualViewport,l=!c()&&i,d=(a.left+(l&&u?u.offsetLeft:0))/f,h=(a.top+(l&&u?u.offsetTop:0))/p,m=a.width/f,v=a.height/p;return{width:m,height:v,top:h,right:d+m,bottom:h+v,left:d,x:d,y:h}}function u(e){var n=t(e);return{scrollLeft:n.pageXOffset,scrollTop:n.pageYOffset}}function l(e){return e?(e.nodeName||"").toLowerCase():null}function d(e){return((n(e)?e.ownerDocument:e.document)||window.document).documentElement}function h(e){return p(d(e)).left+u(e).scrollLeft}function m(e){return t(e).getComputedStyle(e)}function v(e){var t=m(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function y(e,n,o){void 0===o&&(o=!1);var i,a,f=r(n),c=r(n)&&function(e){var t=e.getBoundingClientRect(),n=s(t.width)/e.offsetWidth||1,r=s(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(n),m=d(n),y=p(e,c,o),g={scrollLeft:0,scrollTop:0},b={x:0,y:0};return(f||!f&&!o)&&(("body"!==l(n)||v(m))&&(g=(i=n)!==t(i)&&r(i)?{scrollLeft:(a=i).scrollLeft,scrollTop:a.scrollTop}:u(i)),r(n)?((b=p(n,!0)).x+=n.clientLeft,b.y+=n.clientTop):m&&(b.x=h(m))),{x:y.left+g.scrollLeft-b.x,y:y.top+g.scrollTop-b.y,width:y.width,height:y.height}}function g(e){var t=p(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function b(e){return"html"===l(e)?e:e.assignedSlot||e.parentNode||(o(e)?e.host:null)||d(e)}function x(e){return["html","body","#document"].indexOf(l(e))>=0?e.ownerDocument.body:r(e)&&v(e)?e:x(b(e))}function w(e,n){var r;void 0===n&&(n=[]);var o=x(e),i=o===(null==(r=e.ownerDocument)?void 0:r.body),a=t(o),s=i?[a].concat(a.visualViewport||[],v(o)?o:[]):o,f=n.concat(s);return i?f:f.concat(w(b(s)))}function O(e){return["table","td","th"].indexOf(l(e))>=0}function j(e){return r(e)&&"fixed"!==m(e).position?e.offsetParent:null}function E(e){for(var n=t(e),i=j(e);i&&O(i)&&"static"===m(i).position;)i=j(i);return i&&("html"===l(i)||"body"===l(i)&&"static"===m(i).position)?n:i||function(e){var t=/firefox/i.test(f());if(/Trident/i.test(f())&&r(e)&&"fixed"===m(e).position)return null;var n=b(e);for(o(n)&&(n=n.host);r(n)&&["html","body"].indexOf(l(n))<0;){var i=m(n);if("none"!==i.transform||"none"!==i.perspective||"paint"===i.contain||-1!==["transform","perspective"].indexOf(i.willChange)||t&&"filter"===i.willChange||t&&i.filter&&"none"!==i.filter)return n;n=n.parentNode}return null}(e)||n}var D="top",A="bottom",L="right",P="left",M="auto",k=[D,A,L,P],W="start",B="end",H="viewport",T="popper",R=k.reduce((function(e,t){return e.concat([t+"-"+W,t+"-"+B])}),[]),S=[].concat(k,[M]).reduce((function(e,t){return e.concat([t,t+"-"+W,t+"-"+B])}),[]),V=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function q(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}function C(e){return e.split("-")[0]}function N(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&o(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function I(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function _(e,r,o){return r===H?I(function(e,n){var r=t(e),o=d(e),i=r.visualViewport,a=o.clientWidth,s=o.clientHeight,f=0,p=0;if(i){a=i.width,s=i.height;var u=c();(u||!u&&"fixed"===n)&&(f=i.offsetLeft,p=i.offsetTop)}return{width:a,height:s,x:f+h(e),y:p}}(e,o)):n(r)?function(e,t){var n=p(e,!1,"fixed"===t);return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}(r,o):I(function(e){var t,n=d(e),r=u(e),o=null==(t=e.ownerDocument)?void 0:t.body,a=i(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=i(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),f=-r.scrollLeft+h(e),c=-r.scrollTop;return"rtl"===m(o||n).direction&&(f+=i(n.clientWidth,o?o.clientWidth:0)-a),{width:a,height:s,x:f,y:c}}(d(e)))}function F(e,t,o,s){var f="clippingParents"===t?function(e){var t=w(b(e)),o=["absolute","fixed"].indexOf(m(e).position)>=0&&r(e)?E(e):e;return n(o)?t.filter((function(e){return n(e)&&N(e,o)&&"body"!==l(e)})):[]}(e):[].concat(t),c=[].concat(f,[o]),p=c[0],u=c.reduce((function(t,n){var r=_(e,n,s);return t.top=i(r.top,t.top),t.right=a(r.right,t.right),t.bottom=a(r.bottom,t.bottom),t.left=i(r.left,t.left),t}),_(e,p,s));return u.width=u.right-u.left,u.height=u.bottom-u.top,u.x=u.left,u.y=u.top,u}function U(e){return e.split("-")[1]}function z(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function X(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?C(o):null,a=o?U(o):null,s=n.x+n.width/2-r.width/2,f=n.y+n.height/2-r.height/2;switch(i){case D:t={x:s,y:n.y-r.height};break;case A:t={x:s,y:n.y+n.height};break;case L:t={x:n.x+n.width,y:f};break;case P:t={x:n.x-r.width,y:f};break;default:t={x:n.x,y:n.y}}var c=i?z(i):null;if(null!=c){var p="y"===c?"height":"width";switch(a){case W:t[c]=t[c]-(n[p]/2-r[p]/2);break;case B:t[c]=t[c]+(n[p]/2-r[p]/2)}}return t}function Y(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function G(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function J(e,t){void 0===t&&(t={});var r=t,o=r.placement,i=void 0===o?e.placement:o,a=r.strategy,s=void 0===a?e.strategy:a,f=r.boundary,c=void 0===f?"clippingParents":f,u=r.rootBoundary,l=void 0===u?H:u,h=r.elementContext,m=void 0===h?T:h,v=r.altBoundary,y=void 0!==v&&v,g=r.padding,b=void 0===g?0:g,x=Y("number"!=typeof b?b:G(b,k)),w=m===T?"reference":T,O=e.rects.popper,j=e.elements[y?w:m],E=F(n(j)?j:j.contextElement||d(e.elements.popper),c,l,s),P=p(e.elements.reference),M=X({reference:P,element:O,strategy:"absolute",placement:i}),W=I(Object.assign({},O,M)),B=m===T?W:P,R={top:E.top-B.top+x.top,bottom:B.bottom-E.bottom+x.bottom,left:E.left-B.left+x.left,right:B.right-E.right+x.right},S=e.modifiersData.offset;if(m===T&&S){var V=S[i];Object.keys(R).forEach((function(e){var t=[L,A].indexOf(e)>=0?1:-1,n=[D,A].indexOf(e)>=0?"y":"x";R[e]+=V[n]*t}))}return R}var K={placement:"bottom",modifiers:[],strategy:"absolute"};function Q(){for(var e=arguments.length,t=new Array(e),n=0;n=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],s=i[1];return a=a||0,s=(s||0)*o,[P,L].indexOf(r)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,i),e}),{}),s=a[t.placement],f=s.x,c=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=f,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=a}},se={left:"right",right:"left",bottom:"top",top:"bottom"};function fe(e){return e.replace(/left|right|bottom|top/g,(function(e){return se[e]}))}var ce={start:"end",end:"start"};function pe(e){return e.replace(/start|end/g,(function(e){return ce[e]}))}function ue(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,f=n.allowedAutoPlacements,c=void 0===f?S:f,p=U(r),u=p?s?R:R.filter((function(e){return U(e)===p})):k,l=u.filter((function(e){return c.indexOf(e)>=0}));0===l.length&&(l=u);var d=l.reduce((function(t,n){return t[n]=J(e,{placement:n,boundary:o,rootBoundary:i,padding:a})[C(n)],t}),{});return Object.keys(d).sort((function(e,t){return d[e]-d[t]}))}var le={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,a=n.altAxis,s=void 0===a||a,f=n.fallbackPlacements,c=n.padding,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.flipVariations,h=void 0===d||d,m=n.allowedAutoPlacements,v=t.options.placement,y=C(v),g=f||(y===v||!h?[fe(v)]:function(e){if(C(e)===M)return[];var t=fe(e);return[pe(e),t,pe(t)]}(v)),b=[v].concat(g).reduce((function(e,n){return e.concat(C(n)===M?ue(t,{placement:n,boundary:p,rootBoundary:u,padding:c,flipVariations:h,allowedAutoPlacements:m}):n)}),[]),x=t.rects.reference,w=t.rects.popper,O=new Map,j=!0,E=b[0],k=0;k=0,S=R?"width":"height",V=J(t,{placement:B,boundary:p,rootBoundary:u,altBoundary:l,padding:c}),q=R?T?L:P:T?A:D;x[S]>w[S]&&(q=fe(q));var N=fe(q),I=[];if(i&&I.push(V[H]<=0),s&&I.push(V[q]<=0,V[N]<=0),I.every((function(e){return e}))){E=B,j=!1;break}O.set(B,I)}if(j)for(var _=function(e){var t=b.find((function(t){var n=O.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return E=t,"break"},F=h?3:1;F>0;F--){if("break"===_(F))break}t.placement!==E&&(t.modifiersData[r]._skip=!0,t.placement=E,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function de(e,t,n){return i(e,a(t,n))}var he={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,s=void 0===o||o,f=n.altAxis,c=void 0!==f&&f,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.padding,h=n.tether,m=void 0===h||h,v=n.tetherOffset,y=void 0===v?0:v,b=J(t,{boundary:p,rootBoundary:u,padding:d,altBoundary:l}),x=C(t.placement),w=U(t.placement),O=!w,j=z(x),M="x"===j?"y":"x",k=t.modifiersData.popperOffsets,B=t.rects.reference,H=t.rects.popper,T="function"==typeof y?y(Object.assign({},t.rects,{placement:t.placement})):y,R="number"==typeof T?{mainAxis:T,altAxis:T}:Object.assign({mainAxis:0,altAxis:0},T),S=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,V={x:0,y:0};if(k){if(s){var q,N="y"===j?D:P,I="y"===j?A:L,_="y"===j?"height":"width",F=k[j],X=F+b[N],Y=F-b[I],G=m?-H[_]/2:0,K=w===W?B[_]:H[_],Q=w===W?-H[_]:-B[_],Z=t.elements.arrow,$=m&&Z?g(Z):{width:0,height:0},ee=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},te=ee[N],ne=ee[I],re=de(0,B[_],$[_]),oe=O?B[_]/2-G-re-te-R.mainAxis:K-re-te-R.mainAxis,ie=O?-B[_]/2+G+re+ne+R.mainAxis:Q+re+ne+R.mainAxis,ae=t.elements.arrow&&E(t.elements.arrow),se=ae?"y"===j?ae.clientTop||0:ae.clientLeft||0:0,fe=null!=(q=null==S?void 0:S[j])?q:0,ce=F+ie-fe,pe=de(m?a(X,F+oe-fe-se):X,F,m?i(Y,ce):Y);k[j]=pe,V[j]=pe-F}if(c){var ue,le="x"===j?D:P,he="x"===j?A:L,me=k[M],ve="y"===M?"height":"width",ye=me+b[le],ge=me-b[he],be=-1!==[D,P].indexOf(x),xe=null!=(ue=null==S?void 0:S[M])?ue:0,we=be?ye:me-B[ve]-H[ve]-xe+R.altAxis,Oe=be?me+B[ve]+H[ve]-xe-R.altAxis:ge,je=m&&be?function(e,t,n){var r=de(e,t,n);return r>n?n:r}(we,me,Oe):de(m?we:ye,me,m?Oe:ge);k[M]=je,V[M]=je-me}t.modifiersData[r]=V}},requiresIfExists:["offset"]};var me={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=C(n.placement),f=z(s),c=[P,L].indexOf(s)>=0?"height":"width";if(i&&a){var p=function(e,t){return Y("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:G(e,k))}(o.padding,n),u=g(i),l="y"===f?D:P,d="y"===f?A:L,h=n.rects.reference[c]+n.rects.reference[f]-a[f]-n.rects.popper[c],m=a[f]-n.rects.reference[f],v=E(i),y=v?"y"===f?v.clientHeight||0:v.clientWidth||0:0,b=h/2-m/2,x=p[l],w=y-u[c]-p[d],O=y/2-u[c]/2+b,j=de(x,O,w),M=f;n.modifiersData[r]=((t={})[M]=j,t.centerOffset=j-O,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&N(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ve(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function ye(e){return[D,L,A,P].some((function(t){return e[t]>=0}))}var ge={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=J(t,{elementContext:"reference"}),s=J(t,{altBoundary:!0}),f=ve(a,r),c=ve(s,o,i),p=ye(f),u=ye(c);t.modifiersData[n]={referenceClippingOffsets:f,popperEscapeOffsets:c,isReferenceHidden:p,hasPopperEscaped:u},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":u})}},be=Z({defaultModifiers:[ee,te,oe,ie]}),xe=[ee,te,oe,ie,ae,le,he,me,ge],we=Z({defaultModifiers:xe});e.applyStyles=ie,e.arrow=me,e.computeStyles=oe,e.createPopper=we,e.createPopperLite=be,e.defaultModifiers=xe,e.detectOverflow=J,e.eventListeners=ee,e.flip=le,e.hide=ge,e.offset=ae,e.popperGenerator=Z,e.popperOffsets=te,e.preventOverflow=he,Object.defineProperty(e,"__esModule",{value:!0})})); + diff --git a/docs/validmind_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css b/docs/validmind_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css new file mode 100644 index 000000000..80e34e41a --- /dev/null +++ b/docs/validmind_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css @@ -0,0 +1,205 @@ +/* quarto syntax highlight colors */ +:root { + --quarto-hl-ot-color: #003B4F; + --quarto-hl-at-color: #657422; + --quarto-hl-ss-color: #20794D; + --quarto-hl-an-color: #5E5E5E; + --quarto-hl-fu-color: #4758AB; + --quarto-hl-st-color: #20794D; + --quarto-hl-cf-color: #003B4F; + --quarto-hl-op-color: #5E5E5E; + --quarto-hl-er-color: #AD0000; + --quarto-hl-bn-color: #AD0000; + --quarto-hl-al-color: #AD0000; + --quarto-hl-va-color: #111111; + --quarto-hl-bu-color: inherit; + --quarto-hl-ex-color: inherit; + --quarto-hl-pp-color: #AD0000; + --quarto-hl-in-color: #5E5E5E; + --quarto-hl-vs-color: #20794D; + --quarto-hl-wa-color: #5E5E5E; + --quarto-hl-do-color: #5E5E5E; + --quarto-hl-im-color: #00769E; + --quarto-hl-ch-color: #20794D; + --quarto-hl-dt-color: #AD0000; + --quarto-hl-fl-color: #AD0000; + --quarto-hl-co-color: #5E5E5E; + --quarto-hl-cv-color: #5E5E5E; + --quarto-hl-cn-color: #8f5902; + --quarto-hl-sc-color: #5E5E5E; + --quarto-hl-dv-color: #AD0000; + --quarto-hl-kw-color: #003B4F; +} + +/* other quarto variables */ +:root { + --quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +pre > code.sourceCode > span { + color: #003B4F; +} + +code span { + color: #003B4F; +} + +code.sourceCode > span { + color: #003B4F; +} + +div.sourceCode, +div.sourceCode pre.sourceCode { + color: #003B4F; +} + +code span.ot { + color: #003B4F; + font-style: inherit; +} + +code span.at { + color: #657422; + font-style: inherit; +} + +code span.ss { + color: #20794D; + font-style: inherit; +} + +code span.an { + color: #5E5E5E; + font-style: inherit; +} + +code span.fu { + color: #4758AB; + font-style: inherit; +} + +code span.st { + color: #20794D; + font-style: inherit; +} + +code span.cf { + color: #003B4F; + font-weight: bold; + font-style: inherit; +} + +code span.op { + color: #5E5E5E; + font-style: inherit; +} + +code span.er { + color: #AD0000; + font-style: inherit; +} + +code span.bn { + color: #AD0000; + font-style: inherit; +} + +code span.al { + color: #AD0000; + font-style: inherit; +} + +code span.va { + color: #111111; + font-style: inherit; +} + +code span.bu { + font-style: inherit; +} + +code span.ex { + font-style: inherit; +} + +code span.pp { + color: #AD0000; + font-style: inherit; +} + +code span.in { + color: #5E5E5E; + font-style: inherit; +} + +code span.vs { + color: #20794D; + font-style: inherit; +} + +code span.wa { + color: #5E5E5E; + font-style: italic; +} + +code span.do { + color: #5E5E5E; + font-style: italic; +} + +code span.im { + color: #00769E; + font-style: inherit; +} + +code span.ch { + color: #20794D; + font-style: inherit; +} + +code span.dt { + color: #AD0000; + font-style: inherit; +} + +code span.fl { + color: #AD0000; + font-style: inherit; +} + +code span.co { + color: #5E5E5E; + font-style: inherit; +} + +code span.cv { + color: #5E5E5E; + font-style: italic; +} + +code span.cn { + color: #8f5902; + font-style: inherit; +} + +code span.sc { + color: #5E5E5E; + font-style: inherit; +} + +code span.dv { + color: #AD0000; + font-style: inherit; +} + +code span.kw { + color: #003B4F; + font-weight: bold; + font-style: inherit; +} + +.prevent-inlining { + content: " { + // Find any conflicting margin elements and add margins to the + // top to prevent overlap + const marginChildren = window.document.querySelectorAll( + ".column-margin.column-container > *, .margin-caption, .aside" + ); + + let lastBottom = 0; + for (const marginChild of marginChildren) { + if (marginChild.offsetParent !== null) { + // clear the top margin so we recompute it + marginChild.style.marginTop = null; + const top = marginChild.getBoundingClientRect().top + window.scrollY; + if (top < lastBottom) { + const marginChildStyle = window.getComputedStyle(marginChild); + const marginBottom = parseFloat(marginChildStyle["marginBottom"]); + const margin = lastBottom - top + marginBottom; + marginChild.style.marginTop = `${margin}px`; + } + const styles = window.getComputedStyle(marginChild); + const marginTop = parseFloat(styles["marginTop"]); + lastBottom = top + marginChild.getBoundingClientRect().height + marginTop; + } + } +}; + +window.document.addEventListener("DOMContentLoaded", function (_event) { + // Recompute the position of margin elements anytime the body size changes + if (window.ResizeObserver) { + const resizeObserver = new window.ResizeObserver( + throttle(() => { + layoutMarginEls(); + if ( + window.document.body.getBoundingClientRect().width < 990 && + isReaderMode() + ) { + quartoToggleReader(); + } + }, 50) + ); + resizeObserver.observe(window.document.body); + } + + const tocEl = window.document.querySelector('nav.toc-active[role="doc-toc"]'); + const sidebarEl = window.document.getElementById("quarto-sidebar"); + const leftTocEl = window.document.getElementById("quarto-sidebar-toc-left"); + const marginSidebarEl = window.document.getElementById( + "quarto-margin-sidebar" + ); + // function to determine whether the element has a previous sibling that is active + const prevSiblingIsActiveLink = (el) => { + const sibling = el.previousElementSibling; + if (sibling && sibling.tagName === "A") { + return sibling.classList.contains("active"); + } else { + return false; + } + }; + + // fire slideEnter for bootstrap tab activations (for htmlwidget resize behavior) + function fireSlideEnter(e) { + const event = window.document.createEvent("Event"); + event.initEvent("slideenter", true, true); + window.document.dispatchEvent(event); + } + const tabs = window.document.querySelectorAll('a[data-bs-toggle="tab"]'); + tabs.forEach((tab) => { + tab.addEventListener("shown.bs.tab", fireSlideEnter); + }); + + // fire slideEnter for tabby tab activations (for htmlwidget resize behavior) + document.addEventListener("tabby", fireSlideEnter, false); + + // Track scrolling and mark TOC links as active + // get table of contents and sidebar (bail if we don't have at least one) + const tocLinks = tocEl + ? [...tocEl.querySelectorAll("a[data-scroll-target]")] + : []; + const makeActive = (link) => tocLinks[link].classList.add("active"); + const removeActive = (link) => tocLinks[link].classList.remove("active"); + const removeAllActive = () => + [...Array(tocLinks.length).keys()].forEach((link) => removeActive(link)); + + // activate the anchor for a section associated with this TOC entry + tocLinks.forEach((link) => { + link.addEventListener("click", () => { + if (link.href.indexOf("#") !== -1) { + const anchor = link.href.split("#")[1]; + const heading = window.document.querySelector( + `[data-anchor-id="${anchor}"]` + ); + if (heading) { + // Add the class + heading.classList.add("reveal-anchorjs-link"); + + // function to show the anchor + const handleMouseout = () => { + heading.classList.remove("reveal-anchorjs-link"); + heading.removeEventListener("mouseout", handleMouseout); + }; + + // add a function to clear the anchor when the user mouses out of it + heading.addEventListener("mouseout", handleMouseout); + } + } + }); + }); + + const sections = tocLinks.map((link) => { + const target = link.getAttribute("data-scroll-target"); + if (target.startsWith("#")) { + return window.document.getElementById(decodeURI(`${target.slice(1)}`)); + } else { + return window.document.querySelector(decodeURI(`${target}`)); + } + }); + + const sectionMargin = 200; + let currentActive = 0; + // track whether we've initialized state the first time + let init = false; + + const updateActiveLink = () => { + // The index from bottom to top (e.g. reversed list) + let sectionIndex = -1; + if ( + window.innerHeight + window.pageYOffset >= + window.document.body.offsetHeight + ) { + // This is the no-scroll case where last section should be the active one + sectionIndex = 0; + } else { + // This finds the last section visible on screen that should be made active + sectionIndex = [...sections].reverse().findIndex((section) => { + if (section) { + return window.pageYOffset >= section.offsetTop - sectionMargin; + } else { + return false; + } + }); + } + if (sectionIndex > -1) { + const current = sections.length - sectionIndex - 1; + if (current !== currentActive) { + removeAllActive(); + currentActive = current; + makeActive(current); + if (init) { + window.dispatchEvent(sectionChanged); + } + init = true; + } + } + }; + + const inHiddenRegion = (top, bottom, hiddenRegions) => { + for (const region of hiddenRegions) { + if (top <= region.bottom && bottom >= region.top) { + return true; + } + } + return false; + }; + + const categorySelector = "header.quarto-title-block .quarto-category"; + const activateCategories = (href) => { + // Find any categories + // Surround them with a link pointing back to: + // #category=Authoring + try { + const categoryEls = window.document.querySelectorAll(categorySelector); + for (const categoryEl of categoryEls) { + const categoryText = categoryEl.textContent; + if (categoryText) { + const link = `${href}#category=${encodeURIComponent(categoryText)}`; + const linkEl = window.document.createElement("a"); + linkEl.setAttribute("href", link); + for (const child of categoryEl.childNodes) { + linkEl.append(child); + } + categoryEl.appendChild(linkEl); + } + } + } catch { + // Ignore errors + } + }; + function hasTitleCategories() { + return window.document.querySelector(categorySelector) !== null; + } + + function offsetRelativeUrl(url) { + const offset = getMeta("quarto:offset"); + return offset ? offset + url : url; + } + + function offsetAbsoluteUrl(url) { + const offset = getMeta("quarto:offset"); + const baseUrl = new URL(offset, window.location); + + const projRelativeUrl = url.replace(baseUrl, ""); + if (projRelativeUrl.startsWith("/")) { + return projRelativeUrl; + } else { + return "/" + projRelativeUrl; + } + } + + // read a meta tag value + function getMeta(metaName) { + const metas = window.document.getElementsByTagName("meta"); + for (let i = 0; i < metas.length; i++) { + if (metas[i].getAttribute("name") === metaName) { + return metas[i].getAttribute("content"); + } + } + return ""; + } + + async function findAndActivateCategories() { + // Categories search with listing only use path without query + const currentPagePath = offsetAbsoluteUrl( + window.location.origin + window.location.pathname + ); + const response = await fetch(offsetRelativeUrl("listings.json")); + if (response.status == 200) { + return response.json().then(function (listingPaths) { + const listingHrefs = []; + for (const listingPath of listingPaths) { + const pathWithoutLeadingSlash = listingPath.listing.substring(1); + for (const item of listingPath.items) { + if ( + item === currentPagePath || + item === currentPagePath + "index.html" + ) { + // Resolve this path against the offset to be sure + // we already are using the correct path to the listing + // (this adjusts the listing urls to be rooted against + // whatever root the page is actually running against) + const relative = offsetRelativeUrl(pathWithoutLeadingSlash); + const baseUrl = window.location; + const resolvedPath = new URL(relative, baseUrl); + listingHrefs.push(resolvedPath.pathname); + break; + } + } + } + + // Look up the tree for a nearby linting and use that if we find one + const nearestListing = findNearestParentListing( + offsetAbsoluteUrl(window.location.pathname), + listingHrefs + ); + if (nearestListing) { + activateCategories(nearestListing); + } else { + // See if the referrer is a listing page for this item + const referredRelativePath = offsetAbsoluteUrl(document.referrer); + const referrerListing = listingHrefs.find((listingHref) => { + const isListingReferrer = + listingHref === referredRelativePath || + listingHref === referredRelativePath + "index.html"; + return isListingReferrer; + }); + + if (referrerListing) { + // Try to use the referrer if possible + activateCategories(referrerListing); + } else if (listingHrefs.length > 0) { + // Otherwise, just fall back to the first listing + activateCategories(listingHrefs[0]); + } + } + }); + } + } + if (hasTitleCategories()) { + findAndActivateCategories(); + } + + const findNearestParentListing = (href, listingHrefs) => { + if (!href || !listingHrefs) { + return undefined; + } + // Look up the tree for a nearby linting and use that if we find one + const relativeParts = href.substring(1).split("/"); + while (relativeParts.length > 0) { + const path = relativeParts.join("/"); + for (const listingHref of listingHrefs) { + if (listingHref.startsWith(path)) { + return listingHref; + } + } + relativeParts.pop(); + } + + return undefined; + }; + + const manageSidebarVisiblity = (el, placeholderDescriptor) => { + let isVisible = true; + let elRect; + + return (hiddenRegions) => { + if (el === null) { + return; + } + + // Find the last element of the TOC + const lastChildEl = el.lastElementChild; + + if (lastChildEl) { + // Converts the sidebar to a menu + const convertToMenu = () => { + for (const child of el.children) { + child.style.opacity = 0; + child.style.overflow = "hidden"; + child.style.pointerEvents = "none"; + } + + nexttick(() => { + const toggleContainer = window.document.createElement("div"); + toggleContainer.style.width = "100%"; + toggleContainer.classList.add("zindex-over-content"); + toggleContainer.classList.add("quarto-sidebar-toggle"); + toggleContainer.classList.add("headroom-target"); // Marks this to be managed by headeroom + toggleContainer.id = placeholderDescriptor.id; + toggleContainer.style.position = "fixed"; + + const toggleIcon = window.document.createElement("i"); + toggleIcon.classList.add("quarto-sidebar-toggle-icon"); + toggleIcon.classList.add("bi"); + toggleIcon.classList.add("bi-caret-down-fill"); + + const toggleTitle = window.document.createElement("div"); + const titleEl = window.document.body.querySelector( + placeholderDescriptor.titleSelector + ); + if (titleEl) { + toggleTitle.append( + titleEl.textContent || titleEl.innerText, + toggleIcon + ); + } + toggleTitle.classList.add("zindex-over-content"); + toggleTitle.classList.add("quarto-sidebar-toggle-title"); + toggleContainer.append(toggleTitle); + + const toggleContents = window.document.createElement("div"); + toggleContents.classList = el.classList; + toggleContents.classList.add("zindex-over-content"); + toggleContents.classList.add("quarto-sidebar-toggle-contents"); + for (const child of el.children) { + if (child.id === "toc-title") { + continue; + } + + const clone = child.cloneNode(true); + clone.style.opacity = 1; + clone.style.pointerEvents = null; + clone.style.display = null; + toggleContents.append(clone); + } + toggleContents.style.height = "0px"; + const positionToggle = () => { + // position the element (top left of parent, same width as parent) + if (!elRect) { + elRect = el.getBoundingClientRect(); + } + toggleContainer.style.left = `${elRect.left}px`; + toggleContainer.style.top = `${elRect.top}px`; + toggleContainer.style.width = `${elRect.width}px`; + }; + positionToggle(); + + toggleContainer.append(toggleContents); + el.parentElement.prepend(toggleContainer); + + // Process clicks + let tocShowing = false; + // Allow the caller to control whether this is dismissed + // when it is clicked (e.g. sidebar navigation supports + // opening and closing the nav tree, so don't dismiss on click) + const clickEl = placeholderDescriptor.dismissOnClick + ? toggleContainer + : toggleTitle; + + const closeToggle = () => { + if (tocShowing) { + toggleContainer.classList.remove("expanded"); + toggleContents.style.height = "0px"; + tocShowing = false; + } + }; + + // Get rid of any expanded toggle if the user scrolls + window.document.addEventListener( + "scroll", + throttle(() => { + closeToggle(); + }, 50) + ); + + // Handle positioning of the toggle + window.addEventListener( + "resize", + throttle(() => { + elRect = undefined; + positionToggle(); + }, 50) + ); + + window.addEventListener("quarto-hrChanged", () => { + elRect = undefined; + }); + + // Process the click + clickEl.onclick = () => { + if (!tocShowing) { + toggleContainer.classList.add("expanded"); + toggleContents.style.height = null; + tocShowing = true; + } else { + closeToggle(); + } + }; + }); + }; + + // Converts a sidebar from a menu back to a sidebar + const convertToSidebar = () => { + for (const child of el.children) { + child.style.opacity = 1; + child.style.overflow = null; + child.style.pointerEvents = null; + } + + const placeholderEl = window.document.getElementById( + placeholderDescriptor.id + ); + if (placeholderEl) { + placeholderEl.remove(); + } + + el.classList.remove("rollup"); + }; + + if (isReaderMode()) { + convertToMenu(); + isVisible = false; + } else { + // Find the top and bottom o the element that is being managed + const elTop = el.offsetTop; + const elBottom = + elTop + lastChildEl.offsetTop + lastChildEl.offsetHeight; + + if (!isVisible) { + // If the element is current not visible reveal if there are + // no conflicts with overlay regions + if (!inHiddenRegion(elTop, elBottom, hiddenRegions)) { + convertToSidebar(); + isVisible = true; + } + } else { + // If the element is visible, hide it if it conflicts with overlay regions + // and insert a placeholder toggle (or if we're in reader mode) + if (inHiddenRegion(elTop, elBottom, hiddenRegions)) { + convertToMenu(); + isVisible = false; + } + } + } + } + }; + }; + + const tabEls = document.querySelectorAll('a[data-bs-toggle="tab"]'); + for (const tabEl of tabEls) { + const id = tabEl.getAttribute("data-bs-target"); + if (id) { + const columnEl = document.querySelector( + `${id} .column-margin, .tabset-margin-content` + ); + if (columnEl) + tabEl.addEventListener("shown.bs.tab", function (event) { + const el = event.srcElement; + if (el) { + const visibleCls = `${el.id}-margin-content`; + // walk up until we find a parent tabset + let panelTabsetEl = el.parentElement; + while (panelTabsetEl) { + if (panelTabsetEl.classList.contains("panel-tabset")) { + break; + } + panelTabsetEl = panelTabsetEl.parentElement; + } + + if (panelTabsetEl) { + const prevSib = panelTabsetEl.previousElementSibling; + if ( + prevSib && + prevSib.classList.contains("tabset-margin-container") + ) { + const childNodes = prevSib.querySelectorAll( + ".tabset-margin-content" + ); + for (const childEl of childNodes) { + if (childEl.classList.contains(visibleCls)) { + childEl.classList.remove("collapse"); + } else { + childEl.classList.add("collapse"); + } + } + } + } + } + + layoutMarginEls(); + }); + } + } + + // Manage the visibility of the toc and the sidebar + const marginScrollVisibility = manageSidebarVisiblity(marginSidebarEl, { + id: "quarto-toc-toggle", + titleSelector: "#toc-title", + dismissOnClick: true, + }); + const sidebarScrollVisiblity = manageSidebarVisiblity(sidebarEl, { + id: "quarto-sidebarnav-toggle", + titleSelector: ".title", + dismissOnClick: false, + }); + let tocLeftScrollVisibility; + if (leftTocEl) { + tocLeftScrollVisibility = manageSidebarVisiblity(leftTocEl, { + id: "quarto-lefttoc-toggle", + titleSelector: "#toc-title", + dismissOnClick: true, + }); + } + + // Find the first element that uses formatting in special columns + const conflictingEls = window.document.body.querySelectorAll( + '[class^="column-"], [class*=" column-"], aside, [class*="margin-caption"], [class*=" margin-caption"], [class*="margin-ref"], [class*=" margin-ref"]' + ); + + // Filter all the possibly conflicting elements into ones + // the do conflict on the left or ride side + const arrConflictingEls = Array.from(conflictingEls); + const leftSideConflictEls = arrConflictingEls.filter((el) => { + if (el.tagName === "ASIDE") { + return false; + } + return Array.from(el.classList).find((className) => { + return ( + className !== "column-body" && + className.startsWith("column-") && + !className.endsWith("right") && + !className.endsWith("container") && + className !== "column-margin" + ); + }); + }); + const rightSideConflictEls = arrConflictingEls.filter((el) => { + if (el.tagName === "ASIDE") { + return true; + } + + const hasMarginCaption = Array.from(el.classList).find((className) => { + return className == "margin-caption"; + }); + if (hasMarginCaption) { + return true; + } + + return Array.from(el.classList).find((className) => { + return ( + className !== "column-body" && + !className.endsWith("container") && + className.startsWith("column-") && + !className.endsWith("left") + ); + }); + }); + + const kOverlapPaddingSize = 10; + function toRegions(els) { + return els.map((el) => { + const boundRect = el.getBoundingClientRect(); + const top = + boundRect.top + + document.documentElement.scrollTop - + kOverlapPaddingSize; + return { + top, + bottom: top + el.scrollHeight + 2 * kOverlapPaddingSize, + }; + }); + } + + let hasObserved = false; + const visibleItemObserver = (els) => { + let visibleElements = [...els]; + const intersectionObserver = new IntersectionObserver( + (entries, _observer) => { + entries.forEach((entry) => { + if (entry.isIntersecting) { + if (visibleElements.indexOf(entry.target) === -1) { + visibleElements.push(entry.target); + } + } else { + visibleElements = visibleElements.filter((visibleEntry) => { + return visibleEntry !== entry; + }); + } + }); + + if (!hasObserved) { + hideOverlappedSidebars(); + } + hasObserved = true; + }, + {} + ); + els.forEach((el) => { + intersectionObserver.observe(el); + }); + + return { + getVisibleEntries: () => { + return visibleElements; + }, + }; + }; + + const rightElementObserver = visibleItemObserver(rightSideConflictEls); + const leftElementObserver = visibleItemObserver(leftSideConflictEls); + + const hideOverlappedSidebars = () => { + marginScrollVisibility(toRegions(rightElementObserver.getVisibleEntries())); + sidebarScrollVisiblity(toRegions(leftElementObserver.getVisibleEntries())); + if (tocLeftScrollVisibility) { + tocLeftScrollVisibility( + toRegions(leftElementObserver.getVisibleEntries()) + ); + } + }; + + window.quartoToggleReader = () => { + // Applies a slow class (or removes it) + // to update the transition speed + const slowTransition = (slow) => { + const manageTransition = (id, slow) => { + const el = document.getElementById(id); + if (el) { + if (slow) { + el.classList.add("slow"); + } else { + el.classList.remove("slow"); + } + } + }; + + manageTransition("TOC", slow); + manageTransition("quarto-sidebar", slow); + }; + const readerMode = !isReaderMode(); + setReaderModeValue(readerMode); + + // If we're entering reader mode, slow the transition + if (readerMode) { + slowTransition(readerMode); + } + highlightReaderToggle(readerMode); + hideOverlappedSidebars(); + + // If we're exiting reader mode, restore the non-slow transition + if (!readerMode) { + slowTransition(!readerMode); + } + }; + + const highlightReaderToggle = (readerMode) => { + const els = document.querySelectorAll(".quarto-reader-toggle"); + if (els) { + els.forEach((el) => { + if (readerMode) { + el.classList.add("reader"); + } else { + el.classList.remove("reader"); + } + }); + } + }; + + const setReaderModeValue = (val) => { + if (window.location.protocol !== "file:") { + window.localStorage.setItem("quarto-reader-mode", val); + } else { + localReaderMode = val; + } + }; + + const isReaderMode = () => { + if (window.location.protocol !== "file:") { + return window.localStorage.getItem("quarto-reader-mode") === "true"; + } else { + return localReaderMode; + } + }; + let localReaderMode = null; + + const tocOpenDepthStr = tocEl?.getAttribute("data-toc-expanded"); + const tocOpenDepth = tocOpenDepthStr ? Number(tocOpenDepthStr) : 1; + + // Walk the TOC and collapse/expand nodes + // Nodes are expanded if: + // - they are top level + // - they have children that are 'active' links + // - they are directly below an link that is 'active' + const walk = (el, depth) => { + // Tick depth when we enter a UL + if (el.tagName === "UL") { + depth = depth + 1; + } + + // It this is active link + let isActiveNode = false; + if (el.tagName === "A" && el.classList.contains("active")) { + isActiveNode = true; + } + + // See if there is an active child to this element + let hasActiveChild = false; + for (child of el.children) { + hasActiveChild = walk(child, depth) || hasActiveChild; + } + + // Process the collapse state if this is an UL + if (el.tagName === "UL") { + if (tocOpenDepth === -1 && depth > 1) { + // toc-expand: false + el.classList.add("collapse"); + } else if ( + depth <= tocOpenDepth || + hasActiveChild || + prevSiblingIsActiveLink(el) + ) { + el.classList.remove("collapse"); + } else { + el.classList.add("collapse"); + } + + // untick depth when we leave a UL + depth = depth - 1; + } + return hasActiveChild || isActiveNode; + }; + + // walk the TOC and expand / collapse any items that should be shown + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + + // Throttle the scroll event and walk peridiocally + window.document.addEventListener( + "scroll", + throttle(() => { + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + if (!isReaderMode()) { + hideOverlappedSidebars(); + } + }, 5) + ); + window.addEventListener( + "resize", + throttle(() => { + if (tocEl) { + updateActiveLink(); + walk(tocEl, 0); + } + if (!isReaderMode()) { + hideOverlappedSidebars(); + } + }, 10) + ); + hideOverlappedSidebars(); + highlightReaderToggle(isReaderMode()); +}); + +// grouped tabsets +window.addEventListener("pageshow", (_event) => { + function getTabSettings() { + const data = localStorage.getItem("quarto-persistent-tabsets-data"); + if (!data) { + localStorage.setItem("quarto-persistent-tabsets-data", "{}"); + return {}; + } + if (data) { + return JSON.parse(data); + } + } + + function setTabSettings(data) { + localStorage.setItem( + "quarto-persistent-tabsets-data", + JSON.stringify(data) + ); + } + + function setTabState(groupName, groupValue) { + const data = getTabSettings(); + data[groupName] = groupValue; + setTabSettings(data); + } + + function toggleTab(tab, active) { + const tabPanelId = tab.getAttribute("aria-controls"); + const tabPanel = document.getElementById(tabPanelId); + if (active) { + tab.classList.add("active"); + tabPanel.classList.add("active"); + } else { + tab.classList.remove("active"); + tabPanel.classList.remove("active"); + } + } + + function toggleAll(selectedGroup, selectorsToSync) { + for (const [thisGroup, tabs] of Object.entries(selectorsToSync)) { + const active = selectedGroup === thisGroup; + for (const tab of tabs) { + toggleTab(tab, active); + } + } + } + + function findSelectorsToSyncByLanguage() { + const result = {}; + const tabs = Array.from( + document.querySelectorAll(`div[data-group] a[id^='tabset-']`) + ); + for (const item of tabs) { + const div = item.parentElement.parentElement.parentElement; + const group = div.getAttribute("data-group"); + if (!result[group]) { + result[group] = {}; + } + const selectorsToSync = result[group]; + const value = item.innerHTML; + if (!selectorsToSync[value]) { + selectorsToSync[value] = []; + } + selectorsToSync[value].push(item); + } + return result; + } + + function setupSelectorSync() { + const selectorsToSync = findSelectorsToSyncByLanguage(); + Object.entries(selectorsToSync).forEach(([group, tabSetsByValue]) => { + Object.entries(tabSetsByValue).forEach(([value, items]) => { + items.forEach((item) => { + item.addEventListener("click", (_event) => { + setTabState(group, value); + toggleAll(value, selectorsToSync[group]); + }); + }); + }); + }); + return selectorsToSync; + } + + const selectorsToSync = setupSelectorSync(); + for (const [group, selectedName] of Object.entries(getTabSettings())) { + const selectors = selectorsToSync[group]; + // it's possible that stale state gives us empty selections, so we explicitly check here. + if (selectors) { + toggleAll(selectedName, selectors); + } + } +}); + +function throttle(func, wait) { + let waiting = false; + return function () { + if (!waiting) { + func.apply(this, arguments); + waiting = true; + setTimeout(function () { + waiting = false; + }, wait); + } + }; +} + +function nexttick(func) { + return setTimeout(func, 0); +} diff --git a/docs/validmind_files/libs/quarto-html/tippy.css b/docs/validmind_files/libs/quarto-html/tippy.css new file mode 100644 index 000000000..e6ae635cb --- /dev/null +++ b/docs/validmind_files/libs/quarto-html/tippy.css @@ -0,0 +1 @@ +.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1} \ No newline at end of file diff --git a/docs/validmind_files/libs/quarto-html/tippy.umd.min.js b/docs/validmind_files/libs/quarto-html/tippy.umd.min.js new file mode 100644 index 000000000..ca292be32 --- /dev/null +++ b/docs/validmind_files/libs/quarto-html/tippy.umd.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],t):(e=e||self).tippy=t(e.Popper)}(this,(function(e){"use strict";var t={passive:!0,capture:!0},n=function(){return document.body};function r(e,t,n){if(Array.isArray(e)){var r=e[t];return null==r?Array.isArray(n)?n[t]:n:r}return e}function o(e,t){var n={}.toString.call(e);return 0===n.indexOf("[object")&&n.indexOf(t+"]")>-1}function i(e,t){return"function"==typeof e?e.apply(void 0,t):e}function a(e,t){return 0===t?e:function(r){clearTimeout(n),n=setTimeout((function(){e(r)}),t)};var n}function s(e,t){var n=Object.assign({},e);return t.forEach((function(e){delete n[e]})),n}function u(e){return[].concat(e)}function c(e,t){-1===e.indexOf(t)&&e.push(t)}function p(e){return e.split("-")[0]}function f(e){return[].slice.call(e)}function l(e){return Object.keys(e).reduce((function(t,n){return void 0!==e[n]&&(t[n]=e[n]),t}),{})}function d(){return document.createElement("div")}function v(e){return["Element","Fragment"].some((function(t){return o(e,t)}))}function m(e){return o(e,"MouseEvent")}function g(e){return!(!e||!e._tippy||e._tippy.reference!==e)}function h(e){return v(e)?[e]:function(e){return o(e,"NodeList")}(e)?f(e):Array.isArray(e)?e:f(document.querySelectorAll(e))}function b(e,t){e.forEach((function(e){e&&(e.style.transitionDuration=t+"ms")}))}function y(e,t){e.forEach((function(e){e&&e.setAttribute("data-state",t)}))}function w(e){var t,n=u(e)[0];return null!=n&&null!=(t=n.ownerDocument)&&t.body?n.ownerDocument:document}function E(e,t,n){var r=t+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(t){e[r](t,n)}))}function O(e,t){for(var n=t;n;){var r;if(e.contains(n))return!0;n=null==n.getRootNode||null==(r=n.getRootNode())?void 0:r.host}return!1}var x={isTouch:!1},C=0;function T(){x.isTouch||(x.isTouch=!0,window.performance&&document.addEventListener("mousemove",A))}function A(){var e=performance.now();e-C<20&&(x.isTouch=!1,document.removeEventListener("mousemove",A)),C=e}function L(){var e=document.activeElement;if(g(e)){var t=e._tippy;e.blur&&!t.state.isVisible&&e.blur()}}var D=!!("undefined"!=typeof window&&"undefined"!=typeof document)&&!!window.msCrypto,R=Object.assign({appendTo:n,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),k=Object.keys(R);function P(e){var t=(e.plugins||[]).reduce((function(t,n){var r,o=n.name,i=n.defaultValue;o&&(t[o]=void 0!==e[o]?e[o]:null!=(r=R[o])?r:i);return t}),{});return Object.assign({},e,t)}function j(e,t){var n=Object.assign({},t,{content:i(t.content,[e])},t.ignoreAttributes?{}:function(e,t){return(t?Object.keys(P(Object.assign({},R,{plugins:t}))):k).reduce((function(t,n){var r=(e.getAttribute("data-tippy-"+n)||"").trim();if(!r)return t;if("content"===n)t[n]=r;else try{t[n]=JSON.parse(r)}catch(e){t[n]=r}return t}),{})}(e,t.plugins));return n.aria=Object.assign({},R.aria,n.aria),n.aria={expanded:"auto"===n.aria.expanded?t.interactive:n.aria.expanded,content:"auto"===n.aria.content?t.interactive?null:"describedby":n.aria.content},n}function M(e,t){e.innerHTML=t}function V(e){var t=d();return!0===e?t.className="tippy-arrow":(t.className="tippy-svg-arrow",v(e)?t.appendChild(e):M(t,e)),t}function I(e,t){v(t.content)?(M(e,""),e.appendChild(t.content)):"function"!=typeof t.content&&(t.allowHTML?M(e,t.content):e.textContent=t.content)}function S(e){var t=e.firstElementChild,n=f(t.children);return{box:t,content:n.find((function(e){return e.classList.contains("tippy-content")})),arrow:n.find((function(e){return e.classList.contains("tippy-arrow")||e.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(e){return e.classList.contains("tippy-backdrop")}))}}function N(e){var t=d(),n=d();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=d();function o(n,r){var o=S(t),i=o.box,a=o.content,s=o.arrow;r.theme?i.setAttribute("data-theme",r.theme):i.removeAttribute("data-theme"),"string"==typeof r.animation?i.setAttribute("data-animation",r.animation):i.removeAttribute("data-animation"),r.inertia?i.setAttribute("data-inertia",""):i.removeAttribute("data-inertia"),i.style.maxWidth="number"==typeof r.maxWidth?r.maxWidth+"px":r.maxWidth,r.role?i.setAttribute("role",r.role):i.removeAttribute("role"),n.content===r.content&&n.allowHTML===r.allowHTML||I(a,e.props),r.arrow?s?n.arrow!==r.arrow&&(i.removeChild(s),i.appendChild(V(r.arrow))):i.appendChild(V(r.arrow)):s&&i.removeChild(s)}return r.className="tippy-content",r.setAttribute("data-state","hidden"),I(r,e.props),t.appendChild(n),n.appendChild(r),o(e.props,e.props),{popper:t,onUpdate:o}}N.$$tippy=!0;var B=1,H=[],U=[];function _(o,s){var v,g,h,C,T,A,L,k,M=j(o,Object.assign({},R,P(l(s)))),V=!1,I=!1,N=!1,_=!1,F=[],W=a(we,M.interactiveDebounce),X=B++,Y=(k=M.plugins).filter((function(e,t){return k.indexOf(e)===t})),$={id:X,reference:o,popper:d(),popperInstance:null,props:M,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:Y,clearDelayTimeouts:function(){clearTimeout(v),clearTimeout(g),cancelAnimationFrame(h)},setProps:function(e){if($.state.isDestroyed)return;ae("onBeforeUpdate",[$,e]),be();var t=$.props,n=j(o,Object.assign({},t,l(e),{ignoreAttributes:!0}));$.props=n,he(),t.interactiveDebounce!==n.interactiveDebounce&&(ce(),W=a(we,n.interactiveDebounce));t.triggerTarget&&!n.triggerTarget?u(t.triggerTarget).forEach((function(e){e.removeAttribute("aria-expanded")})):n.triggerTarget&&o.removeAttribute("aria-expanded");ue(),ie(),J&&J(t,n);$.popperInstance&&(Ce(),Ae().forEach((function(e){requestAnimationFrame(e._tippy.popperInstance.forceUpdate)})));ae("onAfterUpdate",[$,e])},setContent:function(e){$.setProps({content:e})},show:function(){var e=$.state.isVisible,t=$.state.isDestroyed,o=!$.state.isEnabled,a=x.isTouch&&!$.props.touch,s=r($.props.duration,0,R.duration);if(e||t||o||a)return;if(te().hasAttribute("disabled"))return;if(ae("onShow",[$],!1),!1===$.props.onShow($))return;$.state.isVisible=!0,ee()&&(z.style.visibility="visible");ie(),de(),$.state.isMounted||(z.style.transition="none");if(ee()){var u=re(),p=u.box,f=u.content;b([p,f],0)}A=function(){var e;if($.state.isVisible&&!_){if(_=!0,z.offsetHeight,z.style.transition=$.props.moveTransition,ee()&&$.props.animation){var t=re(),n=t.box,r=t.content;b([n,r],s),y([n,r],"visible")}se(),ue(),c(U,$),null==(e=$.popperInstance)||e.forceUpdate(),ae("onMount",[$]),$.props.animation&&ee()&&function(e,t){me(e,t)}(s,(function(){$.state.isShown=!0,ae("onShown",[$])}))}},function(){var e,t=$.props.appendTo,r=te();e=$.props.interactive&&t===n||"parent"===t?r.parentNode:i(t,[r]);e.contains(z)||e.appendChild(z);$.state.isMounted=!0,Ce()}()},hide:function(){var e=!$.state.isVisible,t=$.state.isDestroyed,n=!$.state.isEnabled,o=r($.props.duration,1,R.duration);if(e||t||n)return;if(ae("onHide",[$],!1),!1===$.props.onHide($))return;$.state.isVisible=!1,$.state.isShown=!1,_=!1,V=!1,ee()&&(z.style.visibility="hidden");if(ce(),ve(),ie(!0),ee()){var i=re(),a=i.box,s=i.content;$.props.animation&&(b([a,s],o),y([a,s],"hidden"))}se(),ue(),$.props.animation?ee()&&function(e,t){me(e,(function(){!$.state.isVisible&&z.parentNode&&z.parentNode.contains(z)&&t()}))}(o,$.unmount):$.unmount()},hideWithInteractivity:function(e){ne().addEventListener("mousemove",W),c(H,W),W(e)},enable:function(){$.state.isEnabled=!0},disable:function(){$.hide(),$.state.isEnabled=!1},unmount:function(){$.state.isVisible&&$.hide();if(!$.state.isMounted)return;Te(),Ae().forEach((function(e){e._tippy.unmount()})),z.parentNode&&z.parentNode.removeChild(z);U=U.filter((function(e){return e!==$})),$.state.isMounted=!1,ae("onHidden",[$])},destroy:function(){if($.state.isDestroyed)return;$.clearDelayTimeouts(),$.unmount(),be(),delete o._tippy,$.state.isDestroyed=!0,ae("onDestroy",[$])}};if(!M.render)return $;var q=M.render($),z=q.popper,J=q.onUpdate;z.setAttribute("data-tippy-root",""),z.id="tippy-"+$.id,$.popper=z,o._tippy=$,z._tippy=$;var G=Y.map((function(e){return e.fn($)})),K=o.hasAttribute("aria-expanded");return he(),ue(),ie(),ae("onCreate",[$]),M.showOnCreate&&Le(),z.addEventListener("mouseenter",(function(){$.props.interactive&&$.state.isVisible&&$.clearDelayTimeouts()})),z.addEventListener("mouseleave",(function(){$.props.interactive&&$.props.trigger.indexOf("mouseenter")>=0&&ne().addEventListener("mousemove",W)})),$;function Q(){var e=$.props.touch;return Array.isArray(e)?e:[e,0]}function Z(){return"hold"===Q()[0]}function ee(){var e;return!(null==(e=$.props.render)||!e.$$tippy)}function te(){return L||o}function ne(){var e=te().parentNode;return e?w(e):document}function re(){return S(z)}function oe(e){return $.state.isMounted&&!$.state.isVisible||x.isTouch||C&&"focus"===C.type?0:r($.props.delay,e?0:1,R.delay)}function ie(e){void 0===e&&(e=!1),z.style.pointerEvents=$.props.interactive&&!e?"":"none",z.style.zIndex=""+$.props.zIndex}function ae(e,t,n){var r;(void 0===n&&(n=!0),G.forEach((function(n){n[e]&&n[e].apply(n,t)})),n)&&(r=$.props)[e].apply(r,t)}function se(){var e=$.props.aria;if(e.content){var t="aria-"+e.content,n=z.id;u($.props.triggerTarget||o).forEach((function(e){var r=e.getAttribute(t);if($.state.isVisible)e.setAttribute(t,r?r+" "+n:n);else{var o=r&&r.replace(n,"").trim();o?e.setAttribute(t,o):e.removeAttribute(t)}}))}}function ue(){!K&&$.props.aria.expanded&&u($.props.triggerTarget||o).forEach((function(e){$.props.interactive?e.setAttribute("aria-expanded",$.state.isVisible&&e===te()?"true":"false"):e.removeAttribute("aria-expanded")}))}function ce(){ne().removeEventListener("mousemove",W),H=H.filter((function(e){return e!==W}))}function pe(e){if(!x.isTouch||!N&&"mousedown"!==e.type){var t=e.composedPath&&e.composedPath()[0]||e.target;if(!$.props.interactive||!O(z,t)){if(u($.props.triggerTarget||o).some((function(e){return O(e,t)}))){if(x.isTouch)return;if($.state.isVisible&&$.props.trigger.indexOf("click")>=0)return}else ae("onClickOutside",[$,e]);!0===$.props.hideOnClick&&($.clearDelayTimeouts(),$.hide(),I=!0,setTimeout((function(){I=!1})),$.state.isMounted||ve())}}}function fe(){N=!0}function le(){N=!1}function de(){var e=ne();e.addEventListener("mousedown",pe,!0),e.addEventListener("touchend",pe,t),e.addEventListener("touchstart",le,t),e.addEventListener("touchmove",fe,t)}function ve(){var e=ne();e.removeEventListener("mousedown",pe,!0),e.removeEventListener("touchend",pe,t),e.removeEventListener("touchstart",le,t),e.removeEventListener("touchmove",fe,t)}function me(e,t){var n=re().box;function r(e){e.target===n&&(E(n,"remove",r),t())}if(0===e)return t();E(n,"remove",T),E(n,"add",r),T=r}function ge(e,t,n){void 0===n&&(n=!1),u($.props.triggerTarget||o).forEach((function(r){r.addEventListener(e,t,n),F.push({node:r,eventType:e,handler:t,options:n})}))}function he(){var e;Z()&&(ge("touchstart",ye,{passive:!0}),ge("touchend",Ee,{passive:!0})),(e=$.props.trigger,e.split(/\s+/).filter(Boolean)).forEach((function(e){if("manual"!==e)switch(ge(e,ye),e){case"mouseenter":ge("mouseleave",Ee);break;case"focus":ge(D?"focusout":"blur",Oe);break;case"focusin":ge("focusout",Oe)}}))}function be(){F.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),F=[]}function ye(e){var t,n=!1;if($.state.isEnabled&&!xe(e)&&!I){var r="focus"===(null==(t=C)?void 0:t.type);C=e,L=e.currentTarget,ue(),!$.state.isVisible&&m(e)&&H.forEach((function(t){return t(e)})),"click"===e.type&&($.props.trigger.indexOf("mouseenter")<0||V)&&!1!==$.props.hideOnClick&&$.state.isVisible?n=!0:Le(e),"click"===e.type&&(V=!n),n&&!r&&De(e)}}function we(e){var t=e.target,n=te().contains(t)||z.contains(t);"mousemove"===e.type&&n||function(e,t){var n=t.clientX,r=t.clientY;return e.every((function(e){var t=e.popperRect,o=e.popperState,i=e.props.interactiveBorder,a=p(o.placement),s=o.modifiersData.offset;if(!s)return!0;var u="bottom"===a?s.top.y:0,c="top"===a?s.bottom.y:0,f="right"===a?s.left.x:0,l="left"===a?s.right.x:0,d=t.top-r+u>i,v=r-t.bottom-c>i,m=t.left-n+f>i,g=n-t.right-l>i;return d||v||m||g}))}(Ae().concat(z).map((function(e){var t,n=null==(t=e._tippy.popperInstance)?void 0:t.state;return n?{popperRect:e.getBoundingClientRect(),popperState:n,props:M}:null})).filter(Boolean),e)&&(ce(),De(e))}function Ee(e){xe(e)||$.props.trigger.indexOf("click")>=0&&V||($.props.interactive?$.hideWithInteractivity(e):De(e))}function Oe(e){$.props.trigger.indexOf("focusin")<0&&e.target!==te()||$.props.interactive&&e.relatedTarget&&z.contains(e.relatedTarget)||De(e)}function xe(e){return!!x.isTouch&&Z()!==e.type.indexOf("touch")>=0}function Ce(){Te();var t=$.props,n=t.popperOptions,r=t.placement,i=t.offset,a=t.getReferenceClientRect,s=t.moveTransition,u=ee()?S(z).arrow:null,c=a?{getBoundingClientRect:a,contextElement:a.contextElement||te()}:o,p=[{name:"offset",options:{offset:i}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(e){var t=e.state;if(ee()){var n=re().box;["placement","reference-hidden","escaped"].forEach((function(e){"placement"===e?n.setAttribute("data-placement",t.placement):t.attributes.popper["data-popper-"+e]?n.setAttribute("data-"+e,""):n.removeAttribute("data-"+e)})),t.attributes.popper={}}}}];ee()&&u&&p.push({name:"arrow",options:{element:u,padding:3}}),p.push.apply(p,(null==n?void 0:n.modifiers)||[]),$.popperInstance=e.createPopper(c,z,Object.assign({},n,{placement:r,onFirstUpdate:A,modifiers:p}))}function Te(){$.popperInstance&&($.popperInstance.destroy(),$.popperInstance=null)}function Ae(){return f(z.querySelectorAll("[data-tippy-root]"))}function Le(e){$.clearDelayTimeouts(),e&&ae("onTrigger",[$,e]),de();var t=oe(!0),n=Q(),r=n[0],o=n[1];x.isTouch&&"hold"===r&&o&&(t=o),t?v=setTimeout((function(){$.show()}),t):$.show()}function De(e){if($.clearDelayTimeouts(),ae("onUntrigger",[$,e]),$.state.isVisible){if(!($.props.trigger.indexOf("mouseenter")>=0&&$.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(e.type)>=0&&V)){var t=oe(!1);t?g=setTimeout((function(){$.state.isVisible&&$.hide()}),t):h=requestAnimationFrame((function(){$.hide()}))}}else ve()}}function F(e,n){void 0===n&&(n={});var r=R.plugins.concat(n.plugins||[]);document.addEventListener("touchstart",T,t),window.addEventListener("blur",L);var o=Object.assign({},n,{plugins:r}),i=h(e).reduce((function(e,t){var n=t&&_(t,o);return n&&e.push(n),e}),[]);return v(e)?i[0]:i}F.defaultProps=R,F.setDefaultProps=function(e){Object.keys(e).forEach((function(t){R[t]=e[t]}))},F.currentInput=x;var W=Object.assign({},e.applyStyles,{effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow)}}),X={mouseover:"mouseenter",focusin:"focus",click:"click"};var Y={name:"animateFill",defaultValue:!1,fn:function(e){var t;if(null==(t=e.props.render)||!t.$$tippy)return{};var n=S(e.popper),r=n.box,o=n.content,i=e.props.animateFill?function(){var e=d();return e.className="tippy-backdrop",y([e],"hidden"),e}():null;return{onCreate:function(){i&&(r.insertBefore(i,r.firstElementChild),r.setAttribute("data-animatefill",""),r.style.overflow="hidden",e.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(i){var e=r.style.transitionDuration,t=Number(e.replace("ms",""));o.style.transitionDelay=Math.round(t/10)+"ms",i.style.transitionDuration=e,y([i],"visible")}},onShow:function(){i&&(i.style.transitionDuration="0ms")},onHide:function(){i&&y([i],"hidden")}}}};var $={clientX:0,clientY:0},q=[];function z(e){var t=e.clientX,n=e.clientY;$={clientX:t,clientY:n}}var J={name:"followCursor",defaultValue:!1,fn:function(e){var t=e.reference,n=w(e.props.triggerTarget||t),r=!1,o=!1,i=!0,a=e.props;function s(){return"initial"===e.props.followCursor&&e.state.isVisible}function u(){n.addEventListener("mousemove",f)}function c(){n.removeEventListener("mousemove",f)}function p(){r=!0,e.setProps({getReferenceClientRect:null}),r=!1}function f(n){var r=!n.target||t.contains(n.target),o=e.props.followCursor,i=n.clientX,a=n.clientY,s=t.getBoundingClientRect(),u=i-s.left,c=a-s.top;!r&&e.props.interactive||e.setProps({getReferenceClientRect:function(){var e=t.getBoundingClientRect(),n=i,r=a;"initial"===o&&(n=e.left+u,r=e.top+c);var s="horizontal"===o?e.top:r,p="vertical"===o?e.right:n,f="horizontal"===o?e.bottom:r,l="vertical"===o?e.left:n;return{width:p-l,height:f-s,top:s,right:p,bottom:f,left:l}}})}function l(){e.props.followCursor&&(q.push({instance:e,doc:n}),function(e){e.addEventListener("mousemove",z)}(n))}function d(){0===(q=q.filter((function(t){return t.instance!==e}))).filter((function(e){return e.doc===n})).length&&function(e){e.removeEventListener("mousemove",z)}(n)}return{onCreate:l,onDestroy:d,onBeforeUpdate:function(){a=e.props},onAfterUpdate:function(t,n){var i=n.followCursor;r||void 0!==i&&a.followCursor!==i&&(d(),i?(l(),!e.state.isMounted||o||s()||u()):(c(),p()))},onMount:function(){e.props.followCursor&&!o&&(i&&(f($),i=!1),s()||u())},onTrigger:function(e,t){m(t)&&($={clientX:t.clientX,clientY:t.clientY}),o="focus"===t.type},onHidden:function(){e.props.followCursor&&(p(),c(),i=!0)}}}};var G={name:"inlinePositioning",defaultValue:!1,fn:function(e){var t,n=e.reference;var r=-1,o=!1,i=[],a={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(o){var a=o.state;e.props.inlinePositioning&&(-1!==i.indexOf(a.placement)&&(i=[]),t!==a.placement&&-1===i.indexOf(a.placement)&&(i.push(a.placement),e.setProps({getReferenceClientRect:function(){return function(e){return function(e,t,n,r){if(n.length<2||null===e)return t;if(2===n.length&&r>=0&&n[0].left>n[1].right)return n[r]||t;switch(e){case"top":case"bottom":var o=n[0],i=n[n.length-1],a="top"===e,s=o.top,u=i.bottom,c=a?o.left:i.left,p=a?o.right:i.right;return{top:s,bottom:u,left:c,right:p,width:p-c,height:u-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(e){return e.left}))),l=Math.max.apply(Math,n.map((function(e){return e.right}))),d=n.filter((function(t){return"left"===e?t.left===f:t.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return t}}(p(e),n.getBoundingClientRect(),f(n.getClientRects()),r)}(a.placement)}})),t=a.placement)}};function s(){var t;o||(t=function(e,t){var n;return{popperOptions:Object.assign({},e.popperOptions,{modifiers:[].concat(((null==(n=e.popperOptions)?void 0:n.modifiers)||[]).filter((function(e){return e.name!==t.name})),[t])})}}(e.props,a),o=!0,e.setProps(t),o=!1)}return{onCreate:s,onAfterUpdate:s,onTrigger:function(t,n){if(m(n)){var o=f(e.reference.getClientRects()),i=o.find((function(e){return e.left-2<=n.clientX&&e.right+2>=n.clientX&&e.top-2<=n.clientY&&e.bottom+2>=n.clientY})),a=o.indexOf(i);r=a>-1?a:r}},onHidden:function(){r=-1}}}};var K={name:"sticky",defaultValue:!1,fn:function(e){var t=e.reference,n=e.popper;function r(t){return!0===e.props.sticky||e.props.sticky===t}var o=null,i=null;function a(){var s=r("reference")?(e.popperInstance?e.popperInstance.state.elements.reference:t).getBoundingClientRect():null,u=r("popper")?n.getBoundingClientRect():null;(s&&Q(o,s)||u&&Q(i,u))&&e.popperInstance&&e.popperInstance.update(),o=s,i=u,e.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){e.props.sticky&&a()}}}};function Q(e,t){return!e||!t||(e.top!==t.top||e.right!==t.right||e.bottom!==t.bottom||e.left!==t.left)}return F.setDefaultProps({plugins:[Y,J,G,K],render:N}),F.createSingleton=function(e,t){var n;void 0===t&&(t={});var r,o=e,i=[],a=[],c=t.overrides,p=[],f=!1;function l(){a=o.map((function(e){return u(e.props.triggerTarget||e.reference)})).reduce((function(e,t){return e.concat(t)}),[])}function v(){i=o.map((function(e){return e.reference}))}function m(e){o.forEach((function(t){e?t.enable():t.disable()}))}function g(e){return o.map((function(t){var n=t.setProps;return t.setProps=function(o){n(o),t.reference===r&&e.setProps(o)},function(){t.setProps=n}}))}function h(e,t){var n=a.indexOf(t);if(t!==r){r=t;var s=(c||[]).concat("content").reduce((function(e,t){return e[t]=o[n].props[t],e}),{});e.setProps(Object.assign({},s,{getReferenceClientRect:"function"==typeof s.getReferenceClientRect?s.getReferenceClientRect:function(){var e;return null==(e=i[n])?void 0:e.getBoundingClientRect()}}))}}m(!1),v(),l();var b={fn:function(){return{onDestroy:function(){m(!0)},onHidden:function(){r=null},onClickOutside:function(e){e.props.showOnCreate&&!f&&(f=!0,r=null)},onShow:function(e){e.props.showOnCreate&&!f&&(f=!0,h(e,i[0]))},onTrigger:function(e,t){h(e,t.currentTarget)}}}},y=F(d(),Object.assign({},s(t,["overrides"]),{plugins:[b].concat(t.plugins||[]),triggerTarget:a,popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat((null==(n=t.popperOptions)?void 0:n.modifiers)||[],[W])})})),w=y.show;y.show=function(e){if(w(),!r&&null==e)return h(y,i[0]);if(!r||null!=e){if("number"==typeof e)return i[e]&&h(y,i[e]);if(o.indexOf(e)>=0){var t=e.reference;return h(y,t)}return i.indexOf(e)>=0?h(y,e):void 0}},y.showNext=function(){var e=i[0];if(!r)return y.show(0);var t=i.indexOf(r);y.show(i[t+1]||e)},y.showPrevious=function(){var e=i[i.length-1];if(!r)return y.show(e);var t=i.indexOf(r),n=i[t-1]||e;y.show(n)};var E=y.setProps;return y.setProps=function(e){c=e.overrides||c,E(e)},y.setInstances=function(e){m(!0),p.forEach((function(e){return e()})),o=e,m(!1),v(),l(),p=g(y),y.setProps({triggerTarget:a})},p=g(y),y},F.delegate=function(e,n){var r=[],o=[],i=!1,a=n.target,c=s(n,["target"]),p=Object.assign({},c,{trigger:"manual",touch:!1}),f=Object.assign({touch:R.touch},c,{showOnCreate:!0}),l=F(e,p);function d(e){if(e.target&&!i){var t=e.target.closest(a);if(t){var r=t.getAttribute("data-tippy-trigger")||n.trigger||R.trigger;if(!t._tippy&&!("touchstart"===e.type&&"boolean"==typeof f.touch||"touchstart"!==e.type&&r.indexOf(X[e.type])<0)){var s=F(t,f);s&&(o=o.concat(s))}}}}function v(e,t,n,o){void 0===o&&(o=!1),e.addEventListener(t,n,o),r.push({node:e,eventType:t,handler:n,options:o})}return u(l).forEach((function(e){var n=e.destroy,a=e.enable,s=e.disable;e.destroy=function(e){void 0===e&&(e=!0),e&&o.forEach((function(e){e.destroy()})),o=[],r.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),r=[],n()},e.enable=function(){a(),o.forEach((function(e){return e.enable()})),i=!1},e.disable=function(){s(),o.forEach((function(e){return e.disable()})),i=!0},function(e){var n=e.reference;v(n,"touchstart",d,t),v(n,"mouseover",d),v(n,"focusin",d),v(n,"click",d)}(e)})),l},F.hideAll=function(e){var t=void 0===e?{}:e,n=t.exclude,r=t.duration;U.forEach((function(e){var t=!1;if(n&&(t=g(n)?e.reference===n:e.popper===n.popper),!t){var o=e.props.duration;e.setProps({duration:r}),e.hide(),e.state.isDestroyed||e.setProps({duration:o})}}))},F.roundArrow='',F})); + diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index c6f39dbbf..0e87b77f3 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -73,20 +73,29 @@ def is_public(member: Dict[str, Any], module: Dict[str, Any], full_data: Dict[st """Check if a member should be included in public documentation.""" name = member.get('name', '') + # Add debug logging + print(f"\nChecking visibility for: {name}") + print(f"Is root: {is_root}") + # Skip private members except __init__ and __post_init__ if name.startswith('_') and name not in {'__init__', '__post_init__'}: + print(f"- Skipping private member: {name}") return False # At root level, only show items from __all__ if is_root: root_all = get_all_members(full_data['validmind'].get('members', {})) + print(f"- Root __all__: {root_all}") return name in root_all # If module has __all__, only include members listed there if module and '__all__' in module.get('members', {}): module_all = get_all_members(module.get('members', {})) + print(f"- Module __all__: {module_all}") + print(f"- Is {name} in module __all__? {name in module_all}") return name in module_all + print(f"- No __all__ found, including {name}") return True def ensure_dir(path): @@ -149,7 +158,19 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: return result def process_module(module: Dict[str, Any], path: List[str], env: Environment, full_data: Dict[str, Any]): - """Process a module and its members.""" + """Process a module and its submodules.""" + if module.get('name') == 'tests': + print("\nProcessing tests module members:") + for name, member in module.get('members', {}).items(): + if is_public(member, module, full_data): + print(f"\n{name}:") + print(f" Original: kind={member.get('kind')}") + if member.get('kind') == 'alias': + resolved = resolve_alias(member, full_data) + print(f" Resolved: kind={resolved.get('kind')}") + print(f" Target path: {member.get('target_path')}") + print(f" In __all__: {name in get_all_members(module.get('members', {}))}") + # Parse docstrings first parse_docstrings_recursively(module) From 0b89d1b388176479afa994d64fd8cd65baaa452f Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Mon, 27 Jan 2025 17:16:29 -0800 Subject: [PATCH 024/207] Save point with docstring issues --- docs/project_tree | 1219 ----------------- docs/templates/macros/docstring.jinja2 | 15 +- docs/validmind.qmd | 356 ++++- .../classification/customer_churn.qmd | 54 +- .../datasets/classification/taiwan_credit.qmd | 54 +- .../datasets/credit_risk/lending_club.qmd | 54 +- .../credit_risk/lending_club_bias.qmd | 6 +- docs/validmind/datasets/nlp/cnn_dailymail.qmd | 11 +- docs/validmind/datasets/regression/fred.qmd | 34 +- .../datasets/regression/lending_club.qmd | 34 +- docs/validmind/test_suites.qmd | 24 +- docs/validmind/tests.qmd | 275 +++- .../tests/model_validation/BertScore.qmd | 20 + .../tests/model_validation/BleuScore.qmd | 20 + .../model_validation/ContextualRecall.qmd | 20 + .../tests/model_validation/MeteorScore.qmd | 20 + .../tests/model_validation/RegardScore.qmd | 20 + .../ClassifierThresholdOptimization.qmd | 54 +- .../sklearn/SHAPGlobalImportance.qmd | 34 + docs/validmind/vm_models.qmd | 269 +++- scripts/generate_quarto_docs.py | 87 +- 21 files changed, 1260 insertions(+), 1420 deletions(-) delete mode 100644 docs/project_tree diff --git a/docs/project_tree b/docs/project_tree deleted file mode 100644 index f51eb40bb..000000000 --- a/docs/project_tree +++ /dev/null @@ -1,1219 +0,0 @@ -. -├── LICENSE -├── Makefile -├── README.md -├── README.pypi.md -├── docs -│   ├── _build -│   │   ├── index.html -│   │   ├── search.js -│   │   ├── validmind -│   │   │   ├── __version__.html -│   │   │   ├── datasets -│   │   │   │   ├── classification -│   │   │   │   │   ├── customer_churn.html -│   │   │   │   │   └── taiwan_credit.html -│   │   │   │   ├── classification.html -│   │   │   │   ├── credit_risk -│   │   │   │   │   ├── lending_club.html -│   │   │   │   │   └── lending_club_bias.html -│   │   │   │   ├── credit_risk.html -│   │   │   │   ├── nlp -│   │   │   │   │   ├── cnn_dailymail.html -│   │   │   │   │   └── twitter_covid_19.html -│   │   │   │   ├── nlp.html -│   │   │   │   ├── regression -│   │   │   │   │   ├── fred.html -│   │   │   │   │   └── lending_club.html -│   │   │   │   └── regression.html -│   │   │   ├── datasets.html -│   │   │   ├── errors.html -│   │   │   ├── test_suites -│   │   │   │   ├── classifier.html -│   │   │   │   ├── cluster.html -│   │   │   │   ├── embeddings.html -│   │   │   │   ├── llm.html -│   │   │   │   ├── nlp.html -│   │   │   │   ├── parameters_optimization.html -│   │   │   │   ├── regression.html -│   │   │   │   ├── statsmodels_timeseries.html -│   │   │   │   ├── summarization.html -│   │   │   │   ├── tabular_datasets.html -│   │   │   │   ├── text_data.html -│   │   │   │   └── time_series.html -│   │   │   ├── test_suites.html -│   │   │   ├── tests -│   │   │   │   ├── data_validation -│   │   │   │   │   ├── ACFandPACFPlot.html -│   │   │   │   │   ├── ADF.html -│   │   │   │   │   ├── AutoAR.html -│   │   │   │   │   ├── AutoMA.html -│   │   │   │   │   ├── AutoStationarity.html -│   │   │   │   │   ├── BivariateScatterPlots.html -│   │   │   │   │   ├── BoxPierce.html -│   │   │   │   │   ├── ChiSquaredFeaturesTable.html -│   │   │   │   │   ├── ClassImbalance.html -│   │   │   │   │   ├── DatasetDescription.html -│   │   │   │   │   ├── DatasetSplit.html -│   │   │   │   │   ├── DescriptiveStatistics.html -│   │   │   │   │   ├── DickeyFullerGLS.html -│   │   │   │   │   ├── Duplicates.html -│   │   │   │   │   ├── EngleGrangerCoint.html -│   │   │   │   │   ├── FeatureTargetCorrelationPlot.html -│   │   │   │   │   ├── HighCardinality.html -│   │   │   │   │   ├── HighPearsonCorrelation.html -│   │   │   │   │   ├── IQROutliersBarPlot.html -│   │   │   │   │   ├── IQROutliersTable.html -│   │   │   │   │   ├── IsolationForestOutliers.html -│   │   │   │   │   ├── JarqueBera.html -│   │   │   │   │   ├── KPSS.html -│   │   │   │   │   ├── LJungBox.html -│   │   │   │   │   ├── LaggedCorrelationHeatmap.html -│   │   │   │   │   ├── MissingValues.html -│   │   │   │   │   ├── MissingValuesBarPlot.html -│   │   │   │   │   ├── MutualInformation.html -│   │   │   │   │   ├── PearsonCorrelationMatrix.html -│   │   │   │   │   ├── PhillipsPerronArch.html -│   │   │   │   │   ├── ProtectedClassesCombination.html -│   │   │   │   │   ├── ProtectedClassesDescription.html -│   │   │   │   │   ├── ProtectedClassesDisparity.html -│   │   │   │   │   ├── ProtectedClassesThresholdOptimizer.html -│   │   │   │   │   ├── RollingStatsPlot.html -│   │   │   │   │   ├── RunsTest.html -│   │   │   │   │   ├── ScatterPlot.html -│   │   │   │   │   ├── ScoreBandDefaultRates.html -│   │   │   │   │   ├── SeasonalDecompose.html -│   │   │   │   │   ├── ShapiroWilk.html -│   │   │   │   │   ├── Skewness.html -│   │   │   │   │   ├── SpreadPlot.html -│   │   │   │   │   ├── TabularCategoricalBarPlots.html -│   │   │   │   │   ├── TabularDateTimeHistograms.html -│   │   │   │   │   ├── TabularDescriptionTables.html -│   │   │   │   │   ├── TabularNumericalHistograms.html -│   │   │   │   │   ├── TargetRateBarPlots.html -│   │   │   │   │   ├── TimeSeriesDescription.html -│   │   │   │   │   ├── TimeSeriesDescriptiveStatistics.html -│   │   │   │   │   ├── TimeSeriesFrequency.html -│   │   │   │   │   ├── TimeSeriesHistogram.html -│   │   │   │   │   ├── TimeSeriesLinePlot.html -│   │   │   │   │   ├── TimeSeriesMissingValues.html -│   │   │   │   │   ├── TimeSeriesOutliers.html -│   │   │   │   │   ├── TooManyZeroValues.html -│   │   │   │   │   ├── UniqueRows.html -│   │   │   │   │   ├── WOEBinPlots.html -│   │   │   │   │   ├── WOEBinTable.html -│   │   │   │   │   ├── ZivotAndrewsArch.html -│   │   │   │   │   ├── nlp -│   │   │   │   │   │   ├── CommonWords.html -│   │   │   │   │   │   ├── Hashtags.html -│   │   │   │   │   │   ├── LanguageDetection.html -│   │   │   │   │   │   ├── Mentions.html -│   │   │   │   │   │   ├── PolarityAndSubjectivity.html -│   │   │   │   │   │   ├── Punctuations.html -│   │   │   │   │   │   ├── Sentiment.html -│   │   │   │   │   │   ├── StopWords.html -│   │   │   │   │   │   ├── TextDescription.html -│   │   │   │   │   │   └── Toxicity.html -│   │   │   │   │   └── nlp.html -│   │   │   │   ├── data_validation.html -│   │   │   │   ├── model_validation -│   │   │   │   │   ├── BertScore.html -│   │   │   │   │   ├── BleuScore.html -│   │   │   │   │   ├── ClusterSizeDistribution.html -│   │   │   │   │   ├── ContextualRecall.html -│   │   │   │   │   ├── FeaturesAUC.html -│   │   │   │   │   ├── MeteorScore.html -│   │   │   │   │   ├── ModelMetadata.html -│   │   │   │   │   ├── ModelPredictionResiduals.html -│   │   │   │   │   ├── RegardScore.html -│   │   │   │   │   ├── RegressionResidualsPlot.html -│   │   │   │   │   ├── RougeScore.html -│   │   │   │   │   ├── TimeSeriesPredictionWithCI.html -│   │   │   │   │   ├── TimeSeriesPredictionsPlot.html -│   │   │   │   │   ├── TimeSeriesR2SquareBySegments.html -│   │   │   │   │   ├── TokenDisparity.html -│   │   │   │   │   ├── ToxicityScore.html -│   │   │   │   │   ├── sklearn -│   │   │   │   │   │   ├── AdjustedMutualInformation.html -│   │   │   │   │   │   ├── AdjustedRandIndex.html -│   │   │   │   │   │   ├── CalibrationCurve.html -│   │   │   │   │   │   ├── ClassifierPerformance.html -│   │   │   │   │   │   ├── ClassifierThresholdOptimization.html -│   │   │   │   │   │   ├── ClusterCosineSimilarity.html -│   │   │   │   │   │   ├── ClusterPerformanceMetrics.html -│   │   │   │   │   │   ├── CompletenessScore.html -│   │   │   │   │   │   ├── ConfusionMatrix.html -│   │   │   │   │   │   ├── FeatureImportance.html -│   │   │   │   │   │   ├── FowlkesMallowsScore.html -│   │   │   │   │   │   ├── HomogeneityScore.html -│   │   │   │   │   │   ├── HyperParametersTuning.html -│   │   │   │   │   │   ├── KMeansClustersOptimization.html -│   │   │   │   │   │   ├── MinimumAccuracy.html -│   │   │   │   │   │   ├── MinimumF1Score.html -│   │   │   │   │   │   ├── MinimumROCAUCScore.html -│   │   │   │   │   │   ├── ModelParameters.html -│   │   │   │   │   │   ├── ModelsPerformanceComparison.html -│   │   │   │   │   │   ├── OverfitDiagnosis.html -│   │   │   │   │   │   ├── PermutationFeatureImportance.html -│   │   │   │   │   │   ├── PopulationStabilityIndex.html -│   │   │   │   │   │   ├── PrecisionRecallCurve.html -│   │   │   │   │   │   ├── ROCCurve.html -│   │   │   │   │   │   ├── RegressionErrors.html -│   │   │   │   │   │   ├── RegressionErrorsComparison.html -│   │   │   │   │   │   ├── RegressionPerformance.html -│   │   │   │   │   │   ├── RegressionR2Square.html -│   │   │   │   │   │   ├── RegressionR2SquareComparison.html -│   │   │   │   │   │   ├── RobustnessDiagnosis.html -│   │   │   │   │   │   ├── SHAPGlobalImportance.html -│   │   │   │   │   │   ├── ScoreProbabilityAlignment.html -│   │   │   │   │   │   ├── SilhouettePlot.html -│   │   │   │   │   │   ├── TrainingTestDegradation.html -│   │   │   │   │   │   ├── VMeasure.html -│   │   │   │   │   │   └── WeakspotsDiagnosis.html -│   │   │   │   │   ├── sklearn.html -│   │   │   │   │   ├── statsmodels -│   │   │   │   │   │   ├── AutoARIMA.html -│   │   │   │   │   │   ├── CumulativePredictionProbabilities.html -│   │   │   │   │   │   ├── DurbinWatsonTest.html -│   │   │   │   │   │   ├── GINITable.html -│   │   │   │   │   │   ├── KolmogorovSmirnov.html -│   │   │   │   │   │   ├── Lilliefors.html -│   │   │   │   │   │   ├── PredictionProbabilitiesHistogram.html -│   │   │   │   │   │   ├── RegressionCoeffs.html -│   │   │   │   │   │   ├── RegressionFeatureSignificance.html -│   │   │   │   │   │   ├── RegressionModelForecastPlot.html -│   │   │   │   │   │   ├── RegressionModelForecastPlotLevels.html -│   │   │   │   │   │   ├── RegressionModelSensitivityPlot.html -│   │   │   │   │   │   ├── RegressionModelSummary.html -│   │   │   │   │   │   ├── RegressionPermutationFeatureImportance.html -│   │   │   │   │   │   ├── ScorecardHistogram.html -│   │   │   │   │   │   └── statsutils.html -│   │   │   │   │   └── statsmodels.html -│   │   │   │   ├── model_validation.html -│   │   │   │   ├── prompt_validation -│   │   │   │   │   ├── Bias.html -│   │   │   │   │   ├── Clarity.html -│   │   │   │   │   ├── Conciseness.html -│   │   │   │   │   ├── Delimitation.html -│   │   │   │   │   ├── NegativeInstruction.html -│   │   │   │   │   ├── Robustness.html -│   │   │   │   │   ├── Specificity.html -│   │   │   │   │   └── ai_powered_test.html -│   │   │   │   └── prompt_validation.html -│   │   │   ├── tests.html -│   │   │   ├── unit_metrics.html -│   │   │   └── vm_models.html -│   │   └── validmind.html -│   ├── _sidebar.yml -│   ├── griffe_all.log -│   ├── project_tree -│   ├── templates -│   │   ├── class.qmd.jinja2 -│   │   ├── custom.css -│   │   ├── errors.qmd.jinja2 -│   │   ├── function.qmd.jinja2 -│   │   ├── macros -│   │   │   ├── docstring.jinja2 -│   │   │   ├── navigation.jinja2 -│   │   │   └── types.jinja2 -│   │   ├── module.html.jinja2 -│   │   ├── module.qmd.jinja2 -│   │   ├── sidebar.qmd.jinja2 -│   │   └── template.qmd.jinja2_OLD -│   ├── validmind -│   ├── validmind.json -│   ├── validmind.qmd -│   └── validmind.tree -├── images -│   └── ValidMind-logo-color.svg -├── notebooks -│   ├── README.md -│   ├── code_samples -│   │   ├── capital_markets -│   │   │   ├── quickstart_option_pricing_models.ipynb -│   │   │   └── quickstart_option_pricing_models_quantlib.ipynb -│   │   ├── credit_risk -│   │   │   ├── application_scorecard_demo.ipynb -│   │   │   ├── application_scorecard_executive.ipynb -│   │   │   ├── application_scorecard_full_suite.ipynb -│   │   │   ├── application_scorecard_with_bias.ipynb -│   │   │   ├── application_scorecard_with_ml.ipynb -│   │   │   └── custom_tests -│   │   │   └── ScoreBandDiscriminationMetrics.py -│   │   ├── custom_tests -│   │   │   ├── implement_custom_tests.ipynb -│   │   │   └── integrate_external_test_providers.ipynb -│   │   ├── nlp_and_llm -│   │   │   ├── datasets -│   │   │   │   ├── bbc_text_cls.csv -│   │   │   │   ├── bbc_text_cls_reference.csv -│   │   │   │   ├── cnn_dailymail_100_with_predictions.csv -│   │   │   │   ├── cnn_dailymail_500_with_predictions.csv -│   │   │   │   ├── sentiments.csv -│   │   │   │   └── sentiments_with_predictions.csv -│   │   │   ├── foundation_models_integration_demo.ipynb -│   │   │   ├── foundation_models_summarization_demo.ipynb -│   │   │   ├── hugging_face_integration_demo.ipynb -│   │   │   ├── hugging_face_summarization_demo.ipynb -│   │   │   ├── llm_summarization_demo.ipynb -│   │   │   ├── prompt_validation_demo.ipynb -│   │   │   └── rag_documentation_demo.ipynb -│   │   ├── ongoing_monitoring -│   │   │   ├── application_scorecard_ongoing_monitoring.ipynb -│   │   │   ├── quickstart_customer_churn_ongoing_monitoring.ipynb -│   │   │   └── xgboost_model.model -│   │   ├── quickstart_customer_churn_full_suite.ipynb -│   │   ├── regression -│   │   │   └── quickstart_regression_full_suite.ipynb -│   │   └── time_series -│   │   ├── quickstart_time_series_full_suite.ipynb -│   │   └── quickstart_time_series_high_code.ipynb -│   ├── code_sharing -│   │   ├── clustering -│   │   │   └── quickstart_cluster_demo.ipynb -│   │   ├── credit_risk -│   │   │   └── assign_prediction_probabilities.ipynb -│   │   ├── datasets -│   │   │   ├── bank_customer_churn.csv -│   │   │   ├── lending_club_loan_rates.csv -│   │   │   ├── marketing_lead_conversion.csv -│   │   │   ├── probability_of_default -│   │   │   │   └── Data Dictionary.xlsx -│   │   │   ├── taiwan_credit.csv -│   │   │   └── time_series -│   │   │   ├── fred_loan_rates.csv -│   │   │   ├── fred_loan_rates_test_1.csv -│   │   │   ├── fred_loan_rates_test_2.csv -│   │   │   ├── fred_loan_rates_test_3.csv -│   │   │   ├── fred_loan_rates_test_4.csv -│   │   │   ├── fred_loan_rates_test_5.csv -│   │   │   ├── lending_club_loan_rates.csv -│   │   │   └── raw -│   │   │   └── fred -│   │   │   ├── CPIAUCSL.csv -│   │   │   ├── CSUSHPISA.csv -│   │   │   ├── DRSFRMACBS.csv -│   │   │   ├── FEDFUNDS.csv -│   │   │   ├── GDP.csv -│   │   │   ├── GDPC1.csv -│   │   │   ├── GS10.csv -│   │   │   ├── GS3.csv -│   │   │   ├── GS5.csv -│   │   │   ├── MORTGAGE30US.csv -│   │   │   └── UNRATE.csv -│   │   ├── embeddings -│   │   │   └── quickstart_embeddings_demo.ipynb -│   │   ├── external_tests -│   │   │   └── tests -│   │   │   └── MyIsolationForest.py -│   │   ├── insurance_mortality -│   │   │   ├── insurance_dataset.csv -│   │   │   ├── insurance_validation_demo.ipynb -│   │   │   ├── test_df.csv -│   │   │   ├── train_df.csv -│   │   │   └── validmind_insurance_POC.ipynb -│   │   ├── llm -│   │   │   ├── datasets -│   │   │   │   ├── bbc_text_cls.csv -│   │   │   │   ├── bbc_text_cls_reference.csv -│   │   │   │   ├── rag -│   │   │   │   │   ├── rag_evaluation_dataset_01.csv -│   │   │   │   │   ├── rag_evaluation_dataset_02.csv -│   │   │   │   │   ├── rag_evaluation_dataset_03.csv -│   │   │   │   │   ├── rag_evaluation_results.csv -│   │   │   │   │   ├── rfp_existing_questions_client_1.csv -│   │   │   │   │   ├── rfp_existing_questions_client_2.csv -│   │   │   │   │   ├── rfp_existing_questions_client_3.csv -│   │   │   │   │   ├── rfp_existing_questions_client_4.csv -│   │   │   │   │   ├── rfp_existing_questions_client_5.csv -│   │   │   │   │   ├── rfp_new_questions_client_100.csv -│   │   │   │   │   ├── vendor_contracts_001_020.csv -│   │   │   │   │   ├── vendor_contracts_021_040.csv -│   │   │   │   │   ├── vendor_contracts_041_060.csv -│   │   │   │   │   └── vendor_contracts_questions.csv -│   │   │   │   └── sentiments.csv -│   │   │   ├── llm_descriptions_context.ipynb -│   │   │   ├── rag_llamaindex.ipynb -│   │   │   ├── rag_rfp_answer_generation.ipynb -│   │   │   ├── rag_rfp_answer_generation_langchain.ipynb -│   │   │   ├── rag_rfp_question_similarity.ipynb -│   │   │   ├── rag_vendor_contracts_llamaindex.ipynb -│   │   │   └── vendor_contract_agent -│   │   │   ├── data -│   │   │   │   ├── contracts.json -│   │   │   │   └── vendors.json -│   │   │   ├── genai_vendor_contract_agent_usecase_poc.ipynb -│   │   │   ├── tool_definitions -│   │   │   │   ├── query_database.json -│   │   │   │   └── search_online.json -│   │   │   └── utils.py -│   │   ├── market_basket_analysis -│   │   │   ├── datasets -│   │   │   │   └── mba -│   │   │   │   └── Online Retail.csv -│   │   │   └── mba_poc.ipynb -│   │   ├── operational_deposit -│   │   │   ├── dataset_image.png -│   │   │   ├── datasets -│   │   │   │   └── odm_data_example -│   │   │   │   └── synthetic_data.csv -│   │   │   ├── model_image.png -│   │   │   ├── operational_deposit_poc.ipynb -│   │   │   ├── synthetic_data_generation.ipynb -│   │   │   └── tests -│   │   │   └── TimeseriesGroupbyPlot.py -│   │   ├── output_templates -│   │   │   ├── Screenshot 2024-02-15 at 2.48.03 PM.png -│   │   │   ├── Screenshot 2024-02-15 at 4.51.56 PM.png -│   │   │   └── customizing_tests_with_output_templates.ipynb -│   │   ├── post_processing_functions.ipynb -│   │   ├── r -│   │   │   ├── r_custom_tests.Rmd -│   │   │   ├── r_customer_churn_demo.Rmd -│   │   │   ├── r_customer_churn_demo_xgboost.Rmd -│   │   │   ├── r_mortality_demo.Rmd -│   │   │   ├── r_time_series_data_validation.Rmd -│   │   │   └── r_time_series_model_validation.Rmd -│   │   ├── r_demo -│   │   │   ├── prune_dt.pmml -│   │   │   ├── r-customer-churn-model.ipynb -│   │   │   ├── r-ecm-demo.ipynb -│   │   │   ├── r-ecm-model.ipynb -│   │   │   ├── r-ecm-model.rds -│   │   │   ├── r_churn_test.csv -│   │   │   ├── r_churn_train.csv -│   │   │   ├── r_log_reg_churn_model.rds -│   │   │   └── r_xgb_churn_model.json -│   │   ├── regression -│   │   │   └── regression_unit_metrics.ipynb -│   │   └── test_configuration_updates_demo.ipynb -│   ├── how_to -│   │   ├── configure_dataset_features.ipynb -│   │   ├── dataset_image.png -│   │   ├── document_multiple_results_for_the_same_test.ipynb -│   │   ├── explore_test_suites.ipynb -│   │   ├── explore_tests.ipynb -│   │   ├── filter_input_columns.ipynb -│   │   ├── load_datasets_predictions.ipynb -│   │   ├── log_metrics_over_time.ipynb -│   │   ├── model_image.png -│   │   ├── run_documentation_sections.ipynb -│   │   ├── run_documentation_tests_with_config.ipynb -│   │   ├── run_tests -│   │   │   ├── 1_run_dataset_based_tests.ipynb -│   │   │   └── 2_run_comparison_tests.ipynb -│   │   ├── run_tests_that_require_multiple_datasets.ipynb -│   │   ├── run_unit_metrics.ipynb -│   │   └── use_dataset_model_objects.ipynb -│   ├── images -│   │   ├── add_metric_over_time_block.png -│   │   ├── btc-price-custom-metric.png -│   │   ├── composite-metric-in-template-preview.png -│   │   ├── high-pearson-correlation-block.png -│   │   ├── hyperparameters-custom-metric.png -│   │   ├── image-in-custom-metric.png -│   │   ├── insert-test-driven-block-correlations.png -│   │   ├── insert-test-driven-block-custom-class-imbalance.jpg -│   │   ├── insert-test-driven-block-custom-confusion-matrix.png -│   │   ├── insert-test-driven-block-custom.png -│   │   ├── insert-test-driven-block-test-provider.png -│   │   ├── insert-test-driven-block.png -│   │   ├── log_metric_accuracy.png -│   │   ├── log_metric_auc_1.png -│   │   ├── log_metric_auc_2.png -│   │   ├── log_metric_auc_3.png -│   │   ├── log_metric_auc_4.png -│   │   ├── log_metric_f1.png -│   │   ├── log_metric_precision.png -│   │   ├── log_metric_recall.png -│   │   ├── multiple-tables-plots-custom-metric.png -│   │   ├── my_tests_directory.png -│   │   ├── parameterized-custom-metric.png -│   │   ├── pearson-correlation-matrix-test-output.png -│   │   ├── pearson-correlation-matrix.png -│   │   ├── selecting-composite-metric.png -│   │   └── selecting-high-pearson-correlation-test.png -│   ├── templates -│   │   ├── README.md -│   │   ├── __pycache__ -│   │   │   └── e2e_template.cpython-39.pyc -│   │   ├── about-validmind.ipynb -│   │   ├── e2e-notebook.ipynb -│   │   ├── e2e_template.py -│   │   ├── install-initialize-validmind.ipynb -│   │   ├── next-steps.ipynb -│   │   └── upgrade-validmind.ipynb -│   └── tutorials -│   └── intro_for_model_developers.ipynb -├── poetry.lock -├── pyproject.toml -├── r -│   ├── custom_tests.py -│   └── validmind -│   ├── DESCRIPTION -│   ├── NAMESPACE -│   ├── R -│   │   ├── custom_tests.R -│   │   └── platform.R -│   ├── README.md -│   ├── inst -│   │   └── extdata -│   │   └── child.Rmd -│   ├── man -│   │   ├── build_r_plotly.Rd -│   │   ├── display_report.Rd -│   │   ├── print_summary_tables.Rd -│   │   ├── process_result.Rd -│   │   ├── register_custom_test.Rd -│   │   ├── run_custom_test.Rd -│   │   ├── save_model.Rd -│   │   ├── summarize_metric_result.Rd -│   │   ├── summarize_result.Rd -│   │   ├── summarize_test_result.Rd -│   │   └── vm.Rd -│   └── validmind.Rproj -├── scripts -│   ├── README.md -│   ├── __init__.py -│   ├── api_tree.py -│   ├── bulk_ai_test_updates.py -│   ├── bulk_unit_tests_updates.py -│   ├── check_tests.py -│   ├── copyright.txt -│   ├── copyright_files.py -│   ├── credentials_check.py -│   ├── ensure_clean_notebooks.py -│   ├── extract_descriptions.py -│   ├── format_and_add.sh -│   ├── generate_quarto_docs.py -│   ├── generate_test_id_type.py -│   ├── run_e2e_notebooks.py -│   └── verify_copyright.py -├── tests -│   ├── __init__.py -│   ├── run_test_utils.py -│   ├── test_api_client.py -│   ├── test_client.py -│   ├── test_dataset.py -│   ├── test_framework_init.py -│   ├── test_full_suite.py -│   ├── test_full_suite_nb.py -│   ├── test_unit_tests.py -│   ├── test_validmind_tests_module.py -│   └── unit_tests -│   ├── __init__.py -│   ├── data_validation -│   │   ├── __init__.py -│   │   ├── nlp -│   │   │   ├── test_CommonWords.py -│   │   │   ├── test_LanguageDetection.py -│   │   │   ├── test_PolarityAndSubjectivity.py -│   │   │   ├── test_Punctuations.py -│   │   │   ├── test_Sentiment.py -│   │   │   └── test_Toxicity.py -│   │   ├── test_ACFandPACFPlot.py -│   │   ├── test_ADF.py -│   │   ├── test_AutoAR.py -│   │   ├── test_AutoMA.py -│   │   ├── test_AutoStationarity.py -│   │   ├── test_BivariateScatterPlots.py -│   │   ├── test_BoxPierce.py -│   │   ├── test_ChiSquaredFeaturesTable.py -│   │   ├── test_ClassImbalance.py -│   │   ├── test_DatasetDescription.py -│   │   ├── test_DatasetSplit.py -│   │   ├── test_DescriptiveStatistics.py -│   │   ├── test_DickeyFullerGLS.py -│   │   ├── test_Duplicates.py -│   │   ├── test_EngleGrangerCoint.py -│   │   ├── test_FeatureTargetCorrelationPlot.py -│   │   ├── test_HighCardinality.py -│   │   ├── test_HighPearsonCorrelation.py -│   │   ├── test_IQROutliersBarPlot.py -│   │   ├── test_IQROutliersTable.py -│   │   ├── test_IsolationForestOutliers.py -│   │   ├── test_JarqueBera.py -│   │   ├── test_KPSS.py -│   │   ├── test_LJungBox.py -│   │   ├── test_LaggedCorrelationHeatmap.py -│   │   ├── test_MissingValues.py -│   │   ├── test_MissingValuesBarPlot.py -│   │   ├── test_PearsonCorrelationMatrix.py -│   │   ├── test_PhillipsPerronArch.py -│   │   ├── test_RollingStatsPlot.py -│   │   ├── test_RunsTest.py -│   │   ├── test_ScatterPlot.py -│   │   ├── test_SeasonalDecompose.py -│   │   ├── test_ShapiroWilk.py -│   │   ├── test_Skewness.py -│   │   ├── test_SpreadPlot.py -│   │   ├── test_TabularCategoricalBarPlots.py -│   │   ├── test_TabularDateTimeHistograms.py -│   │   ├── test_TabularDescriptionTables.py -│   │   ├── test_TabularNumericalHistograms.py -│   │   ├── test_TargetRateBarPlots.py -│   │   ├── test_TimeSeriesDescription.py -│   │   ├── test_TimeSeriesDescriptiveStatistics.py -│   │   ├── test_TimeSeriesFrequency.py -│   │   ├── test_TimeSeriesHistogram.py -│   │   ├── test_TimeSeriesLinePlot.py -│   │   ├── test_TimeSeriesMissingValues.py -│   │   ├── test_TimeSeriesOutliers.py -│   │   ├── test_TooManyZeroValues.py -│   │   ├── test_UniqueRows.py -│   │   ├── test_WOEBinPlots.py -│   │   ├── test_WOEBinTable.py -│   │   └── test_ZivotAndrewsArch.py -│   ├── model_validation -│   │   ├── ragas -│   │   │   ├── test_AnswerCorrectness.py -│   │   │   ├── test_AspectCritic.py -│   │   │   ├── test_ContextEntityRecall.py -│   │   │   ├── test_ContextPrecision.py -│   │   │   ├── test_ContextPrecisionWithoutReference.py -│   │   │   ├── test_ContextRecall.py -│   │   │   ├── test_Faithfulness.py -│   │   │   ├── test_NoiseSensitivity.py -│   │   │   ├── test_ResponseRelevancy.py -│   │   │   └── test_SemanticSimilarity.py -│   │   ├── sklearn -│   │   │   ├── test_FeatureImportance.py -│   │   │   ├── test_ROCCurve.py -│   │   │   ├── test_RegressionErrors.py -│   │   │   ├── test_RegressionErrorsComparison.py -│   │   │   ├── test_RegressionR2Square.py -│   │   │   └── test_RegressionR2SquareComparison.py -│   │   ├── statsmodels -│   │   │   ├── test_CumulativePredictionProbabilities.py -│   │   │   ├── test_DurbinWatsonTest.py -│   │   │   ├── test_GINITable.py -│   │   │   ├── test_PredictionProbabilitiesHistogram.py -│   │   │   ├── test_RegressionCoeffs.py -│   │   │   └── test_ScorecardHistogram.py -│   │   ├── test_BertScore.py -│   │   ├── test_BleuScore.py -│   │   ├── test_ContextualRecall.py -│   │   ├── test_MeteorScore.py -│   │   ├── test_ModelMetadata.py -│   │   ├── test_ModelPredictionResiduals.py -│   │   ├── test_RegardScore.py -│   │   ├── test_RougeScore.py -│   │   ├── test_TimeSeriesPredictionWithCI.py -│   │   ├── test_TimeSeriesPredictionsPlot.py -│   │   ├── test_TimeSeriesR2SquareBySegments.py -│   │   ├── test_TokenDisparity.py -│   │   └── test_ToxicityScore.py -│   └── utils.py -└── validmind - ├── __init__.py - ├── __pycache__ - │   ├── __init__.cpython-39.pyc - │   ├── __version__.cpython-39.pyc - │   ├── api_client.cpython-39.pyc - │   ├── client.cpython-39.pyc - │   ├── client_config.cpython-39.pyc - │   ├── errors.cpython-39.pyc - │   ├── input_registry.cpython-39.pyc - │   ├── logging.cpython-39.pyc - │   ├── template.cpython-39.pyc - │   └── utils.cpython-39.pyc - ├── __version__.py - ├── ai - │   ├── __pycache__ - │   │   ├── test_descriptions.cpython-39.pyc - │   │   └── utils.cpython-39.pyc - │   ├── test_descriptions.py - │   └── utils.py - ├── api_client.py - ├── client.py - ├── client_config.py - ├── datasets - │   ├── __init__.py - │   ├── __pycache__ - │   │   └── __init__.cpython-39.pyc - │   ├── classification - │   │   ├── __init__.py - │   │   ├── __pycache__ - │   │   │   ├── __init__.cpython-39.pyc - │   │   │   ├── customer_churn.cpython-39.pyc - │   │   │   └── taiwan_credit.cpython-39.pyc - │   │   ├── customer_churn.py - │   │   ├── datasets - │   │   │   ├── bank_customer_churn.csv - │   │   │   └── taiwan_credit.csv - │   │   └── taiwan_credit.py - │   ├── cluster - │   │   └── digits.py - │   ├── credit_risk - │   │   ├── __init__.py - │   │   ├── __pycache__ - │   │   │   ├── __init__.cpython-39.pyc - │   │   │   ├── lending_club.cpython-39.pyc - │   │   │   └── lending_club_bias.cpython-39.pyc - │   │   ├── datasets - │   │   │   ├── lending_club_biased.csv.gz - │   │   │   └── lending_club_loan_data_2007_2014_clean.csv.gz - │   │   ├── lending_club.py - │   │   └── lending_club_bias.py - │   ├── llm - │   │   └── rag - │   │   ├── __init__.py - │   │   ├── datasets - │   │   │   ├── rfp_existing_questions_client_1.csv - │   │   │   ├── rfp_existing_questions_client_2.csv - │   │   │   ├── rfp_existing_questions_client_3.csv - │   │   │   ├── rfp_existing_questions_client_4.csv - │   │   │   └── rfp_existing_questions_client_5.csv - │   │   └── rfp.py - │   ├── nlp - │   │   ├── __init__.py - │   │   ├── __pycache__ - │   │   │   ├── __init__.cpython-39.pyc - │   │   │   ├── cnn_dailymail.cpython-39.pyc - │   │   │   └── twitter_covid_19.cpython-39.pyc - │   │   ├── cnn_dailymail.py - │   │   ├── datasets - │   │   │   ├── Covid_19.csv - │   │   │   ├── cnn_dailymail_100_with_predictions.csv - │   │   │   ├── cnn_dailymail_500_with_predictions.csv - │   │   │   └── sentiments_with_predictions.csv - │   │   └── twitter_covid_19.py - │   └── regression - │   ├── __init__.py - │   ├── __pycache__ - │   │   ├── __init__.cpython-39.pyc - │   │   ├── california_housing.cpython-39.pyc - │   │   ├── fred.cpython-39.pyc - │   │   ├── fred_timeseries.cpython-39.pyc - │   │   └── lending_club.cpython-39.pyc - │   ├── california_housing.py - │   ├── datasets - │   │   ├── fred - │   │   │   ├── CPIAUCSL.csv - │   │   │   ├── CSUSHPISA.csv - │   │   │   ├── DRSFRMACBS.csv - │   │   │   ├── FEDFUNDS.csv - │   │   │   ├── GDP.csv - │   │   │   ├── GDPC1.csv - │   │   │   ├── GS10.csv - │   │   │   ├── GS3.csv - │   │   │   ├── GS5.csv - │   │   │   ├── MORTGAGE30US.csv - │   │   │   └── UNRATE.csv - │   │   ├── fred_loan_rates.csv - │   │   ├── fred_loan_rates_test_1.csv - │   │   ├── fred_loan_rates_test_2.csv - │   │   ├── fred_loan_rates_test_3.csv - │   │   ├── fred_loan_rates_test_4.csv - │   │   ├── fred_loan_rates_test_5.csv - │   │   └── leanding_club_loan_rates.csv - │   ├── fred.py - │   ├── fred_timeseries.py - │   ├── lending_club.py - │   └── models - │   ├── fred_loan_rates_model_1.pkl - │   ├── fred_loan_rates_model_2.pkl - │   ├── fred_loan_rates_model_3.pkl - │   ├── fred_loan_rates_model_4.pkl - │   └── fred_loan_rates_model_5.pkl - ├── errors.py - ├── html_templates - │   ├── __init__.py - │   ├── __pycache__ - │   │   ├── __init__.cpython-39.pyc - │   │   └── content_blocks.cpython-39.pyc - │   └── content_blocks.py - ├── input_registry.py - ├── logging.py - ├── models - │   ├── __init__.py - │   ├── __pycache__ - │   │   ├── __init__.cpython-39.pyc - │   │   ├── foundation.cpython-39.pyc - │   │   ├── function.cpython-39.pyc - │   │   ├── huggingface.cpython-39.pyc - │   │   ├── metadata.cpython-39.pyc - │   │   ├── pipeline.cpython-39.pyc - │   │   ├── pytorch.cpython-39.pyc - │   │   ├── r_model.cpython-39.pyc - │   │   └── sklearn.cpython-39.pyc - │   ├── foundation.py - │   ├── function.py - │   ├── huggingface.py - │   ├── metadata.py - │   ├── pipeline.py - │   ├── pytorch.py - │   ├── r_model.py - │   └── sklearn.py - ├── template.py - ├── test_suites - │   ├── __init__.py - │   ├── __pycache__ - │   │   ├── __init__.cpython-39.pyc - │   │   ├── classifier.cpython-39.pyc - │   │   ├── cluster.cpython-39.pyc - │   │   ├── embeddings.cpython-39.pyc - │   │   ├── llm.cpython-39.pyc - │   │   ├── nlp.cpython-39.pyc - │   │   ├── parameters_optimization.cpython-39.pyc - │   │   ├── regression.cpython-39.pyc - │   │   ├── statsmodels_timeseries.cpython-39.pyc - │   │   ├── summarization.cpython-39.pyc - │   │   ├── tabular_datasets.cpython-39.pyc - │   │   ├── text_data.cpython-39.pyc - │   │   └── time_series.cpython-39.pyc - │   ├── classifier.py - │   ├── cluster.py - │   ├── embeddings.py - │   ├── llm.py - │   ├── nlp.py - │   ├── parameters_optimization.py - │   ├── regression.py - │   ├── statsmodels_timeseries.py - │   ├── summarization.py - │   ├── tabular_datasets.py - │   ├── text_data.py - │   └── time_series.py - ├── tests - │   ├── __init__.py - │   ├── __pycache__ - │   │   ├── __init__.cpython-39.pyc - │   │   ├── __types__.cpython-39.pyc - │   │   ├── _store.cpython-39.pyc - │   │   ├── comparison.cpython-39.pyc - │   │   ├── decorator.cpython-39.pyc - │   │   ├── load.cpython-39.pyc - │   │   ├── output.cpython-39.pyc - │   │   ├── run.cpython-39.pyc - │   │   ├── test_providers.cpython-39.pyc - │   │   └── utils.cpython-39.pyc - │   ├── __types__.py - │   ├── _store.py - │   ├── comparison.py - │   ├── data_validation - │   │   ├── ACFandPACFPlot.py - │   │   ├── ADF.py - │   │   ├── AutoAR.py - │   │   ├── AutoMA.py - │   │   ├── AutoStationarity.py - │   │   ├── BivariateScatterPlots.py - │   │   ├── BoxPierce.py - │   │   ├── ChiSquaredFeaturesTable.py - │   │   ├── ClassImbalance.py - │   │   ├── DatasetDescription.py - │   │   ├── DatasetSplit.py - │   │   ├── DescriptiveStatistics.py - │   │   ├── DickeyFullerGLS.py - │   │   ├── Duplicates.py - │   │   ├── EngleGrangerCoint.py - │   │   ├── FeatureTargetCorrelationPlot.py - │   │   ├── HighCardinality.py - │   │   ├── HighPearsonCorrelation.py - │   │   ├── IQROutliersBarPlot.py - │   │   ├── IQROutliersTable.py - │   │   ├── IsolationForestOutliers.py - │   │   ├── JarqueBera.py - │   │   ├── KPSS.py - │   │   ├── LJungBox.py - │   │   ├── LaggedCorrelationHeatmap.py - │   │   ├── MissingValues.py - │   │   ├── MissingValuesBarPlot.py - │   │   ├── MutualInformation.py - │   │   ├── PearsonCorrelationMatrix.py - │   │   ├── PhillipsPerronArch.py - │   │   ├── ProtectedClassesCombination.py - │   │   ├── ProtectedClassesDescription.py - │   │   ├── ProtectedClassesDisparity.py - │   │   ├── ProtectedClassesThresholdOptimizer.py - │   │   ├── RollingStatsPlot.py - │   │   ├── RunsTest.py - │   │   ├── ScatterPlot.py - │   │   ├── ScoreBandDefaultRates.py - │   │   ├── SeasonalDecompose.py - │   │   ├── ShapiroWilk.py - │   │   ├── Skewness.py - │   │   ├── SpreadPlot.py - │   │   ├── TabularCategoricalBarPlots.py - │   │   ├── TabularDateTimeHistograms.py - │   │   ├── TabularDescriptionTables.py - │   │   ├── TabularNumericalHistograms.py - │   │   ├── TargetRateBarPlots.py - │   │   ├── TimeSeriesDescription.py - │   │   ├── TimeSeriesDescriptiveStatistics.py - │   │   ├── TimeSeriesFrequency.py - │   │   ├── TimeSeriesHistogram.py - │   │   ├── TimeSeriesLinePlot.py - │   │   ├── TimeSeriesMissingValues.py - │   │   ├── TimeSeriesOutliers.py - │   │   ├── TooManyZeroValues.py - │   │   ├── UniqueRows.py - │   │   ├── WOEBinPlots.py - │   │   ├── WOEBinTable.py - │   │   ├── ZivotAndrewsArch.py - │   │   ├── __init__.py - │   │   ├── __pycache__ - │   │   │   ├── ACFandPACFPlot.cpython-39.pyc - │   │   │   ├── ADF.cpython-39.pyc - │   │   │   ├── AutoAR.cpython-39.pyc - │   │   │   ├── AutoMA.cpython-39.pyc - │   │   │   ├── AutoStationarity.cpython-39.pyc - │   │   │   ├── BivariateScatterPlots.cpython-39.pyc - │   │   │   ├── BoxPierce.cpython-39.pyc - │   │   │   ├── ChiSquaredFeaturesTable.cpython-39.pyc - │   │   │   ├── ClassImbalance.cpython-39.pyc - │   │   │   ├── DatasetDescription.cpython-39.pyc - │   │   │   ├── DatasetSplit.cpython-39.pyc - │   │   │   ├── DescriptiveStatistics.cpython-39.pyc - │   │   │   ├── DickeyFullerGLS.cpython-39.pyc - │   │   │   ├── Duplicates.cpython-39.pyc - │   │   │   ├── EngleGrangerCoint.cpython-39.pyc - │   │   │   ├── FeatureTargetCorrelationPlot.cpython-39.pyc - │   │   │   ├── HighCardinality.cpython-39.pyc - │   │   │   ├── HighPearsonCorrelation.cpython-39.pyc - │   │   │   ├── IQROutliersBarPlot.cpython-39.pyc - │   │   │   ├── IQROutliersTable.cpython-39.pyc - │   │   │   ├── IsolationForestOutliers.cpython-39.pyc - │   │   │   ├── JarqueBera.cpython-39.pyc - │   │   │   ├── KPSS.cpython-39.pyc - │   │   │   ├── LJungBox.cpython-39.pyc - │   │   │   ├── LaggedCorrelationHeatmap.cpython-39.pyc - │   │   │   ├── MissingValues.cpython-39.pyc - │   │   │   ├── MissingValuesBarPlot.cpython-39.pyc - │   │   │   ├── MutualInformation.cpython-39.pyc - │   │   │   ├── PearsonCorrelationMatrix.cpython-39.pyc - │   │   │   ├── PhillipsPerronArch.cpython-39.pyc - │   │   │   ├── ProtectedClassesCombination.cpython-39.pyc - │   │   │   ├── ProtectedClassesDescription.cpython-39.pyc - │   │   │   ├── ProtectedClassesDisparity.cpython-39.pyc - │   │   │   ├── ProtectedClassesThresholdOptimizer.cpython-39.pyc - │   │   │   ├── RollingStatsPlot.cpython-39.pyc - │   │   │   ├── RunsTest.cpython-39.pyc - │   │   │   ├── ScatterPlot.cpython-39.pyc - │   │   │   ├── ScoreBandDefaultRates.cpython-39.pyc - │   │   │   ├── SeasonalDecompose.cpython-39.pyc - │   │   │   ├── ShapiroWilk.cpython-39.pyc - │   │   │   ├── Skewness.cpython-39.pyc - │   │   │   ├── SpreadPlot.cpython-39.pyc - │   │   │   ├── TabularCategoricalBarPlots.cpython-39.pyc - │   │   │   ├── TabularDateTimeHistograms.cpython-39.pyc - │   │   │   ├── TabularDescriptionTables.cpython-39.pyc - │   │   │   ├── TabularNumericalHistograms.cpython-39.pyc - │   │   │   ├── TargetRateBarPlots.cpython-39.pyc - │   │   │   ├── TimeSeriesDescription.cpython-39.pyc - │   │   │   ├── TimeSeriesDescriptiveStatistics.cpython-39.pyc - │   │   │   ├── TimeSeriesFrequency.cpython-39.pyc - │   │   │   ├── TimeSeriesHistogram.cpython-39.pyc - │   │   │   ├── TimeSeriesLinePlot.cpython-39.pyc - │   │   │   ├── TimeSeriesMissingValues.cpython-39.pyc - │   │   │   ├── TimeSeriesOutliers.cpython-39.pyc - │   │   │   ├── TooManyZeroValues.cpython-39.pyc - │   │   │   ├── UniqueRows.cpython-39.pyc - │   │   │   ├── WOEBinPlots.cpython-39.pyc - │   │   │   ├── WOEBinTable.cpython-39.pyc - │   │   │   ├── ZivotAndrewsArch.cpython-39.pyc - │   │   │   └── __init__.cpython-39.pyc - │   │   └── nlp - │   │   ├── CommonWords.py - │   │   ├── Hashtags.py - │   │   ├── LanguageDetection.py - │   │   ├── Mentions.py - │   │   ├── PolarityAndSubjectivity.py - │   │   ├── Punctuations.py - │   │   ├── Sentiment.py - │   │   ├── StopWords.py - │   │   ├── TextDescription.py - │   │   ├── Toxicity.py - │   │   ├── __init__.py - │   │   └── __pycache__ - │   │   ├── CommonWords.cpython-39.pyc - │   │   ├── Hashtags.cpython-39.pyc - │   │   ├── LanguageDetection.cpython-39.pyc - │   │   ├── Mentions.cpython-39.pyc - │   │   ├── PolarityAndSubjectivity.cpython-39.pyc - │   │   ├── Punctuations.cpython-39.pyc - │   │   ├── Sentiment.cpython-39.pyc - │   │   ├── StopWords.cpython-39.pyc - │   │   ├── TextDescription.cpython-39.pyc - │   │   ├── Toxicity.cpython-39.pyc - │   │   └── __init__.cpython-39.pyc - │   ├── decorator.py - │   ├── load.py - │   ├── model_validation - │   │   ├── BertScore.py - │   │   ├── BleuScore.py - │   │   ├── ClusterSizeDistribution.py - │   │   ├── ContextualRecall.py - │   │   ├── FeaturesAUC.py - │   │   ├── MeteorScore.py - │   │   ├── ModelMetadata.py - │   │   ├── ModelPredictionResiduals.py - │   │   ├── RegardScore.py - │   │   ├── RegressionResidualsPlot.py - │   │   ├── RougeScore.py - │   │   ├── TimeSeriesPredictionWithCI.py - │   │   ├── TimeSeriesPredictionsPlot.py - │   │   ├── TimeSeriesR2SquareBySegments.py - │   │   ├── TokenDisparity.py - │   │   ├── ToxicityScore.py - │   │   ├── __init__.py - │   │   ├── __pycache__ - │   │   │   ├── BertScore.cpython-39.pyc - │   │   │   ├── BleuScore.cpython-39.pyc - │   │   │   ├── ClusterSizeDistribution.cpython-39.pyc - │   │   │   ├── ContextualRecall.cpython-39.pyc - │   │   │   ├── FeaturesAUC.cpython-39.pyc - │   │   │   ├── MeteorScore.cpython-39.pyc - │   │   │   ├── ModelMetadata.cpython-39.pyc - │   │   │   ├── ModelPredictionResiduals.cpython-39.pyc - │   │   │   ├── RegardScore.cpython-39.pyc - │   │   │   ├── RegressionResidualsPlot.cpython-39.pyc - │   │   │   ├── RougeScore.cpython-39.pyc - │   │   │   ├── TimeSeriesPredictionWithCI.cpython-39.pyc - │   │   │   ├── TimeSeriesPredictionsPlot.cpython-39.pyc - │   │   │   ├── TimeSeriesR2SquareBySegments.cpython-39.pyc - │   │   │   ├── TokenDisparity.cpython-39.pyc - │   │   │   ├── ToxicityScore.cpython-39.pyc - │   │   │   └── __init__.cpython-39.pyc - │   │   ├── embeddings - │   │   │   ├── ClusterDistribution.py - │   │   │   ├── CosineSimilarityComparison.py - │   │   │   ├── CosineSimilarityDistribution.py - │   │   │   ├── CosineSimilarityHeatmap.py - │   │   │   ├── DescriptiveAnalytics.py - │   │   │   ├── EmbeddingsVisualization2D.py - │   │   │   ├── EuclideanDistanceComparison.py - │   │   │   ├── EuclideanDistanceHeatmap.py - │   │   │   ├── PCAComponentsPairwisePlots.py - │   │   │   ├── StabilityAnalysisKeyword.py - │   │   │   ├── StabilityAnalysisRandomNoise.py - │   │   │   ├── StabilityAnalysisSynonyms.py - │   │   │   ├── StabilityAnalysisTranslation.py - │   │   │   ├── TSNEComponentsPairwisePlots.py - │   │   │   └── utils.py - │   │   ├── ragas - │   │   │   ├── AnswerCorrectness.py - │   │   │   ├── AspectCritic.py - │   │   │   ├── ContextEntityRecall.py - │   │   │   ├── ContextPrecision.py - │   │   │   ├── ContextPrecisionWithoutReference.py - │   │   │   ├── ContextRecall.py - │   │   │   ├── Faithfulness.py - │   │   │   ├── NoiseSensitivity.py - │   │   │   ├── ResponseRelevancy.py - │   │   │   ├── SemanticSimilarity.py - │   │   │   └── utils.py - │   │   ├── sklearn - │   │   │   ├── AdjustedMutualInformation.py - │   │   │   ├── AdjustedRandIndex.py - │   │   │   ├── CalibrationCurve.py - │   │   │   ├── ClassifierPerformance.py - │   │   │   ├── ClassifierThresholdOptimization.py - │   │   │   ├── ClusterCosineSimilarity.py - │   │   │   ├── ClusterPerformanceMetrics.py - │   │   │   ├── CompletenessScore.py - │   │   │   ├── ConfusionMatrix.py - │   │   │   ├── FeatureImportance.py - │   │   │   ├── FowlkesMallowsScore.py - │   │   │   ├── HomogeneityScore.py - │   │   │   ├── HyperParametersTuning.py - │   │   │   ├── KMeansClustersOptimization.py - │   │   │   ├── MinimumAccuracy.py - │   │   │   ├── MinimumF1Score.py - │   │   │   ├── MinimumROCAUCScore.py - │   │   │   ├── ModelParameters.py - │   │   │   ├── ModelsPerformanceComparison.py - │   │   │   ├── OverfitDiagnosis.py - │   │   │   ├── PermutationFeatureImportance.py - │   │   │   ├── PopulationStabilityIndex.py - │   │   │   ├── PrecisionRecallCurve.py - │   │   │   ├── ROCCurve.py - │   │   │   ├── RegressionErrors.py - │   │   │   ├── RegressionErrorsComparison.py - │   │   │   ├── RegressionPerformance.py - │   │   │   ├── RegressionR2Square.py - │   │   │   ├── RegressionR2SquareComparison.py - │   │   │   ├── RobustnessDiagnosis.py - │   │   │   ├── SHAPGlobalImportance.py - │   │   │   ├── ScoreProbabilityAlignment.py - │   │   │   ├── SilhouettePlot.py - │   │   │   ├── TrainingTestDegradation.py - │   │   │   ├── VMeasure.py - │   │   │   ├── WeakspotsDiagnosis.py - │   │   │   ├── __init__.py - │   │   │   └── __pycache__ - │   │   │   ├── AdjustedMutualInformation.cpython-39.pyc - │   │   │   ├── AdjustedRandIndex.cpython-39.pyc - │   │   │   ├── CalibrationCurve.cpython-39.pyc - │   │   │   ├── ClassifierPerformance.cpython-39.pyc - │   │   │   ├── ClassifierThresholdOptimization.cpython-39.pyc - │   │   │   ├── ClusterCosineSimilarity.cpython-39.pyc - │   │   │   ├── ClusterPerformanceMetrics.cpython-39.pyc - │   │   │   ├── CompletenessScore.cpython-39.pyc - │   │   │   ├── ConfusionMatrix.cpython-39.pyc - │   │   │   ├── FeatureImportance.cpython-39.pyc - │   │   │   ├── FowlkesMallowsScore.cpython-39.pyc - │   │   │   ├── HomogeneityScore.cpython-39.pyc - │   │   │   ├── HyperParametersTuning.cpython-39.pyc - │   │   │   ├── KMeansClustersOptimization.cpython-39.pyc - │   │   │   ├── MinimumAccuracy.cpython-39.pyc - │   │   │   ├── MinimumF1Score.cpython-39.pyc - │   │   │   ├── MinimumROCAUCScore.cpython-39.pyc - │   │   │   ├── ModelParameters.cpython-39.pyc - │   │   │   ├── ModelsPerformanceComparison.cpython-39.pyc - │   │   │   ├── OverfitDiagnosis.cpython-39.pyc - │   │   │   ├── PermutationFeatureImportance.cpython-39.pyc - │   │   │   ├── PopulationStabilityIndex.cpython-39.pyc - │   │   │   ├── PrecisionRecallCurve.cpython-39.pyc - │   │   │   ├── ROCCurve.cpython-39.pyc - │   │   │   ├── RegressionErrors.cpython-39.pyc - │   │   │   ├── RegressionErrorsComparison.cpython-39.pyc - │   │   │   ├── RegressionPerformance.cpython-39.pyc - │   │   │   ├── RegressionR2Square.cpython-39.pyc - │   │   │   ├── RegressionR2SquareComparison.cpython-39.pyc - │   │   │   ├── RobustnessDiagnosis.cpython-39.pyc - │   │   │   ├── SHAPGlobalImportance.cpython-39.pyc - │   │   │   ├── ScoreProbabilityAlignment.cpython-39.pyc - │   │   │   ├── SilhouettePlot.cpython-39.pyc - │   │   │   ├── TrainingTestDegradation.cpython-39.pyc - │   │   │   ├── VMeasure.cpython-39.pyc - │   │   │   ├── WeakspotsDiagnosis.cpython-39.pyc - │   │   │   └── __init__.cpython-39.pyc - │   │   └── statsmodels - │   │   ├── AutoARIMA.py - │   │   ├── CumulativePredictionProbabilities.py - │   │   ├── DurbinWatsonTest.py - │   │   ├── GINITable.py - │   │   ├── KolmogorovSmirnov.py - │   │   ├── Lilliefors.py - │   │   ├── PredictionProbabilitiesHistogram.py - │   │   ├── RegressionCoeffs.py - │   │   ├── RegressionFeatureSignificance.py - │   │   ├── RegressionModelForecastPlot.py - │   │   ├── RegressionModelForecastPlotLevels.py - │   │   ├── RegressionModelSensitivityPlot.py - │   │   ├── RegressionModelSummary.py - │   │   ├── RegressionPermutationFeatureImportance.py - │   │   ├── ScorecardHistogram.py - │   │   ├── __init__.py - │   │   ├── __pycache__ - │   │   │   ├── AutoARIMA.cpython-39.pyc - │   │   │   ├── CumulativePredictionProbabilities.cpython-39.pyc - │   │   │   ├── DurbinWatsonTest.cpython-39.pyc - │   │   │   ├── GINITable.cpython-39.pyc - │   │   │   ├── KolmogorovSmirnov.cpython-39.pyc - │   │   │   ├── Lilliefors.cpython-39.pyc - │   │   │   ├── PredictionProbabilitiesHistogram.cpython-39.pyc - │   │   │   ├── RegressionCoeffs.cpython-39.pyc - │   │   │   ├── RegressionFeatureSignificance.cpython-39.pyc - │   │   │   ├── RegressionModelForecastPlot.cpython-39.pyc - │   │   │   ├── RegressionModelForecastPlotLevels.cpython-39.pyc - │   │   │   ├── RegressionModelSensitivityPlot.cpython-39.pyc - │   │   │   ├── RegressionModelSummary.cpython-39.pyc - │   │   │   ├── RegressionPermutationFeatureImportance.cpython-39.pyc - │   │   │   ├── ScorecardHistogram.cpython-39.pyc - │   │   │   ├── __init__.cpython-39.pyc - │   │   │   └── statsutils.cpython-39.pyc - │   │   └── statsutils.py - │   ├── ongoing_monitoring - │   │   ├── CalibrationCurveDrift.py - │   │   ├── ClassDiscriminationDrift.py - │   │   ├── ClassImbalanceDrift.py - │   │   ├── ClassificationAccuracyDrift.py - │   │   ├── ConfusionMatrixDrift.py - │   │   ├── CumulativePredictionProbabilitiesDrift.py - │   │   ├── FeatureDrift.py - │   │   ├── PredictionAcrossEachFeature.py - │   │   ├── PredictionCorrelation.py - │   │   ├── PredictionProbabilitiesHistogramDrift.py - │   │   ├── PredictionQuantilesAcrossFeatures.py - │   │   ├── ROCCurveDrift.py - │   │   ├── ScoreBandsDrift.py - │   │   ├── ScorecardHistogramDrift.py - │   │   └── TargetPredictionDistributionPlot.py - │   ├── output.py - │   ├── prompt_validation - │   │   ├── Bias.py - │   │   ├── Clarity.py - │   │   ├── Conciseness.py - │   │   ├── Delimitation.py - │   │   ├── NegativeInstruction.py - │   │   ├── Robustness.py - │   │   ├── Specificity.py - │   │   ├── __init__.py - │   │   ├── __pycache__ - │   │   │   ├── Bias.cpython-39.pyc - │   │   │   ├── Clarity.cpython-39.pyc - │   │   │   ├── Conciseness.cpython-39.pyc - │   │   │   ├── Delimitation.cpython-39.pyc - │   │   │   ├── NegativeInstruction.cpython-39.pyc - │   │   │   ├── Robustness.cpython-39.pyc - │   │   │   ├── Specificity.cpython-39.pyc - │   │   │   ├── __init__.cpython-39.pyc - │   │   │   └── ai_powered_test.cpython-39.pyc - │   │   └── ai_powered_test.py - │   ├── run.py - │   ├── test_providers.py - │   └── utils.py - ├── unit_metrics - │   ├── __init__.py - │   ├── __pycache__ - │   │   └── __init__.cpython-39.pyc - │   ├── classification - │   │   ├── Accuracy.py - │   │   ├── F1.py - │   │   ├── Precision.py - │   │   ├── ROC_AUC.py - │   │   └── Recall.py - │   └── regression - │   ├── AdjustedRSquaredScore.py - │   ├── GiniCoefficient.py - │   ├── HuberLoss.py - │   ├── KolmogorovSmirnovStatistic.py - │   ├── MeanAbsoluteError.py - │   ├── MeanAbsolutePercentageError.py - │   ├── MeanBiasDeviation.py - │   ├── MeanSquaredError.py - │   ├── QuantileLoss.py - │   ├── RSquaredScore.py - │   └── RootMeanSquaredError.py - ├── utils.py - └── vm_models - ├── __init__.py - ├── __pycache__ - │   ├── __init__.cpython-39.pyc - │   ├── figure.cpython-39.pyc - │   ├── input.cpython-39.pyc - │   └── model.cpython-39.pyc - ├── dataset - │   ├── __init__.py - │   ├── __pycache__ - │   │   ├── __init__.cpython-39.pyc - │   │   ├── dataset.cpython-39.pyc - │   │   └── utils.cpython-39.pyc - │   ├── dataset.py - │   └── utils.py - ├── figure.py - ├── input.py - ├── model.py - ├── result - │   ├── __init__.py - │   ├── __pycache__ - │   │   ├── __init__.cpython-39.pyc - │   │   ├── result.cpython-39.pyc - │   │   └── utils.cpython-39.pyc - │   ├── result.jinja - │   ├── result.py - │   └── utils.py - └── test_suite - ├── __init__.py - ├── __pycache__ - │   ├── runner.cpython-39.pyc - │   ├── summary.cpython-39.pyc - │   ├── test.cpython-39.pyc - │   └── test_suite.cpython-39.pyc - ├── runner.py - ├── summary.py - ├── test.py - └── test_suite.py - -141 directories, 1076 files diff --git a/docs/templates/macros/docstring.jinja2 b/docs/templates/macros/docstring.jinja2 index 372cf4768..efcf388be 100644 --- a/docs/templates/macros/docstring.jinja2 +++ b/docs/templates/macros/docstring.jinja2 @@ -15,6 +15,15 @@ {# Parameters #} {%- if docstring.parsed.params -%} {%- set _ = sections.append("\n**Parameters**") -%} + {# Debug info #} + {%- set _ = sections.append("\nDEBUG:") -%} + {%- for param in docstring.parsed.params -%} + {%- set _ = sections.append("- arg_name: " ~ param.arg_name|string) -%} + {%- set _ = sections.append("- type_name: " ~ param.type_name|string) -%} + {%- set _ = sections.append("- description: " ~ param.description|string) -%} + {%- set _ = sections.append("---") -%} + {%- endfor -%} + {# Original parameter processing #} {%- for param in docstring.parsed.params -%} {%- if param.arg_name and param.description -%} {%- set desc = param.description | trim -%} @@ -22,7 +31,11 @@ {%- set desc = desc[:-1] ~ ')' -%} {%- endif -%} {%- if param.type_name -%} - {%- set _ = sections.append("- **" ~ param.arg_name ~ "** (" ~ param.type_name ~ "): " ~ desc) -%} + {%- set type_info = param.type_name -%} + {%- if type_info.endswith(')') and not type_info.startswith('(') -%} + {%- set type_info = '(' ~ type_info -%} + {%- endif -%} + {%- set _ = sections.append("- **" ~ param.arg_name ~ "** " ~ type_info ~ ": " ~ desc) -%} {%- else -%} {%- set _ = sections.append("- **" ~ param.arg_name ~ "**: " ~ desc) -%} {%- endif -%} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 0e5a9b479..07987afd8 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -53,8 +53,34 @@ Gets a TestSuite object for the current project or a specific test suite This fu **Parameters** -- **optional)**: The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. section (str, -- **optional)**: The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. +DEBUG: + +- arg_name: test_suite_id +- type_name: str +- description: The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. + +______________________________________________________________________ + +- arg_name: section +- type_name: str +- description: The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. + +______________________________________________________________________ + +- arg_name: args +- type_name: None +- description: Additional arguments to pass to the TestSuite + +______________________________________________________________________ + +- arg_name: kwargs +- type_name: None +- description: Additional keyword arguments to pass to the TestSuite + +______________________________________________________________________ + +- **test_suite_id** str: The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. +- **section** str: The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. - **args**: Additional arguments to pass to the TestSuite - **kwargs**: Additional keyword arguments to pass to the TestSuite @@ -70,16 +96,56 @@ def init( monitoring: bool = False): ``` -Initializes the API client instances and calls the /ping endpoint to ensure the provided credentials are valid and we can connect to the ValidMind API. If the API key and secret are not provided, the client will attempt to retrieve them from the environment variables `VM_API_KEY` and `VM_API_SECRET`. +Initializes the API client instances and calls the /ping endpoint to ensure the provided credentials are valid and we can connect to the ValidMind API. + +If the API key and secret are not provided, the client will attempt to retrieve them from the environment variables `VM_API_KEY` and `VM_API_SECRET`. **Parameters** -- **optional)**: The project CUID. Alias for model. Defaults to None. [DEPRECATED] model (str, -- **optional)**: The model CUID. Defaults to None. api_key (str, -- **optional)**: The API key. Defaults to None. api_secret (str, -- **optional)**: The API secret. Defaults to None. api_host (str, -- **optional)**: The API host. Defaults to None. monitoring -- **(bool)**: The ongoing monitoring flag. Defaults to False. +DEBUG: + +- arg_name: project +- type_name: str +- description: The project CUID. Alias for model. Defaults to None. [DEPRECATED] + +______________________________________________________________________ + +- arg_name: model +- type_name: str +- description: The model CUID. Defaults to None. + +______________________________________________________________________ + +- arg_name: api_key +- type_name: str +- description: The API key. Defaults to None. + +______________________________________________________________________ + +- arg_name: api_secret +- type_name: str +- description: The API secret. Defaults to None. + +______________________________________________________________________ + +- arg_name: api_host +- type_name: str +- description: The API host. Defaults to None. + +______________________________________________________________________ + +- arg_name: monitoring +- type_name: bool +- description: The ongoing monitoring flag. Defaults to False. + +______________________________________________________________________ + +- **project** str: The project CUID. Alias for model. Defaults to None. [DEPRECATED] +- **model** str: The model CUID. Defaults to None. +- **api_key** str: The API key. Defaults to None. +- **api_secret** str: The API secret. Defaults to None. +- **api_host** str: The API host. Defaults to None. +- **monitoring** bool: The ongoing monitoring flag. Defaults to False. **Raises** @@ -105,31 +171,20 @@ def init_dataset( __log = True) -> VMDataset: ``` -Initializes a VM Dataset, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are reading a valid dataset type. The following dataset types are supported: +Initializes a VM Dataset, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are reading a valid dataset type. + +The following dataset types are supported: - Pandas DataFrame - Polars DataFrame - Numpy ndarray - Torch TensorDataset -**Parameters** +Args: dataset : dataset from various python libraries model (VMModel): ValidMind model object targets (vm.vm.DatasetTargets): A list of target variables target_column (str): The name of the target column in the dataset feature_columns (list): A list of names of feature columns in the dataset extra_columns (dictionary): A dictionary containing the names of the prediction_column and group_by_columns in the dataset class_labels (dict): A list of class labels for classification problems type (str): The type of dataset (one of DATASET_TYPES) input_id (str): The input ID for the dataset (e.g. "my_dataset"). By default, this will be set to `dataset` but if you are passing this dataset as a test input using some other key than `dataset`, then you should set this to the same key. -- **(VMModel)**: ValidMind model object targets -- **(vm.vm.DatasetTargets)**: A list of target variables target_column -- **(str)**: The name of the target column in the dataset feature_columns -- **(list)**: A list of names of feature columns in the dataset extra_columns -- **(dictionary)**: A dictionary containing the names of the prediction_column and group_by_columns in the dataset class_labels -- **(dict)**: A list of class labels for classification problems type -- **(str)**: The type of dataset (one of DATASET_TYPES) input_id -- **(str)**: The input ID for the dataset (e.g. "my_dataset"). By default, this will be set to `dataset` but if you are passing this dataset as a test input using some other key than `dataset`, then you should set this to the same key. +Raises: ValueError: If the dataset type is not supported -**Returns** - -- A VM Dataset instance - -**Raises** - -- **ValueError**: If the dataset type is not supported +Returns: vm.vm.Dataset: A VM Dataset instance ### init_model[()]{.muted} @@ -147,10 +202,42 @@ Initializes a VM Model, which can then be passed to other functions that can per **Parameters** -- **model**: A trained model or VMModel instance input_id -- **(str)**: The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. attributes -- **(dict)**: A dictionary of model attributes predict_fn -- **(callable)**: A function that takes an input and returns a prediction +DEBUG: + +- arg_name: model +- type_name: None +- description: A trained model or VMModel instance + +______________________________________________________________________ + +- arg_name: input_id +- type_name: str +- description: The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. + +______________________________________________________________________ + +- arg_name: attributes +- type_name: dict +- description: A dictionary of model attributes + +______________________________________________________________________ + +- arg_name: predict_fn +- type_name: callable +- description: A function that takes an input and returns a prediction + +______________________________________________________________________ + +- arg_name: \*\*kwargs +- type_name: None +- description: Additional arguments to pass to the model + +______________________________________________________________________ + +- **model**: A trained model or VMModel instance +- **input_id** str: The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. +- **attributes** dict: A dictionary of model attributes +- **predict_fn** callable: A function that takes an input and returns a prediction - \*\***kwargs**: Additional arguments to pass to the model **Returns** @@ -174,12 +261,28 @@ Initializes a VM Model for an R model R models must be saved to disk and the fil - LogisticRegression `glm` model in R: saved as an RDS file with `saveRDS` - LinearRegression `lm` model in R: saved as an RDS file with `saveRDS` - XGBClassifier: saved as a .json or .bin file with `xgb.save` -- XGBRegressor: saved as a .json or .bin file with `xgb.save` LogisticRegression and LinearRegression models are converted to sklearn models by extracting the coefficients and intercept from the R model. XGB models are loaded using the xgboost since xgb models saved in .json or .bin format can be loaded directly with either Python or R +- XGBRegressor: saved as a .json or .bin file with `xgb.save` + +LogisticRegression and LinearRegression models are converted to sklearn models by extracting the coefficients and intercept from the R model. XGB models are loaded using the xgboost since xgb models saved in .json or .bin format can be loaded directly with either Python or R **Parameters** -- **(str)**: The path to the R model saved as an RDS or XGB file model_type -- **(str)**: The type of the model (one of R_MODEL_TYPES) +DEBUG: + +- arg_name: model_path +- type_name: str +- description: The path to the R model saved as an RDS or XGB file + +______________________________________________________________________ + +- arg_name: model_type +- type_name: str +- description: The type of the model (one of R_MODEL_TYPES) + +______________________________________________________________________ + +- **model_path** str: The path to the R model saved as an RDS or XGB file +- **model_type** str: The type of the model (one of R_MODEL_TYPES) **Returns** @@ -201,12 +304,50 @@ Logs a unit metric Unit metrics are key-value pairs where the key is the metric **Parameters** -- **(str)**: The metric key value -- **(float)**: The metric value inputs (list, -- **optional)**: A list of input IDs that were used to compute the metric. params (dict, -- **optional)**: Dictionary of parameters used to compute the metric. recorded_at (str, -- **optional)**: The timestamp of the metric. Server will use current time if not provided. thresholds (dict, -- **optional)**: Dictionary of thresholds for the metric. +DEBUG: + +- arg_name: key +- type_name: str +- description: The metric key + +______________________________________________________________________ + +- arg_name: value +- type_name: float +- description: The metric value + +______________________________________________________________________ + +- arg_name: inputs +- type_name: list +- description: A list of input IDs that were used to compute the metric. + +______________________________________________________________________ + +- arg_name: params +- type_name: dict +- description: Dictionary of parameters used to compute the metric. + +______________________________________________________________________ + +- arg_name: recorded_at +- type_name: str +- description: The timestamp of the metric. Server will use current time if not provided. + +______________________________________________________________________ + +- arg_name: thresholds +- type_name: dict +- description: Dictionary of thresholds for the metric. + +______________________________________________________________________ + +- **key** str: The metric key +- **value** float: The metric value +- **inputs** list: A list of input IDs that were used to compute the metric. +- **params** dict: Dictionary of parameters used to compute the metric. +- **recorded_at** str: The timestamp of the metric. Server will use current time if not provided. +- **thresholds** dict: Dictionary of thresholds for the metric. ### preview_template[()]{.muted} @@ -246,10 +387,48 @@ Collect and run all the tests associated with a template This function will anal **Parameters** -- **optional)**: The section(s) to preview. Defaults to None. send (bool, -- **optional)**: Whether to send the results to the ValidMind API. Defaults to True. fail_fast (bool, -- **optional)**: Whether to stop running tests after the first failure. Defaults to False. inputs (dict, -- **optional)**: A dictionary of test inputs to pass to the TestSuite +DEBUG: + +- arg_name: section +- type_name: str or list +- description: The section(s) to preview. Defaults to None. + +______________________________________________________________________ + +- arg_name: send +- type_name: bool +- description: Whether to send the results to the ValidMind API. Defaults to True. + +______________________________________________________________________ + +- arg_name: fail_fast +- type_name: bool +- description: Whether to stop running tests after the first failure. Defaults to False. + +______________________________________________________________________ + +- arg_name: inputs +- type_name: dict +- description: A dictionary of test inputs to pass to the TestSuite + +______________________________________________________________________ + +- arg_name: config +- type_name: None +- description: A dictionary of test parameters to override the defaults + +______________________________________________________________________ + +- arg_name: \*\*kwargs +- type_name: None +- description: backwards compatibility for passing in test inputs using keyword arguments + +______________________________________________________________________ + +- **section** str or list: The section(s) to preview. Defaults to None. +- **send** bool: Whether to send the results to the ValidMind API. Defaults to True. +- **fail_fast** bool: Whether to stop running tests after the first failure. Defaults to False. +- **inputs** dict: A dictionary of test inputs to pass to the TestSuite - **config**: A dictionary of test parameters to override the defaults - \*\***kwargs**: backwards compatibility for passing in test inputs using keyword arguments @@ -277,11 +456,49 @@ High Level function for running a test suite This function provides a high level **Parameters** -- **(str)**: The test suite name (e.g. 'classifier_full_suite') config (dict, -- **optional)**: A dictionary of parameters to pass to the tests in the test suite. Defaults to None. send (bool, -- **optional)**: Whether to post the test results to the API. send=False is useful for testing. Defaults to True. fail_fast (bool, -- **optional)**: Whether to stop running tests after the first failure. Defaults to False. inputs (dict, -- **optional)**: A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` `models` etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. +DEBUG: + +- arg_name: test_suite_id +- type_name: str +- description: The test suite name (e.g. 'classifier_full_suite') + +______________________________________________________________________ + +- arg_name: config +- type_name: dict +- description: A dictionary of parameters to pass to the tests in the test suite. Defaults to None. + +______________________________________________________________________ + +- arg_name: send +- type_name: bool +- description: Whether to post the test results to the API. send=False is useful for testing. Defaults to True. + +______________________________________________________________________ + +- arg_name: fail_fast +- type_name: bool +- description: Whether to stop running tests after the first failure. Defaults to False. + +______________________________________________________________________ + +- arg_name: inputs +- type_name: dict +- description: A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` `models` etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. + +______________________________________________________________________ + +- arg_name: \*\*kwargs +- type_name: None +- description: backwards compatibility for passing in test inputs using keyword arguments + +______________________________________________________________________ + +- **test_suite_id** str: The test suite name (e.g. 'classifier_full_suite') +- **config** dict: A dictionary of parameters to pass to the tests in the test suite. Defaults to None. +- **send** bool: Whether to post the test results to the API. send=False is useful for testing. Defaults to True. +- **fail_fast** bool: Whether to stop running tests after the first failure. Defaults to False. +- **inputs** dict: A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` `models` etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. - \*\***kwargs**: backwards compatibility for passing in test inputs using keyword arguments **Returns** @@ -303,6 +520,14 @@ Decorator for specifying tags for a test. **Parameters** +DEBUG: + +- arg_name: \*tags +- type_name: None +- description: The tags to apply to the test. + +______________________________________________________________________ + - \***tags**: The tags to apply to the test. ### tasks[()]{.muted} @@ -316,6 +541,14 @@ Decorator for specifying the task types that a test is designed for. **Parameters** +DEBUG: + +- arg_name: \*tasks +- type_name: None +- description: The task types that the test is designed for. + +______________________________________________________________________ + - \***tasks**: The task types that the test is designed for. ### test[()]{.muted} @@ -325,17 +558,38 @@ def test( func_or_id): ``` -Decorator for creating and registering custom tests This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. The function can take two different types of arguments: +Decorator for creating and registering custom tests This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. + +The function can take two different types of arguments: - Inputs: ValidMind model or dataset (or list of models/datasets). These arguments must use the following names: `model`, `models`, `dataset`, `datasets`. -- Parameters: Any additional keyword arguments of any type (must have a default value) that can have any name. The function should return one of the following types: +- Parameters: Any additional keyword arguments of any type (must have a default value) that can have any name. + +The function should return one of the following types: + - Table: Either a list of dictionaries or a pandas DataFrame - Plot: Either a matplotlib figure or a plotly figure - Scalar: A single number (int or float) -- Boolean: A single boolean value indicating whether the test passed or failed The function may also include a docstring. This docstring will be used and logged as the metric's description. +- Boolean: A single boolean value indicating whether the test passed or failed + +The function may also include a docstring. This docstring will be used and logged as the metric's description. **Parameters** +DEBUG: + +- arg_name: func +- type_name: None +- description: The function to decorate + +______________________________________________________________________ + +- arg_name: test_id +- type_name: None +- description: The identifier for the metric. If not provided, the function name is used. + +______________________________________________________________________ + - **func**: The function to decorate - **test_id**: The identifier for the metric. If not provided, the function name is used. diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index f57bd4558..58c42108f 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -15,8 +15,22 @@ Preprocess boolean columns. **Parameters** -- **(pandas.DataFrame)**: Dataframe to preprocess. columns -- **(list)**: List of columns to preprocess. +DEBUG: + +- arg_name: df +- type_name: pandas.DataFrame +- description: Dataframe to preprocess. + +______________________________________________________________________ + +- arg_name: columns +- type_name: list +- description: List of columns to preprocess. + +______________________________________________________________________ + +- **df** pandas.DataFrame: Dataframe to preprocess. +- **columns** list: List of columns to preprocess. **Returns** @@ -33,8 +47,22 @@ Preprocess categorical columns. **Parameters** -- **(pandas.DataFrame)**: Dataframe to preprocess. columns -- **(list)**: List of columns to preprocess. +DEBUG: + +- arg_name: df +- type_name: pandas.DataFrame +- description: Dataframe to preprocess. + +______________________________________________________________________ + +- arg_name: columns +- type_name: list +- description: List of columns to preprocess. + +______________________________________________________________________ + +- **df** pandas.DataFrame: Dataframe to preprocess. +- **columns** list: List of columns to preprocess. **Returns** @@ -51,8 +79,22 @@ Preprocess numerical columns. **Parameters** -- **(pandas.DataFrame)**: Dataframe to preprocess. columns -- **(list)**: List of columns to preprocess. +DEBUG: + +- arg_name: df +- type_name: pandas.DataFrame +- description: Dataframe to preprocess. + +______________________________________________________________________ + +- arg_name: columns +- type_name: list +- description: List of columns to preprocess. + +______________________________________________________________________ + +- **df** pandas.DataFrame: Dataframe to preprocess. +- **columns** list: List of columns to preprocess. **Returns** diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index 05d94e9ed..ad4568373 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -15,8 +15,22 @@ Preprocess boolean columns. **Parameters** -- **(pandas.DataFrame)**: Dataframe to preprocess. columns -- **(list)**: List of columns to preprocess. +DEBUG: + +- arg_name: df +- type_name: pandas.DataFrame +- description: Dataframe to preprocess. + +______________________________________________________________________ + +- arg_name: columns +- type_name: list +- description: List of columns to preprocess. + +______________________________________________________________________ + +- **df** pandas.DataFrame: Dataframe to preprocess. +- **columns** list: List of columns to preprocess. **Returns** @@ -33,8 +47,22 @@ Preprocess categorical columns. **Parameters** -- **(pandas.DataFrame)**: Dataframe to preprocess. columns -- **(list)**: List of columns to preprocess. +DEBUG: + +- arg_name: df +- type_name: pandas.DataFrame +- description: Dataframe to preprocess. + +______________________________________________________________________ + +- arg_name: columns +- type_name: list +- description: List of columns to preprocess. + +______________________________________________________________________ + +- **df** pandas.DataFrame: Dataframe to preprocess. +- **columns** list: List of columns to preprocess. **Returns** @@ -51,8 +79,22 @@ Preprocess numerical columns. **Parameters** -- **(pandas.DataFrame)**: Dataframe to preprocess. columns -- **(list)**: List of columns to preprocess. +DEBUG: + +- arg_name: df +- type_name: pandas.DataFrame +- description: Dataframe to preprocess. + +______________________________________________________________________ + +- arg_name: columns +- type_name: list +- description: List of columns to preprocess. + +______________________________________________________________________ + +- **df** pandas.DataFrame: Dataframe to preprocess. +- **columns** list: List of columns to preprocess. **Returns** diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index 33c7a22e9..89585d315 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -31,6 +31,20 @@ Get demo test configuration. **Parameters** +DEBUG: + +- arg_name: x_test +- type_name: None +- description: Test features DataFrame + +______________________________________________________________________ + +- arg_name: y_test +- type_name: None +- description: Test target Series + +______________________________________________________________________ + - **x_test**: Test features DataFrame - **y_test**: Test target Series @@ -53,15 +67,7 @@ def load_data( verbose = True): ``` -Load data from either an online source or offline files, automatically dropping specified columns for offline data. - -**Parameters** - -- **source**: 'online' for online data, 'offline' for offline files. Defaults to 'online'. - -**Returns** - -- DataFrame containing the loaded data. +Load data from either an online source or offline files, automatically dropping specified columns for offline data. :param source: 'online' for online data, 'offline' for offline files. Defaults to 'online'. :return: DataFrame containing the loaded data. ## load_scorecard[()]{.muted} @@ -100,10 +106,36 @@ Split dataset into train, validation (optional), and test sets. **Parameters** +DEBUG: + +- arg_name: df +- type_name: None +- description: Input DataFrame + +______________________________________________________________________ + +- arg_name: validation_split +- type_name: None +- description: If None, returns train/test split. If float, returns train/val/test split + +______________________________________________________________________ + +- arg_name: test_size +- type_name: None +- description: Proportion of data for test set (default: 0.2) + +______________________________________________________________________ + +- arg_name: add_constant +- type_name: None +- description: Whether to add constant column for statsmodels (default: False) + +______________________________________________________________________ + - **df**: Input DataFrame - **validation_split**: If None, returns train/test split. If float, returns train/val/test split -- **test_size**: Proportion of data for test set (default: ) 0.2) -- **add_constant**: Whether to add constant column for statsmodels (default: ) False) +- **test_size**: Proportion of data for test set (default: 0.2) +- **add_constant**: Whether to add constant column for statsmodels (default: False) **Returns** diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 7aa300973..a846594f6 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -18,11 +18,7 @@ def load_data( ): ``` -Load data from the specified CSV file. - -**Returns** - -- DataFrame containing the loaded data. +Load data from the specified CSV file. :return: DataFrame containing the loaded data. ## preprocess[()]{.muted} diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index 2f8833d1a..8f92e13a9 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -22,13 +22,4 @@ def load_data( dataset_size = None): ``` -Load data from either online source or offline files. - -**Parameters** - -- **source**: 'online' for online data, 'offline' for offline data. Defaults to 'online'. -- **dataset_size**: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. - -**Returns** - -- DataFrame containing the loaded data. +Load data from either online source or offline files. :param source: 'online' for online data, 'offline' for offline data. Defaults to 'online'. :param dataset_size: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. :return: DataFrame containing the loaded data. diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index a496874a4..8144f6754 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -60,10 +60,36 @@ Split a time series DataFrame into train, validation, and test sets. **Parameters** -- **df** (pandas.DataFrame): The time series DataFrame to be split. -- **split_option** (str): The split option to choose from: 'train_test_val' (default) or 'train_test'. -- **train_size** (float): The proportion of the dataset to include in the training set. Default is 0.6. -- **test_size** (float): The proportion of the dataset to include in the test set. Default is 0.2. +DEBUG: + +- arg_name: df +- type_name: pandas.DataFrame +- description: The time series DataFrame to be split. + +______________________________________________________________________ + +- arg_name: split_option +- type_name: str +- description: The split option to choose from: 'train_test_val' (default) or 'train_test'. + +______________________________________________________________________ + +- arg_name: train_size +- type_name: float +- description: The proportion of the dataset to include in the training set. Default is 0.6. + +______________________________________________________________________ + +- arg_name: test_size +- type_name: float +- description: The proportion of the dataset to include in the test set. Default is 0.2. + +______________________________________________________________________ + +- **df** pandas.DataFrame: The time series DataFrame to be split. +- **split_option** str: The split option to choose from: 'train_test_val' (default) or 'train_test'. +- **train_size** float: The proportion of the dataset to include in the training set. Default is 0.6. +- **test_size** float: The proportion of the dataset to include in the test set. Default is 0.2. **Returns** diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index bd0ca5de3..39803af23 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -25,10 +25,36 @@ Split a time series DataFrame into train, validation, and test sets. **Parameters** -- **df** (pandas.DataFrame): The time series DataFrame to be split. -- **split_option** (str): The split option to choose from: 'train_test_val' (default) or 'train_test'. -- **train_size** (float): The proportion of the dataset to include in the training set. Default is 0.6. -- **test_size** (float): The proportion of the dataset to include in the test set. Default is 0.2. +DEBUG: + +- arg_name: df +- type_name: pandas.DataFrame +- description: The time series DataFrame to be split. + +______________________________________________________________________ + +- arg_name: split_option +- type_name: str +- description: The split option to choose from: 'train_test_val' (default) or 'train_test'. + +______________________________________________________________________ + +- arg_name: train_size +- type_name: float +- description: The proportion of the dataset to include in the training set. Default is 0.6. + +______________________________________________________________________ + +- arg_name: test_size +- type_name: float +- description: The proportion of the dataset to include in the test set. Default is 0.2. + +______________________________________________________________________ + +- **df** pandas.DataFrame: The time series DataFrame to be split. +- **split_option** str: The split option to choose from: 'train_test_val' (default) or 'train_test'. +- **train_size** float: The proportion of the dataset to include in the training set. Default is 0.6. +- **test_size** float: The proportion of the dataset to include in the test set. Default is 0.2. **Returns** diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 7f6f2bdae..064b37574 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -48,7 +48,15 @@ Convert a test ID to a human-readable name. **Parameters** -- **(str)**: The test identifier, typically in CamelCase or snake_case. +DEBUG: + +- arg_name: test_id +- type_name: str +- description: The test identifier, typically in CamelCase or snake_case. + +______________________________________________________________________ + +- **test_id** str: The test identifier, typically in CamelCase or snake_case. **Returns** @@ -66,6 +74,20 @@ Describes a Test Suite by ID **Parameters** +DEBUG: + +- arg_name: test_suite_id +- type_name: None +- description: Test Suite ID + +______________________________________________________________________ + +- arg_name: verbose +- type_name: None +- description: If True, describe all plans and tests in the Test Suite + +______________________________________________________________________ + - **test_suite_id**: Test Suite ID - **verbose**: If True, describe all plans and tests in the Test Suite diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 6135dd30e..7fbf037fd 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -21,8 +21,22 @@ Get or show details about the test This function can be used to see test details **Parameters** -- **optional)**: The test ID. Defaults to None. raw (bool, -- **optional)**: If True, returns a dictionary with the test details. Defaults to False. +DEBUG: + +- arg_name: test_id +- type_name: str +- description: The test ID. Defaults to None. + +______________________________________________________________________ + +- arg_name: raw +- type_name: bool +- description: If True, returns a dictionary with the test details. Defaults to False. + +______________________________________________________________________ + +- **test_id** str: The test ID. Defaults to None. +- **raw** bool: If True, returns a dictionary with the test details. Defaults to False. ## list_tags[()]{.muted} @@ -66,11 +80,43 @@ List all tests in the tests directory. **Parameters** -- **optional)**: Find tests where the ID, tasks or tags match the filter string. Defaults to None. task (str, -- **optional)**: Find tests that match the task. Can be used to narrow down matches from the filter string. Defaults to None. tags (list, -- **optional)**: Find tests that match list of tags. Can be used to narrow down matches from the filter string. Defaults to None. pretty (bool, -- **optional)**: If True, returns a pandas DataFrame with a formatted table. Defaults to True. truncate (bool, -- **optional)**: If True, truncates the test description to the first line. Defaults to True. (only used if pretty=True) +DEBUG: + +- arg_name: filter +- type_name: str +- description: Find tests where the ID, tasks or tags match the filter string. Defaults to None. + +______________________________________________________________________ + +- arg_name: task +- type_name: str +- description: Find tests that match the task. Can be used to narrow down matches from the filter string. Defaults to None. + +______________________________________________________________________ + +- arg_name: tags +- type_name: list +- description: Find tests that match list of tags. Can be used to narrow down matches from the filter string. Defaults to None. + +______________________________________________________________________ + +- arg_name: pretty +- type_name: bool +- description: If True, returns a pandas DataFrame with a formatted table. Defaults to True. + +______________________________________________________________________ + +- arg_name: truncate +- type_name: bool +- description: If True, truncates the test description to the first line. Defaults to True. (only used if pretty=True) + +______________________________________________________________________ + +- **filter** str: Find tests where the ID, tasks or tags match the filter string. Defaults to None. +- **task** str: Find tests that match the task. Can be used to narrow down matches from the filter string. Defaults to None. +- **tags** list: Find tests that match list of tags. Can be used to narrow down matches from the filter string. Defaults to None. +- **pretty** bool: If True, returns a pandas DataFrame with a formatted table. Defaults to True. +- **truncate** bool: If True, truncates the test description to the first line. Defaults to True. (only used if pretty=True) **Returns** @@ -87,9 +133,22 @@ Load a test by test ID Test IDs are in the format `namespace.path_to_module.Test **Parameters** -- **(str)**: The test ID in the format -- \*\*`namespace.path_to_module.TestName[**: tag]` test_func (callable, -- **optional)**: The test function to load. If not provided, the test will be loaded from the test provider. Defaults to None. +DEBUG: + +- arg_name: test_id +- type_name: str +- description: The test ID in the format `namespace.path_to_module.TestName[:tag]` + +______________________________________________________________________ + +- arg_name: test_func +- type_name: callable +- description: The test function to load. If not provided, the test will be loaded from the test provider. Defaults to None. + +______________________________________________________________________ + +- **test_id** str: The test ID in the format `namespace.path_to_module.TestName[:tag]` +- **test_func** callable: The test function to load. If not provided, the test will be loaded from the test provider. Defaults to None. ## run_test[()]{.muted} @@ -102,19 +161,93 @@ Run a ValidMind or custom test This function is the main entry point for running **Parameters** -- **optional)**: Test ID to run. Not required if `name` and `unit_metrics` provided. params (dict, -- **optional)**: Parameters to customize test behavior. See test details for available parameters. param_grid (Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\], -- **optional)**: For comparison tests, -- **either**: - Dict mapping parameter names to lists of values (creates Cartesian product) - List of parameter dictionaries to test inputs (Dict[str, Any], -- **optional)**: Test inputs (models/datasets initialized with vm.init_model/dataset) input_grid (Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\], -- **optional)**: For comparison tests, -- **either**: - Dict mapping input names to lists of values (creates Cartesian product) - List of input dictionaries to test name (str, -- **optional)**: Test name (required for composite metrics) unit_metrics (list, -- **optional)**: Unit metric IDs to run as composite metric show (bool, -- **optional)**: Whether to display results. Defaults to True. generate_description (bool, -- **optional)**: Whether to generate a description. Defaults to True. title (str, -- **optional)**: Custom title for the test result post_process_fn (Callable\[[TestResult], None\], -- **optional)**: Function to post-process the test result +DEBUG: + +- arg_name: test_id +- type_name: TestID +- description: Test ID to run. Not required if `name` and `unit_metrics` provided. + +______________________________________________________________________ + +- arg_name: params +- type_name: dict +- description: Parameters to customize test behavior. See test details for available parameters. + +______________________________________________________________________ + +- arg_name: param_grid +- type_name: Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\] +- description: For comparison tests, either: +- Dict mapping parameter names to lists of values (creates Cartesian product) +- List of parameter dictionaries to test + +______________________________________________________________________ + +- arg_name: inputs +- type_name: Dict[str, Any] +- description: Test inputs (models/datasets initialized with vm.init_model/dataset) + +______________________________________________________________________ + +- arg_name: input_grid +- type_name: Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\] +- description: For comparison tests, either: +- Dict mapping input names to lists of values (creates Cartesian product) +- List of input dictionaries to test + +______________________________________________________________________ + +- arg_name: name +- type_name: str +- description: Test name (required for composite metrics) + +______________________________________________________________________ + +- arg_name: unit_metrics +- type_name: list +- description: Unit metric IDs to run as composite metric + +______________________________________________________________________ + +- arg_name: show +- type_name: bool +- description: Whether to display results. Defaults to True. + +______________________________________________________________________ + +- arg_name: generate_description +- type_name: bool +- description: Whether to generate a description. Defaults to True. + +______________________________________________________________________ + +- arg_name: title +- type_name: str +- description: Custom title for the test result + +______________________________________________________________________ + +- arg_name: post_process_fn +- type_name: Callable\[[TestResult], None\] +- description: Function to post-process the test result + +______________________________________________________________________ + +- **test_id** TestID: Test ID to run. Not required if `name` and `unit_metrics` provided. +- **params** dict: Parameters to customize test behavior. See test details for available parameters. +- **param_grid** Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\]: For comparison tests, either: +- Dict mapping parameter names to lists of values (creates Cartesian product) +- List of parameter dictionaries to test +- **inputs** Dict\[str, Any\]: Test inputs (models/datasets initialized with vm.init_model/dataset) +- **input_grid** Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\]: For comparison tests, either: +- Dict mapping input names to lists of values (creates Cartesian product) +- List of input dictionaries to test +- **name** str: Test name (required for composite metrics) +- **unit_metrics** list: Unit metric IDs to run as composite metric +- **show** bool: Whether to display results. Defaults to True. +- **generate_description** bool: Whether to generate a description. Defaults to True. +- **title** str: Custom title for the test result +- **post_process_fn** Callable\[[TestResult], None\]: Function to post-process the test result **Returns** @@ -136,6 +269,14 @@ Decorator for specifying tags for a test. **Parameters** +DEBUG: + +- arg_name: \*tags +- type_name: None +- description: The tags to apply to the test. + +______________________________________________________________________ + - \***tags**: The tags to apply to the test. ## tasks[()]{.muted} @@ -149,6 +290,14 @@ Decorator for specifying the task types that a test is designed for. **Parameters** +DEBUG: + +- arg_name: \*tasks +- type_name: None +- description: The task types that the test is designed for. + +______________________________________________________________________ + - \***tasks**: The task types that the test is designed for. ## test[()]{.muted} @@ -158,17 +307,38 @@ def test( func_or_id): ``` -Decorator for creating and registering custom tests This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. The function can take two different types of arguments: +Decorator for creating and registering custom tests This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. + +The function can take two different types of arguments: - Inputs: ValidMind model or dataset (or list of models/datasets). These arguments must use the following names: `model`, `models`, `dataset`, `datasets`. -- Parameters: Any additional keyword arguments of any type (must have a default value) that can have any name. The function should return one of the following types: +- Parameters: Any additional keyword arguments of any type (must have a default value) that can have any name. + +The function should return one of the following types: + - Table: Either a list of dictionaries or a pandas DataFrame - Plot: Either a matplotlib figure or a plotly figure - Scalar: A single number (int or float) -- Boolean: A single boolean value indicating whether the test passed or failed The function may also include a docstring. This docstring will be used and logged as the metric's description. +- Boolean: A single boolean value indicating whether the test passed or failed + +The function may also include a docstring. This docstring will be used and logged as the metric's description. **Parameters** +DEBUG: + +- arg_name: func +- type_name: None +- description: The function to decorate + +______________________________________________________________________ + +- arg_name: test_id +- type_name: None +- description: The identifier for the metric. If not provided, the function name is used. + +______________________________________________________________________ + - **func**: The function to decorate - **test_id**: The identifier for the metric. If not provided, the function name is used. @@ -188,8 +358,22 @@ Register an external test provider **Parameters** -- **(str)**: The namespace of the test provider test_provider -- **(TestProvider)**: The test provider +DEBUG: + +- arg_name: namespace +- type_name: str +- description: The namespace of the test provider + +______________________________________________________________________ + +- arg_name: test_provider +- type_name: TestProvider +- description: The test provider + +______________________________________________________________________ + +- **namespace** str: The namespace of the test provider +- **test_provider** TestProvider: The test provider ## [class]{.muted} LoadTestError @@ -235,7 +419,15 @@ test = test_provider.load_test("my_namespace.my_test_class") **Parameters** -- **root_folder** (str): The root directory for local tests. +DEBUG: + +- arg_name: root_folder +- type_name: str +- description: The root directory for local tests. + +______________________________________________________________________ + +- **root_folder** str: The root directory for local tests. ### [list_tests[()]{.muted}](#list_tests) @@ -255,20 +447,11 @@ List all tests in the given namespace load_test(self, test_id) ``` -Load the test identified by the given test_id. +Load the test identified by the given test_id. Args: test_id (str): The identifier of the test. This corresponds to the relative path of the python file from the root folder, with slashes replaced by dots -**Parameters** +Returns: The test class that matches the last part of the test_id. -- **(str)**: The identifier of the test. This corresponds to the relative path of the python file from the root folder, with slashes replaced by dots - -**Returns** - -- The test class that matches the last part of the test_id. - -**Raises** - -- **LocalTestProviderLoadModuleError**: If the test module cannot be imported -- **LocalTestProviderLoadTestError**: If the test class cannot be found in the module +Raises: LocalTestProviderLoadModuleError: If the test module cannot be imported LocalTestProviderLoadTestError: If the test class cannot be found in the module ## [class]{.muted} TestProvider @@ -302,7 +485,15 @@ Load the test function identified by the given test_id **Parameters** -- **(str)**: The test ID (does not contain the namespace under which the test is registered) +DEBUG: + +- arg_name: test_id +- type_name: str +- description: The test ID (does not contain the namespace under which the test is registered) + +______________________________________________________________________ + +- **test_id** str: The test ID (does not contain the namespace under which the test is registered) **Returns** diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index f477270fc..d503d5bef 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -15,6 +15,26 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val **Parameters** +DEBUG: + +- arg_name: y_true +- type_name: None +- description: List or array of true values + +______________________________________________________________________ + +- arg_name: y_pred +- type_name: None +- description: List or array of predicted values + +______________________________________________________________________ + +- arg_name: dataset_id +- type_name: None +- description: Optional identifier for the dataset (for logging) + +______________________________________________________________________ + - **y_true**: List or array of true values - **y_pred**: List or array of predicted values - **dataset_id**: Optional identifier for the dataset (for logging) diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 4f5caf9d9..e449f8a4e 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -15,6 +15,26 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val **Parameters** +DEBUG: + +- arg_name: y_true +- type_name: None +- description: List or array of true values + +______________________________________________________________________ + +- arg_name: y_pred +- type_name: None +- description: List or array of predicted values + +______________________________________________________________________ + +- arg_name: dataset_id +- type_name: None +- description: Optional identifier for the dataset (for logging) + +______________________________________________________________________ + - **y_true**: List or array of true values - **y_pred**: List or array of predicted values - **dataset_id**: Optional identifier for the dataset (for logging) diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 5d80ae6d3..c496cc0bf 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -15,6 +15,26 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val **Parameters** +DEBUG: + +- arg_name: y_true +- type_name: None +- description: List or array of true values + +______________________________________________________________________ + +- arg_name: y_pred +- type_name: None +- description: List or array of predicted values + +______________________________________________________________________ + +- arg_name: dataset_id +- type_name: None +- description: Optional identifier for the dataset (for logging) + +______________________________________________________________________ + - **y_true**: List or array of true values - **y_pred**: List or array of predicted values - **dataset_id**: Optional identifier for the dataset (for logging) diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 2e1887195..532aa9e20 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -15,6 +15,26 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val **Parameters** +DEBUG: + +- arg_name: y_true +- type_name: None +- description: List or array of true values + +______________________________________________________________________ + +- arg_name: y_pred +- type_name: None +- description: List or array of predicted values + +______________________________________________________________________ + +- arg_name: dataset_id +- type_name: None +- description: Optional identifier for the dataset (for logging) + +______________________________________________________________________ + - **y_true**: List or array of true values - **y_pred**: List or array of predicted values - **dataset_id**: Optional identifier for the dataset (for logging) diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 1a5ba0268..c925a049d 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -15,6 +15,26 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val **Parameters** +DEBUG: + +- arg_name: y_true +- type_name: None +- description: List or array of true values + +______________________________________________________________________ + +- arg_name: y_pred +- type_name: None +- description: List or array of predicted values + +______________________________________________________________________ + +- arg_name: dataset_id +- type_name: None +- description: Optional identifier for the dataset (for logging) + +______________________________________________________________________ + - **y_true**: List or array of true values - **y_pred**: List or array of predicted values - **dataset_id**: Optional identifier for the dataset (for logging) diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 595184c60..aa36877c3 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -65,9 +65,35 @@ The test implements multiple threshold optimization methods: **Parameters** +DEBUG: + +- arg_name: dataset +- type_name: None +- description: VMDataset containing features and target + +______________________________________________________________________ + +- arg_name: model +- type_name: None +- description: VMModel containing predictions + +______________________________________________________________________ + +- arg_name: methods +- type_name: None +- description: List of methods to compare (default: ['youden', 'f1', 'precision_recall']) + +______________________________________________________________________ + +- arg_name: target_recall +- type_name: None +- description: Target recall value if using 'target_recall' method + +______________________________________________________________________ + - **dataset**: VMDataset containing features and target - **model**: VMModel containing predictions -- **methods**: List of methods to compare (default: ) ['youden', 'f1', 'precision_recall']) +- **methods**: List of methods to compare (default: ['youden', 'f1', 'precision_recall']) - **target_recall**: Target recall value if using 'target_recall' method **Returns** @@ -90,6 +116,32 @@ Find the optimal classification threshold using various methods. **Parameters** +DEBUG: + +- arg_name: y_true +- type_name: None +- description: True binary labels + +______________________________________________________________________ + +- arg_name: y_prob +- type_name: None +- description: Predicted probabilities + +______________________________________________________________________ + +- arg_name: method +- type_name: None +- description: Method to use for finding optimal threshold + +______________________________________________________________________ + +- arg_name: target_recall +- type_name: None +- description: Required if method='target_recall' + +______________________________________________________________________ + - **y_true**: True binary labels - **y_prob**: Predicted probabilities - **method**: Method to use for finding optimal threshold diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index e99f6ed56..dcd67d27d 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -26,6 +26,26 @@ Plots two types of SHAP global importance (SHAP). **Parameters** +DEBUG: + +- arg_name: type\_ +- type_name: None +- description: The type of SHAP plot to generate. Must be "mean" or "summary". + +______________________________________________________________________ + +- arg_name: shap_values +- type_name: None +- description: The SHAP values to plot. + +______________________________________________________________________ + +- arg_name: x_test +- type_name: None +- description: The test data used to generate the SHAP values. + +______________________________________________________________________ + - **type\_**: The type of SHAP plot to generate. Must be "mean" or "summary". - **shap_values**: The SHAP values to plot. - **x_test**: The test data used to generate the SHAP values. @@ -46,6 +66,20 @@ Selects SHAP values for binary or multiclass classification. For regression mode **Parameters** +DEBUG: + +- arg_name: shap_values +- type_name: None +- description: The SHAP values returned by the SHAP explainer. For multiclass classification, this will be a list where each element corresponds to a class. For regression, this will be a single array of SHAP values. + +______________________________________________________________________ + +- arg_name: class_of_interest +- type_name: None +- description: The class index for which to retrieve SHAP values. If None (default), the function will assume binary classification and use class 1 by default. + +______________________________________________________________________ + - **shap_values**: The SHAP values returned by the SHAP explainer. For multiclass classification, this will be a list where each element corresponds to a class. For regression, this will be a single array of SHAP values. - **class_of_interest**: The class index for which to retrieve SHAP values. If None (default), the function will assume binary classification and use class 1 by default. diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index a7eb5bfe8..96b39624b 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -118,8 +118,22 @@ Runs the test suite, renders the summary and sends the results to ValidMind **Parameters** -- **optional)**: Whether to send the results to ValidMind. Defaults to True. fail_fast (bool, -- **optional)**: Whether to stop running tests after the first failure. Defaults to False. +DEBUG: + +- arg_name: send +- type_name: bool +- description: Whether to send the results to ValidMind. Defaults to True. + +______________________________________________________________________ + +- arg_name: fail_fast +- type_name: bool +- description: Whether to stop running tests after the first failure. Defaults to False. + +______________________________________________________________________ + +- **send** bool: Whether to send the results to ValidMind. Defaults to True. +- **fail_fast** bool: Whether to stop running tests after the first failure. Defaults to False. ### [summarize[()]{.muted}](#summarize) @@ -139,18 +153,92 @@ This way we can support multiple dataset types but under the hood we only need t **Parameters** -- **raw_dataset** (np.ndarray): The raw dataset as a NumPy array. -- **input_id** (str): Identifier for the dataset. -- **index** (np.ndarray): The raw dataset index as a NumPy array. -- **columns** (Set[str]): The column names of the dataset. -- **target_column** (str): The target column name of the dataset. -- **feature_columns** (List[str]): The feature column names of the dataset. -- **feature_columns_numeric** (List[str]): The numeric feature column names of the dataset. -- **feature_columns_categorical** (List[str]): The categorical feature column names of the dataset. -- **text_column** (str): The text column name of the dataset for NLP tasks. -- **target_class_labels** (Dict): The class labels for the target columns. -- **df** (pd.DataFrame): The dataset as a pandas DataFrame. -- **extra_columns** (Dict): Extra columns to include in the dataset. +DEBUG: + +- arg_name: raw_dataset +- type_name: np.ndarray +- description: The raw dataset as a NumPy array. + +______________________________________________________________________ + +- arg_name: input_id +- type_name: str +- description: Identifier for the dataset. + +______________________________________________________________________ + +- arg_name: index +- type_name: np.ndarray +- description: The raw dataset index as a NumPy array. + +______________________________________________________________________ + +- arg_name: columns +- type_name: Set[str] +- description: The column names of the dataset. + +______________________________________________________________________ + +- arg_name: target_column +- type_name: str +- description: The target column name of the dataset. + +______________________________________________________________________ + +- arg_name: feature_columns +- type_name: List[str] +- description: The feature column names of the dataset. + +______________________________________________________________________ + +- arg_name: feature_columns_numeric +- type_name: List[str] +- description: The numeric feature column names of the dataset. + +______________________________________________________________________ + +- arg_name: feature_columns_categorical +- type_name: List[str] +- description: The categorical feature column names of the dataset. + +______________________________________________________________________ + +- arg_name: text_column +- type_name: str +- description: The text column name of the dataset for NLP tasks. + +______________________________________________________________________ + +- arg_name: target_class_labels +- type_name: Dict +- description: The class labels for the target columns. + +______________________________________________________________________ + +- arg_name: df +- type_name: pd.DataFrame +- description: The dataset as a pandas DataFrame. + +______________________________________________________________________ + +- arg_name: extra_columns +- type_name: Dict +- description: Extra columns to include in the dataset. + +______________________________________________________________________ + +- **raw_dataset** np.ndarray: The raw dataset as a NumPy array. +- **input_id** str: Identifier for the dataset. +- **index** np.ndarray: The raw dataset index as a NumPy array. +- **columns** Set\[str\]: The column names of the dataset. +- **target_column** str: The target column name of the dataset. +- **feature_columns** List\[str\]: The feature column names of the dataset. +- **feature_columns_numeric** List\[str\]: The numeric feature column names of the dataset. +- **feature_columns_categorical** List\[str\]: The categorical feature column names of the dataset. +- **text_column** str: The text column name of the dataset for NLP tasks. +- **target_class_labels** Dict: The class labels for the target columns. +- **df** pd.DataFrame: The dataset as a pandas DataFrame. +- **extra_columns** Dict: Extra columns to include in the dataset. **Inherited members** @@ -164,8 +252,22 @@ Adds an extra column to the dataset without modifying the dataset `features` and **Parameters** -- **(str)**: The name of the extra column. column_values (np.ndarray, -- **optional)**: The values of the extra column. +DEBUG: + +- arg_name: column_name +- type_name: str +- description: The name of the extra column. + +______________________________________________________________________ + +- arg_name: column_values +- type_name: np.ndarray +- description: The values of the extra column. + +______________________________________________________________________ + +- **column_name** str: The name of the extra column. +- **column_values** np.ndarray: The values of the extra column. ### [assign_predictions[()]{.muted}](#assign_predictions) @@ -177,12 +279,56 @@ Assign predictions and probabilities to the dataset. **Parameters** -- **(VMModel)**: The model used to generate the predictions. prediction_column (str, -- **optional)**: The name of the column containing the predictions. Defaults to None. prediction_values (list, -- **optional)**: The values of the predictions. Defaults to None. probability_column (str, -- **optional)**: The name of the column containing the probabilities. Defaults to None. probability_values (list, -- **optional)**: The values of the probabilities. Defaults to None. prediction_probabilities (list, -- **DEPRECATED**: The values of the probabilities. Defaults to None. +DEBUG: + +- arg_name: model +- type_name: VMModel +- description: The model used to generate the predictions. + +______________________________________________________________________ + +- arg_name: prediction_column +- type_name: str +- description: The name of the column containing the predictions. Defaults to None. + +______________________________________________________________________ + +- arg_name: prediction_values +- type_name: list +- description: The values of the predictions. Defaults to None. + +______________________________________________________________________ + +- arg_name: probability_column +- type_name: str +- description: The name of the column containing the probabilities. Defaults to None. + +______________________________________________________________________ + +- arg_name: probability_values +- type_name: list +- description: The values of the probabilities. Defaults to None. + +______________________________________________________________________ + +- arg_name: prediction_probabilities +- type_name: list +- description: DEPRECATED: The values of the probabilities. Defaults to None. + +______________________________________________________________________ + +- arg_name: kwargs +- type_name: None +- description: Additional keyword arguments that will get passed through to the model's `predict` method. + +______________________________________________________________________ + +- **model** VMModel: The model used to generate the predictions. +- **prediction_column** str: The name of the column containing the predictions. Defaults to None. +- **prediction_values** list: The values of the predictions. Defaults to None. +- **probability_column** str: The name of the column containing the probabilities. Defaults to None. +- **probability_values** list: The values of the probabilities. Defaults to None. +- **prediction_probabilities** list: DEPRECATED: The values of the probabilities. Defaults to None. - **kwargs**: Additional keyword arguments that will get passed through to the model's `predict` method. ### [prediction_column[()]{.muted}](#prediction_column) @@ -219,8 +365,17 @@ Support options provided when passing an input to run_test or run_test_suite **Parameters** -- **Options**: - -- **columns**: Filter columns in the dataset +DEBUG: + +- arg_name: \*\*kwargs +- type_name: None +- description: Options: +- columns: Filter columns in the dataset + +______________________________________________________________________ + +- \*\***kwargs**: Options: +- columns: Filter columns in the dataset **Returns** @@ -252,7 +407,15 @@ Returns the predictions for a given model. Attempts to stack complex prediction **Parameters** -- **(VMModel)**: The model whose predictions are sought. +DEBUG: + +- arg_name: model +- type_name: VMModel +- description: The model whose predictions are sought. + +______________________________________________________________________ + +- **model** VMModel: The model whose predictions are sought. **Returns** @@ -276,7 +439,15 @@ Returns the probabilities for a given model. **Parameters** -- **(str)**: The ID of the model whose predictions are sought. +DEBUG: + +- arg_name: model +- type_name: str +- description: The ID of the model whose predictions are sought. + +______________________________________________________________________ + +- **model** str: The ID of the model whose predictions are sought. **Returns** @@ -306,10 +477,20 @@ Base class for ValidMind Input types with_options(self, kwargs) ``` -Allows for setting options on the input object that are passed by the user when using the input to run a test or set of tests To allow options, just override this method in the subclass (see VMDataset) and ensure that it returns a new instance of the input with the specified options set. +Allows for setting options on the input object that are passed by the user when using the input to run a test or set of tests + +To allow options, just override this method in the subclass (see VMDataset) and ensure that it returns a new instance of the input with the specified options set. **Parameters** +DEBUG: + +- arg_name: \*\*kwargs +- type_name: None +- description: Arbitrary keyword arguments that will be passed to the input object + +______________________________________________________________________ + - \*\***kwargs**: Arbitrary keyword arguments that will be passed to the input object **Returns** @@ -326,10 +507,36 @@ An base class that wraps a trained model instance and its associated data. **Parameters** -- **model** (object): The trained model instance. Defaults to None. -- **input_id** (str): The input ID for the model. Defaults to None. -- **attributes** (ModelAttributes): The attributes of the model. Defaults to None. -- **name** (str): The name of the model. Defaults to the class name. +DEBUG: + +- arg_name: model +- type_name: object +- description: The trained model instance. Defaults to None. + +______________________________________________________________________ + +- arg_name: input_id +- type_name: str +- description: The input ID for the model. Defaults to None. + +______________________________________________________________________ + +- arg_name: attributes +- type_name: ModelAttributes +- description: The attributes of the model. Defaults to None. + +______________________________________________________________________ + +- arg_name: name +- type_name: str +- description: The name of the model. Defaults to the class name. + +______________________________________________________________________ + +- **model** object: The trained model instance. Defaults to None. +- **input_id** str: The input ID for the model. Defaults to None. +- **attributes** ModelAttributes: The attributes of the model. Defaults to None. +- **name** str: The name of the model. Defaults to the class name. **Inherited members** diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 0e87b77f3..ae319bf16 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -303,37 +303,14 @@ def try_parse_docstring(docstring: str) -> Any: # Convert escaped newlines to actual newlines docstring = docstring.replace('\\n', '\n') - # Check for Google style markers - google_markers = ['Args:', 'Returns:', 'Raises:', 'Yields:', 'Example:'] - is_google = any(marker in docstring for marker in google_markers) - - # Check for RST style markers - rst_markers = [':param', ':return:', ':raises:', ':yields:'] - is_rst = any(marker in docstring for marker in rst_markers) - - if is_google: - formatted = format_google_docstring(docstring) - try: - parsed = parse(formatted) - return parsed - except Exception: - pass - - if is_rst: - formatted = format_rst_docstring(docstring) - try: - parsed = parse(formatted, style=Style.REST) - return parsed - except Exception: - pass - - # If no style detected or parsing failed, try both as fallback + # Try Google style first try: - return parse(docstring) - except: + return parse(docstring, style=Style.GOOGLE) + except Exception: + # Fallback to RST style try: return parse(docstring, style=Style.REST) - except: + except Exception: return None def parse_docstrings_recursively(data: Dict[str, Any]): @@ -347,6 +324,7 @@ def parse_docstrings_recursively(data: Dict[str, Any]): else: original = str(data['docstring']) + # Parse docstring once and store both original and parsed versions parsed = try_parse_docstring(original) data['docstring'] = { 'value': original, @@ -486,6 +464,59 @@ def generate_docs(json_path: str, template_dir: str, output_dir: str): else: print("Error: No 'validmind' module found in JSON") +def parse_docstring(docstring): + """Parse a docstring into its components.""" + if not docstring: + return None + try: + # Pre-process docstring to reconstruct original format + lines = docstring.split('\n') + processed_lines = [] + in_args = False + current_param = [] + + for line in lines: + line = line.strip() + # Check if we're in the Args section + if line.startswith('Args:'): + in_args = True + processed_lines.append(line) + continue + + if in_args and line: + # Fix mangled parameter lines like "optional): The test suite name..." + if line.startswith('optional)'): + # Extract the actual parameter name from the description + desc_parts = line.split(':', 1)[1].strip().split('(') + if len(desc_parts) > 1: + param_name = desc_parts[1].split(',')[0].strip() + desc = desc_parts[0].strip() + line = f" {param_name} (str, optional): {desc}" + processed_lines.append(line) + else: + processed_lines.append(line) + + processed_docstring = '\n'.join(processed_lines) + return parse(processed_docstring, style=Style.GOOGLE) + except Exception as e: + # Fallback to just returning the raw docstring + return {'value': docstring} + +def debug_docstring_state(stage: str, docstring: Any): + """Debug helper to track docstring transformations.""" + print(f"\n=== {stage} ===") + if isinstance(docstring, dict): + if 'value' in docstring: + print("Value:", docstring['value'][:200] + "..." if len(docstring['value']) > 200 else docstring['value']) + if 'parsed' in docstring and docstring['parsed']: + print("\nParsed params:") + for param in docstring['parsed'].params: + print(f"- arg_name: {param.arg_name}") + print(f" type_name: {param.type_name}") + print(f" description: {param.description}") + else: + print(docstring[:200] + "..." if len(str(docstring)) > 200 else docstring) + if __name__ == '__main__': generate_docs( json_path='docs/validmind.json', From c13c5e3fc772c1accaf8fdc6508ec416b773614f Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Tue, 28 Jan 2025 08:45:01 -0800 Subject: [PATCH 025/207] Save point with partial sidebar fixes --- docs/_sidebar.yml | 236 +--- docs/project_tree | 1219 +++++++++++++++++ docs/templates/macros/docstring.jinja2 | 9 - docs/templates/sidebar.qmd.jinja2 | 41 +- docs/templates/vm_models.qmd.jinja2 | 36 + docs/validmind.qmd | 254 ---- .../classification/customer_churn.qmd | 42 - .../datasets/classification/taiwan_credit.qmd | 42 - .../datasets/credit_risk/lending_club.qmd | 40 - docs/validmind/datasets/regression/fred.qmd | 26 - .../datasets/regression/lending_club.qmd | 26 - docs/validmind/test_suites.qmd | 22 - docs/validmind/tests.qmd | 192 --- .../tests/model_validation/BertScore.qmd | 20 - .../tests/model_validation/BleuScore.qmd | 20 - .../model_validation/ContextualRecall.qmd | 20 - .../tests/model_validation/MeteorScore.qmd | 20 - .../tests/model_validation/RegardScore.qmd | 20 - .../ClassifierThresholdOptimization.qmd | 52 - .../sklearn/SHAPGlobalImportance.qmd | 34 - docs/validmind/vm_models.qmd | 205 --- scripts/generate_quarto_docs.py | 61 +- 22 files changed, 1333 insertions(+), 1304 deletions(-) create mode 100644 docs/project_tree create mode 100644 docs/templates/vm_models.qmd.jinja2 diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml index c4d439aa3..13f5bc927 100644 --- a/docs/_sidebar.yml +++ b/docs/_sidebar.yml @@ -1,252 +1,50 @@ website: sidebar: - - contents: + - text: "ValidMind Library" + file: reference/validmind.qmd + contents: # Root level functions from validmind.qmd - text: "__version__" - file: validmind.qmd#__version__ + file: reference/validmind.qmd#__version__ - text: "get_test_suite()" - file: validmind.qmd#get_test_suite + file: reference/validmind.html#get_test_suite - text: "init()" - file: validmind.qmd#init + file: reference/validmind.html#init - text: "init_dataset()" - file: validmind.qmd#init_dataset + file: reference/validmind.html#init_dataset - text: "init_model()" - file: validmind.qmd#init_model + file: reference/validmind.html#init_model - text: "init_r_model()" - file: validmind.qmd#init_r_model + file: reference/validmind.html#init_r_model - text: "log_metric()" - file: validmind.qmd#log_metric + file: reference/validmind.html#log_metric - text: "preview_template()" - file: validmind.qmd#preview_template + file: reference/validmind.html#preview_template - text: "reload()" - file: validmind.qmd#reload + file: reference/validmind.html#reload - text: "run_documentation_tests()" - file: validmind.qmd#run_documentation_tests + file: reference/validmind.html#run_documentation_tests - text: "run_test_suite()" - file: validmind.qmd#run_test_suite + file: reference/validmind.html#run_test_suite - text: "tags()" - file: validmind.qmd#tags + file: reference/validmind.html#tags - text: "tasks()" - file: validmind.qmd#tasks + file: reference/validmind.html#tasks - text: "test()" - file: validmind.qmd#test + file: reference/validmind.html#test # All module documentation pages - text: "Submodules" - text: "datasets" file: validmind/datasets.qmd - contents: - text: "errors" file: validmind/errors.qmd - contents: - - text: "BaseError" - file: validmind/errors.qmd#BaseError - - text: "APIRequestError" - file: validmind/errors.qmd#APIRequestError - - text: "raise_api_error()" - file: validmind/errors.qmd#raise_api_error - - text: "should_raise_on_fail_fast()" - file: validmind/errors.qmd#should_raise_on_fail_fast - - text: "InvalidXGBoostTrainedModelError" - file: validmind/errors.qmd#InvalidXGBoostTrainedModelError - - text: "MissingModelIdError" - file: validmind/errors.qmd#MissingModelIdError - - text: "MissingOrInvalidModelPredictFnError" - file: validmind/errors.qmd#MissingOrInvalidModelPredictFnError - - text: "UnsupportedModelError" - file: validmind/errors.qmd#UnsupportedModelError - - text: "UnsupportedModelForSHAPError" - file: validmind/errors.qmd#UnsupportedModelForSHAPError - - text: "UnsupportedRModelError" - file: validmind/errors.qmd#UnsupportedRModelError - - text: "GetTestSuiteError" - file: validmind/errors.qmd#GetTestSuiteError - - text: "InitializeTestSuiteError" - file: validmind/errors.qmd#InitializeTestSuiteError - - text: "InvalidTestParametersError" - file: validmind/errors.qmd#InvalidTestParametersError - - text: "InvalidTestResultsError" - file: validmind/errors.qmd#InvalidTestResultsError - - text: "LoadTestError" - file: validmind/errors.qmd#LoadTestError - - text: "MissingRequiredTestInputError" - file: validmind/errors.qmd#MissingRequiredTestInputError - - text: "SkipTestError" - file: validmind/errors.qmd#SkipTestError - - text: "TestInputInvalidDatasetError" - file: validmind/errors.qmd#TestInputInvalidDatasetError - - text: "InvalidAPICredentialsError" - file: validmind/errors.qmd#InvalidAPICredentialsError - - text: "InvalidContentIdPrefixError" - file: validmind/errors.qmd#InvalidContentIdPrefixError - - text: "InvalidInputError" - file: validmind/errors.qmd#InvalidInputError - - text: "InvalidMetricResultsError" - file: validmind/errors.qmd#InvalidMetricResultsError - - text: "InvalidProjectError" - file: validmind/errors.qmd#InvalidProjectError - - text: "InvalidRequestBodyError" - file: validmind/errors.qmd#InvalidRequestBodyError - - text: "InvalidTextObjectError" - file: validmind/errors.qmd#InvalidTextObjectError - - text: "InvalidValueFormatterError" - file: validmind/errors.qmd#InvalidValueFormatterError - - text: "MissingAPICredentialsError" - file: validmind/errors.qmd#MissingAPICredentialsError - - text: "MissingCacheResultsArgumentsError" - file: validmind/errors.qmd#MissingCacheResultsArgumentsError - - text: "MissingClassLabelError" - file: validmind/errors.qmd#MissingClassLabelError - - text: "MissingDependencyError" - file: validmind/errors.qmd#MissingDependencyError - - text: "MissingDocumentationTemplate" - file: validmind/errors.qmd#MissingDocumentationTemplate - - text: "MissingRExtrasError" - file: validmind/errors.qmd#MissingRExtrasError - - text: "MissingTextContentIdError" - file: validmind/errors.qmd#MissingTextContentIdError - - text: "MissingTextContentsError" - file: validmind/errors.qmd#MissingTextContentsError - - text: "UnsupportedColumnTypeError" - file: validmind/errors.qmd#UnsupportedColumnTypeError - - text: "UnsupportedDatasetError" - file: validmind/errors.qmd#UnsupportedDatasetError - - text: "UnsupportedFigureError" - file: validmind/errors.qmd#UnsupportedFigureError - - text: "MismatchingClassLabelsError" - file: validmind/errors.qmd#MismatchingClassLabelsError - text: "test_suites" file: validmind/test_suites.qmd - contents: - - text: "describe_suite()" - file: validmind/test_suites.qmd#describe_suite - - text: "get_by_id()" - file: validmind/test_suites.qmd#get_by_id - - text: "list_suites()" - file: validmind/test_suites.qmd#list_suites - - text: "register_test_suite()" - file: validmind/test_suites.qmd#register_test_suite - - text: "ClassifierDiagnosis()" - file: validmind/test_suites.qmd#ClassifierDiagnosis - - text: "ClassifierFullSuite()" - file: validmind/test_suites.qmd#ClassifierFullSuite - - text: "ClassifierMetrics()" - file: validmind/test_suites.qmd#ClassifierMetrics - - text: "ClassifierModelValidation()" - file: validmind/test_suites.qmd#ClassifierModelValidation - - text: "ClassifierPerformance()" - file: validmind/test_suites.qmd#ClassifierPerformance - - text: "ClusterFullSuite()" - file: validmind/test_suites.qmd#ClusterFullSuite - - text: "ClusterMetrics()" - file: validmind/test_suites.qmd#ClusterMetrics - - text: "ClusterPerformance()" - file: validmind/test_suites.qmd#ClusterPerformance - - text: "EmbeddingsFullSuite()" - file: validmind/test_suites.qmd#EmbeddingsFullSuite - - text: "EmbeddingsMetrics()" - file: validmind/test_suites.qmd#EmbeddingsMetrics - - text: "EmbeddingsPerformance()" - file: validmind/test_suites.qmd#EmbeddingsPerformance - - text: "format_dataframe()" - file: validmind/test_suites.qmd#format_dataframe - - text: "get_logger()" - file: validmind/test_suites.qmd#get_logger - - text: "KmeansParametersOptimization()" - file: validmind/test_suites.qmd#KmeansParametersOptimization - - text: "LLMClassifierFullSuite()" - file: validmind/test_suites.qmd#LLMClassifierFullSuite - - text: "NLPClassifierFullSuite()" - file: validmind/test_suites.qmd#NLPClassifierFullSuite - - text: "PromptValidation()" - file: validmind/test_suites.qmd#PromptValidation - - text: "RegressionFullSuite()" - file: validmind/test_suites.qmd#RegressionFullSuite - - text: "RegressionMetrics()" - file: validmind/test_suites.qmd#RegressionMetrics - - text: "RegressionModelDescription()" - file: validmind/test_suites.qmd#RegressionModelDescription - - text: "RegressionModelsEvaluation()" - file: validmind/test_suites.qmd#RegressionModelsEvaluation - - text: "RegressionPerformance()" - file: validmind/test_suites.qmd#RegressionPerformance - - text: "SummarizationMetrics()" - file: validmind/test_suites.qmd#SummarizationMetrics - - text: "TabularDataQuality()" - file: validmind/test_suites.qmd#TabularDataQuality - - text: "TabularDataset()" - file: validmind/test_suites.qmd#TabularDataset - - text: "TabularDatasetDescription()" - file: validmind/test_suites.qmd#TabularDatasetDescription - - text: "test_id_to_name()" - file: validmind/test_suites.qmd#test_id_to_name - - text: "TextDataQuality()" - file: validmind/test_suites.qmd#TextDataQuality - - text: "TimeSeriesDataQuality()" - file: validmind/test_suites.qmd#TimeSeriesDataQuality - - text: "TimeSeriesDataset()" - file: validmind/test_suites.qmd#TimeSeriesDataset - - text: "TimeSeriesModelValidation()" - file: validmind/test_suites.qmd#TimeSeriesModelValidation - - text: "TimeSeriesMultivariate()" - file: validmind/test_suites.qmd#TimeSeriesMultivariate - - text: "TimeSeriesUnivariate()" - file: validmind/test_suites.qmd#TimeSeriesUnivariate - text: "tests" file: validmind/tests.qmd - contents: - - text: "register_test_provider()" - file: validmind/tests.qmd#register_test_provider - - text: "describe_test()" - file: validmind/tests.qmd#describe_test - - text: "list_tags()" - file: validmind/tests.qmd#list_tags - - text: "list_tasks()" - file: validmind/tests.qmd#list_tasks - - text: "list_tasks_and_tags()" - file: validmind/tests.qmd#list_tasks_and_tags - - text: "list_tests()" - file: validmind/tests.qmd#list_tests - - text: "load_test()" - file: validmind/tests.qmd#load_test - - text: "LoadTestError()" - file: validmind/tests.qmd#LoadTestError - - text: "LocalTestProvider()" - file: validmind/tests.qmd#LocalTestProvider - - text: "run_test()" - file: validmind/tests.qmd#run_test - - text: "tags()" - file: validmind/tests.qmd#tags - - text: "tasks()" - file: validmind/tests.qmd#tasks - - text: "test()" - file: validmind/tests.qmd#test - - text: "TestProvider()" - file: validmind/tests.qmd#TestProvider - text: "unit_metrics" file: validmind/unit_metrics.qmd - contents: - - text: "describe_metric()" - file: validmind/unit_metrics.qmd#describe_metric - - text: "list_metrics()" - file: validmind/unit_metrics.qmd#list_metrics - - text: "run_metric()" - file: validmind/unit_metrics.qmd#run_metric - text: "vm_models" file: validmind/vm_models.qmd - contents: - - text: "Figure()" - file: validmind/vm_models.qmd#Figure - - text: "ModelAttributes()" - file: validmind/vm_models.qmd#ModelAttributes - - text: "TestSuite()" - file: validmind/vm_models.qmd#TestSuite - - text: "TestSuiteRunner()" - file: validmind/vm_models.qmd#TestSuiteRunner - - text: "VMDataset()" - file: validmind/vm_models.qmd#VMDataset - - text: "VMInput()" - file: validmind/vm_models.qmd#VMInput - - text: "VMModel()" - file: validmind/vm_models.qmd#VMModel \ No newline at end of file diff --git a/docs/project_tree b/docs/project_tree new file mode 100644 index 000000000..f51eb40bb --- /dev/null +++ b/docs/project_tree @@ -0,0 +1,1219 @@ +. +├── LICENSE +├── Makefile +├── README.md +├── README.pypi.md +├── docs +│   ├── _build +│   │   ├── index.html +│   │   ├── search.js +│   │   ├── validmind +│   │   │   ├── __version__.html +│   │   │   ├── datasets +│   │   │   │   ├── classification +│   │   │   │   │   ├── customer_churn.html +│   │   │   │   │   └── taiwan_credit.html +│   │   │   │   ├── classification.html +│   │   │   │   ├── credit_risk +│   │   │   │   │   ├── lending_club.html +│   │   │   │   │   └── lending_club_bias.html +│   │   │   │   ├── credit_risk.html +│   │   │   │   ├── nlp +│   │   │   │   │   ├── cnn_dailymail.html +│   │   │   │   │   └── twitter_covid_19.html +│   │   │   │   ├── nlp.html +│   │   │   │   ├── regression +│   │   │   │   │   ├── fred.html +│   │   │   │   │   └── lending_club.html +│   │   │   │   └── regression.html +│   │   │   ├── datasets.html +│   │   │   ├── errors.html +│   │   │   ├── test_suites +│   │   │   │   ├── classifier.html +│   │   │   │   ├── cluster.html +│   │   │   │   ├── embeddings.html +│   │   │   │   ├── llm.html +│   │   │   │   ├── nlp.html +│   │   │   │   ├── parameters_optimization.html +│   │   │   │   ├── regression.html +│   │   │   │   ├── statsmodels_timeseries.html +│   │   │   │   ├── summarization.html +│   │   │   │   ├── tabular_datasets.html +│   │   │   │   ├── text_data.html +│   │   │   │   └── time_series.html +│   │   │   ├── test_suites.html +│   │   │   ├── tests +│   │   │   │   ├── data_validation +│   │   │   │   │   ├── ACFandPACFPlot.html +│   │   │   │   │   ├── ADF.html +│   │   │   │   │   ├── AutoAR.html +│   │   │   │   │   ├── AutoMA.html +│   │   │   │   │   ├── AutoStationarity.html +│   │   │   │   │   ├── BivariateScatterPlots.html +│   │   │   │   │   ├── BoxPierce.html +│   │   │   │   │   ├── ChiSquaredFeaturesTable.html +│   │   │   │   │   ├── ClassImbalance.html +│   │   │   │   │   ├── DatasetDescription.html +│   │   │   │   │   ├── DatasetSplit.html +│   │   │   │   │   ├── DescriptiveStatistics.html +│   │   │   │   │   ├── DickeyFullerGLS.html +│   │   │   │   │   ├── Duplicates.html +│   │   │   │   │   ├── EngleGrangerCoint.html +│   │   │   │   │   ├── FeatureTargetCorrelationPlot.html +│   │   │   │   │   ├── HighCardinality.html +│   │   │   │   │   ├── HighPearsonCorrelation.html +│   │   │   │   │   ├── IQROutliersBarPlot.html +│   │   │   │   │   ├── IQROutliersTable.html +│   │   │   │   │   ├── IsolationForestOutliers.html +│   │   │   │   │   ├── JarqueBera.html +│   │   │   │   │   ├── KPSS.html +│   │   │   │   │   ├── LJungBox.html +│   │   │   │   │   ├── LaggedCorrelationHeatmap.html +│   │   │   │   │   ├── MissingValues.html +│   │   │   │   │   ├── MissingValuesBarPlot.html +│   │   │   │   │   ├── MutualInformation.html +│   │   │   │   │   ├── PearsonCorrelationMatrix.html +│   │   │   │   │   ├── PhillipsPerronArch.html +│   │   │   │   │   ├── ProtectedClassesCombination.html +│   │   │   │   │   ├── ProtectedClassesDescription.html +│   │   │   │   │   ├── ProtectedClassesDisparity.html +│   │   │   │   │   ├── ProtectedClassesThresholdOptimizer.html +│   │   │   │   │   ├── RollingStatsPlot.html +│   │   │   │   │   ├── RunsTest.html +│   │   │   │   │   ├── ScatterPlot.html +│   │   │   │   │   ├── ScoreBandDefaultRates.html +│   │   │   │   │   ├── SeasonalDecompose.html +│   │   │   │   │   ├── ShapiroWilk.html +│   │   │   │   │   ├── Skewness.html +│   │   │   │   │   ├── SpreadPlot.html +│   │   │   │   │   ├── TabularCategoricalBarPlots.html +│   │   │   │   │   ├── TabularDateTimeHistograms.html +│   │   │   │   │   ├── TabularDescriptionTables.html +│   │   │   │   │   ├── TabularNumericalHistograms.html +│   │   │   │   │   ├── TargetRateBarPlots.html +│   │   │   │   │   ├── TimeSeriesDescription.html +│   │   │   │   │   ├── TimeSeriesDescriptiveStatistics.html +│   │   │   │   │   ├── TimeSeriesFrequency.html +│   │   │   │   │   ├── TimeSeriesHistogram.html +│   │   │   │   │   ├── TimeSeriesLinePlot.html +│   │   │   │   │   ├── TimeSeriesMissingValues.html +│   │   │   │   │   ├── TimeSeriesOutliers.html +│   │   │   │   │   ├── TooManyZeroValues.html +│   │   │   │   │   ├── UniqueRows.html +│   │   │   │   │   ├── WOEBinPlots.html +│   │   │   │   │   ├── WOEBinTable.html +│   │   │   │   │   ├── ZivotAndrewsArch.html +│   │   │   │   │   ├── nlp +│   │   │   │   │   │   ├── CommonWords.html +│   │   │   │   │   │   ├── Hashtags.html +│   │   │   │   │   │   ├── LanguageDetection.html +│   │   │   │   │   │   ├── Mentions.html +│   │   │   │   │   │   ├── PolarityAndSubjectivity.html +│   │   │   │   │   │   ├── Punctuations.html +│   │   │   │   │   │   ├── Sentiment.html +│   │   │   │   │   │   ├── StopWords.html +│   │   │   │   │   │   ├── TextDescription.html +│   │   │   │   │   │   └── Toxicity.html +│   │   │   │   │   └── nlp.html +│   │   │   │   ├── data_validation.html +│   │   │   │   ├── model_validation +│   │   │   │   │   ├── BertScore.html +│   │   │   │   │   ├── BleuScore.html +│   │   │   │   │   ├── ClusterSizeDistribution.html +│   │   │   │   │   ├── ContextualRecall.html +│   │   │   │   │   ├── FeaturesAUC.html +│   │   │   │   │   ├── MeteorScore.html +│   │   │   │   │   ├── ModelMetadata.html +│   │   │   │   │   ├── ModelPredictionResiduals.html +│   │   │   │   │   ├── RegardScore.html +│   │   │   │   │   ├── RegressionResidualsPlot.html +│   │   │   │   │   ├── RougeScore.html +│   │   │   │   │   ├── TimeSeriesPredictionWithCI.html +│   │   │   │   │   ├── TimeSeriesPredictionsPlot.html +│   │   │   │   │   ├── TimeSeriesR2SquareBySegments.html +│   │   │   │   │   ├── TokenDisparity.html +│   │   │   │   │   ├── ToxicityScore.html +│   │   │   │   │   ├── sklearn +│   │   │   │   │   │   ├── AdjustedMutualInformation.html +│   │   │   │   │   │   ├── AdjustedRandIndex.html +│   │   │   │   │   │   ├── CalibrationCurve.html +│   │   │   │   │   │   ├── ClassifierPerformance.html +│   │   │   │   │   │   ├── ClassifierThresholdOptimization.html +│   │   │   │   │   │   ├── ClusterCosineSimilarity.html +│   │   │   │   │   │   ├── ClusterPerformanceMetrics.html +│   │   │   │   │   │   ├── CompletenessScore.html +│   │   │   │   │   │   ├── ConfusionMatrix.html +│   │   │   │   │   │   ├── FeatureImportance.html +│   │   │   │   │   │   ├── FowlkesMallowsScore.html +│   │   │   │   │   │   ├── HomogeneityScore.html +│   │   │   │   │   │   ├── HyperParametersTuning.html +│   │   │   │   │   │   ├── KMeansClustersOptimization.html +│   │   │   │   │   │   ├── MinimumAccuracy.html +│   │   │   │   │   │   ├── MinimumF1Score.html +│   │   │   │   │   │   ├── MinimumROCAUCScore.html +│   │   │   │   │   │   ├── ModelParameters.html +│   │   │   │   │   │   ├── ModelsPerformanceComparison.html +│   │   │   │   │   │   ├── OverfitDiagnosis.html +│   │   │   │   │   │   ├── PermutationFeatureImportance.html +│   │   │   │   │   │   ├── PopulationStabilityIndex.html +│   │   │   │   │   │   ├── PrecisionRecallCurve.html +│   │   │   │   │   │   ├── ROCCurve.html +│   │   │   │   │   │   ├── RegressionErrors.html +│   │   │   │   │   │   ├── RegressionErrorsComparison.html +│   │   │   │   │   │   ├── RegressionPerformance.html +│   │   │   │   │   │   ├── RegressionR2Square.html +│   │   │   │   │   │   ├── RegressionR2SquareComparison.html +│   │   │   │   │   │   ├── RobustnessDiagnosis.html +│   │   │   │   │   │   ├── SHAPGlobalImportance.html +│   │   │   │   │   │   ├── ScoreProbabilityAlignment.html +│   │   │   │   │   │   ├── SilhouettePlot.html +│   │   │   │   │   │   ├── TrainingTestDegradation.html +│   │   │   │   │   │   ├── VMeasure.html +│   │   │   │   │   │   └── WeakspotsDiagnosis.html +│   │   │   │   │   ├── sklearn.html +│   │   │   │   │   ├── statsmodels +│   │   │   │   │   │   ├── AutoARIMA.html +│   │   │   │   │   │   ├── CumulativePredictionProbabilities.html +│   │   │   │   │   │   ├── DurbinWatsonTest.html +│   │   │   │   │   │   ├── GINITable.html +│   │   │   │   │   │   ├── KolmogorovSmirnov.html +│   │   │   │   │   │   ├── Lilliefors.html +│   │   │   │   │   │   ├── PredictionProbabilitiesHistogram.html +│   │   │   │   │   │   ├── RegressionCoeffs.html +│   │   │   │   │   │   ├── RegressionFeatureSignificance.html +│   │   │   │   │   │   ├── RegressionModelForecastPlot.html +│   │   │   │   │   │   ├── RegressionModelForecastPlotLevels.html +│   │   │   │   │   │   ├── RegressionModelSensitivityPlot.html +│   │   │   │   │   │   ├── RegressionModelSummary.html +│   │   │   │   │   │   ├── RegressionPermutationFeatureImportance.html +│   │   │   │   │   │   ├── ScorecardHistogram.html +│   │   │   │   │   │   └── statsutils.html +│   │   │   │   │   └── statsmodels.html +│   │   │   │   ├── model_validation.html +│   │   │   │   ├── prompt_validation +│   │   │   │   │   ├── Bias.html +│   │   │   │   │   ├── Clarity.html +│   │   │   │   │   ├── Conciseness.html +│   │   │   │   │   ├── Delimitation.html +│   │   │   │   │   ├── NegativeInstruction.html +│   │   │   │   │   ├── Robustness.html +│   │   │   │   │   ├── Specificity.html +│   │   │   │   │   └── ai_powered_test.html +│   │   │   │   └── prompt_validation.html +│   │   │   ├── tests.html +│   │   │   ├── unit_metrics.html +│   │   │   └── vm_models.html +│   │   └── validmind.html +│   ├── _sidebar.yml +│   ├── griffe_all.log +│   ├── project_tree +│   ├── templates +│   │   ├── class.qmd.jinja2 +│   │   ├── custom.css +│   │   ├── errors.qmd.jinja2 +│   │   ├── function.qmd.jinja2 +│   │   ├── macros +│   │   │   ├── docstring.jinja2 +│   │   │   ├── navigation.jinja2 +│   │   │   └── types.jinja2 +│   │   ├── module.html.jinja2 +│   │   ├── module.qmd.jinja2 +│   │   ├── sidebar.qmd.jinja2 +│   │   └── template.qmd.jinja2_OLD +│   ├── validmind +│   ├── validmind.json +│   ├── validmind.qmd +│   └── validmind.tree +├── images +│   └── ValidMind-logo-color.svg +├── notebooks +│   ├── README.md +│   ├── code_samples +│   │   ├── capital_markets +│   │   │   ├── quickstart_option_pricing_models.ipynb +│   │   │   └── quickstart_option_pricing_models_quantlib.ipynb +│   │   ├── credit_risk +│   │   │   ├── application_scorecard_demo.ipynb +│   │   │   ├── application_scorecard_executive.ipynb +│   │   │   ├── application_scorecard_full_suite.ipynb +│   │   │   ├── application_scorecard_with_bias.ipynb +│   │   │   ├── application_scorecard_with_ml.ipynb +│   │   │   └── custom_tests +│   │   │   └── ScoreBandDiscriminationMetrics.py +│   │   ├── custom_tests +│   │   │   ├── implement_custom_tests.ipynb +│   │   │   └── integrate_external_test_providers.ipynb +│   │   ├── nlp_and_llm +│   │   │   ├── datasets +│   │   │   │   ├── bbc_text_cls.csv +│   │   │   │   ├── bbc_text_cls_reference.csv +│   │   │   │   ├── cnn_dailymail_100_with_predictions.csv +│   │   │   │   ├── cnn_dailymail_500_with_predictions.csv +│   │   │   │   ├── sentiments.csv +│   │   │   │   └── sentiments_with_predictions.csv +│   │   │   ├── foundation_models_integration_demo.ipynb +│   │   │   ├── foundation_models_summarization_demo.ipynb +│   │   │   ├── hugging_face_integration_demo.ipynb +│   │   │   ├── hugging_face_summarization_demo.ipynb +│   │   │   ├── llm_summarization_demo.ipynb +│   │   │   ├── prompt_validation_demo.ipynb +│   │   │   └── rag_documentation_demo.ipynb +│   │   ├── ongoing_monitoring +│   │   │   ├── application_scorecard_ongoing_monitoring.ipynb +│   │   │   ├── quickstart_customer_churn_ongoing_monitoring.ipynb +│   │   │   └── xgboost_model.model +│   │   ├── quickstart_customer_churn_full_suite.ipynb +│   │   ├── regression +│   │   │   └── quickstart_regression_full_suite.ipynb +│   │   └── time_series +│   │   ├── quickstart_time_series_full_suite.ipynb +│   │   └── quickstart_time_series_high_code.ipynb +│   ├── code_sharing +│   │   ├── clustering +│   │   │   └── quickstart_cluster_demo.ipynb +│   │   ├── credit_risk +│   │   │   └── assign_prediction_probabilities.ipynb +│   │   ├── datasets +│   │   │   ├── bank_customer_churn.csv +│   │   │   ├── lending_club_loan_rates.csv +│   │   │   ├── marketing_lead_conversion.csv +│   │   │   ├── probability_of_default +│   │   │   │   └── Data Dictionary.xlsx +│   │   │   ├── taiwan_credit.csv +│   │   │   └── time_series +│   │   │   ├── fred_loan_rates.csv +│   │   │   ├── fred_loan_rates_test_1.csv +│   │   │   ├── fred_loan_rates_test_2.csv +│   │   │   ├── fred_loan_rates_test_3.csv +│   │   │   ├── fred_loan_rates_test_4.csv +│   │   │   ├── fred_loan_rates_test_5.csv +│   │   │   ├── lending_club_loan_rates.csv +│   │   │   └── raw +│   │   │   └── fred +│   │   │   ├── CPIAUCSL.csv +│   │   │   ├── CSUSHPISA.csv +│   │   │   ├── DRSFRMACBS.csv +│   │   │   ├── FEDFUNDS.csv +│   │   │   ├── GDP.csv +│   │   │   ├── GDPC1.csv +│   │   │   ├── GS10.csv +│   │   │   ├── GS3.csv +│   │   │   ├── GS5.csv +│   │   │   ├── MORTGAGE30US.csv +│   │   │   └── UNRATE.csv +│   │   ├── embeddings +│   │   │   └── quickstart_embeddings_demo.ipynb +│   │   ├── external_tests +│   │   │   └── tests +│   │   │   └── MyIsolationForest.py +│   │   ├── insurance_mortality +│   │   │   ├── insurance_dataset.csv +│   │   │   ├── insurance_validation_demo.ipynb +│   │   │   ├── test_df.csv +│   │   │   ├── train_df.csv +│   │   │   └── validmind_insurance_POC.ipynb +│   │   ├── llm +│   │   │   ├── datasets +│   │   │   │   ├── bbc_text_cls.csv +│   │   │   │   ├── bbc_text_cls_reference.csv +│   │   │   │   ├── rag +│   │   │   │   │   ├── rag_evaluation_dataset_01.csv +│   │   │   │   │   ├── rag_evaluation_dataset_02.csv +│   │   │   │   │   ├── rag_evaluation_dataset_03.csv +│   │   │   │   │   ├── rag_evaluation_results.csv +│   │   │   │   │   ├── rfp_existing_questions_client_1.csv +│   │   │   │   │   ├── rfp_existing_questions_client_2.csv +│   │   │   │   │   ├── rfp_existing_questions_client_3.csv +│   │   │   │   │   ├── rfp_existing_questions_client_4.csv +│   │   │   │   │   ├── rfp_existing_questions_client_5.csv +│   │   │   │   │   ├── rfp_new_questions_client_100.csv +│   │   │   │   │   ├── vendor_contracts_001_020.csv +│   │   │   │   │   ├── vendor_contracts_021_040.csv +│   │   │   │   │   ├── vendor_contracts_041_060.csv +│   │   │   │   │   └── vendor_contracts_questions.csv +│   │   │   │   └── sentiments.csv +│   │   │   ├── llm_descriptions_context.ipynb +│   │   │   ├── rag_llamaindex.ipynb +│   │   │   ├── rag_rfp_answer_generation.ipynb +│   │   │   ├── rag_rfp_answer_generation_langchain.ipynb +│   │   │   ├── rag_rfp_question_similarity.ipynb +│   │   │   ├── rag_vendor_contracts_llamaindex.ipynb +│   │   │   └── vendor_contract_agent +│   │   │   ├── data +│   │   │   │   ├── contracts.json +│   │   │   │   └── vendors.json +│   │   │   ├── genai_vendor_contract_agent_usecase_poc.ipynb +│   │   │   ├── tool_definitions +│   │   │   │   ├── query_database.json +│   │   │   │   └── search_online.json +│   │   │   └── utils.py +│   │   ├── market_basket_analysis +│   │   │   ├── datasets +│   │   │   │   └── mba +│   │   │   │   └── Online Retail.csv +│   │   │   └── mba_poc.ipynb +│   │   ├── operational_deposit +│   │   │   ├── dataset_image.png +│   │   │   ├── datasets +│   │   │   │   └── odm_data_example +│   │   │   │   └── synthetic_data.csv +│   │   │   ├── model_image.png +│   │   │   ├── operational_deposit_poc.ipynb +│   │   │   ├── synthetic_data_generation.ipynb +│   │   │   └── tests +│   │   │   └── TimeseriesGroupbyPlot.py +│   │   ├── output_templates +│   │   │   ├── Screenshot 2024-02-15 at 2.48.03 PM.png +│   │   │   ├── Screenshot 2024-02-15 at 4.51.56 PM.png +│   │   │   └── customizing_tests_with_output_templates.ipynb +│   │   ├── post_processing_functions.ipynb +│   │   ├── r +│   │   │   ├── r_custom_tests.Rmd +│   │   │   ├── r_customer_churn_demo.Rmd +│   │   │   ├── r_customer_churn_demo_xgboost.Rmd +│   │   │   ├── r_mortality_demo.Rmd +│   │   │   ├── r_time_series_data_validation.Rmd +│   │   │   └── r_time_series_model_validation.Rmd +│   │   ├── r_demo +│   │   │   ├── prune_dt.pmml +│   │   │   ├── r-customer-churn-model.ipynb +│   │   │   ├── r-ecm-demo.ipynb +│   │   │   ├── r-ecm-model.ipynb +│   │   │   ├── r-ecm-model.rds +│   │   │   ├── r_churn_test.csv +│   │   │   ├── r_churn_train.csv +│   │   │   ├── r_log_reg_churn_model.rds +│   │   │   └── r_xgb_churn_model.json +│   │   ├── regression +│   │   │   └── regression_unit_metrics.ipynb +│   │   └── test_configuration_updates_demo.ipynb +│   ├── how_to +│   │   ├── configure_dataset_features.ipynb +│   │   ├── dataset_image.png +│   │   ├── document_multiple_results_for_the_same_test.ipynb +│   │   ├── explore_test_suites.ipynb +│   │   ├── explore_tests.ipynb +│   │   ├── filter_input_columns.ipynb +│   │   ├── load_datasets_predictions.ipynb +│   │   ├── log_metrics_over_time.ipynb +│   │   ├── model_image.png +│   │   ├── run_documentation_sections.ipynb +│   │   ├── run_documentation_tests_with_config.ipynb +│   │   ├── run_tests +│   │   │   ├── 1_run_dataset_based_tests.ipynb +│   │   │   └── 2_run_comparison_tests.ipynb +│   │   ├── run_tests_that_require_multiple_datasets.ipynb +│   │   ├── run_unit_metrics.ipynb +│   │   └── use_dataset_model_objects.ipynb +│   ├── images +│   │   ├── add_metric_over_time_block.png +│   │   ├── btc-price-custom-metric.png +│   │   ├── composite-metric-in-template-preview.png +│   │   ├── high-pearson-correlation-block.png +│   │   ├── hyperparameters-custom-metric.png +│   │   ├── image-in-custom-metric.png +│   │   ├── insert-test-driven-block-correlations.png +│   │   ├── insert-test-driven-block-custom-class-imbalance.jpg +│   │   ├── insert-test-driven-block-custom-confusion-matrix.png +│   │   ├── insert-test-driven-block-custom.png +│   │   ├── insert-test-driven-block-test-provider.png +│   │   ├── insert-test-driven-block.png +│   │   ├── log_metric_accuracy.png +│   │   ├── log_metric_auc_1.png +│   │   ├── log_metric_auc_2.png +│   │   ├── log_metric_auc_3.png +│   │   ├── log_metric_auc_4.png +│   │   ├── log_metric_f1.png +│   │   ├── log_metric_precision.png +│   │   ├── log_metric_recall.png +│   │   ├── multiple-tables-plots-custom-metric.png +│   │   ├── my_tests_directory.png +│   │   ├── parameterized-custom-metric.png +│   │   ├── pearson-correlation-matrix-test-output.png +│   │   ├── pearson-correlation-matrix.png +│   │   ├── selecting-composite-metric.png +│   │   └── selecting-high-pearson-correlation-test.png +│   ├── templates +│   │   ├── README.md +│   │   ├── __pycache__ +│   │   │   └── e2e_template.cpython-39.pyc +│   │   ├── about-validmind.ipynb +│   │   ├── e2e-notebook.ipynb +│   │   ├── e2e_template.py +│   │   ├── install-initialize-validmind.ipynb +│   │   ├── next-steps.ipynb +│   │   └── upgrade-validmind.ipynb +│   └── tutorials +│   └── intro_for_model_developers.ipynb +├── poetry.lock +├── pyproject.toml +├── r +│   ├── custom_tests.py +│   └── validmind +│   ├── DESCRIPTION +│   ├── NAMESPACE +│   ├── R +│   │   ├── custom_tests.R +│   │   └── platform.R +│   ├── README.md +│   ├── inst +│   │   └── extdata +│   │   └── child.Rmd +│   ├── man +│   │   ├── build_r_plotly.Rd +│   │   ├── display_report.Rd +│   │   ├── print_summary_tables.Rd +│   │   ├── process_result.Rd +│   │   ├── register_custom_test.Rd +│   │   ├── run_custom_test.Rd +│   │   ├── save_model.Rd +│   │   ├── summarize_metric_result.Rd +│   │   ├── summarize_result.Rd +│   │   ├── summarize_test_result.Rd +│   │   └── vm.Rd +│   └── validmind.Rproj +├── scripts +│   ├── README.md +│   ├── __init__.py +│   ├── api_tree.py +│   ├── bulk_ai_test_updates.py +│   ├── bulk_unit_tests_updates.py +│   ├── check_tests.py +│   ├── copyright.txt +│   ├── copyright_files.py +│   ├── credentials_check.py +│   ├── ensure_clean_notebooks.py +│   ├── extract_descriptions.py +│   ├── format_and_add.sh +│   ├── generate_quarto_docs.py +│   ├── generate_test_id_type.py +│   ├── run_e2e_notebooks.py +│   └── verify_copyright.py +├── tests +│   ├── __init__.py +│   ├── run_test_utils.py +│   ├── test_api_client.py +│   ├── test_client.py +│   ├── test_dataset.py +│   ├── test_framework_init.py +│   ├── test_full_suite.py +│   ├── test_full_suite_nb.py +│   ├── test_unit_tests.py +│   ├── test_validmind_tests_module.py +│   └── unit_tests +│   ├── __init__.py +│   ├── data_validation +│   │   ├── __init__.py +│   │   ├── nlp +│   │   │   ├── test_CommonWords.py +│   │   │   ├── test_LanguageDetection.py +│   │   │   ├── test_PolarityAndSubjectivity.py +│   │   │   ├── test_Punctuations.py +│   │   │   ├── test_Sentiment.py +│   │   │   └── test_Toxicity.py +│   │   ├── test_ACFandPACFPlot.py +│   │   ├── test_ADF.py +│   │   ├── test_AutoAR.py +│   │   ├── test_AutoMA.py +│   │   ├── test_AutoStationarity.py +│   │   ├── test_BivariateScatterPlots.py +│   │   ├── test_BoxPierce.py +│   │   ├── test_ChiSquaredFeaturesTable.py +│   │   ├── test_ClassImbalance.py +│   │   ├── test_DatasetDescription.py +│   │   ├── test_DatasetSplit.py +│   │   ├── test_DescriptiveStatistics.py +│   │   ├── test_DickeyFullerGLS.py +│   │   ├── test_Duplicates.py +│   │   ├── test_EngleGrangerCoint.py +│   │   ├── test_FeatureTargetCorrelationPlot.py +│   │   ├── test_HighCardinality.py +│   │   ├── test_HighPearsonCorrelation.py +│   │   ├── test_IQROutliersBarPlot.py +│   │   ├── test_IQROutliersTable.py +│   │   ├── test_IsolationForestOutliers.py +│   │   ├── test_JarqueBera.py +│   │   ├── test_KPSS.py +│   │   ├── test_LJungBox.py +│   │   ├── test_LaggedCorrelationHeatmap.py +│   │   ├── test_MissingValues.py +│   │   ├── test_MissingValuesBarPlot.py +│   │   ├── test_PearsonCorrelationMatrix.py +│   │   ├── test_PhillipsPerronArch.py +│   │   ├── test_RollingStatsPlot.py +│   │   ├── test_RunsTest.py +│   │   ├── test_ScatterPlot.py +│   │   ├── test_SeasonalDecompose.py +│   │   ├── test_ShapiroWilk.py +│   │   ├── test_Skewness.py +│   │   ├── test_SpreadPlot.py +│   │   ├── test_TabularCategoricalBarPlots.py +│   │   ├── test_TabularDateTimeHistograms.py +│   │   ├── test_TabularDescriptionTables.py +│   │   ├── test_TabularNumericalHistograms.py +│   │   ├── test_TargetRateBarPlots.py +│   │   ├── test_TimeSeriesDescription.py +│   │   ├── test_TimeSeriesDescriptiveStatistics.py +│   │   ├── test_TimeSeriesFrequency.py +│   │   ├── test_TimeSeriesHistogram.py +│   │   ├── test_TimeSeriesLinePlot.py +│   │   ├── test_TimeSeriesMissingValues.py +│   │   ├── test_TimeSeriesOutliers.py +│   │   ├── test_TooManyZeroValues.py +│   │   ├── test_UniqueRows.py +│   │   ├── test_WOEBinPlots.py +│   │   ├── test_WOEBinTable.py +│   │   └── test_ZivotAndrewsArch.py +│   ├── model_validation +│   │   ├── ragas +│   │   │   ├── test_AnswerCorrectness.py +│   │   │   ├── test_AspectCritic.py +│   │   │   ├── test_ContextEntityRecall.py +│   │   │   ├── test_ContextPrecision.py +│   │   │   ├── test_ContextPrecisionWithoutReference.py +│   │   │   ├── test_ContextRecall.py +│   │   │   ├── test_Faithfulness.py +│   │   │   ├── test_NoiseSensitivity.py +│   │   │   ├── test_ResponseRelevancy.py +│   │   │   └── test_SemanticSimilarity.py +│   │   ├── sklearn +│   │   │   ├── test_FeatureImportance.py +│   │   │   ├── test_ROCCurve.py +│   │   │   ├── test_RegressionErrors.py +│   │   │   ├── test_RegressionErrorsComparison.py +│   │   │   ├── test_RegressionR2Square.py +│   │   │   └── test_RegressionR2SquareComparison.py +│   │   ├── statsmodels +│   │   │   ├── test_CumulativePredictionProbabilities.py +│   │   │   ├── test_DurbinWatsonTest.py +│   │   │   ├── test_GINITable.py +│   │   │   ├── test_PredictionProbabilitiesHistogram.py +│   │   │   ├── test_RegressionCoeffs.py +│   │   │   └── test_ScorecardHistogram.py +│   │   ├── test_BertScore.py +│   │   ├── test_BleuScore.py +│   │   ├── test_ContextualRecall.py +│   │   ├── test_MeteorScore.py +│   │   ├── test_ModelMetadata.py +│   │   ├── test_ModelPredictionResiduals.py +│   │   ├── test_RegardScore.py +│   │   ├── test_RougeScore.py +│   │   ├── test_TimeSeriesPredictionWithCI.py +│   │   ├── test_TimeSeriesPredictionsPlot.py +│   │   ├── test_TimeSeriesR2SquareBySegments.py +│   │   ├── test_TokenDisparity.py +│   │   └── test_ToxicityScore.py +│   └── utils.py +└── validmind + ├── __init__.py + ├── __pycache__ + │   ├── __init__.cpython-39.pyc + │   ├── __version__.cpython-39.pyc + │   ├── api_client.cpython-39.pyc + │   ├── client.cpython-39.pyc + │   ├── client_config.cpython-39.pyc + │   ├── errors.cpython-39.pyc + │   ├── input_registry.cpython-39.pyc + │   ├── logging.cpython-39.pyc + │   ├── template.cpython-39.pyc + │   └── utils.cpython-39.pyc + ├── __version__.py + ├── ai + │   ├── __pycache__ + │   │   ├── test_descriptions.cpython-39.pyc + │   │   └── utils.cpython-39.pyc + │   ├── test_descriptions.py + │   └── utils.py + ├── api_client.py + ├── client.py + ├── client_config.py + ├── datasets + │   ├── __init__.py + │   ├── __pycache__ + │   │   └── __init__.cpython-39.pyc + │   ├── classification + │   │   ├── __init__.py + │   │   ├── __pycache__ + │   │   │   ├── __init__.cpython-39.pyc + │   │   │   ├── customer_churn.cpython-39.pyc + │   │   │   └── taiwan_credit.cpython-39.pyc + │   │   ├── customer_churn.py + │   │   ├── datasets + │   │   │   ├── bank_customer_churn.csv + │   │   │   └── taiwan_credit.csv + │   │   └── taiwan_credit.py + │   ├── cluster + │   │   └── digits.py + │   ├── credit_risk + │   │   ├── __init__.py + │   │   ├── __pycache__ + │   │   │   ├── __init__.cpython-39.pyc + │   │   │   ├── lending_club.cpython-39.pyc + │   │   │   └── lending_club_bias.cpython-39.pyc + │   │   ├── datasets + │   │   │   ├── lending_club_biased.csv.gz + │   │   │   └── lending_club_loan_data_2007_2014_clean.csv.gz + │   │   ├── lending_club.py + │   │   └── lending_club_bias.py + │   ├── llm + │   │   └── rag + │   │   ├── __init__.py + │   │   ├── datasets + │   │   │   ├── rfp_existing_questions_client_1.csv + │   │   │   ├── rfp_existing_questions_client_2.csv + │   │   │   ├── rfp_existing_questions_client_3.csv + │   │   │   ├── rfp_existing_questions_client_4.csv + │   │   │   └── rfp_existing_questions_client_5.csv + │   │   └── rfp.py + │   ├── nlp + │   │   ├── __init__.py + │   │   ├── __pycache__ + │   │   │   ├── __init__.cpython-39.pyc + │   │   │   ├── cnn_dailymail.cpython-39.pyc + │   │   │   └── twitter_covid_19.cpython-39.pyc + │   │   ├── cnn_dailymail.py + │   │   ├── datasets + │   │   │   ├── Covid_19.csv + │   │   │   ├── cnn_dailymail_100_with_predictions.csv + │   │   │   ├── cnn_dailymail_500_with_predictions.csv + │   │   │   └── sentiments_with_predictions.csv + │   │   └── twitter_covid_19.py + │   └── regression + │   ├── __init__.py + │   ├── __pycache__ + │   │   ├── __init__.cpython-39.pyc + │   │   ├── california_housing.cpython-39.pyc + │   │   ├── fred.cpython-39.pyc + │   │   ├── fred_timeseries.cpython-39.pyc + │   │   └── lending_club.cpython-39.pyc + │   ├── california_housing.py + │   ├── datasets + │   │   ├── fred + │   │   │   ├── CPIAUCSL.csv + │   │   │   ├── CSUSHPISA.csv + │   │   │   ├── DRSFRMACBS.csv + │   │   │   ├── FEDFUNDS.csv + │   │   │   ├── GDP.csv + │   │   │   ├── GDPC1.csv + │   │   │   ├── GS10.csv + │   │   │   ├── GS3.csv + │   │   │   ├── GS5.csv + │   │   │   ├── MORTGAGE30US.csv + │   │   │   └── UNRATE.csv + │   │   ├── fred_loan_rates.csv + │   │   ├── fred_loan_rates_test_1.csv + │   │   ├── fred_loan_rates_test_2.csv + │   │   ├── fred_loan_rates_test_3.csv + │   │   ├── fred_loan_rates_test_4.csv + │   │   ├── fred_loan_rates_test_5.csv + │   │   └── leanding_club_loan_rates.csv + │   ├── fred.py + │   ├── fred_timeseries.py + │   ├── lending_club.py + │   └── models + │   ├── fred_loan_rates_model_1.pkl + │   ├── fred_loan_rates_model_2.pkl + │   ├── fred_loan_rates_model_3.pkl + │   ├── fred_loan_rates_model_4.pkl + │   └── fred_loan_rates_model_5.pkl + ├── errors.py + ├── html_templates + │   ├── __init__.py + │   ├── __pycache__ + │   │   ├── __init__.cpython-39.pyc + │   │   └── content_blocks.cpython-39.pyc + │   └── content_blocks.py + ├── input_registry.py + ├── logging.py + ├── models + │   ├── __init__.py + │   ├── __pycache__ + │   │   ├── __init__.cpython-39.pyc + │   │   ├── foundation.cpython-39.pyc + │   │   ├── function.cpython-39.pyc + │   │   ├── huggingface.cpython-39.pyc + │   │   ├── metadata.cpython-39.pyc + │   │   ├── pipeline.cpython-39.pyc + │   │   ├── pytorch.cpython-39.pyc + │   │   ├── r_model.cpython-39.pyc + │   │   └── sklearn.cpython-39.pyc + │   ├── foundation.py + │   ├── function.py + │   ├── huggingface.py + │   ├── metadata.py + │   ├── pipeline.py + │   ├── pytorch.py + │   ├── r_model.py + │   └── sklearn.py + ├── template.py + ├── test_suites + │   ├── __init__.py + │   ├── __pycache__ + │   │   ├── __init__.cpython-39.pyc + │   │   ├── classifier.cpython-39.pyc + │   │   ├── cluster.cpython-39.pyc + │   │   ├── embeddings.cpython-39.pyc + │   │   ├── llm.cpython-39.pyc + │   │   ├── nlp.cpython-39.pyc + │   │   ├── parameters_optimization.cpython-39.pyc + │   │   ├── regression.cpython-39.pyc + │   │   ├── statsmodels_timeseries.cpython-39.pyc + │   │   ├── summarization.cpython-39.pyc + │   │   ├── tabular_datasets.cpython-39.pyc + │   │   ├── text_data.cpython-39.pyc + │   │   └── time_series.cpython-39.pyc + │   ├── classifier.py + │   ├── cluster.py + │   ├── embeddings.py + │   ├── llm.py + │   ├── nlp.py + │   ├── parameters_optimization.py + │   ├── regression.py + │   ├── statsmodels_timeseries.py + │   ├── summarization.py + │   ├── tabular_datasets.py + │   ├── text_data.py + │   └── time_series.py + ├── tests + │   ├── __init__.py + │   ├── __pycache__ + │   │   ├── __init__.cpython-39.pyc + │   │   ├── __types__.cpython-39.pyc + │   │   ├── _store.cpython-39.pyc + │   │   ├── comparison.cpython-39.pyc + │   │   ├── decorator.cpython-39.pyc + │   │   ├── load.cpython-39.pyc + │   │   ├── output.cpython-39.pyc + │   │   ├── run.cpython-39.pyc + │   │   ├── test_providers.cpython-39.pyc + │   │   └── utils.cpython-39.pyc + │   ├── __types__.py + │   ├── _store.py + │   ├── comparison.py + │   ├── data_validation + │   │   ├── ACFandPACFPlot.py + │   │   ├── ADF.py + │   │   ├── AutoAR.py + │   │   ├── AutoMA.py + │   │   ├── AutoStationarity.py + │   │   ├── BivariateScatterPlots.py + │   │   ├── BoxPierce.py + │   │   ├── ChiSquaredFeaturesTable.py + │   │   ├── ClassImbalance.py + │   │   ├── DatasetDescription.py + │   │   ├── DatasetSplit.py + │   │   ├── DescriptiveStatistics.py + │   │   ├── DickeyFullerGLS.py + │   │   ├── Duplicates.py + │   │   ├── EngleGrangerCoint.py + │   │   ├── FeatureTargetCorrelationPlot.py + │   │   ├── HighCardinality.py + │   │   ├── HighPearsonCorrelation.py + │   │   ├── IQROutliersBarPlot.py + │   │   ├── IQROutliersTable.py + │   │   ├── IsolationForestOutliers.py + │   │   ├── JarqueBera.py + │   │   ├── KPSS.py + │   │   ├── LJungBox.py + │   │   ├── LaggedCorrelationHeatmap.py + │   │   ├── MissingValues.py + │   │   ├── MissingValuesBarPlot.py + │   │   ├── MutualInformation.py + │   │   ├── PearsonCorrelationMatrix.py + │   │   ├── PhillipsPerronArch.py + │   │   ├── ProtectedClassesCombination.py + │   │   ├── ProtectedClassesDescription.py + │   │   ├── ProtectedClassesDisparity.py + │   │   ├── ProtectedClassesThresholdOptimizer.py + │   │   ├── RollingStatsPlot.py + │   │   ├── RunsTest.py + │   │   ├── ScatterPlot.py + │   │   ├── ScoreBandDefaultRates.py + │   │   ├── SeasonalDecompose.py + │   │   ├── ShapiroWilk.py + │   │   ├── Skewness.py + │   │   ├── SpreadPlot.py + │   │   ├── TabularCategoricalBarPlots.py + │   │   ├── TabularDateTimeHistograms.py + │   │   ├── TabularDescriptionTables.py + │   │   ├── TabularNumericalHistograms.py + │   │   ├── TargetRateBarPlots.py + │   │   ├── TimeSeriesDescription.py + │   │   ├── TimeSeriesDescriptiveStatistics.py + │   │   ├── TimeSeriesFrequency.py + │   │   ├── TimeSeriesHistogram.py + │   │   ├── TimeSeriesLinePlot.py + │   │   ├── TimeSeriesMissingValues.py + │   │   ├── TimeSeriesOutliers.py + │   │   ├── TooManyZeroValues.py + │   │   ├── UniqueRows.py + │   │   ├── WOEBinPlots.py + │   │   ├── WOEBinTable.py + │   │   ├── ZivotAndrewsArch.py + │   │   ├── __init__.py + │   │   ├── __pycache__ + │   │   │   ├── ACFandPACFPlot.cpython-39.pyc + │   │   │   ├── ADF.cpython-39.pyc + │   │   │   ├── AutoAR.cpython-39.pyc + │   │   │   ├── AutoMA.cpython-39.pyc + │   │   │   ├── AutoStationarity.cpython-39.pyc + │   │   │   ├── BivariateScatterPlots.cpython-39.pyc + │   │   │   ├── BoxPierce.cpython-39.pyc + │   │   │   ├── ChiSquaredFeaturesTable.cpython-39.pyc + │   │   │   ├── ClassImbalance.cpython-39.pyc + │   │   │   ├── DatasetDescription.cpython-39.pyc + │   │   │   ├── DatasetSplit.cpython-39.pyc + │   │   │   ├── DescriptiveStatistics.cpython-39.pyc + │   │   │   ├── DickeyFullerGLS.cpython-39.pyc + │   │   │   ├── Duplicates.cpython-39.pyc + │   │   │   ├── EngleGrangerCoint.cpython-39.pyc + │   │   │   ├── FeatureTargetCorrelationPlot.cpython-39.pyc + │   │   │   ├── HighCardinality.cpython-39.pyc + │   │   │   ├── HighPearsonCorrelation.cpython-39.pyc + │   │   │   ├── IQROutliersBarPlot.cpython-39.pyc + │   │   │   ├── IQROutliersTable.cpython-39.pyc + │   │   │   ├── IsolationForestOutliers.cpython-39.pyc + │   │   │   ├── JarqueBera.cpython-39.pyc + │   │   │   ├── KPSS.cpython-39.pyc + │   │   │   ├── LJungBox.cpython-39.pyc + │   │   │   ├── LaggedCorrelationHeatmap.cpython-39.pyc + │   │   │   ├── MissingValues.cpython-39.pyc + │   │   │   ├── MissingValuesBarPlot.cpython-39.pyc + │   │   │   ├── MutualInformation.cpython-39.pyc + │   │   │   ├── PearsonCorrelationMatrix.cpython-39.pyc + │   │   │   ├── PhillipsPerronArch.cpython-39.pyc + │   │   │   ├── ProtectedClassesCombination.cpython-39.pyc + │   │   │   ├── ProtectedClassesDescription.cpython-39.pyc + │   │   │   ├── ProtectedClassesDisparity.cpython-39.pyc + │   │   │   ├── ProtectedClassesThresholdOptimizer.cpython-39.pyc + │   │   │   ├── RollingStatsPlot.cpython-39.pyc + │   │   │   ├── RunsTest.cpython-39.pyc + │   │   │   ├── ScatterPlot.cpython-39.pyc + │   │   │   ├── ScoreBandDefaultRates.cpython-39.pyc + │   │   │   ├── SeasonalDecompose.cpython-39.pyc + │   │   │   ├── ShapiroWilk.cpython-39.pyc + │   │   │   ├── Skewness.cpython-39.pyc + │   │   │   ├── SpreadPlot.cpython-39.pyc + │   │   │   ├── TabularCategoricalBarPlots.cpython-39.pyc + │   │   │   ├── TabularDateTimeHistograms.cpython-39.pyc + │   │   │   ├── TabularDescriptionTables.cpython-39.pyc + │   │   │   ├── TabularNumericalHistograms.cpython-39.pyc + │   │   │   ├── TargetRateBarPlots.cpython-39.pyc + │   │   │   ├── TimeSeriesDescription.cpython-39.pyc + │   │   │   ├── TimeSeriesDescriptiveStatistics.cpython-39.pyc + │   │   │   ├── TimeSeriesFrequency.cpython-39.pyc + │   │   │   ├── TimeSeriesHistogram.cpython-39.pyc + │   │   │   ├── TimeSeriesLinePlot.cpython-39.pyc + │   │   │   ├── TimeSeriesMissingValues.cpython-39.pyc + │   │   │   ├── TimeSeriesOutliers.cpython-39.pyc + │   │   │   ├── TooManyZeroValues.cpython-39.pyc + │   │   │   ├── UniqueRows.cpython-39.pyc + │   │   │   ├── WOEBinPlots.cpython-39.pyc + │   │   │   ├── WOEBinTable.cpython-39.pyc + │   │   │   ├── ZivotAndrewsArch.cpython-39.pyc + │   │   │   └── __init__.cpython-39.pyc + │   │   └── nlp + │   │   ├── CommonWords.py + │   │   ├── Hashtags.py + │   │   ├── LanguageDetection.py + │   │   ├── Mentions.py + │   │   ├── PolarityAndSubjectivity.py + │   │   ├── Punctuations.py + │   │   ├── Sentiment.py + │   │   ├── StopWords.py + │   │   ├── TextDescription.py + │   │   ├── Toxicity.py + │   │   ├── __init__.py + │   │   └── __pycache__ + │   │   ├── CommonWords.cpython-39.pyc + │   │   ├── Hashtags.cpython-39.pyc + │   │   ├── LanguageDetection.cpython-39.pyc + │   │   ├── Mentions.cpython-39.pyc + │   │   ├── PolarityAndSubjectivity.cpython-39.pyc + │   │   ├── Punctuations.cpython-39.pyc + │   │   ├── Sentiment.cpython-39.pyc + │   │   ├── StopWords.cpython-39.pyc + │   │   ├── TextDescription.cpython-39.pyc + │   │   ├── Toxicity.cpython-39.pyc + │   │   └── __init__.cpython-39.pyc + │   ├── decorator.py + │   ├── load.py + │   ├── model_validation + │   │   ├── BertScore.py + │   │   ├── BleuScore.py + │   │   ├── ClusterSizeDistribution.py + │   │   ├── ContextualRecall.py + │   │   ├── FeaturesAUC.py + │   │   ├── MeteorScore.py + │   │   ├── ModelMetadata.py + │   │   ├── ModelPredictionResiduals.py + │   │   ├── RegardScore.py + │   │   ├── RegressionResidualsPlot.py + │   │   ├── RougeScore.py + │   │   ├── TimeSeriesPredictionWithCI.py + │   │   ├── TimeSeriesPredictionsPlot.py + │   │   ├── TimeSeriesR2SquareBySegments.py + │   │   ├── TokenDisparity.py + │   │   ├── ToxicityScore.py + │   │   ├── __init__.py + │   │   ├── __pycache__ + │   │   │   ├── BertScore.cpython-39.pyc + │   │   │   ├── BleuScore.cpython-39.pyc + │   │   │   ├── ClusterSizeDistribution.cpython-39.pyc + │   │   │   ├── ContextualRecall.cpython-39.pyc + │   │   │   ├── FeaturesAUC.cpython-39.pyc + │   │   │   ├── MeteorScore.cpython-39.pyc + │   │   │   ├── ModelMetadata.cpython-39.pyc + │   │   │   ├── ModelPredictionResiduals.cpython-39.pyc + │   │   │   ├── RegardScore.cpython-39.pyc + │   │   │   ├── RegressionResidualsPlot.cpython-39.pyc + │   │   │   ├── RougeScore.cpython-39.pyc + │   │   │   ├── TimeSeriesPredictionWithCI.cpython-39.pyc + │   │   │   ├── TimeSeriesPredictionsPlot.cpython-39.pyc + │   │   │   ├── TimeSeriesR2SquareBySegments.cpython-39.pyc + │   │   │   ├── TokenDisparity.cpython-39.pyc + │   │   │   ├── ToxicityScore.cpython-39.pyc + │   │   │   └── __init__.cpython-39.pyc + │   │   ├── embeddings + │   │   │   ├── ClusterDistribution.py + │   │   │   ├── CosineSimilarityComparison.py + │   │   │   ├── CosineSimilarityDistribution.py + │   │   │   ├── CosineSimilarityHeatmap.py + │   │   │   ├── DescriptiveAnalytics.py + │   │   │   ├── EmbeddingsVisualization2D.py + │   │   │   ├── EuclideanDistanceComparison.py + │   │   │   ├── EuclideanDistanceHeatmap.py + │   │   │   ├── PCAComponentsPairwisePlots.py + │   │   │   ├── StabilityAnalysisKeyword.py + │   │   │   ├── StabilityAnalysisRandomNoise.py + │   │   │   ├── StabilityAnalysisSynonyms.py + │   │   │   ├── StabilityAnalysisTranslation.py + │   │   │   ├── TSNEComponentsPairwisePlots.py + │   │   │   └── utils.py + │   │   ├── ragas + │   │   │   ├── AnswerCorrectness.py + │   │   │   ├── AspectCritic.py + │   │   │   ├── ContextEntityRecall.py + │   │   │   ├── ContextPrecision.py + │   │   │   ├── ContextPrecisionWithoutReference.py + │   │   │   ├── ContextRecall.py + │   │   │   ├── Faithfulness.py + │   │   │   ├── NoiseSensitivity.py + │   │   │   ├── ResponseRelevancy.py + │   │   │   ├── SemanticSimilarity.py + │   │   │   └── utils.py + │   │   ├── sklearn + │   │   │   ├── AdjustedMutualInformation.py + │   │   │   ├── AdjustedRandIndex.py + │   │   │   ├── CalibrationCurve.py + │   │   │   ├── ClassifierPerformance.py + │   │   │   ├── ClassifierThresholdOptimization.py + │   │   │   ├── ClusterCosineSimilarity.py + │   │   │   ├── ClusterPerformanceMetrics.py + │   │   │   ├── CompletenessScore.py + │   │   │   ├── ConfusionMatrix.py + │   │   │   ├── FeatureImportance.py + │   │   │   ├── FowlkesMallowsScore.py + │   │   │   ├── HomogeneityScore.py + │   │   │   ├── HyperParametersTuning.py + │   │   │   ├── KMeansClustersOptimization.py + │   │   │   ├── MinimumAccuracy.py + │   │   │   ├── MinimumF1Score.py + │   │   │   ├── MinimumROCAUCScore.py + │   │   │   ├── ModelParameters.py + │   │   │   ├── ModelsPerformanceComparison.py + │   │   │   ├── OverfitDiagnosis.py + │   │   │   ├── PermutationFeatureImportance.py + │   │   │   ├── PopulationStabilityIndex.py + │   │   │   ├── PrecisionRecallCurve.py + │   │   │   ├── ROCCurve.py + │   │   │   ├── RegressionErrors.py + │   │   │   ├── RegressionErrorsComparison.py + │   │   │   ├── RegressionPerformance.py + │   │   │   ├── RegressionR2Square.py + │   │   │   ├── RegressionR2SquareComparison.py + │   │   │   ├── RobustnessDiagnosis.py + │   │   │   ├── SHAPGlobalImportance.py + │   │   │   ├── ScoreProbabilityAlignment.py + │   │   │   ├── SilhouettePlot.py + │   │   │   ├── TrainingTestDegradation.py + │   │   │   ├── VMeasure.py + │   │   │   ├── WeakspotsDiagnosis.py + │   │   │   ├── __init__.py + │   │   │   └── __pycache__ + │   │   │   ├── AdjustedMutualInformation.cpython-39.pyc + │   │   │   ├── AdjustedRandIndex.cpython-39.pyc + │   │   │   ├── CalibrationCurve.cpython-39.pyc + │   │   │   ├── ClassifierPerformance.cpython-39.pyc + │   │   │   ├── ClassifierThresholdOptimization.cpython-39.pyc + │   │   │   ├── ClusterCosineSimilarity.cpython-39.pyc + │   │   │   ├── ClusterPerformanceMetrics.cpython-39.pyc + │   │   │   ├── CompletenessScore.cpython-39.pyc + │   │   │   ├── ConfusionMatrix.cpython-39.pyc + │   │   │   ├── FeatureImportance.cpython-39.pyc + │   │   │   ├── FowlkesMallowsScore.cpython-39.pyc + │   │   │   ├── HomogeneityScore.cpython-39.pyc + │   │   │   ├── HyperParametersTuning.cpython-39.pyc + │   │   │   ├── KMeansClustersOptimization.cpython-39.pyc + │   │   │   ├── MinimumAccuracy.cpython-39.pyc + │   │   │   ├── MinimumF1Score.cpython-39.pyc + │   │   │   ├── MinimumROCAUCScore.cpython-39.pyc + │   │   │   ├── ModelParameters.cpython-39.pyc + │   │   │   ├── ModelsPerformanceComparison.cpython-39.pyc + │   │   │   ├── OverfitDiagnosis.cpython-39.pyc + │   │   │   ├── PermutationFeatureImportance.cpython-39.pyc + │   │   │   ├── PopulationStabilityIndex.cpython-39.pyc + │   │   │   ├── PrecisionRecallCurve.cpython-39.pyc + │   │   │   ├── ROCCurve.cpython-39.pyc + │   │   │   ├── RegressionErrors.cpython-39.pyc + │   │   │   ├── RegressionErrorsComparison.cpython-39.pyc + │   │   │   ├── RegressionPerformance.cpython-39.pyc + │   │   │   ├── RegressionR2Square.cpython-39.pyc + │   │   │   ├── RegressionR2SquareComparison.cpython-39.pyc + │   │   │   ├── RobustnessDiagnosis.cpython-39.pyc + │   │   │   ├── SHAPGlobalImportance.cpython-39.pyc + │   │   │   ├── ScoreProbabilityAlignment.cpython-39.pyc + │   │   │   ├── SilhouettePlot.cpython-39.pyc + │   │   │   ├── TrainingTestDegradation.cpython-39.pyc + │   │   │   ├── VMeasure.cpython-39.pyc + │   │   │   ├── WeakspotsDiagnosis.cpython-39.pyc + │   │   │   └── __init__.cpython-39.pyc + │   │   └── statsmodels + │   │   ├── AutoARIMA.py + │   │   ├── CumulativePredictionProbabilities.py + │   │   ├── DurbinWatsonTest.py + │   │   ├── GINITable.py + │   │   ├── KolmogorovSmirnov.py + │   │   ├── Lilliefors.py + │   │   ├── PredictionProbabilitiesHistogram.py + │   │   ├── RegressionCoeffs.py + │   │   ├── RegressionFeatureSignificance.py + │   │   ├── RegressionModelForecastPlot.py + │   │   ├── RegressionModelForecastPlotLevels.py + │   │   ├── RegressionModelSensitivityPlot.py + │   │   ├── RegressionModelSummary.py + │   │   ├── RegressionPermutationFeatureImportance.py + │   │   ├── ScorecardHistogram.py + │   │   ├── __init__.py + │   │   ├── __pycache__ + │   │   │   ├── AutoARIMA.cpython-39.pyc + │   │   │   ├── CumulativePredictionProbabilities.cpython-39.pyc + │   │   │   ├── DurbinWatsonTest.cpython-39.pyc + │   │   │   ├── GINITable.cpython-39.pyc + │   │   │   ├── KolmogorovSmirnov.cpython-39.pyc + │   │   │   ├── Lilliefors.cpython-39.pyc + │   │   │   ├── PredictionProbabilitiesHistogram.cpython-39.pyc + │   │   │   ├── RegressionCoeffs.cpython-39.pyc + │   │   │   ├── RegressionFeatureSignificance.cpython-39.pyc + │   │   │   ├── RegressionModelForecastPlot.cpython-39.pyc + │   │   │   ├── RegressionModelForecastPlotLevels.cpython-39.pyc + │   │   │   ├── RegressionModelSensitivityPlot.cpython-39.pyc + │   │   │   ├── RegressionModelSummary.cpython-39.pyc + │   │   │   ├── RegressionPermutationFeatureImportance.cpython-39.pyc + │   │   │   ├── ScorecardHistogram.cpython-39.pyc + │   │   │   ├── __init__.cpython-39.pyc + │   │   │   └── statsutils.cpython-39.pyc + │   │   └── statsutils.py + │   ├── ongoing_monitoring + │   │   ├── CalibrationCurveDrift.py + │   │   ├── ClassDiscriminationDrift.py + │   │   ├── ClassImbalanceDrift.py + │   │   ├── ClassificationAccuracyDrift.py + │   │   ├── ConfusionMatrixDrift.py + │   │   ├── CumulativePredictionProbabilitiesDrift.py + │   │   ├── FeatureDrift.py + │   │   ├── PredictionAcrossEachFeature.py + │   │   ├── PredictionCorrelation.py + │   │   ├── PredictionProbabilitiesHistogramDrift.py + │   │   ├── PredictionQuantilesAcrossFeatures.py + │   │   ├── ROCCurveDrift.py + │   │   ├── ScoreBandsDrift.py + │   │   ├── ScorecardHistogramDrift.py + │   │   └── TargetPredictionDistributionPlot.py + │   ├── output.py + │   ├── prompt_validation + │   │   ├── Bias.py + │   │   ├── Clarity.py + │   │   ├── Conciseness.py + │   │   ├── Delimitation.py + │   │   ├── NegativeInstruction.py + │   │   ├── Robustness.py + │   │   ├── Specificity.py + │   │   ├── __init__.py + │   │   ├── __pycache__ + │   │   │   ├── Bias.cpython-39.pyc + │   │   │   ├── Clarity.cpython-39.pyc + │   │   │   ├── Conciseness.cpython-39.pyc + │   │   │   ├── Delimitation.cpython-39.pyc + │   │   │   ├── NegativeInstruction.cpython-39.pyc + │   │   │   ├── Robustness.cpython-39.pyc + │   │   │   ├── Specificity.cpython-39.pyc + │   │   │   ├── __init__.cpython-39.pyc + │   │   │   └── ai_powered_test.cpython-39.pyc + │   │   └── ai_powered_test.py + │   ├── run.py + │   ├── test_providers.py + │   └── utils.py + ├── unit_metrics + │   ├── __init__.py + │   ├── __pycache__ + │   │   └── __init__.cpython-39.pyc + │   ├── classification + │   │   ├── Accuracy.py + │   │   ├── F1.py + │   │   ├── Precision.py + │   │   ├── ROC_AUC.py + │   │   └── Recall.py + │   └── regression + │   ├── AdjustedRSquaredScore.py + │   ├── GiniCoefficient.py + │   ├── HuberLoss.py + │   ├── KolmogorovSmirnovStatistic.py + │   ├── MeanAbsoluteError.py + │   ├── MeanAbsolutePercentageError.py + │   ├── MeanBiasDeviation.py + │   ├── MeanSquaredError.py + │   ├── QuantileLoss.py + │   ├── RSquaredScore.py + │   └── RootMeanSquaredError.py + ├── utils.py + └── vm_models + ├── __init__.py + ├── __pycache__ + │   ├── __init__.cpython-39.pyc + │   ├── figure.cpython-39.pyc + │   ├── input.cpython-39.pyc + │   └── model.cpython-39.pyc + ├── dataset + │   ├── __init__.py + │   ├── __pycache__ + │   │   ├── __init__.cpython-39.pyc + │   │   ├── dataset.cpython-39.pyc + │   │   └── utils.cpython-39.pyc + │   ├── dataset.py + │   └── utils.py + ├── figure.py + ├── input.py + ├── model.py + ├── result + │   ├── __init__.py + │   ├── __pycache__ + │   │   ├── __init__.cpython-39.pyc + │   │   ├── result.cpython-39.pyc + │   │   └── utils.cpython-39.pyc + │   ├── result.jinja + │   ├── result.py + │   └── utils.py + └── test_suite + ├── __init__.py + ├── __pycache__ + │   ├── runner.cpython-39.pyc + │   ├── summary.cpython-39.pyc + │   ├── test.cpython-39.pyc + │   └── test_suite.cpython-39.pyc + ├── runner.py + ├── summary.py + ├── test.py + └── test_suite.py + +141 directories, 1076 files diff --git a/docs/templates/macros/docstring.jinja2 b/docs/templates/macros/docstring.jinja2 index efcf388be..c8ea6dcea 100644 --- a/docs/templates/macros/docstring.jinja2 +++ b/docs/templates/macros/docstring.jinja2 @@ -15,15 +15,6 @@ {# Parameters #} {%- if docstring.parsed.params -%} {%- set _ = sections.append("\n**Parameters**") -%} - {# Debug info #} - {%- set _ = sections.append("\nDEBUG:") -%} - {%- for param in docstring.parsed.params -%} - {%- set _ = sections.append("- arg_name: " ~ param.arg_name|string) -%} - {%- set _ = sections.append("- type_name: " ~ param.type_name|string) -%} - {%- set _ = sections.append("- description: " ~ param.description|string) -%} - {%- set _ = sections.append("---") -%} - {%- endfor -%} - {# Original parameter processing #} {%- for param in docstring.parsed.params -%} {%- if param.arg_name and param.description -%} {%- set desc = param.description | trim -%} diff --git a/docs/templates/sidebar.qmd.jinja2 b/docs/templates/sidebar.qmd.jinja2 index 278f088db..3e6f4ce7a 100644 --- a/docs/templates/sidebar.qmd.jinja2 +++ b/docs/templates/sidebar.qmd.jinja2 @@ -1,10 +1,12 @@ website: sidebar: - - contents: + - text: "ValidMind Library" + file: reference/validmind.qmd + contents: # Root level functions from validmind.qmd {% if module.members.__version__ %} - text: "__version__" - file: validmind.qmd#__version__ + file: reference/validmind.qmd#__version__ {% endif %} {% if documented_items.get('root') %} {% for item in documented_items['root'] %} @@ -19,38 +21,13 @@ website: {% if is_public(member, module, full_data, is_root) and member.kind == "module" %} - text: "{{ member.name }}" file: validmind/{{ member.name }}.qmd + {% set module_files = qmd_files.get(member.name, []) %} + {% if module_files %} contents: - {% if member.name in documented_items %} - {% for item in documented_items[member.name] %} - - text: "{{ item.text }}" - file: {{ item.file }} + {% for file in module_files %} + - text: "{{ file.split('/')[-1].replace('.qmd', '') }}" + file: {{ file }} {% endfor %} {% endif %} - {% for submember in member.members | sort_members %} - {% if is_public(submember, member, full_data, is_root) and submember.kind == "module" %} - - text: "{{ submember.name }}" - file: validmind/{{ member.name }}/{{ submember.name }}.qmd - contents: - {% if submember.name in documented_items %} - {% for item in documented_items[submember.name] %} - - text: "{{ item.text }}" - file: {{ item.file }} - {% endfor %} - {% endif %} - {% for subsubmember in submember.members | sort_members %} - {% if is_public(subsubmember, submember, full_data, is_root) and subsubmember.kind == "module" %} - - text: "{{ subsubmember.name }}" - file: validmind/{{ member.name }}/{{ submember.name }}/{{ subsubmember.name }}.qmd - {% if subsubmember.name in documented_items %} - contents: - {% for item in documented_items[subsubmember.name] %} - - text: "{{ item.text }}" - file: {{ item.file }} - {% endfor %} - {% endif %} - {% endif %} - {% endfor %} - {% endif %} - {% endfor %} {% endif %} {% endfor %} \ No newline at end of file diff --git a/docs/templates/vm_models.qmd.jinja2 b/docs/templates/vm_models.qmd.jinja2 new file mode 100644 index 000000000..8beb288da --- /dev/null +++ b/docs/templates/vm_models.qmd.jinja2 @@ -0,0 +1,36 @@ +--- +title: vm_models +toc-depth: 3 +toc-expand: 3 +--- + +Models entrypoint + +{% if module.members %} +{% set vm_members = module.members %} +{% if '__all__' in vm_members %} +{% set all_list = [] %} +{% for element in vm_members['__all__'].value.elements %} + {% set _ = all_list.append(element.strip("'")) %} +{% endfor %} + +{# Process each item in __all__ #} +{% for item_name in all_list %} + {% if item_name in vm_members %} + {% set member = vm_members[item_name] %} + {% set resolved = resolve_alias(member, full_data) %} + + ## [{{ resolved.kind }}]{.muted} {{ item_name }} + + ```python + {{ resolved.kind }} {{ item_name }}{% if resolved.bases %}({{ resolved.bases | join(', ') }}){% endif %}: + ``` + + {% if resolved.docstring %} + {{ doc.format_docstring(resolved.docstring) }} + {% endif %} + + {% endif %} +{% endfor %} +{% endif %} +{% endif %} \ No newline at end of file diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 07987afd8..1477cbe82 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -53,32 +53,6 @@ Gets a TestSuite object for the current project or a specific test suite This fu **Parameters** -DEBUG: - -- arg_name: test_suite_id -- type_name: str -- description: The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. - -______________________________________________________________________ - -- arg_name: section -- type_name: str -- description: The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. - -______________________________________________________________________ - -- arg_name: args -- type_name: None -- description: Additional arguments to pass to the TestSuite - -______________________________________________________________________ - -- arg_name: kwargs -- type_name: None -- description: Additional keyword arguments to pass to the TestSuite - -______________________________________________________________________ - - **test_suite_id** str: The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. - **section** str: The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. - **args**: Additional arguments to pass to the TestSuite @@ -102,44 +76,6 @@ If the API key and secret are not provided, the client will attempt to retrieve **Parameters** -DEBUG: - -- arg_name: project -- type_name: str -- description: The project CUID. Alias for model. Defaults to None. [DEPRECATED] - -______________________________________________________________________ - -- arg_name: model -- type_name: str -- description: The model CUID. Defaults to None. - -______________________________________________________________________ - -- arg_name: api_key -- type_name: str -- description: The API key. Defaults to None. - -______________________________________________________________________ - -- arg_name: api_secret -- type_name: str -- description: The API secret. Defaults to None. - -______________________________________________________________________ - -- arg_name: api_host -- type_name: str -- description: The API host. Defaults to None. - -______________________________________________________________________ - -- arg_name: monitoring -- type_name: bool -- description: The ongoing monitoring flag. Defaults to False. - -______________________________________________________________________ - - **project** str: The project CUID. Alias for model. Defaults to None. [DEPRECATED] - **model** str: The model CUID. Defaults to None. - **api_key** str: The API key. Defaults to None. @@ -202,38 +138,6 @@ Initializes a VM Model, which can then be passed to other functions that can per **Parameters** -DEBUG: - -- arg_name: model -- type_name: None -- description: A trained model or VMModel instance - -______________________________________________________________________ - -- arg_name: input_id -- type_name: str -- description: The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. - -______________________________________________________________________ - -- arg_name: attributes -- type_name: dict -- description: A dictionary of model attributes - -______________________________________________________________________ - -- arg_name: predict_fn -- type_name: callable -- description: A function that takes an input and returns a prediction - -______________________________________________________________________ - -- arg_name: \*\*kwargs -- type_name: None -- description: Additional arguments to pass to the model - -______________________________________________________________________ - - **model**: A trained model or VMModel instance - **input_id** str: The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. - **attributes** dict: A dictionary of model attributes @@ -267,20 +171,6 @@ LogisticRegression and LinearRegression models are converted to sklearn models b **Parameters** -DEBUG: - -- arg_name: model_path -- type_name: str -- description: The path to the R model saved as an RDS or XGB file - -______________________________________________________________________ - -- arg_name: model_type -- type_name: str -- description: The type of the model (one of R_MODEL_TYPES) - -______________________________________________________________________ - - **model_path** str: The path to the R model saved as an RDS or XGB file - **model_type** str: The type of the model (one of R_MODEL_TYPES) @@ -304,44 +194,6 @@ Logs a unit metric Unit metrics are key-value pairs where the key is the metric **Parameters** -DEBUG: - -- arg_name: key -- type_name: str -- description: The metric key - -______________________________________________________________________ - -- arg_name: value -- type_name: float -- description: The metric value - -______________________________________________________________________ - -- arg_name: inputs -- type_name: list -- description: A list of input IDs that were used to compute the metric. - -______________________________________________________________________ - -- arg_name: params -- type_name: dict -- description: Dictionary of parameters used to compute the metric. - -______________________________________________________________________ - -- arg_name: recorded_at -- type_name: str -- description: The timestamp of the metric. Server will use current time if not provided. - -______________________________________________________________________ - -- arg_name: thresholds -- type_name: dict -- description: Dictionary of thresholds for the metric. - -______________________________________________________________________ - - **key** str: The metric key - **value** float: The metric value - **inputs** list: A list of input IDs that were used to compute the metric. @@ -387,44 +239,6 @@ Collect and run all the tests associated with a template This function will anal **Parameters** -DEBUG: - -- arg_name: section -- type_name: str or list -- description: The section(s) to preview. Defaults to None. - -______________________________________________________________________ - -- arg_name: send -- type_name: bool -- description: Whether to send the results to the ValidMind API. Defaults to True. - -______________________________________________________________________ - -- arg_name: fail_fast -- type_name: bool -- description: Whether to stop running tests after the first failure. Defaults to False. - -______________________________________________________________________ - -- arg_name: inputs -- type_name: dict -- description: A dictionary of test inputs to pass to the TestSuite - -______________________________________________________________________ - -- arg_name: config -- type_name: None -- description: A dictionary of test parameters to override the defaults - -______________________________________________________________________ - -- arg_name: \*\*kwargs -- type_name: None -- description: backwards compatibility for passing in test inputs using keyword arguments - -______________________________________________________________________ - - **section** str or list: The section(s) to preview. Defaults to None. - **send** bool: Whether to send the results to the ValidMind API. Defaults to True. - **fail_fast** bool: Whether to stop running tests after the first failure. Defaults to False. @@ -456,44 +270,6 @@ High Level function for running a test suite This function provides a high level **Parameters** -DEBUG: - -- arg_name: test_suite_id -- type_name: str -- description: The test suite name (e.g. 'classifier_full_suite') - -______________________________________________________________________ - -- arg_name: config -- type_name: dict -- description: A dictionary of parameters to pass to the tests in the test suite. Defaults to None. - -______________________________________________________________________ - -- arg_name: send -- type_name: bool -- description: Whether to post the test results to the API. send=False is useful for testing. Defaults to True. - -______________________________________________________________________ - -- arg_name: fail_fast -- type_name: bool -- description: Whether to stop running tests after the first failure. Defaults to False. - -______________________________________________________________________ - -- arg_name: inputs -- type_name: dict -- description: A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` `models` etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. - -______________________________________________________________________ - -- arg_name: \*\*kwargs -- type_name: None -- description: backwards compatibility for passing in test inputs using keyword arguments - -______________________________________________________________________ - - **test_suite_id** str: The test suite name (e.g. 'classifier_full_suite') - **config** dict: A dictionary of parameters to pass to the tests in the test suite. Defaults to None. - **send** bool: Whether to post the test results to the API. send=False is useful for testing. Defaults to True. @@ -520,14 +296,6 @@ Decorator for specifying tags for a test. **Parameters** -DEBUG: - -- arg_name: \*tags -- type_name: None -- description: The tags to apply to the test. - -______________________________________________________________________ - - \***tags**: The tags to apply to the test. ### tasks[()]{.muted} @@ -541,14 +309,6 @@ Decorator for specifying the task types that a test is designed for. **Parameters** -DEBUG: - -- arg_name: \*tasks -- type_name: None -- description: The task types that the test is designed for. - -______________________________________________________________________ - - \***tasks**: The task types that the test is designed for. ### test[()]{.muted} @@ -576,20 +336,6 @@ The function may also include a docstring. This docstring will be used and logge **Parameters** -DEBUG: - -- arg_name: func -- type_name: None -- description: The function to decorate - -______________________________________________________________________ - -- arg_name: test_id -- type_name: None -- description: The identifier for the metric. If not provided, the function name is used. - -______________________________________________________________________ - - **func**: The function to decorate - **test_id**: The identifier for the metric. If not provided, the function name is used. diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index 58c42108f..c21df4612 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -15,20 +15,6 @@ Preprocess boolean columns. **Parameters** -DEBUG: - -- arg_name: df -- type_name: pandas.DataFrame -- description: Dataframe to preprocess. - -______________________________________________________________________ - -- arg_name: columns -- type_name: list -- description: List of columns to preprocess. - -______________________________________________________________________ - - **df** pandas.DataFrame: Dataframe to preprocess. - **columns** list: List of columns to preprocess. @@ -47,20 +33,6 @@ Preprocess categorical columns. **Parameters** -DEBUG: - -- arg_name: df -- type_name: pandas.DataFrame -- description: Dataframe to preprocess. - -______________________________________________________________________ - -- arg_name: columns -- type_name: list -- description: List of columns to preprocess. - -______________________________________________________________________ - - **df** pandas.DataFrame: Dataframe to preprocess. - **columns** list: List of columns to preprocess. @@ -79,20 +51,6 @@ Preprocess numerical columns. **Parameters** -DEBUG: - -- arg_name: df -- type_name: pandas.DataFrame -- description: Dataframe to preprocess. - -______________________________________________________________________ - -- arg_name: columns -- type_name: list -- description: List of columns to preprocess. - -______________________________________________________________________ - - **df** pandas.DataFrame: Dataframe to preprocess. - **columns** list: List of columns to preprocess. diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index ad4568373..fa1b8ebc2 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -15,20 +15,6 @@ Preprocess boolean columns. **Parameters** -DEBUG: - -- arg_name: df -- type_name: pandas.DataFrame -- description: Dataframe to preprocess. - -______________________________________________________________________ - -- arg_name: columns -- type_name: list -- description: List of columns to preprocess. - -______________________________________________________________________ - - **df** pandas.DataFrame: Dataframe to preprocess. - **columns** list: List of columns to preprocess. @@ -47,20 +33,6 @@ Preprocess categorical columns. **Parameters** -DEBUG: - -- arg_name: df -- type_name: pandas.DataFrame -- description: Dataframe to preprocess. - -______________________________________________________________________ - -- arg_name: columns -- type_name: list -- description: List of columns to preprocess. - -______________________________________________________________________ - - **df** pandas.DataFrame: Dataframe to preprocess. - **columns** list: List of columns to preprocess. @@ -79,20 +51,6 @@ Preprocess numerical columns. **Parameters** -DEBUG: - -- arg_name: df -- type_name: pandas.DataFrame -- description: Dataframe to preprocess. - -______________________________________________________________________ - -- arg_name: columns -- type_name: list -- description: List of columns to preprocess. - -______________________________________________________________________ - - **df** pandas.DataFrame: Dataframe to preprocess. - **columns** list: List of columns to preprocess. diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index 89585d315..c5ff18d19 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -31,20 +31,6 @@ Get demo test configuration. **Parameters** -DEBUG: - -- arg_name: x_test -- type_name: None -- description: Test features DataFrame - -______________________________________________________________________ - -- arg_name: y_test -- type_name: None -- description: Test target Series - -______________________________________________________________________ - - **x_test**: Test features DataFrame - **y_test**: Test target Series @@ -106,32 +92,6 @@ Split dataset into train, validation (optional), and test sets. **Parameters** -DEBUG: - -- arg_name: df -- type_name: None -- description: Input DataFrame - -______________________________________________________________________ - -- arg_name: validation_split -- type_name: None -- description: If None, returns train/test split. If float, returns train/val/test split - -______________________________________________________________________ - -- arg_name: test_size -- type_name: None -- description: Proportion of data for test set (default: 0.2) - -______________________________________________________________________ - -- arg_name: add_constant -- type_name: None -- description: Whether to add constant column for statsmodels (default: False) - -______________________________________________________________________ - - **df**: Input DataFrame - **validation_split**: If None, returns train/test split. If float, returns train/val/test split - **test_size**: Proportion of data for test set (default: 0.2) diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index 8144f6754..7912c42e4 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -60,32 +60,6 @@ Split a time series DataFrame into train, validation, and test sets. **Parameters** -DEBUG: - -- arg_name: df -- type_name: pandas.DataFrame -- description: The time series DataFrame to be split. - -______________________________________________________________________ - -- arg_name: split_option -- type_name: str -- description: The split option to choose from: 'train_test_val' (default) or 'train_test'. - -______________________________________________________________________ - -- arg_name: train_size -- type_name: float -- description: The proportion of the dataset to include in the training set. Default is 0.6. - -______________________________________________________________________ - -- arg_name: test_size -- type_name: float -- description: The proportion of the dataset to include in the test set. Default is 0.2. - -______________________________________________________________________ - - **df** pandas.DataFrame: The time series DataFrame to be split. - **split_option** str: The split option to choose from: 'train_test_val' (default) or 'train_test'. - **train_size** float: The proportion of the dataset to include in the training set. Default is 0.6. diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 39803af23..e3150727e 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -25,32 +25,6 @@ Split a time series DataFrame into train, validation, and test sets. **Parameters** -DEBUG: - -- arg_name: df -- type_name: pandas.DataFrame -- description: The time series DataFrame to be split. - -______________________________________________________________________ - -- arg_name: split_option -- type_name: str -- description: The split option to choose from: 'train_test_val' (default) or 'train_test'. - -______________________________________________________________________ - -- arg_name: train_size -- type_name: float -- description: The proportion of the dataset to include in the training set. Default is 0.6. - -______________________________________________________________________ - -- arg_name: test_size -- type_name: float -- description: The proportion of the dataset to include in the test set. Default is 0.2. - -______________________________________________________________________ - - **df** pandas.DataFrame: The time series DataFrame to be split. - **split_option** str: The split option to choose from: 'train_test_val' (default) or 'train_test'. - **train_size** float: The proportion of the dataset to include in the training set. Default is 0.6. diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 064b37574..e61792081 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -48,14 +48,6 @@ Convert a test ID to a human-readable name. **Parameters** -DEBUG: - -- arg_name: test_id -- type_name: str -- description: The test identifier, typically in CamelCase or snake_case. - -______________________________________________________________________ - - **test_id** str: The test identifier, typically in CamelCase or snake_case. **Returns** @@ -74,20 +66,6 @@ Describes a Test Suite by ID **Parameters** -DEBUG: - -- arg_name: test_suite_id -- type_name: None -- description: Test Suite ID - -______________________________________________________________________ - -- arg_name: verbose -- type_name: None -- description: If True, describe all plans and tests in the Test Suite - -______________________________________________________________________ - - **test_suite_id**: Test Suite ID - **verbose**: If True, describe all plans and tests in the Test Suite diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 7fbf037fd..7d2711f4e 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -21,20 +21,6 @@ Get or show details about the test This function can be used to see test details **Parameters** -DEBUG: - -- arg_name: test_id -- type_name: str -- description: The test ID. Defaults to None. - -______________________________________________________________________ - -- arg_name: raw -- type_name: bool -- description: If True, returns a dictionary with the test details. Defaults to False. - -______________________________________________________________________ - - **test_id** str: The test ID. Defaults to None. - **raw** bool: If True, returns a dictionary with the test details. Defaults to False. @@ -80,38 +66,6 @@ List all tests in the tests directory. **Parameters** -DEBUG: - -- arg_name: filter -- type_name: str -- description: Find tests where the ID, tasks or tags match the filter string. Defaults to None. - -______________________________________________________________________ - -- arg_name: task -- type_name: str -- description: Find tests that match the task. Can be used to narrow down matches from the filter string. Defaults to None. - -______________________________________________________________________ - -- arg_name: tags -- type_name: list -- description: Find tests that match list of tags. Can be used to narrow down matches from the filter string. Defaults to None. - -______________________________________________________________________ - -- arg_name: pretty -- type_name: bool -- description: If True, returns a pandas DataFrame with a formatted table. Defaults to True. - -______________________________________________________________________ - -- arg_name: truncate -- type_name: bool -- description: If True, truncates the test description to the first line. Defaults to True. (only used if pretty=True) - -______________________________________________________________________ - - **filter** str: Find tests where the ID, tasks or tags match the filter string. Defaults to None. - **task** str: Find tests that match the task. Can be used to narrow down matches from the filter string. Defaults to None. - **tags** list: Find tests that match list of tags. Can be used to narrow down matches from the filter string. Defaults to None. @@ -133,20 +87,6 @@ Load a test by test ID Test IDs are in the format `namespace.path_to_module.Test **Parameters** -DEBUG: - -- arg_name: test_id -- type_name: str -- description: The test ID in the format `namespace.path_to_module.TestName[:tag]` - -______________________________________________________________________ - -- arg_name: test_func -- type_name: callable -- description: The test function to load. If not provided, the test will be loaded from the test provider. Defaults to None. - -______________________________________________________________________ - - **test_id** str: The test ID in the format `namespace.path_to_module.TestName[:tag]` - **test_func** callable: The test function to load. If not provided, the test will be loaded from the test provider. Defaults to None. @@ -161,78 +101,6 @@ Run a ValidMind or custom test This function is the main entry point for running **Parameters** -DEBUG: - -- arg_name: test_id -- type_name: TestID -- description: Test ID to run. Not required if `name` and `unit_metrics` provided. - -______________________________________________________________________ - -- arg_name: params -- type_name: dict -- description: Parameters to customize test behavior. See test details for available parameters. - -______________________________________________________________________ - -- arg_name: param_grid -- type_name: Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\] -- description: For comparison tests, either: -- Dict mapping parameter names to lists of values (creates Cartesian product) -- List of parameter dictionaries to test - -______________________________________________________________________ - -- arg_name: inputs -- type_name: Dict[str, Any] -- description: Test inputs (models/datasets initialized with vm.init_model/dataset) - -______________________________________________________________________ - -- arg_name: input_grid -- type_name: Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\] -- description: For comparison tests, either: -- Dict mapping input names to lists of values (creates Cartesian product) -- List of input dictionaries to test - -______________________________________________________________________ - -- arg_name: name -- type_name: str -- description: Test name (required for composite metrics) - -______________________________________________________________________ - -- arg_name: unit_metrics -- type_name: list -- description: Unit metric IDs to run as composite metric - -______________________________________________________________________ - -- arg_name: show -- type_name: bool -- description: Whether to display results. Defaults to True. - -______________________________________________________________________ - -- arg_name: generate_description -- type_name: bool -- description: Whether to generate a description. Defaults to True. - -______________________________________________________________________ - -- arg_name: title -- type_name: str -- description: Custom title for the test result - -______________________________________________________________________ - -- arg_name: post_process_fn -- type_name: Callable\[[TestResult], None\] -- description: Function to post-process the test result - -______________________________________________________________________ - - **test_id** TestID: Test ID to run. Not required if `name` and `unit_metrics` provided. - **params** dict: Parameters to customize test behavior. See test details for available parameters. - **param_grid** Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\]: For comparison tests, either: @@ -269,14 +137,6 @@ Decorator for specifying tags for a test. **Parameters** -DEBUG: - -- arg_name: \*tags -- type_name: None -- description: The tags to apply to the test. - -______________________________________________________________________ - - \***tags**: The tags to apply to the test. ## tasks[()]{.muted} @@ -290,14 +150,6 @@ Decorator for specifying the task types that a test is designed for. **Parameters** -DEBUG: - -- arg_name: \*tasks -- type_name: None -- description: The task types that the test is designed for. - -______________________________________________________________________ - - \***tasks**: The task types that the test is designed for. ## test[()]{.muted} @@ -325,20 +177,6 @@ The function may also include a docstring. This docstring will be used and logge **Parameters** -DEBUG: - -- arg_name: func -- type_name: None -- description: The function to decorate - -______________________________________________________________________ - -- arg_name: test_id -- type_name: None -- description: The identifier for the metric. If not provided, the function name is used. - -______________________________________________________________________ - - **func**: The function to decorate - **test_id**: The identifier for the metric. If not provided, the function name is used. @@ -358,20 +196,6 @@ Register an external test provider **Parameters** -DEBUG: - -- arg_name: namespace -- type_name: str -- description: The namespace of the test provider - -______________________________________________________________________ - -- arg_name: test_provider -- type_name: TestProvider -- description: The test provider - -______________________________________________________________________ - - **namespace** str: The namespace of the test provider - **test_provider** TestProvider: The test provider @@ -419,14 +243,6 @@ test = test_provider.load_test("my_namespace.my_test_class") **Parameters** -DEBUG: - -- arg_name: root_folder -- type_name: str -- description: The root directory for local tests. - -______________________________________________________________________ - - **root_folder** str: The root directory for local tests. ### [list_tests[()]{.muted}](#list_tests) @@ -485,14 +301,6 @@ Load the test function identified by the given test_id **Parameters** -DEBUG: - -- arg_name: test_id -- type_name: str -- description: The test ID (does not contain the namespace under which the test is registered) - -______________________________________________________________________ - - **test_id** str: The test ID (does not contain the namespace under which the test is registered) **Returns** diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index d503d5bef..f477270fc 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -15,26 +15,6 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val **Parameters** -DEBUG: - -- arg_name: y_true -- type_name: None -- description: List or array of true values - -______________________________________________________________________ - -- arg_name: y_pred -- type_name: None -- description: List or array of predicted values - -______________________________________________________________________ - -- arg_name: dataset_id -- type_name: None -- description: Optional identifier for the dataset (for logging) - -______________________________________________________________________ - - **y_true**: List or array of true values - **y_pred**: List or array of predicted values - **dataset_id**: Optional identifier for the dataset (for logging) diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index e449f8a4e..4f5caf9d9 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -15,26 +15,6 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val **Parameters** -DEBUG: - -- arg_name: y_true -- type_name: None -- description: List or array of true values - -______________________________________________________________________ - -- arg_name: y_pred -- type_name: None -- description: List or array of predicted values - -______________________________________________________________________ - -- arg_name: dataset_id -- type_name: None -- description: Optional identifier for the dataset (for logging) - -______________________________________________________________________ - - **y_true**: List or array of true values - **y_pred**: List or array of predicted values - **dataset_id**: Optional identifier for the dataset (for logging) diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index c496cc0bf..5d80ae6d3 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -15,26 +15,6 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val **Parameters** -DEBUG: - -- arg_name: y_true -- type_name: None -- description: List or array of true values - -______________________________________________________________________ - -- arg_name: y_pred -- type_name: None -- description: List or array of predicted values - -______________________________________________________________________ - -- arg_name: dataset_id -- type_name: None -- description: Optional identifier for the dataset (for logging) - -______________________________________________________________________ - - **y_true**: List or array of true values - **y_pred**: List or array of predicted values - **dataset_id**: Optional identifier for the dataset (for logging) diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 532aa9e20..2e1887195 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -15,26 +15,6 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val **Parameters** -DEBUG: - -- arg_name: y_true -- type_name: None -- description: List or array of true values - -______________________________________________________________________ - -- arg_name: y_pred -- type_name: None -- description: List or array of predicted values - -______________________________________________________________________ - -- arg_name: dataset_id -- type_name: None -- description: Optional identifier for the dataset (for logging) - -______________________________________________________________________ - - **y_true**: List or array of true values - **y_pred**: List or array of predicted values - **dataset_id**: Optional identifier for the dataset (for logging) diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index c925a049d..1a5ba0268 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -15,26 +15,6 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val **Parameters** -DEBUG: - -- arg_name: y_true -- type_name: None -- description: List or array of true values - -______________________________________________________________________ - -- arg_name: y_pred -- type_name: None -- description: List or array of predicted values - -______________________________________________________________________ - -- arg_name: dataset_id -- type_name: None -- description: Optional identifier for the dataset (for logging) - -______________________________________________________________________ - - **y_true**: List or array of true values - **y_pred**: List or array of predicted values - **dataset_id**: Optional identifier for the dataset (for logging) diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index aa36877c3..f3ef5f60c 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -65,32 +65,6 @@ The test implements multiple threshold optimization methods: **Parameters** -DEBUG: - -- arg_name: dataset -- type_name: None -- description: VMDataset containing features and target - -______________________________________________________________________ - -- arg_name: model -- type_name: None -- description: VMModel containing predictions - -______________________________________________________________________ - -- arg_name: methods -- type_name: None -- description: List of methods to compare (default: ['youden', 'f1', 'precision_recall']) - -______________________________________________________________________ - -- arg_name: target_recall -- type_name: None -- description: Target recall value if using 'target_recall' method - -______________________________________________________________________ - - **dataset**: VMDataset containing features and target - **model**: VMModel containing predictions - **methods**: List of methods to compare (default: ['youden', 'f1', 'precision_recall']) @@ -116,32 +90,6 @@ Find the optimal classification threshold using various methods. **Parameters** -DEBUG: - -- arg_name: y_true -- type_name: None -- description: True binary labels - -______________________________________________________________________ - -- arg_name: y_prob -- type_name: None -- description: Predicted probabilities - -______________________________________________________________________ - -- arg_name: method -- type_name: None -- description: Method to use for finding optimal threshold - -______________________________________________________________________ - -- arg_name: target_recall -- type_name: None -- description: Required if method='target_recall' - -______________________________________________________________________ - - **y_true**: True binary labels - **y_prob**: Predicted probabilities - **method**: Method to use for finding optimal threshold diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index dcd67d27d..e99f6ed56 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -26,26 +26,6 @@ Plots two types of SHAP global importance (SHAP). **Parameters** -DEBUG: - -- arg_name: type\_ -- type_name: None -- description: The type of SHAP plot to generate. Must be "mean" or "summary". - -______________________________________________________________________ - -- arg_name: shap_values -- type_name: None -- description: The SHAP values to plot. - -______________________________________________________________________ - -- arg_name: x_test -- type_name: None -- description: The test data used to generate the SHAP values. - -______________________________________________________________________ - - **type\_**: The type of SHAP plot to generate. Must be "mean" or "summary". - **shap_values**: The SHAP values to plot. - **x_test**: The test data used to generate the SHAP values. @@ -66,20 +46,6 @@ Selects SHAP values for binary or multiclass classification. For regression mode **Parameters** -DEBUG: - -- arg_name: shap_values -- type_name: None -- description: The SHAP values returned by the SHAP explainer. For multiclass classification, this will be a list where each element corresponds to a class. For regression, this will be a single array of SHAP values. - -______________________________________________________________________ - -- arg_name: class_of_interest -- type_name: None -- description: The class index for which to retrieve SHAP values. If None (default), the function will assume binary classification and use class 1 by default. - -______________________________________________________________________ - - **shap_values**: The SHAP values returned by the SHAP explainer. For multiclass classification, this will be a list where each element corresponds to a class. For regression, this will be a single array of SHAP values. - **class_of_interest**: The class index for which to retrieve SHAP values. If None (default), the function will assume binary classification and use class 1 by default. diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 96b39624b..1d28772b6 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -118,20 +118,6 @@ Runs the test suite, renders the summary and sends the results to ValidMind **Parameters** -DEBUG: - -- arg_name: send -- type_name: bool -- description: Whether to send the results to ValidMind. Defaults to True. - -______________________________________________________________________ - -- arg_name: fail_fast -- type_name: bool -- description: Whether to stop running tests after the first failure. Defaults to False. - -______________________________________________________________________ - - **send** bool: Whether to send the results to ValidMind. Defaults to True. - **fail_fast** bool: Whether to stop running tests after the first failure. Defaults to False. @@ -153,80 +139,6 @@ This way we can support multiple dataset types but under the hood we only need t **Parameters** -DEBUG: - -- arg_name: raw_dataset -- type_name: np.ndarray -- description: The raw dataset as a NumPy array. - -______________________________________________________________________ - -- arg_name: input_id -- type_name: str -- description: Identifier for the dataset. - -______________________________________________________________________ - -- arg_name: index -- type_name: np.ndarray -- description: The raw dataset index as a NumPy array. - -______________________________________________________________________ - -- arg_name: columns -- type_name: Set[str] -- description: The column names of the dataset. - -______________________________________________________________________ - -- arg_name: target_column -- type_name: str -- description: The target column name of the dataset. - -______________________________________________________________________ - -- arg_name: feature_columns -- type_name: List[str] -- description: The feature column names of the dataset. - -______________________________________________________________________ - -- arg_name: feature_columns_numeric -- type_name: List[str] -- description: The numeric feature column names of the dataset. - -______________________________________________________________________ - -- arg_name: feature_columns_categorical -- type_name: List[str] -- description: The categorical feature column names of the dataset. - -______________________________________________________________________ - -- arg_name: text_column -- type_name: str -- description: The text column name of the dataset for NLP tasks. - -______________________________________________________________________ - -- arg_name: target_class_labels -- type_name: Dict -- description: The class labels for the target columns. - -______________________________________________________________________ - -- arg_name: df -- type_name: pd.DataFrame -- description: The dataset as a pandas DataFrame. - -______________________________________________________________________ - -- arg_name: extra_columns -- type_name: Dict -- description: Extra columns to include in the dataset. - -______________________________________________________________________ - - **raw_dataset** np.ndarray: The raw dataset as a NumPy array. - **input_id** str: Identifier for the dataset. - **index** np.ndarray: The raw dataset index as a NumPy array. @@ -252,20 +164,6 @@ Adds an extra column to the dataset without modifying the dataset `features` and **Parameters** -DEBUG: - -- arg_name: column_name -- type_name: str -- description: The name of the extra column. - -______________________________________________________________________ - -- arg_name: column_values -- type_name: np.ndarray -- description: The values of the extra column. - -______________________________________________________________________ - - **column_name** str: The name of the extra column. - **column_values** np.ndarray: The values of the extra column. @@ -279,50 +177,6 @@ Assign predictions and probabilities to the dataset. **Parameters** -DEBUG: - -- arg_name: model -- type_name: VMModel -- description: The model used to generate the predictions. - -______________________________________________________________________ - -- arg_name: prediction_column -- type_name: str -- description: The name of the column containing the predictions. Defaults to None. - -______________________________________________________________________ - -- arg_name: prediction_values -- type_name: list -- description: The values of the predictions. Defaults to None. - -______________________________________________________________________ - -- arg_name: probability_column -- type_name: str -- description: The name of the column containing the probabilities. Defaults to None. - -______________________________________________________________________ - -- arg_name: probability_values -- type_name: list -- description: The values of the probabilities. Defaults to None. - -______________________________________________________________________ - -- arg_name: prediction_probabilities -- type_name: list -- description: DEPRECATED: The values of the probabilities. Defaults to None. - -______________________________________________________________________ - -- arg_name: kwargs -- type_name: None -- description: Additional keyword arguments that will get passed through to the model's `predict` method. - -______________________________________________________________________ - - **model** VMModel: The model used to generate the predictions. - **prediction_column** str: The name of the column containing the predictions. Defaults to None. - **prediction_values** list: The values of the predictions. Defaults to None. @@ -365,15 +219,6 @@ Support options provided when passing an input to run_test or run_test_suite **Parameters** -DEBUG: - -- arg_name: \*\*kwargs -- type_name: None -- description: Options: -- columns: Filter columns in the dataset - -______________________________________________________________________ - - \*\***kwargs**: Options: - columns: Filter columns in the dataset @@ -407,14 +252,6 @@ Returns the predictions for a given model. Attempts to stack complex prediction **Parameters** -DEBUG: - -- arg_name: model -- type_name: VMModel -- description: The model whose predictions are sought. - -______________________________________________________________________ - - **model** VMModel: The model whose predictions are sought. **Returns** @@ -439,14 +276,6 @@ Returns the probabilities for a given model. **Parameters** -DEBUG: - -- arg_name: model -- type_name: str -- description: The ID of the model whose predictions are sought. - -______________________________________________________________________ - - **model** str: The ID of the model whose predictions are sought. **Returns** @@ -483,14 +312,6 @@ To allow options, just override this method in the subclass (see VMDataset) and **Parameters** -DEBUG: - -- arg_name: \*\*kwargs -- type_name: None -- description: Arbitrary keyword arguments that will be passed to the input object - -______________________________________________________________________ - - \*\***kwargs**: Arbitrary keyword arguments that will be passed to the input object **Returns** @@ -507,32 +328,6 @@ An base class that wraps a trained model instance and its associated data. **Parameters** -DEBUG: - -- arg_name: model -- type_name: object -- description: The trained model instance. Defaults to None. - -______________________________________________________________________ - -- arg_name: input_id -- type_name: str -- description: The input ID for the model. Defaults to None. - -______________________________________________________________________ - -- arg_name: attributes -- type_name: ModelAttributes -- description: The attributes of the model. Defaults to None. - -______________________________________________________________________ - -- arg_name: name -- type_name: str -- description: The name of the model. Defaults to the class name. - -______________________________________________________________________ - - **model** object: The trained model instance. Defaults to None. - **input_id** str: The input ID for the model. Defaults to None. - **attributes** ModelAttributes: The attributes of the model. Defaults to None. diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index ae319bf16..2d2ba30d7 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -6,6 +6,7 @@ from jinja2 import Environment, FileSystemLoader import mdformat from docstring_parser import parse, Style +from glob import glob def resolve_alias(member: Dict[str, Any], data: Dict[str, Any]) -> Dict[str, Any]: """Resolve an alias to its target member.""" @@ -74,8 +75,8 @@ def is_public(member: Dict[str, Any], module: Dict[str, Any], full_data: Dict[st name = member.get('name', '') # Add debug logging - print(f"\nChecking visibility for: {name}") - print(f"Is root: {is_root}") + # print(f"\nChecking visibility for: {name}") + # print(f"Is root: {is_root}") # Skip private members except __init__ and __post_init__ if name.startswith('_') and name not in {'__init__', '__post_init__'}: @@ -121,24 +122,23 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: continue if member['kind'] in ('function', 'class'): + # For root module items, always use reference/validmind.html path + file_prefix = 'reference/validmind' if is_root else file_path module_items.append({ 'text': f"{member['name']}()" if member['kind'] == 'function' else member['name'], - 'file': f"{file_path}.qmd#{member['name']}" + 'file': f"{file_prefix}.html#{member['name']}" }) elif member['kind'] == 'alias': target = resolve_alias(member, full_data) if target and target.get('docstring'): + file_prefix = 'reference/validmind' if is_root else file_path module_items.append({ 'text': f"{member['name']}()", - 'file': f"{file_path}.qmd#{member['name']}" + 'file': f"{file_prefix}.html#{member['name']}" }) if module_items: - # For root module, store under 'root' key - if is_root: - result['root'] = module_items - else: - result[module_name] = module_items + result['root' if is_root else module_name] = module_items # Recursively collect from submodules for member in sort_members(module['members'], module.get('name') == 'errors'): @@ -411,8 +411,44 @@ def generate_module_doc(module, full_data, env, output_dir): with open(output_path, 'w') as f: f.write(output) +def find_qmd_files(base_path: str) -> Dict[str, List[str]]: + """Find all .qmd files and their associated folders in docs/validmind.""" + print("\nEntering find_qmd_files()") + + base_path = os.path.abspath(base_path) + validmind_path = os.path.join(base_path, 'validmind') + print(f"Looking in: {validmind_path}") + + qmd_files = {} + + # Debug: Print full directory tree + for root, dirs, files in os.walk(validmind_path, followlinks=True): + rel_path = os.path.relpath(root, base_path) + print(f"\nDirectory: {rel_path}") + print(f" Subdirs: {dirs}") + print(f" Files: {[f for f in files if f.endswith('.qmd')]}") + + # Get module name from the filename instead of path + for file in files: + if file.endswith('.qmd'): + # Extract module name from the filename (remove .qmd extension) + module = file[:-4] + if module not in qmd_files: + qmd_files[module] = [] + + full_path = os.path.join(root, file) + ref_path = f"reference/{os.path.relpath(full_path, base_path)}".replace('\\', '/') + qmd_files[module].append(ref_path) + print(f"Found: {ref_path}") + + print(f"\nCollected qmd_files: {json.dumps(qmd_files, indent=2)}") + return qmd_files + def generate_docs(json_path: str, template_dir: str, output_dir: str): """Generate documentation from JSON data using templates.""" + print("\nEntering generate_docs()") + print(f"output_dir: {output_dir}") + # Load JSON data with open(json_path) as f: data = json.load(f) @@ -431,6 +467,13 @@ def generate_docs(json_path: str, template_dir: str, output_dir: str): env.globals['get_all_members'] = get_all_members env.globals['get_inherited_members'] = get_inherited_members + print("\nAbout to call find_qmd_files()") + qmd_files = find_qmd_files(output_dir) + print(f"Found QMD files: {qmd_files}") + + # Add to template context + env.globals['qmd_files'] = qmd_files + # Start processing from root module if 'validmind' in data: # First pass: Generate module documentation From 0c553729e64f1143b24430dfbd9b1c9040b6923a Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Tue, 28 Jan 2025 08:45:14 -0800 Subject: [PATCH 026/207] Save point with partial sidebar fixes --- scripts/generate_quarto_docs.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 2d2ba30d7..18a20c216 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -418,15 +418,25 @@ def find_qmd_files(base_path: str) -> Dict[str, List[str]]: base_path = os.path.abspath(base_path) validmind_path = os.path.join(base_path, 'validmind') print(f"Looking in: {validmind_path}") + print(f"Path exists: {os.path.exists(validmind_path)}") + print(f"Is directory: {os.path.isdir(validmind_path)}") + print(f"Directory contents: {os.listdir(validmind_path)}") qmd_files = {} # Debug: Print full directory tree + print("\nWalking directory tree:") for root, dirs, files in os.walk(validmind_path, followlinks=True): + print(f"\nDirectory: {root}") + print(f" Is directory: {os.path.isdir(root)}") + print(f" Directory exists: {os.path.exists(root)}") + print(f" Direct contents: {os.listdir(root)}") + print(f" Subdirs from walk: {dirs}") + print(f" Files from walk: {files}") + print(f" QMD files: {[f for f in files if f.endswith('.qmd')]}") + rel_path = os.path.relpath(root, base_path) - print(f"\nDirectory: {rel_path}") - print(f" Subdirs: {dirs}") - print(f" Files: {[f for f in files if f.endswith('.qmd')]}") + print(f" Relative path: {rel_path}") # Get module name from the filename instead of path for file in files: From 618efe6c955e5561372b6174915527ee31127dfc Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Tue, 28 Jan 2025 11:44:09 -0800 Subject: [PATCH 027/207] Sidebar fragment contains correct file embeds --- docs/_sidebar.yml | 18 +- docs/templates/sidebar.qmd.jinja2 | 13 +- docs/validmind.html | 813 ------- ...p-973236bd072d72a04ee9cd82dcc9cb29.min.css | 12 - .../libs/bootstrap/bootstrap-icons.css | 2078 ----------------- .../libs/bootstrap/bootstrap-icons.woff | Bin 176200 -> 0 bytes .../libs/bootstrap/bootstrap.min.js | 7 - .../libs/clipboard/clipboard.min.js | 7 - .../libs/quarto-html/anchor.min.js | 9 - .../libs/quarto-html/popper.min.js | 6 - ...hting-549806ee2085284f45b00abea8c6df48.css | 205 -- .../libs/quarto-html/quarto.js | 911 -------- .../libs/quarto-html/tippy.css | 1 - .../libs/quarto-html/tippy.umd.min.js | 2 - scripts/generate_quarto_docs.py | 97 +- 15 files changed, 53 insertions(+), 4126 deletions(-) delete mode 100644 docs/validmind.html delete mode 100644 docs/validmind_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css delete mode 100644 docs/validmind_files/libs/bootstrap/bootstrap-icons.css delete mode 100644 docs/validmind_files/libs/bootstrap/bootstrap-icons.woff delete mode 100644 docs/validmind_files/libs/bootstrap/bootstrap.min.js delete mode 100644 docs/validmind_files/libs/clipboard/clipboard.min.js delete mode 100644 docs/validmind_files/libs/quarto-html/anchor.min.js delete mode 100644 docs/validmind_files/libs/quarto-html/popper.min.js delete mode 100644 docs/validmind_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css delete mode 100644 docs/validmind_files/libs/quarto-html/quarto.js delete mode 100644 docs/validmind_files/libs/quarto-html/tippy.css delete mode 100644 docs/validmind_files/libs/quarto-html/tippy.umd.min.js diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml index 13f5bc927..f94c979f2 100644 --- a/docs/_sidebar.yml +++ b/docs/_sidebar.yml @@ -36,15 +36,21 @@ website: # All module documentation pages - text: "Submodules" - text: "datasets" - file: validmind/datasets.qmd + file: reference/validmind/datasets.qmd + contents: + - reference/validmind/datasets/** - text: "errors" - file: validmind/errors.qmd + file: reference/validmind/errors.qmd - text: "test_suites" - file: validmind/test_suites.qmd + file: reference/validmind/test_suites.qmd + contents: + - reference/validmind/test_suites/** - text: "tests" - file: validmind/tests.qmd + file: reference/validmind/tests.qmd + contents: + - reference/validmind/tests/** - text: "unit_metrics" - file: validmind/unit_metrics.qmd + file: reference/validmind/unit_metrics.qmd - text: "vm_models" - file: validmind/vm_models.qmd + file: reference/validmind/vm_models.qmd \ No newline at end of file diff --git a/docs/templates/sidebar.qmd.jinja2 b/docs/templates/sidebar.qmd.jinja2 index 3e6f4ce7a..6617a2045 100644 --- a/docs/templates/sidebar.qmd.jinja2 +++ b/docs/templates/sidebar.qmd.jinja2 @@ -19,15 +19,12 @@ website: - text: "Submodules" {% for member in module.members | sort_members %} {% if is_public(member, module, full_data, is_root) and member.kind == "module" %} - - text: "{{ member.name }}" - file: validmind/{{ member.name }}.qmd - {% set module_files = qmd_files.get(member.name, []) %} - {% if module_files %} + {% set module_name = member.name %} + - text: "{{ module_name }}" + file: reference/validmind/{{ module_name }}.qmd + {% if module_name in ['datasets', 'test_suites', 'tests'] %} contents: - {% for file in module_files %} - - text: "{{ file.split('/')[-1].replace('.qmd', '') }}" - file: {{ file }} - {% endfor %} + - reference/validmind/{{ module_name }}/** {% endif %} {% endif %} {% endfor %} \ No newline at end of file diff --git a/docs/validmind.html b/docs/validmind.html deleted file mode 100644 index 17f03fe64..000000000 --- a/docs/validmind.html +++ /dev/null @@ -1,813 +0,0 @@ - - - - - - - - - -validmind - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/validmind_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css b/docs/validmind_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css deleted file mode 100644 index d6064cbbb..000000000 --- a/docs/validmind_files/libs/bootstrap/bootstrap-973236bd072d72a04ee9cd82dcc9cb29.min.css +++ /dev/null @@ -1,12 +0,0 @@ -/*! - * Bootstrap v5.3.1 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root,[data-bs-theme=light]{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-black: #000;--bs-white: #ffffff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-gray-100: #f8f9fa;--bs-gray-200: #e9ecef;--bs-gray-300: #dee2e6;--bs-gray-400: #ced4da;--bs-gray-500: #adb5bd;--bs-gray-600: #6c757d;--bs-gray-700: #495057;--bs-gray-800: #343a40;--bs-gray-900: #212529;--bs-default: #dee2e6;--bs-primary: #0d6efd;--bs-secondary: #6c757d;--bs-success: #198754;--bs-info: #0dcaf0;--bs-warning: #ffc107;--bs-danger: #dc3545;--bs-light: #f8f9fa;--bs-dark: #212529;--bs-default-rgb: 222, 226, 230;--bs-primary-rgb: 13, 110, 253;--bs-secondary-rgb: 108, 117, 125;--bs-success-rgb: 25, 135, 84;--bs-info-rgb: 13, 202, 240;--bs-warning-rgb: 255, 193, 7;--bs-danger-rgb: 220, 53, 69;--bs-light-rgb: 248, 249, 250;--bs-dark-rgb: 33, 37, 41;--bs-primary-text-emphasis: #052c65;--bs-secondary-text-emphasis: #2b2f32;--bs-success-text-emphasis: #0a3622;--bs-info-text-emphasis: #055160;--bs-warning-text-emphasis: #664d03;--bs-danger-text-emphasis: #58151c;--bs-light-text-emphasis: #495057;--bs-dark-text-emphasis: #495057;--bs-primary-bg-subtle: #cfe2ff;--bs-secondary-bg-subtle: #e2e3e5;--bs-success-bg-subtle: #d1e7dd;--bs-info-bg-subtle: #cff4fc;--bs-warning-bg-subtle: #fff3cd;--bs-danger-bg-subtle: #f8d7da;--bs-light-bg-subtle: #fcfcfd;--bs-dark-bg-subtle: #ced4da;--bs-primary-border-subtle: #9ec5fe;--bs-secondary-border-subtle: #c4c8cb;--bs-success-border-subtle: #a3cfbb;--bs-info-border-subtle: #9eeaf9;--bs-warning-border-subtle: #ffe69c;--bs-danger-border-subtle: #f1aeb5;--bs-light-border-subtle: #e9ecef;--bs-dark-border-subtle: #adb5bd;--bs-white-rgb: 255, 255, 255;--bs-black-rgb: 0, 0, 0;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-root-font-size: 17px;--bs-body-font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-body-font-size:1rem;--bs-body-font-weight: 400;--bs-body-line-height: 1.5;--bs-body-color: #212529;--bs-body-color-rgb: 33, 37, 41;--bs-body-bg: #ffffff;--bs-body-bg-rgb: 255, 255, 255;--bs-emphasis-color: #000;--bs-emphasis-color-rgb: 0, 0, 0;--bs-secondary-color: rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb: 33, 37, 41;--bs-secondary-bg: #e9ecef;--bs-secondary-bg-rgb: 233, 236, 239;--bs-tertiary-color: rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb: 33, 37, 41;--bs-tertiary-bg: #f8f9fa;--bs-tertiary-bg-rgb: 248, 249, 250;--bs-heading-color: inherit;--bs-link-color: #0d6efd;--bs-link-color-rgb: 13, 110, 253;--bs-link-decoration: underline;--bs-link-hover-color: #0a58ca;--bs-link-hover-color-rgb: 10, 88, 202;--bs-code-color: #7d12ba;--bs-highlight-bg: #fff3cd;--bs-border-width: 1px;--bs-border-style: solid;--bs-border-color: white;--bs-border-color-translucent: rgba(0, 0, 0, 0.175);--bs-border-radius: 0.375rem;--bs-border-radius-sm: 0.25rem;--bs-border-radius-lg: 0.5rem;--bs-border-radius-xl: 1rem;--bs-border-radius-xxl: 2rem;--bs-border-radius-2xl: var(--bs-border-radius-xxl);--bs-border-radius-pill: 50rem;--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width: 0.25rem;--bs-focus-ring-opacity: 0.25;--bs-focus-ring-color: rgba(13, 110, 253, 0.25);--bs-form-valid-color: #198754;--bs-form-valid-border-color: #198754;--bs-form-invalid-color: #dc3545;--bs-form-invalid-border-color: #dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color: #dee2e6;--bs-body-color-rgb: 222, 226, 230;--bs-body-bg: #212529;--bs-body-bg-rgb: 33, 37, 41;--bs-emphasis-color: #ffffff;--bs-emphasis-color-rgb: 255, 255, 255;--bs-secondary-color: rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb: 222, 226, 230;--bs-secondary-bg: #343a40;--bs-secondary-bg-rgb: 52, 58, 64;--bs-tertiary-color: rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb: 222, 226, 230;--bs-tertiary-bg: #2b3035;--bs-tertiary-bg-rgb: 43, 48, 53;--bs-primary-text-emphasis: #6ea8fe;--bs-secondary-text-emphasis: #a7acb1;--bs-success-text-emphasis: #75b798;--bs-info-text-emphasis: #6edff6;--bs-warning-text-emphasis: #ffda6a;--bs-danger-text-emphasis: #ea868f;--bs-light-text-emphasis: #f8f9fa;--bs-dark-text-emphasis: #dee2e6;--bs-primary-bg-subtle: #031633;--bs-secondary-bg-subtle: #161719;--bs-success-bg-subtle: #051b11;--bs-info-bg-subtle: #032830;--bs-warning-bg-subtle: #332701;--bs-danger-bg-subtle: #2c0b0e;--bs-light-bg-subtle: #343a40;--bs-dark-bg-subtle: #1a1d20;--bs-primary-border-subtle: #084298;--bs-secondary-border-subtle: #41464b;--bs-success-border-subtle: #0f5132;--bs-info-border-subtle: #087990;--bs-warning-border-subtle: #997404;--bs-danger-border-subtle: #842029;--bs-light-border-subtle: #495057;--bs-dark-border-subtle: #343a40;--bs-heading-color: inherit;--bs-link-color: #6ea8fe;--bs-link-hover-color: #8bb9fe;--bs-link-color-rgb: 110, 168, 254;--bs-link-hover-color-rgb: 139, 185, 254;--bs-code-color: white;--bs-border-color: #495057;--bs-border-color-translucent: rgba(255, 255, 255, 0.15);--bs-form-valid-color: #75b798;--bs-form-valid-border-color: #75b798;--bs-form-invalid-color: #ea868f;--bs-form-invalid-border-color: #ea868f}*,*::before,*::after{box-sizing:border-box}:root{font-size:var(--bs-root-font-size)}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}h1,.h1{font-size:calc(1.325rem + 0.9vw)}@media(min-width: 1200px){h1,.h1{font-size:2rem}}h2,.h2{font-size:calc(1.29rem + 0.48vw)}@media(min-width: 1200px){h2,.h2{font-size:1.65rem}}h3,.h3{font-size:calc(1.27rem + 0.24vw)}@media(min-width: 1200px){h3,.h3{font-size:1.45rem}}h4,.h4{font-size:1.25rem}h5,.h5{font-size:1.1rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{text-decoration:underline dotted;-webkit-text-decoration:underline dotted;-moz-text-decoration:underline dotted;-ms-text-decoration:underline dotted;-o-text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem;padding:.625rem 1.25rem;border-left:.25rem solid #e9ecef}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}b,strong{font-weight:bolder}small,.small{font-size:0.875em}mark,.mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:0.75em;line-height:0;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}a{color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}a:hover{--bs-link-color-rgb: var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:0.875em;color:#000;background-color:#f8f9fa;line-height:1.5;padding:.5rem;border:1px solid var(--bs-border-color, white);border-radius:.375rem}pre code{background-color:rgba(0,0,0,0);font-size:inherit;color:inherit;word-break:normal}code{font-size:0.875em;color:var(--bs-code-color);background-color:#f8f9fa;border-radius:.375rem;padding:.125rem .25rem;word-wrap:break-word}a>code{color:inherit}kbd{padding:.4rem .4rem;font-size:0.875em;color:#fff;background-color:#212529;border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:rgba(33,37,41,.75);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none !important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + 0.3vw);line-height:inherit}@media(min-width: 1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none !important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media(min-width: 1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:0.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:0.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #fff;border-radius:.375rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:0.875em;color:rgba(33,37,41,.75)}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x: 1.5rem;--bs-gutter-y: 0;width:100%;padding-right:calc(var(--bs-gutter-x)*.5);padding-left:calc(var(--bs-gutter-x)*.5);margin-right:auto;margin-left:auto}@media(min-width: 576px){.container-sm,.container{max-width:540px}}@media(min-width: 768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width: 992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width: 1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media(min-width: 1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs: 0;--bs-breakpoint-sm: 576px;--bs-breakpoint-md: 768px;--bs-breakpoint-lg: 992px;--bs-breakpoint-xl: 1200px;--bs-breakpoint-xxl: 1400px}.grid{display:grid;grid-template-rows:repeat(var(--bs-rows, 1), 1fr);grid-template-columns:repeat(var(--bs-columns, 12), 1fr);gap:var(--bs-gap, 1.5rem)}.grid .g-col-1{grid-column:auto/span 1}.grid .g-col-2{grid-column:auto/span 2}.grid .g-col-3{grid-column:auto/span 3}.grid .g-col-4{grid-column:auto/span 4}.grid .g-col-5{grid-column:auto/span 5}.grid .g-col-6{grid-column:auto/span 6}.grid .g-col-7{grid-column:auto/span 7}.grid .g-col-8{grid-column:auto/span 8}.grid .g-col-9{grid-column:auto/span 9}.grid .g-col-10{grid-column:auto/span 10}.grid .g-col-11{grid-column:auto/span 11}.grid .g-col-12{grid-column:auto/span 12}.grid .g-start-1{grid-column-start:1}.grid .g-start-2{grid-column-start:2}.grid .g-start-3{grid-column-start:3}.grid .g-start-4{grid-column-start:4}.grid .g-start-5{grid-column-start:5}.grid .g-start-6{grid-column-start:6}.grid .g-start-7{grid-column-start:7}.grid .g-start-8{grid-column-start:8}.grid .g-start-9{grid-column-start:9}.grid .g-start-10{grid-column-start:10}.grid .g-start-11{grid-column-start:11}@media(min-width: 576px){.grid .g-col-sm-1{grid-column:auto/span 1}.grid .g-col-sm-2{grid-column:auto/span 2}.grid .g-col-sm-3{grid-column:auto/span 3}.grid .g-col-sm-4{grid-column:auto/span 4}.grid .g-col-sm-5{grid-column:auto/span 5}.grid .g-col-sm-6{grid-column:auto/span 6}.grid .g-col-sm-7{grid-column:auto/span 7}.grid .g-col-sm-8{grid-column:auto/span 8}.grid .g-col-sm-9{grid-column:auto/span 9}.grid .g-col-sm-10{grid-column:auto/span 10}.grid .g-col-sm-11{grid-column:auto/span 11}.grid .g-col-sm-12{grid-column:auto/span 12}.grid .g-start-sm-1{grid-column-start:1}.grid .g-start-sm-2{grid-column-start:2}.grid .g-start-sm-3{grid-column-start:3}.grid .g-start-sm-4{grid-column-start:4}.grid .g-start-sm-5{grid-column-start:5}.grid .g-start-sm-6{grid-column-start:6}.grid .g-start-sm-7{grid-column-start:7}.grid .g-start-sm-8{grid-column-start:8}.grid .g-start-sm-9{grid-column-start:9}.grid .g-start-sm-10{grid-column-start:10}.grid .g-start-sm-11{grid-column-start:11}}@media(min-width: 768px){.grid .g-col-md-1{grid-column:auto/span 1}.grid .g-col-md-2{grid-column:auto/span 2}.grid .g-col-md-3{grid-column:auto/span 3}.grid .g-col-md-4{grid-column:auto/span 4}.grid .g-col-md-5{grid-column:auto/span 5}.grid .g-col-md-6{grid-column:auto/span 6}.grid .g-col-md-7{grid-column:auto/span 7}.grid .g-col-md-8{grid-column:auto/span 8}.grid .g-col-md-9{grid-column:auto/span 9}.grid .g-col-md-10{grid-column:auto/span 10}.grid .g-col-md-11{grid-column:auto/span 11}.grid .g-col-md-12{grid-column:auto/span 12}.grid .g-start-md-1{grid-column-start:1}.grid .g-start-md-2{grid-column-start:2}.grid .g-start-md-3{grid-column-start:3}.grid .g-start-md-4{grid-column-start:4}.grid .g-start-md-5{grid-column-start:5}.grid .g-start-md-6{grid-column-start:6}.grid .g-start-md-7{grid-column-start:7}.grid .g-start-md-8{grid-column-start:8}.grid .g-start-md-9{grid-column-start:9}.grid .g-start-md-10{grid-column-start:10}.grid .g-start-md-11{grid-column-start:11}}@media(min-width: 992px){.grid .g-col-lg-1{grid-column:auto/span 1}.grid .g-col-lg-2{grid-column:auto/span 2}.grid .g-col-lg-3{grid-column:auto/span 3}.grid .g-col-lg-4{grid-column:auto/span 4}.grid .g-col-lg-5{grid-column:auto/span 5}.grid .g-col-lg-6{grid-column:auto/span 6}.grid .g-col-lg-7{grid-column:auto/span 7}.grid .g-col-lg-8{grid-column:auto/span 8}.grid .g-col-lg-9{grid-column:auto/span 9}.grid .g-col-lg-10{grid-column:auto/span 10}.grid .g-col-lg-11{grid-column:auto/span 11}.grid .g-col-lg-12{grid-column:auto/span 12}.grid .g-start-lg-1{grid-column-start:1}.grid .g-start-lg-2{grid-column-start:2}.grid .g-start-lg-3{grid-column-start:3}.grid .g-start-lg-4{grid-column-start:4}.grid .g-start-lg-5{grid-column-start:5}.grid .g-start-lg-6{grid-column-start:6}.grid .g-start-lg-7{grid-column-start:7}.grid .g-start-lg-8{grid-column-start:8}.grid .g-start-lg-9{grid-column-start:9}.grid .g-start-lg-10{grid-column-start:10}.grid .g-start-lg-11{grid-column-start:11}}@media(min-width: 1200px){.grid .g-col-xl-1{grid-column:auto/span 1}.grid .g-col-xl-2{grid-column:auto/span 2}.grid .g-col-xl-3{grid-column:auto/span 3}.grid .g-col-xl-4{grid-column:auto/span 4}.grid .g-col-xl-5{grid-column:auto/span 5}.grid .g-col-xl-6{grid-column:auto/span 6}.grid .g-col-xl-7{grid-column:auto/span 7}.grid .g-col-xl-8{grid-column:auto/span 8}.grid .g-col-xl-9{grid-column:auto/span 9}.grid .g-col-xl-10{grid-column:auto/span 10}.grid .g-col-xl-11{grid-column:auto/span 11}.grid .g-col-xl-12{grid-column:auto/span 12}.grid .g-start-xl-1{grid-column-start:1}.grid .g-start-xl-2{grid-column-start:2}.grid .g-start-xl-3{grid-column-start:3}.grid .g-start-xl-4{grid-column-start:4}.grid .g-start-xl-5{grid-column-start:5}.grid .g-start-xl-6{grid-column-start:6}.grid .g-start-xl-7{grid-column-start:7}.grid .g-start-xl-8{grid-column-start:8}.grid .g-start-xl-9{grid-column-start:9}.grid .g-start-xl-10{grid-column-start:10}.grid .g-start-xl-11{grid-column-start:11}}@media(min-width: 1400px){.grid .g-col-xxl-1{grid-column:auto/span 1}.grid .g-col-xxl-2{grid-column:auto/span 2}.grid .g-col-xxl-3{grid-column:auto/span 3}.grid .g-col-xxl-4{grid-column:auto/span 4}.grid .g-col-xxl-5{grid-column:auto/span 5}.grid .g-col-xxl-6{grid-column:auto/span 6}.grid .g-col-xxl-7{grid-column:auto/span 7}.grid .g-col-xxl-8{grid-column:auto/span 8}.grid .g-col-xxl-9{grid-column:auto/span 9}.grid .g-col-xxl-10{grid-column:auto/span 10}.grid .g-col-xxl-11{grid-column:auto/span 11}.grid .g-col-xxl-12{grid-column:auto/span 12}.grid .g-start-xxl-1{grid-column-start:1}.grid .g-start-xxl-2{grid-column-start:2}.grid .g-start-xxl-3{grid-column-start:3}.grid .g-start-xxl-4{grid-column-start:4}.grid .g-start-xxl-5{grid-column-start:5}.grid .g-start-xxl-6{grid-column-start:6}.grid .g-start-xxl-7{grid-column-start:7}.grid .g-start-xxl-8{grid-column-start:8}.grid .g-start-xxl-9{grid-column-start:9}.grid .g-start-xxl-10{grid-column-start:10}.grid .g-start-xxl-11{grid-column-start:11}}.table{--bs-table-color-type: initial;--bs-table-bg-type: initial;--bs-table-color-state: initial;--bs-table-bg-state: initial;--bs-table-color: #212529;--bs-table-bg: #ffffff;--bs-table-border-color: white;--bs-table-accent-bg: transparent;--bs-table-striped-color: #212529;--bs-table-striped-bg: rgba(0, 0, 0, 0.05);--bs-table-active-color: #212529;--bs-table-active-bg: rgba(0, 0, 0, 0.1);--bs-table-hover-color: #212529;--bs-table-hover-bg: rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(1px*2) solid #909294}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(even){--bs-table-color-type: var(--bs-table-striped-color);--bs-table-bg-type: var(--bs-table-striped-bg)}.table-active{--bs-table-color-state: var(--bs-table-active-color);--bs-table-bg-state: var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state: var(--bs-table-hover-color);--bs-table-bg-state: var(--bs-table-hover-bg)}.table-primary{--bs-table-color: #000;--bs-table-bg: #cfe2ff;--bs-table-border-color: #bacbe6;--bs-table-striped-bg: #c5d7f2;--bs-table-striped-color: #000;--bs-table-active-bg: #bacbe6;--bs-table-active-color: #000;--bs-table-hover-bg: #bfd1ec;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color: #000;--bs-table-bg: #e2e3e5;--bs-table-border-color: #cbccce;--bs-table-striped-bg: #d7d8da;--bs-table-striped-color: #000;--bs-table-active-bg: #cbccce;--bs-table-active-color: #000;--bs-table-hover-bg: #d1d2d4;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color: #000;--bs-table-bg: #d1e7dd;--bs-table-border-color: #bcd0c7;--bs-table-striped-bg: #c7dbd2;--bs-table-striped-color: #000;--bs-table-active-bg: #bcd0c7;--bs-table-active-color: #000;--bs-table-hover-bg: #c1d6cc;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color: #000;--bs-table-bg: #cff4fc;--bs-table-border-color: #badce3;--bs-table-striped-bg: #c5e8ef;--bs-table-striped-color: #000;--bs-table-active-bg: #badce3;--bs-table-active-color: #000;--bs-table-hover-bg: #bfe2e9;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color: #000;--bs-table-bg: #fff3cd;--bs-table-border-color: #e6dbb9;--bs-table-striped-bg: #f2e7c3;--bs-table-striped-color: #000;--bs-table-active-bg: #e6dbb9;--bs-table-active-color: #000;--bs-table-hover-bg: #ece1be;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color: #000;--bs-table-bg: #f8d7da;--bs-table-border-color: #dfc2c4;--bs-table-striped-bg: #eccccf;--bs-table-striped-color: #000;--bs-table-active-bg: #dfc2c4;--bs-table-active-color: #000;--bs-table-hover-bg: #e5c7ca;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color: #000;--bs-table-bg: #f8f9fa;--bs-table-border-color: #dfe0e1;--bs-table-striped-bg: #ecedee;--bs-table-striped-color: #000;--bs-table-active-bg: #dfe0e1;--bs-table-active-color: #000;--bs-table-hover-bg: #e5e6e7;--bs-table-hover-color: #000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color: #ffffff;--bs-table-bg: #212529;--bs-table-border-color: #373b3e;--bs-table-striped-bg: #2c3034;--bs-table-striped-color: #ffffff;--bs-table-active-bg: #373b3e;--bs-table-active-color: #ffffff;--bs-table-hover-bg: #323539;--bs-table-hover-color: #ffffff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media(max-width: 575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media(max-width: 1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label,.shiny-input-container .control-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(0.375rem + 1px);padding-bottom:calc(0.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(0.5rem + 1px);padding-bottom:calc(0.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(0.25rem + 1px);padding-bottom:calc(0.25rem + 1px);font-size:0.875rem}.form-text{margin-top:.25rem;font-size:0.875em;color:rgba(33,37,41,.75)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-clip:padding-box;border:1px solid #fff;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::placeholder{color:rgba(33,37,41,.75);opacity:1}.form-control:disabled{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-0.375rem -0.75rem;margin-inline-end:.75rem;color:#212529;background-color:#f8f9fa;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e9ecef}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:rgba(0,0,0,0);border:solid rgba(0,0,0,0);border-width:1px 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2));padding:.25rem .5rem;font-size:0.875rem;border-radius:.25rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-0.25rem -0.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-0.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + 0.75rem + calc(1px * 2))}textarea.form-control-sm{min-height:calc(1.5em + 0.5rem + calc(1px * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(1px * 2))}.form-control-color{width:3rem;height:calc(1.5em + 0.75rem + calc(1px * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0 !important;border-radius:.375rem}.form-control-color::-webkit-color-swatch{border:0 !important;border-radius:.375rem}.form-control-color.form-control-sm{height:calc(1.5em + 0.5rem + calc(1px * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(1px * 2))}.form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#fff;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon, none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #fff;border-radius:.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:rgba(0,0,0,0);text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:0.875rem;border-radius:.25rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.5rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check,.shiny-input-container .checkbox,.shiny-input-container .radio{display:block;min-height:1.5rem;padding-left:0;margin-bottom:.125rem}.form-check .form-check-input,.form-check .shiny-input-container .checkbox input,.form-check .shiny-input-container .radio input,.shiny-input-container .checkbox .form-check-input,.shiny-input-container .checkbox .shiny-input-container .checkbox input,.shiny-input-container .checkbox .shiny-input-container .radio input,.shiny-input-container .radio .form-check-input,.shiny-input-container .radio .shiny-input-container .checkbox input,.shiny-input-container .radio .shiny-input-container .radio input{float:left;margin-left:0}.form-check-reverse{padding-right:0;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:0;margin-left:0}.form-check-input,.shiny-input-container .checkbox input,.shiny-input-container .checkbox-inline input,.shiny-input-container .radio input,.shiny-input-container .radio-inline input{--bs-form-check-bg: #ffffff;width:1em;height:1em;margin-top:.25em;vertical-align:top;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid #fff;print-color-adjust:exact}.form-check-input[type=checkbox],.shiny-input-container .checkbox input[type=checkbox],.shiny-input-container .checkbox-inline input[type=checkbox],.shiny-input-container .radio input[type=checkbox],.shiny-input-container .radio-inline input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio],.shiny-input-container .checkbox input[type=radio],.shiny-input-container .checkbox-inline input[type=radio],.shiny-input-container .radio input[type=radio],.shiny-input-container .radio-inline input[type=radio]{border-radius:50%}.form-check-input:active,.shiny-input-container .checkbox input:active,.shiny-input-container .checkbox-inline input:active,.shiny-input-container .radio input:active,.shiny-input-container .radio-inline input:active{filter:brightness(90%)}.form-check-input:focus,.shiny-input-container .checkbox input:focus,.shiny-input-container .checkbox-inline input:focus,.shiny-input-container .radio input:focus,.shiny-input-container .radio-inline input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked,.shiny-input-container .checkbox input:checked,.shiny-input-container .checkbox-inline input:checked,.shiny-input-container .radio input:checked,.shiny-input-container .radio-inline input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox],.shiny-input-container .checkbox input:checked[type=checkbox],.shiny-input-container .checkbox-inline input:checked[type=checkbox],.shiny-input-container .radio input:checked[type=checkbox],.shiny-input-container .radio-inline input:checked[type=checkbox]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio],.shiny-input-container .checkbox input:checked[type=radio],.shiny-input-container .checkbox-inline input:checked[type=radio],.shiny-input-container .radio input:checked[type=radio],.shiny-input-container .radio-inline input:checked[type=radio]{--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23ffffff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate,.shiny-input-container .checkbox input[type=checkbox]:indeterminate,.shiny-input-container .checkbox-inline input[type=checkbox]:indeterminate,.shiny-input-container .radio input[type=checkbox]:indeterminate,.shiny-input-container .radio-inline input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23ffffff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled,.shiny-input-container .checkbox input:disabled,.shiny-input-container .checkbox-inline input:disabled,.shiny-input-container .radio input:disabled,.shiny-input-container .radio-inline input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input[disabled]~span,.form-check-input:disabled~.form-check-label,.form-check-input:disabled~span,.shiny-input-container .checkbox input[disabled]~.form-check-label,.shiny-input-container .checkbox input[disabled]~span,.shiny-input-container .checkbox input:disabled~.form-check-label,.shiny-input-container .checkbox input:disabled~span,.shiny-input-container .checkbox-inline input[disabled]~.form-check-label,.shiny-input-container .checkbox-inline input[disabled]~span,.shiny-input-container .checkbox-inline input:disabled~.form-check-label,.shiny-input-container .checkbox-inline input:disabled~span,.shiny-input-container .radio input[disabled]~.form-check-label,.shiny-input-container .radio input[disabled]~span,.shiny-input-container .radio input:disabled~.form-check-label,.shiny-input-container .radio input:disabled~span,.shiny-input-container .radio-inline input[disabled]~.form-check-label,.shiny-input-container .radio-inline input[disabled]~span,.shiny-input-container .radio-inline input:disabled~.form-check-label,.shiny-input-container .radio-inline input:disabled~span{cursor:default;opacity:.5}.form-check-label,.shiny-input-container .checkbox label,.shiny-input-container .checkbox-inline label,.shiny-input-container .radio label,.shiny-input-container .radio-inline label{cursor:pointer}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23ffffff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:rgba(0,0,0,0)}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-0.25rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;appearance:none;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;-o-appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:rgba(0,0,0,0);cursor:pointer;background-color:#f8f9fa;border-color:rgba(0,0,0,0);border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(33,37,41,.75)}.form-range:disabled::-moz-range-thumb{background-color:rgba(33,37,41,.75)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(1px * 2));min-height:calc(3.5rem + calc(1px * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:1px solid rgba(0,0,0,0);transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media(prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:rgba(0,0,0,0)}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-control-plaintext~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem .375rem;z-index:-1;height:1.5em;content:"";background-color:#fff;border-radius:.375rem}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb), 0.65);transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.form-floating>:disabled~label::after,.form-floating>.form-control:disabled~label::after{background-color:#e9ecef}.input-group{position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:stretch;-webkit-align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#f8f9fa;border:1px solid #fff;border-radius:.375rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.5rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:0.875rem;border-radius:.25rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(1px*-1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#198754;border-radius:.375rem}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#198754;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#198754}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#198754}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#198754}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:0.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:0.875rem;color:#fff;background-color:#dc3545;border-radius:.375rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#dc3545;padding-right:calc(1.5em + 0.75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(0.375em + 0.1875rem) center;background-size:calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + 0.75rem);background-position:top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#dc3545}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(0.75em + 0.375rem) calc(0.75em + 0.375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(3rem + calc(1.5em + 0.75rem))}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#dc3545}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#dc3545}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x: 0.75rem;--bs-btn-padding-y: 0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight: 400;--bs-btn-line-height: 1.5;--bs-btn-color: #212529;--bs-btn-bg: transparent;--bs-btn-border-width: 1px;--bs-btn-border-color: transparent;--bs-btn-border-radius: 0.375rem;--bs-btn-hover-border-color: transparent;--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity: 0.65;--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-default{--bs-btn-color: #000;--bs-btn-bg: #dee2e6;--bs-btn-border-color: #dee2e6;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #e3e6ea;--bs-btn-hover-border-color: #e1e5e9;--bs-btn-focus-shadow-rgb: 189, 192, 196;--bs-btn-active-color: #000;--bs-btn-active-bg: #e5e8eb;--bs-btn-active-border-color: #e1e5e9;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #dee2e6;--bs-btn-disabled-border-color: #dee2e6}.btn-primary{--bs-btn-color: #ffffff;--bs-btn-bg: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #0b5ed7;--bs-btn-hover-border-color: #0a58ca;--bs-btn-focus-shadow-rgb: 49, 132, 253;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #0a58ca;--bs-btn-active-border-color: #0a53be;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #0d6efd;--bs-btn-disabled-border-color: #0d6efd}.btn-secondary{--bs-btn-color: #ffffff;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #5c636a;--bs-btn-hover-border-color: #565e64;--bs-btn-focus-shadow-rgb: 130, 138, 145;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #565e64;--bs-btn-active-border-color: #51585e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}.btn-success{--bs-btn-color: #ffffff;--bs-btn-bg: #198754;--bs-btn-border-color: #198754;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #157347;--bs-btn-hover-border-color: #146c43;--bs-btn-focus-shadow-rgb: 60, 153, 110;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #146c43;--bs-btn-active-border-color: #13653f;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #198754;--bs-btn-disabled-border-color: #198754}.btn-info{--bs-btn-color: #000;--bs-btn-bg: #0dcaf0;--bs-btn-border-color: #0dcaf0;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #31d2f2;--bs-btn-hover-border-color: #25cff2;--bs-btn-focus-shadow-rgb: 11, 172, 204;--bs-btn-active-color: #000;--bs-btn-active-bg: #3dd5f3;--bs-btn-active-border-color: #25cff2;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #0dcaf0;--bs-btn-disabled-border-color: #0dcaf0}.btn-warning{--bs-btn-color: #000;--bs-btn-bg: #ffc107;--bs-btn-border-color: #ffc107;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ffca2c;--bs-btn-hover-border-color: #ffc720;--bs-btn-focus-shadow-rgb: 217, 164, 6;--bs-btn-active-color: #000;--bs-btn-active-bg: #ffcd39;--bs-btn-active-border-color: #ffc720;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #ffc107;--bs-btn-disabled-border-color: #ffc107}.btn-danger{--bs-btn-color: #ffffff;--bs-btn-bg: #dc3545;--bs-btn-border-color: #dc3545;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #bb2d3b;--bs-btn-hover-border-color: #b02a37;--bs-btn-focus-shadow-rgb: 225, 83, 97;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #b02a37;--bs-btn-active-border-color: #a52834;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #dc3545;--bs-btn-disabled-border-color: #dc3545}.btn-light{--bs-btn-color: #000;--bs-btn-bg: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #d3d4d5;--bs-btn-hover-border-color: #c6c7c8;--bs-btn-focus-shadow-rgb: 211, 212, 213;--bs-btn-active-color: #000;--bs-btn-active-bg: #c6c7c8;--bs-btn-active-border-color: #babbbc;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #000;--bs-btn-disabled-bg: #f8f9fa;--bs-btn-disabled-border-color: #f8f9fa}.btn-dark{--bs-btn-color: #ffffff;--bs-btn-bg: #212529;--bs-btn-border-color: #212529;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #424649;--bs-btn-hover-border-color: #373b3e;--bs-btn-focus-shadow-rgb: 66, 70, 73;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #4d5154;--bs-btn-active-border-color: #373b3e;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #212529;--bs-btn-disabled-border-color: #212529}.btn-outline-default{--bs-btn-color: #dee2e6;--bs-btn-border-color: #dee2e6;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #dee2e6;--bs-btn-hover-border-color: #dee2e6;--bs-btn-focus-shadow-rgb: 222, 226, 230;--bs-btn-active-color: #000;--bs-btn-active-bg: #dee2e6;--bs-btn-active-border-color: #dee2e6;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #dee2e6;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #dee2e6;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-primary{--bs-btn-color: #0d6efd;--bs-btn-border-color: #0d6efd;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #0d6efd;--bs-btn-hover-border-color: #0d6efd;--bs-btn-focus-shadow-rgb: 13, 110, 253;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #0d6efd;--bs-btn-active-border-color: #0d6efd;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #0d6efd;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #0d6efd;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-secondary{--bs-btn-color: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #6c757d;--bs-btn-hover-border-color: #6c757d;--bs-btn-focus-shadow-rgb: 108, 117, 125;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #6c757d;--bs-btn-active-border-color: #6c757d;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #6c757d;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-success{--bs-btn-color: #198754;--bs-btn-border-color: #198754;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #198754;--bs-btn-hover-border-color: #198754;--bs-btn-focus-shadow-rgb: 25, 135, 84;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #198754;--bs-btn-active-border-color: #198754;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #198754;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #198754;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-info{--bs-btn-color: #0dcaf0;--bs-btn-border-color: #0dcaf0;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #0dcaf0;--bs-btn-hover-border-color: #0dcaf0;--bs-btn-focus-shadow-rgb: 13, 202, 240;--bs-btn-active-color: #000;--bs-btn-active-bg: #0dcaf0;--bs-btn-active-border-color: #0dcaf0;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #0dcaf0;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #0dcaf0;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-warning{--bs-btn-color: #ffc107;--bs-btn-border-color: #ffc107;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #ffc107;--bs-btn-hover-border-color: #ffc107;--bs-btn-focus-shadow-rgb: 255, 193, 7;--bs-btn-active-color: #000;--bs-btn-active-bg: #ffc107;--bs-btn-active-border-color: #ffc107;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffc107;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #ffc107;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-danger{--bs-btn-color: #dc3545;--bs-btn-border-color: #dc3545;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #dc3545;--bs-btn-hover-border-color: #dc3545;--bs-btn-focus-shadow-rgb: 220, 53, 69;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #dc3545;--bs-btn-active-border-color: #dc3545;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #dc3545;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #dc3545;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-light{--bs-btn-color: #f8f9fa;--bs-btn-border-color: #f8f9fa;--bs-btn-hover-color: #000;--bs-btn-hover-bg: #f8f9fa;--bs-btn-hover-border-color: #f8f9fa;--bs-btn-focus-shadow-rgb: 248, 249, 250;--bs-btn-active-color: #000;--bs-btn-active-bg: #f8f9fa;--bs-btn-active-border-color: #f8f9fa;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #f8f9fa;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #f8f9fa;--bs-btn-bg: transparent;--bs-gradient: none}.btn-outline-dark{--bs-btn-color: #212529;--bs-btn-border-color: #212529;--bs-btn-hover-color: #ffffff;--bs-btn-hover-bg: #212529;--bs-btn-hover-border-color: #212529;--bs-btn-focus-shadow-rgb: 33, 37, 41;--bs-btn-active-color: #ffffff;--bs-btn-active-bg: #212529;--bs-btn-active-border-color: #212529;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #212529;--bs-btn-disabled-bg: transparent;--bs-btn-disabled-border-color: #212529;--bs-btn-bg: transparent;--bs-gradient: none}.btn-link{--bs-btn-font-weight: 400;--bs-btn-color: #0d6efd;--bs-btn-bg: transparent;--bs-btn-border-color: transparent;--bs-btn-hover-color: #0a58ca;--bs-btn-hover-border-color: transparent;--bs-btn-active-color: #0a58ca;--bs-btn-active-border-color: transparent;--bs-btn-disabled-color: #6c757d;--bs-btn-disabled-border-color: transparent;--bs-btn-box-shadow: 0 0 0 #000;--bs-btn-focus-shadow-rgb: 49, 132, 253;text-decoration:underline;-webkit-text-decoration:underline;-moz-text-decoration:underline;-ms-text-decoration:underline;-o-text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y: 0.5rem;--bs-btn-padding-x: 1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius: 0.5rem}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y: 0.25rem;--bs-btn-padding-x: 0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius: 0.25rem}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion: reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .2s ease}@media(prefers-reduced-motion: reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media(prefers-reduced-motion: reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid rgba(0,0,0,0);border-bottom:0;border-left:.3em solid rgba(0,0,0,0)}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex: 1000;--bs-dropdown-min-width: 10rem;--bs-dropdown-padding-x: 0;--bs-dropdown-padding-y: 0.5rem;--bs-dropdown-spacer: 0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color: #212529;--bs-dropdown-bg: #ffffff;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-border-radius: 0.375rem;--bs-dropdown-border-width: 1px;--bs-dropdown-inner-border-radius: calc(0.375rem - 1px);--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-divider-margin-y: 0.5rem;--bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color: #212529;--bs-dropdown-link-hover-color: #212529;--bs-dropdown-link-hover-bg: #f8f9fa;--bs-dropdown-link-active-color: #ffffff;--bs-dropdown-link-active-bg: #0d6efd;--bs-dropdown-link-disabled-color: rgba(33, 37, 41, 0.5);--bs-dropdown-item-padding-x: 1rem;--bs-dropdown-item-padding-y: 0.25rem;--bs-dropdown-header-color: #6c757d;--bs-dropdown-header-padding-x: 1rem;--bs-dropdown-header-padding-y: 0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media(min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media(min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid rgba(0,0,0,0);border-bottom:.3em solid;border-left:.3em solid rgba(0,0,0,0)}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:0;border-bottom:.3em solid rgba(0,0,0,0);border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid rgba(0,0,0,0);border-right:.3em solid;border-bottom:.3em solid rgba(0,0,0,0)}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap;background-color:rgba(0,0,0,0);border:0;border-radius:var(--bs-dropdown-item-border-radius, 0)}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:rgba(0,0,0,0)}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:0.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color: #dee2e6;--bs-dropdown-bg: #343a40;--bs-dropdown-border-color: rgba(0, 0, 0, 0.175);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color: #dee2e6;--bs-dropdown-link-hover-color: #ffffff;--bs-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color: #ffffff;--bs-dropdown-link-active-bg: #0d6efd;--bs-dropdown-link-disabled-color: #adb5bd;--bs-dropdown-header-color: #adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;justify-content:flex-start;-webkit-justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:.375rem}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(1px*-1)}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;-webkit-flex-direction:column;align-items:flex-start;-webkit-align-items:flex-start;justify-content:center;-webkit-justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(1px*-1)}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn~.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x: 1rem;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: #0d6efd;--bs-nav-link-hover-color: #0a58ca;--bs-nav-link-disabled-color: rgba(33, 37, 41, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background:none;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media(prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width: 1px;--bs-nav-tabs-border-color: white;--bs-nav-tabs-border-radius: 0.375rem;--bs-nav-tabs-link-hover-border-color: #e9ecef #e9ecef white;--bs-nav-tabs-link-active-color: #000;--bs-nav-tabs-link-active-bg: #ffffff;--bs-nav-tabs-link-active-border-color: white white #ffffff;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1*var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid rgba(0,0,0,0);border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1*var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius: 0.375rem;--bs-nav-pills-link-active-color: #ffffff;--bs-nav-pills-link-active-bg: #0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap: 1rem;--bs-nav-underline-border-width: 0.125rem;--bs-nav-underline-link-active-color: #000;gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid rgba(0,0,0,0)}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;-webkit-flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;-webkit-flex-basis:0;flex-grow:1;-webkit-flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x: 0;--bs-navbar-padding-y: 0.5rem;--bs-navbar-color: #fdfefe;--bs-navbar-hover-color: rgba(253, 254, 255, 0.8);--bs-navbar-disabled-color: rgba(253, 254, 254, 0.75);--bs-navbar-active-color: #fdfeff;--bs-navbar-brand-padding-y: 0.3125rem;--bs-navbar-brand-margin-end: 1rem;--bs-navbar-brand-font-size: 1.25rem;--bs-navbar-brand-color: #fdfefe;--bs-navbar-brand-hover-color: #fdfeff;--bs-navbar-nav-link-padding-x: 0.5rem;--bs-navbar-toggler-padding-y: 0.25;--bs-navbar-toggler-padding-x: 0;--bs-navbar-toggler-font-size: 1.25rem;--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfefe' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color: rgba(253, 254, 254, 0);--bs-navbar-toggler-border-radius: 0.375rem;--bs-navbar-toggler-focus-width: 0.25rem;--bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;position:relative;display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;display:-webkit-flex;flex-wrap:inherit;-webkit-flex-wrap:inherit;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x: 0;--bs-nav-link-padding-y: 0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color: var(--bs-navbar-color);--bs-nav-link-hover-color: var(--bs-navbar-hover-color);--bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;-webkit-flex-basis:100%;flex-grow:1;-webkit-flex-grow:1;align-items:center;-webkit-align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:rgba(0,0,0,0);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media(prefers-reduced-motion: reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height, 75vh);overflow-y:auto}@media(min-width: 576px){.navbar-expand-sm{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 768px){.navbar-expand-md{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 992px){.navbar-expand-lg{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1200px){.navbar-expand-xl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}@media(min-width: 1400px){.navbar-expand-xxl{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;-webkit-flex-wrap:nowrap;justify-content:flex-start;-webkit-justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row;-webkit-flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;display:-webkit-flex !important;flex-basis:auto;-webkit-flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;-webkit-flex-grow:1;width:auto !important;height:auto !important;visibility:visible !important;background-color:rgba(0,0,0,0) !important;border:0 !important;transform:none !important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color: #fdfefe;--bs-navbar-hover-color: rgba(253, 254, 255, 0.8);--bs-navbar-disabled-color: rgba(253, 254, 254, 0.75);--bs-navbar-active-color: #fdfeff;--bs-navbar-brand-color: #fdfefe;--bs-navbar-brand-hover-color: #fdfeff;--bs-navbar-toggler-border-color: rgba(253, 254, 254, 0);--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfefe' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23fdfefe' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y: 1rem;--bs-card-spacer-x: 1rem;--bs-card-title-spacer-y: 0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width: 1px;--bs-card-border-color: rgba(0, 0, 0, 0.175);--bs-card-border-radius: 0.375rem;--bs-card-box-shadow: ;--bs-card-inner-border-radius: calc(0.375rem - 1px);--bs-card-cap-padding-y: 0.5rem;--bs-card-cap-padding-x: 1rem;--bs-card-cap-bg: rgba(33, 37, 41, 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg: #ffffff;--bs-card-img-overlay-padding: 1rem;--bs-card-group-margin: 0.75rem;position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-0.5*var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-bottom:calc(-1*var(--bs-card-cap-padding-y));margin-left:calc(-0.5*var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-0.5*var(--bs-card-cap-padding-x));margin-left:calc(-0.5*var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media(min-width: 576px){.card-group{display:flex;display:-webkit-flex;flex-flow:row wrap;-webkit-flex-flow:row wrap}.card-group>.card{flex:1 0 0%;-webkit-flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color: #212529;--bs-accordion-bg: #ffffff;--bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;--bs-accordion-border-color: white;--bs-accordion-border-width: 1px;--bs-accordion-border-radius: 0.375rem;--bs-accordion-inner-border-radius: calc(0.375rem - 1px);--bs-accordion-btn-padding-x: 1.25rem;--bs-accordion-btn-padding-y: 1rem;--bs-accordion-btn-color: #212529;--bs-accordion-btn-bg: #ffffff;--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width: 1.25rem;--bs-accordion-btn-icon-transform: rotate(-180deg);--bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23052c65'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color: #86b7fe;--bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x: 1.25rem;--bs-accordion-body-padding-y: 1rem;--bs-accordion-active-color: #052c65;--bs-accordion-active-bg: #cfe2ff}.accordion-button{position:relative;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media(prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1*var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;-webkit-flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media(prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x: 0;--bs-breadcrumb-padding-y: 0;--bs-breadcrumb-margin-bottom: 1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color: rgba(33, 37, 41, 0.75);--bs-breadcrumb-item-padding-x: 0.5rem;--bs-breadcrumb-item-active-color: rgba(33, 37, 41, 0.75);display:flex;display:-webkit-flex;flex-wrap:wrap;-webkit-flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, ">") /* rtl: var(--bs-breadcrumb-divider, ">") */}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x: 0.75rem;--bs-pagination-padding-y: 0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color: #0d6efd;--bs-pagination-bg: #ffffff;--bs-pagination-border-width: 1px;--bs-pagination-border-color: white;--bs-pagination-border-radius: 0.375rem;--bs-pagination-hover-color: #0a58ca;--bs-pagination-hover-bg: #f8f9fa;--bs-pagination-hover-border-color: white;--bs-pagination-focus-color: #0a58ca;--bs-pagination-focus-bg: #e9ecef;--bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color: #ffffff;--bs-pagination-active-bg: #0d6efd;--bs-pagination-active-border-color: #0d6efd;--bs-pagination-disabled-color: rgba(33, 37, 41, 0.75);--bs-pagination-disabled-bg: #e9ecef;--bs-pagination-disabled-border-color: white;display:flex;display:-webkit-flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(1px*-1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x: 1.5rem;--bs-pagination-padding-y: 0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius: 0.5rem}.pagination-sm{--bs-pagination-padding-x: 0.5rem;--bs-pagination-padding-y: 0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius: 0.25rem}.badge{--bs-badge-padding-x: 0.65em;--bs-badge-padding-y: 0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight: 700;--bs-badge-color: #ffffff;--bs-badge-border-radius: 0.375rem;display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg: transparent;--bs-alert-padding-x: 1rem;--bs-alert-padding-y: 1rem;--bs-alert-margin-bottom: 1rem;--bs-alert-color: inherit;--bs-alert-border-color: transparent;--bs-alert-border: 1px solid var(--bs-alert-border-color);--bs-alert-border-radius: 0.375rem;--bs-alert-link-color: inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-default{--bs-alert-color: var(--bs-default-text-emphasis);--bs-alert-bg: var(--bs-default-bg-subtle);--bs-alert-border-color: var(--bs-default-border-subtle);--bs-alert-link-color: var(--bs-default-text-emphasis)}.alert-primary{--bs-alert-color: var(--bs-primary-text-emphasis);--bs-alert-bg: var(--bs-primary-bg-subtle);--bs-alert-border-color: var(--bs-primary-border-subtle);--bs-alert-link-color: var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color: var(--bs-secondary-text-emphasis);--bs-alert-bg: var(--bs-secondary-bg-subtle);--bs-alert-border-color: var(--bs-secondary-border-subtle);--bs-alert-link-color: var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color: var(--bs-success-text-emphasis);--bs-alert-bg: var(--bs-success-bg-subtle);--bs-alert-border-color: var(--bs-success-border-subtle);--bs-alert-link-color: var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color: var(--bs-info-text-emphasis);--bs-alert-bg: var(--bs-info-bg-subtle);--bs-alert-border-color: var(--bs-info-border-subtle);--bs-alert-link-color: var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color: var(--bs-warning-text-emphasis);--bs-alert-bg: var(--bs-warning-bg-subtle);--bs-alert-border-color: var(--bs-warning-border-subtle);--bs-alert-link-color: var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color: var(--bs-danger-text-emphasis);--bs-alert-bg: var(--bs-danger-bg-subtle);--bs-alert-border-color: var(--bs-danger-border-subtle);--bs-alert-link-color: var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color: var(--bs-light-text-emphasis);--bs-alert-bg: var(--bs-light-bg-subtle);--bs-alert-border-color: var(--bs-light-border-subtle);--bs-alert-link-color: var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color: var(--bs-dark-text-emphasis);--bs-alert-bg: var(--bs-dark-bg-subtle);--bs-alert-border-color: var(--bs-dark-border-subtle);--bs-alert-link-color: var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height: 1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg: #e9ecef;--bs-progress-border-radius: 0.375rem;--bs-progress-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-progress-bar-color: #ffffff;--bs-progress-bar-bg: #0d6efd;--bs-progress-bar-transition: width 0.6s ease;display:flex;display:-webkit-flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;justify-content:center;-webkit-justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media(prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media(prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color: #212529;--bs-list-group-bg: #ffffff;--bs-list-group-border-color: white;--bs-list-group-border-width: 1px;--bs-list-group-border-radius: 0.375rem;--bs-list-group-item-padding-x: 1rem;--bs-list-group-item-padding-y: 0.5rem;--bs-list-group-action-color: rgba(33, 37, 41, 0.75);--bs-list-group-action-hover-color: #000;--bs-list-group-action-hover-bg: #f8f9fa;--bs-list-group-action-active-color: #212529;--bs-list-group-action-active-bg: #e9ecef;--bs-list-group-disabled-color: rgba(33, 37, 41, 0.75);--bs-list-group-disabled-bg: #ffffff;--bs-list-group-active-color: #ffffff;--bs-list-group-active-bg: #0d6efd;--bs-list-group-active-border-color: #0d6efd;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;-webkit-text-decoration:none;-moz-text-decoration:none;-ms-text-decoration:none;-o-text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1*var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media(min-width: 576px){.list-group-horizontal-sm{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 768px){.list-group-horizontal-md{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 992px){.list-group-horizontal-lg{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1200px){.list-group-horizontal-xl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media(min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row;-webkit-flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1*var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-default{--bs-list-group-color: var(--bs-default-text-emphasis);--bs-list-group-bg: var(--bs-default-bg-subtle);--bs-list-group-border-color: var(--bs-default-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-default-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-default-border-subtle);--bs-list-group-active-color: var(--bs-default-bg-subtle);--bs-list-group-active-bg: var(--bs-default-text-emphasis);--bs-list-group-active-border-color: var(--bs-default-text-emphasis)}.list-group-item-primary{--bs-list-group-color: var(--bs-primary-text-emphasis);--bs-list-group-bg: var(--bs-primary-bg-subtle);--bs-list-group-border-color: var(--bs-primary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-primary-border-subtle);--bs-list-group-active-color: var(--bs-primary-bg-subtle);--bs-list-group-active-bg: var(--bs-primary-text-emphasis);--bs-list-group-active-border-color: var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color: var(--bs-secondary-text-emphasis);--bs-list-group-bg: var(--bs-secondary-bg-subtle);--bs-list-group-border-color: var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);--bs-list-group-active-color: var(--bs-secondary-bg-subtle);--bs-list-group-active-bg: var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color: var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color: var(--bs-success-text-emphasis);--bs-list-group-bg: var(--bs-success-bg-subtle);--bs-list-group-border-color: var(--bs-success-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-success-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-success-border-subtle);--bs-list-group-active-color: var(--bs-success-bg-subtle);--bs-list-group-active-bg: var(--bs-success-text-emphasis);--bs-list-group-active-border-color: var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color: var(--bs-info-text-emphasis);--bs-list-group-bg: var(--bs-info-bg-subtle);--bs-list-group-border-color: var(--bs-info-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-info-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-info-border-subtle);--bs-list-group-active-color: var(--bs-info-bg-subtle);--bs-list-group-active-bg: var(--bs-info-text-emphasis);--bs-list-group-active-border-color: var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color: var(--bs-warning-text-emphasis);--bs-list-group-bg: var(--bs-warning-bg-subtle);--bs-list-group-border-color: var(--bs-warning-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-warning-border-subtle);--bs-list-group-active-color: var(--bs-warning-bg-subtle);--bs-list-group-active-bg: var(--bs-warning-text-emphasis);--bs-list-group-active-border-color: var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color: var(--bs-danger-text-emphasis);--bs-list-group-bg: var(--bs-danger-bg-subtle);--bs-list-group-border-color: var(--bs-danger-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-danger-border-subtle);--bs-list-group-active-color: var(--bs-danger-bg-subtle);--bs-list-group-active-bg: var(--bs-danger-text-emphasis);--bs-list-group-active-border-color: var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color: var(--bs-light-text-emphasis);--bs-list-group-bg: var(--bs-light-bg-subtle);--bs-list-group-border-color: var(--bs-light-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-light-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-light-border-subtle);--bs-list-group-active-color: var(--bs-light-bg-subtle);--bs-list-group-active-bg: var(--bs-light-text-emphasis);--bs-list-group-active-border-color: var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color: var(--bs-dark-text-emphasis);--bs-list-group-bg: var(--bs-dark-bg-subtle);--bs-list-group-border-color: var(--bs-dark-border-subtle);--bs-list-group-action-hover-color: var(--bs-emphasis-color);--bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);--bs-list-group-action-active-color: var(--bs-emphasis-color);--bs-list-group-action-active-bg: var(--bs-dark-border-subtle);--bs-list-group-active-color: var(--bs-dark-bg-subtle);--bs-list-group-active-bg: var(--bs-dark-text-emphasis);--bs-list-group-active-border-color: var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color: #000;--bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity: 0.5;--bs-btn-close-hover-opacity: 0.75;--bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-btn-close-focus-opacity: 1;--bs-btn-close-disabled-opacity: 0.25;--bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:rgba(0,0,0,0) var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex: 1090;--bs-toast-padding-x: 0.75rem;--bs-toast-padding-y: 0.5rem;--bs-toast-spacing: 1.5rem;--bs-toast-max-width: 350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg: rgba(255, 255, 255, 0.85);--bs-toast-border-width: 1px;--bs-toast-border-color: rgba(0, 0, 0, 0.175);--bs-toast-border-radius: 0.375rem;--bs-toast-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-toast-header-color: rgba(33, 37, 41, 0.75);--bs-toast-header-bg: rgba(255, 255, 255, 0.85);--bs-toast-header-border-color: rgba(0, 0, 0, 0.175);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex: 1090;position:absolute;z-index:var(--bs-toast-zindex);width:max-content;width:-webkit-max-content;width:-moz-max-content;width:-ms-max-content;width:-o-max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-0.5*var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex: 1055;--bs-modal-width: 500px;--bs-modal-padding: 1rem;--bs-modal-margin: 0.5rem;--bs-modal-color: ;--bs-modal-bg: #ffffff;--bs-modal-border-color: rgba(0, 0, 0, 0.175);--bs-modal-border-width: 1px;--bs-modal-border-radius: 0.5rem;--bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius: calc(0.5rem - 1px);--bs-modal-header-padding-x: 1rem;--bs-modal-header-padding-y: 1rem;--bs-modal-header-padding: 1rem 1rem;--bs-modal-header-border-color: white;--bs-modal-header-border-width: 1px;--bs-modal-title-line-height: 1.5;--bs-modal-footer-gap: 0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color: white;--bs-modal-footer-border-width: 1px;position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0, -50px)}@media(prefers-reduced-motion: reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin)*2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{position:relative;display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex: 1050;--bs-backdrop-bg: #000;--bs-backdrop-opacity: 0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5);margin:calc(-0.5*var(--bs-modal-header-padding-y)) calc(-0.5*var(--bs-modal-header-padding-x)) calc(-0.5*var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;-webkit-flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;display:-webkit-flex;flex-shrink:0;-webkit-flex-shrink:0;flex-wrap:wrap;-webkit-flex-wrap:wrap;align-items:center;-webkit-align-items:center;justify-content:flex-end;-webkit-justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media(min-width: 576px){.modal{--bs-modal-margin: 1.75rem;--bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width: 300px}}@media(min-width: 992px){.modal-lg,.modal-xl{--bs-modal-width: 800px}}@media(min-width: 1200px){.modal-xl{--bs-modal-width: 1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media(max-width: 575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media(max-width: 767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media(max-width: 991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media(max-width: 1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media(max-width: 1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex: 1080;--bs-tooltip-max-width: 200px;--bs-tooltip-padding-x: 0.5rem;--bs-tooltip-padding-y: 0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color: #ffffff;--bs-tooltip-bg: #000;--bs-tooltip-border-radius: 0.375rem;--bs-tooltip-opacity: 0.9;--bs-tooltip-arrow-width: 0.8rem;--bs-tooltip-arrow-height: 0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:rgba(0,0,0,0);border-style:solid}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1*var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1*var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex: 1070;--bs-popover-max-width: 276px;--bs-popover-font-size:0.875rem;--bs-popover-bg: #ffffff;--bs-popover-border-width: 1px;--bs-popover-border-color: rgba(0, 0, 0, 0.175);--bs-popover-border-radius: 0.5rem;--bs-popover-inner-border-radius: calc(0.5rem - 1px);--bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x: 1rem;--bs-popover-header-padding-y: 0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color: inherit;--bs-popover-header-bg: #e9ecef;--bs-popover-body-padding-x: 1rem;--bs-popover-body-padding-y: 1rem;--bs-popover-body-color: #212529;--bs-popover-arrow-width: 1rem;--bs-popover-arrow-height: 0.5rem;--bs-popover-arrow-border: var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:rgba(0,0,0,0);border-style:solid;border-width:0}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width)*.5) 0}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{border-width:0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-0.5*var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1*(var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{border-width:calc(var(--bs-popover-arrow-width)*.5) 0 calc(var(--bs-popover-arrow-width)*.5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y;-webkit-touch-action:pan-y;-moz-touch-action:pan-y;-ms-touch-action:pan-y;-o-touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;transition:transform .6s ease-in-out}@media(prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media(prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:center;-webkit-justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:none;border:0;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ffffff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23ffffff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;display:-webkit-flex;justify-content:center;-webkit-justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;-webkit-flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid rgba(0,0,0,0);border-bottom:10px solid rgba(0,0,0,0);opacity:.5;transition:opacity .6s ease}@media(prefers-reduced-motion: reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-grow,.spinner-border{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-border-width: 0.25em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:rgba(0,0,0,0)}.spinner-border-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem;--bs-spinner-border-width: 0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width: 2rem;--bs-spinner-height: 2rem;--bs-spinner-vertical-align: -0.125em;--bs-spinner-animation-speed: 0.75s;--bs-spinner-animation-name: spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width: 1rem;--bs-spinner-height: 1rem}@media(prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed: 1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex: 1045;--bs-offcanvas-width: 400px;--bs-offcanvas-height: 30vh;--bs-offcanvas-padding-x: 1rem;--bs-offcanvas-padding-y: 1rem;--bs-offcanvas-color: #212529;--bs-offcanvas-bg: #ffffff;--bs-offcanvas-border-width: 1px;--bs-offcanvas-border-color: rgba(0, 0, 0, 0.175);--bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition: transform 0.3s ease-in-out;--bs-offcanvas-title-line-height: 1.5}@media(max-width: 575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 575.98px)and (prefers-reduced-motion: reduce){.offcanvas-sm{transition:none}}@media(max-width: 575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media(min-width: 576px){.offcanvas-sm{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 767.98px)and (prefers-reduced-motion: reduce){.offcanvas-md{transition:none}}@media(max-width: 767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media(min-width: 768px){.offcanvas-md{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 991.98px)and (prefers-reduced-motion: reduce){.offcanvas-lg{transition:none}}@media(max-width: 991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media(min-width: 992px){.offcanvas-lg{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1199.98px)and (prefers-reduced-motion: reduce){.offcanvas-xl{transition:none}}@media(max-width: 1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media(min-width: 1200px){.offcanvas-xl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}@media(max-width: 1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media(max-width: 1399.98px)and (prefers-reduced-motion: reduce){.offcanvas-xxl{transition:none}}@media(max-width: 1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media(min-width: 1400px){.offcanvas-xxl{--bs-offcanvas-height: auto;--bs-offcanvas-border-width: 0;background-color:rgba(0,0,0,0) !important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;display:-webkit-flex;flex-grow:0;-webkit-flex-grow:0;padding:0;overflow-y:visible;background-color:rgba(0,0,0,0) !important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;display:-webkit-flex;flex-direction:column;-webkit-flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media(prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;display:-webkit-flex;align-items:center;-webkit-align-items:center;justify-content:space-between;-webkit-justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5);margin-top:calc(-0.5*var(--bs-offcanvas-padding-y));margin-right:calc(-0.5*var(--bs-offcanvas-padding-x));margin-bottom:calc(-0.5*var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;-webkit-flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);-webkit-mask-image:linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);mask-size:200% 100%;-webkit-mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{mask-position:-200% 0%;-webkit-mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-default{color:#000 !important;background-color:RGBA(var(--bs-default-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-primary{color:#fff !important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-secondary{color:#fff !important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-success{color:#fff !important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-info{color:#000 !important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-warning{color:#000 !important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-danger{color:#fff !important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-light{color:#000 !important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important}.text-bg-dark{color:#fff !important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important}.link-default{color:RGBA(var(--bs-default-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-default-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-default:hover,.link-default:focus{color:RGBA(229, 232, 235, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(229, 232, 235, var(--bs-link-underline-opacity, 1)) !important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-primary:hover,.link-primary:focus{color:RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-secondary:hover,.link-secondary:focus{color:RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-success:hover,.link-success:focus{color:RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-info:hover,.link-info:focus{color:RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-warning:hover,.link-warning:focus{color:RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-danger:hover,.link-danger:focus{color:RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-dark:hover,.link-dark:focus{color:RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-align-items:center;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));text-underline-offset:.25em;backface-visibility:hidden;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;-webkit-flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media(prefers-reduced-motion: reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform, translate3d(0.25em, 0, 0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio: 100%}.ratio-4x3{--bs-aspect-ratio: 75%}.ratio-16x9{--bs-aspect-ratio: 56.25%}.ratio-21x9{--bs-aspect-ratio: 42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:sticky;top:0;z-index:1020}.sticky-bottom{position:sticky;bottom:0;z-index:1020}@media(min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:sticky;bottom:0;z-index:1020}}@media(min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;display:-webkit-flex;flex-direction:row;-webkit-flex-direction:row;align-items:center;-webkit-align-items:center;align-self:stretch;-webkit-align-self:stretch}.vstack{display:flex;display:-webkit-flex;flex:1 1 auto;-webkit-flex:1 1 auto;flex-direction:column;-webkit-flex-direction:column;align-self:stretch;-webkit-align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute !important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;-webkit-align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.float-start{float:left !important}.float-end{float:right !important}.float-none{float:none !important}.object-fit-contain{object-fit:contain !important}.object-fit-cover{object-fit:cover !important}.object-fit-fill{object-fit:fill !important}.object-fit-scale{object-fit:scale-down !important}.object-fit-none{object-fit:none !important}.opacity-0{opacity:0 !important}.opacity-25{opacity:.25 !important}.opacity-50{opacity:.5 !important}.opacity-75{opacity:.75 !important}.opacity-100{opacity:1 !important}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow:scroll !important}.overflow-x-auto{overflow-x:auto !important}.overflow-x-hidden{overflow-x:hidden !important}.overflow-x-visible{overflow-x:visible !important}.overflow-x-scroll{overflow-x:scroll !important}.overflow-y-auto{overflow-y:auto !important}.overflow-y-hidden{overflow-y:hidden !important}.overflow-y-visible{overflow-y:visible !important}.overflow-y-scroll{overflow-y:scroll !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-grid{display:grid !important}.d-inline-grid{display:inline-grid !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}.d-none{display:none !important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15) !important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175) !important}.shadow-none{box-shadow:none !important}.focus-ring-default{--bs-focus-ring-color: rgba(var(--bs-default-rgb), var(--bs-focus-ring-opacity))}.focus-ring-primary{--bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.top-0{top:0 !important}.top-50{top:50% !important}.top-100{top:100% !important}.bottom-0{bottom:0 !important}.bottom-50{bottom:50% !important}.bottom-100{bottom:100% !important}.start-0{left:0 !important}.start-50{left:50% !important}.start-100{left:100% !important}.end-0{right:0 !important}.end-50{right:50% !important}.end-100{right:100% !important}.translate-middle{transform:translate(-50%, -50%) !important}.translate-middle-x{transform:translateX(-50%) !important}.translate-middle-y{transform:translateY(-50%) !important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-0{border:0 !important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-top-0{border-top:0 !important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important}.border-start-0{border-left:0 !important}.border-default{--bs-border-opacity: 1;border-color:rgba(var(--bs-default-rgb), var(--bs-border-opacity)) !important}.border-primary{--bs-border-opacity: 1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important}.border-secondary{--bs-border-opacity: 1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important}.border-success{--bs-border-opacity: 1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important}.border-info{--bs-border-opacity: 1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important}.border-warning{--bs-border-opacity: 1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important}.border-danger{--bs-border-opacity: 1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important}.border-light{--bs-border-opacity: 1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important}.border-dark{--bs-border-opacity: 1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important}.border-black{--bs-border-opacity: 1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important}.border-white{--bs-border-opacity: 1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle) !important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle) !important}.border-success-subtle{border-color:var(--bs-success-border-subtle) !important}.border-info-subtle{border-color:var(--bs-info-border-subtle) !important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle) !important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle) !important}.border-light-subtle{border-color:var(--bs-light-border-subtle) !important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle) !important}.border-1{border-width:1px !important}.border-2{border-width:2px !important}.border-3{border-width:3px !important}.border-4{border-width:4px !important}.border-5{border-width:5px !important}.border-opacity-10{--bs-border-opacity: 0.1}.border-opacity-25{--bs-border-opacity: 0.25}.border-opacity-50{--bs-border-opacity: 0.5}.border-opacity-75{--bs-border-opacity: 0.75}.border-opacity-100{--bs-border-opacity: 1}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.mw-100{max-width:100% !important}.vw-100{width:100vw !important}.min-vw-100{min-width:100vw !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mh-100{max-height:100% !important}.vh-100{height:100vh !important}.min-vh-100{min-height:100vh !important}.flex-fill{flex:1 1 auto !important}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-grow-0{flex-grow:0 !important}.flex-grow-1{flex-grow:1 !important}.flex-shrink-0{flex-shrink:0 !important}.flex-shrink-1{flex-shrink:1 !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.justify-content-evenly{justify-content:space-evenly !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}.order-first{order:-1 !important}.order-0{order:0 !important}.order-1{order:1 !important}.order-2{order:2 !important}.order-3{order:3 !important}.order-4{order:4 !important}.order-5{order:5 !important}.order-last{order:6 !important}.m-0{margin:0 !important}.m-1{margin:.25rem !important}.m-2{margin:.5rem !important}.m-3{margin:1rem !important}.m-4{margin:1.5rem !important}.m-5{margin:3rem !important}.m-auto{margin:auto !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.mx-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-3{margin-right:1rem !important;margin-left:1rem !important}.mx-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-5{margin-right:3rem !important;margin-left:3rem !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.my-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-0{margin-top:0 !important}.mt-1{margin-top:.25rem !important}.mt-2{margin-top:.5rem !important}.mt-3{margin-top:1rem !important}.mt-4{margin-top:1.5rem !important}.mt-5{margin-top:3rem !important}.mt-auto{margin-top:auto !important}.me-0{margin-right:0 !important}.me-1{margin-right:.25rem !important}.me-2{margin-right:.5rem !important}.me-3{margin-right:1rem !important}.me-4{margin-right:1.5rem !important}.me-5{margin-right:3rem !important}.me-auto{margin-right:auto !important}.mb-0{margin-bottom:0 !important}.mb-1{margin-bottom:.25rem !important}.mb-2{margin-bottom:.5rem !important}.mb-3{margin-bottom:1rem !important}.mb-4{margin-bottom:1.5rem !important}.mb-5{margin-bottom:3rem !important}.mb-auto{margin-bottom:auto !important}.ms-0{margin-left:0 !important}.ms-1{margin-left:.25rem !important}.ms-2{margin-left:.5rem !important}.ms-3{margin-left:1rem !important}.ms-4{margin-left:1.5rem !important}.ms-5{margin-left:3rem !important}.ms-auto{margin-left:auto !important}.p-0{padding:0 !important}.p-1{padding:.25rem !important}.p-2{padding:.5rem !important}.p-3{padding:1rem !important}.p-4{padding:1.5rem !important}.p-5{padding:3rem !important}.px-0{padding-right:0 !important;padding-left:0 !important}.px-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-3{padding-right:1rem !important;padding-left:1rem !important}.px-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-5{padding-right:3rem !important;padding-left:3rem !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.py-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-0{padding-top:0 !important}.pt-1{padding-top:.25rem !important}.pt-2{padding-top:.5rem !important}.pt-3{padding-top:1rem !important}.pt-4{padding-top:1.5rem !important}.pt-5{padding-top:3rem !important}.pe-0{padding-right:0 !important}.pe-1{padding-right:.25rem !important}.pe-2{padding-right:.5rem !important}.pe-3{padding-right:1rem !important}.pe-4{padding-right:1.5rem !important}.pe-5{padding-right:3rem !important}.pb-0{padding-bottom:0 !important}.pb-1{padding-bottom:.25rem !important}.pb-2{padding-bottom:.5rem !important}.pb-3{padding-bottom:1rem !important}.pb-4{padding-bottom:1.5rem !important}.pb-5{padding-bottom:3rem !important}.ps-0{padding-left:0 !important}.ps-1{padding-left:.25rem !important}.ps-2{padding-left:.5rem !important}.ps-3{padding-left:1rem !important}.ps-4{padding-left:1.5rem !important}.ps-5{padding-left:3rem !important}.gap-0{gap:0 !important}.gap-1{gap:.25rem !important}.gap-2{gap:.5rem !important}.gap-3{gap:1rem !important}.gap-4{gap:1.5rem !important}.gap-5{gap:3rem !important}.row-gap-0{row-gap:0 !important}.row-gap-1{row-gap:.25rem !important}.row-gap-2{row-gap:.5rem !important}.row-gap-3{row-gap:1rem !important}.row-gap-4{row-gap:1.5rem !important}.row-gap-5{row-gap:3rem !important}.column-gap-0{column-gap:0 !important}.column-gap-1{column-gap:.25rem !important}.column-gap-2{column-gap:.5rem !important}.column-gap-3{column-gap:1rem !important}.column-gap-4{column-gap:1.5rem !important}.column-gap-5{column-gap:3rem !important}.font-monospace{font-family:var(--bs-font-monospace) !important}.fs-1{font-size:calc(1.325rem + 0.9vw) !important}.fs-2{font-size:calc(1.29rem + 0.48vw) !important}.fs-3{font-size:calc(1.27rem + 0.24vw) !important}.fs-4{font-size:1.25rem !important}.fs-5{font-size:1.1rem !important}.fs-6{font-size:1rem !important}.fst-italic{font-style:italic !important}.fst-normal{font-style:normal !important}.fw-lighter{font-weight:lighter !important}.fw-light{font-weight:300 !important}.fw-normal{font-weight:400 !important}.fw-medium{font-weight:500 !important}.fw-semibold{font-weight:600 !important}.fw-bold{font-weight:700 !important}.fw-bolder{font-weight:bolder !important}.lh-1{line-height:1 !important}.lh-sm{line-height:1.25 !important}.lh-base{line-height:1.5 !important}.lh-lg{line-height:2 !important}.text-start{text-align:left !important}.text-end{text-align:right !important}.text-center{text-align:center !important}.text-decoration-none{text-decoration:none !important}.text-decoration-underline{text-decoration:underline !important}.text-decoration-line-through{text-decoration:line-through !important}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.text-wrap{white-space:normal !important}.text-nowrap{white-space:nowrap !important}.text-break{word-wrap:break-word !important;word-break:break-word !important}.text-default{--bs-text-opacity: 1;color:rgba(var(--bs-default-rgb), var(--bs-text-opacity)) !important}.text-primary{--bs-text-opacity: 1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important}.text-secondary{--bs-text-opacity: 1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important}.text-success{--bs-text-opacity: 1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important}.text-info{--bs-text-opacity: 1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important}.text-warning{--bs-text-opacity: 1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important}.text-danger{--bs-text-opacity: 1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important}.text-light{--bs-text-opacity: 1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important}.text-dark{--bs-text-opacity: 1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important}.text-black{--bs-text-opacity: 1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important}.text-white{--bs-text-opacity: 1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important}.text-body{--bs-text-opacity: 1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important}.text-muted{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-black-50{--bs-text-opacity: 1;color:rgba(0,0,0,.5) !important}.text-white-50{--bs-text-opacity: 1;color:rgba(255,255,255,.5) !important}.text-body-secondary{--bs-text-opacity: 1;color:var(--bs-secondary-color) !important}.text-body-tertiary{--bs-text-opacity: 1;color:var(--bs-tertiary-color) !important}.text-body-emphasis{--bs-text-opacity: 1;color:var(--bs-emphasis-color) !important}.text-reset{--bs-text-opacity: 1;color:inherit !important}.text-opacity-25{--bs-text-opacity: 0.25}.text-opacity-50{--bs-text-opacity: 0.5}.text-opacity-75{--bs-text-opacity: 0.75}.text-opacity-100{--bs-text-opacity: 1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis) !important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis) !important}.text-success-emphasis{color:var(--bs-success-text-emphasis) !important}.text-info-emphasis{color:var(--bs-info-text-emphasis) !important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis) !important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis) !important}.text-light-emphasis{color:var(--bs-light-text-emphasis) !important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis) !important}.link-opacity-10{--bs-link-opacity: 0.1}.link-opacity-10-hover:hover{--bs-link-opacity: 0.1}.link-opacity-25{--bs-link-opacity: 0.25}.link-opacity-25-hover:hover{--bs-link-opacity: 0.25}.link-opacity-50{--bs-link-opacity: 0.5}.link-opacity-50-hover:hover{--bs-link-opacity: 0.5}.link-opacity-75{--bs-link-opacity: 0.75}.link-opacity-75-hover:hover{--bs-link-opacity: 0.75}.link-opacity-100{--bs-link-opacity: 1}.link-opacity-100-hover:hover{--bs-link-opacity: 1}.link-offset-1{text-underline-offset:.125em !important}.link-offset-1-hover:hover{text-underline-offset:.125em !important}.link-offset-2{text-underline-offset:.25em !important}.link-offset-2-hover:hover{text-underline-offset:.25em !important}.link-offset-3{text-underline-offset:.375em !important}.link-offset-3-hover:hover{text-underline-offset:.375em !important}.link-underline-default{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-default-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-primary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-secondary{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-success{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-info{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-warning{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-danger{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-light{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important}.link-underline-dark{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important}.link-underline{--bs-link-underline-opacity: 1;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important}.link-underline-opacity-0{--bs-link-underline-opacity: 0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity: 0}.link-underline-opacity-10{--bs-link-underline-opacity: 0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity: 0.1}.link-underline-opacity-25{--bs-link-underline-opacity: 0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity: 0.25}.link-underline-opacity-50{--bs-link-underline-opacity: 0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity: 0.5}.link-underline-opacity-75{--bs-link-underline-opacity: 0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity: 0.75}.link-underline-opacity-100{--bs-link-underline-opacity: 1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity: 1}.bg-default{--bs-bg-opacity: 1;background-color:rgba(var(--bs-default-rgb), var(--bs-bg-opacity)) !important}.bg-primary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important}.bg-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important}.bg-success{--bs-bg-opacity: 1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important}.bg-info{--bs-bg-opacity: 1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important}.bg-warning{--bs-bg-opacity: 1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important}.bg-danger{--bs-bg-opacity: 1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important}.bg-light{--bs-bg-opacity: 1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important}.bg-dark{--bs-bg-opacity: 1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important}.bg-black{--bs-bg-opacity: 1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important}.bg-white{--bs-bg-opacity: 1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important}.bg-body{--bs-bg-opacity: 1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important}.bg-transparent{--bs-bg-opacity: 1;background-color:rgba(0,0,0,0) !important}.bg-body-secondary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-body-tertiary{--bs-bg-opacity: 1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important}.bg-opacity-10{--bs-bg-opacity: 0.1}.bg-opacity-25{--bs-bg-opacity: 0.25}.bg-opacity-50{--bs-bg-opacity: 0.5}.bg-opacity-75{--bs-bg-opacity: 0.75}.bg-opacity-100{--bs-bg-opacity: 1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle) !important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle) !important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle) !important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle) !important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle) !important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle) !important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle) !important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:var(--bs-border-radius) !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:var(--bs-border-radius-sm) !important}.rounded-2{border-radius:var(--bs-border-radius) !important}.rounded-3{border-radius:var(--bs-border-radius-lg) !important}.rounded-4{border-radius:var(--bs-border-radius-xl) !important}.rounded-5{border-radius:var(--bs-border-radius-xxl) !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:var(--bs-border-radius-pill) !important}.rounded-top{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-0{border-top-left-radius:0 !important;border-top-right-radius:0 !important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm) !important;border-top-right-radius:var(--bs-border-radius-sm) !important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius) !important;border-top-right-radius:var(--bs-border-radius) !important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg) !important;border-top-right-radius:var(--bs-border-radius-lg) !important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl) !important;border-top-right-radius:var(--bs-border-radius-xl) !important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl) !important;border-top-right-radius:var(--bs-border-radius-xxl) !important}.rounded-top-circle{border-top-left-radius:50% !important;border-top-right-radius:50% !important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill) !important;border-top-right-radius:var(--bs-border-radius-pill) !important}.rounded-end{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-0{border-top-right-radius:0 !important;border-bottom-right-radius:0 !important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm) !important;border-bottom-right-radius:var(--bs-border-radius-sm) !important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius) !important;border-bottom-right-radius:var(--bs-border-radius) !important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg) !important;border-bottom-right-radius:var(--bs-border-radius-lg) !important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl) !important;border-bottom-right-radius:var(--bs-border-radius-xl) !important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-right-radius:var(--bs-border-radius-xxl) !important}.rounded-end-circle{border-top-right-radius:50% !important;border-bottom-right-radius:50% !important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill) !important;border-bottom-right-radius:var(--bs-border-radius-pill) !important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-0{border-bottom-right-radius:0 !important;border-bottom-left-radius:0 !important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm) !important;border-bottom-left-radius:var(--bs-border-radius-sm) !important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius) !important;border-bottom-left-radius:var(--bs-border-radius) !important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg) !important;border-bottom-left-radius:var(--bs-border-radius-lg) !important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl) !important;border-bottom-left-radius:var(--bs-border-radius-xl) !important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl) !important;border-bottom-left-radius:var(--bs-border-radius-xxl) !important}.rounded-bottom-circle{border-bottom-right-radius:50% !important;border-bottom-left-radius:50% !important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill) !important;border-bottom-left-radius:var(--bs-border-radius-pill) !important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-0{border-bottom-left-radius:0 !important;border-top-left-radius:0 !important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm) !important;border-top-left-radius:var(--bs-border-radius-sm) !important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius) !important;border-top-left-radius:var(--bs-border-radius) !important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg) !important;border-top-left-radius:var(--bs-border-radius-lg) !important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl) !important;border-top-left-radius:var(--bs-border-radius-xl) !important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl) !important;border-top-left-radius:var(--bs-border-radius-xxl) !important}.rounded-start-circle{border-bottom-left-radius:50% !important;border-top-left-radius:50% !important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill) !important;border-top-left-radius:var(--bs-border-radius-pill) !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}.z-n1{z-index:-1 !important}.z-0{z-index:0 !important}.z-1{z-index:1 !important}.z-2{z-index:2 !important}.z-3{z-index:3 !important}@media(min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float:none !important}.object-fit-sm-contain{object-fit:contain !important}.object-fit-sm-cover{object-fit:cover !important}.object-fit-sm-fill{object-fit:fill !important}.object-fit-sm-scale{object-fit:scale-down !important}.object-fit-sm-none{object-fit:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-grid{display:grid !important}.d-sm-inline-grid{display:inline-grid !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}.d-sm-none{display:none !important}.flex-sm-fill{flex:1 1 auto !important}.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-grow-0{flex-grow:0 !important}.flex-sm-grow-1{flex-grow:1 !important}.flex-sm-shrink-0{flex-shrink:0 !important}.flex-sm-shrink-1{flex-shrink:1 !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.justify-content-sm-evenly{justify-content:space-evenly !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}.order-sm-first{order:-1 !important}.order-sm-0{order:0 !important}.order-sm-1{order:1 !important}.order-sm-2{order:2 !important}.order-sm-3{order:3 !important}.order-sm-4{order:4 !important}.order-sm-5{order:5 !important}.order-sm-last{order:6 !important}.m-sm-0{margin:0 !important}.m-sm-1{margin:.25rem !important}.m-sm-2{margin:.5rem !important}.m-sm-3{margin:1rem !important}.m-sm-4{margin:1.5rem !important}.m-sm-5{margin:3rem !important}.m-sm-auto{margin:auto !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.mx-sm-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-sm-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-sm-3{margin-right:1rem !important;margin-left:1rem !important}.mx-sm-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-sm-5{margin-right:3rem !important;margin-left:3rem !important}.mx-sm-auto{margin-right:auto !important;margin-left:auto !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}.my-sm-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-sm-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-sm-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-sm-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-sm-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-sm-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-sm-0{margin-top:0 !important}.mt-sm-1{margin-top:.25rem !important}.mt-sm-2{margin-top:.5rem !important}.mt-sm-3{margin-top:1rem !important}.mt-sm-4{margin-top:1.5rem !important}.mt-sm-5{margin-top:3rem !important}.mt-sm-auto{margin-top:auto !important}.me-sm-0{margin-right:0 !important}.me-sm-1{margin-right:.25rem !important}.me-sm-2{margin-right:.5rem !important}.me-sm-3{margin-right:1rem !important}.me-sm-4{margin-right:1.5rem !important}.me-sm-5{margin-right:3rem !important}.me-sm-auto{margin-right:auto !important}.mb-sm-0{margin-bottom:0 !important}.mb-sm-1{margin-bottom:.25rem !important}.mb-sm-2{margin-bottom:.5rem !important}.mb-sm-3{margin-bottom:1rem !important}.mb-sm-4{margin-bottom:1.5rem !important}.mb-sm-5{margin-bottom:3rem !important}.mb-sm-auto{margin-bottom:auto !important}.ms-sm-0{margin-left:0 !important}.ms-sm-1{margin-left:.25rem !important}.ms-sm-2{margin-left:.5rem !important}.ms-sm-3{margin-left:1rem !important}.ms-sm-4{margin-left:1.5rem !important}.ms-sm-5{margin-left:3rem !important}.ms-sm-auto{margin-left:auto !important}.p-sm-0{padding:0 !important}.p-sm-1{padding:.25rem !important}.p-sm-2{padding:.5rem !important}.p-sm-3{padding:1rem !important}.p-sm-4{padding:1.5rem !important}.p-sm-5{padding:3rem !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.px-sm-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-sm-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-sm-3{padding-right:1rem !important;padding-left:1rem !important}.px-sm-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-sm-5{padding-right:3rem !important;padding-left:3rem !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}.py-sm-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-sm-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-sm-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-sm-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-sm-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-sm-0{padding-top:0 !important}.pt-sm-1{padding-top:.25rem !important}.pt-sm-2{padding-top:.5rem !important}.pt-sm-3{padding-top:1rem !important}.pt-sm-4{padding-top:1.5rem !important}.pt-sm-5{padding-top:3rem !important}.pe-sm-0{padding-right:0 !important}.pe-sm-1{padding-right:.25rem !important}.pe-sm-2{padding-right:.5rem !important}.pe-sm-3{padding-right:1rem !important}.pe-sm-4{padding-right:1.5rem !important}.pe-sm-5{padding-right:3rem !important}.pb-sm-0{padding-bottom:0 !important}.pb-sm-1{padding-bottom:.25rem !important}.pb-sm-2{padding-bottom:.5rem !important}.pb-sm-3{padding-bottom:1rem !important}.pb-sm-4{padding-bottom:1.5rem !important}.pb-sm-5{padding-bottom:3rem !important}.ps-sm-0{padding-left:0 !important}.ps-sm-1{padding-left:.25rem !important}.ps-sm-2{padding-left:.5rem !important}.ps-sm-3{padding-left:1rem !important}.ps-sm-4{padding-left:1.5rem !important}.ps-sm-5{padding-left:3rem !important}.gap-sm-0{gap:0 !important}.gap-sm-1{gap:.25rem !important}.gap-sm-2{gap:.5rem !important}.gap-sm-3{gap:1rem !important}.gap-sm-4{gap:1.5rem !important}.gap-sm-5{gap:3rem !important}.row-gap-sm-0{row-gap:0 !important}.row-gap-sm-1{row-gap:.25rem !important}.row-gap-sm-2{row-gap:.5rem !important}.row-gap-sm-3{row-gap:1rem !important}.row-gap-sm-4{row-gap:1.5rem !important}.row-gap-sm-5{row-gap:3rem !important}.column-gap-sm-0{column-gap:0 !important}.column-gap-sm-1{column-gap:.25rem !important}.column-gap-sm-2{column-gap:.5rem !important}.column-gap-sm-3{column-gap:1rem !important}.column-gap-sm-4{column-gap:1.5rem !important}.column-gap-sm-5{column-gap:3rem !important}.text-sm-start{text-align:left !important}.text-sm-end{text-align:right !important}.text-sm-center{text-align:center !important}}@media(min-width: 768px){.float-md-start{float:left !important}.float-md-end{float:right !important}.float-md-none{float:none !important}.object-fit-md-contain{object-fit:contain !important}.object-fit-md-cover{object-fit:cover !important}.object-fit-md-fill{object-fit:fill !important}.object-fit-md-scale{object-fit:scale-down !important}.object-fit-md-none{object-fit:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-grid{display:grid !important}.d-md-inline-grid{display:inline-grid !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}.d-md-none{display:none !important}.flex-md-fill{flex:1 1 auto !important}.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-grow-0{flex-grow:0 !important}.flex-md-grow-1{flex-grow:1 !important}.flex-md-shrink-0{flex-shrink:0 !important}.flex-md-shrink-1{flex-shrink:1 !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.justify-content-md-evenly{justify-content:space-evenly !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}.order-md-first{order:-1 !important}.order-md-0{order:0 !important}.order-md-1{order:1 !important}.order-md-2{order:2 !important}.order-md-3{order:3 !important}.order-md-4{order:4 !important}.order-md-5{order:5 !important}.order-md-last{order:6 !important}.m-md-0{margin:0 !important}.m-md-1{margin:.25rem !important}.m-md-2{margin:.5rem !important}.m-md-3{margin:1rem !important}.m-md-4{margin:1.5rem !important}.m-md-5{margin:3rem !important}.m-md-auto{margin:auto !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.mx-md-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-md-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-md-3{margin-right:1rem !important;margin-left:1rem !important}.mx-md-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-md-5{margin-right:3rem !important;margin-left:3rem !important}.mx-md-auto{margin-right:auto !important;margin-left:auto !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}.my-md-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-md-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-md-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-md-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-md-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-md-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-md-0{margin-top:0 !important}.mt-md-1{margin-top:.25rem !important}.mt-md-2{margin-top:.5rem !important}.mt-md-3{margin-top:1rem !important}.mt-md-4{margin-top:1.5rem !important}.mt-md-5{margin-top:3rem !important}.mt-md-auto{margin-top:auto !important}.me-md-0{margin-right:0 !important}.me-md-1{margin-right:.25rem !important}.me-md-2{margin-right:.5rem !important}.me-md-3{margin-right:1rem !important}.me-md-4{margin-right:1.5rem !important}.me-md-5{margin-right:3rem !important}.me-md-auto{margin-right:auto !important}.mb-md-0{margin-bottom:0 !important}.mb-md-1{margin-bottom:.25rem !important}.mb-md-2{margin-bottom:.5rem !important}.mb-md-3{margin-bottom:1rem !important}.mb-md-4{margin-bottom:1.5rem !important}.mb-md-5{margin-bottom:3rem !important}.mb-md-auto{margin-bottom:auto !important}.ms-md-0{margin-left:0 !important}.ms-md-1{margin-left:.25rem !important}.ms-md-2{margin-left:.5rem !important}.ms-md-3{margin-left:1rem !important}.ms-md-4{margin-left:1.5rem !important}.ms-md-5{margin-left:3rem !important}.ms-md-auto{margin-left:auto !important}.p-md-0{padding:0 !important}.p-md-1{padding:.25rem !important}.p-md-2{padding:.5rem !important}.p-md-3{padding:1rem !important}.p-md-4{padding:1.5rem !important}.p-md-5{padding:3rem !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.px-md-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-md-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-md-3{padding-right:1rem !important;padding-left:1rem !important}.px-md-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-md-5{padding-right:3rem !important;padding-left:3rem !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}.py-md-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-md-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-md-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-md-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-md-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-md-0{padding-top:0 !important}.pt-md-1{padding-top:.25rem !important}.pt-md-2{padding-top:.5rem !important}.pt-md-3{padding-top:1rem !important}.pt-md-4{padding-top:1.5rem !important}.pt-md-5{padding-top:3rem !important}.pe-md-0{padding-right:0 !important}.pe-md-1{padding-right:.25rem !important}.pe-md-2{padding-right:.5rem !important}.pe-md-3{padding-right:1rem !important}.pe-md-4{padding-right:1.5rem !important}.pe-md-5{padding-right:3rem !important}.pb-md-0{padding-bottom:0 !important}.pb-md-1{padding-bottom:.25rem !important}.pb-md-2{padding-bottom:.5rem !important}.pb-md-3{padding-bottom:1rem !important}.pb-md-4{padding-bottom:1.5rem !important}.pb-md-5{padding-bottom:3rem !important}.ps-md-0{padding-left:0 !important}.ps-md-1{padding-left:.25rem !important}.ps-md-2{padding-left:.5rem !important}.ps-md-3{padding-left:1rem !important}.ps-md-4{padding-left:1.5rem !important}.ps-md-5{padding-left:3rem !important}.gap-md-0{gap:0 !important}.gap-md-1{gap:.25rem !important}.gap-md-2{gap:.5rem !important}.gap-md-3{gap:1rem !important}.gap-md-4{gap:1.5rem !important}.gap-md-5{gap:3rem !important}.row-gap-md-0{row-gap:0 !important}.row-gap-md-1{row-gap:.25rem !important}.row-gap-md-2{row-gap:.5rem !important}.row-gap-md-3{row-gap:1rem !important}.row-gap-md-4{row-gap:1.5rem !important}.row-gap-md-5{row-gap:3rem !important}.column-gap-md-0{column-gap:0 !important}.column-gap-md-1{column-gap:.25rem !important}.column-gap-md-2{column-gap:.5rem !important}.column-gap-md-3{column-gap:1rem !important}.column-gap-md-4{column-gap:1.5rem !important}.column-gap-md-5{column-gap:3rem !important}.text-md-start{text-align:left !important}.text-md-end{text-align:right !important}.text-md-center{text-align:center !important}}@media(min-width: 992px){.float-lg-start{float:left !important}.float-lg-end{float:right !important}.float-lg-none{float:none !important}.object-fit-lg-contain{object-fit:contain !important}.object-fit-lg-cover{object-fit:cover !important}.object-fit-lg-fill{object-fit:fill !important}.object-fit-lg-scale{object-fit:scale-down !important}.object-fit-lg-none{object-fit:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-grid{display:grid !important}.d-lg-inline-grid{display:inline-grid !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}.d-lg-none{display:none !important}.flex-lg-fill{flex:1 1 auto !important}.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-grow-0{flex-grow:0 !important}.flex-lg-grow-1{flex-grow:1 !important}.flex-lg-shrink-0{flex-shrink:0 !important}.flex-lg-shrink-1{flex-shrink:1 !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.justify-content-lg-evenly{justify-content:space-evenly !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}.order-lg-first{order:-1 !important}.order-lg-0{order:0 !important}.order-lg-1{order:1 !important}.order-lg-2{order:2 !important}.order-lg-3{order:3 !important}.order-lg-4{order:4 !important}.order-lg-5{order:5 !important}.order-lg-last{order:6 !important}.m-lg-0{margin:0 !important}.m-lg-1{margin:.25rem !important}.m-lg-2{margin:.5rem !important}.m-lg-3{margin:1rem !important}.m-lg-4{margin:1.5rem !important}.m-lg-5{margin:3rem !important}.m-lg-auto{margin:auto !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.mx-lg-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-lg-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-lg-3{margin-right:1rem !important;margin-left:1rem !important}.mx-lg-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-lg-5{margin-right:3rem !important;margin-left:3rem !important}.mx-lg-auto{margin-right:auto !important;margin-left:auto !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}.my-lg-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-lg-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-lg-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-lg-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-lg-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-lg-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-lg-0{margin-top:0 !important}.mt-lg-1{margin-top:.25rem !important}.mt-lg-2{margin-top:.5rem !important}.mt-lg-3{margin-top:1rem !important}.mt-lg-4{margin-top:1.5rem !important}.mt-lg-5{margin-top:3rem !important}.mt-lg-auto{margin-top:auto !important}.me-lg-0{margin-right:0 !important}.me-lg-1{margin-right:.25rem !important}.me-lg-2{margin-right:.5rem !important}.me-lg-3{margin-right:1rem !important}.me-lg-4{margin-right:1.5rem !important}.me-lg-5{margin-right:3rem !important}.me-lg-auto{margin-right:auto !important}.mb-lg-0{margin-bottom:0 !important}.mb-lg-1{margin-bottom:.25rem !important}.mb-lg-2{margin-bottom:.5rem !important}.mb-lg-3{margin-bottom:1rem !important}.mb-lg-4{margin-bottom:1.5rem !important}.mb-lg-5{margin-bottom:3rem !important}.mb-lg-auto{margin-bottom:auto !important}.ms-lg-0{margin-left:0 !important}.ms-lg-1{margin-left:.25rem !important}.ms-lg-2{margin-left:.5rem !important}.ms-lg-3{margin-left:1rem !important}.ms-lg-4{margin-left:1.5rem !important}.ms-lg-5{margin-left:3rem !important}.ms-lg-auto{margin-left:auto !important}.p-lg-0{padding:0 !important}.p-lg-1{padding:.25rem !important}.p-lg-2{padding:.5rem !important}.p-lg-3{padding:1rem !important}.p-lg-4{padding:1.5rem !important}.p-lg-5{padding:3rem !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.px-lg-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-lg-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-lg-3{padding-right:1rem !important;padding-left:1rem !important}.px-lg-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-lg-5{padding-right:3rem !important;padding-left:3rem !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}.py-lg-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-lg-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-lg-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-lg-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-lg-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-lg-0{padding-top:0 !important}.pt-lg-1{padding-top:.25rem !important}.pt-lg-2{padding-top:.5rem !important}.pt-lg-3{padding-top:1rem !important}.pt-lg-4{padding-top:1.5rem !important}.pt-lg-5{padding-top:3rem !important}.pe-lg-0{padding-right:0 !important}.pe-lg-1{padding-right:.25rem !important}.pe-lg-2{padding-right:.5rem !important}.pe-lg-3{padding-right:1rem !important}.pe-lg-4{padding-right:1.5rem !important}.pe-lg-5{padding-right:3rem !important}.pb-lg-0{padding-bottom:0 !important}.pb-lg-1{padding-bottom:.25rem !important}.pb-lg-2{padding-bottom:.5rem !important}.pb-lg-3{padding-bottom:1rem !important}.pb-lg-4{padding-bottom:1.5rem !important}.pb-lg-5{padding-bottom:3rem !important}.ps-lg-0{padding-left:0 !important}.ps-lg-1{padding-left:.25rem !important}.ps-lg-2{padding-left:.5rem !important}.ps-lg-3{padding-left:1rem !important}.ps-lg-4{padding-left:1.5rem !important}.ps-lg-5{padding-left:3rem !important}.gap-lg-0{gap:0 !important}.gap-lg-1{gap:.25rem !important}.gap-lg-2{gap:.5rem !important}.gap-lg-3{gap:1rem !important}.gap-lg-4{gap:1.5rem !important}.gap-lg-5{gap:3rem !important}.row-gap-lg-0{row-gap:0 !important}.row-gap-lg-1{row-gap:.25rem !important}.row-gap-lg-2{row-gap:.5rem !important}.row-gap-lg-3{row-gap:1rem !important}.row-gap-lg-4{row-gap:1.5rem !important}.row-gap-lg-5{row-gap:3rem !important}.column-gap-lg-0{column-gap:0 !important}.column-gap-lg-1{column-gap:.25rem !important}.column-gap-lg-2{column-gap:.5rem !important}.column-gap-lg-3{column-gap:1rem !important}.column-gap-lg-4{column-gap:1.5rem !important}.column-gap-lg-5{column-gap:3rem !important}.text-lg-start{text-align:left !important}.text-lg-end{text-align:right !important}.text-lg-center{text-align:center !important}}@media(min-width: 1200px){.float-xl-start{float:left !important}.float-xl-end{float:right !important}.float-xl-none{float:none !important}.object-fit-xl-contain{object-fit:contain !important}.object-fit-xl-cover{object-fit:cover !important}.object-fit-xl-fill{object-fit:fill !important}.object-fit-xl-scale{object-fit:scale-down !important}.object-fit-xl-none{object-fit:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-grid{display:grid !important}.d-xl-inline-grid{display:inline-grid !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}.d-xl-none{display:none !important}.flex-xl-fill{flex:1 1 auto !important}.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-grow-0{flex-grow:0 !important}.flex-xl-grow-1{flex-grow:1 !important}.flex-xl-shrink-0{flex-shrink:0 !important}.flex-xl-shrink-1{flex-shrink:1 !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.justify-content-xl-evenly{justify-content:space-evenly !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}.order-xl-first{order:-1 !important}.order-xl-0{order:0 !important}.order-xl-1{order:1 !important}.order-xl-2{order:2 !important}.order-xl-3{order:3 !important}.order-xl-4{order:4 !important}.order-xl-5{order:5 !important}.order-xl-last{order:6 !important}.m-xl-0{margin:0 !important}.m-xl-1{margin:.25rem !important}.m-xl-2{margin:.5rem !important}.m-xl-3{margin:1rem !important}.m-xl-4{margin:1.5rem !important}.m-xl-5{margin:3rem !important}.m-xl-auto{margin:auto !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.mx-xl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xl-auto{margin-right:auto !important;margin-left:auto !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xl-0{margin-top:0 !important}.mt-xl-1{margin-top:.25rem !important}.mt-xl-2{margin-top:.5rem !important}.mt-xl-3{margin-top:1rem !important}.mt-xl-4{margin-top:1.5rem !important}.mt-xl-5{margin-top:3rem !important}.mt-xl-auto{margin-top:auto !important}.me-xl-0{margin-right:0 !important}.me-xl-1{margin-right:.25rem !important}.me-xl-2{margin-right:.5rem !important}.me-xl-3{margin-right:1rem !important}.me-xl-4{margin-right:1.5rem !important}.me-xl-5{margin-right:3rem !important}.me-xl-auto{margin-right:auto !important}.mb-xl-0{margin-bottom:0 !important}.mb-xl-1{margin-bottom:.25rem !important}.mb-xl-2{margin-bottom:.5rem !important}.mb-xl-3{margin-bottom:1rem !important}.mb-xl-4{margin-bottom:1.5rem !important}.mb-xl-5{margin-bottom:3rem !important}.mb-xl-auto{margin-bottom:auto !important}.ms-xl-0{margin-left:0 !important}.ms-xl-1{margin-left:.25rem !important}.ms-xl-2{margin-left:.5rem !important}.ms-xl-3{margin-left:1rem !important}.ms-xl-4{margin-left:1.5rem !important}.ms-xl-5{margin-left:3rem !important}.ms-xl-auto{margin-left:auto !important}.p-xl-0{padding:0 !important}.p-xl-1{padding:.25rem !important}.p-xl-2{padding:.5rem !important}.p-xl-3{padding:1rem !important}.p-xl-4{padding:1.5rem !important}.p-xl-5{padding:3rem !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.px-xl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xl-0{padding-top:0 !important}.pt-xl-1{padding-top:.25rem !important}.pt-xl-2{padding-top:.5rem !important}.pt-xl-3{padding-top:1rem !important}.pt-xl-4{padding-top:1.5rem !important}.pt-xl-5{padding-top:3rem !important}.pe-xl-0{padding-right:0 !important}.pe-xl-1{padding-right:.25rem !important}.pe-xl-2{padding-right:.5rem !important}.pe-xl-3{padding-right:1rem !important}.pe-xl-4{padding-right:1.5rem !important}.pe-xl-5{padding-right:3rem !important}.pb-xl-0{padding-bottom:0 !important}.pb-xl-1{padding-bottom:.25rem !important}.pb-xl-2{padding-bottom:.5rem !important}.pb-xl-3{padding-bottom:1rem !important}.pb-xl-4{padding-bottom:1.5rem !important}.pb-xl-5{padding-bottom:3rem !important}.ps-xl-0{padding-left:0 !important}.ps-xl-1{padding-left:.25rem !important}.ps-xl-2{padding-left:.5rem !important}.ps-xl-3{padding-left:1rem !important}.ps-xl-4{padding-left:1.5rem !important}.ps-xl-5{padding-left:3rem !important}.gap-xl-0{gap:0 !important}.gap-xl-1{gap:.25rem !important}.gap-xl-2{gap:.5rem !important}.gap-xl-3{gap:1rem !important}.gap-xl-4{gap:1.5rem !important}.gap-xl-5{gap:3rem !important}.row-gap-xl-0{row-gap:0 !important}.row-gap-xl-1{row-gap:.25rem !important}.row-gap-xl-2{row-gap:.5rem !important}.row-gap-xl-3{row-gap:1rem !important}.row-gap-xl-4{row-gap:1.5rem !important}.row-gap-xl-5{row-gap:3rem !important}.column-gap-xl-0{column-gap:0 !important}.column-gap-xl-1{column-gap:.25rem !important}.column-gap-xl-2{column-gap:.5rem !important}.column-gap-xl-3{column-gap:1rem !important}.column-gap-xl-4{column-gap:1.5rem !important}.column-gap-xl-5{column-gap:3rem !important}.text-xl-start{text-align:left !important}.text-xl-end{text-align:right !important}.text-xl-center{text-align:center !important}}@media(min-width: 1400px){.float-xxl-start{float:left !important}.float-xxl-end{float:right !important}.float-xxl-none{float:none !important}.object-fit-xxl-contain{object-fit:contain !important}.object-fit-xxl-cover{object-fit:cover !important}.object-fit-xxl-fill{object-fit:fill !important}.object-fit-xxl-scale{object-fit:scale-down !important}.object-fit-xxl-none{object-fit:none !important}.d-xxl-inline{display:inline !important}.d-xxl-inline-block{display:inline-block !important}.d-xxl-block{display:block !important}.d-xxl-grid{display:grid !important}.d-xxl-inline-grid{display:inline-grid !important}.d-xxl-table{display:table !important}.d-xxl-table-row{display:table-row !important}.d-xxl-table-cell{display:table-cell !important}.d-xxl-flex{display:flex !important}.d-xxl-inline-flex{display:inline-flex !important}.d-xxl-none{display:none !important}.flex-xxl-fill{flex:1 1 auto !important}.flex-xxl-row{flex-direction:row !important}.flex-xxl-column{flex-direction:column !important}.flex-xxl-row-reverse{flex-direction:row-reverse !important}.flex-xxl-column-reverse{flex-direction:column-reverse !important}.flex-xxl-grow-0{flex-grow:0 !important}.flex-xxl-grow-1{flex-grow:1 !important}.flex-xxl-shrink-0{flex-shrink:0 !important}.flex-xxl-shrink-1{flex-shrink:1 !important}.flex-xxl-wrap{flex-wrap:wrap !important}.flex-xxl-nowrap{flex-wrap:nowrap !important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse !important}.justify-content-xxl-start{justify-content:flex-start !important}.justify-content-xxl-end{justify-content:flex-end !important}.justify-content-xxl-center{justify-content:center !important}.justify-content-xxl-between{justify-content:space-between !important}.justify-content-xxl-around{justify-content:space-around !important}.justify-content-xxl-evenly{justify-content:space-evenly !important}.align-items-xxl-start{align-items:flex-start !important}.align-items-xxl-end{align-items:flex-end !important}.align-items-xxl-center{align-items:center !important}.align-items-xxl-baseline{align-items:baseline !important}.align-items-xxl-stretch{align-items:stretch !important}.align-content-xxl-start{align-content:flex-start !important}.align-content-xxl-end{align-content:flex-end !important}.align-content-xxl-center{align-content:center !important}.align-content-xxl-between{align-content:space-between !important}.align-content-xxl-around{align-content:space-around !important}.align-content-xxl-stretch{align-content:stretch !important}.align-self-xxl-auto{align-self:auto !important}.align-self-xxl-start{align-self:flex-start !important}.align-self-xxl-end{align-self:flex-end !important}.align-self-xxl-center{align-self:center !important}.align-self-xxl-baseline{align-self:baseline !important}.align-self-xxl-stretch{align-self:stretch !important}.order-xxl-first{order:-1 !important}.order-xxl-0{order:0 !important}.order-xxl-1{order:1 !important}.order-xxl-2{order:2 !important}.order-xxl-3{order:3 !important}.order-xxl-4{order:4 !important}.order-xxl-5{order:5 !important}.order-xxl-last{order:6 !important}.m-xxl-0{margin:0 !important}.m-xxl-1{margin:.25rem !important}.m-xxl-2{margin:.5rem !important}.m-xxl-3{margin:1rem !important}.m-xxl-4{margin:1.5rem !important}.m-xxl-5{margin:3rem !important}.m-xxl-auto{margin:auto !important}.mx-xxl-0{margin-right:0 !important;margin-left:0 !important}.mx-xxl-1{margin-right:.25rem !important;margin-left:.25rem !important}.mx-xxl-2{margin-right:.5rem !important;margin-left:.5rem !important}.mx-xxl-3{margin-right:1rem !important;margin-left:1rem !important}.mx-xxl-4{margin-right:1.5rem !important;margin-left:1.5rem !important}.mx-xxl-5{margin-right:3rem !important;margin-left:3rem !important}.mx-xxl-auto{margin-right:auto !important;margin-left:auto !important}.my-xxl-0{margin-top:0 !important;margin-bottom:0 !important}.my-xxl-1{margin-top:.25rem !important;margin-bottom:.25rem !important}.my-xxl-2{margin-top:.5rem !important;margin-bottom:.5rem !important}.my-xxl-3{margin-top:1rem !important;margin-bottom:1rem !important}.my-xxl-4{margin-top:1.5rem !important;margin-bottom:1.5rem !important}.my-xxl-5{margin-top:3rem !important;margin-bottom:3rem !important}.my-xxl-auto{margin-top:auto !important;margin-bottom:auto !important}.mt-xxl-0{margin-top:0 !important}.mt-xxl-1{margin-top:.25rem !important}.mt-xxl-2{margin-top:.5rem !important}.mt-xxl-3{margin-top:1rem !important}.mt-xxl-4{margin-top:1.5rem !important}.mt-xxl-5{margin-top:3rem !important}.mt-xxl-auto{margin-top:auto !important}.me-xxl-0{margin-right:0 !important}.me-xxl-1{margin-right:.25rem !important}.me-xxl-2{margin-right:.5rem !important}.me-xxl-3{margin-right:1rem !important}.me-xxl-4{margin-right:1.5rem !important}.me-xxl-5{margin-right:3rem !important}.me-xxl-auto{margin-right:auto !important}.mb-xxl-0{margin-bottom:0 !important}.mb-xxl-1{margin-bottom:.25rem !important}.mb-xxl-2{margin-bottom:.5rem !important}.mb-xxl-3{margin-bottom:1rem !important}.mb-xxl-4{margin-bottom:1.5rem !important}.mb-xxl-5{margin-bottom:3rem !important}.mb-xxl-auto{margin-bottom:auto !important}.ms-xxl-0{margin-left:0 !important}.ms-xxl-1{margin-left:.25rem !important}.ms-xxl-2{margin-left:.5rem !important}.ms-xxl-3{margin-left:1rem !important}.ms-xxl-4{margin-left:1.5rem !important}.ms-xxl-5{margin-left:3rem !important}.ms-xxl-auto{margin-left:auto !important}.p-xxl-0{padding:0 !important}.p-xxl-1{padding:.25rem !important}.p-xxl-2{padding:.5rem !important}.p-xxl-3{padding:1rem !important}.p-xxl-4{padding:1.5rem !important}.p-xxl-5{padding:3rem !important}.px-xxl-0{padding-right:0 !important;padding-left:0 !important}.px-xxl-1{padding-right:.25rem !important;padding-left:.25rem !important}.px-xxl-2{padding-right:.5rem !important;padding-left:.5rem !important}.px-xxl-3{padding-right:1rem !important;padding-left:1rem !important}.px-xxl-4{padding-right:1.5rem !important;padding-left:1.5rem !important}.px-xxl-5{padding-right:3rem !important;padding-left:3rem !important}.py-xxl-0{padding-top:0 !important;padding-bottom:0 !important}.py-xxl-1{padding-top:.25rem !important;padding-bottom:.25rem !important}.py-xxl-2{padding-top:.5rem !important;padding-bottom:.5rem !important}.py-xxl-3{padding-top:1rem !important;padding-bottom:1rem !important}.py-xxl-4{padding-top:1.5rem !important;padding-bottom:1.5rem !important}.py-xxl-5{padding-top:3rem !important;padding-bottom:3rem !important}.pt-xxl-0{padding-top:0 !important}.pt-xxl-1{padding-top:.25rem !important}.pt-xxl-2{padding-top:.5rem !important}.pt-xxl-3{padding-top:1rem !important}.pt-xxl-4{padding-top:1.5rem !important}.pt-xxl-5{padding-top:3rem !important}.pe-xxl-0{padding-right:0 !important}.pe-xxl-1{padding-right:.25rem !important}.pe-xxl-2{padding-right:.5rem !important}.pe-xxl-3{padding-right:1rem !important}.pe-xxl-4{padding-right:1.5rem !important}.pe-xxl-5{padding-right:3rem !important}.pb-xxl-0{padding-bottom:0 !important}.pb-xxl-1{padding-bottom:.25rem !important}.pb-xxl-2{padding-bottom:.5rem !important}.pb-xxl-3{padding-bottom:1rem !important}.pb-xxl-4{padding-bottom:1.5rem !important}.pb-xxl-5{padding-bottom:3rem !important}.ps-xxl-0{padding-left:0 !important}.ps-xxl-1{padding-left:.25rem !important}.ps-xxl-2{padding-left:.5rem !important}.ps-xxl-3{padding-left:1rem !important}.ps-xxl-4{padding-left:1.5rem !important}.ps-xxl-5{padding-left:3rem !important}.gap-xxl-0{gap:0 !important}.gap-xxl-1{gap:.25rem !important}.gap-xxl-2{gap:.5rem !important}.gap-xxl-3{gap:1rem !important}.gap-xxl-4{gap:1.5rem !important}.gap-xxl-5{gap:3rem !important}.row-gap-xxl-0{row-gap:0 !important}.row-gap-xxl-1{row-gap:.25rem !important}.row-gap-xxl-2{row-gap:.5rem !important}.row-gap-xxl-3{row-gap:1rem !important}.row-gap-xxl-4{row-gap:1.5rem !important}.row-gap-xxl-5{row-gap:3rem !important}.column-gap-xxl-0{column-gap:0 !important}.column-gap-xxl-1{column-gap:.25rem !important}.column-gap-xxl-2{column-gap:.5rem !important}.column-gap-xxl-3{column-gap:1rem !important}.column-gap-xxl-4{column-gap:1.5rem !important}.column-gap-xxl-5{column-gap:3rem !important}.text-xxl-start{text-align:left !important}.text-xxl-end{text-align:right !important}.text-xxl-center{text-align:center !important}}.bg-default{color:#000}.bg-primary{color:#fff}.bg-secondary{color:#fff}.bg-success{color:#fff}.bg-info{color:#000}.bg-warning{color:#000}.bg-danger{color:#fff}.bg-light{color:#000}.bg-dark{color:#fff}@media(min-width: 1200px){.fs-1{font-size:2rem !important}.fs-2{font-size:1.65rem !important}.fs-3{font-size:1.45rem !important}}@media print{.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-grid{display:grid !important}.d-print-inline-grid{display:inline-grid !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}.d-print-none{display:none !important}}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}.bg-blue{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #0d6efd;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #d63384;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #d63384;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #dc3545;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ffc107;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ffc107;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #198754;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #0dcaf0;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #dee2e6}.bg-default{--bslib-color-bg: #dee2e6;--bslib-color-fg: #000}.text-primary{--bslib-color-fg: #0d6efd}.bg-primary{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #ffffff}.text-success{--bslib-color-fg: #198754}.bg-success{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff}.text-info{--bslib-color-fg: #0dcaf0}.bg-info{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000}.text-warning{--bslib-color-fg: #ffc107}.bg-warning{--bslib-color-bg: #ffc107;--bslib-color-fg: #000}.text-danger{--bslib-color-fg: #dc3545}.bg-danger{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #212529}.bg-dark{--bslib-color-bg: #212529;--bslib-color-fg: #ffffff}.bg-gradient-blue-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #3148f9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3148f9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #345ce5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #345ce5;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #5d56cd;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #5d56cd;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #6057b3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #6057b3;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #6d74a0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #6d74a0;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #000;--bslib-color-bg: #6e8f9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #6e8f9b;color:#000}.bg-gradient-blue-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #1278b9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #1278b9;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #000;--bslib-color-bg: #1592d4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1592d4;color:#000}.bg-gradient-blue-cyan{--bslib-color-fg: #000;--bslib-color-bg: #0d93f8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #0d93f8;color:#000}.bg-gradient-indigo-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #4236f6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #4236f6;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #931ec6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #931ec6;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #951fad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #951fad;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #ffffff;--bslib-color-bg: #a35794;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #a35794;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #4740b3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #4740b3;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #ffffff;--bslib-color-bg: #425af1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #425af1;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #4854d9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #4854d9;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #983ca9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #983ca9;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #9b3d8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #9b3d8f;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #000;--bslib-color-bg: #a97577;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #a97577;color:#000}.bg-gradient-purple-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #4d5e95;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #4d5e95;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #000;--bslib-color-bg: #4878d4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #4878d4;color:#000}.bg-gradient-pink-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #864bb4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #864bb4;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #a925b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #a925b0;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #ad399c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #ad399c;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #d8346b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #d8346b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #000;--bslib-color-bg: #e65157;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #e65157;color:#000}.bg-gradient-pink-yellow{--bslib-color-fg: #000;--bslib-color-bg: #e66c52;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #e66c52;color:#000}.bg-gradient-pink-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #8a5571;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #8a5571;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #000;--bslib-color-bg: #8d6f8c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #8d6f8c;color:#000}.bg-gradient-pink-cyan{--bslib-color-fg: #000;--bslib-color-bg: #866faf;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #866faf;color:#000}.bg-gradient-red-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #894c8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #894c8f;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #ad268a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #ad268a;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #b03a77;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b03a77;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #da345e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #da345e;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #000;--bslib-color-bg: #e95231;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #e95231;color:#000}.bg-gradient-red-yellow{--bslib-color-fg: #000;--bslib-color-bg: #ea6d2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #ea6d2c;color:#000}.bg-gradient-red-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #8e564b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #8e564b;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #000;--bslib-color-bg: #917066;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #917066;color:#000}.bg-gradient-red-cyan{--bslib-color-fg: #000;--bslib-color-bg: #897189;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #897189;color:#000}.bg-gradient-orange-blue{--bslib-color-fg: #000;--bslib-color-bg: #9d7871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #9d7871;color:#000}.bg-gradient-orange-indigo{--bslib-color-fg: #000;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#000}.bg-gradient-orange-purple{--bslib-color-fg: #000;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#000}.bg-gradient-orange-pink{--bslib-color-fg: #000;--bslib-color-bg: #ed6041;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #ed6041;color:#000}.bg-gradient-orange-red{--bslib-color-fg: #000;--bslib-color-bg: #f06128;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #f06128;color:#000}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #fe990f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #fe990f;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a2822e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #a2822e;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #000;--bslib-color-bg: #9d9c6c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #9d9c6c;color:#000}.bg-gradient-yellow-blue{--bslib-color-fg: #000;--bslib-color-bg: #9ea069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #9ea069;color:#000}.bg-gradient-yellow-indigo{--bslib-color-fg: #000;--bslib-color-bg: #c27a65;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c27a65;color:#000}.bg-gradient-yellow-purple{--bslib-color-fg: #000;--bslib-color-bg: #c58e51;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c58e51;color:#000}.bg-gradient-yellow-pink{--bslib-color-fg: #000;--bslib-color-bg: #ef8839;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #ef8839;color:#000}.bg-gradient-yellow-red{--bslib-color-fg: #000;--bslib-color-bg: #f18920;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #f18920;color:#000}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #fea60c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #fea60c;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #000;--bslib-color-bg: #a3aa26;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #a3aa26;color:#000}.bg-gradient-yellow-teal{--bslib-color-fg: #000;--bslib-color-bg: #a6c441;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6c441;color:#000}.bg-gradient-yellow-cyan{--bslib-color-fg: #000;--bslib-color-bg: #9ec564;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #9ec564;color:#000}.bg-gradient-green-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #147d98;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #147d98;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #385793;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #385793;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #3b6b80;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3b6b80;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #656567;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #656567;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #67664e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #67664e;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #74833a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #74833a;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #000;--bslib-color-bg: #759e35;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #759e35;color:#000}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #1ca16f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1ca16f;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #000;--bslib-color-bg: #14a292;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #14a292;color:#000}.bg-gradient-teal-blue{--bslib-color-fg: #000;--bslib-color-bg: #18a5c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #18a5c0;color:#000}.bg-gradient-teal-indigo{--bslib-color-fg: #000;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#000}.bg-gradient-teal-purple{--bslib-color-fg: #000;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#000}.bg-gradient-teal-pink{--bslib-color-fg: #000;--bslib-color-bg: #698d8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #698d8f;color:#000}.bg-gradient-teal-red{--bslib-color-fg: #000;--bslib-color-bg: #6b8e76;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #6b8e76;color:#000}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #000;--bslib-color-bg: #79c65d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #79c65d;color:#000}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #1daf7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #1daf7c;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #000;--bslib-color-bg: #18c9bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #18c9bb;color:#000}.bg-gradient-cyan-blue{--bslib-color-fg: #000;--bslib-color-bg: #0da5f5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #0da5f5;color:#000}.bg-gradient-cyan-indigo{--bslib-color-fg: #000;--bslib-color-bg: #3180f1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3180f1;color:#000}.bg-gradient-cyan-purple{--bslib-color-fg: #000;--bslib-color-bg: #3494dd;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3494dd;color:#000}.bg-gradient-cyan-pink{--bslib-color-fg: #000;--bslib-color-bg: #5d8ec5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #5d8ec5;color:#000}.bg-gradient-cyan-red{--bslib-color-fg: #000;--bslib-color-bg: #608eac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #608eac;color:#000}.bg-gradient-cyan-orange{--bslib-color-fg: #000;--bslib-color-bg: #6dac98;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #6dac98;color:#000}.bg-gradient-cyan-yellow{--bslib-color-fg: #000;--bslib-color-bg: #6ec693;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #6ec693;color:#000}.bg-gradient-cyan-green{--bslib-color-fg: #000;--bslib-color-bg: #12afb2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #12afb2;color:#000}.bg-gradient-cyan-teal{--bslib-color-fg: #000;--bslib-color-bg: #15cacc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #15cacc;color:#000}.tab-content>.tab-pane.html-fill-container{display:none}.tab-content>.active.html-fill-container{display:flex}.tab-content.html-fill-container{padding:0}:root{--bslib-spacer: 1rem;--bslib-mb-spacer: var(--bslib-spacer, 1rem)}.bslib-mb-spacing{margin-bottom:var(--bslib-mb-spacer)}.bslib-gap-spacing{gap:var(--bslib-mb-spacer)}.bslib-gap-spacing>.bslib-mb-spacing,.bslib-gap-spacing>.form-group,.bslib-gap-spacing>p,.bslib-gap-spacing>pre{margin-bottom:0}.html-fill-container>.html-fill-item.bslib-mb-spacing{margin-bottom:0}.bg-blue{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-blue{--bslib-color-fg: #0d6efd;color:var(--bslib-color-fg)}.bg-indigo{--bslib-color-bg: #6610f2;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-indigo{--bslib-color-fg: #6610f2;color:var(--bslib-color-fg)}.bg-purple{--bslib-color-bg: #6f42c1;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-purple{--bslib-color-fg: #6f42c1;color:var(--bslib-color-fg)}.bg-pink{--bslib-color-bg: #d63384;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-pink{--bslib-color-fg: #d63384;color:var(--bslib-color-fg)}.bg-red{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-red{--bslib-color-fg: #dc3545;color:var(--bslib-color-fg)}.bg-orange{--bslib-color-bg: #fd7e14;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-orange{--bslib-color-fg: #fd7e14;color:var(--bslib-color-fg)}.bg-yellow{--bslib-color-bg: #ffc107;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-yellow{--bslib-color-fg: #ffc107;color:var(--bslib-color-fg)}.bg-green{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-green{--bslib-color-fg: #198754;color:var(--bslib-color-fg)}.bg-teal{--bslib-color-bg: #20c997;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-teal{--bslib-color-fg: #20c997;color:var(--bslib-color-fg)}.bg-cyan{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000;background-color:var(--bslib-color-bg);color:var(--bslib-color-fg)}.text-cyan{--bslib-color-fg: #0dcaf0;color:var(--bslib-color-fg)}.text-default{--bslib-color-fg: #dee2e6}.bg-default{--bslib-color-bg: #dee2e6;--bslib-color-fg: #000}.text-primary{--bslib-color-fg: #0d6efd}.bg-primary{--bslib-color-bg: #0d6efd;--bslib-color-fg: #ffffff}.text-secondary{--bslib-color-fg: #6c757d}.bg-secondary{--bslib-color-bg: #6c757d;--bslib-color-fg: #ffffff}.text-success{--bslib-color-fg: #198754}.bg-success{--bslib-color-bg: #198754;--bslib-color-fg: #ffffff}.text-info{--bslib-color-fg: #0dcaf0}.bg-info{--bslib-color-bg: #0dcaf0;--bslib-color-fg: #000}.text-warning{--bslib-color-fg: #ffc107}.bg-warning{--bslib-color-bg: #ffc107;--bslib-color-fg: #000}.text-danger{--bslib-color-fg: #dc3545}.bg-danger{--bslib-color-bg: #dc3545;--bslib-color-fg: #ffffff}.text-light{--bslib-color-fg: #f8f9fa}.bg-light{--bslib-color-bg: #f8f9fa;--bslib-color-fg: #000}.text-dark{--bslib-color-fg: #212529}.bg-dark{--bslib-color-bg: #212529;--bslib-color-fg: #ffffff}.bg-gradient-blue-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #3148f9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3148f9;color:#fff}.bg-gradient-blue-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #345ce5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #345ce5;color:#fff}.bg-gradient-blue-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #5d56cd;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #5d56cd;color:#fff}.bg-gradient-blue-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #6057b3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #6057b3;color:#fff}.bg-gradient-blue-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #6d74a0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #6d74a0;color:#fff}.bg-gradient-blue-yellow{--bslib-color-fg: #000;--bslib-color-bg: #6e8f9b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #6e8f9b;color:#000}.bg-gradient-blue-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #1278b9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #1278b9;color:#fff}.bg-gradient-blue-teal{--bslib-color-fg: #000;--bslib-color-bg: #1592d4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1592d4;color:#000}.bg-gradient-blue-cyan{--bslib-color-fg: #000;--bslib-color-bg: #0d93f8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0d6efd var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #0d93f8;color:#000}.bg-gradient-indigo-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #4236f6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #4236f6;color:#fff}.bg-gradient-indigo-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #6a24de;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #6a24de;color:#fff}.bg-gradient-indigo-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #931ec6;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #931ec6;color:#fff}.bg-gradient-indigo-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #951fad;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #951fad;color:#fff}.bg-gradient-indigo-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #a23c99;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a23c99;color:#fff}.bg-gradient-indigo-yellow{--bslib-color-fg: #ffffff;--bslib-color-bg: #a35794;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #a35794;color:#fff}.bg-gradient-indigo-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #4740b3;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #4740b3;color:#fff}.bg-gradient-indigo-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: #4a5ace;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4a5ace;color:#fff}.bg-gradient-indigo-cyan{--bslib-color-fg: #ffffff;--bslib-color-bg: #425af1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6610f2 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #425af1;color:#fff}.bg-gradient-purple-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #4854d9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #4854d9;color:#fff}.bg-gradient-purple-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #6b2ed5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #6b2ed5;color:#fff}.bg-gradient-purple-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #983ca9;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #983ca9;color:#fff}.bg-gradient-purple-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #9b3d8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #9b3d8f;color:#fff}.bg-gradient-purple-orange{--bslib-color-fg: #ffffff;--bslib-color-bg: #a85a7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #a85a7c;color:#fff}.bg-gradient-purple-yellow{--bslib-color-fg: #000;--bslib-color-bg: #a97577;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #a97577;color:#000}.bg-gradient-purple-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #4d5e95;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #4d5e95;color:#fff}.bg-gradient-purple-teal{--bslib-color-fg: #ffffff;--bslib-color-bg: #4f78b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #4f78b0;color:#fff}.bg-gradient-purple-cyan{--bslib-color-fg: #000;--bslib-color-bg: #4878d4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #6f42c1 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #4878d4;color:#000}.bg-gradient-pink-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #864bb4;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #864bb4;color:#fff}.bg-gradient-pink-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #a925b0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #a925b0;color:#fff}.bg-gradient-pink-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #ad399c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #ad399c;color:#fff}.bg-gradient-pink-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #d8346b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #d8346b;color:#fff}.bg-gradient-pink-orange{--bslib-color-fg: #000;--bslib-color-bg: #e65157;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #e65157;color:#000}.bg-gradient-pink-yellow{--bslib-color-fg: #000;--bslib-color-bg: #e66c52;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #e66c52;color:#000}.bg-gradient-pink-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #8a5571;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #8a5571;color:#fff}.bg-gradient-pink-teal{--bslib-color-fg: #000;--bslib-color-bg: #8d6f8c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #8d6f8c;color:#000}.bg-gradient-pink-cyan{--bslib-color-fg: #000;--bslib-color-bg: #866faf;background:linear-gradient(var(--bg-gradient-deg, 140deg), #d63384 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #866faf;color:#000}.bg-gradient-red-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #894c8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #894c8f;color:#fff}.bg-gradient-red-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #ad268a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #ad268a;color:#fff}.bg-gradient-red-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #b03a77;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #b03a77;color:#fff}.bg-gradient-red-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #da345e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #da345e;color:#fff}.bg-gradient-red-orange{--bslib-color-fg: #000;--bslib-color-bg: #e95231;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #e95231;color:#000}.bg-gradient-red-yellow{--bslib-color-fg: #000;--bslib-color-bg: #ea6d2c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #ea6d2c;color:#000}.bg-gradient-red-green{--bslib-color-fg: #ffffff;--bslib-color-bg: #8e564b;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #8e564b;color:#fff}.bg-gradient-red-teal{--bslib-color-fg: #000;--bslib-color-bg: #917066;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #917066;color:#000}.bg-gradient-red-cyan{--bslib-color-fg: #000;--bslib-color-bg: #897189;background:linear-gradient(var(--bg-gradient-deg, 140deg), #dc3545 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #897189;color:#000}.bg-gradient-orange-blue{--bslib-color-fg: #000;--bslib-color-bg: #9d7871;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #9d7871;color:#000}.bg-gradient-orange-indigo{--bslib-color-fg: #000;--bslib-color-bg: #c1526d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c1526d;color:#000}.bg-gradient-orange-purple{--bslib-color-fg: #000;--bslib-color-bg: #c46659;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c46659;color:#000}.bg-gradient-orange-pink{--bslib-color-fg: #000;--bslib-color-bg: #ed6041;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #ed6041;color:#000}.bg-gradient-orange-red{--bslib-color-fg: #000;--bslib-color-bg: #f06128;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #f06128;color:#000}.bg-gradient-orange-yellow{--bslib-color-fg: #000;--bslib-color-bg: #fe990f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #fe990f;color:#000}.bg-gradient-orange-green{--bslib-color-fg: #000;--bslib-color-bg: #a2822e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #a2822e;color:#000}.bg-gradient-orange-teal{--bslib-color-fg: #000;--bslib-color-bg: #a59c48;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a59c48;color:#000}.bg-gradient-orange-cyan{--bslib-color-fg: #000;--bslib-color-bg: #9d9c6c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #fd7e14 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #9d9c6c;color:#000}.bg-gradient-yellow-blue{--bslib-color-fg: #000;--bslib-color-bg: #9ea069;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #9ea069;color:#000}.bg-gradient-yellow-indigo{--bslib-color-fg: #000;--bslib-color-bg: #c27a65;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #c27a65;color:#000}.bg-gradient-yellow-purple{--bslib-color-fg: #000;--bslib-color-bg: #c58e51;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #c58e51;color:#000}.bg-gradient-yellow-pink{--bslib-color-fg: #000;--bslib-color-bg: #ef8839;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #ef8839;color:#000}.bg-gradient-yellow-red{--bslib-color-fg: #000;--bslib-color-bg: #f18920;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #f18920;color:#000}.bg-gradient-yellow-orange{--bslib-color-fg: #000;--bslib-color-bg: #fea60c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #fea60c;color:#000}.bg-gradient-yellow-green{--bslib-color-fg: #000;--bslib-color-bg: #a3aa26;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #a3aa26;color:#000}.bg-gradient-yellow-teal{--bslib-color-fg: #000;--bslib-color-bg: #a6c441;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #a6c441;color:#000}.bg-gradient-yellow-cyan{--bslib-color-fg: #000;--bslib-color-bg: #9ec564;background:linear-gradient(var(--bg-gradient-deg, 140deg), #ffc107 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #9ec564;color:#000}.bg-gradient-green-blue{--bslib-color-fg: #ffffff;--bslib-color-bg: #147d98;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #147d98;color:#fff}.bg-gradient-green-indigo{--bslib-color-fg: #ffffff;--bslib-color-bg: #385793;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #385793;color:#fff}.bg-gradient-green-purple{--bslib-color-fg: #ffffff;--bslib-color-bg: #3b6b80;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3b6b80;color:#fff}.bg-gradient-green-pink{--bslib-color-fg: #ffffff;--bslib-color-bg: #656567;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #656567;color:#fff}.bg-gradient-green-red{--bslib-color-fg: #ffffff;--bslib-color-bg: #67664e;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #67664e;color:#fff}.bg-gradient-green-orange{--bslib-color-fg: #000;--bslib-color-bg: #74833a;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #74833a;color:#000}.bg-gradient-green-yellow{--bslib-color-fg: #000;--bslib-color-bg: #759e35;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #759e35;color:#000}.bg-gradient-green-teal{--bslib-color-fg: #000;--bslib-color-bg: #1ca16f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #1ca16f;color:#000}.bg-gradient-green-cyan{--bslib-color-fg: #000;--bslib-color-bg: #14a292;background:linear-gradient(var(--bg-gradient-deg, 140deg), #198754 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #14a292;color:#000}.bg-gradient-teal-blue{--bslib-color-fg: #000;--bslib-color-bg: #18a5c0;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #18a5c0;color:#000}.bg-gradient-teal-indigo{--bslib-color-fg: #000;--bslib-color-bg: #3c7fbb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3c7fbb;color:#000}.bg-gradient-teal-purple{--bslib-color-fg: #000;--bslib-color-bg: #4093a8;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #4093a8;color:#000}.bg-gradient-teal-pink{--bslib-color-fg: #000;--bslib-color-bg: #698d8f;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #698d8f;color:#000}.bg-gradient-teal-red{--bslib-color-fg: #000;--bslib-color-bg: #6b8e76;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #6b8e76;color:#000}.bg-gradient-teal-orange{--bslib-color-fg: #000;--bslib-color-bg: #78ab63;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #78ab63;color:#000}.bg-gradient-teal-yellow{--bslib-color-fg: #000;--bslib-color-bg: #79c65d;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #79c65d;color:#000}.bg-gradient-teal-green{--bslib-color-fg: #000;--bslib-color-bg: #1daf7c;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #1daf7c;color:#000}.bg-gradient-teal-cyan{--bslib-color-fg: #000;--bslib-color-bg: #18c9bb;background:linear-gradient(var(--bg-gradient-deg, 140deg), #20c997 var(--bg-gradient-start, 36%), #0dcaf0 var(--bg-gradient-end, 180%)) #18c9bb;color:#000}.bg-gradient-cyan-blue{--bslib-color-fg: #000;--bslib-color-bg: #0da5f5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #0d6efd var(--bg-gradient-end, 180%)) #0da5f5;color:#000}.bg-gradient-cyan-indigo{--bslib-color-fg: #000;--bslib-color-bg: #3180f1;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6610f2 var(--bg-gradient-end, 180%)) #3180f1;color:#000}.bg-gradient-cyan-purple{--bslib-color-fg: #000;--bslib-color-bg: #3494dd;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #6f42c1 var(--bg-gradient-end, 180%)) #3494dd;color:#000}.bg-gradient-cyan-pink{--bslib-color-fg: #000;--bslib-color-bg: #5d8ec5;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #d63384 var(--bg-gradient-end, 180%)) #5d8ec5;color:#000}.bg-gradient-cyan-red{--bslib-color-fg: #000;--bslib-color-bg: #608eac;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #dc3545 var(--bg-gradient-end, 180%)) #608eac;color:#000}.bg-gradient-cyan-orange{--bslib-color-fg: #000;--bslib-color-bg: #6dac98;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #fd7e14 var(--bg-gradient-end, 180%)) #6dac98;color:#000}.bg-gradient-cyan-yellow{--bslib-color-fg: #000;--bslib-color-bg: #6ec693;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #ffc107 var(--bg-gradient-end, 180%)) #6ec693;color:#000}.bg-gradient-cyan-green{--bslib-color-fg: #000;--bslib-color-bg: #12afb2;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #198754 var(--bg-gradient-end, 180%)) #12afb2;color:#000}.bg-gradient-cyan-teal{--bslib-color-fg: #000;--bslib-color-bg: #15cacc;background:linear-gradient(var(--bg-gradient-deg, 140deg), #0dcaf0 var(--bg-gradient-start, 36%), #20c997 var(--bg-gradient-end, 180%)) #15cacc;color:#000}:root{--bslib-value-box-shadow: none;--bslib-value-box-border-width-auto-yes: var(--bslib-value-box-border-width-baseline);--bslib-value-box-border-width-auto-no: 0;--bslib-value-box-border-width-baseline: 1px}.bslib-value-box{border-width:var(--bslib-value-box-border-width-auto-no, var(--bslib-value-box-border-width-baseline));container-name:bslib-value-box;container-type:inline-size}.bslib-value-box.card{box-shadow:var(--bslib-value-box-shadow)}.bslib-value-box.border-auto{border-width:var(--bslib-value-box-border-width-auto-yes, var(--bslib-value-box-border-width-baseline))}.bslib-value-box.default{--bslib-value-box-bg-default: var(--bs-card-bg, #ffffff);--bslib-value-box-border-color-default: var(--bs-card-border-color, rgba(0, 0, 0, 0.175));color:var(--bslib-value-box-color);background-color:var(--bslib-value-box-bg, var(--bslib-value-box-bg-default));border-color:var(--bslib-value-box-border-color, var(--bslib-value-box-border-color-default))}.bslib-value-box .value-box-grid{display:grid;grid-template-areas:"left right";align-items:center;overflow:hidden}.bslib-value-box .value-box-showcase{height:100%;max-height:var(---bslib-value-box-showcase-max-h, 100%)}.bslib-value-box .value-box-showcase,.bslib-value-box .value-box-showcase>.html-fill-item{width:100%}.bslib-value-box[data-full-screen=true] .value-box-showcase{max-height:var(---bslib-value-box-showcase-max-h-fs, 100%)}@media screen and (min-width: 575.98px){@container bslib-value-box (max-width: 300px){.bslib-value-box:not(.showcase-bottom) .value-box-grid{grid-template-columns:1fr !important;grid-template-rows:auto auto;grid-template-areas:"top" "bottom"}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-showcase{grid-area:top !important}.bslib-value-box:not(.showcase-bottom) .value-box-grid .value-box-area{grid-area:bottom !important;justify-content:end}}}.bslib-value-box .value-box-area{justify-content:center;padding:1.5rem 1rem;font-size:.9rem;font-weight:500}.bslib-value-box .value-box-area *{margin-bottom:0;margin-top:0}.bslib-value-box .value-box-title{font-size:1rem;margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.bslib-value-box .value-box-title:empty::after{content:" "}.bslib-value-box .value-box-value{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}@media(min-width: 1200px){.bslib-value-box .value-box-value{font-size:1.65rem}}.bslib-value-box .value-box-value:empty::after{content:" "}.bslib-value-box .value-box-showcase{align-items:center;justify-content:center;margin-top:auto;margin-bottom:auto;padding:1rem}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{opacity:.85;min-width:50px;max-width:125%}.bslib-value-box .value-box-showcase .bi,.bslib-value-box .value-box-showcase .fa,.bslib-value-box .value-box-showcase .fab,.bslib-value-box .value-box-showcase .fas,.bslib-value-box .value-box-showcase .far{font-size:4rem}.bslib-value-box.showcase-top-right .value-box-grid{grid-template-columns:1fr var(---bslib-value-box-showcase-w, 50%)}.bslib-value-box.showcase-top-right .value-box-grid .value-box-showcase{grid-area:right;margin-left:auto;align-self:start;align-items:end;padding-left:0;padding-bottom:0}.bslib-value-box.showcase-top-right .value-box-grid .value-box-area{grid-area:left;align-self:end}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid{grid-template-columns:auto var(---bslib-value-box-showcase-w-fs, 1fr)}.bslib-value-box.showcase-top-right[data-full-screen=true] .value-box-grid>div{align-self:center}.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-showcase{margin-top:0}@container bslib-value-box (max-width: 300px){.bslib-value-box.showcase-top-right:not([data-full-screen=true]) .value-box-grid .value-box-showcase{padding-left:1rem}}.bslib-value-box.showcase-left-center .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w, 30%) auto}.bslib-value-box.showcase-left-center[data-full-screen=true] .value-box-grid{grid-template-columns:var(---bslib-value-box-showcase-w-fs, 1fr) auto}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-showcase{grid-area:left}.bslib-value-box.showcase-left-center:not([data-fill-screen=true]) .value-box-grid .value-box-area{grid-area:right}.bslib-value-box.showcase-bottom .value-box-grid{grid-template-columns:1fr;grid-template-rows:1fr var(---bslib-value-box-showcase-h, auto);grid-template-areas:"top" "bottom";overflow:hidden}.bslib-value-box.showcase-bottom .value-box-grid .value-box-showcase{grid-area:bottom;padding:0;margin:0}.bslib-value-box.showcase-bottom .value-box-grid .value-box-area{grid-area:top}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid{grid-template-rows:1fr var(---bslib-value-box-showcase-h-fs, 2fr)}.bslib-value-box.showcase-bottom[data-full-screen=true] .value-box-grid .value-box-showcase{padding:1rem}[data-bs-theme=dark] .bslib-value-box{--bslib-value-box-shadow: 0 0.5rem 1rem rgb(0 0 0 / 50%)}@media(min-width: 576px){.nav:not(.nav-hidden){display:flex !important;display:-webkit-flex !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column){float:none !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.bslib-nav-spacer{margin-left:auto !important}.nav:not(.nav-hidden):not(.nav-stacked):not(.flex-column)>.form-inline{margin-top:auto;margin-bottom:auto}.nav:not(.nav-hidden).nav-stacked{flex-direction:column;-webkit-flex-direction:column;height:100%}.nav:not(.nav-hidden).nav-stacked>.bslib-nav-spacer{margin-top:auto !important}}.bslib-card{overflow:auto}.bslib-card .card-body+.card-body{padding-top:0}.bslib-card .card-body{overflow:auto}.bslib-card .card-body p{margin-top:0}.bslib-card .card-body p:last-child{margin-bottom:0}.bslib-card .card-body{max-height:var(--bslib-card-body-max-height, none)}.bslib-card[data-full-screen=true]>.card-body{max-height:var(--bslib-card-body-max-height-full-screen, none)}.bslib-card .card-header .form-group{margin-bottom:0}.bslib-card .card-header .selectize-control{margin-bottom:0}.bslib-card .card-header .selectize-control .item{margin-right:1.15rem}.bslib-card .card-footer{margin-top:auto}.bslib-card .bslib-navs-card-title{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center}.bslib-card .bslib-navs-card-title .nav{margin-left:auto}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border=true]){border:none}.bslib-card .bslib-sidebar-layout:not([data-bslib-sidebar-border-radius=true]){border-top-left-radius:0;border-top-right-radius:0}[data-full-screen=true]{position:fixed;inset:3.5rem 1rem 1rem;height:auto !important;max-height:none !important;width:auto !important;z-index:1070}.bslib-full-screen-enter{display:none;position:absolute;bottom:var(--bslib-full-screen-enter-bottom, 0.2rem);right:var(--bslib-full-screen-enter-right, 0);top:var(--bslib-full-screen-enter-top);left:var(--bslib-full-screen-enter-left);color:var(--bslib-color-fg, var(--bs-card-color));background-color:var(--bslib-color-bg, var(--bs-card-bg, var(--bs-body-bg)));border:var(--bs-card-border-width) solid var(--bslib-color-fg, var(--bs-card-border-color));box-shadow:0 2px 4px rgba(0,0,0,.15);margin:.2rem .4rem;padding:.55rem !important;font-size:.8rem;cursor:pointer;opacity:.7;z-index:1070}.bslib-full-screen-enter:hover{opacity:1}.card[data-full-screen=false]:hover>*>.bslib-full-screen-enter{display:block}.bslib-has-full-screen .card:hover>*>.bslib-full-screen-enter{display:none}@media(max-width: 575.98px){.bslib-full-screen-enter{display:none !important}}.bslib-full-screen-exit{position:relative;top:1.35rem;font-size:.9rem;cursor:pointer;text-decoration:none;display:flex;float:right;margin-right:2.15rem;align-items:center;color:rgba(var(--bs-body-bg-rgb), 0.8)}.bslib-full-screen-exit:hover{color:rgba(var(--bs-body-bg-rgb), 1)}.bslib-full-screen-exit svg{margin-left:.5rem;font-size:1.5rem}#bslib-full-screen-overlay{position:fixed;inset:0;background-color:rgba(var(--bs-body-color-rgb), 0.6);backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);z-index:1069;animation:bslib-full-screen-overlay-enter 400ms cubic-bezier(0.6, 0.02, 0.65, 1) forwards}@keyframes bslib-full-screen-overlay-enter{0%{opacity:0}100%{opacity:1}}.bslib-grid{display:grid !important;gap:var(--bslib-spacer, 1rem);height:var(--bslib-grid-height)}.bslib-grid.grid{grid-template-columns:repeat(var(--bs-columns, 12), minmax(0, 1fr));grid-template-rows:unset;grid-auto-rows:var(--bslib-grid--row-heights);--bslib-grid--row-heights--xs: unset;--bslib-grid--row-heights--sm: unset;--bslib-grid--row-heights--md: unset;--bslib-grid--row-heights--lg: unset;--bslib-grid--row-heights--xl: unset;--bslib-grid--row-heights--xxl: unset}.bslib-grid.grid.bslib-grid--row-heights--xs{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xs)}@media(min-width: 576px){.bslib-grid.grid.bslib-grid--row-heights--sm{--bslib-grid--row-heights: var(--bslib-grid--row-heights--sm)}}@media(min-width: 768px){.bslib-grid.grid.bslib-grid--row-heights--md{--bslib-grid--row-heights: var(--bslib-grid--row-heights--md)}}@media(min-width: 992px){.bslib-grid.grid.bslib-grid--row-heights--lg{--bslib-grid--row-heights: var(--bslib-grid--row-heights--lg)}}@media(min-width: 1200px){.bslib-grid.grid.bslib-grid--row-heights--xl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xl)}}@media(min-width: 1400px){.bslib-grid.grid.bslib-grid--row-heights--xxl{--bslib-grid--row-heights: var(--bslib-grid--row-heights--xxl)}}.bslib-grid>*>.shiny-input-container{width:100%}.bslib-grid-item{grid-column:auto/span 1}@media(max-width: 767.98px){.bslib-grid-item{grid-column:1/-1}}@media(max-width: 575.98px){.bslib-grid{grid-template-columns:1fr !important;height:var(--bslib-grid-height-mobile)}.bslib-grid.grid{height:unset !important;grid-auto-rows:var(--bslib-grid--row-heights--xs, auto)}}.accordion .accordion-header{font-size:calc(1.29rem + 0.48vw);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color);margin-bottom:0}@media(min-width: 1200px){.accordion .accordion-header{font-size:1.65rem}}.accordion .accordion-icon:not(:empty){margin-right:.75rem;display:flex}.accordion .accordion-button:not(.collapsed){box-shadow:none}.accordion .accordion-button:not(.collapsed):focus{box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.navbar+.container-fluid:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-sm:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-md:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-lg:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xl:has(>.tab-content>.tab-pane.active.html-fill-container),.navbar+.container-xxl:has(>.tab-content>.tab-pane.active.html-fill-container){padding-left:0;padding-right:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container,.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container{padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container:has(>.bslib-sidebar-layout:only-child){padding:0}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border=true]){border-left:none;border-right:none;border-bottom:none}.navbar+.container-fluid>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-sm>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-md>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-lg>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]),.navbar+.container-xxl>.tab-content>.tab-pane.active.html-fill-container>.bslib-sidebar-layout:only-child:not([data-bslib-sidebar-border-radius=true]){border-radius:0}.navbar+div>.bslib-sidebar-layout{border-top:var(--bslib-sidebar-border)}html{height:100%}.bslib-page-fill{width:100%;height:100%;margin:0;padding:var(--bslib-spacer, 1rem);gap:var(--bslib-spacer, 1rem)}@media(max-width: 575.98px){.bslib-page-fill{height:var(--bslib-page-fill-mobile-height, auto)}}:root{--bslib-page-sidebar-title-bg: #517699;--bslib-page-sidebar-title-color: #ffffff}.bslib-page-title{background-color:var(--bslib-page-sidebar-title-bg);color:var(--bslib-page-sidebar-title-color);font-size:1.25rem;font-weight:300;padding:var(--bslib-spacer, 1rem);padding-left:1.5rem;margin-bottom:0;border-bottom:1px solid #fff}.bslib-sidebar-layout{--bslib-sidebar-transition-duration: 500ms;--bslib-sidebar-transition-easing-x: cubic-bezier(0.8, 0.78, 0.22, 1.07);--bslib-sidebar-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-border-radius: var(--bs-border-radius);--bslib-sidebar-vert-border: var(--bs-card-border-width, 1px) solid var(--bs-card-border-color, rgba(0, 0, 0, 0.175));--bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--bslib-sidebar-fg: var(--bs-emphasis-color, black);--bslib-sidebar-main-fg: var(--bs-card-color, var(--bs-body-color));--bslib-sidebar-main-bg: var(--bs-card-bg, var(--bs-body-bg));--bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--bslib-sidebar-padding: calc(var(--bslib-spacer) * 1.5);--bslib-sidebar-icon-size: var(--bslib-spacer, 1rem);--bslib-sidebar-icon-button-size: calc(var(--bslib-sidebar-icon-size, 1rem) * 2);--bslib-sidebar-padding-icon: calc(var(--bslib-sidebar-icon-button-size, 2rem) * 1.5);--bslib-collapse-toggle-border-radius: var(--bs-border-radius, 0.375rem);--bslib-collapse-toggle-transform: 0deg;--bslib-sidebar-toggle-transition-easing: cubic-bezier(1, 0, 0, 1);--bslib-collapse-toggle-right-transform: 180deg;--bslib-sidebar-column-main: minmax(0, 1fr);display:grid !important;grid-template-columns:min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px)) var(--bslib-sidebar-column-main);position:relative;transition:grid-template-columns ease-in-out var(--bslib-sidebar-transition-duration);border:var(--bslib-sidebar-border);border-radius:var(--bslib-sidebar-border-radius)}@media(prefers-reduced-motion: reduce){.bslib-sidebar-layout{transition:none}}.bslib-sidebar-layout[data-bslib-sidebar-border=false]{border:none}.bslib-sidebar-layout[data-bslib-sidebar-border-radius=false]{border-radius:initial}.bslib-sidebar-layout>.main,.bslib-sidebar-layout>.sidebar{grid-row:1/2;border-radius:inherit;overflow:auto}.bslib-sidebar-layout>.main{grid-column:2/3;border-top-left-radius:0;border-bottom-left-radius:0;padding:var(--bslib-sidebar-padding);transition:padding var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration);color:var(--bslib-sidebar-main-fg);background-color:var(--bslib-sidebar-main-bg)}.bslib-sidebar-layout>.sidebar{grid-column:1/2;width:100%;height:100%;border-right:var(--bslib-sidebar-vert-border);border-top-right-radius:0;border-bottom-right-radius:0;color:var(--bslib-sidebar-fg);background-color:var(--bslib-sidebar-bg);backdrop-filter:blur(5px)}.bslib-sidebar-layout>.sidebar>.sidebar-content{display:flex;flex-direction:column;gap:var(--bslib-spacer, 1rem);padding:var(--bslib-sidebar-padding);padding-top:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout>.sidebar>.sidebar-content>:last-child:not(.sidebar-title){margin-bottom:0}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion{margin-left:calc(-1*var(--bslib-sidebar-padding));margin-right:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:last-child{margin-bottom:calc(-1*var(--bslib-sidebar-padding))}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child){margin-bottom:1rem}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion .accordion-body{display:flex;flex-direction:column}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:first-child) .accordion-item:first-child{border-top:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content>.accordion:not(:last-child) .accordion-item:last-child{border-bottom:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.bslib-sidebar-layout>.sidebar>.sidebar-content.has-accordion>.sidebar-title{border-bottom:none;padding-bottom:0}.bslib-sidebar-layout>.sidebar .shiny-input-container{width:100%}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar>.sidebar-content{padding-top:var(--bslib-sidebar-padding)}.bslib-sidebar-layout>.collapse-toggle{grid-row:1/2;grid-column:1/2;display:inline-flex;align-items:center;position:absolute;right:calc(var(--bslib-sidebar-icon-size));top:calc(var(--bslib-sidebar-icon-size, 1rem)/2);border:none;border-radius:var(--bslib-collapse-toggle-border-radius);height:var(--bslib-sidebar-icon-button-size, 2rem);width:var(--bslib-sidebar-icon-button-size, 2rem);display:flex;align-items:center;justify-content:center;padding:0;color:var(--bslib-sidebar-fg);background-color:unset;transition:color var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),top var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),right var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration),left var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover{background-color:var(--bslib-sidebar-toggle-bg)}.bslib-sidebar-layout>.collapse-toggle>.collapse-icon{opacity:.8;width:var(--bslib-sidebar-icon-size);height:var(--bslib-sidebar-icon-size);transform:rotateY(var(--bslib-collapse-toggle-transform));transition:transform var(--bslib-sidebar-toggle-transition-easing) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout>.collapse-toggle:hover>.collapse-icon{opacity:1}.bslib-sidebar-layout .sidebar-title{font-size:1.25rem;line-height:1.25;margin-top:0;margin-bottom:1rem;padding-bottom:1rem;border-bottom:var(--bslib-sidebar-border)}.bslib-sidebar-layout.sidebar-right{grid-template-columns:var(--bslib-sidebar-column-main) min(100% - var(--bslib-sidebar-icon-size),var(--bslib-sidebar-width, 250px))}.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/2;border-top-right-radius:0;border-bottom-right-radius:0;border-top-left-radius:inherit;border-bottom-left-radius:inherit}.bslib-sidebar-layout.sidebar-right>.sidebar{grid-column:2/3;border-right:none;border-left:var(--bslib-sidebar-vert-border);border-top-left-radius:0;border-bottom-left-radius:0}.bslib-sidebar-layout.sidebar-right>.collapse-toggle{grid-column:2/3;left:var(--bslib-sidebar-icon-size);right:unset;border:var(--bslib-collapse-toggle-border)}.bslib-sidebar-layout.sidebar-right>.collapse-toggle>.collapse-icon{transform:rotateY(var(--bslib-collapse-toggle-right-transform))}.bslib-sidebar-layout.sidebar-collapsed{--bslib-collapse-toggle-transform: 180deg;--bslib-collapse-toggle-right-transform: 0deg;--bslib-sidebar-vert-border: none;grid-template-columns:0 minmax(0, 1fr)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right{grid-template-columns:minmax(0, 1fr) 0}.bslib-sidebar-layout.sidebar-collapsed:not(.transitioning)>.sidebar>*{display:none}.bslib-sidebar-layout.sidebar-collapsed>.main{border-radius:inherit}.bslib-sidebar-layout.sidebar-collapsed:not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout.sidebar-collapsed>.collapse-toggle{color:var(--bslib-sidebar-main-fg);top:calc(var(--bslib-sidebar-overlap-counter, 0)*(var(--bslib-sidebar-icon-size) + var(--bslib-sidebar-padding)) + var(--bslib-sidebar-icon-size, 1rem)/2);right:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px))}.bslib-sidebar-layout.sidebar-collapsed.sidebar-right>.collapse-toggle{left:calc(-2.5*var(--bslib-sidebar-icon-size) - var(--bs-card-border-width, 1px));right:unset}@media(min-width: 576px){.bslib-sidebar-layout.transitioning>.sidebar>.sidebar-content{display:none}}@media(max-width: 575.98px){.bslib-sidebar-layout[data-bslib-sidebar-open=desktop]{--bslib-sidebar-js-init-collapsed: true}.bslib-sidebar-layout>.sidebar,.bslib-sidebar-layout.sidebar-right>.sidebar{border:none}.bslib-sidebar-layout>.main,.bslib-sidebar-layout.sidebar-right>.main{grid-column:1/3}.bslib-sidebar-layout[data-bslib-sidebar-open=always]{display:block !important}.bslib-sidebar-layout[data-bslib-sidebar-open=always]>.sidebar{max-height:var(--bslib-sidebar-max-height-mobile);overflow-y:auto;border-top:var(--bslib-sidebar-vert-border)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]){grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.sidebar{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-collapsed)>.collapse-toggle{z-index:1}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed{grid-template-columns:0 100%}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed.sidebar-right{grid-template-columns:100% 0}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]):not(.sidebar-right)>.main{padding-left:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-right>.main{padding-right:var(--bslib-sidebar-padding-icon)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always])>.main{opacity:0;transition:opacity var(--bslib-sidebar-transition-easing-x) var(--bslib-sidebar-transition-duration)}.bslib-sidebar-layout:not([data-bslib-sidebar-open=always]).sidebar-collapsed>.main{opacity:1}}.html-fill-container{display:flex;flex-direction:column;min-height:0;min-width:0}.html-fill-container>.html-fill-item{flex:1 1 auto;min-height:0;min-width:0}.html-fill-container>:not(.html-fill-item){flex:0 0 auto}.tippy-box[data-theme~=quarto]{background-color:#fff;border:solid 1px #fff;border-radius:.375rem;color:#212529;font-size:.875rem}.tippy-box[data-theme~=quarto]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=quarto]>.tippy-arrow:after,.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=quarto]>.tippy-arrow:after{border-color:rgba(0,0,0,0);border-style:solid}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-6px}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-6px}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-6px}.tippy-box[data-placement^=left]>.tippy-arrow:before{right:-6px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-arrow:after{border-top-color:#fff;border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=quarto][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:#fff;border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:15px}.tippy-box[data-theme~=quarto][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-arrow:after{border-left-color:#fff;border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=quarto][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:#fff}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=quarto][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow{fill:#212529}.tippy-box[data-theme~=quarto]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px}.top-right{position:absolute;top:1em;right:1em}.visually-hidden{border:0;clip:rect(0 0 0 0);height:auto;margin:0;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.hidden{display:none !important}.zindex-bottom{z-index:-1 !important}figure.figure{display:block}.quarto-layout-panel{margin-bottom:1em}.quarto-layout-panel>figure{width:100%}.quarto-layout-panel>figure>figcaption,.quarto-layout-panel>.panel-caption{margin-top:10pt}.quarto-layout-panel>.table-caption{margin-top:0px}.table-caption p{margin-bottom:.5em}.quarto-layout-row{display:flex;flex-direction:row;align-items:flex-start}.quarto-layout-valign-top{align-items:flex-start}.quarto-layout-valign-bottom{align-items:flex-end}.quarto-layout-valign-center{align-items:center}.quarto-layout-cell{position:relative;margin-right:20px}.quarto-layout-cell:last-child{margin-right:0}.quarto-layout-cell figure,.quarto-layout-cell>p{margin:.2em}.quarto-layout-cell img{max-width:100%}.quarto-layout-cell .html-widget{width:100% !important}.quarto-layout-cell div figure p{margin:0}.quarto-layout-cell figure{display:block;margin-inline-start:0;margin-inline-end:0}.quarto-layout-cell table{display:inline-table}.quarto-layout-cell-subref figcaption,figure .quarto-layout-row figure figcaption{text-align:center;font-style:italic}.quarto-figure{position:relative;margin-bottom:1em}.quarto-figure>figure{width:100%;margin-bottom:0}.quarto-figure-left>figure>p,.quarto-figure-left>figure>div{text-align:left}.quarto-figure-center>figure>p,.quarto-figure-center>figure>div{text-align:center}.quarto-figure-right>figure>p,.quarto-figure-right>figure>div{text-align:right}.quarto-figure>figure>div.cell-annotation,.quarto-figure>figure>div code{text-align:left}figure>p:empty{display:none}figure>p:first-child{margin-top:0;margin-bottom:0}figure>figcaption.quarto-float-caption-bottom{margin-bottom:.5em}figure>figcaption.quarto-float-caption-top{margin-top:.5em}div[id^=tbl-]{position:relative}.quarto-figure>.anchorjs-link{position:absolute;top:.6em;right:.5em}div[id^=tbl-]>.anchorjs-link{position:absolute;top:.7em;right:.3em}.quarto-figure:hover>.anchorjs-link,div[id^=tbl-]:hover>.anchorjs-link,h2:hover>.anchorjs-link,.h2:hover>.anchorjs-link,h3:hover>.anchorjs-link,.h3:hover>.anchorjs-link,h4:hover>.anchorjs-link,.h4:hover>.anchorjs-link,h5:hover>.anchorjs-link,.h5:hover>.anchorjs-link,h6:hover>.anchorjs-link,.h6:hover>.anchorjs-link,.reveal-anchorjs-link>.anchorjs-link{opacity:1}#title-block-header{margin-block-end:1rem;position:relative;margin-top:-1px}#title-block-header .abstract{margin-block-start:1rem}#title-block-header .abstract .abstract-title{font-weight:600}#title-block-header a{text-decoration:none}#title-block-header .author,#title-block-header .date,#title-block-header .doi{margin-block-end:.2rem}#title-block-header .quarto-title-block>div{display:flex}#title-block-header .quarto-title-block>div>h1,#title-block-header .quarto-title-block>div>.h1{flex-grow:1}#title-block-header .quarto-title-block>div>button{flex-shrink:0;height:2.25rem;margin-top:0}@media(min-width: 992px){#title-block-header .quarto-title-block>div>button{margin-top:5px}}tr.header>th>p:last-of-type{margin-bottom:0px}table,table.table{margin-top:.5rem;margin-bottom:.5rem}caption,.table-caption{padding-top:.5rem;padding-bottom:.5rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-top{margin-top:.5rem;margin-bottom:.25rem;text-align:center}figure.quarto-float-tbl figcaption.quarto-float-caption-bottom{padding-top:.25rem;margin-bottom:.5rem;text-align:center}.utterances{max-width:none;margin-left:-8px}iframe{margin-bottom:1em}details{margin-bottom:1em}details[show]{margin-bottom:0}details>summary{color:rgba(33,37,41,.75)}details>summary>p:only-child{display:inline}pre.sourceCode,code.sourceCode{position:relative}dd code:not(.sourceCode),p code:not(.sourceCode){white-space:pre-wrap}code{white-space:pre}@media print{code{white-space:pre-wrap}}pre>code{display:block}pre>code.sourceCode{white-space:pre}pre>code.sourceCode>span>a:first-child::before{text-decoration:none}pre.code-overflow-wrap>code.sourceCode{white-space:pre-wrap}pre.code-overflow-scroll>code.sourceCode{white-space:pre}code a:any-link{color:inherit;text-decoration:none}code a:hover{color:inherit;text-decoration:underline}ul.task-list{padding-left:1em}[data-tippy-root]{display:inline-block}.tippy-content .footnote-back{display:none}.footnote-back{margin-left:.2em}.tippy-content{overflow-x:auto}.quarto-embedded-source-code{display:none}.quarto-unresolved-ref{font-weight:600}.quarto-cover-image{max-width:35%;float:right;margin-left:30px}.cell-output-display .widget-subarea{margin-bottom:1em}.cell-output-display:not(.no-overflow-x),.knitsql-table:not(.no-overflow-x){overflow-x:auto}.panel-input{margin-bottom:1em}.panel-input>div,.panel-input>div>div{display:inline-block;vertical-align:top;padding-right:12px}.panel-input>p:last-child{margin-bottom:0}.layout-sidebar{margin-bottom:1em}.layout-sidebar .tab-content{border:none}.tab-content>.page-columns.active{display:grid}div.sourceCode>iframe{width:100%;height:300px;margin-bottom:-0.5em}a{text-underline-offset:3px}.callout pre.sourceCode{padding-left:0}div.ansi-escaped-output{font-family:monospace;display:block}/*! -* -* ansi colors from IPython notebook's -* -* we also add `bright-[color]-` synonyms for the `-[color]-intense` classes since -* that seems to be what ansi_up emits -* -*/.ansi-black-fg{color:#3e424d}.ansi-black-bg{background-color:#3e424d}.ansi-black-intense-black,.ansi-bright-black-fg{color:#282c36}.ansi-black-intense-black,.ansi-bright-black-bg{background-color:#282c36}.ansi-red-fg{color:#e75c58}.ansi-red-bg{background-color:#e75c58}.ansi-red-intense-red,.ansi-bright-red-fg{color:#b22b31}.ansi-red-intense-red,.ansi-bright-red-bg{background-color:#b22b31}.ansi-green-fg{color:#00a250}.ansi-green-bg{background-color:#00a250}.ansi-green-intense-green,.ansi-bright-green-fg{color:#007427}.ansi-green-intense-green,.ansi-bright-green-bg{background-color:#007427}.ansi-yellow-fg{color:#ddb62b}.ansi-yellow-bg{background-color:#ddb62b}.ansi-yellow-intense-yellow,.ansi-bright-yellow-fg{color:#b27d12}.ansi-yellow-intense-yellow,.ansi-bright-yellow-bg{background-color:#b27d12}.ansi-blue-fg{color:#208ffb}.ansi-blue-bg{background-color:#208ffb}.ansi-blue-intense-blue,.ansi-bright-blue-fg{color:#0065ca}.ansi-blue-intense-blue,.ansi-bright-blue-bg{background-color:#0065ca}.ansi-magenta-fg{color:#d160c4}.ansi-magenta-bg{background-color:#d160c4}.ansi-magenta-intense-magenta,.ansi-bright-magenta-fg{color:#a03196}.ansi-magenta-intense-magenta,.ansi-bright-magenta-bg{background-color:#a03196}.ansi-cyan-fg{color:#60c6c8}.ansi-cyan-bg{background-color:#60c6c8}.ansi-cyan-intense-cyan,.ansi-bright-cyan-fg{color:#258f8f}.ansi-cyan-intense-cyan,.ansi-bright-cyan-bg{background-color:#258f8f}.ansi-white-fg{color:#c5c1b4}.ansi-white-bg{background-color:#c5c1b4}.ansi-white-intense-white,.ansi-bright-white-fg{color:#a1a6b2}.ansi-white-intense-white,.ansi-bright-white-bg{background-color:#a1a6b2}.ansi-default-inverse-fg{color:#fff}.ansi-default-inverse-bg{background-color:#000}.ansi-bold{font-weight:bold}.ansi-underline{text-decoration:underline}:root{--quarto-body-bg: #ffffff;--quarto-body-color: #212529;--quarto-text-muted: rgba(33, 37, 41, 0.75);--quarto-border-color: white;--quarto-border-width: 1px;--quarto-border-radius: 0.375rem}table.gt_table{color:var(--quarto-body-color);font-size:1em;width:100%;background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_column_spanner_outer{color:var(--quarto-body-color);background-color:rgba(0,0,0,0);border-top-width:inherit;border-bottom-width:inherit;border-color:var(--quarto-border-color)}table.gt_table th.gt_col_heading{color:var(--quarto-body-color);font-weight:bold;background-color:rgba(0,0,0,0)}table.gt_table thead.gt_col_headings{border-bottom:1px solid currentColor;border-top-width:inherit;border-top-color:var(--quarto-border-color)}table.gt_table thead.gt_col_headings:not(:first-child){border-top-width:1px;border-top-color:var(--quarto-border-color)}table.gt_table td.gt_row{border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-width:0px}table.gt_table tbody.gt_table_body{border-top-width:1px;border-bottom-width:1px;border-bottom-color:var(--quarto-border-color);border-top-color:currentColor}div.columns{display:initial;gap:initial}div.column{display:inline-block;overflow-x:initial;vertical-align:top;width:50%}.code-annotation-tip-content{word-wrap:break-word}.code-annotation-container-hidden{display:none !important}dl.code-annotation-container-grid{display:grid;grid-template-columns:min-content auto}dl.code-annotation-container-grid dt{grid-column:1}dl.code-annotation-container-grid dd{grid-column:2}pre.sourceCode.code-annotation-code{padding-right:0}code.sourceCode .code-annotation-anchor{z-index:100;position:relative;float:right;background-color:rgba(0,0,0,0)}input[type=checkbox]{margin-right:.5ch}:root{--mermaid-bg-color: #ffffff;--mermaid-edge-color: #6c757d;--mermaid-node-fg-color: #212529;--mermaid-fg-color: #212529;--mermaid-fg-color--lighter: #383f45;--mermaid-fg-color--lightest: #4e5862;--mermaid-font-family: system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, Noto Sans, Liberation Sans, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;--mermaid-label-bg-color: #ffffff;--mermaid-label-fg-color: #0d6efd;--mermaid-node-bg-color: rgba(13, 110, 253, 0.1);--mermaid-node-fg-color: #212529}@media print{:root{font-size:11pt}#quarto-sidebar,#TOC,.nav-page{display:none}.page-columns .content{grid-column-start:page-start}.fixed-top{position:relative}.panel-caption,.figure-caption,figcaption{color:#666}}.code-copy-button{position:absolute;top:0;right:0;border:0;margin-top:5px;margin-right:5px;background-color:rgba(0,0,0,0);z-index:3}.code-copy-button:focus{outline:none}.code-copy-button-tooltip{font-size:.75em}pre.sourceCode:hover>.code-copy-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}pre.sourceCode:hover>.code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}pre.sourceCode:hover>.code-copy-button-checked:hover>.bi::before{background-image:url('data:image/svg+xml,')}main ol ol,main ul ul,main ol ul,main ul ol{margin-bottom:1em}ul>li:not(:has(>p))>ul,ol>li:not(:has(>p))>ul,ul>li:not(:has(>p))>ol,ol>li:not(:has(>p))>ol{margin-bottom:0}ul>li:not(:has(>p))>ul>li:has(>p),ol>li:not(:has(>p))>ul>li:has(>p),ul>li:not(:has(>p))>ol>li:has(>p),ol>li:not(:has(>p))>ol>li:has(>p){margin-top:1rem}body{margin:0}main.page-columns>header>h1.title,main.page-columns>header>.title.h1{margin-bottom:0}@media(min-width: 992px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] 35px [page-end-inset page-end] 5fr [screen-end-inset] 1.5em}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset] 35px [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(850px - 3em)) [body-content-end] 3em [body-end] 50px [body-end-outset] minmax(0px, 250px) [page-end-inset] minmax(50px, 100px) [page-end] 1fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 175px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 100px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start] minmax(50px, 100px) [page-start-inset] 50px [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(0px, 200px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 50px [page-start-inset] minmax(50px, 150px) [body-start-outset] 50px [body-start] 1.5em [body-content-start] minmax(450px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(50px, 150px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 991.98px){body .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.fullcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.slimcontent:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.listing:not(.floating):not(.docked) .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset] 5fr [body-start] 1.5em [body-content-start] minmax(500px, calc(1250px - 3em)) [body-content-end body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start] 35px [page-start-inset] minmax(0px, 145px) [body-start-outset] 35px [body-start] 1.5em [body-content-start] minmax(450px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1.5em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(1000px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(800px - 3em)) [body-content-end] 1.5em [body-end body-end-outset page-end-inset page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.docked.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.docked.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(25px, 50px) [page-end-inset] 50px [page-end] 5fr [screen-end-inset] 1.5em [screen-end]}body.floating.slimcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 35px [body-end-outset] minmax(75px, 145px) [page-end-inset] 35px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}body.floating.listing .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset] 5fr [page-start page-start-inset body-start-outset body-start] 1em [body-content-start] minmax(500px, calc(750px - 3em)) [body-content-end] 1.5em [body-end] 50px [body-end-outset] minmax(75px, 150px) [page-end-inset] 25px [page-end] 4fr [screen-end-inset] 1.5em [screen-end]}}@media(max-width: 767.98px){body .page-columns,body.fullcontent:not(.floating):not(.docked) .page-columns,body.slimcontent:not(.floating):not(.docked) .page-columns,body.docked .page-columns,body.docked.slimcontent .page-columns,body.docked.fullcontent .page-columns,body.floating .page-columns,body.floating.slimcontent .page-columns,body.floating.fullcontent .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}body:not(.floating):not(.docked) .page-columns.toc-left .page-columns{display:grid;gap:0;grid-template-columns:[screen-start] 1.5em [screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] minmax(0px, 1fr) [body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] 1.5em [screen-end]}nav[role=doc-toc]{display:none}}body,.page-row-navigation{grid-template-rows:[page-top] max-content [contents-top] max-content [contents-bottom] max-content [page-bottom]}.page-rows-contents{grid-template-rows:[content-top] minmax(max-content, 1fr) [content-bottom] minmax(60px, max-content) [page-bottom]}.page-full{grid-column:screen-start/screen-end !important}.page-columns>*{grid-column:body-content-start/body-content-end}.page-columns.column-page>*{grid-column:page-start/page-end}.page-columns.column-page-left .page-columns.page-full>*,.page-columns.column-page-left>*{grid-column:page-start/body-content-end}.page-columns.column-page-right .page-columns.page-full>*,.page-columns.column-page-right>*{grid-column:body-content-start/page-end}.page-rows{grid-auto-rows:auto}.header{grid-column:screen-start/screen-end;grid-row:page-top/contents-top}#quarto-content{padding:0;grid-column:screen-start/screen-end;grid-row:contents-top/contents-bottom}body.floating .sidebar.sidebar-navigation{grid-column:page-start/body-start;grid-row:content-top/page-bottom}body.docked .sidebar.sidebar-navigation{grid-column:screen-start/body-start;grid-row:content-top/page-bottom}.sidebar.toc-left{grid-column:page-start/body-start;grid-row:content-top/page-bottom}.sidebar.margin-sidebar{grid-column:body-end/page-end;grid-row:content-top/page-bottom}.page-columns .content{grid-column:body-content-start/body-content-end;grid-row:content-top/content-bottom;align-content:flex-start}.page-columns .page-navigation{grid-column:body-content-start/body-content-end;grid-row:content-bottom/page-bottom}.page-columns .footer{grid-column:screen-start/screen-end;grid-row:contents-bottom/page-bottom}.page-columns .column-body{grid-column:body-content-start/body-content-end}.page-columns .column-body-fullbleed{grid-column:body-start/body-end}.page-columns .column-body-outset{grid-column:body-start-outset/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset table{background:#fff}.page-columns .column-body-outset-left{grid-column:body-start-outset/body-content-end;z-index:998;opacity:.999}.page-columns .column-body-outset-left table{background:#fff}.page-columns .column-body-outset-right{grid-column:body-content-start/body-end-outset;z-index:998;opacity:.999}.page-columns .column-body-outset-right table{background:#fff}.page-columns .column-page{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-page table{background:#fff}.page-columns .column-page-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset table{background:#fff}.page-columns .column-page-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-inset-left table{background:#fff}.page-columns .column-page-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-page-inset-right figcaption table{background:#fff}.page-columns .column-page-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-page-left table{background:#fff}.page-columns .column-page-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-page-right figcaption table{background:#fff}#quarto-content.page-columns #quarto-margin-sidebar,#quarto-content.page-columns #quarto-sidebar{z-index:1}@media(max-width: 991.98px){#quarto-content.page-columns #quarto-margin-sidebar.collapse,#quarto-content.page-columns #quarto-sidebar.collapse,#quarto-content.page-columns #quarto-margin-sidebar.collapsing,#quarto-content.page-columns #quarto-sidebar.collapsing{z-index:1055}}#quarto-content.page-columns main.column-page,#quarto-content.page-columns main.column-page-right,#quarto-content.page-columns main.column-page-left{z-index:0}.page-columns .column-screen-inset{grid-column:screen-start-inset/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:screen-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/screen-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:screen-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:screen-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/screen-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:screen-start/screen-end;padding:1em;background:#f8f9fa;z-index:998;opacity:.999;margin-bottom:1em}.zindex-content{z-index:998;opacity:.999}.zindex-modal{z-index:1055;opacity:.999}.zindex-over-content{z-index:999;opacity:.999}img.img-fluid.column-screen,img.img-fluid.column-screen-inset-shaded,img.img-fluid.column-screen-inset,img.img-fluid.column-screen-inset-left,img.img-fluid.column-screen-inset-right,img.img-fluid.column-screen-left,img.img-fluid.column-screen-right{width:100%}@media(min-width: 992px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.column-sidebar{grid-column:page-start/body-start !important;z-index:998}.column-leftmargin{grid-column:screen-start-inset/body-start !important;z-index:998}.no-row-height{height:1em;overflow:visible}}@media(max-width: 991.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-end/page-end !important;z-index:998}.no-row-height{height:1em;overflow:visible}.page-columns.page-full{overflow:visible}.page-columns.toc-left .margin-caption,.page-columns.toc-left div.aside,.page-columns.toc-left aside:not(.footnotes):not(.sidebar),.page-columns.toc-left .column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.page-columns.toc-left .no-row-height{height:initial;overflow:initial}}@media(max-width: 767.98px){.margin-caption,div.aside,aside:not(.footnotes):not(.sidebar),.column-margin{grid-column:body-content-start/body-content-end !important;z-index:998;opacity:.999}.no-row-height{height:initial;overflow:initial}#quarto-margin-sidebar{display:none}#quarto-sidebar-toc-left{display:none}.hidden-sm{display:none}}.panel-grid{display:grid;grid-template-rows:repeat(1, 1fr);grid-template-columns:repeat(24, 1fr);gap:1em}.panel-grid .g-col-1{grid-column:auto/span 1}.panel-grid .g-col-2{grid-column:auto/span 2}.panel-grid .g-col-3{grid-column:auto/span 3}.panel-grid .g-col-4{grid-column:auto/span 4}.panel-grid .g-col-5{grid-column:auto/span 5}.panel-grid .g-col-6{grid-column:auto/span 6}.panel-grid .g-col-7{grid-column:auto/span 7}.panel-grid .g-col-8{grid-column:auto/span 8}.panel-grid .g-col-9{grid-column:auto/span 9}.panel-grid .g-col-10{grid-column:auto/span 10}.panel-grid .g-col-11{grid-column:auto/span 11}.panel-grid .g-col-12{grid-column:auto/span 12}.panel-grid .g-col-13{grid-column:auto/span 13}.panel-grid .g-col-14{grid-column:auto/span 14}.panel-grid .g-col-15{grid-column:auto/span 15}.panel-grid .g-col-16{grid-column:auto/span 16}.panel-grid .g-col-17{grid-column:auto/span 17}.panel-grid .g-col-18{grid-column:auto/span 18}.panel-grid .g-col-19{grid-column:auto/span 19}.panel-grid .g-col-20{grid-column:auto/span 20}.panel-grid .g-col-21{grid-column:auto/span 21}.panel-grid .g-col-22{grid-column:auto/span 22}.panel-grid .g-col-23{grid-column:auto/span 23}.panel-grid .g-col-24{grid-column:auto/span 24}.panel-grid .g-start-1{grid-column-start:1}.panel-grid .g-start-2{grid-column-start:2}.panel-grid .g-start-3{grid-column-start:3}.panel-grid .g-start-4{grid-column-start:4}.panel-grid .g-start-5{grid-column-start:5}.panel-grid .g-start-6{grid-column-start:6}.panel-grid .g-start-7{grid-column-start:7}.panel-grid .g-start-8{grid-column-start:8}.panel-grid .g-start-9{grid-column-start:9}.panel-grid .g-start-10{grid-column-start:10}.panel-grid .g-start-11{grid-column-start:11}.panel-grid .g-start-12{grid-column-start:12}.panel-grid .g-start-13{grid-column-start:13}.panel-grid .g-start-14{grid-column-start:14}.panel-grid .g-start-15{grid-column-start:15}.panel-grid .g-start-16{grid-column-start:16}.panel-grid .g-start-17{grid-column-start:17}.panel-grid .g-start-18{grid-column-start:18}.panel-grid .g-start-19{grid-column-start:19}.panel-grid .g-start-20{grid-column-start:20}.panel-grid .g-start-21{grid-column-start:21}.panel-grid .g-start-22{grid-column-start:22}.panel-grid .g-start-23{grid-column-start:23}@media(min-width: 576px){.panel-grid .g-col-sm-1{grid-column:auto/span 1}.panel-grid .g-col-sm-2{grid-column:auto/span 2}.panel-grid .g-col-sm-3{grid-column:auto/span 3}.panel-grid .g-col-sm-4{grid-column:auto/span 4}.panel-grid .g-col-sm-5{grid-column:auto/span 5}.panel-grid .g-col-sm-6{grid-column:auto/span 6}.panel-grid .g-col-sm-7{grid-column:auto/span 7}.panel-grid .g-col-sm-8{grid-column:auto/span 8}.panel-grid .g-col-sm-9{grid-column:auto/span 9}.panel-grid .g-col-sm-10{grid-column:auto/span 10}.panel-grid .g-col-sm-11{grid-column:auto/span 11}.panel-grid .g-col-sm-12{grid-column:auto/span 12}.panel-grid .g-col-sm-13{grid-column:auto/span 13}.panel-grid .g-col-sm-14{grid-column:auto/span 14}.panel-grid .g-col-sm-15{grid-column:auto/span 15}.panel-grid .g-col-sm-16{grid-column:auto/span 16}.panel-grid .g-col-sm-17{grid-column:auto/span 17}.panel-grid .g-col-sm-18{grid-column:auto/span 18}.panel-grid .g-col-sm-19{grid-column:auto/span 19}.panel-grid .g-col-sm-20{grid-column:auto/span 20}.panel-grid .g-col-sm-21{grid-column:auto/span 21}.panel-grid .g-col-sm-22{grid-column:auto/span 22}.panel-grid .g-col-sm-23{grid-column:auto/span 23}.panel-grid .g-col-sm-24{grid-column:auto/span 24}.panel-grid .g-start-sm-1{grid-column-start:1}.panel-grid .g-start-sm-2{grid-column-start:2}.panel-grid .g-start-sm-3{grid-column-start:3}.panel-grid .g-start-sm-4{grid-column-start:4}.panel-grid .g-start-sm-5{grid-column-start:5}.panel-grid .g-start-sm-6{grid-column-start:6}.panel-grid .g-start-sm-7{grid-column-start:7}.panel-grid .g-start-sm-8{grid-column-start:8}.panel-grid .g-start-sm-9{grid-column-start:9}.panel-grid .g-start-sm-10{grid-column-start:10}.panel-grid .g-start-sm-11{grid-column-start:11}.panel-grid .g-start-sm-12{grid-column-start:12}.panel-grid .g-start-sm-13{grid-column-start:13}.panel-grid .g-start-sm-14{grid-column-start:14}.panel-grid .g-start-sm-15{grid-column-start:15}.panel-grid .g-start-sm-16{grid-column-start:16}.panel-grid .g-start-sm-17{grid-column-start:17}.panel-grid .g-start-sm-18{grid-column-start:18}.panel-grid .g-start-sm-19{grid-column-start:19}.panel-grid .g-start-sm-20{grid-column-start:20}.panel-grid .g-start-sm-21{grid-column-start:21}.panel-grid .g-start-sm-22{grid-column-start:22}.panel-grid .g-start-sm-23{grid-column-start:23}}@media(min-width: 768px){.panel-grid .g-col-md-1{grid-column:auto/span 1}.panel-grid .g-col-md-2{grid-column:auto/span 2}.panel-grid .g-col-md-3{grid-column:auto/span 3}.panel-grid .g-col-md-4{grid-column:auto/span 4}.panel-grid .g-col-md-5{grid-column:auto/span 5}.panel-grid .g-col-md-6{grid-column:auto/span 6}.panel-grid .g-col-md-7{grid-column:auto/span 7}.panel-grid .g-col-md-8{grid-column:auto/span 8}.panel-grid .g-col-md-9{grid-column:auto/span 9}.panel-grid .g-col-md-10{grid-column:auto/span 10}.panel-grid .g-col-md-11{grid-column:auto/span 11}.panel-grid .g-col-md-12{grid-column:auto/span 12}.panel-grid .g-col-md-13{grid-column:auto/span 13}.panel-grid .g-col-md-14{grid-column:auto/span 14}.panel-grid .g-col-md-15{grid-column:auto/span 15}.panel-grid .g-col-md-16{grid-column:auto/span 16}.panel-grid .g-col-md-17{grid-column:auto/span 17}.panel-grid .g-col-md-18{grid-column:auto/span 18}.panel-grid .g-col-md-19{grid-column:auto/span 19}.panel-grid .g-col-md-20{grid-column:auto/span 20}.panel-grid .g-col-md-21{grid-column:auto/span 21}.panel-grid .g-col-md-22{grid-column:auto/span 22}.panel-grid .g-col-md-23{grid-column:auto/span 23}.panel-grid .g-col-md-24{grid-column:auto/span 24}.panel-grid .g-start-md-1{grid-column-start:1}.panel-grid .g-start-md-2{grid-column-start:2}.panel-grid .g-start-md-3{grid-column-start:3}.panel-grid .g-start-md-4{grid-column-start:4}.panel-grid .g-start-md-5{grid-column-start:5}.panel-grid .g-start-md-6{grid-column-start:6}.panel-grid .g-start-md-7{grid-column-start:7}.panel-grid .g-start-md-8{grid-column-start:8}.panel-grid .g-start-md-9{grid-column-start:9}.panel-grid .g-start-md-10{grid-column-start:10}.panel-grid .g-start-md-11{grid-column-start:11}.panel-grid .g-start-md-12{grid-column-start:12}.panel-grid .g-start-md-13{grid-column-start:13}.panel-grid .g-start-md-14{grid-column-start:14}.panel-grid .g-start-md-15{grid-column-start:15}.panel-grid .g-start-md-16{grid-column-start:16}.panel-grid .g-start-md-17{grid-column-start:17}.panel-grid .g-start-md-18{grid-column-start:18}.panel-grid .g-start-md-19{grid-column-start:19}.panel-grid .g-start-md-20{grid-column-start:20}.panel-grid .g-start-md-21{grid-column-start:21}.panel-grid .g-start-md-22{grid-column-start:22}.panel-grid .g-start-md-23{grid-column-start:23}}@media(min-width: 992px){.panel-grid .g-col-lg-1{grid-column:auto/span 1}.panel-grid .g-col-lg-2{grid-column:auto/span 2}.panel-grid .g-col-lg-3{grid-column:auto/span 3}.panel-grid .g-col-lg-4{grid-column:auto/span 4}.panel-grid .g-col-lg-5{grid-column:auto/span 5}.panel-grid .g-col-lg-6{grid-column:auto/span 6}.panel-grid .g-col-lg-7{grid-column:auto/span 7}.panel-grid .g-col-lg-8{grid-column:auto/span 8}.panel-grid .g-col-lg-9{grid-column:auto/span 9}.panel-grid .g-col-lg-10{grid-column:auto/span 10}.panel-grid .g-col-lg-11{grid-column:auto/span 11}.panel-grid .g-col-lg-12{grid-column:auto/span 12}.panel-grid .g-col-lg-13{grid-column:auto/span 13}.panel-grid .g-col-lg-14{grid-column:auto/span 14}.panel-grid .g-col-lg-15{grid-column:auto/span 15}.panel-grid .g-col-lg-16{grid-column:auto/span 16}.panel-grid .g-col-lg-17{grid-column:auto/span 17}.panel-grid .g-col-lg-18{grid-column:auto/span 18}.panel-grid .g-col-lg-19{grid-column:auto/span 19}.panel-grid .g-col-lg-20{grid-column:auto/span 20}.panel-grid .g-col-lg-21{grid-column:auto/span 21}.panel-grid .g-col-lg-22{grid-column:auto/span 22}.panel-grid .g-col-lg-23{grid-column:auto/span 23}.panel-grid .g-col-lg-24{grid-column:auto/span 24}.panel-grid .g-start-lg-1{grid-column-start:1}.panel-grid .g-start-lg-2{grid-column-start:2}.panel-grid .g-start-lg-3{grid-column-start:3}.panel-grid .g-start-lg-4{grid-column-start:4}.panel-grid .g-start-lg-5{grid-column-start:5}.panel-grid .g-start-lg-6{grid-column-start:6}.panel-grid .g-start-lg-7{grid-column-start:7}.panel-grid .g-start-lg-8{grid-column-start:8}.panel-grid .g-start-lg-9{grid-column-start:9}.panel-grid .g-start-lg-10{grid-column-start:10}.panel-grid .g-start-lg-11{grid-column-start:11}.panel-grid .g-start-lg-12{grid-column-start:12}.panel-grid .g-start-lg-13{grid-column-start:13}.panel-grid .g-start-lg-14{grid-column-start:14}.panel-grid .g-start-lg-15{grid-column-start:15}.panel-grid .g-start-lg-16{grid-column-start:16}.panel-grid .g-start-lg-17{grid-column-start:17}.panel-grid .g-start-lg-18{grid-column-start:18}.panel-grid .g-start-lg-19{grid-column-start:19}.panel-grid .g-start-lg-20{grid-column-start:20}.panel-grid .g-start-lg-21{grid-column-start:21}.panel-grid .g-start-lg-22{grid-column-start:22}.panel-grid .g-start-lg-23{grid-column-start:23}}@media(min-width: 1200px){.panel-grid .g-col-xl-1{grid-column:auto/span 1}.panel-grid .g-col-xl-2{grid-column:auto/span 2}.panel-grid .g-col-xl-3{grid-column:auto/span 3}.panel-grid .g-col-xl-4{grid-column:auto/span 4}.panel-grid .g-col-xl-5{grid-column:auto/span 5}.panel-grid .g-col-xl-6{grid-column:auto/span 6}.panel-grid .g-col-xl-7{grid-column:auto/span 7}.panel-grid .g-col-xl-8{grid-column:auto/span 8}.panel-grid .g-col-xl-9{grid-column:auto/span 9}.panel-grid .g-col-xl-10{grid-column:auto/span 10}.panel-grid .g-col-xl-11{grid-column:auto/span 11}.panel-grid .g-col-xl-12{grid-column:auto/span 12}.panel-grid .g-col-xl-13{grid-column:auto/span 13}.panel-grid .g-col-xl-14{grid-column:auto/span 14}.panel-grid .g-col-xl-15{grid-column:auto/span 15}.panel-grid .g-col-xl-16{grid-column:auto/span 16}.panel-grid .g-col-xl-17{grid-column:auto/span 17}.panel-grid .g-col-xl-18{grid-column:auto/span 18}.panel-grid .g-col-xl-19{grid-column:auto/span 19}.panel-grid .g-col-xl-20{grid-column:auto/span 20}.panel-grid .g-col-xl-21{grid-column:auto/span 21}.panel-grid .g-col-xl-22{grid-column:auto/span 22}.panel-grid .g-col-xl-23{grid-column:auto/span 23}.panel-grid .g-col-xl-24{grid-column:auto/span 24}.panel-grid .g-start-xl-1{grid-column-start:1}.panel-grid .g-start-xl-2{grid-column-start:2}.panel-grid .g-start-xl-3{grid-column-start:3}.panel-grid .g-start-xl-4{grid-column-start:4}.panel-grid .g-start-xl-5{grid-column-start:5}.panel-grid .g-start-xl-6{grid-column-start:6}.panel-grid .g-start-xl-7{grid-column-start:7}.panel-grid .g-start-xl-8{grid-column-start:8}.panel-grid .g-start-xl-9{grid-column-start:9}.panel-grid .g-start-xl-10{grid-column-start:10}.panel-grid .g-start-xl-11{grid-column-start:11}.panel-grid .g-start-xl-12{grid-column-start:12}.panel-grid .g-start-xl-13{grid-column-start:13}.panel-grid .g-start-xl-14{grid-column-start:14}.panel-grid .g-start-xl-15{grid-column-start:15}.panel-grid .g-start-xl-16{grid-column-start:16}.panel-grid .g-start-xl-17{grid-column-start:17}.panel-grid .g-start-xl-18{grid-column-start:18}.panel-grid .g-start-xl-19{grid-column-start:19}.panel-grid .g-start-xl-20{grid-column-start:20}.panel-grid .g-start-xl-21{grid-column-start:21}.panel-grid .g-start-xl-22{grid-column-start:22}.panel-grid .g-start-xl-23{grid-column-start:23}}@media(min-width: 1400px){.panel-grid .g-col-xxl-1{grid-column:auto/span 1}.panel-grid .g-col-xxl-2{grid-column:auto/span 2}.panel-grid .g-col-xxl-3{grid-column:auto/span 3}.panel-grid .g-col-xxl-4{grid-column:auto/span 4}.panel-grid .g-col-xxl-5{grid-column:auto/span 5}.panel-grid .g-col-xxl-6{grid-column:auto/span 6}.panel-grid .g-col-xxl-7{grid-column:auto/span 7}.panel-grid .g-col-xxl-8{grid-column:auto/span 8}.panel-grid .g-col-xxl-9{grid-column:auto/span 9}.panel-grid .g-col-xxl-10{grid-column:auto/span 10}.panel-grid .g-col-xxl-11{grid-column:auto/span 11}.panel-grid .g-col-xxl-12{grid-column:auto/span 12}.panel-grid .g-col-xxl-13{grid-column:auto/span 13}.panel-grid .g-col-xxl-14{grid-column:auto/span 14}.panel-grid .g-col-xxl-15{grid-column:auto/span 15}.panel-grid .g-col-xxl-16{grid-column:auto/span 16}.panel-grid .g-col-xxl-17{grid-column:auto/span 17}.panel-grid .g-col-xxl-18{grid-column:auto/span 18}.panel-grid .g-col-xxl-19{grid-column:auto/span 19}.panel-grid .g-col-xxl-20{grid-column:auto/span 20}.panel-grid .g-col-xxl-21{grid-column:auto/span 21}.panel-grid .g-col-xxl-22{grid-column:auto/span 22}.panel-grid .g-col-xxl-23{grid-column:auto/span 23}.panel-grid .g-col-xxl-24{grid-column:auto/span 24}.panel-grid .g-start-xxl-1{grid-column-start:1}.panel-grid .g-start-xxl-2{grid-column-start:2}.panel-grid .g-start-xxl-3{grid-column-start:3}.panel-grid .g-start-xxl-4{grid-column-start:4}.panel-grid .g-start-xxl-5{grid-column-start:5}.panel-grid .g-start-xxl-6{grid-column-start:6}.panel-grid .g-start-xxl-7{grid-column-start:7}.panel-grid .g-start-xxl-8{grid-column-start:8}.panel-grid .g-start-xxl-9{grid-column-start:9}.panel-grid .g-start-xxl-10{grid-column-start:10}.panel-grid .g-start-xxl-11{grid-column-start:11}.panel-grid .g-start-xxl-12{grid-column-start:12}.panel-grid .g-start-xxl-13{grid-column-start:13}.panel-grid .g-start-xxl-14{grid-column-start:14}.panel-grid .g-start-xxl-15{grid-column-start:15}.panel-grid .g-start-xxl-16{grid-column-start:16}.panel-grid .g-start-xxl-17{grid-column-start:17}.panel-grid .g-start-xxl-18{grid-column-start:18}.panel-grid .g-start-xxl-19{grid-column-start:19}.panel-grid .g-start-xxl-20{grid-column-start:20}.panel-grid .g-start-xxl-21{grid-column-start:21}.panel-grid .g-start-xxl-22{grid-column-start:22}.panel-grid .g-start-xxl-23{grid-column-start:23}}main{margin-top:1em;margin-bottom:1em}h1,.h1,h2,.h2{color:inherit;margin-top:2rem;margin-bottom:1rem;font-weight:600}h1.title,.title.h1{margin-top:0}main.content>section:first-of-type>h2:first-child,main.content>section:first-of-type>.h2:first-child{margin-top:0}h2,.h2{border-bottom:1px solid #fff;padding-bottom:.5rem}h3,.h3{font-weight:600}h3,.h3,h4,.h4{opacity:.9;margin-top:1.5rem}h5,.h5,h6,.h6{opacity:.9}.header-section-number{color:#5a6570}.nav-link.active .header-section-number{color:inherit}mark,.mark{padding:0em}.panel-caption,.figure-caption,.subfigure-caption,.table-caption,figcaption,caption{font-size:.9rem;color:#5a6570}.quarto-layout-cell[data-ref-parent] caption{color:#5a6570}.column-margin figcaption,.margin-caption,div.aside,aside,.column-margin{color:#5a6570;font-size:.825rem}.panel-caption.margin-caption{text-align:inherit}.column-margin.column-container p{margin-bottom:0}.column-margin.column-container>*:not(.collapse):first-child{padding-bottom:.5em;display:block}.column-margin.column-container>*:not(.collapse):not(:first-child){padding-top:.5em;padding-bottom:.5em;display:block}.column-margin.column-container>*.collapse:not(.show){display:none}@media(min-width: 768px){.column-margin.column-container .callout-margin-content:first-child{margin-top:4.5em}.column-margin.column-container .callout-margin-content-simple:first-child{margin-top:3.5em}}.margin-caption>*{padding-top:.5em;padding-bottom:.5em}@media(max-width: 767.98px){.quarto-layout-row{flex-direction:column}}.nav-tabs .nav-item{margin-top:1px;cursor:pointer}.tab-content{margin-top:0px;border-left:#fff 1px solid;border-right:#fff 1px solid;border-bottom:#fff 1px solid;margin-left:0;padding:1em;margin-bottom:1em}@media(max-width: 767.98px){.layout-sidebar{margin-left:0;margin-right:0}}.panel-sidebar,.panel-sidebar .form-control,.panel-input,.panel-input .form-control,.selectize-dropdown{font-size:.9rem}.panel-sidebar .form-control,.panel-input .form-control{padding-top:.1rem}.tab-pane div.sourceCode{margin-top:0px}.tab-pane>p{padding-top:0}.tab-pane>p:nth-child(1){padding-top:0}.tab-pane>p:last-child{margin-bottom:0}.tab-pane>pre:last-child{margin-bottom:0}.tab-content>.tab-pane:not(.active){display:none !important}div.sourceCode{background-color:rgba(233,236,239,.65);border:1px solid rgba(233,236,239,.65);border-radius:.375rem}pre.sourceCode{background-color:rgba(0,0,0,0)}pre.sourceCode{border:none;font-size:.875em;overflow:visible !important;padding:.4em}div.sourceCode{overflow-y:hidden}.callout div.sourceCode{margin-left:initial}.blockquote{font-size:inherit;padding-left:1rem;padding-right:1.5rem;color:#5a6570}.blockquote h1:first-child,.blockquote .h1:first-child,.blockquote h2:first-child,.blockquote .h2:first-child,.blockquote h3:first-child,.blockquote .h3:first-child,.blockquote h4:first-child,.blockquote .h4:first-child,.blockquote h5:first-child,.blockquote .h5:first-child{margin-top:0}pre{background-color:initial;padding:initial;border:initial}p pre code:not(.sourceCode),li pre code:not(.sourceCode),pre code:not(.sourceCode){background-color:initial}p code:not(.sourceCode),li code:not(.sourceCode),td code:not(.sourceCode){background-color:#f8f9fa;padding:.2em}nav p code:not(.sourceCode),nav li code:not(.sourceCode),nav td code:not(.sourceCode){background-color:rgba(0,0,0,0);padding:0}td code:not(.sourceCode){white-space:pre-wrap}#quarto-embedded-source-code-modal>.modal-dialog{max-width:1000px;padding-left:1.75rem;padding-right:1.75rem}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body{padding:0}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-body div.sourceCode{margin:0;padding:.2rem .2rem;border-radius:0px;border:none}#quarto-embedded-source-code-modal>.modal-dialog>.modal-content>.modal-header{padding:.7rem}.code-tools-button{font-size:1rem;padding:.15rem .15rem;margin-left:5px;color:rgba(33,37,41,.75);background-color:rgba(0,0,0,0);transition:initial;cursor:pointer}.code-tools-button>.bi::before{display:inline-block;height:1rem;width:1rem;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:1rem 1rem}.code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button>.bi::before{background-image:url('data:image/svg+xml,')}#quarto-embedded-source-code-modal .code-copy-button-checked>.bi::before{background-image:url('data:image/svg+xml,')}.sidebar{will-change:top;transition:top 200ms linear;position:sticky;overflow-y:auto;padding-top:1.2em;max-height:100vh}.sidebar.toc-left,.sidebar.margin-sidebar{top:0px;padding-top:1em}.sidebar.quarto-banner-title-block-sidebar>*{padding-top:1.65em}figure .quarto-notebook-link{margin-top:.5em}.quarto-notebook-link{font-size:.75em;color:rgba(33,37,41,.75);margin-bottom:1em;text-decoration:none;display:block}.quarto-notebook-link:hover{text-decoration:underline;color:#0d6efd}.quarto-notebook-link::before{display:inline-block;height:.75rem;width:.75rem;margin-bottom:0em;margin-right:.25em;content:"";vertical-align:-0.125em;background-image:url('data:image/svg+xml,');background-repeat:no-repeat;background-size:.75rem .75rem}.toc-actions i.bi,.quarto-code-links i.bi,.quarto-other-links i.bi,.quarto-alternate-notebooks i.bi,.quarto-alternate-formats i.bi{margin-right:.4em;font-size:.8rem}.quarto-other-links-text-target .quarto-code-links i.bi,.quarto-other-links-text-target .quarto-other-links i.bi{margin-right:.2em}.quarto-other-formats-text-target .quarto-alternate-formats i.bi{margin-right:.1em}.toc-actions i.bi.empty,.quarto-code-links i.bi.empty,.quarto-other-links i.bi.empty,.quarto-alternate-notebooks i.bi.empty,.quarto-alternate-formats i.bi.empty{padding-left:1em}.quarto-notebook h2,.quarto-notebook .h2{border-bottom:none}.quarto-notebook .cell-container{display:flex}.quarto-notebook .cell-container .cell{flex-grow:4}.quarto-notebook .cell-container .cell-decorator{padding-top:1.5em;padding-right:1em;text-align:right}.quarto-notebook .cell-container.code-fold .cell-decorator{padding-top:3em}.quarto-notebook .cell-code code{white-space:pre-wrap}.quarto-notebook .cell .cell-output-stderr pre code,.quarto-notebook .cell .cell-output-stdout pre code{white-space:pre-wrap;overflow-wrap:anywhere}.toc-actions,.quarto-alternate-formats,.quarto-other-links,.quarto-code-links,.quarto-alternate-notebooks{padding-left:0em}.sidebar .toc-actions a,.sidebar .quarto-alternate-formats a,.sidebar .quarto-other-links a,.sidebar .quarto-code-links a,.sidebar .quarto-alternate-notebooks a,.sidebar nav[role=doc-toc] a{text-decoration:none}.sidebar .toc-actions a:hover,.sidebar .quarto-other-links a:hover,.sidebar .quarto-code-links a:hover,.sidebar .quarto-alternate-formats a:hover,.sidebar .quarto-alternate-notebooks a:hover{color:#0d6efd}.sidebar .toc-actions h2,.sidebar .toc-actions .h2,.sidebar .quarto-code-links h2,.sidebar .quarto-code-links .h2,.sidebar .quarto-other-links h2,.sidebar .quarto-other-links .h2,.sidebar .quarto-alternate-notebooks h2,.sidebar .quarto-alternate-notebooks .h2,.sidebar .quarto-alternate-formats h2,.sidebar .quarto-alternate-formats .h2,.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-weight:500;margin-bottom:.2rem;margin-top:.3rem;font-family:inherit;border-bottom:0;padding-bottom:0;padding-top:0px}.sidebar .toc-actions>h2,.sidebar .toc-actions>.h2,.sidebar .quarto-code-links>h2,.sidebar .quarto-code-links>.h2,.sidebar .quarto-other-links>h2,.sidebar .quarto-other-links>.h2,.sidebar .quarto-alternate-notebooks>h2,.sidebar .quarto-alternate-notebooks>.h2,.sidebar .quarto-alternate-formats>h2,.sidebar .quarto-alternate-formats>.h2{font-size:.8rem}.sidebar nav[role=doc-toc]>h2,.sidebar nav[role=doc-toc]>.h2{font-size:.875rem}.sidebar nav[role=doc-toc]>ul a{border-left:1px solid #e9ecef;padding-left:.6rem}.sidebar .toc-actions h2>ul a,.sidebar .toc-actions .h2>ul a,.sidebar .quarto-code-links h2>ul a,.sidebar .quarto-code-links .h2>ul a,.sidebar .quarto-other-links h2>ul a,.sidebar .quarto-other-links .h2>ul a,.sidebar .quarto-alternate-notebooks h2>ul a,.sidebar .quarto-alternate-notebooks .h2>ul a,.sidebar .quarto-alternate-formats h2>ul a,.sidebar .quarto-alternate-formats .h2>ul a{border-left:none;padding-left:.6rem}.sidebar .toc-actions ul a:empty,.sidebar .quarto-code-links ul a:empty,.sidebar .quarto-other-links ul a:empty,.sidebar .quarto-alternate-notebooks ul a:empty,.sidebar .quarto-alternate-formats ul a:empty,.sidebar nav[role=doc-toc]>ul a:empty{display:none}.sidebar .toc-actions ul,.sidebar .quarto-code-links ul,.sidebar .quarto-other-links ul,.sidebar .quarto-alternate-notebooks ul,.sidebar .quarto-alternate-formats ul{padding-left:0;list-style:none}.sidebar nav[role=doc-toc] ul{list-style:none;padding-left:0;list-style:none}.sidebar nav[role=doc-toc]>ul{margin-left:.45em}.quarto-margin-sidebar nav[role=doc-toc]{padding-left:.5em}.sidebar .toc-actions>ul,.sidebar .quarto-code-links>ul,.sidebar .quarto-other-links>ul,.sidebar .quarto-alternate-notebooks>ul,.sidebar .quarto-alternate-formats>ul{font-size:.8rem}.sidebar nav[role=doc-toc]>ul{font-size:.875rem}.sidebar .toc-actions ul li a,.sidebar .quarto-code-links ul li a,.sidebar .quarto-other-links ul li a,.sidebar .quarto-alternate-notebooks ul li a,.sidebar .quarto-alternate-formats ul li a,.sidebar nav[role=doc-toc]>ul li a{line-height:1.1rem;padding-bottom:.2rem;padding-top:.2rem;color:inherit}.sidebar nav[role=doc-toc] ul>li>ul>li>a{padding-left:1.2em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>a{padding-left:2.4em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>a{padding-left:3.6em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:4.8em}.sidebar nav[role=doc-toc] ul>li>ul>li>ul>li>ul>li>ul>li>ul>li>a{padding-left:6em}.sidebar nav[role=doc-toc] ul>li>a.active,.sidebar nav[role=doc-toc] ul>li>ul>li>a.active{border-left:1px solid #0d6efd;color:#0d6efd !important}.sidebar nav[role=doc-toc] ul>li>a:hover,.sidebar nav[role=doc-toc] ul>li>ul>li>a:hover{color:#0d6efd !important}kbd,.kbd{color:#212529;background-color:#f8f9fa;border:1px solid;border-radius:5px;border-color:#fff}.quarto-appendix-contents div.hanging-indent{margin-left:0em}.quarto-appendix-contents div.hanging-indent div.csl-entry{margin-left:1em;text-indent:-1em}.citation a,.footnote-ref{text-decoration:none}.footnotes ol{padding-left:1em}.tippy-content>*{margin-bottom:.7em}.tippy-content>*:last-child{margin-bottom:0}.callout{margin-top:1.25rem;margin-bottom:1.25rem;border-radius:.375rem;overflow-wrap:break-word}.callout .callout-title-container{overflow-wrap:anywhere}.callout.callout-style-simple{padding:.4em .7em;border-left:5px solid;border-right:1px solid #fff;border-top:1px solid #fff;border-bottom:1px solid #fff}.callout.callout-style-default{border-left:5px solid;border-right:1px solid #fff;border-top:1px solid #fff;border-bottom:1px solid #fff}.callout .callout-body-container{flex-grow:1}.callout.callout-style-simple .callout-body{font-size:.9rem;font-weight:400}.callout.callout-style-default .callout-body{font-size:.9rem;font-weight:400}.callout:not(.no-icon).callout-titled.callout-style-simple .callout-body{padding-left:1.6em}.callout.callout-titled>.callout-header{padding-top:.2em;margin-bottom:-0.2em}.callout.callout-style-simple>div.callout-header{border-bottom:none;font-size:.9rem;font-weight:600;opacity:75%}.callout.callout-style-default>div.callout-header{border-bottom:none;font-weight:600;opacity:85%;font-size:.9rem;padding-left:.5em;padding-right:.5em}.callout.callout-style-default .callout-body{padding-left:.5em;padding-right:.5em}.callout.callout-style-default .callout-body>:first-child{padding-top:.5rem;margin-top:0}.callout>div.callout-header[data-bs-toggle=collapse]{cursor:pointer}.callout.callout-style-default .callout-header[aria-expanded=false],.callout.callout-style-default .callout-header[aria-expanded=true]{padding-top:0px;margin-bottom:0px;align-items:center}.callout.callout-titled .callout-body>:last-child:not(.sourceCode),.callout.callout-titled .callout-body>div>:last-child:not(.sourceCode){padding-bottom:.5rem;margin-bottom:0}.callout:not(.callout-titled) .callout-body>:first-child,.callout:not(.callout-titled) .callout-body>div>:first-child{margin-top:.25rem}.callout:not(.callout-titled) .callout-body>:last-child,.callout:not(.callout-titled) .callout-body>div>:last-child{margin-bottom:.2rem}.callout.callout-style-simple .callout-icon::before,.callout.callout-style-simple .callout-toggle::before{height:1rem;width:1rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.callout.callout-style-default .callout-icon::before,.callout.callout-style-default .callout-toggle::before{height:.9rem;width:.9rem;display:inline-block;content:"";background-repeat:no-repeat;background-size:.9rem .9rem}.callout.callout-style-default .callout-toggle::before{margin-top:5px}.callout .callout-btn-toggle .callout-toggle::before{transition:transform .2s linear}.callout .callout-header[aria-expanded=false] .callout-toggle::before{transform:rotate(-90deg)}.callout .callout-header[aria-expanded=true] .callout-toggle::before{transform:none}.callout.callout-style-simple:not(.no-icon) div.callout-icon-container{padding-top:.2em;padding-right:.55em}.callout.callout-style-default:not(.no-icon) div.callout-icon-container{padding-top:.1em;padding-right:.35em}.callout.callout-style-default:not(.no-icon) div.callout-title-container{margin-top:-1px}.callout.callout-style-default.callout-caution:not(.no-icon) div.callout-icon-container{padding-top:.3em;padding-right:.35em}.callout>.callout-body>.callout-icon-container>.no-icon,.callout>.callout-header>.callout-icon-container>.no-icon{display:none}div.callout.callout{border-left-color:rgba(33,37,41,.75)}div.callout.callout-style-default>.callout-header{background-color:rgba(33,37,41,.75)}div.callout-note.callout{border-left-color:#0d6efd}div.callout-note.callout-style-default>.callout-header{background-color:#e7f1ff}div.callout-note:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-note .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-tip.callout{border-left-color:#198754}div.callout-tip.callout-style-default>.callout-header{background-color:#e8f3ee}div.callout-tip:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-tip .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-warning.callout{border-left-color:#ffc107}div.callout-warning.callout-style-default>.callout-header{background-color:#fff9e6}div.callout-warning:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-warning .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-caution.callout{border-left-color:#fd7e14}div.callout-caution.callout-style-default>.callout-header{background-color:#fff2e8}div.callout-caution:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-caution .callout-toggle::before{background-image:url('data:image/svg+xml,')}div.callout-important.callout{border-left-color:#dc3545}div.callout-important.callout-style-default>.callout-header{background-color:#fcebec}div.callout-important:not(.callout-titled) .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important.callout-titled .callout-icon::before{background-image:url('data:image/svg+xml,');}div.callout-important .callout-toggle::before{background-image:url('data:image/svg+xml,')}.quarto-toggle-container{display:flex;align-items:center}.quarto-reader-toggle .bi::before,.quarto-color-scheme-toggle .bi::before{display:inline-block;height:1rem;width:1rem;content:"";background-repeat:no-repeat;background-size:1rem 1rem}.sidebar-navigation{padding-left:20px}.navbar{background-color:#517699;color:#fdfefe}.navbar .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.navbar .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle:not(.alternate) .bi::before{background-image:url('data:image/svg+xml,')}.sidebar-navigation .quarto-color-scheme-toggle.alternate .bi::before{background-image:url('data:image/svg+xml,')}.quarto-sidebar-toggle{border-color:#fff;border-bottom-left-radius:.375rem;border-bottom-right-radius:.375rem;border-style:solid;border-width:1px;overflow:hidden;border-top-width:0px;padding-top:0px !important}.quarto-sidebar-toggle-title{cursor:pointer;padding-bottom:2px;margin-left:.25em;text-align:center;font-weight:400;font-size:.775em}#quarto-content .quarto-sidebar-toggle{background:#fafafa}#quarto-content .quarto-sidebar-toggle-title{color:#212529}.quarto-sidebar-toggle-icon{color:#fff;margin-right:.5em;float:right;transition:transform .2s ease}.quarto-sidebar-toggle-icon::before{padding-top:5px}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-icon{transform:rotate(-180deg)}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-title{border-bottom:solid #fff 1px}.quarto-sidebar-toggle-contents{background-color:#fff;padding-right:10px;padding-left:10px;margin-top:0px !important;transition:max-height .5s ease}.quarto-sidebar-toggle.expanded .quarto-sidebar-toggle-contents{padding-top:1em;padding-bottom:10px}@media(max-width: 767.98px){.sidebar-menu-container{padding-bottom:5em}}.quarto-sidebar-toggle:not(.expanded) .quarto-sidebar-toggle-contents{padding-top:0px !important;padding-bottom:0px}nav[role=doc-toc]{z-index:1020}#quarto-sidebar>*,nav[role=doc-toc]>*{transition:opacity .1s ease,border .1s ease}#quarto-sidebar.slow>*,nav[role=doc-toc].slow>*{transition:opacity .4s ease,border .4s ease}.quarto-color-scheme-toggle:not(.alternate).top-right .bi::before{background-image:url('data:image/svg+xml,')}.quarto-color-scheme-toggle.alternate.top-right .bi::before{background-image:url('data:image/svg+xml,')}#quarto-appendix.default{border-top:1px solid #fff}#quarto-appendix.default{background-color:#fff;padding-top:1.5em;margin-top:2em;z-index:998}#quarto-appendix.default .quarto-appendix-heading{margin-top:0;line-height:1.4em;font-weight:600;opacity:.9;border-bottom:none;margin-bottom:0}#quarto-appendix.default .footnotes ol,#quarto-appendix.default .footnotes ol li>p:last-of-type,#quarto-appendix.default .quarto-appendix-contents>p:last-of-type{margin-bottom:0}#quarto-appendix.default .footnotes ol{margin-left:.5em}#quarto-appendix.default .quarto-appendix-secondary-label{margin-bottom:.4em}#quarto-appendix.default .quarto-appendix-bibtex{font-size:.7em;padding:1em;border:solid 1px #fff;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-bibtex code.sourceCode{white-space:pre-wrap}#quarto-appendix.default .quarto-appendix-citeas{font-size:.9em;padding:1em;border:solid 1px #fff;margin-bottom:1em}#quarto-appendix.default .quarto-appendix-heading{font-size:1em !important}#quarto-appendix.default *[role=doc-endnotes]>ol,#quarto-appendix.default .quarto-appendix-contents>*:not(h2):not(.h2){font-size:.9em}#quarto-appendix.default section{padding-bottom:1.5em}#quarto-appendix.default section *[role=doc-endnotes],#quarto-appendix.default section>*:not(a){opacity:.9;word-wrap:break-word}.btn.btn-quarto,div.cell-output-display .btn-quarto{--bs-btn-color: #fefefe;--bs-btn-bg: #6c757d;--bs-btn-border-color: #6c757d;--bs-btn-hover-color: #fefefe;--bs-btn-hover-bg: #828a91;--bs-btn-hover-border-color: #7b838a;--bs-btn-focus-shadow-rgb: 130, 138, 144;--bs-btn-active-color: #000;--bs-btn-active-bg: #899197;--bs-btn-active-border-color: #7b838a;--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color: #ffffff;--bs-btn-disabled-bg: #6c757d;--bs-btn-disabled-border-color: #6c757d}nav.quarto-secondary-nav.color-navbar{background-color:#517699;color:#fdfefe}nav.quarto-secondary-nav.color-navbar h1,nav.quarto-secondary-nav.color-navbar .h1,nav.quarto-secondary-nav.color-navbar .quarto-btn-toggle{color:#fdfefe}@media(max-width: 991.98px){body.nav-sidebar .quarto-title-banner{margin-bottom:0;padding-bottom:1em}body.nav-sidebar #title-block-header{margin-block-end:0}}p.subtitle{margin-top:.25em;margin-bottom:.5em}code a:any-link{color:inherit;text-decoration-color:#6c757d}/*! light */div.observablehq table thead tr th{background-color:var(--bs-body-bg)}input,button,select,optgroup,textarea{background-color:var(--bs-body-bg)}.code-annotated .code-copy-button{margin-right:1.25em;margin-top:0;padding-bottom:0;padding-top:3px}.code-annotation-gutter-bg{background-color:#fff}.code-annotation-gutter{background-color:rgba(233,236,239,.65)}.code-annotation-gutter,.code-annotation-gutter-bg{height:100%;width:calc(20px + .5em);position:absolute;top:0;right:0}dl.code-annotation-container-grid dt{margin-right:1em;margin-top:.25rem}dl.code-annotation-container-grid dt{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:#383f45;border:solid #383f45 1px;border-radius:50%;height:22px;width:22px;line-height:22px;font-size:11px;text-align:center;vertical-align:middle;text-decoration:none}dl.code-annotation-container-grid dt[data-target-cell]{cursor:pointer}dl.code-annotation-container-grid dt[data-target-cell].code-annotation-active{color:#fff;border:solid #aaa 1px;background-color:#aaa}pre.code-annotation-code{padding-top:0;padding-bottom:0}pre.code-annotation-code code{z-index:3}#code-annotation-line-highlight-gutter{width:100%;border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}#code-annotation-line-highlight{margin-left:-4em;width:calc(100% + 4em);border-top:solid rgba(170,170,170,.2666666667) 1px;border-bottom:solid rgba(170,170,170,.2666666667) 1px;z-index:2;background-color:rgba(170,170,170,.1333333333)}code.sourceCode .code-annotation-anchor.code-annotation-active{background-color:var(--quarto-hl-normal-color, #aaaaaa);border:solid var(--quarto-hl-normal-color, #aaaaaa) 1px;color:#e9ecef;font-weight:bolder}code.sourceCode .code-annotation-anchor{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;color:var(--quarto-hl-co-color);border:solid var(--quarto-hl-co-color) 1px;border-radius:50%;height:18px;width:18px;font-size:9px;margin-top:2px}code.sourceCode button.code-annotation-anchor{padding:2px;user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none}code.sourceCode a.code-annotation-anchor{line-height:18px;text-align:center;vertical-align:middle;cursor:default;text-decoration:none}@media print{.page-columns .column-screen-inset{grid-column:page-start-inset/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset table{background:#fff}.page-columns .column-screen-inset-left{grid-column:page-start-inset/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-inset-left table{background:#fff}.page-columns .column-screen-inset-right{grid-column:body-content-start/page-end-inset;z-index:998;opacity:.999}.page-columns .column-screen-inset-right table{background:#fff}.page-columns .column-screen{grid-column:page-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen table{background:#fff}.page-columns .column-screen-left{grid-column:page-start/body-content-end;z-index:998;opacity:.999}.page-columns .column-screen-left table{background:#fff}.page-columns .column-screen-right{grid-column:body-content-start/page-end;z-index:998;opacity:.999}.page-columns .column-screen-right table{background:#fff}.page-columns .column-screen-inset-shaded{grid-column:page-start-inset/page-end-inset;padding:1em;background:#f8f9fa;z-index:998;opacity:.999;margin-bottom:1em}}.quarto-video{margin-bottom:1em}.table{border-top:1px solid #d3d3d4;border-bottom:1px solid #d3d3d4}.table>thead{border-top-width:0;border-bottom:1px solid #909294}.table a{word-break:break-word}.table>:not(caption)>*>*{background-color:unset;color:unset}#quarto-document-content .crosstalk-input .checkbox input[type=checkbox],#quarto-document-content .crosstalk-input .checkbox-inline input[type=checkbox]{position:unset;margin-top:unset;margin-left:unset}#quarto-document-content .row{margin-left:unset;margin-right:unset}.quarto-xref{white-space:nowrap}#quarto-draft-alert{margin-top:0px;margin-bottom:0px;padding:.3em;text-align:center;font-size:.9em}#quarto-draft-alert i{margin-right:.3em}#quarto-back-to-top{z-index:1000}pre{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:0.875em;font-weight:400}pre code{font-family:inherit;font-size:inherit;font-weight:inherit}code{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:0.875em;font-weight:400}a{background-color:rgba(0,0,0,0);font-weight:400;text-decoration:underline}a.external:after{content:"";background-image:url('data:image/svg+xml,');background-size:contain;background-repeat:no-repeat;background-position:center center;margin-left:.2em;padding-right:.75em}div.sourceCode code a.external:after{content:none}a.external:after:hover{cursor:pointer}.quarto-ext-icon{display:inline-block;font-size:.75em;padding-left:.3em}.code-with-filename .code-with-filename-file{margin-bottom:0;padding-bottom:2px;padding-top:2px;padding-left:.7em;border:var(--quarto-border-width) solid var(--quarto-border-color);border-radius:var(--quarto-border-radius);border-bottom:0;border-bottom-left-radius:0%;border-bottom-right-radius:0%}.code-with-filename div.sourceCode,.reveal .code-with-filename div.sourceCode{margin-top:0;border-top-left-radius:0%;border-top-right-radius:0%}.code-with-filename .code-with-filename-file pre{margin-bottom:0}.code-with-filename .code-with-filename-file{background-color:rgba(219,219,219,.8)}.quarto-dark .code-with-filename .code-with-filename-file{background-color:#555}.code-with-filename .code-with-filename-file strong{font-weight:400}.quarto-title-banner{margin-bottom:1em;color:#fdfefe;background:#517699}.quarto-title-banner a{color:#fdfefe}.quarto-title-banner h1,.quarto-title-banner .h1,.quarto-title-banner h2,.quarto-title-banner .h2{color:#fdfefe}.quarto-title-banner .code-tools-button{color:#b9dcdc}.quarto-title-banner .code-tools-button:hover{color:#fdfefe}.quarto-title-banner .code-tools-button>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .code-tools-button:hover>.bi::before{background-image:url('data:image/svg+xml,')}.quarto-title-banner .quarto-title .title{font-weight:600}.quarto-title-banner .quarto-categories{margin-top:.75em}@media(min-width: 992px){.quarto-title-banner{padding-top:2.5em;padding-bottom:2.5em}}@media(max-width: 991.98px){.quarto-title-banner{padding-top:1em;padding-bottom:1em}}@media(max-width: 767.98px){body.hypothesis-enabled #title-block-header>*{padding-right:20px}}main.quarto-banner-title-block>section:first-child>h2,main.quarto-banner-title-block>section:first-child>.h2,main.quarto-banner-title-block>section:first-child>h3,main.quarto-banner-title-block>section:first-child>.h3,main.quarto-banner-title-block>section:first-child>h4,main.quarto-banner-title-block>section:first-child>.h4{margin-top:0}.quarto-title .quarto-categories{display:flex;flex-wrap:wrap;row-gap:.5em;column-gap:.4em;padding-bottom:.5em;margin-top:.75em}.quarto-title .quarto-categories .quarto-category{padding:.25em .75em;font-size:.65em;text-transform:uppercase;border:solid 1px;border-radius:.375rem;opacity:.6}.quarto-title .quarto-categories .quarto-category a{color:inherit}.quarto-title-meta-container{display:grid;grid-template-columns:1fr auto}.quarto-title-meta-column-end{display:flex;flex-direction:column;padding-left:1em}.quarto-title-meta-column-end a .bi{margin-right:.3em}#title-block-header.quarto-title-block.default .quarto-title-meta{display:grid;grid-template-columns:repeat(2, 1fr);grid-column-gap:1em}#title-block-header.quarto-title-block.default .quarto-title .title{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-author-orcid img{margin-top:-0.2em;height:.8em;width:.8em}#title-block-header.quarto-title-block.default .quarto-title-author-email{opacity:.7}#title-block-header.quarto-title-block.default .quarto-description p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p,#title-block-header.quarto-title-block.default .quarto-title-authors p,#title-block-header.quarto-title-block.default .quarto-title-affiliations p{margin-bottom:.1em}#title-block-header.quarto-title-block.default .quarto-title-meta-heading{text-transform:uppercase;margin-top:1em;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-contents{font-size:.9em}#title-block-header.quarto-title-block.default .quarto-title-meta-contents p.affiliation:last-of-type{margin-bottom:.1em}#title-block-header.quarto-title-block.default p.affiliation{margin-bottom:.1em}#title-block-header.quarto-title-block.default .keywords,#title-block-header.quarto-title-block.default .description,#title-block-header.quarto-title-block.default .abstract{margin-top:0}#title-block-header.quarto-title-block.default .keywords>p,#title-block-header.quarto-title-block.default .description>p,#title-block-header.quarto-title-block.default .abstract>p{font-size:.9em}#title-block-header.quarto-title-block.default .keywords>p:last-of-type,#title-block-header.quarto-title-block.default .description>p:last-of-type,#title-block-header.quarto-title-block.default .abstract>p:last-of-type{margin-bottom:0}#title-block-header.quarto-title-block.default .keywords .block-title,#title-block-header.quarto-title-block.default .description .block-title,#title-block-header.quarto-title-block.default .abstract .block-title{margin-top:1em;text-transform:uppercase;font-size:.8em;opacity:.8;font-weight:400}#title-block-header.quarto-title-block.default .quarto-title-meta-author{display:grid;grid-template-columns:minmax(max-content, 1fr) 1fr;grid-column-gap:1em}.quarto-title-tools-only{display:flex;justify-content:right}:root{--quarto-scss-export-title-banner-color: ;--quarto-scss-export-title-banner-bg: ;--quarto-scss-export-btn-code-copy-color: #5E5E5E;--quarto-scss-export-btn-code-copy-color-active: #4758AB;--quarto-scss-export-sidebar-bg: #fff;--quarto-scss-export-blue: #0d6efd;--quarto-scss-export-primary: #0d6efd;--quarto-scss-export-white: #ffffff;--quarto-scss-export-gray-200: #e9ecef;--quarto-scss-export-gray-100: #f8f9fa;--quarto-scss-export-gray-900: #212529;--quarto-scss-export-link-color: #0d6efd;--quarto-scss-export-link-color-bg: transparent;--quarto-scss-export-code-color: #7d12ba;--quarto-scss-export-code-bg: #f8f9fa;--quarto-scss-export-toc-color: #0d6efd;--quarto-scss-export-toc-active-border: #0d6efd;--quarto-scss-export-toc-inactive-border: #e9ecef;--quarto-scss-export-navbar-default: #517699;--quarto-scss-export-navbar-hl-override: false;--quarto-scss-export-navbar-bg: #517699;--quarto-scss-export-btn-bg: #6c757d;--quarto-scss-export-btn-fg: #fefefe;--quarto-scss-export-body-contrast-bg: #ffffff;--quarto-scss-export-body-contrast-color: #212529;--quarto-scss-export-navbar-fg: #fdfefe;--quarto-scss-export-navbar-hl: #fdfeff;--quarto-scss-export-navbar-brand: #fdfefe;--quarto-scss-export-navbar-brand-hl: #fdfeff;--quarto-scss-export-navbar-toggler-border-color: rgba(253, 254, 254, 0);--quarto-scss-export-navbar-hover-color: rgba(253, 254, 255, 0.8);--quarto-scss-export-navbar-disabled-color: rgba(253, 254, 254, 0.75);--quarto-scss-export-sidebar-fg: #595959;--quarto-scss-export-sidebar-hl: ;--quarto-scss-export-title-block-color: #212529;--quarto-scss-export-title-block-contast-color: #ffffff;--quarto-scss-export-footer-bg: #fff;--quarto-scss-export-footer-fg: #757575;--quarto-scss-export-popover-bg: #ffffff;--quarto-scss-export-input-bg: #ffffff;--quarto-scss-export-input-border-color: white;--quarto-scss-export-code-annotation-higlight-color: rgba(170, 170, 170, 0.2666666667);--quarto-scss-export-code-annotation-higlight-bg: rgba(170, 170, 170, 0.1333333333);--quarto-scss-export-table-group-separator-color: #909294;--quarto-scss-export-table-group-separator-color-lighter: #d3d3d4;--quarto-scss-export-link-decoration: underline;--quarto-scss-export-border-color: white;--quarto-scss-export-table-border-color: white;--quarto-scss-export-gray-300: #dee2e6;--quarto-scss-export-gray-400: #ced4da;--quarto-scss-export-gray-500: #adb5bd;--quarto-scss-export-gray-600: #6c757d;--quarto-scss-export-gray-700: #495057;--quarto-scss-export-gray-800: #343a40;--quarto-scss-export-black: #000;--quarto-scss-export-indigo: #6610f2;--quarto-scss-export-purple: #6f42c1;--quarto-scss-export-pink: #d63384;--quarto-scss-export-red: #dc3545;--quarto-scss-export-orange: #fd7e14;--quarto-scss-export-yellow: #ffc107;--quarto-scss-export-green: #198754;--quarto-scss-export-teal: #20c997;--quarto-scss-export-cyan: #0dcaf0;--quarto-scss-export-color-contrast-dark: #000;--quarto-scss-export-color-contrast-light: #ffffff;--quarto-scss-export-blue-100: #cfe2ff;--quarto-scss-export-blue-200: #9ec5fe;--quarto-scss-export-blue-300: #6ea8fe;--quarto-scss-export-blue-400: #3d8bfd;--quarto-scss-export-blue-500: #0d6efd;--quarto-scss-export-blue-600: #0a58ca;--quarto-scss-export-blue-700: #084298;--quarto-scss-export-blue-800: #052c65;--quarto-scss-export-blue-900: #031633;--quarto-scss-export-indigo-100: #e0cffc;--quarto-scss-export-indigo-200: #c29ffa;--quarto-scss-export-indigo-300: #a370f7;--quarto-scss-export-indigo-400: #8540f5;--quarto-scss-export-indigo-500: #6610f2;--quarto-scss-export-indigo-600: #520dc2;--quarto-scss-export-indigo-700: #3d0a91;--quarto-scss-export-indigo-800: #290661;--quarto-scss-export-indigo-900: #140330;--quarto-scss-export-purple-100: #e2d9f3;--quarto-scss-export-purple-200: #c5b3e6;--quarto-scss-export-purple-300: #a98eda;--quarto-scss-export-purple-400: #8c68cd;--quarto-scss-export-purple-500: #6f42c1;--quarto-scss-export-purple-600: #59359a;--quarto-scss-export-purple-700: #432874;--quarto-scss-export-purple-800: #2c1a4d;--quarto-scss-export-purple-900: #160d27;--quarto-scss-export-pink-100: #f7d6e6;--quarto-scss-export-pink-200: #efadce;--quarto-scss-export-pink-300: #e685b5;--quarto-scss-export-pink-400: #de5c9d;--quarto-scss-export-pink-500: #d63384;--quarto-scss-export-pink-600: #ab296a;--quarto-scss-export-pink-700: #801f4f;--quarto-scss-export-pink-800: #561435;--quarto-scss-export-pink-900: #2b0a1a;--quarto-scss-export-red-100: #f8d7da;--quarto-scss-export-red-200: #f1aeb5;--quarto-scss-export-red-300: #ea868f;--quarto-scss-export-red-400: #e35d6a;--quarto-scss-export-red-500: #dc3545;--quarto-scss-export-red-600: #b02a37;--quarto-scss-export-red-700: #842029;--quarto-scss-export-red-800: #58151c;--quarto-scss-export-red-900: #2c0b0e;--quarto-scss-export-orange-100: #ffe5d0;--quarto-scss-export-orange-200: #fecba1;--quarto-scss-export-orange-300: #feb272;--quarto-scss-export-orange-400: #fd9843;--quarto-scss-export-orange-500: #fd7e14;--quarto-scss-export-orange-600: #ca6510;--quarto-scss-export-orange-700: #984c0c;--quarto-scss-export-orange-800: #653208;--quarto-scss-export-orange-900: #331904;--quarto-scss-export-yellow-100: #fff3cd;--quarto-scss-export-yellow-200: #ffe69c;--quarto-scss-export-yellow-300: #ffda6a;--quarto-scss-export-yellow-400: #ffcd39;--quarto-scss-export-yellow-500: #ffc107;--quarto-scss-export-yellow-600: #cc9a06;--quarto-scss-export-yellow-700: #997404;--quarto-scss-export-yellow-800: #664d03;--quarto-scss-export-yellow-900: #332701;--quarto-scss-export-green-100: #d1e7dd;--quarto-scss-export-green-200: #a3cfbb;--quarto-scss-export-green-300: #75b798;--quarto-scss-export-green-400: #479f76;--quarto-scss-export-green-500: #198754;--quarto-scss-export-green-600: #146c43;--quarto-scss-export-green-700: #0f5132;--quarto-scss-export-green-800: #0a3622;--quarto-scss-export-green-900: #051b11;--quarto-scss-export-teal-100: #d2f4ea;--quarto-scss-export-teal-200: #a6e9d5;--quarto-scss-export-teal-300: #79dfc1;--quarto-scss-export-teal-400: #4dd4ac;--quarto-scss-export-teal-500: #20c997;--quarto-scss-export-teal-600: #1aa179;--quarto-scss-export-teal-700: #13795b;--quarto-scss-export-teal-800: #0d503c;--quarto-scss-export-teal-900: #06281e;--quarto-scss-export-cyan-100: #cff4fc;--quarto-scss-export-cyan-200: #9eeaf9;--quarto-scss-export-cyan-300: #6edff6;--quarto-scss-export-cyan-400: #3dd5f3;--quarto-scss-export-cyan-500: #0dcaf0;--quarto-scss-export-cyan-600: #0aa2c0;--quarto-scss-export-cyan-700: #087990;--quarto-scss-export-cyan-800: #055160;--quarto-scss-export-cyan-900: #032830;--quarto-scss-export-default: #dee2e6;--quarto-scss-export-secondary: #6c757d;--quarto-scss-export-success: #198754;--quarto-scss-export-info: #0dcaf0;--quarto-scss-export-warning: #ffc107;--quarto-scss-export-danger: #dc3545;--quarto-scss-export-light: #f8f9fa;--quarto-scss-export-dark: #212529;--quarto-scss-export-primary-text-emphasis: #052c65;--quarto-scss-export-secondary-text-emphasis: #2b2f32;--quarto-scss-export-success-text-emphasis: #0a3622;--quarto-scss-export-info-text-emphasis: #055160;--quarto-scss-export-warning-text-emphasis: #664d03;--quarto-scss-export-danger-text-emphasis: #58151c;--quarto-scss-export-light-text-emphasis: #495057;--quarto-scss-export-dark-text-emphasis: #495057;--quarto-scss-export-primary-bg-subtle: #cfe2ff;--quarto-scss-export-secondary-bg-subtle: #e2e3e5;--quarto-scss-export-success-bg-subtle: #d1e7dd;--quarto-scss-export-info-bg-subtle: #cff4fc;--quarto-scss-export-warning-bg-subtle: #fff3cd;--quarto-scss-export-danger-bg-subtle: #f8d7da;--quarto-scss-export-light-bg-subtle: #fcfcfd;--quarto-scss-export-dark-bg-subtle: #ced4da;--quarto-scss-export-primary-border-subtle: #9ec5fe;--quarto-scss-export-secondary-border-subtle: #c4c8cb;--quarto-scss-export-success-border-subtle: #a3cfbb;--quarto-scss-export-info-border-subtle: #9eeaf9;--quarto-scss-export-warning-border-subtle: #ffe69c;--quarto-scss-export-danger-border-subtle: #f1aeb5;--quarto-scss-export-light-border-subtle: #e9ecef;--quarto-scss-export-dark-border-subtle: #adb5bd;--quarto-scss-export-body-text-align: ;--quarto-scss-export-body-color: #212529;--quarto-scss-export-body-bg: #ffffff;--quarto-scss-export-body-secondary-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-body-secondary-bg: #e9ecef;--quarto-scss-export-body-tertiary-color: rgba(33, 37, 41, 0.5);--quarto-scss-export-body-tertiary-bg: #f8f9fa;--quarto-scss-export-body-emphasis-color: #000;--quarto-scss-export-link-hover-color: #0a58ca;--quarto-scss-export-link-hover-decoration: ;--quarto-scss-export-border-color-translucent: rgba(0, 0, 0, 0.175);--quarto-scss-export-component-active-bg: #0d6efd;--quarto-scss-export-component-active-color: #ffffff;--quarto-scss-export-focus-ring-color: rgba(13, 110, 253, 0.25);--quarto-scss-export-headings-font-family: ;--quarto-scss-export-headings-font-style: ;--quarto-scss-export-display-font-family: ;--quarto-scss-export-display-font-style: ;--quarto-scss-export-text-muted: rgba(33, 37, 41, 0.75);--quarto-scss-export-blockquote-footer-color: #6c757d;--quarto-scss-export-blockquote-border-color: #e9ecef;--quarto-scss-export-hr-bg-color: ;--quarto-scss-export-hr-height: ;--quarto-scss-export-hr-border-color: ;--quarto-scss-export-legend-font-weight: ;--quarto-scss-export-mark-bg: #fff3cd;--quarto-scss-export-table-color: #212529;--quarto-scss-export-table-bg: #ffffff;--quarto-scss-export-table-accent-bg: transparent;--quarto-scss-export-table-th-font-weight: ;--quarto-scss-export-table-striped-color: #212529;--quarto-scss-export-table-striped-bg: rgba(0, 0, 0, 0.05);--quarto-scss-export-table-active-color: #212529;--quarto-scss-export-table-active-bg: rgba(0, 0, 0, 0.1);--quarto-scss-export-table-hover-color: #212529;--quarto-scss-export-table-hover-bg: rgba(0, 0, 0, 0.075);--quarto-scss-export-table-caption-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-input-btn-font-family: ;--quarto-scss-export-input-btn-focus-color: rgba(13, 110, 253, 0.25);--quarto-scss-export-btn-color: #212529;--quarto-scss-export-btn-font-family: ;--quarto-scss-export-btn-white-space: ;--quarto-scss-export-btn-link-color: #0d6efd;--quarto-scss-export-btn-link-hover-color: #0a58ca;--quarto-scss-export-btn-link-disabled-color: #6c757d;--quarto-scss-export-form-text-font-style: ;--quarto-scss-export-form-text-font-weight: ;--quarto-scss-export-form-text-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-form-label-font-size: ;--quarto-scss-export-form-label-font-style: ;--quarto-scss-export-form-label-font-weight: ;--quarto-scss-export-form-label-color: ;--quarto-scss-export-input-font-family: ;--quarto-scss-export-input-disabled-color: ;--quarto-scss-export-input-disabled-bg: #e9ecef;--quarto-scss-export-input-disabled-border-color: ;--quarto-scss-export-input-color: #212529;--quarto-scss-export-input-focus-bg: #ffffff;--quarto-scss-export-input-focus-border-color: #86b7fe;--quarto-scss-export-input-focus-color: #212529;--quarto-scss-export-input-placeholder-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-input-plaintext-color: #212529;--quarto-scss-export-form-check-label-color: ;--quarto-scss-export-form-check-transition: ;--quarto-scss-export-form-check-input-bg: #ffffff;--quarto-scss-export-form-check-input-focus-border: #86b7fe;--quarto-scss-export-form-check-input-checked-color: #ffffff;--quarto-scss-export-form-check-input-checked-bg-color: #0d6efd;--quarto-scss-export-form-check-input-checked-border-color: #0d6efd;--quarto-scss-export-form-check-input-indeterminate-color: #ffffff;--quarto-scss-export-form-check-input-indeterminate-bg-color: #0d6efd;--quarto-scss-export-form-check-input-indeterminate-border-color: #0d6efd;--quarto-scss-export-form-switch-color: rgba(0, 0, 0, 0.25);--quarto-scss-export-form-switch-focus-color: #86b7fe;--quarto-scss-export-form-switch-checked-color: #ffffff;--quarto-scss-export-input-group-addon-color: #212529;--quarto-scss-export-input-group-addon-bg: #f8f9fa;--quarto-scss-export-input-group-addon-border-color: white;--quarto-scss-export-form-select-font-family: ;--quarto-scss-export-form-select-color: #212529;--quarto-scss-export-form-select-bg: #ffffff;--quarto-scss-export-form-select-disabled-color: ;--quarto-scss-export-form-select-disabled-bg: #e9ecef;--quarto-scss-export-form-select-disabled-border-color: ;--quarto-scss-export-form-select-indicator-color: #343a40;--quarto-scss-export-form-select-border-color: white;--quarto-scss-export-form-select-focus-border-color: #86b7fe;--quarto-scss-export-form-range-track-bg: #f8f9fa;--quarto-scss-export-form-range-thumb-bg: #0d6efd;--quarto-scss-export-form-range-thumb-active-bg: #b6d4fe;--quarto-scss-export-form-range-thumb-disabled-bg: rgba(33, 37, 41, 0.75);--quarto-scss-export-form-file-button-color: #212529;--quarto-scss-export-form-file-button-bg: #f8f9fa;--quarto-scss-export-form-file-button-hover-bg: #e9ecef;--quarto-scss-export-form-floating-label-disabled-color: #6c757d;--quarto-scss-export-form-feedback-font-style: ;--quarto-scss-export-form-feedback-valid-color: #198754;--quarto-scss-export-form-feedback-invalid-color: #dc3545;--quarto-scss-export-form-feedback-icon-valid-color: #198754;--quarto-scss-export-form-feedback-icon-invalid-color: #dc3545;--quarto-scss-export-form-valid-color: #198754;--quarto-scss-export-form-valid-border-color: #198754;--quarto-scss-export-form-invalid-color: #dc3545;--quarto-scss-export-form-invalid-border-color: #dc3545;--quarto-scss-export-nav-link-font-size: ;--quarto-scss-export-nav-link-font-weight: ;--quarto-scss-export-nav-link-color: #0d6efd;--quarto-scss-export-nav-link-hover-color: #0a58ca;--quarto-scss-export-nav-link-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-nav-tabs-border-color: white;--quarto-scss-export-nav-tabs-link-hover-border-color: #e9ecef #e9ecef white;--quarto-scss-export-nav-tabs-link-active-color: #000;--quarto-scss-export-nav-tabs-link-active-bg: #ffffff;--quarto-scss-export-nav-pills-link-active-bg: #0d6efd;--quarto-scss-export-nav-pills-link-active-color: #ffffff;--quarto-scss-export-nav-underline-link-active-color: #000;--quarto-scss-export-navbar-padding-x: ;--quarto-scss-export-navbar-light-contrast: #ffffff;--quarto-scss-export-navbar-dark-contrast: #ffffff;--quarto-scss-export-navbar-light-icon-color: rgba(255, 255, 255, 0.75);--quarto-scss-export-navbar-dark-icon-color: rgba(255, 255, 255, 0.75);--quarto-scss-export-dropdown-color: #212529;--quarto-scss-export-dropdown-bg: #ffffff;--quarto-scss-export-dropdown-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-divider-bg: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-link-color: #212529;--quarto-scss-export-dropdown-link-hover-color: #212529;--quarto-scss-export-dropdown-link-hover-bg: #f8f9fa;--quarto-scss-export-dropdown-link-active-bg: #0d6efd;--quarto-scss-export-dropdown-link-active-color: #ffffff;--quarto-scss-export-dropdown-link-disabled-color: rgba(33, 37, 41, 0.5);--quarto-scss-export-dropdown-header-color: #6c757d;--quarto-scss-export-dropdown-dark-color: #dee2e6;--quarto-scss-export-dropdown-dark-bg: #343a40;--quarto-scss-export-dropdown-dark-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-dark-divider-bg: rgba(0, 0, 0, 0.175);--quarto-scss-export-dropdown-dark-box-shadow: ;--quarto-scss-export-dropdown-dark-link-color: #dee2e6;--quarto-scss-export-dropdown-dark-link-hover-color: #ffffff;--quarto-scss-export-dropdown-dark-link-hover-bg: rgba(255, 255, 255, 0.15);--quarto-scss-export-dropdown-dark-link-active-color: #ffffff;--quarto-scss-export-dropdown-dark-link-active-bg: #0d6efd;--quarto-scss-export-dropdown-dark-link-disabled-color: #adb5bd;--quarto-scss-export-dropdown-dark-header-color: #adb5bd;--quarto-scss-export-pagination-color: #0d6efd;--quarto-scss-export-pagination-bg: #ffffff;--quarto-scss-export-pagination-border-color: white;--quarto-scss-export-pagination-focus-color: #0a58ca;--quarto-scss-export-pagination-focus-bg: #e9ecef;--quarto-scss-export-pagination-hover-color: #0a58ca;--quarto-scss-export-pagination-hover-bg: #f8f9fa;--quarto-scss-export-pagination-hover-border-color: white;--quarto-scss-export-pagination-active-color: #ffffff;--quarto-scss-export-pagination-active-bg: #0d6efd;--quarto-scss-export-pagination-active-border-color: #0d6efd;--quarto-scss-export-pagination-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-pagination-disabled-bg: #e9ecef;--quarto-scss-export-pagination-disabled-border-color: white;--quarto-scss-export-card-title-color: ;--quarto-scss-export-card-subtitle-color: ;--quarto-scss-export-card-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-card-box-shadow: ;--quarto-scss-export-card-cap-bg: rgba(33, 37, 41, 0.03);--quarto-scss-export-card-cap-color: ;--quarto-scss-export-card-height: ;--quarto-scss-export-card-color: ;--quarto-scss-export-card-bg: #ffffff;--quarto-scss-export-accordion-color: #212529;--quarto-scss-export-accordion-bg: #ffffff;--quarto-scss-export-accordion-border-color: white;--quarto-scss-export-accordion-button-color: #212529;--quarto-scss-export-accordion-button-bg: #ffffff;--quarto-scss-export-accordion-button-active-bg: #cfe2ff;--quarto-scss-export-accordion-button-active-color: #052c65;--quarto-scss-export-accordion-button-focus-border-color: #86b7fe;--quarto-scss-export-accordion-icon-color: #212529;--quarto-scss-export-accordion-icon-active-color: #052c65;--quarto-scss-export-tooltip-color: #ffffff;--quarto-scss-export-tooltip-bg: #000;--quarto-scss-export-tooltip-margin: ;--quarto-scss-export-tooltip-arrow-color: ;--quarto-scss-export-form-feedback-tooltip-line-height: ;--quarto-scss-export-popover-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-popover-header-bg: #e9ecef;--quarto-scss-export-popover-body-color: #212529;--quarto-scss-export-popover-arrow-color: #ffffff;--quarto-scss-export-popover-arrow-outer-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-toast-color: ;--quarto-scss-export-toast-background-color: rgba(255, 255, 255, 0.85);--quarto-scss-export-toast-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-toast-header-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-toast-header-background-color: rgba(255, 255, 255, 0.85);--quarto-scss-export-toast-header-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-badge-color: #ffffff;--quarto-scss-export-modal-content-color: ;--quarto-scss-export-modal-content-bg: #ffffff;--quarto-scss-export-modal-content-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-modal-backdrop-bg: #000;--quarto-scss-export-modal-header-border-color: white;--quarto-scss-export-modal-footer-bg: ;--quarto-scss-export-modal-footer-border-color: white;--quarto-scss-export-progress-bg: #e9ecef;--quarto-scss-export-progress-bar-color: #ffffff;--quarto-scss-export-progress-bar-bg: #0d6efd;--quarto-scss-export-list-group-color: #212529;--quarto-scss-export-list-group-bg: #ffffff;--quarto-scss-export-list-group-border-color: white;--quarto-scss-export-list-group-hover-bg: #f8f9fa;--quarto-scss-export-list-group-active-bg: #0d6efd;--quarto-scss-export-list-group-active-color: #ffffff;--quarto-scss-export-list-group-active-border-color: #0d6efd;--quarto-scss-export-list-group-disabled-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-list-group-disabled-bg: #ffffff;--quarto-scss-export-list-group-action-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-list-group-action-hover-color: #000;--quarto-scss-export-list-group-action-active-color: #212529;--quarto-scss-export-list-group-action-active-bg: #e9ecef;--quarto-scss-export-thumbnail-bg: #ffffff;--quarto-scss-export-thumbnail-border-color: white;--quarto-scss-export-figure-caption-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-font-size: ;--quarto-scss-export-breadcrumb-bg: ;--quarto-scss-export-breadcrumb-divider-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-active-color: rgba(33, 37, 41, 0.75);--quarto-scss-export-breadcrumb-border-radius: ;--quarto-scss-export-carousel-control-color: #ffffff;--quarto-scss-export-carousel-indicator-active-bg: #ffffff;--quarto-scss-export-carousel-caption-color: #ffffff;--quarto-scss-export-carousel-dark-indicator-active-bg: #000;--quarto-scss-export-carousel-dark-caption-color: #000;--quarto-scss-export-btn-close-color: #000;--quarto-scss-export-offcanvas-border-color: rgba(0, 0, 0, 0.175);--quarto-scss-export-offcanvas-bg-color: #ffffff;--quarto-scss-export-offcanvas-color: #212529;--quarto-scss-export-offcanvas-backdrop-bg: #000;--quarto-scss-export-code-color-dark: white;--quarto-scss-export-kbd-color: #ffffff;--quarto-scss-export-kbd-bg: #212529;--quarto-scss-export-nested-kbd-font-weight: ;--quarto-scss-export-pre-bg: #f8f9fa;--quarto-scss-export-pre-color: #000;--quarto-scss-export-bslib-page-sidebar-title-bg: #517699;--quarto-scss-export-bslib-page-sidebar-title-color: #ffffff;--quarto-scss-export-bslib-sidebar-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.05);--quarto-scss-export-bslib-sidebar-toggle-bg: rgba(var(--bs-emphasis-color-rgb, 0, 0, 0), 0.1);--quarto-scss-export-mermaid-bg-color: #ffffff;--quarto-scss-export-mermaid-edge-color: #6c757d;--quarto-scss-export-mermaid-node-fg-color: #212529;--quarto-scss-export-mermaid-fg-color: #212529;--quarto-scss-export-mermaid-fg-color--lighter: #383f45;--quarto-scss-export-mermaid-fg-color--lightest: #4e5862;--quarto-scss-export-mermaid-label-bg-color: #ffffff;--quarto-scss-export-mermaid-label-fg-color: #0d6efd;--quarto-scss-export-mermaid-node-bg-color: rgba(13, 110, 253, 0.1);--quarto-scss-export-code-block-border-left-color: white;--quarto-scss-export-callout-color-note: #0d6efd;--quarto-scss-export-callout-color-tip: #198754;--quarto-scss-export-callout-color-important: #dc3545;--quarto-scss-export-callout-color-caution: #fd7e14;--quarto-scss-export-callout-color-warning: #ffc107} \ No newline at end of file diff --git a/docs/validmind_files/libs/bootstrap/bootstrap-icons.css b/docs/validmind_files/libs/bootstrap/bootstrap-icons.css deleted file mode 100644 index 285e4448f..000000000 --- a/docs/validmind_files/libs/bootstrap/bootstrap-icons.css +++ /dev/null @@ -1,2078 +0,0 @@ -/*! - * Bootstrap Icons v1.11.1 (https://icons.getbootstrap.com/) - * Copyright 2019-2023 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/icons/blob/main/LICENSE) - */ - -@font-face { - font-display: block; - font-family: "bootstrap-icons"; - src: -url("./bootstrap-icons.woff?2820a3852bdb9a5832199cc61cec4e65") format("woff"); -} - -.bi::before, -[class^="bi-"]::before, -[class*=" bi-"]::before { - display: inline-block; - font-family: bootstrap-icons !important; - font-style: normal; - font-weight: normal !important; - font-variant: normal; - text-transform: none; - line-height: 1; - vertical-align: -.125em; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.bi-123::before { content: "\f67f"; } -.bi-alarm-fill::before { content: "\f101"; } -.bi-alarm::before { content: "\f102"; } -.bi-align-bottom::before { content: "\f103"; } -.bi-align-center::before { content: "\f104"; } -.bi-align-end::before { content: "\f105"; } -.bi-align-middle::before { content: "\f106"; } -.bi-align-start::before { content: "\f107"; } -.bi-align-top::before { content: "\f108"; } -.bi-alt::before { content: "\f109"; } -.bi-app-indicator::before { content: "\f10a"; } -.bi-app::before { content: "\f10b"; } -.bi-archive-fill::before { content: "\f10c"; } -.bi-archive::before { content: "\f10d"; } -.bi-arrow-90deg-down::before { content: "\f10e"; } -.bi-arrow-90deg-left::before { content: "\f10f"; } -.bi-arrow-90deg-right::before { content: "\f110"; } -.bi-arrow-90deg-up::before { content: "\f111"; } -.bi-arrow-bar-down::before { content: "\f112"; } -.bi-arrow-bar-left::before { content: "\f113"; } -.bi-arrow-bar-right::before { content: "\f114"; } -.bi-arrow-bar-up::before { content: "\f115"; } -.bi-arrow-clockwise::before { content: "\f116"; } -.bi-arrow-counterclockwise::before { content: "\f117"; } -.bi-arrow-down-circle-fill::before { content: "\f118"; } -.bi-arrow-down-circle::before { content: "\f119"; } -.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } -.bi-arrow-down-left-circle::before { content: "\f11b"; } -.bi-arrow-down-left-square-fill::before { content: "\f11c"; } -.bi-arrow-down-left-square::before { content: "\f11d"; } -.bi-arrow-down-left::before { content: "\f11e"; } -.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } -.bi-arrow-down-right-circle::before { content: "\f120"; } -.bi-arrow-down-right-square-fill::before { content: "\f121"; } -.bi-arrow-down-right-square::before { content: "\f122"; } -.bi-arrow-down-right::before { content: "\f123"; } -.bi-arrow-down-short::before { content: "\f124"; } -.bi-arrow-down-square-fill::before { content: "\f125"; } -.bi-arrow-down-square::before { content: "\f126"; } -.bi-arrow-down-up::before { content: "\f127"; } -.bi-arrow-down::before { content: "\f128"; } -.bi-arrow-left-circle-fill::before { content: "\f129"; } -.bi-arrow-left-circle::before { content: "\f12a"; } -.bi-arrow-left-right::before { content: "\f12b"; } -.bi-arrow-left-short::before { content: "\f12c"; } -.bi-arrow-left-square-fill::before { content: "\f12d"; } -.bi-arrow-left-square::before { content: "\f12e"; } -.bi-arrow-left::before { content: "\f12f"; } -.bi-arrow-repeat::before { content: "\f130"; } -.bi-arrow-return-left::before { content: "\f131"; } -.bi-arrow-return-right::before { content: "\f132"; } -.bi-arrow-right-circle-fill::before { content: "\f133"; } -.bi-arrow-right-circle::before { content: "\f134"; } -.bi-arrow-right-short::before { content: "\f135"; } -.bi-arrow-right-square-fill::before { content: "\f136"; } -.bi-arrow-right-square::before { content: "\f137"; } -.bi-arrow-right::before { content: "\f138"; } -.bi-arrow-up-circle-fill::before { content: "\f139"; } -.bi-arrow-up-circle::before { content: "\f13a"; } -.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } -.bi-arrow-up-left-circle::before { content: "\f13c"; } -.bi-arrow-up-left-square-fill::before { content: "\f13d"; } -.bi-arrow-up-left-square::before { content: "\f13e"; } -.bi-arrow-up-left::before { content: "\f13f"; } -.bi-arrow-up-right-circle-fill::before { content: "\f140"; } -.bi-arrow-up-right-circle::before { content: "\f141"; } -.bi-arrow-up-right-square-fill::before { content: "\f142"; } -.bi-arrow-up-right-square::before { content: "\f143"; } -.bi-arrow-up-right::before { content: "\f144"; } -.bi-arrow-up-short::before { content: "\f145"; } -.bi-arrow-up-square-fill::before { content: "\f146"; } -.bi-arrow-up-square::before { content: "\f147"; } -.bi-arrow-up::before { content: "\f148"; } -.bi-arrows-angle-contract::before { content: "\f149"; } -.bi-arrows-angle-expand::before { content: "\f14a"; } -.bi-arrows-collapse::before { content: "\f14b"; } -.bi-arrows-expand::before { content: "\f14c"; } -.bi-arrows-fullscreen::before { content: "\f14d"; } -.bi-arrows-move::before { content: "\f14e"; } -.bi-aspect-ratio-fill::before { content: "\f14f"; } -.bi-aspect-ratio::before { content: "\f150"; } -.bi-asterisk::before { content: "\f151"; } -.bi-at::before { content: "\f152"; } -.bi-award-fill::before { content: "\f153"; } -.bi-award::before { content: "\f154"; } -.bi-back::before { content: "\f155"; } -.bi-backspace-fill::before { content: "\f156"; } -.bi-backspace-reverse-fill::before { content: "\f157"; } -.bi-backspace-reverse::before { content: "\f158"; } -.bi-backspace::before { content: "\f159"; } -.bi-badge-3d-fill::before { content: "\f15a"; } -.bi-badge-3d::before { content: "\f15b"; } -.bi-badge-4k-fill::before { content: "\f15c"; } -.bi-badge-4k::before { content: "\f15d"; } -.bi-badge-8k-fill::before { content: "\f15e"; } -.bi-badge-8k::before { content: "\f15f"; } -.bi-badge-ad-fill::before { content: "\f160"; } -.bi-badge-ad::before { content: "\f161"; } -.bi-badge-ar-fill::before { content: "\f162"; } -.bi-badge-ar::before { content: "\f163"; } -.bi-badge-cc-fill::before { content: "\f164"; } -.bi-badge-cc::before { content: "\f165"; } -.bi-badge-hd-fill::before { content: "\f166"; } -.bi-badge-hd::before { content: "\f167"; } -.bi-badge-tm-fill::before { content: "\f168"; } -.bi-badge-tm::before { content: "\f169"; } -.bi-badge-vo-fill::before { content: "\f16a"; } -.bi-badge-vo::before { content: "\f16b"; } -.bi-badge-vr-fill::before { content: "\f16c"; } -.bi-badge-vr::before { content: "\f16d"; } -.bi-badge-wc-fill::before { content: "\f16e"; } -.bi-badge-wc::before { content: "\f16f"; } -.bi-bag-check-fill::before { content: "\f170"; } -.bi-bag-check::before { content: "\f171"; } -.bi-bag-dash-fill::before { content: "\f172"; } -.bi-bag-dash::before { content: "\f173"; } -.bi-bag-fill::before { content: "\f174"; } -.bi-bag-plus-fill::before { content: "\f175"; } -.bi-bag-plus::before { content: "\f176"; } -.bi-bag-x-fill::before { content: "\f177"; } -.bi-bag-x::before { content: "\f178"; } -.bi-bag::before { content: "\f179"; } -.bi-bar-chart-fill::before { content: "\f17a"; } -.bi-bar-chart-line-fill::before { content: "\f17b"; } -.bi-bar-chart-line::before { content: "\f17c"; } -.bi-bar-chart-steps::before { content: "\f17d"; } -.bi-bar-chart::before { content: "\f17e"; } -.bi-basket-fill::before { content: "\f17f"; } -.bi-basket::before { content: "\f180"; } -.bi-basket2-fill::before { content: "\f181"; } -.bi-basket2::before { content: "\f182"; } -.bi-basket3-fill::before { content: "\f183"; } -.bi-basket3::before { content: "\f184"; } -.bi-battery-charging::before { content: "\f185"; } -.bi-battery-full::before { content: "\f186"; } -.bi-battery-half::before { content: "\f187"; } -.bi-battery::before { content: "\f188"; } -.bi-bell-fill::before { content: "\f189"; } -.bi-bell::before { content: "\f18a"; } -.bi-bezier::before { content: "\f18b"; } -.bi-bezier2::before { content: "\f18c"; } -.bi-bicycle::before { content: "\f18d"; } -.bi-binoculars-fill::before { content: "\f18e"; } -.bi-binoculars::before { content: "\f18f"; } -.bi-blockquote-left::before { content: "\f190"; } -.bi-blockquote-right::before { content: "\f191"; } -.bi-book-fill::before { content: "\f192"; } -.bi-book-half::before { content: "\f193"; } -.bi-book::before { content: "\f194"; } -.bi-bookmark-check-fill::before { content: "\f195"; } -.bi-bookmark-check::before { content: "\f196"; } -.bi-bookmark-dash-fill::before { content: "\f197"; } -.bi-bookmark-dash::before { content: "\f198"; } -.bi-bookmark-fill::before { content: "\f199"; } -.bi-bookmark-heart-fill::before { content: "\f19a"; } -.bi-bookmark-heart::before { content: "\f19b"; } -.bi-bookmark-plus-fill::before { content: "\f19c"; } -.bi-bookmark-plus::before { content: "\f19d"; } -.bi-bookmark-star-fill::before { content: "\f19e"; } -.bi-bookmark-star::before { content: "\f19f"; } -.bi-bookmark-x-fill::before { content: "\f1a0"; } -.bi-bookmark-x::before { content: "\f1a1"; } -.bi-bookmark::before { content: "\f1a2"; } -.bi-bookmarks-fill::before { content: "\f1a3"; } -.bi-bookmarks::before { content: "\f1a4"; } -.bi-bookshelf::before { content: "\f1a5"; } -.bi-bootstrap-fill::before { content: "\f1a6"; } -.bi-bootstrap-reboot::before { content: "\f1a7"; } -.bi-bootstrap::before { content: "\f1a8"; } -.bi-border-all::before { content: "\f1a9"; } -.bi-border-bottom::before { content: "\f1aa"; } -.bi-border-center::before { content: "\f1ab"; } -.bi-border-inner::before { content: "\f1ac"; } -.bi-border-left::before { content: "\f1ad"; } -.bi-border-middle::before { content: "\f1ae"; } -.bi-border-outer::before { content: "\f1af"; } -.bi-border-right::before { content: "\f1b0"; } -.bi-border-style::before { content: "\f1b1"; } -.bi-border-top::before { content: "\f1b2"; } -.bi-border-width::before { content: "\f1b3"; } -.bi-border::before { content: "\f1b4"; } -.bi-bounding-box-circles::before { content: "\f1b5"; } -.bi-bounding-box::before { content: "\f1b6"; } -.bi-box-arrow-down-left::before { content: "\f1b7"; } -.bi-box-arrow-down-right::before { content: "\f1b8"; } -.bi-box-arrow-down::before { content: "\f1b9"; } -.bi-box-arrow-in-down-left::before { content: "\f1ba"; } -.bi-box-arrow-in-down-right::before { content: "\f1bb"; } -.bi-box-arrow-in-down::before { content: "\f1bc"; } -.bi-box-arrow-in-left::before { content: "\f1bd"; } -.bi-box-arrow-in-right::before { content: "\f1be"; } -.bi-box-arrow-in-up-left::before { content: "\f1bf"; } -.bi-box-arrow-in-up-right::before { content: "\f1c0"; } -.bi-box-arrow-in-up::before { content: "\f1c1"; } -.bi-box-arrow-left::before { content: "\f1c2"; } -.bi-box-arrow-right::before { content: "\f1c3"; } -.bi-box-arrow-up-left::before { content: "\f1c4"; } -.bi-box-arrow-up-right::before { content: "\f1c5"; } -.bi-box-arrow-up::before { content: "\f1c6"; } -.bi-box-seam::before { content: "\f1c7"; } -.bi-box::before { content: "\f1c8"; } -.bi-braces::before { content: "\f1c9"; } -.bi-bricks::before { content: "\f1ca"; } -.bi-briefcase-fill::before { content: "\f1cb"; } -.bi-briefcase::before { content: "\f1cc"; } -.bi-brightness-alt-high-fill::before { content: "\f1cd"; } -.bi-brightness-alt-high::before { content: "\f1ce"; } -.bi-brightness-alt-low-fill::before { content: "\f1cf"; } -.bi-brightness-alt-low::before { content: "\f1d0"; } -.bi-brightness-high-fill::before { content: "\f1d1"; } -.bi-brightness-high::before { content: "\f1d2"; } -.bi-brightness-low-fill::before { content: "\f1d3"; } -.bi-brightness-low::before { content: "\f1d4"; } -.bi-broadcast-pin::before { content: "\f1d5"; } -.bi-broadcast::before { content: "\f1d6"; } -.bi-brush-fill::before { content: "\f1d7"; } -.bi-brush::before { content: "\f1d8"; } -.bi-bucket-fill::before { content: "\f1d9"; } -.bi-bucket::before { content: "\f1da"; } -.bi-bug-fill::before { content: "\f1db"; } -.bi-bug::before { content: "\f1dc"; } -.bi-building::before { content: "\f1dd"; } -.bi-bullseye::before { content: "\f1de"; } -.bi-calculator-fill::before { content: "\f1df"; } -.bi-calculator::before { content: "\f1e0"; } -.bi-calendar-check-fill::before { content: "\f1e1"; } -.bi-calendar-check::before { content: "\f1e2"; } -.bi-calendar-date-fill::before { content: "\f1e3"; } -.bi-calendar-date::before { content: "\f1e4"; } -.bi-calendar-day-fill::before { content: "\f1e5"; } -.bi-calendar-day::before { content: "\f1e6"; } -.bi-calendar-event-fill::before { content: "\f1e7"; } -.bi-calendar-event::before { content: "\f1e8"; } -.bi-calendar-fill::before { content: "\f1e9"; } -.bi-calendar-minus-fill::before { content: "\f1ea"; } -.bi-calendar-minus::before { content: "\f1eb"; } -.bi-calendar-month-fill::before { content: "\f1ec"; } -.bi-calendar-month::before { content: "\f1ed"; } -.bi-calendar-plus-fill::before { content: "\f1ee"; } -.bi-calendar-plus::before { content: "\f1ef"; } -.bi-calendar-range-fill::before { content: "\f1f0"; } -.bi-calendar-range::before { content: "\f1f1"; } -.bi-calendar-week-fill::before { content: "\f1f2"; } -.bi-calendar-week::before { content: "\f1f3"; } -.bi-calendar-x-fill::before { content: "\f1f4"; } -.bi-calendar-x::before { content: "\f1f5"; } -.bi-calendar::before { content: "\f1f6"; } -.bi-calendar2-check-fill::before { content: "\f1f7"; } -.bi-calendar2-check::before { content: "\f1f8"; } -.bi-calendar2-date-fill::before { content: "\f1f9"; } -.bi-calendar2-date::before { content: "\f1fa"; } -.bi-calendar2-day-fill::before { content: "\f1fb"; } -.bi-calendar2-day::before { content: "\f1fc"; } -.bi-calendar2-event-fill::before { content: "\f1fd"; } -.bi-calendar2-event::before { content: "\f1fe"; } -.bi-calendar2-fill::before { content: "\f1ff"; } -.bi-calendar2-minus-fill::before { content: "\f200"; } -.bi-calendar2-minus::before { content: "\f201"; } -.bi-calendar2-month-fill::before { content: "\f202"; } -.bi-calendar2-month::before { content: "\f203"; } -.bi-calendar2-plus-fill::before { content: "\f204"; } -.bi-calendar2-plus::before { content: "\f205"; } -.bi-calendar2-range-fill::before { content: "\f206"; } -.bi-calendar2-range::before { content: "\f207"; } -.bi-calendar2-week-fill::before { content: "\f208"; } -.bi-calendar2-week::before { content: "\f209"; } -.bi-calendar2-x-fill::before { content: "\f20a"; } -.bi-calendar2-x::before { content: "\f20b"; } -.bi-calendar2::before { content: "\f20c"; } -.bi-calendar3-event-fill::before { content: "\f20d"; } -.bi-calendar3-event::before { content: "\f20e"; } -.bi-calendar3-fill::before { content: "\f20f"; } -.bi-calendar3-range-fill::before { content: "\f210"; } -.bi-calendar3-range::before { content: "\f211"; } -.bi-calendar3-week-fill::before { content: "\f212"; } -.bi-calendar3-week::before { content: "\f213"; } -.bi-calendar3::before { content: "\f214"; } -.bi-calendar4-event::before { content: "\f215"; } -.bi-calendar4-range::before { content: "\f216"; } -.bi-calendar4-week::before { content: "\f217"; } -.bi-calendar4::before { content: "\f218"; } -.bi-camera-fill::before { content: "\f219"; } -.bi-camera-reels-fill::before { content: "\f21a"; } -.bi-camera-reels::before { content: "\f21b"; } -.bi-camera-video-fill::before { content: "\f21c"; } -.bi-camera-video-off-fill::before { content: "\f21d"; } -.bi-camera-video-off::before { content: "\f21e"; } -.bi-camera-video::before { content: "\f21f"; } -.bi-camera::before { content: "\f220"; } -.bi-camera2::before { content: "\f221"; } -.bi-capslock-fill::before { content: "\f222"; } -.bi-capslock::before { content: "\f223"; } -.bi-card-checklist::before { content: "\f224"; } -.bi-card-heading::before { content: "\f225"; } -.bi-card-image::before { content: "\f226"; } -.bi-card-list::before { content: "\f227"; } -.bi-card-text::before { content: "\f228"; } -.bi-caret-down-fill::before { content: "\f229"; } -.bi-caret-down-square-fill::before { content: "\f22a"; } -.bi-caret-down-square::before { content: "\f22b"; } -.bi-caret-down::before { content: "\f22c"; } -.bi-caret-left-fill::before { content: "\f22d"; } -.bi-caret-left-square-fill::before { content: "\f22e"; } -.bi-caret-left-square::before { content: "\f22f"; } -.bi-caret-left::before { content: "\f230"; } -.bi-caret-right-fill::before { content: "\f231"; } -.bi-caret-right-square-fill::before { content: "\f232"; } -.bi-caret-right-square::before { content: "\f233"; } -.bi-caret-right::before { content: "\f234"; } -.bi-caret-up-fill::before { content: "\f235"; } -.bi-caret-up-square-fill::before { content: "\f236"; } -.bi-caret-up-square::before { content: "\f237"; } -.bi-caret-up::before { content: "\f238"; } -.bi-cart-check-fill::before { content: "\f239"; } -.bi-cart-check::before { content: "\f23a"; } -.bi-cart-dash-fill::before { content: "\f23b"; } -.bi-cart-dash::before { content: "\f23c"; } -.bi-cart-fill::before { content: "\f23d"; } -.bi-cart-plus-fill::before { content: "\f23e"; } -.bi-cart-plus::before { content: "\f23f"; } -.bi-cart-x-fill::before { content: "\f240"; } -.bi-cart-x::before { content: "\f241"; } -.bi-cart::before { content: "\f242"; } -.bi-cart2::before { content: "\f243"; } -.bi-cart3::before { content: "\f244"; } -.bi-cart4::before { content: "\f245"; } -.bi-cash-stack::before { content: "\f246"; } -.bi-cash::before { content: "\f247"; } -.bi-cast::before { content: "\f248"; } -.bi-chat-dots-fill::before { content: "\f249"; } -.bi-chat-dots::before { content: "\f24a"; } -.bi-chat-fill::before { content: "\f24b"; } -.bi-chat-left-dots-fill::before { content: "\f24c"; } -.bi-chat-left-dots::before { content: "\f24d"; } -.bi-chat-left-fill::before { content: "\f24e"; } -.bi-chat-left-quote-fill::before { content: "\f24f"; } -.bi-chat-left-quote::before { content: "\f250"; } -.bi-chat-left-text-fill::before { content: "\f251"; } -.bi-chat-left-text::before { content: "\f252"; } -.bi-chat-left::before { content: "\f253"; } -.bi-chat-quote-fill::before { content: "\f254"; } -.bi-chat-quote::before { content: "\f255"; } -.bi-chat-right-dots-fill::before { content: "\f256"; } -.bi-chat-right-dots::before { content: "\f257"; } -.bi-chat-right-fill::before { content: "\f258"; } -.bi-chat-right-quote-fill::before { content: "\f259"; } -.bi-chat-right-quote::before { content: "\f25a"; } -.bi-chat-right-text-fill::before { content: "\f25b"; } -.bi-chat-right-text::before { content: "\f25c"; } -.bi-chat-right::before { content: "\f25d"; } -.bi-chat-square-dots-fill::before { content: "\f25e"; } -.bi-chat-square-dots::before { content: "\f25f"; } -.bi-chat-square-fill::before { content: "\f260"; } -.bi-chat-square-quote-fill::before { content: "\f261"; } -.bi-chat-square-quote::before { content: "\f262"; } -.bi-chat-square-text-fill::before { content: "\f263"; } -.bi-chat-square-text::before { content: "\f264"; } -.bi-chat-square::before { content: "\f265"; } -.bi-chat-text-fill::before { content: "\f266"; } -.bi-chat-text::before { content: "\f267"; } -.bi-chat::before { content: "\f268"; } -.bi-check-all::before { content: "\f269"; } -.bi-check-circle-fill::before { content: "\f26a"; } -.bi-check-circle::before { content: "\f26b"; } -.bi-check-square-fill::before { content: "\f26c"; } -.bi-check-square::before { content: "\f26d"; } -.bi-check::before { content: "\f26e"; } -.bi-check2-all::before { content: "\f26f"; } -.bi-check2-circle::before { content: "\f270"; } -.bi-check2-square::before { content: "\f271"; } -.bi-check2::before { content: "\f272"; } -.bi-chevron-bar-contract::before { content: "\f273"; } -.bi-chevron-bar-down::before { content: "\f274"; } -.bi-chevron-bar-expand::before { content: "\f275"; } -.bi-chevron-bar-left::before { content: "\f276"; } -.bi-chevron-bar-right::before { content: "\f277"; } -.bi-chevron-bar-up::before { content: "\f278"; } -.bi-chevron-compact-down::before { content: "\f279"; } -.bi-chevron-compact-left::before { content: "\f27a"; } -.bi-chevron-compact-right::before { content: "\f27b"; } -.bi-chevron-compact-up::before { content: "\f27c"; } -.bi-chevron-contract::before { content: "\f27d"; } -.bi-chevron-double-down::before { content: "\f27e"; } -.bi-chevron-double-left::before { content: "\f27f"; } -.bi-chevron-double-right::before { content: "\f280"; } -.bi-chevron-double-up::before { content: "\f281"; } -.bi-chevron-down::before { content: "\f282"; } -.bi-chevron-expand::before { content: "\f283"; } -.bi-chevron-left::before { content: "\f284"; } -.bi-chevron-right::before { content: "\f285"; } -.bi-chevron-up::before { content: "\f286"; } -.bi-circle-fill::before { content: "\f287"; } -.bi-circle-half::before { content: "\f288"; } -.bi-circle-square::before { content: "\f289"; } -.bi-circle::before { content: "\f28a"; } -.bi-clipboard-check::before { content: "\f28b"; } -.bi-clipboard-data::before { content: "\f28c"; } -.bi-clipboard-minus::before { content: "\f28d"; } -.bi-clipboard-plus::before { content: "\f28e"; } -.bi-clipboard-x::before { content: "\f28f"; } -.bi-clipboard::before { content: "\f290"; } -.bi-clock-fill::before { content: "\f291"; } -.bi-clock-history::before { content: "\f292"; } -.bi-clock::before { content: "\f293"; } -.bi-cloud-arrow-down-fill::before { content: "\f294"; } -.bi-cloud-arrow-down::before { content: "\f295"; } -.bi-cloud-arrow-up-fill::before { content: "\f296"; } -.bi-cloud-arrow-up::before { content: "\f297"; } -.bi-cloud-check-fill::before { content: "\f298"; } -.bi-cloud-check::before { content: "\f299"; } -.bi-cloud-download-fill::before { content: "\f29a"; } -.bi-cloud-download::before { content: "\f29b"; } -.bi-cloud-drizzle-fill::before { content: "\f29c"; } -.bi-cloud-drizzle::before { content: "\f29d"; } -.bi-cloud-fill::before { content: "\f29e"; } -.bi-cloud-fog-fill::before { content: "\f29f"; } -.bi-cloud-fog::before { content: "\f2a0"; } -.bi-cloud-fog2-fill::before { content: "\f2a1"; } -.bi-cloud-fog2::before { content: "\f2a2"; } -.bi-cloud-hail-fill::before { content: "\f2a3"; } -.bi-cloud-hail::before { content: "\f2a4"; } -.bi-cloud-haze-fill::before { content: "\f2a6"; } -.bi-cloud-haze::before { content: "\f2a7"; } -.bi-cloud-haze2-fill::before { content: "\f2a8"; } -.bi-cloud-lightning-fill::before { content: "\f2a9"; } -.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } -.bi-cloud-lightning-rain::before { content: "\f2ab"; } -.bi-cloud-lightning::before { content: "\f2ac"; } -.bi-cloud-minus-fill::before { content: "\f2ad"; } -.bi-cloud-minus::before { content: "\f2ae"; } -.bi-cloud-moon-fill::before { content: "\f2af"; } -.bi-cloud-moon::before { content: "\f2b0"; } -.bi-cloud-plus-fill::before { content: "\f2b1"; } -.bi-cloud-plus::before { content: "\f2b2"; } -.bi-cloud-rain-fill::before { content: "\f2b3"; } -.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } -.bi-cloud-rain-heavy::before { content: "\f2b5"; } -.bi-cloud-rain::before { content: "\f2b6"; } -.bi-cloud-slash-fill::before { content: "\f2b7"; } -.bi-cloud-slash::before { content: "\f2b8"; } -.bi-cloud-sleet-fill::before { content: "\f2b9"; } -.bi-cloud-sleet::before { content: "\f2ba"; } -.bi-cloud-snow-fill::before { content: "\f2bb"; } -.bi-cloud-snow::before { content: "\f2bc"; } -.bi-cloud-sun-fill::before { content: "\f2bd"; } -.bi-cloud-sun::before { content: "\f2be"; } -.bi-cloud-upload-fill::before { content: "\f2bf"; } -.bi-cloud-upload::before { content: "\f2c0"; } -.bi-cloud::before { content: "\f2c1"; } -.bi-clouds-fill::before { content: "\f2c2"; } -.bi-clouds::before { content: "\f2c3"; } -.bi-cloudy-fill::before { content: "\f2c4"; } -.bi-cloudy::before { content: "\f2c5"; } -.bi-code-slash::before { content: "\f2c6"; } -.bi-code-square::before { content: "\f2c7"; } -.bi-code::before { content: "\f2c8"; } -.bi-collection-fill::before { content: "\f2c9"; } -.bi-collection-play-fill::before { content: "\f2ca"; } -.bi-collection-play::before { content: "\f2cb"; } -.bi-collection::before { content: "\f2cc"; } -.bi-columns-gap::before { content: "\f2cd"; } -.bi-columns::before { content: "\f2ce"; } -.bi-command::before { content: "\f2cf"; } -.bi-compass-fill::before { content: "\f2d0"; } -.bi-compass::before { content: "\f2d1"; } -.bi-cone-striped::before { content: "\f2d2"; } -.bi-cone::before { content: "\f2d3"; } -.bi-controller::before { content: "\f2d4"; } -.bi-cpu-fill::before { content: "\f2d5"; } -.bi-cpu::before { content: "\f2d6"; } -.bi-credit-card-2-back-fill::before { content: "\f2d7"; } -.bi-credit-card-2-back::before { content: "\f2d8"; } -.bi-credit-card-2-front-fill::before { content: "\f2d9"; } -.bi-credit-card-2-front::before { content: "\f2da"; } -.bi-credit-card-fill::before { content: "\f2db"; } -.bi-credit-card::before { content: "\f2dc"; } -.bi-crop::before { content: "\f2dd"; } -.bi-cup-fill::before { content: "\f2de"; } -.bi-cup-straw::before { content: "\f2df"; } -.bi-cup::before { content: "\f2e0"; } -.bi-cursor-fill::before { content: "\f2e1"; } -.bi-cursor-text::before { content: "\f2e2"; } -.bi-cursor::before { content: "\f2e3"; } -.bi-dash-circle-dotted::before { content: "\f2e4"; } -.bi-dash-circle-fill::before { content: "\f2e5"; } -.bi-dash-circle::before { content: "\f2e6"; } -.bi-dash-square-dotted::before { content: "\f2e7"; } -.bi-dash-square-fill::before { content: "\f2e8"; } -.bi-dash-square::before { content: "\f2e9"; } -.bi-dash::before { content: "\f2ea"; } -.bi-diagram-2-fill::before { content: "\f2eb"; } -.bi-diagram-2::before { content: "\f2ec"; } -.bi-diagram-3-fill::before { content: "\f2ed"; } -.bi-diagram-3::before { content: "\f2ee"; } -.bi-diamond-fill::before { content: "\f2ef"; } -.bi-diamond-half::before { content: "\f2f0"; } -.bi-diamond::before { content: "\f2f1"; } -.bi-dice-1-fill::before { content: "\f2f2"; } -.bi-dice-1::before { content: "\f2f3"; } -.bi-dice-2-fill::before { content: "\f2f4"; } -.bi-dice-2::before { content: "\f2f5"; } -.bi-dice-3-fill::before { content: "\f2f6"; } -.bi-dice-3::before { content: "\f2f7"; } -.bi-dice-4-fill::before { content: "\f2f8"; } -.bi-dice-4::before { content: "\f2f9"; } -.bi-dice-5-fill::before { content: "\f2fa"; } -.bi-dice-5::before { content: "\f2fb"; } -.bi-dice-6-fill::before { content: "\f2fc"; } -.bi-dice-6::before { content: "\f2fd"; } -.bi-disc-fill::before { content: "\f2fe"; } -.bi-disc::before { content: "\f2ff"; } -.bi-discord::before { content: "\f300"; } -.bi-display-fill::before { content: "\f301"; } -.bi-display::before { content: "\f302"; } -.bi-distribute-horizontal::before { content: "\f303"; } -.bi-distribute-vertical::before { content: "\f304"; } -.bi-door-closed-fill::before { content: "\f305"; } -.bi-door-closed::before { content: "\f306"; } -.bi-door-open-fill::before { content: "\f307"; } -.bi-door-open::before { content: "\f308"; } -.bi-dot::before { content: "\f309"; } -.bi-download::before { content: "\f30a"; } -.bi-droplet-fill::before { content: "\f30b"; } -.bi-droplet-half::before { content: "\f30c"; } -.bi-droplet::before { content: "\f30d"; } -.bi-earbuds::before { content: "\f30e"; } -.bi-easel-fill::before { content: "\f30f"; } -.bi-easel::before { content: "\f310"; } -.bi-egg-fill::before { content: "\f311"; } -.bi-egg-fried::before { content: "\f312"; } -.bi-egg::before { content: "\f313"; } -.bi-eject-fill::before { content: "\f314"; } -.bi-eject::before { content: "\f315"; } -.bi-emoji-angry-fill::before { content: "\f316"; } -.bi-emoji-angry::before { content: "\f317"; } -.bi-emoji-dizzy-fill::before { content: "\f318"; } -.bi-emoji-dizzy::before { content: "\f319"; } -.bi-emoji-expressionless-fill::before { content: "\f31a"; } -.bi-emoji-expressionless::before { content: "\f31b"; } -.bi-emoji-frown-fill::before { content: "\f31c"; } -.bi-emoji-frown::before { content: "\f31d"; } -.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } -.bi-emoji-heart-eyes::before { content: "\f31f"; } -.bi-emoji-laughing-fill::before { content: "\f320"; } -.bi-emoji-laughing::before { content: "\f321"; } -.bi-emoji-neutral-fill::before { content: "\f322"; } -.bi-emoji-neutral::before { content: "\f323"; } -.bi-emoji-smile-fill::before { content: "\f324"; } -.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } -.bi-emoji-smile-upside-down::before { content: "\f326"; } -.bi-emoji-smile::before { content: "\f327"; } -.bi-emoji-sunglasses-fill::before { content: "\f328"; } -.bi-emoji-sunglasses::before { content: "\f329"; } -.bi-emoji-wink-fill::before { content: "\f32a"; } -.bi-emoji-wink::before { content: "\f32b"; } -.bi-envelope-fill::before { content: "\f32c"; } -.bi-envelope-open-fill::before { content: "\f32d"; } -.bi-envelope-open::before { content: "\f32e"; } -.bi-envelope::before { content: "\f32f"; } -.bi-eraser-fill::before { content: "\f330"; } -.bi-eraser::before { content: "\f331"; } -.bi-exclamation-circle-fill::before { content: "\f332"; } -.bi-exclamation-circle::before { content: "\f333"; } -.bi-exclamation-diamond-fill::before { content: "\f334"; } -.bi-exclamation-diamond::before { content: "\f335"; } -.bi-exclamation-octagon-fill::before { content: "\f336"; } -.bi-exclamation-octagon::before { content: "\f337"; } -.bi-exclamation-square-fill::before { content: "\f338"; } -.bi-exclamation-square::before { content: "\f339"; } -.bi-exclamation-triangle-fill::before { content: "\f33a"; } -.bi-exclamation-triangle::before { content: "\f33b"; } -.bi-exclamation::before { content: "\f33c"; } -.bi-exclude::before { content: "\f33d"; } -.bi-eye-fill::before { content: "\f33e"; } -.bi-eye-slash-fill::before { content: "\f33f"; } -.bi-eye-slash::before { content: "\f340"; } -.bi-eye::before { content: "\f341"; } -.bi-eyedropper::before { content: "\f342"; } -.bi-eyeglasses::before { content: "\f343"; } -.bi-facebook::before { content: "\f344"; } -.bi-file-arrow-down-fill::before { content: "\f345"; } -.bi-file-arrow-down::before { content: "\f346"; } -.bi-file-arrow-up-fill::before { content: "\f347"; } -.bi-file-arrow-up::before { content: "\f348"; } -.bi-file-bar-graph-fill::before { content: "\f349"; } -.bi-file-bar-graph::before { content: "\f34a"; } -.bi-file-binary-fill::before { content: "\f34b"; } -.bi-file-binary::before { content: "\f34c"; } -.bi-file-break-fill::before { content: "\f34d"; } -.bi-file-break::before { content: "\f34e"; } -.bi-file-check-fill::before { content: "\f34f"; } -.bi-file-check::before { content: "\f350"; } -.bi-file-code-fill::before { content: "\f351"; } -.bi-file-code::before { content: "\f352"; } -.bi-file-diff-fill::before { content: "\f353"; } -.bi-file-diff::before { content: "\f354"; } -.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } -.bi-file-earmark-arrow-down::before { content: "\f356"; } -.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } -.bi-file-earmark-arrow-up::before { content: "\f358"; } -.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } -.bi-file-earmark-bar-graph::before { content: "\f35a"; } -.bi-file-earmark-binary-fill::before { content: "\f35b"; } -.bi-file-earmark-binary::before { content: "\f35c"; } -.bi-file-earmark-break-fill::before { content: "\f35d"; } -.bi-file-earmark-break::before { content: "\f35e"; } -.bi-file-earmark-check-fill::before { content: "\f35f"; } -.bi-file-earmark-check::before { content: "\f360"; } -.bi-file-earmark-code-fill::before { content: "\f361"; } -.bi-file-earmark-code::before { content: "\f362"; } -.bi-file-earmark-diff-fill::before { content: "\f363"; } -.bi-file-earmark-diff::before { content: "\f364"; } -.bi-file-earmark-easel-fill::before { content: "\f365"; } -.bi-file-earmark-easel::before { content: "\f366"; } -.bi-file-earmark-excel-fill::before { content: "\f367"; } -.bi-file-earmark-excel::before { content: "\f368"; } -.bi-file-earmark-fill::before { content: "\f369"; } -.bi-file-earmark-font-fill::before { content: "\f36a"; } -.bi-file-earmark-font::before { content: "\f36b"; } -.bi-file-earmark-image-fill::before { content: "\f36c"; } -.bi-file-earmark-image::before { content: "\f36d"; } -.bi-file-earmark-lock-fill::before { content: "\f36e"; } -.bi-file-earmark-lock::before { content: "\f36f"; } -.bi-file-earmark-lock2-fill::before { content: "\f370"; } -.bi-file-earmark-lock2::before { content: "\f371"; } -.bi-file-earmark-medical-fill::before { content: "\f372"; } -.bi-file-earmark-medical::before { content: "\f373"; } -.bi-file-earmark-minus-fill::before { content: "\f374"; } -.bi-file-earmark-minus::before { content: "\f375"; } -.bi-file-earmark-music-fill::before { content: "\f376"; } -.bi-file-earmark-music::before { content: "\f377"; } -.bi-file-earmark-person-fill::before { content: "\f378"; } -.bi-file-earmark-person::before { content: "\f379"; } -.bi-file-earmark-play-fill::before { content: "\f37a"; } -.bi-file-earmark-play::before { content: "\f37b"; } -.bi-file-earmark-plus-fill::before { content: "\f37c"; } -.bi-file-earmark-plus::before { content: "\f37d"; } -.bi-file-earmark-post-fill::before { content: "\f37e"; } -.bi-file-earmark-post::before { content: "\f37f"; } -.bi-file-earmark-ppt-fill::before { content: "\f380"; } -.bi-file-earmark-ppt::before { content: "\f381"; } -.bi-file-earmark-richtext-fill::before { content: "\f382"; } -.bi-file-earmark-richtext::before { content: "\f383"; } -.bi-file-earmark-ruled-fill::before { content: "\f384"; } -.bi-file-earmark-ruled::before { content: "\f385"; } -.bi-file-earmark-slides-fill::before { content: "\f386"; } -.bi-file-earmark-slides::before { content: "\f387"; } -.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } -.bi-file-earmark-spreadsheet::before { content: "\f389"; } -.bi-file-earmark-text-fill::before { content: "\f38a"; } -.bi-file-earmark-text::before { content: "\f38b"; } -.bi-file-earmark-word-fill::before { content: "\f38c"; } -.bi-file-earmark-word::before { content: "\f38d"; } -.bi-file-earmark-x-fill::before { content: "\f38e"; } -.bi-file-earmark-x::before { content: "\f38f"; } -.bi-file-earmark-zip-fill::before { content: "\f390"; } -.bi-file-earmark-zip::before { content: "\f391"; } -.bi-file-earmark::before { content: "\f392"; } -.bi-file-easel-fill::before { content: "\f393"; } -.bi-file-easel::before { content: "\f394"; } -.bi-file-excel-fill::before { content: "\f395"; } -.bi-file-excel::before { content: "\f396"; } -.bi-file-fill::before { content: "\f397"; } -.bi-file-font-fill::before { content: "\f398"; } -.bi-file-font::before { content: "\f399"; } -.bi-file-image-fill::before { content: "\f39a"; } -.bi-file-image::before { content: "\f39b"; } -.bi-file-lock-fill::before { content: "\f39c"; } -.bi-file-lock::before { content: "\f39d"; } -.bi-file-lock2-fill::before { content: "\f39e"; } -.bi-file-lock2::before { content: "\f39f"; } -.bi-file-medical-fill::before { content: "\f3a0"; } -.bi-file-medical::before { content: "\f3a1"; } -.bi-file-minus-fill::before { content: "\f3a2"; } -.bi-file-minus::before { content: "\f3a3"; } -.bi-file-music-fill::before { content: "\f3a4"; } -.bi-file-music::before { content: "\f3a5"; } -.bi-file-person-fill::before { content: "\f3a6"; } -.bi-file-person::before { content: "\f3a7"; } -.bi-file-play-fill::before { content: "\f3a8"; } -.bi-file-play::before { content: "\f3a9"; } -.bi-file-plus-fill::before { content: "\f3aa"; } -.bi-file-plus::before { content: "\f3ab"; } -.bi-file-post-fill::before { content: "\f3ac"; } -.bi-file-post::before { content: "\f3ad"; } -.bi-file-ppt-fill::before { content: "\f3ae"; } -.bi-file-ppt::before { content: "\f3af"; } -.bi-file-richtext-fill::before { content: "\f3b0"; } -.bi-file-richtext::before { content: "\f3b1"; } -.bi-file-ruled-fill::before { content: "\f3b2"; } -.bi-file-ruled::before { content: "\f3b3"; } -.bi-file-slides-fill::before { content: "\f3b4"; } -.bi-file-slides::before { content: "\f3b5"; } -.bi-file-spreadsheet-fill::before { content: "\f3b6"; } -.bi-file-spreadsheet::before { content: "\f3b7"; } -.bi-file-text-fill::before { content: "\f3b8"; } -.bi-file-text::before { content: "\f3b9"; } -.bi-file-word-fill::before { content: "\f3ba"; } -.bi-file-word::before { content: "\f3bb"; } -.bi-file-x-fill::before { content: "\f3bc"; } -.bi-file-x::before { content: "\f3bd"; } -.bi-file-zip-fill::before { content: "\f3be"; } -.bi-file-zip::before { content: "\f3bf"; } -.bi-file::before { content: "\f3c0"; } -.bi-files-alt::before { content: "\f3c1"; } -.bi-files::before { content: "\f3c2"; } -.bi-film::before { content: "\f3c3"; } -.bi-filter-circle-fill::before { content: "\f3c4"; } -.bi-filter-circle::before { content: "\f3c5"; } -.bi-filter-left::before { content: "\f3c6"; } -.bi-filter-right::before { content: "\f3c7"; } -.bi-filter-square-fill::before { content: "\f3c8"; } -.bi-filter-square::before { content: "\f3c9"; } -.bi-filter::before { content: "\f3ca"; } -.bi-flag-fill::before { content: "\f3cb"; } -.bi-flag::before { content: "\f3cc"; } -.bi-flower1::before { content: "\f3cd"; } -.bi-flower2::before { content: "\f3ce"; } -.bi-flower3::before { content: "\f3cf"; } -.bi-folder-check::before { content: "\f3d0"; } -.bi-folder-fill::before { content: "\f3d1"; } -.bi-folder-minus::before { content: "\f3d2"; } -.bi-folder-plus::before { content: "\f3d3"; } -.bi-folder-symlink-fill::before { content: "\f3d4"; } -.bi-folder-symlink::before { content: "\f3d5"; } -.bi-folder-x::before { content: "\f3d6"; } -.bi-folder::before { content: "\f3d7"; } -.bi-folder2-open::before { content: "\f3d8"; } -.bi-folder2::before { content: "\f3d9"; } -.bi-fonts::before { content: "\f3da"; } -.bi-forward-fill::before { content: "\f3db"; } -.bi-forward::before { content: "\f3dc"; } -.bi-front::before { content: "\f3dd"; } -.bi-fullscreen-exit::before { content: "\f3de"; } -.bi-fullscreen::before { content: "\f3df"; } -.bi-funnel-fill::before { content: "\f3e0"; } -.bi-funnel::before { content: "\f3e1"; } -.bi-gear-fill::before { content: "\f3e2"; } -.bi-gear-wide-connected::before { content: "\f3e3"; } -.bi-gear-wide::before { content: "\f3e4"; } -.bi-gear::before { content: "\f3e5"; } -.bi-gem::before { content: "\f3e6"; } -.bi-geo-alt-fill::before { content: "\f3e7"; } -.bi-geo-alt::before { content: "\f3e8"; } -.bi-geo-fill::before { content: "\f3e9"; } -.bi-geo::before { content: "\f3ea"; } -.bi-gift-fill::before { content: "\f3eb"; } -.bi-gift::before { content: "\f3ec"; } -.bi-github::before { content: "\f3ed"; } -.bi-globe::before { content: "\f3ee"; } -.bi-globe2::before { content: "\f3ef"; } -.bi-google::before { content: "\f3f0"; } -.bi-graph-down::before { content: "\f3f1"; } -.bi-graph-up::before { content: "\f3f2"; } -.bi-grid-1x2-fill::before { content: "\f3f3"; } -.bi-grid-1x2::before { content: "\f3f4"; } -.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } -.bi-grid-3x2-gap::before { content: "\f3f6"; } -.bi-grid-3x2::before { content: "\f3f7"; } -.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } -.bi-grid-3x3-gap::before { content: "\f3f9"; } -.bi-grid-3x3::before { content: "\f3fa"; } -.bi-grid-fill::before { content: "\f3fb"; } -.bi-grid::before { content: "\f3fc"; } -.bi-grip-horizontal::before { content: "\f3fd"; } -.bi-grip-vertical::before { content: "\f3fe"; } -.bi-hammer::before { content: "\f3ff"; } -.bi-hand-index-fill::before { content: "\f400"; } -.bi-hand-index-thumb-fill::before { content: "\f401"; } -.bi-hand-index-thumb::before { content: "\f402"; } -.bi-hand-index::before { content: "\f403"; } -.bi-hand-thumbs-down-fill::before { content: "\f404"; } -.bi-hand-thumbs-down::before { content: "\f405"; } -.bi-hand-thumbs-up-fill::before { content: "\f406"; } -.bi-hand-thumbs-up::before { content: "\f407"; } -.bi-handbag-fill::before { content: "\f408"; } -.bi-handbag::before { content: "\f409"; } -.bi-hash::before { content: "\f40a"; } -.bi-hdd-fill::before { content: "\f40b"; } -.bi-hdd-network-fill::before { content: "\f40c"; } -.bi-hdd-network::before { content: "\f40d"; } -.bi-hdd-rack-fill::before { content: "\f40e"; } -.bi-hdd-rack::before { content: "\f40f"; } -.bi-hdd-stack-fill::before { content: "\f410"; } -.bi-hdd-stack::before { content: "\f411"; } -.bi-hdd::before { content: "\f412"; } -.bi-headphones::before { content: "\f413"; } -.bi-headset::before { content: "\f414"; } -.bi-heart-fill::before { content: "\f415"; } -.bi-heart-half::before { content: "\f416"; } -.bi-heart::before { content: "\f417"; } -.bi-heptagon-fill::before { content: "\f418"; } -.bi-heptagon-half::before { content: "\f419"; } -.bi-heptagon::before { content: "\f41a"; } -.bi-hexagon-fill::before { content: "\f41b"; } -.bi-hexagon-half::before { content: "\f41c"; } -.bi-hexagon::before { content: "\f41d"; } -.bi-hourglass-bottom::before { content: "\f41e"; } -.bi-hourglass-split::before { content: "\f41f"; } -.bi-hourglass-top::before { content: "\f420"; } -.bi-hourglass::before { content: "\f421"; } -.bi-house-door-fill::before { content: "\f422"; } -.bi-house-door::before { content: "\f423"; } -.bi-house-fill::before { content: "\f424"; } -.bi-house::before { content: "\f425"; } -.bi-hr::before { content: "\f426"; } -.bi-hurricane::before { content: "\f427"; } -.bi-image-alt::before { content: "\f428"; } -.bi-image-fill::before { content: "\f429"; } -.bi-image::before { content: "\f42a"; } -.bi-images::before { content: "\f42b"; } -.bi-inbox-fill::before { content: "\f42c"; } -.bi-inbox::before { content: "\f42d"; } -.bi-inboxes-fill::before { content: "\f42e"; } -.bi-inboxes::before { content: "\f42f"; } -.bi-info-circle-fill::before { content: "\f430"; } -.bi-info-circle::before { content: "\f431"; } -.bi-info-square-fill::before { content: "\f432"; } -.bi-info-square::before { content: "\f433"; } -.bi-info::before { content: "\f434"; } -.bi-input-cursor-text::before { content: "\f435"; } -.bi-input-cursor::before { content: "\f436"; } -.bi-instagram::before { content: "\f437"; } -.bi-intersect::before { content: "\f438"; } -.bi-journal-album::before { content: "\f439"; } -.bi-journal-arrow-down::before { content: "\f43a"; } -.bi-journal-arrow-up::before { content: "\f43b"; } -.bi-journal-bookmark-fill::before { content: "\f43c"; } -.bi-journal-bookmark::before { content: "\f43d"; } -.bi-journal-check::before { content: "\f43e"; } -.bi-journal-code::before { content: "\f43f"; } -.bi-journal-medical::before { content: "\f440"; } -.bi-journal-minus::before { content: "\f441"; } -.bi-journal-plus::before { content: "\f442"; } -.bi-journal-richtext::before { content: "\f443"; } -.bi-journal-text::before { content: "\f444"; } -.bi-journal-x::before { content: "\f445"; } -.bi-journal::before { content: "\f446"; } -.bi-journals::before { content: "\f447"; } -.bi-joystick::before { content: "\f448"; } -.bi-justify-left::before { content: "\f449"; } -.bi-justify-right::before { content: "\f44a"; } -.bi-justify::before { content: "\f44b"; } -.bi-kanban-fill::before { content: "\f44c"; } -.bi-kanban::before { content: "\f44d"; } -.bi-key-fill::before { content: "\f44e"; } -.bi-key::before { content: "\f44f"; } -.bi-keyboard-fill::before { content: "\f450"; } -.bi-keyboard::before { content: "\f451"; } -.bi-ladder::before { content: "\f452"; } -.bi-lamp-fill::before { content: "\f453"; } -.bi-lamp::before { content: "\f454"; } -.bi-laptop-fill::before { content: "\f455"; } -.bi-laptop::before { content: "\f456"; } -.bi-layer-backward::before { content: "\f457"; } -.bi-layer-forward::before { content: "\f458"; } -.bi-layers-fill::before { content: "\f459"; } -.bi-layers-half::before { content: "\f45a"; } -.bi-layers::before { content: "\f45b"; } -.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } -.bi-layout-sidebar-inset::before { content: "\f45d"; } -.bi-layout-sidebar-reverse::before { content: "\f45e"; } -.bi-layout-sidebar::before { content: "\f45f"; } -.bi-layout-split::before { content: "\f460"; } -.bi-layout-text-sidebar-reverse::before { content: "\f461"; } -.bi-layout-text-sidebar::before { content: "\f462"; } -.bi-layout-text-window-reverse::before { content: "\f463"; } -.bi-layout-text-window::before { content: "\f464"; } -.bi-layout-three-columns::before { content: "\f465"; } -.bi-layout-wtf::before { content: "\f466"; } -.bi-life-preserver::before { content: "\f467"; } -.bi-lightbulb-fill::before { content: "\f468"; } -.bi-lightbulb-off-fill::before { content: "\f469"; } -.bi-lightbulb-off::before { content: "\f46a"; } -.bi-lightbulb::before { content: "\f46b"; } -.bi-lightning-charge-fill::before { content: "\f46c"; } -.bi-lightning-charge::before { content: "\f46d"; } -.bi-lightning-fill::before { content: "\f46e"; } -.bi-lightning::before { content: "\f46f"; } -.bi-link-45deg::before { content: "\f470"; } -.bi-link::before { content: "\f471"; } -.bi-linkedin::before { content: "\f472"; } -.bi-list-check::before { content: "\f473"; } -.bi-list-nested::before { content: "\f474"; } -.bi-list-ol::before { content: "\f475"; } -.bi-list-stars::before { content: "\f476"; } -.bi-list-task::before { content: "\f477"; } -.bi-list-ul::before { content: "\f478"; } -.bi-list::before { content: "\f479"; } -.bi-lock-fill::before { content: "\f47a"; } -.bi-lock::before { content: "\f47b"; } -.bi-mailbox::before { content: "\f47c"; } -.bi-mailbox2::before { content: "\f47d"; } -.bi-map-fill::before { content: "\f47e"; } -.bi-map::before { content: "\f47f"; } -.bi-markdown-fill::before { content: "\f480"; } -.bi-markdown::before { content: "\f481"; } -.bi-mask::before { content: "\f482"; } -.bi-megaphone-fill::before { content: "\f483"; } -.bi-megaphone::before { content: "\f484"; } -.bi-menu-app-fill::before { content: "\f485"; } -.bi-menu-app::before { content: "\f486"; } -.bi-menu-button-fill::before { content: "\f487"; } -.bi-menu-button-wide-fill::before { content: "\f488"; } -.bi-menu-button-wide::before { content: "\f489"; } -.bi-menu-button::before { content: "\f48a"; } -.bi-menu-down::before { content: "\f48b"; } -.bi-menu-up::before { content: "\f48c"; } -.bi-mic-fill::before { content: "\f48d"; } -.bi-mic-mute-fill::before { content: "\f48e"; } -.bi-mic-mute::before { content: "\f48f"; } -.bi-mic::before { content: "\f490"; } -.bi-minecart-loaded::before { content: "\f491"; } -.bi-minecart::before { content: "\f492"; } -.bi-moisture::before { content: "\f493"; } -.bi-moon-fill::before { content: "\f494"; } -.bi-moon-stars-fill::before { content: "\f495"; } -.bi-moon-stars::before { content: "\f496"; } -.bi-moon::before { content: "\f497"; } -.bi-mouse-fill::before { content: "\f498"; } -.bi-mouse::before { content: "\f499"; } -.bi-mouse2-fill::before { content: "\f49a"; } -.bi-mouse2::before { content: "\f49b"; } -.bi-mouse3-fill::before { content: "\f49c"; } -.bi-mouse3::before { content: "\f49d"; } -.bi-music-note-beamed::before { content: "\f49e"; } -.bi-music-note-list::before { content: "\f49f"; } -.bi-music-note::before { content: "\f4a0"; } -.bi-music-player-fill::before { content: "\f4a1"; } -.bi-music-player::before { content: "\f4a2"; } -.bi-newspaper::before { content: "\f4a3"; } -.bi-node-minus-fill::before { content: "\f4a4"; } -.bi-node-minus::before { content: "\f4a5"; } -.bi-node-plus-fill::before { content: "\f4a6"; } -.bi-node-plus::before { content: "\f4a7"; } -.bi-nut-fill::before { content: "\f4a8"; } -.bi-nut::before { content: "\f4a9"; } -.bi-octagon-fill::before { content: "\f4aa"; } -.bi-octagon-half::before { content: "\f4ab"; } -.bi-octagon::before { content: "\f4ac"; } -.bi-option::before { content: "\f4ad"; } -.bi-outlet::before { content: "\f4ae"; } -.bi-paint-bucket::before { content: "\f4af"; } -.bi-palette-fill::before { content: "\f4b0"; } -.bi-palette::before { content: "\f4b1"; } -.bi-palette2::before { content: "\f4b2"; } -.bi-paperclip::before { content: "\f4b3"; } -.bi-paragraph::before { content: "\f4b4"; } -.bi-patch-check-fill::before { content: "\f4b5"; } -.bi-patch-check::before { content: "\f4b6"; } -.bi-patch-exclamation-fill::before { content: "\f4b7"; } -.bi-patch-exclamation::before { content: "\f4b8"; } -.bi-patch-minus-fill::before { content: "\f4b9"; } -.bi-patch-minus::before { content: "\f4ba"; } -.bi-patch-plus-fill::before { content: "\f4bb"; } -.bi-patch-plus::before { content: "\f4bc"; } -.bi-patch-question-fill::before { content: "\f4bd"; } -.bi-patch-question::before { content: "\f4be"; } -.bi-pause-btn-fill::before { content: "\f4bf"; } -.bi-pause-btn::before { content: "\f4c0"; } -.bi-pause-circle-fill::before { content: "\f4c1"; } -.bi-pause-circle::before { content: "\f4c2"; } -.bi-pause-fill::before { content: "\f4c3"; } -.bi-pause::before { content: "\f4c4"; } -.bi-peace-fill::before { content: "\f4c5"; } -.bi-peace::before { content: "\f4c6"; } -.bi-pen-fill::before { content: "\f4c7"; } -.bi-pen::before { content: "\f4c8"; } -.bi-pencil-fill::before { content: "\f4c9"; } -.bi-pencil-square::before { content: "\f4ca"; } -.bi-pencil::before { content: "\f4cb"; } -.bi-pentagon-fill::before { content: "\f4cc"; } -.bi-pentagon-half::before { content: "\f4cd"; } -.bi-pentagon::before { content: "\f4ce"; } -.bi-people-fill::before { content: "\f4cf"; } -.bi-people::before { content: "\f4d0"; } -.bi-percent::before { content: "\f4d1"; } -.bi-person-badge-fill::before { content: "\f4d2"; } -.bi-person-badge::before { content: "\f4d3"; } -.bi-person-bounding-box::before { content: "\f4d4"; } -.bi-person-check-fill::before { content: "\f4d5"; } -.bi-person-check::before { content: "\f4d6"; } -.bi-person-circle::before { content: "\f4d7"; } -.bi-person-dash-fill::before { content: "\f4d8"; } -.bi-person-dash::before { content: "\f4d9"; } -.bi-person-fill::before { content: "\f4da"; } -.bi-person-lines-fill::before { content: "\f4db"; } -.bi-person-plus-fill::before { content: "\f4dc"; } -.bi-person-plus::before { content: "\f4dd"; } -.bi-person-square::before { content: "\f4de"; } -.bi-person-x-fill::before { content: "\f4df"; } -.bi-person-x::before { content: "\f4e0"; } -.bi-person::before { content: "\f4e1"; } -.bi-phone-fill::before { content: "\f4e2"; } -.bi-phone-landscape-fill::before { content: "\f4e3"; } -.bi-phone-landscape::before { content: "\f4e4"; } -.bi-phone-vibrate-fill::before { content: "\f4e5"; } -.bi-phone-vibrate::before { content: "\f4e6"; } -.bi-phone::before { content: "\f4e7"; } -.bi-pie-chart-fill::before { content: "\f4e8"; } -.bi-pie-chart::before { content: "\f4e9"; } -.bi-pin-angle-fill::before { content: "\f4ea"; } -.bi-pin-angle::before { content: "\f4eb"; } -.bi-pin-fill::before { content: "\f4ec"; } -.bi-pin::before { content: "\f4ed"; } -.bi-pip-fill::before { content: "\f4ee"; } -.bi-pip::before { content: "\f4ef"; } -.bi-play-btn-fill::before { content: "\f4f0"; } -.bi-play-btn::before { content: "\f4f1"; } -.bi-play-circle-fill::before { content: "\f4f2"; } -.bi-play-circle::before { content: "\f4f3"; } -.bi-play-fill::before { content: "\f4f4"; } -.bi-play::before { content: "\f4f5"; } -.bi-plug-fill::before { content: "\f4f6"; } -.bi-plug::before { content: "\f4f7"; } -.bi-plus-circle-dotted::before { content: "\f4f8"; } -.bi-plus-circle-fill::before { content: "\f4f9"; } -.bi-plus-circle::before { content: "\f4fa"; } -.bi-plus-square-dotted::before { content: "\f4fb"; } -.bi-plus-square-fill::before { content: "\f4fc"; } -.bi-plus-square::before { content: "\f4fd"; } -.bi-plus::before { content: "\f4fe"; } -.bi-power::before { content: "\f4ff"; } -.bi-printer-fill::before { content: "\f500"; } -.bi-printer::before { content: "\f501"; } -.bi-puzzle-fill::before { content: "\f502"; } -.bi-puzzle::before { content: "\f503"; } -.bi-question-circle-fill::before { content: "\f504"; } -.bi-question-circle::before { content: "\f505"; } -.bi-question-diamond-fill::before { content: "\f506"; } -.bi-question-diamond::before { content: "\f507"; } -.bi-question-octagon-fill::before { content: "\f508"; } -.bi-question-octagon::before { content: "\f509"; } -.bi-question-square-fill::before { content: "\f50a"; } -.bi-question-square::before { content: "\f50b"; } -.bi-question::before { content: "\f50c"; } -.bi-rainbow::before { content: "\f50d"; } -.bi-receipt-cutoff::before { content: "\f50e"; } -.bi-receipt::before { content: "\f50f"; } -.bi-reception-0::before { content: "\f510"; } -.bi-reception-1::before { content: "\f511"; } -.bi-reception-2::before { content: "\f512"; } -.bi-reception-3::before { content: "\f513"; } -.bi-reception-4::before { content: "\f514"; } -.bi-record-btn-fill::before { content: "\f515"; } -.bi-record-btn::before { content: "\f516"; } -.bi-record-circle-fill::before { content: "\f517"; } -.bi-record-circle::before { content: "\f518"; } -.bi-record-fill::before { content: "\f519"; } -.bi-record::before { content: "\f51a"; } -.bi-record2-fill::before { content: "\f51b"; } -.bi-record2::before { content: "\f51c"; } -.bi-reply-all-fill::before { content: "\f51d"; } -.bi-reply-all::before { content: "\f51e"; } -.bi-reply-fill::before { content: "\f51f"; } -.bi-reply::before { content: "\f520"; } -.bi-rss-fill::before { content: "\f521"; } -.bi-rss::before { content: "\f522"; } -.bi-rulers::before { content: "\f523"; } -.bi-save-fill::before { content: "\f524"; } -.bi-save::before { content: "\f525"; } -.bi-save2-fill::before { content: "\f526"; } -.bi-save2::before { content: "\f527"; } -.bi-scissors::before { content: "\f528"; } -.bi-screwdriver::before { content: "\f529"; } -.bi-search::before { content: "\f52a"; } -.bi-segmented-nav::before { content: "\f52b"; } -.bi-server::before { content: "\f52c"; } -.bi-share-fill::before { content: "\f52d"; } -.bi-share::before { content: "\f52e"; } -.bi-shield-check::before { content: "\f52f"; } -.bi-shield-exclamation::before { content: "\f530"; } -.bi-shield-fill-check::before { content: "\f531"; } -.bi-shield-fill-exclamation::before { content: "\f532"; } -.bi-shield-fill-minus::before { content: "\f533"; } -.bi-shield-fill-plus::before { content: "\f534"; } -.bi-shield-fill-x::before { content: "\f535"; } -.bi-shield-fill::before { content: "\f536"; } -.bi-shield-lock-fill::before { content: "\f537"; } -.bi-shield-lock::before { content: "\f538"; } -.bi-shield-minus::before { content: "\f539"; } -.bi-shield-plus::before { content: "\f53a"; } -.bi-shield-shaded::before { content: "\f53b"; } -.bi-shield-slash-fill::before { content: "\f53c"; } -.bi-shield-slash::before { content: "\f53d"; } -.bi-shield-x::before { content: "\f53e"; } -.bi-shield::before { content: "\f53f"; } -.bi-shift-fill::before { content: "\f540"; } -.bi-shift::before { content: "\f541"; } -.bi-shop-window::before { content: "\f542"; } -.bi-shop::before { content: "\f543"; } -.bi-shuffle::before { content: "\f544"; } -.bi-signpost-2-fill::before { content: "\f545"; } -.bi-signpost-2::before { content: "\f546"; } -.bi-signpost-fill::before { content: "\f547"; } -.bi-signpost-split-fill::before { content: "\f548"; } -.bi-signpost-split::before { content: "\f549"; } -.bi-signpost::before { content: "\f54a"; } -.bi-sim-fill::before { content: "\f54b"; } -.bi-sim::before { content: "\f54c"; } -.bi-skip-backward-btn-fill::before { content: "\f54d"; } -.bi-skip-backward-btn::before { content: "\f54e"; } -.bi-skip-backward-circle-fill::before { content: "\f54f"; } -.bi-skip-backward-circle::before { content: "\f550"; } -.bi-skip-backward-fill::before { content: "\f551"; } -.bi-skip-backward::before { content: "\f552"; } -.bi-skip-end-btn-fill::before { content: "\f553"; } -.bi-skip-end-btn::before { content: "\f554"; } -.bi-skip-end-circle-fill::before { content: "\f555"; } -.bi-skip-end-circle::before { content: "\f556"; } -.bi-skip-end-fill::before { content: "\f557"; } -.bi-skip-end::before { content: "\f558"; } -.bi-skip-forward-btn-fill::before { content: "\f559"; } -.bi-skip-forward-btn::before { content: "\f55a"; } -.bi-skip-forward-circle-fill::before { content: "\f55b"; } -.bi-skip-forward-circle::before { content: "\f55c"; } -.bi-skip-forward-fill::before { content: "\f55d"; } -.bi-skip-forward::before { content: "\f55e"; } -.bi-skip-start-btn-fill::before { content: "\f55f"; } -.bi-skip-start-btn::before { content: "\f560"; } -.bi-skip-start-circle-fill::before { content: "\f561"; } -.bi-skip-start-circle::before { content: "\f562"; } -.bi-skip-start-fill::before { content: "\f563"; } -.bi-skip-start::before { content: "\f564"; } -.bi-slack::before { content: "\f565"; } -.bi-slash-circle-fill::before { content: "\f566"; } -.bi-slash-circle::before { content: "\f567"; } -.bi-slash-square-fill::before { content: "\f568"; } -.bi-slash-square::before { content: "\f569"; } -.bi-slash::before { content: "\f56a"; } -.bi-sliders::before { content: "\f56b"; } -.bi-smartwatch::before { content: "\f56c"; } -.bi-snow::before { content: "\f56d"; } -.bi-snow2::before { content: "\f56e"; } -.bi-snow3::before { content: "\f56f"; } -.bi-sort-alpha-down-alt::before { content: "\f570"; } -.bi-sort-alpha-down::before { content: "\f571"; } -.bi-sort-alpha-up-alt::before { content: "\f572"; } -.bi-sort-alpha-up::before { content: "\f573"; } -.bi-sort-down-alt::before { content: "\f574"; } -.bi-sort-down::before { content: "\f575"; } -.bi-sort-numeric-down-alt::before { content: "\f576"; } -.bi-sort-numeric-down::before { content: "\f577"; } -.bi-sort-numeric-up-alt::before { content: "\f578"; } -.bi-sort-numeric-up::before { content: "\f579"; } -.bi-sort-up-alt::before { content: "\f57a"; } -.bi-sort-up::before { content: "\f57b"; } -.bi-soundwave::before { content: "\f57c"; } -.bi-speaker-fill::before { content: "\f57d"; } -.bi-speaker::before { content: "\f57e"; } -.bi-speedometer::before { content: "\f57f"; } -.bi-speedometer2::before { content: "\f580"; } -.bi-spellcheck::before { content: "\f581"; } -.bi-square-fill::before { content: "\f582"; } -.bi-square-half::before { content: "\f583"; } -.bi-square::before { content: "\f584"; } -.bi-stack::before { content: "\f585"; } -.bi-star-fill::before { content: "\f586"; } -.bi-star-half::before { content: "\f587"; } -.bi-star::before { content: "\f588"; } -.bi-stars::before { content: "\f589"; } -.bi-stickies-fill::before { content: "\f58a"; } -.bi-stickies::before { content: "\f58b"; } -.bi-sticky-fill::before { content: "\f58c"; } -.bi-sticky::before { content: "\f58d"; } -.bi-stop-btn-fill::before { content: "\f58e"; } -.bi-stop-btn::before { content: "\f58f"; } -.bi-stop-circle-fill::before { content: "\f590"; } -.bi-stop-circle::before { content: "\f591"; } -.bi-stop-fill::before { content: "\f592"; } -.bi-stop::before { content: "\f593"; } -.bi-stoplights-fill::before { content: "\f594"; } -.bi-stoplights::before { content: "\f595"; } -.bi-stopwatch-fill::before { content: "\f596"; } -.bi-stopwatch::before { content: "\f597"; } -.bi-subtract::before { content: "\f598"; } -.bi-suit-club-fill::before { content: "\f599"; } -.bi-suit-club::before { content: "\f59a"; } -.bi-suit-diamond-fill::before { content: "\f59b"; } -.bi-suit-diamond::before { content: "\f59c"; } -.bi-suit-heart-fill::before { content: "\f59d"; } -.bi-suit-heart::before { content: "\f59e"; } -.bi-suit-spade-fill::before { content: "\f59f"; } -.bi-suit-spade::before { content: "\f5a0"; } -.bi-sun-fill::before { content: "\f5a1"; } -.bi-sun::before { content: "\f5a2"; } -.bi-sunglasses::before { content: "\f5a3"; } -.bi-sunrise-fill::before { content: "\f5a4"; } -.bi-sunrise::before { content: "\f5a5"; } -.bi-sunset-fill::before { content: "\f5a6"; } -.bi-sunset::before { content: "\f5a7"; } -.bi-symmetry-horizontal::before { content: "\f5a8"; } -.bi-symmetry-vertical::before { content: "\f5a9"; } -.bi-table::before { content: "\f5aa"; } -.bi-tablet-fill::before { content: "\f5ab"; } -.bi-tablet-landscape-fill::before { content: "\f5ac"; } -.bi-tablet-landscape::before { content: "\f5ad"; } -.bi-tablet::before { content: "\f5ae"; } -.bi-tag-fill::before { content: "\f5af"; } -.bi-tag::before { content: "\f5b0"; } -.bi-tags-fill::before { content: "\f5b1"; } -.bi-tags::before { content: "\f5b2"; } -.bi-telegram::before { content: "\f5b3"; } -.bi-telephone-fill::before { content: "\f5b4"; } -.bi-telephone-forward-fill::before { content: "\f5b5"; } -.bi-telephone-forward::before { content: "\f5b6"; } -.bi-telephone-inbound-fill::before { content: "\f5b7"; } -.bi-telephone-inbound::before { content: "\f5b8"; } -.bi-telephone-minus-fill::before { content: "\f5b9"; } -.bi-telephone-minus::before { content: "\f5ba"; } -.bi-telephone-outbound-fill::before { content: "\f5bb"; } -.bi-telephone-outbound::before { content: "\f5bc"; } -.bi-telephone-plus-fill::before { content: "\f5bd"; } -.bi-telephone-plus::before { content: "\f5be"; } -.bi-telephone-x-fill::before { content: "\f5bf"; } -.bi-telephone-x::before { content: "\f5c0"; } -.bi-telephone::before { content: "\f5c1"; } -.bi-terminal-fill::before { content: "\f5c2"; } -.bi-terminal::before { content: "\f5c3"; } -.bi-text-center::before { content: "\f5c4"; } -.bi-text-indent-left::before { content: "\f5c5"; } -.bi-text-indent-right::before { content: "\f5c6"; } -.bi-text-left::before { content: "\f5c7"; } -.bi-text-paragraph::before { content: "\f5c8"; } -.bi-text-right::before { content: "\f5c9"; } -.bi-textarea-resize::before { content: "\f5ca"; } -.bi-textarea-t::before { content: "\f5cb"; } -.bi-textarea::before { content: "\f5cc"; } -.bi-thermometer-half::before { content: "\f5cd"; } -.bi-thermometer-high::before { content: "\f5ce"; } -.bi-thermometer-low::before { content: "\f5cf"; } -.bi-thermometer-snow::before { content: "\f5d0"; } -.bi-thermometer-sun::before { content: "\f5d1"; } -.bi-thermometer::before { content: "\f5d2"; } -.bi-three-dots-vertical::before { content: "\f5d3"; } -.bi-three-dots::before { content: "\f5d4"; } -.bi-toggle-off::before { content: "\f5d5"; } -.bi-toggle-on::before { content: "\f5d6"; } -.bi-toggle2-off::before { content: "\f5d7"; } -.bi-toggle2-on::before { content: "\f5d8"; } -.bi-toggles::before { content: "\f5d9"; } -.bi-toggles2::before { content: "\f5da"; } -.bi-tools::before { content: "\f5db"; } -.bi-tornado::before { content: "\f5dc"; } -.bi-trash-fill::before { content: "\f5dd"; } -.bi-trash::before { content: "\f5de"; } -.bi-trash2-fill::before { content: "\f5df"; } -.bi-trash2::before { content: "\f5e0"; } -.bi-tree-fill::before { content: "\f5e1"; } -.bi-tree::before { content: "\f5e2"; } -.bi-triangle-fill::before { content: "\f5e3"; } -.bi-triangle-half::before { content: "\f5e4"; } -.bi-triangle::before { content: "\f5e5"; } -.bi-trophy-fill::before { content: "\f5e6"; } -.bi-trophy::before { content: "\f5e7"; } -.bi-tropical-storm::before { content: "\f5e8"; } -.bi-truck-flatbed::before { content: "\f5e9"; } -.bi-truck::before { content: "\f5ea"; } -.bi-tsunami::before { content: "\f5eb"; } -.bi-tv-fill::before { content: "\f5ec"; } -.bi-tv::before { content: "\f5ed"; } -.bi-twitch::before { content: "\f5ee"; } -.bi-twitter::before { content: "\f5ef"; } -.bi-type-bold::before { content: "\f5f0"; } -.bi-type-h1::before { content: "\f5f1"; } -.bi-type-h2::before { content: "\f5f2"; } -.bi-type-h3::before { content: "\f5f3"; } -.bi-type-italic::before { content: "\f5f4"; } -.bi-type-strikethrough::before { content: "\f5f5"; } -.bi-type-underline::before { content: "\f5f6"; } -.bi-type::before { content: "\f5f7"; } -.bi-ui-checks-grid::before { content: "\f5f8"; } -.bi-ui-checks::before { content: "\f5f9"; } -.bi-ui-radios-grid::before { content: "\f5fa"; } -.bi-ui-radios::before { content: "\f5fb"; } -.bi-umbrella-fill::before { content: "\f5fc"; } -.bi-umbrella::before { content: "\f5fd"; } -.bi-union::before { content: "\f5fe"; } -.bi-unlock-fill::before { content: "\f5ff"; } -.bi-unlock::before { content: "\f600"; } -.bi-upc-scan::before { content: "\f601"; } -.bi-upc::before { content: "\f602"; } -.bi-upload::before { content: "\f603"; } -.bi-vector-pen::before { content: "\f604"; } -.bi-view-list::before { content: "\f605"; } -.bi-view-stacked::before { content: "\f606"; } -.bi-vinyl-fill::before { content: "\f607"; } -.bi-vinyl::before { content: "\f608"; } -.bi-voicemail::before { content: "\f609"; } -.bi-volume-down-fill::before { content: "\f60a"; } -.bi-volume-down::before { content: "\f60b"; } -.bi-volume-mute-fill::before { content: "\f60c"; } -.bi-volume-mute::before { content: "\f60d"; } -.bi-volume-off-fill::before { content: "\f60e"; } -.bi-volume-off::before { content: "\f60f"; } -.bi-volume-up-fill::before { content: "\f610"; } -.bi-volume-up::before { content: "\f611"; } -.bi-vr::before { content: "\f612"; } -.bi-wallet-fill::before { content: "\f613"; } -.bi-wallet::before { content: "\f614"; } -.bi-wallet2::before { content: "\f615"; } -.bi-watch::before { content: "\f616"; } -.bi-water::before { content: "\f617"; } -.bi-whatsapp::before { content: "\f618"; } -.bi-wifi-1::before { content: "\f619"; } -.bi-wifi-2::before { content: "\f61a"; } -.bi-wifi-off::before { content: "\f61b"; } -.bi-wifi::before { content: "\f61c"; } -.bi-wind::before { content: "\f61d"; } -.bi-window-dock::before { content: "\f61e"; } -.bi-window-sidebar::before { content: "\f61f"; } -.bi-window::before { content: "\f620"; } -.bi-wrench::before { content: "\f621"; } -.bi-x-circle-fill::before { content: "\f622"; } -.bi-x-circle::before { content: "\f623"; } -.bi-x-diamond-fill::before { content: "\f624"; } -.bi-x-diamond::before { content: "\f625"; } -.bi-x-octagon-fill::before { content: "\f626"; } -.bi-x-octagon::before { content: "\f627"; } -.bi-x-square-fill::before { content: "\f628"; } -.bi-x-square::before { content: "\f629"; } -.bi-x::before { content: "\f62a"; } -.bi-youtube::before { content: "\f62b"; } -.bi-zoom-in::before { content: "\f62c"; } -.bi-zoom-out::before { content: "\f62d"; } -.bi-bank::before { content: "\f62e"; } -.bi-bank2::before { content: "\f62f"; } -.bi-bell-slash-fill::before { content: "\f630"; } -.bi-bell-slash::before { content: "\f631"; } -.bi-cash-coin::before { content: "\f632"; } -.bi-check-lg::before { content: "\f633"; } -.bi-coin::before { content: "\f634"; } -.bi-currency-bitcoin::before { content: "\f635"; } -.bi-currency-dollar::before { content: "\f636"; } -.bi-currency-euro::before { content: "\f637"; } -.bi-currency-exchange::before { content: "\f638"; } -.bi-currency-pound::before { content: "\f639"; } -.bi-currency-yen::before { content: "\f63a"; } -.bi-dash-lg::before { content: "\f63b"; } -.bi-exclamation-lg::before { content: "\f63c"; } -.bi-file-earmark-pdf-fill::before { content: "\f63d"; } -.bi-file-earmark-pdf::before { content: "\f63e"; } -.bi-file-pdf-fill::before { content: "\f63f"; } -.bi-file-pdf::before { content: "\f640"; } -.bi-gender-ambiguous::before { content: "\f641"; } -.bi-gender-female::before { content: "\f642"; } -.bi-gender-male::before { content: "\f643"; } -.bi-gender-trans::before { content: "\f644"; } -.bi-headset-vr::before { content: "\f645"; } -.bi-info-lg::before { content: "\f646"; } -.bi-mastodon::before { content: "\f647"; } -.bi-messenger::before { content: "\f648"; } -.bi-piggy-bank-fill::before { content: "\f649"; } -.bi-piggy-bank::before { content: "\f64a"; } -.bi-pin-map-fill::before { content: "\f64b"; } -.bi-pin-map::before { content: "\f64c"; } -.bi-plus-lg::before { content: "\f64d"; } -.bi-question-lg::before { content: "\f64e"; } -.bi-recycle::before { content: "\f64f"; } -.bi-reddit::before { content: "\f650"; } -.bi-safe-fill::before { content: "\f651"; } -.bi-safe2-fill::before { content: "\f652"; } -.bi-safe2::before { content: "\f653"; } -.bi-sd-card-fill::before { content: "\f654"; } -.bi-sd-card::before { content: "\f655"; } -.bi-skype::before { content: "\f656"; } -.bi-slash-lg::before { content: "\f657"; } -.bi-translate::before { content: "\f658"; } -.bi-x-lg::before { content: "\f659"; } -.bi-safe::before { content: "\f65a"; } -.bi-apple::before { content: "\f65b"; } -.bi-microsoft::before { content: "\f65d"; } -.bi-windows::before { content: "\f65e"; } -.bi-behance::before { content: "\f65c"; } -.bi-dribbble::before { content: "\f65f"; } -.bi-line::before { content: "\f660"; } -.bi-medium::before { content: "\f661"; } -.bi-paypal::before { content: "\f662"; } -.bi-pinterest::before { content: "\f663"; } -.bi-signal::before { content: "\f664"; } -.bi-snapchat::before { content: "\f665"; } -.bi-spotify::before { content: "\f666"; } -.bi-stack-overflow::before { content: "\f667"; } -.bi-strava::before { content: "\f668"; } -.bi-wordpress::before { content: "\f669"; } -.bi-vimeo::before { content: "\f66a"; } -.bi-activity::before { content: "\f66b"; } -.bi-easel2-fill::before { content: "\f66c"; } -.bi-easel2::before { content: "\f66d"; } -.bi-easel3-fill::before { content: "\f66e"; } -.bi-easel3::before { content: "\f66f"; } -.bi-fan::before { content: "\f670"; } -.bi-fingerprint::before { content: "\f671"; } -.bi-graph-down-arrow::before { content: "\f672"; } -.bi-graph-up-arrow::before { content: "\f673"; } -.bi-hypnotize::before { content: "\f674"; } -.bi-magic::before { content: "\f675"; } -.bi-person-rolodex::before { content: "\f676"; } -.bi-person-video::before { content: "\f677"; } -.bi-person-video2::before { content: "\f678"; } -.bi-person-video3::before { content: "\f679"; } -.bi-person-workspace::before { content: "\f67a"; } -.bi-radioactive::before { content: "\f67b"; } -.bi-webcam-fill::before { content: "\f67c"; } -.bi-webcam::before { content: "\f67d"; } -.bi-yin-yang::before { content: "\f67e"; } -.bi-bandaid-fill::before { content: "\f680"; } -.bi-bandaid::before { content: "\f681"; } -.bi-bluetooth::before { content: "\f682"; } -.bi-body-text::before { content: "\f683"; } -.bi-boombox::before { content: "\f684"; } -.bi-boxes::before { content: "\f685"; } -.bi-dpad-fill::before { content: "\f686"; } -.bi-dpad::before { content: "\f687"; } -.bi-ear-fill::before { content: "\f688"; } -.bi-ear::before { content: "\f689"; } -.bi-envelope-check-fill::before { content: "\f68b"; } -.bi-envelope-check::before { content: "\f68c"; } -.bi-envelope-dash-fill::before { content: "\f68e"; } -.bi-envelope-dash::before { content: "\f68f"; } -.bi-envelope-exclamation-fill::before { content: "\f691"; } -.bi-envelope-exclamation::before { content: "\f692"; } -.bi-envelope-plus-fill::before { content: "\f693"; } -.bi-envelope-plus::before { content: "\f694"; } -.bi-envelope-slash-fill::before { content: "\f696"; } -.bi-envelope-slash::before { content: "\f697"; } -.bi-envelope-x-fill::before { content: "\f699"; } -.bi-envelope-x::before { content: "\f69a"; } -.bi-explicit-fill::before { content: "\f69b"; } -.bi-explicit::before { content: "\f69c"; } -.bi-git::before { content: "\f69d"; } -.bi-infinity::before { content: "\f69e"; } -.bi-list-columns-reverse::before { content: "\f69f"; } -.bi-list-columns::before { content: "\f6a0"; } -.bi-meta::before { content: "\f6a1"; } -.bi-nintendo-switch::before { content: "\f6a4"; } -.bi-pc-display-horizontal::before { content: "\f6a5"; } -.bi-pc-display::before { content: "\f6a6"; } -.bi-pc-horizontal::before { content: "\f6a7"; } -.bi-pc::before { content: "\f6a8"; } -.bi-playstation::before { content: "\f6a9"; } -.bi-plus-slash-minus::before { content: "\f6aa"; } -.bi-projector-fill::before { content: "\f6ab"; } -.bi-projector::before { content: "\f6ac"; } -.bi-qr-code-scan::before { content: "\f6ad"; } -.bi-qr-code::before { content: "\f6ae"; } -.bi-quora::before { content: "\f6af"; } -.bi-quote::before { content: "\f6b0"; } -.bi-robot::before { content: "\f6b1"; } -.bi-send-check-fill::before { content: "\f6b2"; } -.bi-send-check::before { content: "\f6b3"; } -.bi-send-dash-fill::before { content: "\f6b4"; } -.bi-send-dash::before { content: "\f6b5"; } -.bi-send-exclamation-fill::before { content: "\f6b7"; } -.bi-send-exclamation::before { content: "\f6b8"; } -.bi-send-fill::before { content: "\f6b9"; } -.bi-send-plus-fill::before { content: "\f6ba"; } -.bi-send-plus::before { content: "\f6bb"; } -.bi-send-slash-fill::before { content: "\f6bc"; } -.bi-send-slash::before { content: "\f6bd"; } -.bi-send-x-fill::before { content: "\f6be"; } -.bi-send-x::before { content: "\f6bf"; } -.bi-send::before { content: "\f6c0"; } -.bi-steam::before { content: "\f6c1"; } -.bi-terminal-dash::before { content: "\f6c3"; } -.bi-terminal-plus::before { content: "\f6c4"; } -.bi-terminal-split::before { content: "\f6c5"; } -.bi-ticket-detailed-fill::before { content: "\f6c6"; } -.bi-ticket-detailed::before { content: "\f6c7"; } -.bi-ticket-fill::before { content: "\f6c8"; } -.bi-ticket-perforated-fill::before { content: "\f6c9"; } -.bi-ticket-perforated::before { content: "\f6ca"; } -.bi-ticket::before { content: "\f6cb"; } -.bi-tiktok::before { content: "\f6cc"; } -.bi-window-dash::before { content: "\f6cd"; } -.bi-window-desktop::before { content: "\f6ce"; } -.bi-window-fullscreen::before { content: "\f6cf"; } -.bi-window-plus::before { content: "\f6d0"; } -.bi-window-split::before { content: "\f6d1"; } -.bi-window-stack::before { content: "\f6d2"; } -.bi-window-x::before { content: "\f6d3"; } -.bi-xbox::before { content: "\f6d4"; } -.bi-ethernet::before { content: "\f6d5"; } -.bi-hdmi-fill::before { content: "\f6d6"; } -.bi-hdmi::before { content: "\f6d7"; } -.bi-usb-c-fill::before { content: "\f6d8"; } -.bi-usb-c::before { content: "\f6d9"; } -.bi-usb-fill::before { content: "\f6da"; } -.bi-usb-plug-fill::before { content: "\f6db"; } -.bi-usb-plug::before { content: "\f6dc"; } -.bi-usb-symbol::before { content: "\f6dd"; } -.bi-usb::before { content: "\f6de"; } -.bi-boombox-fill::before { content: "\f6df"; } -.bi-displayport::before { content: "\f6e1"; } -.bi-gpu-card::before { content: "\f6e2"; } -.bi-memory::before { content: "\f6e3"; } -.bi-modem-fill::before { content: "\f6e4"; } -.bi-modem::before { content: "\f6e5"; } -.bi-motherboard-fill::before { content: "\f6e6"; } -.bi-motherboard::before { content: "\f6e7"; } -.bi-optical-audio-fill::before { content: "\f6e8"; } -.bi-optical-audio::before { content: "\f6e9"; } -.bi-pci-card::before { content: "\f6ea"; } -.bi-router-fill::before { content: "\f6eb"; } -.bi-router::before { content: "\f6ec"; } -.bi-thunderbolt-fill::before { content: "\f6ef"; } -.bi-thunderbolt::before { content: "\f6f0"; } -.bi-usb-drive-fill::before { content: "\f6f1"; } -.bi-usb-drive::before { content: "\f6f2"; } -.bi-usb-micro-fill::before { content: "\f6f3"; } -.bi-usb-micro::before { content: "\f6f4"; } -.bi-usb-mini-fill::before { content: "\f6f5"; } -.bi-usb-mini::before { content: "\f6f6"; } -.bi-cloud-haze2::before { content: "\f6f7"; } -.bi-device-hdd-fill::before { content: "\f6f8"; } -.bi-device-hdd::before { content: "\f6f9"; } -.bi-device-ssd-fill::before { content: "\f6fa"; } -.bi-device-ssd::before { content: "\f6fb"; } -.bi-displayport-fill::before { content: "\f6fc"; } -.bi-mortarboard-fill::before { content: "\f6fd"; } -.bi-mortarboard::before { content: "\f6fe"; } -.bi-terminal-x::before { content: "\f6ff"; } -.bi-arrow-through-heart-fill::before { content: "\f700"; } -.bi-arrow-through-heart::before { content: "\f701"; } -.bi-badge-sd-fill::before { content: "\f702"; } -.bi-badge-sd::before { content: "\f703"; } -.bi-bag-heart-fill::before { content: "\f704"; } -.bi-bag-heart::before { content: "\f705"; } -.bi-balloon-fill::before { content: "\f706"; } -.bi-balloon-heart-fill::before { content: "\f707"; } -.bi-balloon-heart::before { content: "\f708"; } -.bi-balloon::before { content: "\f709"; } -.bi-box2-fill::before { content: "\f70a"; } -.bi-box2-heart-fill::before { content: "\f70b"; } -.bi-box2-heart::before { content: "\f70c"; } -.bi-box2::before { content: "\f70d"; } -.bi-braces-asterisk::before { content: "\f70e"; } -.bi-calendar-heart-fill::before { content: "\f70f"; } -.bi-calendar-heart::before { content: "\f710"; } -.bi-calendar2-heart-fill::before { content: "\f711"; } -.bi-calendar2-heart::before { content: "\f712"; } -.bi-chat-heart-fill::before { content: "\f713"; } -.bi-chat-heart::before { content: "\f714"; } -.bi-chat-left-heart-fill::before { content: "\f715"; } -.bi-chat-left-heart::before { content: "\f716"; } -.bi-chat-right-heart-fill::before { content: "\f717"; } -.bi-chat-right-heart::before { content: "\f718"; } -.bi-chat-square-heart-fill::before { content: "\f719"; } -.bi-chat-square-heart::before { content: "\f71a"; } -.bi-clipboard-check-fill::before { content: "\f71b"; } -.bi-clipboard-data-fill::before { content: "\f71c"; } -.bi-clipboard-fill::before { content: "\f71d"; } -.bi-clipboard-heart-fill::before { content: "\f71e"; } -.bi-clipboard-heart::before { content: "\f71f"; } -.bi-clipboard-minus-fill::before { content: "\f720"; } -.bi-clipboard-plus-fill::before { content: "\f721"; } -.bi-clipboard-pulse::before { content: "\f722"; } -.bi-clipboard-x-fill::before { content: "\f723"; } -.bi-clipboard2-check-fill::before { content: "\f724"; } -.bi-clipboard2-check::before { content: "\f725"; } -.bi-clipboard2-data-fill::before { content: "\f726"; } -.bi-clipboard2-data::before { content: "\f727"; } -.bi-clipboard2-fill::before { content: "\f728"; } -.bi-clipboard2-heart-fill::before { content: "\f729"; } -.bi-clipboard2-heart::before { content: "\f72a"; } -.bi-clipboard2-minus-fill::before { content: "\f72b"; } -.bi-clipboard2-minus::before { content: "\f72c"; } -.bi-clipboard2-plus-fill::before { content: "\f72d"; } -.bi-clipboard2-plus::before { content: "\f72e"; } -.bi-clipboard2-pulse-fill::before { content: "\f72f"; } -.bi-clipboard2-pulse::before { content: "\f730"; } -.bi-clipboard2-x-fill::before { content: "\f731"; } -.bi-clipboard2-x::before { content: "\f732"; } -.bi-clipboard2::before { content: "\f733"; } -.bi-emoji-kiss-fill::before { content: "\f734"; } -.bi-emoji-kiss::before { content: "\f735"; } -.bi-envelope-heart-fill::before { content: "\f736"; } -.bi-envelope-heart::before { content: "\f737"; } -.bi-envelope-open-heart-fill::before { content: "\f738"; } -.bi-envelope-open-heart::before { content: "\f739"; } -.bi-envelope-paper-fill::before { content: "\f73a"; } -.bi-envelope-paper-heart-fill::before { content: "\f73b"; } -.bi-envelope-paper-heart::before { content: "\f73c"; } -.bi-envelope-paper::before { content: "\f73d"; } -.bi-filetype-aac::before { content: "\f73e"; } -.bi-filetype-ai::before { content: "\f73f"; } -.bi-filetype-bmp::before { content: "\f740"; } -.bi-filetype-cs::before { content: "\f741"; } -.bi-filetype-css::before { content: "\f742"; } -.bi-filetype-csv::before { content: "\f743"; } -.bi-filetype-doc::before { content: "\f744"; } -.bi-filetype-docx::before { content: "\f745"; } -.bi-filetype-exe::before { content: "\f746"; } -.bi-filetype-gif::before { content: "\f747"; } -.bi-filetype-heic::before { content: "\f748"; } -.bi-filetype-html::before { content: "\f749"; } -.bi-filetype-java::before { content: "\f74a"; } -.bi-filetype-jpg::before { content: "\f74b"; } -.bi-filetype-js::before { content: "\f74c"; } -.bi-filetype-jsx::before { content: "\f74d"; } -.bi-filetype-key::before { content: "\f74e"; } -.bi-filetype-m4p::before { content: "\f74f"; } -.bi-filetype-md::before { content: "\f750"; } -.bi-filetype-mdx::before { content: "\f751"; } -.bi-filetype-mov::before { content: "\f752"; } -.bi-filetype-mp3::before { content: "\f753"; } -.bi-filetype-mp4::before { content: "\f754"; } -.bi-filetype-otf::before { content: "\f755"; } -.bi-filetype-pdf::before { content: "\f756"; } -.bi-filetype-php::before { content: "\f757"; } -.bi-filetype-png::before { content: "\f758"; } -.bi-filetype-ppt::before { content: "\f75a"; } -.bi-filetype-psd::before { content: "\f75b"; } -.bi-filetype-py::before { content: "\f75c"; } -.bi-filetype-raw::before { content: "\f75d"; } -.bi-filetype-rb::before { content: "\f75e"; } -.bi-filetype-sass::before { content: "\f75f"; } -.bi-filetype-scss::before { content: "\f760"; } -.bi-filetype-sh::before { content: "\f761"; } -.bi-filetype-svg::before { content: "\f762"; } -.bi-filetype-tiff::before { content: "\f763"; } -.bi-filetype-tsx::before { content: "\f764"; } -.bi-filetype-ttf::before { content: "\f765"; } -.bi-filetype-txt::before { content: "\f766"; } -.bi-filetype-wav::before { content: "\f767"; } -.bi-filetype-woff::before { content: "\f768"; } -.bi-filetype-xls::before { content: "\f76a"; } -.bi-filetype-xml::before { content: "\f76b"; } -.bi-filetype-yml::before { content: "\f76c"; } -.bi-heart-arrow::before { content: "\f76d"; } -.bi-heart-pulse-fill::before { content: "\f76e"; } -.bi-heart-pulse::before { content: "\f76f"; } -.bi-heartbreak-fill::before { content: "\f770"; } -.bi-heartbreak::before { content: "\f771"; } -.bi-hearts::before { content: "\f772"; } -.bi-hospital-fill::before { content: "\f773"; } -.bi-hospital::before { content: "\f774"; } -.bi-house-heart-fill::before { content: "\f775"; } -.bi-house-heart::before { content: "\f776"; } -.bi-incognito::before { content: "\f777"; } -.bi-magnet-fill::before { content: "\f778"; } -.bi-magnet::before { content: "\f779"; } -.bi-person-heart::before { content: "\f77a"; } -.bi-person-hearts::before { content: "\f77b"; } -.bi-phone-flip::before { content: "\f77c"; } -.bi-plugin::before { content: "\f77d"; } -.bi-postage-fill::before { content: "\f77e"; } -.bi-postage-heart-fill::before { content: "\f77f"; } -.bi-postage-heart::before { content: "\f780"; } -.bi-postage::before { content: "\f781"; } -.bi-postcard-fill::before { content: "\f782"; } -.bi-postcard-heart-fill::before { content: "\f783"; } -.bi-postcard-heart::before { content: "\f784"; } -.bi-postcard::before { content: "\f785"; } -.bi-search-heart-fill::before { content: "\f786"; } -.bi-search-heart::before { content: "\f787"; } -.bi-sliders2-vertical::before { content: "\f788"; } -.bi-sliders2::before { content: "\f789"; } -.bi-trash3-fill::before { content: "\f78a"; } -.bi-trash3::before { content: "\f78b"; } -.bi-valentine::before { content: "\f78c"; } -.bi-valentine2::before { content: "\f78d"; } -.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } -.bi-wrench-adjustable-circle::before { content: "\f78f"; } -.bi-wrench-adjustable::before { content: "\f790"; } -.bi-filetype-json::before { content: "\f791"; } -.bi-filetype-pptx::before { content: "\f792"; } -.bi-filetype-xlsx::before { content: "\f793"; } -.bi-1-circle-fill::before { content: "\f796"; } -.bi-1-circle::before { content: "\f797"; } -.bi-1-square-fill::before { content: "\f798"; } -.bi-1-square::before { content: "\f799"; } -.bi-2-circle-fill::before { content: "\f79c"; } -.bi-2-circle::before { content: "\f79d"; } -.bi-2-square-fill::before { content: "\f79e"; } -.bi-2-square::before { content: "\f79f"; } -.bi-3-circle-fill::before { content: "\f7a2"; } -.bi-3-circle::before { content: "\f7a3"; } -.bi-3-square-fill::before { content: "\f7a4"; } -.bi-3-square::before { content: "\f7a5"; } -.bi-4-circle-fill::before { content: "\f7a8"; } -.bi-4-circle::before { content: "\f7a9"; } -.bi-4-square-fill::before { content: "\f7aa"; } -.bi-4-square::before { content: "\f7ab"; } -.bi-5-circle-fill::before { content: "\f7ae"; } -.bi-5-circle::before { content: "\f7af"; } -.bi-5-square-fill::before { content: "\f7b0"; } -.bi-5-square::before { content: "\f7b1"; } -.bi-6-circle-fill::before { content: "\f7b4"; } -.bi-6-circle::before { content: "\f7b5"; } -.bi-6-square-fill::before { content: "\f7b6"; } -.bi-6-square::before { content: "\f7b7"; } -.bi-7-circle-fill::before { content: "\f7ba"; } -.bi-7-circle::before { content: "\f7bb"; } -.bi-7-square-fill::before { content: "\f7bc"; } -.bi-7-square::before { content: "\f7bd"; } -.bi-8-circle-fill::before { content: "\f7c0"; } -.bi-8-circle::before { content: "\f7c1"; } -.bi-8-square-fill::before { content: "\f7c2"; } -.bi-8-square::before { content: "\f7c3"; } -.bi-9-circle-fill::before { content: "\f7c6"; } -.bi-9-circle::before { content: "\f7c7"; } -.bi-9-square-fill::before { content: "\f7c8"; } -.bi-9-square::before { content: "\f7c9"; } -.bi-airplane-engines-fill::before { content: "\f7ca"; } -.bi-airplane-engines::before { content: "\f7cb"; } -.bi-airplane-fill::before { content: "\f7cc"; } -.bi-airplane::before { content: "\f7cd"; } -.bi-alexa::before { content: "\f7ce"; } -.bi-alipay::before { content: "\f7cf"; } -.bi-android::before { content: "\f7d0"; } -.bi-android2::before { content: "\f7d1"; } -.bi-box-fill::before { content: "\f7d2"; } -.bi-box-seam-fill::before { content: "\f7d3"; } -.bi-browser-chrome::before { content: "\f7d4"; } -.bi-browser-edge::before { content: "\f7d5"; } -.bi-browser-firefox::before { content: "\f7d6"; } -.bi-browser-safari::before { content: "\f7d7"; } -.bi-c-circle-fill::before { content: "\f7da"; } -.bi-c-circle::before { content: "\f7db"; } -.bi-c-square-fill::before { content: "\f7dc"; } -.bi-c-square::before { content: "\f7dd"; } -.bi-capsule-pill::before { content: "\f7de"; } -.bi-capsule::before { content: "\f7df"; } -.bi-car-front-fill::before { content: "\f7e0"; } -.bi-car-front::before { content: "\f7e1"; } -.bi-cassette-fill::before { content: "\f7e2"; } -.bi-cassette::before { content: "\f7e3"; } -.bi-cc-circle-fill::before { content: "\f7e6"; } -.bi-cc-circle::before { content: "\f7e7"; } -.bi-cc-square-fill::before { content: "\f7e8"; } -.bi-cc-square::before { content: "\f7e9"; } -.bi-cup-hot-fill::before { content: "\f7ea"; } -.bi-cup-hot::before { content: "\f7eb"; } -.bi-currency-rupee::before { content: "\f7ec"; } -.bi-dropbox::before { content: "\f7ed"; } -.bi-escape::before { content: "\f7ee"; } -.bi-fast-forward-btn-fill::before { content: "\f7ef"; } -.bi-fast-forward-btn::before { content: "\f7f0"; } -.bi-fast-forward-circle-fill::before { content: "\f7f1"; } -.bi-fast-forward-circle::before { content: "\f7f2"; } -.bi-fast-forward-fill::before { content: "\f7f3"; } -.bi-fast-forward::before { content: "\f7f4"; } -.bi-filetype-sql::before { content: "\f7f5"; } -.bi-fire::before { content: "\f7f6"; } -.bi-google-play::before { content: "\f7f7"; } -.bi-h-circle-fill::before { content: "\f7fa"; } -.bi-h-circle::before { content: "\f7fb"; } -.bi-h-square-fill::before { content: "\f7fc"; } -.bi-h-square::before { content: "\f7fd"; } -.bi-indent::before { content: "\f7fe"; } -.bi-lungs-fill::before { content: "\f7ff"; } -.bi-lungs::before { content: "\f800"; } -.bi-microsoft-teams::before { content: "\f801"; } -.bi-p-circle-fill::before { content: "\f804"; } -.bi-p-circle::before { content: "\f805"; } -.bi-p-square-fill::before { content: "\f806"; } -.bi-p-square::before { content: "\f807"; } -.bi-pass-fill::before { content: "\f808"; } -.bi-pass::before { content: "\f809"; } -.bi-prescription::before { content: "\f80a"; } -.bi-prescription2::before { content: "\f80b"; } -.bi-r-circle-fill::before { content: "\f80e"; } -.bi-r-circle::before { content: "\f80f"; } -.bi-r-square-fill::before { content: "\f810"; } -.bi-r-square::before { content: "\f811"; } -.bi-repeat-1::before { content: "\f812"; } -.bi-repeat::before { content: "\f813"; } -.bi-rewind-btn-fill::before { content: "\f814"; } -.bi-rewind-btn::before { content: "\f815"; } -.bi-rewind-circle-fill::before { content: "\f816"; } -.bi-rewind-circle::before { content: "\f817"; } -.bi-rewind-fill::before { content: "\f818"; } -.bi-rewind::before { content: "\f819"; } -.bi-train-freight-front-fill::before { content: "\f81a"; } -.bi-train-freight-front::before { content: "\f81b"; } -.bi-train-front-fill::before { content: "\f81c"; } -.bi-train-front::before { content: "\f81d"; } -.bi-train-lightrail-front-fill::before { content: "\f81e"; } -.bi-train-lightrail-front::before { content: "\f81f"; } -.bi-truck-front-fill::before { content: "\f820"; } -.bi-truck-front::before { content: "\f821"; } -.bi-ubuntu::before { content: "\f822"; } -.bi-unindent::before { content: "\f823"; } -.bi-unity::before { content: "\f824"; } -.bi-universal-access-circle::before { content: "\f825"; } -.bi-universal-access::before { content: "\f826"; } -.bi-virus::before { content: "\f827"; } -.bi-virus2::before { content: "\f828"; } -.bi-wechat::before { content: "\f829"; } -.bi-yelp::before { content: "\f82a"; } -.bi-sign-stop-fill::before { content: "\f82b"; } -.bi-sign-stop-lights-fill::before { content: "\f82c"; } -.bi-sign-stop-lights::before { content: "\f82d"; } -.bi-sign-stop::before { content: "\f82e"; } -.bi-sign-turn-left-fill::before { content: "\f82f"; } -.bi-sign-turn-left::before { content: "\f830"; } -.bi-sign-turn-right-fill::before { content: "\f831"; } -.bi-sign-turn-right::before { content: "\f832"; } -.bi-sign-turn-slight-left-fill::before { content: "\f833"; } -.bi-sign-turn-slight-left::before { content: "\f834"; } -.bi-sign-turn-slight-right-fill::before { content: "\f835"; } -.bi-sign-turn-slight-right::before { content: "\f836"; } -.bi-sign-yield-fill::before { content: "\f837"; } -.bi-sign-yield::before { content: "\f838"; } -.bi-ev-station-fill::before { content: "\f839"; } -.bi-ev-station::before { content: "\f83a"; } -.bi-fuel-pump-diesel-fill::before { content: "\f83b"; } -.bi-fuel-pump-diesel::before { content: "\f83c"; } -.bi-fuel-pump-fill::before { content: "\f83d"; } -.bi-fuel-pump::before { content: "\f83e"; } -.bi-0-circle-fill::before { content: "\f83f"; } -.bi-0-circle::before { content: "\f840"; } -.bi-0-square-fill::before { content: "\f841"; } -.bi-0-square::before { content: "\f842"; } -.bi-rocket-fill::before { content: "\f843"; } -.bi-rocket-takeoff-fill::before { content: "\f844"; } -.bi-rocket-takeoff::before { content: "\f845"; } -.bi-rocket::before { content: "\f846"; } -.bi-stripe::before { content: "\f847"; } -.bi-subscript::before { content: "\f848"; } -.bi-superscript::before { content: "\f849"; } -.bi-trello::before { content: "\f84a"; } -.bi-envelope-at-fill::before { content: "\f84b"; } -.bi-envelope-at::before { content: "\f84c"; } -.bi-regex::before { content: "\f84d"; } -.bi-text-wrap::before { content: "\f84e"; } -.bi-sign-dead-end-fill::before { content: "\f84f"; } -.bi-sign-dead-end::before { content: "\f850"; } -.bi-sign-do-not-enter-fill::before { content: "\f851"; } -.bi-sign-do-not-enter::before { content: "\f852"; } -.bi-sign-intersection-fill::before { content: "\f853"; } -.bi-sign-intersection-side-fill::before { content: "\f854"; } -.bi-sign-intersection-side::before { content: "\f855"; } -.bi-sign-intersection-t-fill::before { content: "\f856"; } -.bi-sign-intersection-t::before { content: "\f857"; } -.bi-sign-intersection-y-fill::before { content: "\f858"; } -.bi-sign-intersection-y::before { content: "\f859"; } -.bi-sign-intersection::before { content: "\f85a"; } -.bi-sign-merge-left-fill::before { content: "\f85b"; } -.bi-sign-merge-left::before { content: "\f85c"; } -.bi-sign-merge-right-fill::before { content: "\f85d"; } -.bi-sign-merge-right::before { content: "\f85e"; } -.bi-sign-no-left-turn-fill::before { content: "\f85f"; } -.bi-sign-no-left-turn::before { content: "\f860"; } -.bi-sign-no-parking-fill::before { content: "\f861"; } -.bi-sign-no-parking::before { content: "\f862"; } -.bi-sign-no-right-turn-fill::before { content: "\f863"; } -.bi-sign-no-right-turn::before { content: "\f864"; } -.bi-sign-railroad-fill::before { content: "\f865"; } -.bi-sign-railroad::before { content: "\f866"; } -.bi-building-add::before { content: "\f867"; } -.bi-building-check::before { content: "\f868"; } -.bi-building-dash::before { content: "\f869"; } -.bi-building-down::before { content: "\f86a"; } -.bi-building-exclamation::before { content: "\f86b"; } -.bi-building-fill-add::before { content: "\f86c"; } -.bi-building-fill-check::before { content: "\f86d"; } -.bi-building-fill-dash::before { content: "\f86e"; } -.bi-building-fill-down::before { content: "\f86f"; } -.bi-building-fill-exclamation::before { content: "\f870"; } -.bi-building-fill-gear::before { content: "\f871"; } -.bi-building-fill-lock::before { content: "\f872"; } -.bi-building-fill-slash::before { content: "\f873"; } -.bi-building-fill-up::before { content: "\f874"; } -.bi-building-fill-x::before { content: "\f875"; } -.bi-building-fill::before { content: "\f876"; } -.bi-building-gear::before { content: "\f877"; } -.bi-building-lock::before { content: "\f878"; } -.bi-building-slash::before { content: "\f879"; } -.bi-building-up::before { content: "\f87a"; } -.bi-building-x::before { content: "\f87b"; } -.bi-buildings-fill::before { content: "\f87c"; } -.bi-buildings::before { content: "\f87d"; } -.bi-bus-front-fill::before { content: "\f87e"; } -.bi-bus-front::before { content: "\f87f"; } -.bi-ev-front-fill::before { content: "\f880"; } -.bi-ev-front::before { content: "\f881"; } -.bi-globe-americas::before { content: "\f882"; } -.bi-globe-asia-australia::before { content: "\f883"; } -.bi-globe-central-south-asia::before { content: "\f884"; } -.bi-globe-europe-africa::before { content: "\f885"; } -.bi-house-add-fill::before { content: "\f886"; } -.bi-house-add::before { content: "\f887"; } -.bi-house-check-fill::before { content: "\f888"; } -.bi-house-check::before { content: "\f889"; } -.bi-house-dash-fill::before { content: "\f88a"; } -.bi-house-dash::before { content: "\f88b"; } -.bi-house-down-fill::before { content: "\f88c"; } -.bi-house-down::before { content: "\f88d"; } -.bi-house-exclamation-fill::before { content: "\f88e"; } -.bi-house-exclamation::before { content: "\f88f"; } -.bi-house-gear-fill::before { content: "\f890"; } -.bi-house-gear::before { content: "\f891"; } -.bi-house-lock-fill::before { content: "\f892"; } -.bi-house-lock::before { content: "\f893"; } -.bi-house-slash-fill::before { content: "\f894"; } -.bi-house-slash::before { content: "\f895"; } -.bi-house-up-fill::before { content: "\f896"; } -.bi-house-up::before { content: "\f897"; } -.bi-house-x-fill::before { content: "\f898"; } -.bi-house-x::before { content: "\f899"; } -.bi-person-add::before { content: "\f89a"; } -.bi-person-down::before { content: "\f89b"; } -.bi-person-exclamation::before { content: "\f89c"; } -.bi-person-fill-add::before { content: "\f89d"; } -.bi-person-fill-check::before { content: "\f89e"; } -.bi-person-fill-dash::before { content: "\f89f"; } -.bi-person-fill-down::before { content: "\f8a0"; } -.bi-person-fill-exclamation::before { content: "\f8a1"; } -.bi-person-fill-gear::before { content: "\f8a2"; } -.bi-person-fill-lock::before { content: "\f8a3"; } -.bi-person-fill-slash::before { content: "\f8a4"; } -.bi-person-fill-up::before { content: "\f8a5"; } -.bi-person-fill-x::before { content: "\f8a6"; } -.bi-person-gear::before { content: "\f8a7"; } -.bi-person-lock::before { content: "\f8a8"; } -.bi-person-slash::before { content: "\f8a9"; } -.bi-person-up::before { content: "\f8aa"; } -.bi-scooter::before { content: "\f8ab"; } -.bi-taxi-front-fill::before { content: "\f8ac"; } -.bi-taxi-front::before { content: "\f8ad"; } -.bi-amd::before { content: "\f8ae"; } -.bi-database-add::before { content: "\f8af"; } -.bi-database-check::before { content: "\f8b0"; } -.bi-database-dash::before { content: "\f8b1"; } -.bi-database-down::before { content: "\f8b2"; } -.bi-database-exclamation::before { content: "\f8b3"; } -.bi-database-fill-add::before { content: "\f8b4"; } -.bi-database-fill-check::before { content: "\f8b5"; } -.bi-database-fill-dash::before { content: "\f8b6"; } -.bi-database-fill-down::before { content: "\f8b7"; } -.bi-database-fill-exclamation::before { content: "\f8b8"; } -.bi-database-fill-gear::before { content: "\f8b9"; } -.bi-database-fill-lock::before { content: "\f8ba"; } -.bi-database-fill-slash::before { content: "\f8bb"; } -.bi-database-fill-up::before { content: "\f8bc"; } -.bi-database-fill-x::before { content: "\f8bd"; } -.bi-database-fill::before { content: "\f8be"; } -.bi-database-gear::before { content: "\f8bf"; } -.bi-database-lock::before { content: "\f8c0"; } -.bi-database-slash::before { content: "\f8c1"; } -.bi-database-up::before { content: "\f8c2"; } -.bi-database-x::before { content: "\f8c3"; } -.bi-database::before { content: "\f8c4"; } -.bi-houses-fill::before { content: "\f8c5"; } -.bi-houses::before { content: "\f8c6"; } -.bi-nvidia::before { content: "\f8c7"; } -.bi-person-vcard-fill::before { content: "\f8c8"; } -.bi-person-vcard::before { content: "\f8c9"; } -.bi-sina-weibo::before { content: "\f8ca"; } -.bi-tencent-qq::before { content: "\f8cb"; } -.bi-wikipedia::before { content: "\f8cc"; } -.bi-alphabet-uppercase::before { content: "\f2a5"; } -.bi-alphabet::before { content: "\f68a"; } -.bi-amazon::before { content: "\f68d"; } -.bi-arrows-collapse-vertical::before { content: "\f690"; } -.bi-arrows-expand-vertical::before { content: "\f695"; } -.bi-arrows-vertical::before { content: "\f698"; } -.bi-arrows::before { content: "\f6a2"; } -.bi-ban-fill::before { content: "\f6a3"; } -.bi-ban::before { content: "\f6b6"; } -.bi-bing::before { content: "\f6c2"; } -.bi-cake::before { content: "\f6e0"; } -.bi-cake2::before { content: "\f6ed"; } -.bi-cookie::before { content: "\f6ee"; } -.bi-copy::before { content: "\f759"; } -.bi-crosshair::before { content: "\f769"; } -.bi-crosshair2::before { content: "\f794"; } -.bi-emoji-astonished-fill::before { content: "\f795"; } -.bi-emoji-astonished::before { content: "\f79a"; } -.bi-emoji-grimace-fill::before { content: "\f79b"; } -.bi-emoji-grimace::before { content: "\f7a0"; } -.bi-emoji-grin-fill::before { content: "\f7a1"; } -.bi-emoji-grin::before { content: "\f7a6"; } -.bi-emoji-surprise-fill::before { content: "\f7a7"; } -.bi-emoji-surprise::before { content: "\f7ac"; } -.bi-emoji-tear-fill::before { content: "\f7ad"; } -.bi-emoji-tear::before { content: "\f7b2"; } -.bi-envelope-arrow-down-fill::before { content: "\f7b3"; } -.bi-envelope-arrow-down::before { content: "\f7b8"; } -.bi-envelope-arrow-up-fill::before { content: "\f7b9"; } -.bi-envelope-arrow-up::before { content: "\f7be"; } -.bi-feather::before { content: "\f7bf"; } -.bi-feather2::before { content: "\f7c4"; } -.bi-floppy-fill::before { content: "\f7c5"; } -.bi-floppy::before { content: "\f7d8"; } -.bi-floppy2-fill::before { content: "\f7d9"; } -.bi-floppy2::before { content: "\f7e4"; } -.bi-gitlab::before { content: "\f7e5"; } -.bi-highlighter::before { content: "\f7f8"; } -.bi-marker-tip::before { content: "\f802"; } -.bi-nvme-fill::before { content: "\f803"; } -.bi-nvme::before { content: "\f80c"; } -.bi-opencollective::before { content: "\f80d"; } -.bi-pci-card-network::before { content: "\f8cd"; } -.bi-pci-card-sound::before { content: "\f8ce"; } -.bi-radar::before { content: "\f8cf"; } -.bi-send-arrow-down-fill::before { content: "\f8d0"; } -.bi-send-arrow-down::before { content: "\f8d1"; } -.bi-send-arrow-up-fill::before { content: "\f8d2"; } -.bi-send-arrow-up::before { content: "\f8d3"; } -.bi-sim-slash-fill::before { content: "\f8d4"; } -.bi-sim-slash::before { content: "\f8d5"; } -.bi-sourceforge::before { content: "\f8d6"; } -.bi-substack::before { content: "\f8d7"; } -.bi-threads-fill::before { content: "\f8d8"; } -.bi-threads::before { content: "\f8d9"; } -.bi-transparency::before { content: "\f8da"; } -.bi-twitter-x::before { content: "\f8db"; } -.bi-type-h4::before { content: "\f8dc"; } -.bi-type-h5::before { content: "\f8dd"; } -.bi-type-h6::before { content: "\f8de"; } -.bi-backpack-fill::before { content: "\f8df"; } -.bi-backpack::before { content: "\f8e0"; } -.bi-backpack2-fill::before { content: "\f8e1"; } -.bi-backpack2::before { content: "\f8e2"; } -.bi-backpack3-fill::before { content: "\f8e3"; } -.bi-backpack3::before { content: "\f8e4"; } -.bi-backpack4-fill::before { content: "\f8e5"; } -.bi-backpack4::before { content: "\f8e6"; } -.bi-brilliance::before { content: "\f8e7"; } -.bi-cake-fill::before { content: "\f8e8"; } -.bi-cake2-fill::before { content: "\f8e9"; } -.bi-duffle-fill::before { content: "\f8ea"; } -.bi-duffle::before { content: "\f8eb"; } -.bi-exposure::before { content: "\f8ec"; } -.bi-gender-neuter::before { content: "\f8ed"; } -.bi-highlights::before { content: "\f8ee"; } -.bi-luggage-fill::before { content: "\f8ef"; } -.bi-luggage::before { content: "\f8f0"; } -.bi-mailbox-flag::before { content: "\f8f1"; } -.bi-mailbox2-flag::before { content: "\f8f2"; } -.bi-noise-reduction::before { content: "\f8f3"; } -.bi-passport-fill::before { content: "\f8f4"; } -.bi-passport::before { content: "\f8f5"; } -.bi-person-arms-up::before { content: "\f8f6"; } -.bi-person-raised-hand::before { content: "\f8f7"; } -.bi-person-standing-dress::before { content: "\f8f8"; } -.bi-person-standing::before { content: "\f8f9"; } -.bi-person-walking::before { content: "\f8fa"; } -.bi-person-wheelchair::before { content: "\f8fb"; } -.bi-shadows::before { content: "\f8fc"; } -.bi-suitcase-fill::before { content: "\f8fd"; } -.bi-suitcase-lg-fill::before { content: "\f8fe"; } -.bi-suitcase-lg::before { content: "\f8ff"; } -.bi-suitcase::before { content: "\f900"; } -.bi-suitcase2-fill::before { content: "\f901"; } -.bi-suitcase2::before { content: "\f902"; } -.bi-vignette::before { content: "\f903"; } diff --git a/docs/validmind_files/libs/bootstrap/bootstrap-icons.woff b/docs/validmind_files/libs/bootstrap/bootstrap-icons.woff deleted file mode 100644 index dbeeb055674125ad78fda0f3d166b36e5cc92336..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176200 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

2+UrCZlNAp`)&G@jg{m-!Dn; zhYym7;-O&8glg>dkFUeu$1lk8mPmg_)x|9l{&e+csF?1#Jg9$uQ2X9BKRmV8)xB#h zw(pR|(=DVs6k|HjCDA+#o^ViggRb^OQ-hAv6nm=Pz4(HDJ~&TS=uM*ZEC#$h zD~UJJdsNkC10`vw?1Pg_r`@c4Iur>!QrC^=byk}`luLEA>K$ALygicMHP3^+!f499 zF{5$E6CsP50M;x4_;!b?y>S?}pT6<@V>d1Xe7m~e@JsLmA5RQJ7Q*l`eER7;252Ss zLkb}(rIfL0AQUd|#LT3fWImejLk+w_3|taFc;hkJH1PYq0pj z6}GN&-0Kf@vI-NvNRCAu0?O%%yIk74Nw3pS`fH?z>AOJwl71(X#g8b;4a(JckgvH$ zh7Y{h-0T{go5AL$(cRqC;l${6yN`9d|7({V6vahJy}2zZx2w{kD7M?|#_fvKzFCzX zXfzt$%vFuXRWlx(`d2lM9&KE8bE7fy3;ga;p_n6l9&7;IHKUi>R6U+&LrwER#Ow~+ z_ApAdf4be~R=1bgiV=@J!$nYibP4p)0|scLn}BwrsBYN`jbl`haZDB4`m3=!Z<@7d z4j!DbXM^nIYiD#+(sM+j=NA(*?lL79QrmpDUL7Z znXU68V7ZvWj;psg?7um7=W<~$#1rlnhk~oSGOue64_KSgcXx(T;HtX&hAyy*DWvL3q+q~gQ?dqE*4`At3rkCbauQ5 z#bAgx3P{q=6I&%Q4?0H808cnn>F(({SeeaNHWeHxWA zrBW^5dt3OUG{zWr5>$yLC zbdBx9h({r(Zl}0SS~9d}+K>bmFVaPOd=O2G7s+5L9})vE&}$f%F0i!4?6AXSQXUh{ z=Le_12eQdzQlg&~@u=eU=OrrD(9cnoJ`dxVDw92t$J4UX-!rkWvqKfWcBBwoNmvt? zhbzRU0M}?UrF7I_^noiDj|r!Rmq0&uPIw27+p?6UJU)7XC3orn(~uOShgaw4lL7jr z7n!nWvHaEfaKO6@FE)YUM^DGXl_5 z2_}a_-%k2j5X5VE0~~6Uf6Q_CW!@-1#y{S}+vdmlM?v1cXXr~WE0(u2^c`uaJRy}U z%J$F9a6ST7_-Ww|o{M0jT)hbBj|)xX%BV0d8(+9WVhsE>7LISbIlF=N9YDLA(tzFW z0x1fK#Q$aU*a5a1zyY=;z=31ULPBu3@@Jd)pgHR|kEP>zTt`GOgIpUZenvP8)Mm?o z7?n`J_Zi(BGI|RR3FZSp((<%2oBWo_{V$ju1McBeE8a_eGppoCP$~u32%;p3puM#m z({!-EL_1s5)CVPgicNw&ItUG@Q7U1oXo-FIhr>o$c3mK(?R_geym>fe`_uG~^>MqL zgHEU8pqs{CXfN23q8SoD#YW7ZLE~$jInzKO(yu@0MpDqINUy^t{5q*Lkv1=R(P@+Q zpx-@BHsiS{nu}j7a^U7ib1~l&IQ1*9K`Sk@wP-BAJ?(F`JKb18iNu|GF^!O#bdcFe zvrQe6u7sK)WM$!a>wv5p4=NYGx_I4ERi(aXYOl7=o{o23a=rH>mgxq4FOKJ+(%sh8 z%gTG5h7p8|*DpOF6Pe2Ts~fe`twp-ANEBM#M!@Ex94=hndP=ySWzXWtIlAi`Cs;-- z^ZK(0qhiV=OnC&{!WsUpZqn|o12=G4Tyl85&o&muWPvO_0VXc#ZT8^N zdW`v&;x9;w5gJA~A1b0k!kbstZuOi)n+Ge3LVlUJ{?&^b6@AOm%|>JyR5NT(r^#~d zD~c+KVtLUK6$$6MYlrKx66&_->;5~TU(iHSnh!l!H^k;rf5nfI#hPL(jRW%s4#|>C zOg}hu=zu{KqA64&!OSm+A|d)*Bq>CaXtG$ArTApU) zm?W->#|e4}K?F|{q!wVS&WeB=YE8u0Wf`MzrEm-{G17F_w-TI}U!ZFu5C?NL93h+> zSVH^1QD1Rnu)?ps`FN8MQE^p=DuhTbbiuMied>VNYN`Stdln{kF=~OQ8H%o`C076| zK-9l)hKfe1B*Ji8G3-zjWxeF6CYAqIj;v-|X&srNi>F$|FpP3ZcT|xYj^Z1EFWIUl zOCZS#RAZN+2qF{LJ{THQmPFGp0j)9VpBtE%eJb&E*GrH#<$^tkGQAF?KaBExweXPe zgTniSj|xu;|3dgx;kUr*{S)Co3jay?Z^R^JasV^<6}q6Xu$A7xtl5Y=TSy&;pqy_TPdon(fs4nx_)OitN(VM1Uu?+UIo=0hB`f6~#;7R3<{PfP8PJ|F(Dm1muVSH*I` z=BJ&3lf1o|6fY1W<|^Gnc=#D*PUIM!sO^4xaE_IVTQj07s_jlP1Od;r!z{HWE3{jvT)gkr7kmA4hU>O7i)PnzHl@Bqbmoe;Y3( zMS|0V87f5ly9^T|{yqT$$c!ML6Y(hF^;=U66!}zs#=e;n@#@0)BT($?Pb2>9gDemU zsD^D3j(-bBMom%7^7^A~(}vF(OyS9Mz~FCZRRYa|x@im7*W(^HTN`8v3XE=D2rGb( zs@si*Vo*t@It=p^t3+kPp1FTnR0;e`hu?f4)OF2-K8^yWD%EA#v~@Kg#45Y3d#Yl= z*Nrf23D*fX;9l*Q1Pg6<7AVW27PBO?ENKm#;TK(Ty}y2`z&-~WkYa8?-K~-@!IP$5`Sf#j`L+Wd7XYRmk(~hV)9KiTDX3sIvax-MXx(V~?PX#T`;tz+S7` z3qi18S7Cgh1g?8)_*tpCREDqO>+p7{;+l4gC$j@OJ^k4b?z1a+2xSGn#ov|H@=|rM zf7$`z`-Stu+k|)H90&9fV3+op<^~g~%Y2?&MOSpuC5;5Zzz04E&7AE;mvqrd%_*I9 zH`&T)%(sa12T+5!$#SUyhwhXpBbJ&Ha4Nmn?oHE3hE$iORwHP%Y%97dvTRgAGEgl@ zDH)QfwBa%}ovtD9K%$TAG?wMvU3s~&6M7A!R5BWv6v#~N2pp>|g7n=bJRrPTcwG3H z@N>ei2){jIE%c*lIcoA~oQ$4LpKmS_H76u=?T%k#5Nm!-i_gIVp74Hy?Eij}rCtAK zkPaIC*;0_uLocX% zK2HIF@#|T}L3S^N)1S z#n%#G0WF4)B;(Ie4EQ5?%||`P#ugac2hFUpk?q;_5#wF6Xs~yVh4&a6ua9RJ9q%qP zv^L`2_s^GAnbp;8A$7ffz85zlZrq5taU*Dw+Bm(Zz$UzoyOnz@_W<{C?latZ?)TI5 zR#3h3GkKw=^bI!v2dBcAvZ4L|tc@LZ1DXpyeEQCHG414cuAogWS(@PjJ7*{Q<2a zKtgw_7sZ@oP+6GWPx#58YlUV2Gy%UR`g&@-`lpwNzULyB;(b#XKV`1cCss{#Urq5C z0djfhZHDw_m8I6X+d|<=mxq?8BEBwzo=21J!N>fv-+DsldNp?^==>k%exCauxUX=3v=fc1g)YLx;uIiC zUuKnQC~G(oUGWhwb>2_2h7-}*zn@@@^zWTCZ;YaFra{CN+iG1OlS-B#g!B_jo+O?y)E{IpMeO)Q$OSQG&?44Y zj((e<_Y`-Mdo6bcte1~+pN3xjdn0RHFKHrYD_obG!kJpv<)v?hI}z*AzXm;e1dZz@ zP1>}=b-9Te*San*E$6tKxDD<;?x(q*;eLhtGOh|APvd$?({-4_b$RGJn$~sc=^g3V zdt=t{C%DgYUj%FE-^VnrmmV=kR=6$?NuSwT>$>E$+*;`h&72^>sMq&`%$)7Z$rwLHbe$)}kOWB=1)djW z9$ACO$~uCm!)1dIUe|HMo*{xL3mASR$n=C>=J(PRpG9(+_-S$g0J5Wo^e{hcv1t0T z25YHRK<{7UuH|0Gy~X#veHk^ukOQ%(nD;Nra86{{(GOz0Idh1otEFL~9mY*L=zF{- z&0Yc)sztA88LBhmVy)zL)mT%FmcjVp=M2fJ7bR_%xj+kzI_Xx`unVqRu>B&d8$?%a zTcs+4L1Pt`>AD^xOADND<$15KxJP-6FyS$d;iaqq5-~qp5wx4G%r!jm4zt;)YI?OX zJE5u{zl@UOt(s7o&3CTUMX%AwXo9h6WT2mk1$ts^8^vCmdRhxz>}FSgOKa5;zma}j?@ zCM_&#qJj@wJ~+NiqxojUVYk!o@&oWh^v89))ffjnNIBr&(e*V>k*>-L5-VUT>LSuF zs#1`dN3Gw9PB1mc!1IawtG!gU%yyS8;9*Z^JTUM9prx)JVj1h#5XI+Xbc>VL4$1YN zIAz0JYn=$SSVqmNPdqN01^=GxaADbYOILniI7~i7!kvZc6=}nUs6ljaK2tY z=r{ix?jK*`Uh_+&+Fx=f`<0hOtH1QV`CV7*V|sm@|K86%%KZ}e6wL)Y2LBCo>ootR z<;K>(2f2|RCsH36Nwv@BrrOR12oNJIG6j2ZPUHT##K#Mw@@ zzvPl*Ypwor%(RX$w?3X`{}LqgOJQz(1g-uukUOGv*1Y;RU*h_~cxwG6C+YgA8vUgw z>?kU|5$f|%-sGsK|7I-P(J;OJQjfp=6hrtj160wOQm_t{|%e- z_BzYs+A5XkW(|(#=?-s`rX=y}f^>L}h$5u}OImRY%^zMWJ&V6#zou!B*YM37HhTvk zqa5O+&Na9LppUF^SHSpn6?ZLn1B_y)xYu#72M)iRdkc3j@cFyo>5!L#0_j10b*wGl zD-cXv9oA_t7D#{zf8WnI4>9Ba#g8!yF>yqiN(0by9*+38Nt@#18ylq-U0&RJ_%ub> zJl(F-*0$&tvFKlzj~xKs76d7tDRJoYQi0VmygBMA@*#BJj7!O ziNHnq8p5^otH4WGAC2qBSE?pg>L%`hs<%Y)e4WP}EL*MX#TBc~E3U=OT(qWWZ*{Rs z!@*%c-Kmr5&e0B7eVyrnrMw4N6*Aj@2W;$UJG;9AQ|2Nx|@HU56@Eqkb3+V{FW zvZUO)e-F}n&uw(K?=HhK;NK?Oog;>d*^F^>UNue_Ww{k`OiQuh5~}wT)&vi|5O#*z z5JiG9_(asTJRFKBNyYHsoT}^aZZ+7!XTS{910F&=Vor%EZUv;#d$^C&oD!*Wc+l(r~po6P>HWJ9W z-$#t0+DRNPEbNgLNoM$!_uiVsKafY0Lh{I}e(u0NJ?AH(Gxhx&h!O*=C5jpyjx36! zvxB&_MWX4Fq-#Xn7@))aAidl4Y`0p# zY-JSENr%rBVmQK@c|m5Pn1-Tk30KPkGx&R0J@xIGppZq^`fDsZ`h3CN$Oa(F2{#4b zKN4m`9P-6rV$iU99s+ET^p|jV(r9U#;Hk}n*7Volc$CKkX{VkY{ZZG!K3R_6u?>=G}0uh%j z*DknB^>M8dbUl&3O_7W#L(0>wQqZM>q}S=Tuo4}|wz6K;{Ktc>R@KQ=p&%OKUe{W4 z3+veG^@0n?*ee=ul635gx@7CJtmEIUl4KaspHfu>EjrZ%rOI*fJbQE8%V5;Jhx;(# zO_7n5vD{OBianNl3N}YcJ5-#vz@Nj^Ym{V4HYyQu&TMx8p__)tBPvUl%bdO{ z@X?{`LXY6$cc2w676tUSX_C1f{AL;*(knf*diuSY#u5haFoWQ@l_T_$eaT0x!eELfI@7OlRRe z3l1KX1yR#wUO28+49O4`ebOY7DG_s0S46l{QB5%?86My|FY!Pj9`=gr8B$L08UJ>| zzfLp?uj9$>a7Hf$`!|v|z(4=&O{@GNULZu^j~rq9L;NZ(59SFGTau#Z&gFDPHVoN6 zlv*OeyTZ)0E=mF~$~v#&P^a>`Eb@XRYSTqY5F|lE)q*GrY$RC|@EWdT^yzyQ_crd6 z-0uWE2uU$Ta~dE|_pt|I3W#ntl}oxNl(2i0 z_Pk>cJ^1J0RLvPB_)5tLpB}~;taq;P@*w48ekEXmWr5!p9Piy59PQ(UW!T+X;z?B` zO)^j5Uy~QAgfB@lC?>Lq{S*`wdA>Z9#wA-3O;cQ46GR!sfGi4!hHy$W=ZJN}XTYY5 zypcc0{c6HHvL5*+SZQ}Qn(OoU9By6_IwoS%mB<(tEPzjAKupiToPNl86b- za1;886{<_c>ux;+{q_m&xBW`$kx>m6VamTZtR9!|Kicm6BI|nrx1=3XRQ;jF!!bvW zPq|F8Wgo`ePFb5nSwEFXTuHMd6>>QsAagO&$LB+*QFL@}#Jl#IPdnHo^>xgVxr)81 z73wLoL7Gl_#p}-cjNVqF6m8VuiZSS*S)lHVYezPpzwj4SNq)m29v#`TBDerFr~}eUP8U4)rYx_WIY6 zPG1jeSR?KlG_U!MTjDPWI*uU{_^nf?F%k#!L9ubCETc0G#;jgHjo3G7IkS{AKjP!} z1NkD!5nVGt`0F{loS!dWn=^7|E(6oQVLGPi8rM*Sw=5VXTw75~b$g{c_2#=@D{DDb ziR-T_$lAT2!JfkGyG>B6VBqXCSXXJH1TPNPYR`BHg4U$&tE zFoJ11*_SJs@bBSaM0(ZTikeg9*HmgiHmaTpiRlf(@Z#KyR%&%mJ`X(VzprW zG+9i4>%5PX6fF*pNQ*@N_+gYt=8YdpjSnU=)<^JQ#+iN+p18UdK&2p5EV)(|RKCxK z0=7nEI@X@c1`H8nJsSe|btJ@xwbE3n>^NoErEs-8D&N*gu&`|yroO(8OUc%OHHKp8 zcA6TO#o|RgYtq_^Tq3R57z}$x7K1O(4`W!Iu2g0DYuj+E62r|DP_6@G_ba%!Z-t|2 z(qz$DY<*5QhO=hB<2BoKe(9j^7XwqBPW^hUn$W?7y9^Vc<51L2W0)`03;)irb-k>2 zePsXlTr)S9*XJL~35I4CawSclNAIj)D*0kDuYm1l+BJ)0km8~J`xlIS&Xml2-n@#^ zW%=&A>&rKSA(P9k9m{+OwAB-`xG5C3#(?EBtnRxX$D|W|MV~>d0oAJ_uZ!!7u993V3#|&yaIy({N=3t zx-KbpQ7$4bH2s#mDI)U3T<+(#m4C_pc5KA{=J*{hV`2EP{`c4v_5#cg%T`B8Td1t> zt&!MsGET82`(%wff|^C&r$HPPIRIr0LT!pt8oE~wBg6R!CUFW&e8CU4(PjA)rrLVGf*52A+J|EeEvqWGxnkB+(X zhI;z6YHY3}Fzd@hk%j?vb)#TByB$Ny34ZKwFXwK?+@w3vUXrHhYAfX)sadi3myMXE zO(L(x()Nm&onb=9HcyQyr;d!s5ni7LHm4(&j*?-t{&mN}Dh95LQ9O==5k0Oe3dT^< zegJ*|mapSta2xzUQU%u$bs;IQCb=uPYiLa%G_SKjS{;Kp?-UTWK{$n>g!qCWFgRTY zL*ZN(gWw#OS3kZT;-mUaGdSltTtgm!^29J;1~ui>M}^oo5725t+kMqbsjdoJ93QTV z?`Ht>AN~wIsedNPau>02&_y3f4KoQ3fiLEJx(}&+5EDehFDST?TrF}dbOm0_s}eYK zwx@C0JDTd!fwLv>`eZm;D!!k~P@eNE%)#atcr4Twx`8&c8#r&MG}8fWT4CShl70(Z zm+~s^HXM6>kIS}=8X!)Vmjl$Vw(kh({1$V>ylE?%y*lOC$dTe6>h#Fn%X~3^uq_dP zZ>qXt*GuT(&}GAVGkQLh*Cym|;HSBbyJvSjHQUg62mYH(x*xrpHL7Y@@y0GNch2ME zu|W(kGqkD#%Cu8E>764ud$#Pb%R@ar+jrgDvwc62?GX8XFxGwx?@yhK?)}+@-sAX$ zG6{V=-WppJv5|M(_$%WPI4O6p+zDkspVpGNF-kk;eR3P> zHzR%bRJ=*aK6k}V`dk#^w{?H}SsFr*cJ2uM?Oej$x6U7kue)E%$ovL1>Ye^puUS*7SWRQDh z3y%SR->^nz(r7K++8T}5NVa!vXO=5VliyXAz#hVKt6Pfns}Z!*PZC{SUss13)^Rn; zu#DEas*{!xx9b>vuwK|MP$+UIGBS-yl?M~P#PJA%{>3Tubq?AoK}6HVYqRO)bjeTZ!{br%|@9 zJ&u2JELK|1h%9Pl2PJU>vU+_dTt*A7D!4ucV`pg%RzJDpmJIa43Gu5MScC5Pw(oW=8fng&(`DMndM&i(X;e(pN6j#a8*KJ2eMeuy>Q&zrj4N! zkSNcGHq#FybLm;SLdS@&+qf1((!Zf-n)0vls|6#zW<TL9B`b*zM&tfo3 z%+QMYr?HxOhz$v_5mcNB=+<%3M2ew=PMe*jpxuvw^9(JU8!dq995&|$LMP3{1YY(4 ze~f?`mnvIMzte4QfglFL=2_flW9cS@VSa6%Vk$niG5XJg6}+|$7bsz2;jqG|Qf8%v zC(>3I8S z9QRJ}w0$#2f;^_9VZG-$Zi&Wlgi}v}EMg0M0V*uk+QhnhO(hiniR{hK)LJ$8_jo8t z91A+LwFrNPWs0mC_j$i6GHf0zPfoULwd1aJmIm?PUvSyVWEiKI({L%u)8XsL{+c6P zue>h?ttST%VT4(~M=`k^OElNHe|C8m{;gGJX5hfn@(zDkD;BlGypw+vvG@YJ^9n*A zoU!v0qM<*k8{$OXb_@4gF6H;c_m`m8o@DjFeK^7q(i;Yc2fehNPNNt|=r(Iaqvb=p z;ZD2oZ*vgZA0B_kP#;A)!UoG{FVD>6+0%YQJPS|UlY(k|YnB)SN@`PC~ zJfUwttCH}IcV4NguJyLw(}kz6(#+U<6{)BJ$G}gG3;$o-mp={g?%@_uuS$Q#W4%jh z`&{k$0f~L7-R&#sFXwJi4dIKbq1=&so8@W>(T*Q~^#B|;AW)J%A?tufXzW?tl74yW z)l=UJ;Syqa#H>9-aoGp1Xr~7MLHs^<{P|tJt)z|f-Dz`hBBWa9L}NCXiwTv=A1Ju?lsN}DAV?E2cd^@eXP*l1$d+El5(Tn z3~=CE37wuB=6UeK_CZ@WDox92lt13el}fo*?W)=hc%bMih|*l`s?W<*R6Rej(7_sp zorQ_b!bHI?H?OyI@6Tb{4&2e41!RfAc{IwM;oBXvly}=$3vz{~Ok9Y}4Xl0LPdh|D zCR_4*C8DccLj~o!3(B(ea(YNNq$0}?Nd<#_*Cd$ldQfEy4#D?RAc3s^;5_VPcK_v8XEDH<;mOp?(O zt{QKxiaWr#3!pm}Qt+AGqWxgcHpOA$gxdM~c-qfU5~Ae| zCBRF2t&DEU#8}Tf@CN}DHz9Jb)`{&BSXrIdG(xc3akD;G>Wd7lQcm)nJ>`I8Cg7yIyG!+H115$G02X01!a2ptrukRNxTIc z8`HcLiAA@^sr)5US-|ovypCaPf-7uL-4sMi@^Y+iGCW|eh_SHHXgTru?NqcwH?zgH z2zFUK8*YMY!pt5Nf(KD zn^d~}j9k!VP+8B&@tEKOS_Z|z_!^A4#az)!Gs={+E=%INpbG1vByYwR(tp|%Pl@o) zB+2;{gX!M=R?h<+j|rV^vh`erul7Il$?P0GUxM!t`o%A2Cg$NoobWJias7_c_GnvZ z`hq-hulVY1Zvliz5q_RM1K5#$1ci9zz6EbVykeTNBdB>JUdz`;h)kh4iPy;tymo1V zK@4c_MU8vLkWLB0DanYTw6z)Gn&V=AeOylfI$3IAL}xG}idkUvTSN)aqma-jI4S#| z9kR6k2Z9{IfS>0>obc%5?{^ii-J&Bl^#p-3@bsD65RG6O$$*~_&43(TqDb=b`VT%{ z6`2nDG=;fa{y#1Pub7_(XWd$|6XEqt7G7g4yd%8Q%Lp#uHWRO(*%@B{f#MbUwd*N; z+7@b_*GcdGH{TX<=OFXO<-l`3UTFr2qnP%+m6ij4K1>c|;k85cI8^@Km>7uhW(>85 z4Dl90xJ5K}gjag#e=8HO-;CpJ2yXwQ`B3Ijy_Q=-WHQ0$*5Zi-4> z5P!%f2o$#a7%n0ZbwP9v3bGRU!?BG8nhW$gy7D1denATffZaD%tJ@tk(NZn{Hm2BJ zp%cY5fd1c%*6{t+|GE0UWaEDawZwyT#u(JkU)rMSUq5$lEz$ZcnqGhLG!3e90#ogb zo(~2&W5_tPe7_t7ct$idXjK2zH0uFt6>Y&T(CTg2?uc~f8N_GDrCHQI%q6lw zbFK!`Y8w6bg}|Y=jKO4H(5|q7%8JVx)M0Mk)t)3y0kFzO`Tg0I2Zar>3QE#9Ls;XVeDy?6!;Nvw>>POQh#7+T9u7t+U*> zbPX(~#l}duF&OaQvR@__`9`#wq*;Y;K?}AYMtHLc{W^)l8Fzs<&!^!KYftQ$NuL?S z$+!%grv0rKPy1oH+mDi+k^UZsE|+uY5;#A42xaOR~ojkYloIifhqmkK&aNhYKK#KD`+HY4De@P89>U+YcKOUK(hCMCPCY zhrQ2MzThVYUSbfPXOQp5*339Rh93xGU6IZTq9}Y)S~z`rlL1>|Q)vY|c^abuW`SR# zb28VZX@EgBURYo|pv5sVCM|49_-*-Dk?TT=SifHQ!blX^5F`yH42%uRpVx6Nih|mNJrDm+XnDt|&(E*HKSwjiqUpT< z-a^N@ z^mBpvkGajezPqm9>GhlV+)A(8!KB)*hfxAbe~Hf%*Xup&G|J`1UYyK$M>Uw40@0E) z6*F(>lFplXT`_XDWb!#(mQ+)b|3@@sZs3JQw@`4Ob_<4zHH3&Y>A_Le_FuQRQC^?$ zXSya97BqvXDltns&$~p^3{4}ZR**=A*Q$a7=xp+;Bops1Xu3Xl0xUOt{|VjvfNI=9 z@?|+!nNTZ{PK>@V#m^!ctjBZ0*rhhG`z$l#Fs(5d-I#yZbvo2d*6P|cdI_WMW*p~V zvoyLaFY%h+tb+RjO&-YTf0iW@)OB^U0FYS}JT5+WtI|rh!8+wS*#d$-LV&plXIwJu zb$5wR5gGu5xK+>0)m{n}E>1JBA#%uQ18IZr7PXGQ`>TocqMO7a72B;=UAqE@rf%eN_iJ#qTJow@uT+I=nwiVR^2);n zzF3~DR@vsa&g$NY-=!<%{kx#i56wmYC(s^app~zO z7MZD5X6L6Tr9$2+8X9l;tt;}HnRPAYZ`w~|_{Yjxzjgbfoc6yua+Bhbm-mg{kZ64# z`pu5`m8L$!{VvC)vh{Z7v)9D#sD=GY`0lu??!xyYFXEd<#^u!)`+~@ys6HRMD?c+T zRj#|3AIJLP1m^-xF*1fqlxCwXE0~V2kJEvy6An~636r9t=-BJJ^#g)POrgZ;xIF92 zRzFCW30&+94lKCSb#0C{$!6C?JxA?zi?-T{r0Cb_p~TA__IRU^T9|{)$H9iutk)24Y>_ zOn^Me-tmxXN`aiH>@Rwb$xBBxxzH-tSEr{}uUM@UP$G53_Wj}5HYcwCQJ86jLf_qt zpb$&|;y~TCV=u4Ocu6h9Ylh&vn#10f%&M62Za1;mJmX8}vvMdR&(QV!LvTEtCJA`f z1`(XgBE*9UAdhCDww*zPug5`;t+gm|lVFwXPtPl0#`tc3IIsI%{41)|6U|I6VzUmP zvRrsVR6fr%BbDt!|C%Xhiii3P;{et2o{Xz4;A6ObwA^X$&#;H#yp*zFvXsv zeifm4G6AT+L*a+4-1;t^r}!sDgy&srlO=pZph;>U&u3Z+$FVqkt@u}QoQb_Pn)hJ8 zpUHefGF?LAeW~0I$+xd(w3n{MDktOR`XeV@R3e%NAW5(*c46>RLN?SvyY6LEDQ2`NLyi-4Igt@n z@uVN2B#TKp{O@cEVi`~Z|CU)uNi@e0;C-1^bsGuu13@663n_6n6!Xt+0XuAlBORL! zjoBw)OJrdwipAv#_o5S3eV@q>VFxUP)?9}(Vi$t zz>XMH-%3V@j9*)k zdAVMe6}vo-<1-A>7TgrDt{h(q>h%F8s+|!!=#8>w+lnp_8OLlGxa;NC>v$sZrso7W zfU#RLe-%2X1)bAJMA<9n2d;2&S%fPU(RZD)Lokx1+s+s#!=UxR5-NO^cGXOsH8q~6 zhQv}ZqDS$`i80-dLDQw4IX}j~6|Mc)a!jX=jjvGFFEGyk3YuRt zw1iGN*)J2}9fZqX{H#v==dg-V3PGRec|{OQ!1zQkL{&rip(vunUl$xpA};5xBz`nH$@o41zrSc>>tR{&Di)Cj_sphc*L=N2<|s7$H<$_;;P9|iLxj_pG*U)t@Folmr5lokwuY>QDn;?W@1Vo*nG z_@5ZTj9b#BIk_ayN&1rIZf(t}%ZhS9ajo@CgD%p~D%=XqT=~klW`j}FOVMh-ew^)A z#RLel2o!21WS!sOR7?681NSMH2P8Fu3KG|3!fwj#z5`w?@z->@au@6?P;bcP*T zlL7p9j%ZMd33^ff0<7@YjBl;BM_bl1vau>} z(YAF_8re?${o!k0_(Z$MZt=)X85!1)kMrEOSv{c@VH&_WQCp%dqhw~;Ffe+OwOm`+%c{J4nG5*OsqriHykDL)m9^WKKG3z z{(a4eO&i-0oZlh|SVFx>;r^DhC`K`hS+sodpG451#D4|vybAGl=zH*H@th=Hjh}iM z$0c>XfY^; zEPObf;F)0k(%*9bE5MS#8Gh$kin8dPNrnsKZ~lR<4VxQW3(#rzy^yop9#9`B@prfa z^!=sT4D&H;U^bcU<BMI3z+@h5ewEKjcB|7pP}lR#gOfDycez$uekX$deyp~MMHjdb zHj7mO?MLNl*eDgFYtIi*YNsJwGm1rHlL~h~h#r6|8m~Q<0IgOuo;HebCrDCFH%9TM zb8(O&pOOM}DuN^!T+}NHhS5l(QNJJi-hUDBPWXY3G0h{R%>!Q;#KKP7e4ij(eKlr8gs0%<&B@b+M4P$qQJCs} z%@IGy8za1XEA1eoHA;#@xQ>Q6>L$K?%)x5>hf*tY?hIH=BtXNcN> z=Pd3yy83ZjntfZqQy7YXL|84gBV}qc;Iaq5lqbbFLeYw2ZXdnARQIy!$zYD~EAK&0<{B zW}0+NiDpXkh3`kNOxOhbFycS>F=|PP)OM|8`ZKq_dStauH~)8?u2&ExU9-&d7%STl zp04{h>#GOpJxQz+p@BEy2`#2qqm8hIg^+CyWUK#Nw03Gg)uRt3J@rg;cA{3byGKb! z8K@i*q)_$Jwb&m-_}6G?HfUmNSXy2ZmocSZ;c491ljXJY>>& zuJuh+z+q$CwVM6jfjaF`TP#0IV@9R+LEr}x682LK?xqluF5&*uu?ErXPETW;y?rLu z<`565s_tiEjWSeBJ%pQD)M`7zMYygepw%_ptGPQaie7>Kj4h|@OgtygGO)&!l+lQI zKU>XpHppJK9wbE_iI`_t`Yf!_xz3VgVNQF@l?(eriVa{UQkNL`Umi}ua+R!N@oSRXf8HX2y6fa;^pF~vgK$_7` zD2`H%e;Prh@X8xLsIX}#IqUTg=Z{xK%ShuDE>@LOpL~d>#5n3 zk=XCFR-7t2w(YCp(ZF;LlAPL9JhzgosNm8W-s zeiG9@wSm9^7b-gDVUWh1l5Vq48Y1z-M&W?&rnl;m<-R7CO?n! zoTOahO`(~i*_~!}VL@Q| zGSd8h^F{IduoA`Ih~q z4AI^wp$}B_b1vRzgzGU$(KL9_22JZj2`hq?o>XN?)Ua(Dyg<|~^LYdpHo%Hzv1n@2 z`(x&VOzoba9gCbt>%U{Z^|G5pG>C~Hv28DqOY!Eg$<$s*4@n@_54J#9ky~8gPooJjYEz?&Z&y8BL=XX!FqS;q*yDVaZsuiNhn7c>{nAcG8FbS=&Yn*TDCKNZ_B1U5Qet+JY`Xq z3K;6%=Q^kO2mwx(FDUo(OQ|Le1F9*_5E1*%=kV0 z5DhKyYvYdIsUHj*m88X1ytW-J2GVpz_Rom4$ufXOBhp<_2CSI|frbAc_G<0nLlB$+Qcp)E*pG+r0~l5Y$WsY8RunkN&+V3J2(brJo3s2w;WR}3`- zN8^KsGb|?G5KQvG#xC(ddssp@Wqh)4WSNX`JQk(jooO@5La3MR=N7qZ25kMfvJk0Z zfwIsa$_^(6G=)$-^Becz0O0{$L-m8H0Wx!3GUl(Aj`{P;or66@v;D>+{;*V)bb>}i z9f{35F5t`0NWwhND+=G_IOE0t{^F16`$bOYiohXtZjM{v4uZCL1GQ-y&2GnQwfi9C zaO)`^+xaJ}uyd4N*OQgD((7Xe0@y0;21aecQJyRbNBNF|=mpV`Ct#Q&!#yEM#+;^! zhHi_ZrmMz;q~rl6o-ay5QRZ#lAvO{0f+QA2xgiJz^`5Ejd_kY>ysYQsDo0PetYwxK z4mSW*M+9C}gcFiXs&-A}OT0KO@I_fEOe(6WYIBmPYKGj>;cG@+l6b?AnyRMiT22&9 z^&czy*A5++l5BXZD>Zt@k9TToviQa(qKKatuvUE{zORP0HTx;#J45q~#YquS;!DvC z=ns-a`FMyQQ#}n z_N@KIVy!ss@{z%`m~136o~~*FTi!o zvh>L`Xo8n-*wuwe-kpX9d=VNlUEvF!ZmQ*py8FdawOZ2LIcNF}gOCbm%$&Q&6KB0* z&4PAS=VjBAw6dlVeyUxsHmX{=>2TxVnaO%z(ep)qZ^ave=R`XY>BI2+hBV|Y>T<}y za}=Wx2cm!Z@cd^Pcs{ukJntKkpSNP91O(u`c^CyJdeM zo^ouA{-Gcwz`1uceEz;bV@?D34vvIMp4#|}w7%gg9pB=349gq__!MHjv+1y&8OP`~ zzyq%cusTBll2v|hX)g|@WHD#zo+-5|_6)86C7!Wrme&vfwHLla8!ZWYjvn2^!jNLH zU4iirb{dbZNabLNQ(_49mF@u7_7Jgha~!uTAWVf$h|r2*P!!{`6LGJP_mg3xpsB1` zwwd$V6`|olYd~IC0JToDT-F>-1zhi$Lfx@6V^>;|>0S6y(9X{z0zMzKReJHo7cY<{ zQll|3Ep7$Ff_oHDDM(Q9(IaI zbfO%EJFpAx;A4iu!?Q(s|B;?qnsxZ%wEdJjBh=P;1%11)of1S6KdBSk3G|Z4q}!YPLDCUMG#%wX9`Ze>8xhWfqRyV1d$K^BY;8heqyi`1vrR?_WI*1OaKoB>4ep zM+9vc@wNo{iq@1Mxzlb$l_?|%YX|oN@Gi~(Q+0H~mp-kw@4RUB{R3dxqvY|%s_fQ; z8J9X1zNtxHLP&p`=O4xMk81OdvHZfqtk77T1~^m$WQV4qKh_Z@ro*viiTh_7aejp6 zSN&)AAq+wokC5FoD-760;xc&j*_yG$Zi-gSKANbt+K=^PZ{&+C)r?hva4Y%#}nDYm%TrHx*8fbm_w>K3BuG7wO7(%o2_H>+gZqkIL1; z#i8lHjm-bYcZ$I84DTwMNW02~3p>Rq7s`rde~eg5$%+JPd&2|=npEo%|E~EFsIUM< zK)Sz~-%3`TV!~iHAsYU2dap7)1?`=iEs<#$#{4ytaTs5{Vx%iMW{Dpe@;;wb%plw4!FbFy-NxU!N2AO=D{SdS7PV5+jE!pA4IXYf?eiMZR)r z=4uL1AxOTCT2K=gjifl}VL>iQGA|WmNu1{uNg%QX=bsp0k6Yn81w&dA2rr8hs`MLa z#+JkHvzXL_U?biZ>SwKC>e=9p_Gpl=P!)_xm9NDWwU5WtvEPX+Z66-Bt*5C_p*oj9 z@K_K9s-I28q)l)`7U9I(4m)&g3-RLt-z{^;x!bvSWMZf_1VQw;J*p5;G7;GyL>xOF zz#Fdv4->^0SyTww2p&MEe>{Lq|M*w77cPI0!Z$~2j{Eq<@$*D-)Z7W4Mjs7_wEM4j z)Q-4cVt%+^qCjHPuGub$`Dm7Ph&SR4ThAZ!K~z8kU!YMYABOl}6bH+3U<1yeJ9Io(ZxswNII;@v}?QlkM7X@Up}c zy*o_=d)~C$(1nvxN?y39#$t`p$Hup{&Tr% zNmrztTQr`~i@H(L1sF=^?isgPo4Q@e1N#COTY9Nn(nP_jt&QK-IKOtc@}q4rHJ#1B zTE&EP;+YpAaU2GX4w#P=}`)5*Zg4gUB(P&K#Ab`ysVYpm@+v#{yGF|-+uh3y+YY`~)kk$6oCT0QJ|7&eC3 z3uF8EvQ93-$H&+oPXhiAbjPhbz{oznL)5KzDCO|mqHkpT_yXCM=XBsD%=RLO61U&( z^#e&JEA77bGM-Su`q2|#nV4qssWA0??)g8HWF|)SuM~+##g8?)05`bU`)zIs?Y7wa z+f-;C6Ox~yVxGyyh8O>6>D_L9qO6jcT=?-^Ue8fkxcH$s7T_V6)M3#um6G`Up1^&Y`Em zRiY&fe$C;lCNQumhp%7J4YTa3s%AE3ZKrsXoQH8UFG|OvwGC>B5A+-L!9u)|yMucR z_pY%#NV|or5j{;8i^A<4Q5TKZC|}HCR*X^@JQv2Z#p0E^9V&nlF-m)bWPU7;CyZBW zl<0EtSdh|Pd;COxEM(`dC|v2kp1}F2IBXXmqvQ<<$-CS!N(pLu*Q^N611 zk^IU2oEgBgOf)|yR@9R)sjjz#b1e#;5yTNGAv-1~TZ)@g=2j+*y-Q8GIH?xS)j|8M z@s0g6WU@V(H!WeJWl4@B*F936tuwzc^_6O1voEolHMkTEdm(6NUHp8*|DM}M%usiw zg8mAM7C-_5*lf`_UpnjqfbdJQSTH5UFyyi!s=PBZW0)p|t2}kynXm8!JL(heEMNDu zh10VK_kzJC=p_TX^%H6ybazXUl*e0M zsDQ5V0^L5tt9TQ7&T*PPQ%Ie29G9r$G0h#sm3!M}dmRDd%nYy};rW#nJ``a4lcz%x z!eXYgm6b?B3aN80%0>4*824wxEUzqADP76ILSLfVKYq+URcj{!ibF?!} z>YeEa^ES!lczenc`8lG=xe`5{v;@9IG-Z!yDjMnYT3#n}4`e1eTlU`z8!dbkTHJ`6v5E`sXalC&<0>yl1>z!KlLm}>A`2$vxU%YqJn zlDr{BdGMRm4?WLy>3qb{_Is_MrrBy+iI)4)T)f?6`RGnIhE^qAM;L!IEEp|HVV=`C z%I+0pX+xGMv~Tu-hm8$y!PzKyRa`~{cxS{RlH8~2uaB;FXLJ}<61xC+Wl;`JP0-Q{AoO-ni7C&?1ZeJE_(1p4WILhXXy#n zkFUWISz`}fPvSpWC+uyd_4QKtD_pNu!#ed|k;Uo%7{=TETp6R5=gWD1i9ZU%0Odoa z&bJGs4=p`>^7vxT>oj;nYiR~wU!J_`bocb5b4T{bwf@PMAJnu$K~wjv?dzWI`r|m* zQ*HX*S&XIty&j}iC$s9-%x#_h7et9=mp%XquvE-({8@=Z~2!A_M%a zlI{WSt=yxrI9w$twbU8B)b2PPrwNSK>~`9%9*9M-E>}F{Qb4f_3bf~f7Ta#MVc>;L zLqSAfeKa`fALaYFa8LBGxH0~?k12RT*n^F_((f&ajpvx8srj`${Gt>!CMVxx!+)jH zBoW0qQ6Z(hwj$00?nJ?`O^h-ssD-?!sitA=vkX(!#5`PqCy8krf;3;TO6X{mG)+{r ze7?L|&gV5n)HDfaQcBi=qhDt+cQZ`TX-qE9Fx0J;@bgDN)zkq1o)>ZQP!$EiSXgx@ zELA0-?-`(RYnq%_bty-Ps#+87>VhGH25s%xzi3KC6IIO^YtHgn&U8N1kRglkt?|HigAT}FlZ=hn$<{YSEjdkk4 z@Zo!X*D2F_JD}Fc_haYwtXrU$RxC>(7M>Q#{NAP{)*JlHp_A9Fdd9vhD@H}qjrOdn z3As{Hbjr4nFBTM0b}P|EQF3few)N8E27QZVYWUWQbpp>(96aanf^+QJ6AL+~bJcY( zo4xSQvT71XES7SDrp~q}57?TnSw&fmt`!TKtl4D)L}P3%70a!4I3rVGS~HHHcbs^- z4riTKWT6#WXj;n6P&kK`TU@IY*4DwgT(qtk-d;D60de-Ab%&4-Y&O+0D`8QQE^;xxPQw%$^D)`rgnm5 zYpMN;8wN2A*@LAJ#1;+N0~ZEiM?>~79KiRKG^=jI${XU2kiQ*HNiMjEW)it%I%3TrP+yyKf+pX3dq7LW(n^G2$~(})LKD7t@mPkR3kPzs&q;G5dBXvlt3lo?6o4q>%(RQXXrb5j<72t3={Ab};{`d?}&}W;z zwpS;Q1J!4G4W8zw(fLMiX5hjDd~InGu1+r1c$OX{ec=q?cLr!o6TS?2i+|z4;cp2p zEIBjqIw!JS+1yK)JIbBpUWqe&ls3>lpFGe$pF+?+pFV&G90%c62W-I(_0aKc&{Gu$ zZed;bCcL1}kg(DN%x{AQi2`a1%Z*ZFS+Eh-Q*eS89|$fiQ!K#W;x<@-3oZNs{4o8F z;H75~r;Zc&wGVJFa4zOi3D)M|{B~Pmvpir4v5Hf?AijXJq^_s6TtS$y-d?PV)8wBD z6~)T`S5c8la(l5V8rT&ck>1G{r>e9YvUO!>8#vq)cNKRJ_p|UN%#y<<^p3HxsD7{2 zRvOJd{dTiJQ;2w=^cQ#<;l{6mS#}WTVUF=Q5utPr7KoeiOgDPQJDB~N*drQrnrX3G ze7iLv2yRQSxHuK834)a`h|ZUZC}2#vh_UI4Lcmx9(@9W+(?eiJk?_6@7!rsepvPR| zVT|a}iEDZnPx<8Cr@`iX1d(Nk)y1}40#on7>qM_s`b$|6cuf|u*tUWb>nctu@{%YS zYT`=9GXfd+AwRY#pii5-iF+6K+3hH#v^ze3^j{*h`cG4TRpTw~?RsJQUxaGa4}MTL z%?p>Ac2tI84yPHgxsP(kLFc*-uDEi6M^w_%tF)SEe!Ex~vX2Gf zmvLDK7OU;{6}f%jVCSF$wC?nX1lZfB7>ZsZns=h2l9H~N-b}d&*8h^I++Y>!jx0-x zQ@8S9?#_5>fe^cA6H8U^e;Dh+19UAwQgIG&sC~&$EK4!Iq$#2x@%u#HCc@3UOn^WV zDGD;bDUe)_2%9`V!3#v?!@0>oMzyw~(cy>#9_4iYJL4Uhu@wFk6tB%yvKN#pN z9M)mFk-G(RKlPoMVICZT_OMD*WclI7zGJ-^9fewNSjUz6-LV{vQ;rO^GXig8%nxh@ zGS&1-g<`!*=tV=|ix}%72t2Otmh*UYO^5OAGGuPWCHZ1eKfW@n1|{POhh@!nJCAPw(hR;b5rG+`N^rA zRTd`sxmtO$F;M};3iI_+VFHX7`_4)oL7AQKCKd4{Z<%f#SXG$y%2Tqi&KGmnDqha! zk2fUCv~2#QU%%*kpvz&!B^YgiXS=|&t#$_;dEF*X)_Yy7Dy=lp!M9$PItx}ISE|oR z>o?qRy*yVd`}XV?D#FZE$tz7x2^DdnRr0v7UhER+0*An6c_UUW>6Tp& zYoxa6SGpbg9fy7g-H7mqaVq^KKF>=DXYF|NcMG#b%N2MH{u3u0RZ*2(QJ9;bpA)RY z!6~V}u-t}0zqY(~U~=-n+H&pZh+Wi+NH=OD@hZ3A7T@E_{Oej5yK!j56$D$t63nX$y;85=Vys3%?XC2 z@&|dv)X0oai|2tBSOc@;BGDa04l)VSqt(WyQF63or|dP?=Y_KUsWXNy9DO+m(#d_c z?Kbx)GmqqR2HoWck)MZ^G4}e|-z&$O(|rH0Ll#WXz*Pdp?!Oq1T3rW_lH~CQ`k# zgSEs%mkb~p4n1W<63e!#mK;Y@nap8K2r+&F8uoocy)j_`i6{r~wokxaiXiG_F15b?TaIIil)lP$ss zW^yI2Li6kG;|_2=u%AzG*K)4_S&RMf4EJ{Ko!kT5L)=HWN9d{w%)RIJJQ%1H55zo- zQ?A#i+csWd*ZUp3GED}qOZ19VcKWTpwAxi%#gpjorCuMNW5*sIgUS*+j$esiU+J{v zWfJpXY{HnMX{4=dAfm6=bU{`3s+y`Qk7%l{sCyM9FUx?i+)zT}VT3my9M$LNQu^rI&!0CTzy&>RY9 zNXa6;RG{z7u}{)>P0;sB^o_9>R%0*B(HC0ug&J$5O)t6hb|v3x8=km}STyBEKgzV>5=`8fi!8Too9&t0+>$h`v zaCd4yTCMi}fDpAMou3;;r=CAj6vQTQBw3juCTN z5(Qap7K@Eyu~{lL=)nZ&HGU2vJyZ z9?kS1em!FTA+c34e)jdX4E|q_UK4vh@YPMg^Lw~^fvdSrB8q8?_1SIEJ-Ok$ zEkuu{V_uz~t=bh-kaA7^r@GA3hT?H`otrBb~)T`W#d+Bg+$ zvq}Pzh?4+CP0bg292ZoxSn^M9d&JDuUJb|o z&i_KQUfQ5@4Aj}`f9MubuIL((Uzu~%d|q{O=W~uy;1xY5<>aa?7IZBq=Oj4F6Jlxt zoX8bP%CEsb2meg?Bc_~7;C2c|(|4qCtI*7|ET1FV*q0ii2diREDqyId?&1o;y}ORh zQ+s7z%44QTV;&RW-f<~#S>av}dPx$O?O12+Ut%;GhmbFESg-Cn0@vBR$Gw*VZ*yQ* zJwVqCkZ_3i`eE`)#8X%s{!+7Ih1N1Pp{XWDX4ZJHopuM8=O`ZOXYQNA_)>F~t}0kH zF}!w)|J-h&){pT*+`gPU1^xRz&-0?Q)%k~Xk$NM*QQ7=1CD>$u;%WZvkan6tmF%L@7>bDIm;yQ$bKRy z^n}r(xYd~RyMWLMhF9F3E$FIcsd~ZGWZNYL#W{j!c|dr%WhsV5QJ;^^qp&e%39PqQ zV)V~8$Nwev0#8U5`A`sU72 z@`+(GoK$y&iCezifj*Y_AkS9KpUTbBuF})(~@~aD{OdP5Ouh05W>?{z&d*d zy>EgfijpAH6MC87TV(N)JEXdd%kFR!b{nrgI+G)6zGIQa;vm`qUB^5psemzusT2x7s1C|^+xT1FGzJ5QGb zU_Cus)u|kK@yEbU6QJ=K@lj;HmFK-auI*{Vu*ze2`YsG0M9j}t1ns6Pa}7_t!)!LH znqF#*(DoF{Bv9u8y(0I+jFo z^FCVc0EQ9?M-tR-YQmE{97yDhapa!ekdIyx+q4cvMiJfK%0-C1Ya>)krin}IOdMEY z%Lm6hlw?+f?c3>l_<{Ea{wam7qiF!2U5l$O!8GFO+&V6jz%WiQmHHUG#wOg`o)e%o zc1ez30&KUh3oRww+W~$|iW`cH_^JO~cy8q5jb6vrpFJJ;QZn)kE^?7r@mpg23jn_1)v#W?du7U0I%ZC zV2ob;TQcZiSd_u|FXv3OVV?O567#!)B}c&&8K$FRh8uj9Br)riS+|+J(gdy zd#H`!miYlcaH(YYsKfnkiRP!aANzMp+WzGT%77Hp1!h4PI7xE?B~Y~5^Drt#j<5(w zT}{vcB_&bT&LnUo#G)cwi1{_ zG5M91iJq&pgN2ywsC*_{ zj#8EpUl{)uEY)PYvfK}Dc{EQ9hG8A00e?;T^JPz(**7D*<#|Ek6@wNr-w0MExR%XU zVY2O0%=5y6@d8I$A?42sTLvHS?P41nOE4(Dmv-;=ni)J-z{>p{_m$@)< z>@7d`ul{ecSyXr}*X>T^mJYQrQLGl?1lQMMB;6u+0!G?9X+Hg+mCnG*)bN%UUBR|0 zvDRZo8f6uiKvJ|8Fynr@oOgO^_xTVJuzif-BF`?YvDV&PZj?(R!;9ybdnd}xvOTrX zR2h1WlJ}&K*UezLA#Q%mF!H~!Y1|x}d;Si)_%=oo8{Py6q&PB{S7zYUnH4AYwJ5Sn z()9iQ+6uSuy;3x(9OEloi(ljBxh1X-J?)J&V#`T0krHxBa6qw&I!U+ywVhf~!d4PC zyL2sZ>~FQVarRuqNt+CB=L1%vt@|1~`^5(_0uwjJSegh;XIMN>2f_bo@VzA-OeZwEXU~XBi^SC7A1D3`xHk@yxe;jxkiglWKe{ zznou!zx?y6d;(ttoAtG|Gl7$k?tU$~(CU1|D9=CdhbK@CZQd{fj0N#^|37W-0_8|{ z9fsAb->V<03ZFs&-Dse@(Ez4rdb+0@jYjwUXLe_Q*blio`{V8oX_4ZPT<&s)ACVl! zup>>Nq)$R&vZE zEpzXC^?3yp&^;@_@4owa_r81IAe7aWxR>P~gnf`dFx}cgU)W3&Sr{y0 zqjv|C-^Zz;V-N40w5Kn;zv??B)}wcW;dqGwy5abHMZ1if|H^jpDm$|G-{XyZOAZJk zzJWHSEPf5{8YpLx+6)W9sc17ay)mAHg{wtz$taA04nJqqjB5t`XD?(WImMT>Z^athyC{{@3RJu#R{Uk{ zzaRaT8RE;AROOm1UsF`^3*n;=!8HRuiuQWNd12#Fogvxh^s-QXnSDp}Rq`0jFC-t} z3xc2Kb9$K1Ig!^En|Zt8(o%Q}50`i?2eKBuhr?^U41<`CJ3uki1`!Cy!{7snBYNL)ViB;lYHU$=*dEjj22uf%o5K{wm?vG(MlD`GY?kst?~9`47a_xucLWIn5o53wOlliD;lRghejr zXGf=TuzAqVjHNI}#*{I7{I4}igNfl9+~IKLT)LAniw5h-3Hg-DaYqWkm)INMPZ94+ z@9|2_fafyX(YLk3G#Zw?Wt;nPbynPPaV6S;eib}M;Y7{F(nK{edk+!^+FdXp3D&4opxs>{o&N){IywxyEgRbo)$ z*o0_g<>3{g*#&Bl)n#Jte8u+t(DR>$m#XjoxvLREP4MFkxYs?rcIfDw;}nQSiCQeG zgleSVICIZE{F9}6Dfu7g^0PV`N73er3q(XMp|NHYZYai`uiXt~8Z4N`Vnr=-RddlC zzJdo=d(iQ*yt-}ZRJ&bB&h=5*^VhMP3^n5 z3)|5D*to4I$^C^Z?2Z%xe)T2U)UFtKzjhUSG{yG3^!rkYS*~2hv`BWF$D~_dHf&vO zsp_BLO2_wJXI}U%ToifTHcsfK?8&w#~<0rKvWueDGYNg-c!fAt%R>IL=O@(&O$u_fYtgWesu< zFxiRUhR+S8X12ylk{#R+tC6d4+pyCTr48G-N^RS-ZQNe-247fvgW6vsd?{7HDPVFk ztsf^oK^e5e*e}{;%WlFW$~SIY!Y6n(-{KQLDOoQ~H~w)^Y|;~BBeIX`%86o-5P zHBsno;Xy?k{OOk!?S=)k+lbcnqDA@dIlcuXEbGc&y#cIs$>QiGacQg{*pb#)4ff=_ zhaAluY7TdB(=LjipkKThJ!(y{q6H}qkEXn=`c_%{*{fIiqLUILrEww9RnKUOgSbbo|M=>Aoj4e2Gr#eb&MGCUC)(|ET zTlB`(^SHvPeQ~0`{f9Mm1KEt#x7tAC0M1sX)Ul6iz8;k}q!XY^AH&r!ZnGs72O^G7 zAQfg_my08|GQf*Vg}rW6Z6T@A%@7+>ogs!x2w;HeDzCt%>Z~A|_;!)##3QoO#7(Tp z3DF;^$#PBBw10vJI3sKMe;>bH&9@E6P79^3T~H=s$?gBcaNM6foGyPj8U&DqVW^K5OcsN2CpFz+3j zt9DkaCB3s=oZmR4>DuAtqU{%73Ra7T-&!XnvvyQg4XfS&xwIe}yBCV9RYg|RdZA?P z6+P1|*}WCjS?OA;+}yaVg06SW0&&}=QfcjdZow-q`WstTwNPp;sH&{YuZinc6ewfk zuK6JiX>ZsY2E&jJ;5CHzH%8+>-#W&B{^hY_8y||!BYA_hUP4@rLL+y`3hf|07@hQh zMdk4nsdWQOw7W)a&Z(HCpjdZ{&AwjHP1`Ekj@8_5RjP%#h2lc1R1KFJD~;xM^A8HT zQ!E=nF|G%~;!joZnXqOl4oLJbs4|aYfP=yx9rEM?xX>coQ2||wA2WD<+@K(JOIEdJ z6r%F(o!VN-uNAPKtml>dpjIlnwoxS&yLbWMqYP5AU{K4fhhA;2P_4AKn*ikMUZ-3M zT62q`rYfp#C^GPG(W#TF8$Jb~Q-(wa{v)gd@GST_a}MqZ^7`7=TK&#I-aJyTADPR6 zHtoT&0;78htN09$ox&o+tjsX{3mD*0y_;SaKL}aI980O=cWv?-IB4~P(MyM0*eayE zd`VVy%U|(9G0TT*b22exOaH!Z$p(?bXZu}2!VkF_iw6jIG&<_COv@u~H z{@++!DHH%HMOR6ouy}T{0M3r7XvY+VOcLNQQFI5$<6Hn5kWPolDz$4)`&7{|2{HaZ zaGFe`c^gWYny7Lx^(2oQnjI) zHm?Wxm&Am*Tn0~(Nk`_PV09+Uc3dZI8ZaNHNf;F(ui&&$6A;yNys5i}iQ&`v-aNecVG&EnG+wT)7-4nJv5tj%+s(^;oIQ$4L6m9gDhl+g z*pCIxdc^__!0MDEoNEAQ4|`STLb{Ev*cMCX)OkZv9_`r|ftz7B43-vjOS8JJ7W8T# z02q~p&AMLd7@BDw+Gt+3i&Ib{^=dDCxj3i!e%&h^D{UOET|{zh?}f)KXRaC=E48os z&OSIIPyQ9_wPS;vXt5gh(y$63_m0dKf3E zykyiC%4M=(g2QgB205l%^QDC@)fK~a;P?DKpMPiJkfEuM&8gs@!!18k28?O(Zc?2u zsX?Q7WcJ62-#*9eK&gzaw7j$c71i1BCAFDh>R^6tKQ?G?5>S-Heip6HrO@EqwX@Y7=L2JQoip{NgY6ZK*29<1J%^dXQFSdK-tFIyzZ#|Wz|<2MOP zQr^zC9UDs6B@it98wvpQ96q<51JE*7D|pT(+6%YI+89i{EUySt3vB1>*W()eJic>; z(Fx7-c3c+pNL+X%CRa)(wDyMm@V}59nLY&;7FbD7{T;-8$0sT5fiG+NuEc!hG zdZNPsIi59w8YD%9+stojFR^9BrJFiD&;eldOPpG)KIxnPhE?8}8wH9}ptRs9f$zNX zisRo(YwM=Z;vVUs9~E1Rzx)JY4t;>Lk`;_kDze?Y6yeXG0|;M=!T1cT!?FX9`zn7F zU>F1OzkU_({%SIZ(BATs71TkT5E&54Y=Pza{LXxR`D&!*pK7#Pji**|9T4Ou_5(Hm z^7{loa)=F^Xcv>XSkoq+Jq+SQud*!#E)KH{!i0@7mRv-k0@4O0%Z+epX?Lus}64Y!)VuQj)|s|hv*o#7#cH%_x^Bb$m5Q!7y4xrdP^kbqHXN^_{1dvbe_SJ$@qZf@(G1&o10@+82w?UZ z4c9=l3r13&R~5e7mlm|_4&;~%dIPoi(UAw13b%xCtJ2bM}= zeRl`w*2l<7c0cfG!h2Hic*77=Z`V;6f}vAoDWa@X;1CzUhrE+T#lr@Bf=9F@V}l8> z!EDdg%8H_coox5kd$yumirHLgnlgQ#0V6G|9c(kK*{S#QM+%k+G!>oVvWEe8ei^$F zhhbSWRlivD75Q=B0exk{ZJMo^MlBN?mk7CG z4`)k@HH+K<10AMB{>uIWNc;#d8lfu7U*M>D49~~G3{aHhZT>?4T{19#vE<>VZ-%l; ze<{W>!5NHP*)+rWLNh{@mss1|S7un^jir(zu7)PO?!n$u2YRflYe#N}wsG=02!`RjLFPLzltsH1xt8U+)|7mmg7OQ(sunO+b8I z;FD!V*U&;z3`%Uu8li%MrG^S8woDamI}?6-NHujZI*4wnq0qyO$8U}R&KFq^vsp2m z@reCSC{O`gf^LH42=CAfU>#QA&fX?|F4Cf%&jr;C(jP9kDOE7u( z4QXW>nV$EN7}c?Hud%L0)9XK^^|H3Xs*5Z8Z|?|WTjvGd;qW8L**lV|U@6GA#8mi^ z(6b;rK3&j2XZNj-7eg`-LCn6RR_GqYUYD3uze(gG{T*ND#rrZB8Rq2j_%1z#@~EKP$e>=^2X3;%0|?y^^x|HQ9A zvSKp+*r#k+Is`nh4L;pz>AZB0^nmoR^r-ZN^bVlhM}>VM0YHq3rRotNNRzeI zZU;joA#Q^JmoFS(QOC5rBIfA#gx~CbEs_7OXUVpU6e|>!=;fvs%GMW=Tp^O{GkDf0 zFEBDS7|D|JB_ZP@<w6;52nK^u1?4h9go0|jwyJm)?{6e$zpkjq z?>-LFNY;zpZhN(;%jCV`VNX7M-(lH1EHEM(_oj*46l{aVgiQ;>b@nPa(qLDq1xHqi zCOZZ7$w~>Wf>K3{necqyC22!C1sw7utH6)TN(uBmu!8u$Fx(}^GI(|dJYy$3ErYzE zDb~~b!2Vg~%=u%w?3l;z+A{$nZ}09sMPGe%Rj;m`Tq(3y+HXg+6(qp(Nm zsJq9Ou{Vki_=0Pq7qEEnqN2c1zuU0Agc!C+lmB_zILEpCTu&b2J<)~85yjSV7%S>x zPjOrf$EEO{C~283HRAiKFsAR-YQCaY767oy=XFE1dq;b?udiBf&IMLQvkMCqRrW(s zraWQECBGb6o)cOhgb9Gc5vBkrtPki`=y+CG_Dk}FoL>b?=iF>NCj;`ZmqAAWKUdIS z9)tcz16#UTM52DdbkKk=m>@$ip-dyP;nr>RfeHp#--@Dv&9A@(wOA>Fhh%Gp zWn82o)+e4bs1?#1?bC<7;@X)Dr&bH)uvD?Drt5%%tQjj@^}S7I>-*?FTdoF}Y2XCI z4K{^qvaTrx9NJH5mTFp-samF{Z5vv}E&6`Zt!M_L;}0S_E`Zd(!1~Luu249y<r&X+Fgor08&1{jVH9dG>yt&RU=^)V?9Gv(e|5{ z)-WnLZu{YS)27a)Aovo|eB&XCs`z1$wE-1PHvt&H_dSZ@tZl7<8Eubr7yjv9_O#yn%jXVvqYTxc7LLeVyhp zxnwx8!m_X5vU>n)`f{|T^WO2q_AI?tv9rb$dhMVCfRWCvL`}?cS7N(gv2-Oe`#&^= zeivj=^reyqOi`&;D~i!deU)s!FyGCPsmGU;F3a;$LjKuycLso>V-i6qYTGdwRRWWL z3`$LaG4ZD|mO)PhndU-zz;Qo-KSk=fEbz%m3{GUZA>z=E&davBO>MJc+D6~BL0JR^ z!>tlCFi6!k3W2gVjv1vX2ES{%wjslhVY_C{@hh&Xx)t9!l|f4(8Qw1fPuZD?2j8Y&;{r+Dt3D; zDLkc3{wSC2P@sZ=t-tF?ol<7>8@f_zf?WwzsW_^>p{XK~@|ofZHKmDHD050ZnBkN) zRZnQ73g=^UYnAO=%hjP6-^~aY^rSGUB)STx@^YRo%?aK;#}pLzab#+siJsvm4)al& z>mn{QJXJo4>wVn1rmD;rRVVe*eQ#Ya?KI`B({l2`9jm7$?rwnF7JD0arm4`C(KM5A z-%O!GY>om~WBo4di*XmLQ-caBq`hEBhv6{9Ky?Vb*a-kt+RHAVv0Pyc%tpn{Sipi3 zrBe8Ap`v{G#tZNNR2Wj%*FI*K$%@nN7U>b8%oM1cKxHkM44q;G;olaD#lkc9eE$3s zBiB`(<&x(*fA2ZZH#PRHw`O6-`r=;1q>K1lvh#%#Q%7^^C{b>J}zF_c4D0K!t$Krs$9X734+0CWkF zU({9ER>S`UW0sHFos8K8c6Tynxkyfq*|S)awG47S1Tojv1}(xcWDW3oG#r3#WI6#A zK--NIzfdvs2kB0wC<`C!m2C|JJx!zsH=YKSExx0u>%x$J8OHX_|M)`bQ)=1zG0k^r zc;f|H>@Ayc>R|0eYCE7vO+t#QLF)mj&bx(xxCZq}qrI{~8p{t>scI7n1N}^)_}_f~ zE_-A-u2))iRF^z=mtqvp_*JUwy6aeuM>T6zQ40mRRG+UYHP=>LWvQtyw3ljz>bVrl zQz!c};<10f^pRvQZQNlQ2mtJyZqD+^DLLj2I#!(n$uK}N^b$Ix8_3%0ajqW*4Ei9h z2irX1ZW)^h`J5@JC4ZoPoozh%rKec4_v;^X{pAK(SZOziPYsw?1$Vwmf;#AyBBsD1 z;V2fEbb7W*tKep_Zs5QrhJMa_DVZ-Tus(jRVw9-_ntJm!||St(d==& zF$1Rq4BCUUk;@ySy*nHuD(=EN;P715)VP_!fd-}+g^VZ1;-0_8SY#kS@GuCl-`M~Z z)3`Uyq5H0M{s5HEb}otcmkOKNgIPl$=)-w2pJ4hR2&(W>T&iC?sp_n}PqIHN9ghpr zBX=qd_r+-T&|I8?(*XwOOEZxZ))e?SRk4Q8YWuh$*+0yGiQ5J6%HJwnXYa(UGx zKS?f*$P)|xGiuqs4X`}pFIab(WOVVoIaiS#x7BhTxiZJVJ0_Q1({#)7Hj(?EU-us< zS9UFj5XaiBl2*73hw&_*zl6IBtdj6BGgK;a0B5eB0>^dtWn4 z<`vWabglMj+pIkQJORrjaK7sVZ+;uztf=Zqtz_vBxb6eGRnktKJ{dgr82B$sCr?YP zA93_N?0J2J(@J_Vdr*_%i1Z08c=$zlA*i{I$+ij0|1vxbHIWsRB1FSMMKHHuhG$5?3j4NX0V8&{A!k4zV}~v)ky%VexMXTtxpZ$B-ph9G|9%PdQC4#O zbe2H~MadVK;>eqUhD>7Hhh6vZdvU+aGd6OIRuiy%MqnKtryj!@qbqks8kymimc-e> z{p)Sc$DZ7yF+&CH>^FC$7-ullwrSRMc1&Isr3!+Rgx$+b)Gzf<1U2+Q$8(s z+n^U|cL#K#E6*COcNAFl{JABpa{sKe9z zW3+SPDZJ(>_8UYTr#|m%@SRV-`$=7Y&(sHhMAz{SPyb8`0mpHkAe{${yDHUwQ+Abg zo{|v2WQTLg875}Bq$<)^Rb5jTj?I(i)`|Y2jH9n~PF^^^EVuSfDO6Y9$+}65c-l!F z4)S9E1aRa0u?1Dr)#bgGynOt^$&{U%V+)COn`T^Xr5s0&t$hPt!G_a;NboDwsqOZse{D#ay zOWrKyUHpI2;_scfle&@A^rgIiR3t}RtnmXJ5m8=98R?@hV{eEaTMB30c5t6P)>-R% zthfx-t32^wxU->$?kC((_hgNlvQ8`jzN_eKr`Ool3ezIGY*J1Bl0x=~EQb!!KH8zCTWGXSy?+-uCub;ZCZi(tF;VAm9;q{pOn>AMV3$COI%+J@F@a5 z@53G#4y^_x7{42WPg1yB$;XE>0zjHb#|p!6$8M zS+s5I3SHC;+b4=rv<+>MD!MJDb*+cPqYJ_1R=Nr>d&1Qgc^TOa=a{H(9Z3)38TTMXyWvb(i4Y z|GsGX)|oS#n~9#8V>#{fAYu1SGbD$oq2h#!y}AOqfb1EhdZznbU1jOCMHZV}tv3e$*n<+=2*6_AL1NJD_9G%jG}|jBX02ko@{pI(*0YC`cYMRRDu7|$9n}RNcdm%S8U3}_IYYwv11{o3eS%DWjpKxyLhC%)b4f9$m77|ljX~Vkk8_Nz&GE-<7X@5 z(EZv3iFCN{4~b0R{~uZcpdknTlPVHPJul4HSEcWQWzFVmE)WyLkSih6{ttD~oKjJ! z^qDe58?9<)k%Qwf0Ef$~cA4Jxs~x|3`#LyhsKD@2hh43DUEoaHxQ?YtGd(8eb2z*Y zsuX?$_}!??&sSc@!{5Ac>C%OB=g3<09uD6OZUjdvqD;5p`>;}r@D2M}_b>79eS7kt z@A=N_s9E9gF7|+%=@U1i4}2%parj*H@V43RD_&nScbSW(mPNal*;kfmMbMBp!PVlM zlarHOZU$g^qf`z4!&K|t#*aFB`gi&zZX~=e=x`wyHDYyzVQT~{c(_rU0Unn^R+s?ipM)$)ZT|024fJLN+xcg?<)7Rx;j}?B7YwKc)JhRFkP6*u8-r`1JVg!tLWt zcDYyZZO4ou{$~jerephs9{c(s{)yZh;1_%f{!+jJ`K2$t9cxoEa;K%`!ks<`A8|s^ zDP}YRdWdNVSg^u$9Krq;T#3d77kw}Q2iSeTQZ&_={)4((sx;=RLD5wm&#E)vJr0@2 z!1NKm$25)I5LD+H<+3|QiPr)8r%Rz@BqQYNt{oHut>l^Y^jqwnpML*4RgK*cu$wdV z`7NYIqIZA~m!&=FJjUTWVwF9b9oUF9I|6?StT~Lgf@EeBSc|Yb3T1MWy2f$u`JTWc4N{+r+4#7vXRaJl!43^?2#T=MXQk&ilt_dX&2(< zynbd$4@35}{e8VmPq0!C!53s7bLjkKRsKSit+Sn=^!wLq*K1^v;!TRBR=*&t%RVN{ z`SKS6w!n9Smi1e3S0V@g7mx#6Y(8Nby=C0Jhe^S4y>;Bi675;TA~BIPW4nEqleTvw z@Hkk7{&U7sdrr1d64^?7Z2?ry!dhG57v#D2l3_Pr;_30X_>1lPv|a*fSDjZEt7sQg z7u9)iA+=JS`o7(bYTsjDqbQ!&X8S?OGB52EGCvOU_F5$1YKgXk({kj)EFE9z^_p{5 z!7dk^!?e9}eCf-p7gpha=j>tq{cB5&7LhvzyRr6u{qR{S?xPs*_wE2~&PWePkAWZg z0;@ycr5GWGc^ZTjx^o8C4}cA;0UlboS^_7_JpiLRtPXK%ZVzB|o4D3D#Nx4V+(7y! zJMP1&p3yC@;F)t~I9Dza(pt3CdPy;>hOE1O%PCff(>_c#Yxz5xZoq1Dk&KVAMF3B<}(V*)%?W&D?<>yPfcc==!B%SX#ln}?5Yj$M0 zM5}PmO4X{HG`?w`+ZI=HJuzYZ$&F?%o2H$# zz(7&YY1T>2x_u*QlDMKMN7}lkY$z7|YI^$!94_gZT#o=oaDY2&Slw%844gsD%)Pzw z(ps4;$DP5ivL{;6^Z!k{04>_Ezn4B)OX0aIS&F`qG_Fi*${}wpkMCXzbI2f8UMY)Y zuu=;DULFy&%wDPbY!AGbKL%5>=dwLeJCZk+k_ zgTnVdntdDP;cSp~X&tPlv#77w+97KI!OG0F2rCkW8mii7-6@dA!YW@w?QMg7#dKDC z8SY>jp4I>54JA;mkwdCyl*9SCX1`o4Dx@0V<_ftS7?xK&w7MY6ZcS62T3OZA|7&|t zt@c)2TmH|who~8v%`>|@>qn{Km5$BVY93iuH9|Da@zxgVTP2IittHIGR9j7z80D=6 zaQ|JED1~}xf;;m2_iTjWMv?wRvt(JJrJkAJI&#vjgyG!bf~_gBzLtI;N9T#&n9oD-Cc4!zKABi1efKl3VaeV_|{ReslSSLM2=ZuPVym z4C;q714X$SE>)CDL2t+pEkBml_(Nae5InD)Z4^n9{Q~h43NEMsCksO28C9!d$f5)I zcCg!aRTEv}OPYFbfO@nm%Ux8I!M&;`)NjU05W7)@{k$hlw1gcCH{6(f{Jlb#*F-qH zo(IRJ6wb2Hr8Y~K-XvWR#%{czn`Y_{1hTwm94aG2mQPQ>qN$RUM;CZtWTf!LE3{mI z6Mk59$sM29r_n_f=&}eh?`#gwjE5X)ejJIvcS&0y+92xe2=gy(6FExzkBSuh_ElEz z7Y`X749;RUL_apPg6u52zaX0Oa`br+nM=6vd zh3g!cHeCwN3J8Yrkw|uJ1#Bgr4#0DNpTD5g6x;hiO7$1Kc@O^I zw+9zO=hIECTG%Kwwf`vvtiu-YtC>xHV;wCoFB!5!Lf zOkv(sUz-eKsT_5R#!_rafUd{O+OlPY5j^pB5Zq=V`UbCP%Z|W?*I)Lkw>xa@rK=~k z*F>9O5%<8N-Mqv)oh&VPqeY!$f?!$Su$?@*9R+{}@pG`cEzXWIL%3XxPD+dvmwER1 zzd%rMS@2~B5bKAdm&ZPq>|dH9uSGD;bn_mdJTDmYk)qXHoZm{%S= zO$0)GRI#yKGCFo$MR^K-yXXmG0p-lX?+4Hsg!^KFn@C-_(^9f>vlY#iaVR49v=T>3 zCi=g(vukaCGYebh-EX8lx^E=}{2#`E%)b3Ve#iDKJ&$01=L9|DIA&bvJ1JhhRTYaI z3UqyR0h7xXKq>MxdpKDi;U$!YB4IB!^z~yr4Cb?Ho(U}&N{LQ6}2aT$&@Ua z=#oB8UC^K7FdhLp9l>}mkG{7txgZPewWzkqe>sJ?;@k-*c@?YE(*bUP#Et=z#?e;w z*WVq}lxP=pb+?0ZV!Gw=>xOoZcD}o7-+gZt6Nowr-l!|pdjV)E+ZSX7SLBCrMcjy^b!CE3>b+UH7lIEwjMjNik%`A2h*()brVxu+8}|m$Bxj;1 z_*fpXv<$7#lDuy^y}~hzt+$`WmP1G@vD`E=+jL9l`de3cN50sAixQsH4qoo?ywMa7 zpV=6vabN8)n;s&?xj@kAO*mrm5*>~$qXQkal@6U?epj}+IT!iX_}??ZY0GY2OkIP>7VD=d+?$0 zb}+CSU24BFX7!~uUzx=nqz(|I&2^8?pM8Ra>2v$BnI{53Xt`?_FEiur^7%4@fLnWi zn!@qz#~=5dPHgHiD44-FN(|7fjGXXXg*i`?vH(o6qUZ=X^JOi zTRtE?8(F47JKn;CwS}^Mk9Lx_M^sEpU_?2HNfsd`Q#%Kzb16Yy%^%ELIMxwrSdB9W zvqnmli}?ebmFHVCW>v`c(g`K@mwAo-Tmg3Xp+f)#Q4SxL0kq_es^*BV?PJFjjVfDx zg=z{v?{BG=EWn0Un{ltQ=)s0nma#KDn7{C%Vyo&HH0;gQeB%CwDqCt6BzFGvlzAd& z=$P0A)kMm2>wud9Bodrx3~<%|>ycPQ^*=Tyn={6wAGX)!BdlpQm;@M-!*1*}&whUF zMPkaD?P{96ZEKoqYqFUm&bqd#ypyWLvWQCGshC+Fsq>ET!#3@omKlYyzZRyM_klOU z{%{|)@_RWz?B!{ZTN7}c&(j>De5wGKv~k5UrhQcSLdUMTv2hkx(rTsLF%0>j^!1{) zvZNKX0UMW#ysX)=a}2z@kMVJOe_tnbtD+EX@H>38%DimUp>u~3KK-r*kzNMt9+|FM zh8gm(MXMpRkXZF3CJ>{-Tfdl4LJBcV0?%a7^f+hJTZd&L*LGE+ z^ezK=GJXvO9$E!!=|YrQwm@QG6-G2TL#Ekq!Pt&twjzLuXx$QajzzhG{aa7vxNC-0 zw0G^IWd@5?R@}T?!>Z*+WmT2`aGdRqR}{xMis=?d4M(YXRiWk|;t+tncT_ro9dU-a zFj3aXc^UUXFjh;79_{CtiD2$^0W%S?znw1|UY&r}E0^JuK11#(pqVcvRAEf&V2KUV z5t*h#XN#WeA~rM3`xR2KbsVyys(IfcL%h=DQP4? z8^BlKxfcAhZT4aywwOi%hi;P0m>$mOkM1|{vl$rM@X>u)WIK5SpVf!$S^9A10G^v% z08U2ciO9oEpM|+YYl*cR)uG-;zg-qA@I1A4og3Rv=j*a8o=0Z*)&Y%b)%01NTEm8EkV;k^SnoUhb)^yW$>l(dF z23|2`qL?d$R1Bk{Vh3dSX7U_`DQ6Kv=%>f6!+)r&dbJ3X$0fRDgY+SuUva5rDT->F zwL%c6o?!`eL!bXX=`rbP=|`mx;SSB&V~6!7crwd6;q3$}m=_naqMa^jW3x#{nIUU8 z8T5HpXSc_iD)YQBxMznYJi-lx<`4g~8d%j@-38A_mlc!R*oeWfojUk5AZLuSQ7)Mk zLj$6ix=dgU+NPyp6JAwUkp6`=h2SvAayN%@{#*tE8lD;iPTjOs1uRJFR(ubvN!7M= z;#sop)>XL+!(jr=O}(iQ!>~%40#+1^iF}?K02u)bbaMS+k?kdzHapWb)WpUVa$fT$ zDsQRDX`||<)PijJ8hryk->Jg@Vu+nTOZ6tZ+Iwt{x&y4V{iXV8T-U61#HeVv0b zHeW?}R2aCpji^BMUl-ue{*N5La+b{QCRuC4Jef@_?Yyd<*I+hG5Mx)k+TDR3r3rTTwOOtv51L~2{ewqz4W4AnhZOyb2Z$f_XW1sx$P9{!E$+gx*nSShE^Xk`HgL4 zo%VoHXsWgYqa7wg+W+_~VOS`apPkTL03pGhtl)SwgRAGt^X0FPYoM}iTw}>a%_B_# z7GJ7KT^?r|dsYwuw;zXH7oW}GdsiOuz9BsSB0_jMpS^?_6PMX&JKsNJRwlb>!eM5C zV26%z-wYdb!*C4v@7LS1vVy@!-Sa9@91?qpBjCHa7U-Iee`vIeZJCrs?j*tARqB>IopLur(>mCgE4-t7 zo~6WNZFJBN@Y!sgx6eA3!}G^2om-$ZuECSRq20R+%&C~~A#$8v)Ap-xEoYjJhS5%Fdnz~o; zap#9u*i$u=XdgR9NR22pLVkO4Azj66!YVJ=|^~ptYZ3z7#|01&aakBPhYoiZGk9v~VjQR&sBG-a~mxJjFwi0>EX1 z^^Fgv(>~?EmOUq$4{LjXq~V~hvp$$rY0_{l8Z z1h9YycXzMvPUX)I=TP{`uFG+~eT;Q1m`0(rD{VWIAQcK9kkgmBUjL&ApV!WHrrVUWqRb&{TEy0pF-+sKT8xyxbaU4SM&&ZmbdA6Z1wXP8 zzrmM=Y~+M$b|1cgy}T|wtg13qui*JT_u%o0P89*xmUNU!uXV!u-e9krkiYD#V|%(D z-*>&=)W1w@L(YQ5`ew&)zcR&A*Hl9nfm5lhsuAeJgT%pR#azNnUL~Cw$KM2R9MczA zDqIk-{H|(l4F43|iHQ&a%TKFf^ggJv%uZ?lIG9i~Y(J8Ib`lezv}-|CbEBdGOC|lU#+qA#dyVFLXgE% zJB95Af95D1q~B&V=qaXhXjP{2;i#|NGh;OXZ}b$R?$%@?A0Au#LErfFL8JP(iy|+k z8%&1tuL%3)#7OQf0LLiR;~+Qr7b&Dy0@*Q-+J%CB)O6$krHPcW2b#(LxOhuc$V16N zwnQ||-~b@*yA9C*Yh@iBSTh3kQB}aDo4ZvL&?r;8$Kb38kQe0$wWIP^^4U`5V@+4&Uxxnv7g$HUc?1$Sg&}NHq_{tNe-%3Nwz)Kh0b=L+ixe z<#=rVVd>IAWAmZ|DwY;Hh*^+>D8AX9L{Yt&XBvDvMK2FwcIEykB+pTOHQz!Ib=7>H zuF4&#mvXmay%Mc*iZS@cL=1jEUKV2TjXWl1OOTp2WqynJOhm1aS0^Ly0$%lvDB^DF z4I$zV&v6>~y03na=Ed4s^aJL>0?9sLxF5Q|W4h@>-;sy#zn5(@^YpV*W^1|* zYJnHrWV?FanT@nB(;XgaujYr^GbT=$gxLEB4zX+Mlo)$zE|m`yTz@}yhsWT$u|h1% zq!mTOa4~!txkOEBVsu@9DmA?RP*=3Ds40%C*_NiO#4A=@-Lhp_bkLO-|Tl%bj zHbu6GxJ_g>&EDZVdsnZB^Oejec&~u>eB?LIsPK0n)tmW#W#N-~>h;zHnD5(nf3C;J zWtIjVk9-T1`MYWU;bg=cNV6LU5>?cHco1zf)U!uf-lwQ(gF9WY7zxRb2^gI`0)3A! zdM`z=XzI83r4MEMOvOldR@qF6aHo3XJ~6!f3I>jErs97j2DLMGEA9*3!d2Jue(2L~ zLcEBL!-%oEc{KP00U^Xf-Pj8Sfh~l*=;j0+MurV=v8ci|1YFA09zmHonA{Py{T3qH z0!O`gr;%*nvbRMsY`-nbB{sO0W1q^{ky3W=XPw#2=h>R-bZFnIseC;T2QhFR;c+Ez zeEw*EWTqI!l4vKGQURZ{W`rzxwKK z;CFW62g&`w2-I1()GhB;{qAnbua4l27&r8#Ik4ZBfiI3p+nAFv$-6NW?b%=moZB_* zTP%zXKUWO7khdzuV$`L1y@CWq&rQLGO zi=%vo+>KchevmKi9KJlt`0}K5R=WF6xpNFmjCJFulbnjsvCzz3%kT&uAv zPUo-(U2epiN8*JKgdGD1VC)#mYXa;Cm9MvFA#r00gNt@#Uge#AqTmAIzj)B-H_-c; zhwsMV@!b!zRu5Ox(DGI6HJ{2htWI<;jZI7kWIv1h88wY^=fOwRLY^i5Eutz@K~?o9 z_FwbJ^S-7=yaj4r*)P%!&-@6xqGsaG_*YpUaGpiiq#>{Dl=t9$*MvW!MBh9f>CSau zep^xU08@+~o8rre>#sHN8Sg=D7RP?a&C-DCRbJQzcdJI*(uT2A>!-nB_=f(?5~0N+ zeLOW<&qNVnwS*C279%bv5nwou1-8+Yy*VDkw%-*8xXY!|L_B)~^9N_fv*rEd0O;w7 z==L=+p3R}}aO{ZSGQID7JPO8cg4Xna_9t_tLK4{?^PyY&ugc`Ep-fr!h?T_vv+%X&yWaU#hH7^6QonJ=IDc%D@4KjW_a4yFf{q=d+r)`23)o zU^qzXBf^NJ4IjY3x5#B49`gSN+aN=CwU%0o53?)rv%Gm^UC>{p@s`ztV`8toH!u{F|eksPKW)l z-)qxh*dB($Ip!Z=tRgOCQj-s(sx++s!H$2<4JyTVvje!I0M5QtsooY5uMXy=ka6YoFqP&Sg zKM!MtwgH3oh72gc{6G}0ToIA@ySfL!`MP2f^Q=1o;G5qok49y?**rQL34R6caM%W) z{UPaT={>V3u0%zO+k?|`4_Sj*B`)cqNyTjvF!jRzkclJOhU>#VuQ7}hd$_~+3C*u@ z>c7@999=b3MOTSqwY-9+D^#^y6<$pH94T5Q0!A+hyeFD)r|uY@*OMuA995r0^IMwf z7#hJHI;LgoR8xp8>xOP`t*&m3HaF2wb8T8bqNqBZQ`mfncyC_1pY3g$H45E9AD3E@ z7T7IJj+$#Azrk&oLfe!he(Z@n>dILb4Fk@iNQ}`)B*%-gOH>(*7qDn--BhVlbSNVR zCAw-;Q!@&t?$Cj(8o+QKm;({lQcE?6r|PCLNfzu5AJ2_`oZs227=b)u@v* z5lIcz))`I91AiZuC@B$E4 zlR>=&)Y5?KWt%Fh$>^7bmIR~sa`A={r?oST^gM@k+_CBspmL2=M~@r z>!eQ{`@@9yw#Rr6zB}T*VV?r~f!-Mc5B4)<%GOw~ zBX;npSN4E}6_0*y-T`8Iwrp7%mP0o`p%^F=67DM%xCx-VvskMYed7CJSn|lXuU$*o z?=LJJr=rfu>07{AF&X{A$SBr|=9w+vPu;NfnOu0d)19C1cIKtYJrL*inZs!Z!~T%z z-H`T~trH6Uk0z(&=ayQnrDMnL@qOZz!Vq5kVr>ns!1c*__OB~;#Tkv}=R4iGxlY{~ zITd?M-duoje{43abbDQnhfijmTrj1zpYp&CjJ}LDOoCwoJA%HuD}w$p7079MR5cu5 zvsJn2tJE?T7%EMb$szBEcWkLSfx};b;8#uGv}nPE@wPPGvo%hA%d&~0$%E0T*&I26 zgX=XBUS*I57kH1JJbtEn80>F{_M(j)Xc~#562jFCtI7(QW{G~(Yk6Ml$nxgq^5WtN zS7gK4wx>T@S^~UI7e-FmUIODUS&!m#w#DksotlE52swAlf=M$kVEdK?Jbr`$yXOUa z6;d)|^X*3$H#`yU?~E1~N3B-j^yxz3bZnkE&M02@E;0DJ;2UG)wJ_MRF+v>X&6#R&3349nI437i{P=pmTguEIuY&%S`@%4cw+^MAx?a zg@UTvk$v3+g|Zu+N3<5^$dl5$r59(<5>N(hHc@mz%rW+om)GTpyFgUJ9O8eEVWJ-9 zLF0ZMu6Ho=nSFmXn4J2GOgu%^fYU%IQq@~fsqGaEU^I|p#&0U1K^@oAY(;*!>3PiL z1~m#sjzj6hwEA}{m?2~X$evAl>cCavus6U;gXQyU^{8=M0j6r`zvv;ZQV6uIQB zTGtxTT-J2G-**ZMV{vYGR2ZM1lP-b>_EG7j>0JKTzSX9@IbM&p9A1&!+(HMg+jI!l>3^i~MBoEk4$WV@K2#dNRN*cxrY|H!`120RImRXa>Al48dmYE7U9$bRlkqo|rgR=nroKM)$_EcDl~W~( zWd%nE#$-Yw-II&ncQT_>PK1%ESyU-Sh>hcQisb>n1-!y2n*lfL&rovv;C7L@Y>g(H zdwhjmFBFtXEtf@Z7aTZrC6%&r4^JiRIC!_-6)^xDDrWOK8gj^E69 zI$s^9L5D0kF8toPlVfrT6S*~e{XS08yfMC)^|!rq-krkH+#^50@D9c=Y=d*YFXLu} z47%w_PMROB9UKPh>>P0JlT+3Y^7(NJn!1O9UYt|bSjRFkNT6bF=*R-)$=WS7dyZjF~860dn41YMP?)D z`0+K&t+f8t6rP{L4&1|tA_|u-WrBuH#7i9YJ+F>F(bNviYFvmVKKP z3I$^O6}ONxF&m9?dGx@70?6nqH5lTc*)+CCL--kOOJjO+mGx(Mkgr-O%M^PL`ScISYQ_gVM*PU!AsQ z((5Zp`LtpW~6@+M_R%BgZ+m3k?BkS8?#4V$0`*t^zON6 z?5TodZ)iM34c8`O)OWrFH#;++dk~#*K$gg^2k#@nrmTwQPQjrN%a{~k|L8yy2Z;A6 zW+=baHQ>9@SZ09%7Tp7LVi*D=u8hZe|>UYo)k+x)>S=q;`&>|us2}N9qTLt z?9A4L!zgewmX2d6ELN{s8e=vMgUSW3kcriQ1jM<)VyPaCv$m`nwgG6Xt|^0Gq>fta z-dnUR8ZJx$WG>UUOv^W9;}9C%1RQ%y16FegsEWc!T;E0dJt+Oy4~cphFWLkWRfG1r zvY$)xmWX#B%VsFP1RN);x@?$=34WospcsIep;8Yfd(N`Qfyft(PMj$0=dB2~56?YA zuX^8ANJJm!P?)R%&vKr>1pY<2jb0don{f(Xb7@-iJMr#WgiIm(=)jTqGvh=36Sk_(G!vmPI|%dJfP4O zixUna-!r=&y(tZN+W77C_EX?)e01>rtia4QLNW!L>8PSAT9 zUt|+oK-q)Fj}u#1MoW^|vI9S(!5}+v)l44clh|EiKh0e^m_^mgrnRuOuE}Y;CwnS0 zv~+Ezp|zJ`zR{w){+4w)awp8&`sq<($MT#7jFUVny=%%y-@yt&W+8;>>l3nYX)`n8 ztweA|+9%gTxR?o|Y=fr$86If#xEK@J;9zS3k??945;3L<^EAmWneJI>S*ayZh@{ni!xRAljQeY;<$HMyJ z;zlD2T!F!MlpK{j;HVI0RZG}|Hw2A+Mv{uWZ+lSWo!bZHXd9any;9+IIQAZ2ZLn=I z2mj6Q8}{hNjT^6b;-A~eS%=i)Tk!TPS8iM(dZ)A7DdX<8GTsUYw%cv5Blb6SSe?`@ zNs5@Avv*vC9T`8&Y#s%9Hs!Ls<-&x$rwjRk=T2Y9C1z?o3JU_)V8>_#+zMJ9j;)0MF|A zy{>APqY}3#GY`&rUI*9X+<12g-+C17RuSJ2swWR*&x#MPM^Bydz?5J3-pHM3zfHO^ zs2vw=nq---hWVQ6(gxFrX>WryqFh zI1X(FsC@Q8TnLS~vfgIq+{kBmIo@E7Cuf{zvIwNq;K+2jWB( z$8_A-h&30Hez^4&S08m`XI5mRLa`kAU}q4*_4Hnt29)oK?BcGt9`2Bg{%oD-tcoN2 z0nPjYenTa>0MiBj3a+_WWQ+X;wpZa5*Vy28d);liRn_?)b=ltx*`J7jz{8n489#iP z0=x(ud}VYI`?iSCvTqP!Lty?kkkhKOeVTPkTdLxcCm3HgmYa~z;fFOs4TaQ90^V{?;MWuVOO5lpOEAFm$96*%ETe)QcSx*Rsqd}%z~w|usqgjT*pLX5t!&kYrAPVbpmFr zMvI5%RbpDzVr5~wRa;c4Lv#(OQE?Sn^$lyWzP>m&zdUDoh9ZYMhqTZI3!&()*B968 z<@s8{Efz3>?JR_H$?_c<7HZ7*B+1^u0lcD^qrH&o?PY*>6DC6&iy3j2F7k?nL#!}X z4L7S{wT~IynjsAl4jPH;v)~OFV-A-eTF}7tP{=Qy_9?aH;$sDexVniNwJ==|^T8~A%B^wn?hmy4rFM;?uO9h{IZV1)bs=kDFZB)P8pu)1|`y`SCHRn;#yt zu6Lbt?(3X;&-tAIbjwbGxCFh7lagpD2-buhewVbDa+ns-x8q8JQ`Vvx7oeAZ<4*<6 z*MJbJFsQabIx(3dPf|uWS9KtrGq4v3eu%cSo6yf6tY2fwIov;|us>yVQceyY6wJK( zy>omg(@9o1PqPBEI24Gr*+>tBw=|@=$Eg=V!DuRg>in(bgZS}($Z;fqB;C4dB1M7+ zoAYzg)Nvkq+tSbP7V&9UIEH*5^^M?W<){id_A!xZA!@mPLjwE;L#=`FEYM{6y23kc z`=n%_R?<8!+q|K=eEuHomSfUDdZ+XO=~L2k(l1EACjGATN7A23|GV_p1mqhautAK2 zHfFY0HNFsuS}k^r?G8d5bohvjV`(2Xzdi=2#n3B8aZ?RJBpBI$O5SLrf9Dp4^mjQL zX1vx#)NdGFWdvN=?1;;F%(Z)H?pxUzHG<)LmB5aNZxblHVqe~B$9zGQpTIt%1KqNW zzwo8D+F#=|;DIn4;w?Pi#arcQi>C%mk4YzmdiyX7qJSAu#Uxe$L%V6)rpkBCN@QH` z;*xHGwGE@H4kcrKOe;kprD0UkFx4pmdq272Tklt)m}Clyp$^4pm=l`EpbH~%$+sC} zzojzG)3SRS!&etjE7eP-2}&nQrT>{Jng%K+m7(BO&1*B;FUbVToKoF1l>e47O)p%( zi+K*bB)w@~pb?Yk#@QUXNG)AUiP1G{PcRC$1~PhH2mvmk5VVC6;yOTFHK%QFn6~?e zul@*XTB&@`flR293&kIi=r4_2Zw-s|tbl1w*5sEt-Z=W=-6OqSdNR=g5??f7bcVw4 z?4b%!0hOiQ)Y=^ZSi7}>V2#4h07fn?TJLl8LV;bVR$@M+38>E~7T8yyFH~BU^zTT% zd!GwExb3@*)rRMJn&KF7qY)d9dQW;9v=UEMv-4e$t8ZDO?-9FKWvaR={3&qv=lx|L zv^jW%u4w7WSW&+p&cpDD=h-QImv0G-Dd{z^N_MzRo|Zl;eO~&q^fitXiVYG5>Ma36 zTtUoB7sqFg^ob1^6(r~axgr(u4DP6@chpehIN1m_0fIY8cw=ofv3QcURR_1Ud%g*PZfpM|I(h zWtJ-j=;7fk`YITevI&~)F{o3h0gIOT6!UN~7W7QVF+owEQazn%j^ij)(`0rxuY*hj z{gJU#xMNzLxI|Si1RWd~l0D1Bx@VZjMd9p$u01`e>lCyRv<5*(p}Iaf4a%QP6;MM> zMO-2wzowXQPNDaMiUE2zvup#E@Hq{&Zo@%DP3G+~=6axnKn-EE%F{#|CbS;MG@gOF zPl&ie8T$Z{p~rxhK&Wo%%6wA9**G>K&4KQMcs4Ol<8q9rDDNiF5~0@XZ=vGChc6hk zc!{N%odk#oiXQv=b%W@#jXuI31~tpJ^namSN?DO(f8fC~C+sHcAuazw4vKN$1?Q^-|l?W_cEvIf?^)h4u4Phx_4nOi{8yMfh;=;Dd2J}C-OS}I^*bKV z3EE#|JV|9SSL7i)d@j8ipAv~BQ-0F2#@XstN_3cV#`6xf1^vfh;FmR_XYu}oqwMw) zI5$EwLK99zeTct{B)@8 zGpzDLTv90*07yW$zt8eKHS+muq`M}qOJ{gy`vb}940Do~OPm&$sNJ1HIsGr=2>tdj zS9!5GysT_uX@3YM_efeuUl`B8y9=x$>swe{pVLfJ`@N*B3gv?JYyjM4%?>H{NUOh* zloB!)wnW?Ht#JxF`xteu1Ckt>Y4h~3*+LD=sQ>VXIcJ~dO%~ejLp)niNL5`P%3}1d zL>sR8oBf3LGB)i6Y|*m(clM=668q9{eLKQ2yGQuS`0Ydzk*bKstF5 zK;!wWq6;Q6Vv`QYNQ4coWL8CbGrGW*k)~3d+pV~_#gU`2#fllMgfz@iBaBW#RH%*6 z8u<2x9T~0zR)cN;Ws{|ElqP{v-3YF#>|7MM-Uj*yDz@yK-!OgIR+R68O+p;g^KF~? z#uMc@EU*7wR zuM$HxgFuHN{XQ7L^&l{1+-ViCFpQzZt0N zK(#;pY5Sf&b8(o{f_nlUODo2#vh;0`#~R1#6EX+|U{#XFc;h76EogAz_=-!+SxTgD z5U>oNd4?&J+(*chpqVQ?QQklS4gDG1d*)k22IFu`WdRKNeL~45y64b7@MX%|l>6zh zdzhM!p(_c_keItjdj8y=h!Yk8|@JEOJA)1_D|3yUFsC zs($Lc6;6d#wx+Sd*EA3}_lKm9k6CdUhr`h+Kwb+(;>}!&ViKYw&|%;f-U{=aR$(@y z&ha>tbd&4RnS@#3C}Ed6j%I+CYaR2Vf?#wDL}lXS1Y@C(rz}fmd>A)z?%R*NV9(Sq z!H}t`>9U)8Rj~cQDW=)F1Kiy&Ew`O%C%f%!*fs`@cEwoIoIC6W|U4__O|n? zKY!EgU$LO*&AnGL;P9sp69QHD2?6_;Yq?&9c6&uykWON3V32dqdEXLnB~emrQ9e7D zrEQ9mDxa-XZi&0pbbSeikdmG1-pZ3;C?=Y??JIx4e{kuCpL~H7?u3fEEbh{kTzSWZ z7`*3OLvQs8FM%^f-hzy`oTMz7YN5or6B6g5qfL|j3^#JooJ^-1x1eRhXMLLwACD%~ zsz{SUzQNQa0V|#*(@fk)_*IqElw1tF0u-;ZZzMa}%kwv@`5J}~x>a1n1okk2u*c^{ zJMGQ7%C1tCK1{$&RJ2DZ;XO*5(s#atDkLC^^1*jfnzVQEuGYbC>xWp&`OzV_;CuL9|-(q-w#r7uW7EB%7>OMIS~`+}j( zB6ydRJ#jByC%WQBL-F(wVr$ zCvp4mycT!VR>*OUX_Jt*(l)UwCwsWO0PUmT1@x=`85CmS?Z$F}sb?VGpez0zc< zG}*+>v0AeRfA=Xv&pffR!!<$xKH!yW5}dXsv#0M(%gPXpTE^zjYf`zOK-1S^f!X%FjXlbemo! z_~}6Hc0cAdpIA8mM4!wsHjp*?O~zi3RmxUYwzq?y`I%s4CHM^dmyF%GhP#OvH$j>x zKGk%zNZ9COCm~m5TxRTRtGvdYB;V$W26u0|T`x@sBN>Ehb9%h8RyujsS#6sW@Q>8E zGZxoRHctEVvmwPS3{$8D;A3stT3ZRt^2vt-xW8jetO$Cge-HH9JahPPyE-XP%hw}! zFJG4VP<3&AX_AIVY9fI=eva={I}xc>nhSW-LbEccE!E_BVQqOzZYP=KSr^D|%M*(Q ze~Sre2D9hwmmkJefShEM6A&u`EmuLgOL7M4>ixd%&39K@j@ei}8r=W+uo)8gelrZ4 zMB|QQTvb1Ne{giQVLGkV?!2e_4-7)Mr^0Vc=}6?#I8ZKvrUT>vpE{WLr@6IIPBL6nI`ZsKh9+tv)8Q7e0He*|c$*(e|vV*(vMf z#`SAlFkRA1HqIy74Jfk%HionFei?V5bpBml~M3tTCJ`sV#Le-we+f$djlgBeZt?4`=z*{@kesQ4~}ipATNU z`w8;Ha25RGZy`5>Io@S|jVFbJVF^!#==g;QVjbc2wG|D5#*t=3{h11u&wQ7$ip40dwwcv4 zRTJ0dD6=Xm)0NmQo4PZ3_oSnnWjAK()k?D>muEY3aZ;!0(%)v7*-*w8K&P!km(TMc zs+1t6J}BQ73=amF$hrkeI!pbH6TWn*&MlENam~Kg_PSWy6Ec7D7C0rfBun2L!Erht zw!-~1~RY>QLkq+)R9ew(FhA$xfZL zbLaUssr3D-PtNxV{9N?ybI;oT#aAkmlNJ1@FiQ_~ix6y=D!*6>{nyy&b+Hq3x7QQ8i$bSZE8a~oQC+|ljQqZ*}K@jSl&Iy z)X$w)*bqPSy7e3q{~X`l&r}@)47T?aX6!vD{QO8Z_jFW}<~z7j6NARD!3GB$((i<5 z6*SQ;XcG@LT;ajxovjVhzO4A_WK*+EN}HNz$X3Zw=!~W@$9H5+2j#cq*RUO|ZhOf;$%sk()e3!nJmW}2+R9}JHKCAk}wB090BJ|meqpcG}#VSvE zm5(Eya1-l0X6xi`8C&Zy)cs=wy?#ZTh(fIr^~J<020Ki2rxm5<>P&{(>FbOcu4&5p zj30W?6flU%a>|{uV?zB^i0noFvpKXP~m_YANoNU1|gij1hBbXBKFX$ZLNM{H;N~ngH2jjw;Mv)k=Qz z6eOgxfS3$q^5P^>HAP-9+{#6!vx^n?cgYVR;?B8qj8XRf>Y8_s(sSNgaqiT{sP5r$ zJmOxO@Ci)lDjYUrJPa$nlN37->}1pyLR+Hc5J4{^h64U0G?7Bc$j`HyJLwTcgXXU> z%VIjgd1Kve)>!P$s0xrMQzcZCvM&7OnPRJ+qZky1;jIS-U5YYIV>2H11Ji@XQpnm&9#d&v&BXn#@pTf1B zlV~AvqX-vVBkpS^rYbb3Sjj4_ii2EHUVUyhVV!StIe=Jr!Qg(ov$je$p~ZCC@Tz2u zSG+fwyF+hRG=9HT1!djREtwHx&D7vWrc{T2a>r0KT$!T^)d;;Um+UXQN?8pRPa&#o z>QhuUWM;^^Qqe#Pz_e0pTB@#_xF|&tCIUNO52M3X#g%Dwv)B2Dwrptd2pA3WCQ+bD z>eyGy=&rJ=$eIDqF^&9rF8_a8)u|dN@J-Jq%rzZmQA3p(6oZBk&hF}VT|pOHSp~h) zRH><&x(@fq#HQu>;(RvdsC;;|_EjPwA4EE7x3*Ba&`*k7JHq)S!ko&L8DYXEE9mgI zE|TiHaxq@%JqkfUI)j<8!^%^>rh}a&s{t5Xw4#_gg=Xo342WvLXi7Y4P>jna?uq;F zC|0{!hQ7c=Hoy)i)vq(zRPmiq0D-J3#HWg?7>q?ST~IVlS)g*nm~VS?E9(4kdwb6a z$GpCAdmEPo(a8x|7cSJ;rzK4gy0(h8rowNcbcyCB26rJ8o=BIQ0i+;-XQ6B?n{uxs zpe$e}LdC)u9@>$k>k6W~n9!?%7-l?6$0${q0eeslm>dFIL^CG3$8KAlM1SvGAYEIv zR0=hdsti4%2+?h5$3%7_yHr*%*)T{_a~##QND0&KP}Cm`8}wS0fy|-K1sa{+ns?p# z{_#z)Ow+k=TPjO6uyp32Wv=o_z}uy}I4a=VrFTi+FMU9gHnV9WjxYj!c(1j^(^^B{ z-cq%`D#p)^j#i2J9*m(Vp-ryCwxT|6W(dDo?S$OdtcOSZLfnbsUb_?Vo5P&x=PJI! zR&EDA)VZiilm%11Tiq^it3Rx+m)F&gGR3bfsL-poB4|@x*}O6rwcze9K39diyX2^B zE+{0{lvXr{&Bm`33hUR@DX4v}p}VtZYCQRPwcD-6r>k+d8`aKO#+2G$)eYC1?Zwqv zblRPTo7;VL%CLf{R$atr-sSkSuHH6HxEDoQlxqNENki&LD~VLkN)JH)|2Wi1%un(0 zadM3i!UFapjc2YFl5KL)@?_U2TpUn^bX5&=t!NRKal94dGfHvsL-!UO+2L={@wurkoL45N-(})$rry+bd@NbV zdhJy*NmfB)ba@^}X`auqX|dMPrsaNT6Q^6yzmixuQ`kFxytMNP*$woi4}S0yJ3poe z?hmV#iaNdBH#aVsj;yTw(R)92Y2#r6RaIg%&{P1sjUUR2X60wn$V9Byu+f$P*PmkT( zq!fP+eb02@Xa&a6QzG*~Kbw4nFLHw=S*47_%-OjPQ=3e=5Y$mYUY+br64<$PMrEr^9Spcn{GM=sJ|f=2 zCp)@4K!H!T{H1cX-mb%6H^6QE0(ZI(a9fy*SO(2u0h&~=)Ce2>e2o~_?6`K^!AUBi z4aAtrD-7bzZlw@a@QEI66DKGSJdJDaD3c;qfe5lDqvF#{<%1(wFGTd+`f3D~yWzy-;khac{9q+8z{dy84P<7#qw{ATC6 zSCMTy&;l z+i$e22lLzG=-w4lDoRZ32kpIE1I@4tT7J0Z8iSVT{Cgm+*PnRSgj z0%9M2CKwFPpGo$)D`3gqvq~lFt13G^*yUFSnCye!dm23ujBMV#SciXzM?a6|D88AR z+-VKp-)X5M_p5({HUB0Xhlq7=XEk7CZ##XdIa-zYi%4?Eb=yxllY8EN-U?dg1?l}D z{l5k6=Mzu{m!&UBUz2_dO5)JA6kVrnjk^A+QNLHbztGm;U)I)!+uaE=>UB3#nm5=E z_qE6arI@tMJ>E2v7MhjB&bX#Zw08Sy_Ko-E@B03%^nPpKW&CV@eHBw?@8YJtEn4!6 zc?Gzb6E|OM)oBiLfxQs%jNkJ~Ci)clWSoyLwC-av!m^}|9PO~Ag(F-N77$KsjT^KMk9`!**Xuev6yk zG3P|=)!6=NKfR*<#XUYB(r(53uZsxNbaRG9lFQ}{k5WxuVh*29ZvSe2HU&=^zPE5Tucs5zOWYorfSzZWuQ;O@ z*V{S51?sUITiH&0<7dENN_S$OZMAq0HZTv`i}<-+H%%Xo#Lw*_GE5gg;)s}f@_Tyd z$vuwmWo_fW2R}T1>&A{uk{@QWkX}e^vwgA%1mR$jr8^wjBRL~>v~l+wdgijAVMh?S z^E!_RMv;0L{+fssWF@3X4iKs-WNMnX4?S75Emk-Vk~A;oH^f{=Cr9k>6(_iMYbR^) zSC}bio;Uoy%>DI~i%Jh5!)R;?W5bbH}8OF4=++$>4YX@_?yKH&!yCLop1NtAaI{zv}E088%I=4 zS66Mf=hqZdCAv;Y#&h!RAna{n6bde$@IXd23*?d8+{cOs8$VAR$Ad3;2D30GO4cT* zt39K;H0~i5J=WPhC@^D9*DMD4H#xcHZ zy=NM$Oj&)9YK*QhMg4-RpXR0W?35JF_PepZ|irnUH=oL~T9h|Y~ z3$IVUk6Tc$w_)pTsnGov!xtWG*U++k>bd7?(BCOf5)MwwOy;TSdt)h$^Jv5WA% zzBRCYs#f%pT1xuP3iQ`IILqBvg;xaMoJe@!$WO<39={4sX5&A;I1Hp~YM1cepp`L{ z=wpJRn8$PRwZFKBtIqh&E>2Y;peFC-`s*N?f8az!1_rfqWctLj9aA+x-M0KQc3`6C z9Og@+gqSL|waTPnT5#{m8QZ|yG}~8HO__{zo8qFK!iep`uWXoAV3jaKRdK;kg({?K z8o?dkodE&pp#r5ku)tv{vlX()XSIZdEd~kT8V?;nlVUZ`59-Ulqm3Ip(R?r&HQ=fRe%`NP&Hmt;K#?BLMi3fKK;>QA_N2z!Nvpwe&ZAsMFJ0 zzlh|Rv7%amS+%T+fssIqP@r(OVykM&j4f3OOn%#9ebHPz1;Y-I(^C|)TfuBEj2&H~ zaE2W=2}tgj=E!zP{Dz ziLlF6grZM%@YMOSm+o*){At@4E^)qHwo8QXUm(8C!{YuYL2*OCHF79rFWN5I7#xQo zar}3O6TTxtHam(I?oUYDKJ8XMB&L$KEpw^;0V)%IrM7Q3<4+vIbaVG8&) zes(QEMy(1Iw(Ugl7m8e!b8atiaNVnk_J1)4V|`KZV2ZaXSSAN>o%!HdKbt%?sB#V+ub%Q zpnAqnYO9~+>kRK7SE9M;on5*CzJ)_%>NGhFn~D&mXr~UBZd(wUG%01QJc0x?HM8(= zZ+maJd_OPb;|PvlI6y}2yr};!pY!C$cX0XS=r zzq7w=*AF;e;~_scxH(;<)grX+L?Ekh97~!M-NuF_QTh=_L`5nv_BU8-hVq zMZ9DYstnKTV5ceiALFNBU;l0fj{KsfpHM-6h9Q#?T|KE;^LhPA=4#+u7JRGAzm`V+ zw~{*E@5SQF$>K*#X@oeb!eL6f8QS!Bkq5<9^napbi{$ITJpYyRPaOE*74gw|zRE*f zMR7sx+|jJ^j^a24pI{B@@}h`18-b8O$8<8>yKukS+Hx(aKISy~{#!|Hsx4o`OZY+4 z)OTksj_0wBUULD4XM?ZgluqKUW7ng z3hJ0f#!{GX^D6<|1Eh%(NeoqhL+_0KCQv-Rq2K<$B|#>g_DMO~^NuVwD}=cIY-?kqHS4>CRGN!NNZ?yqty7(tnwgzz zHs@w%rY5SLn!xOoUwakay9)1h_)K4z#Hn<67-ar(?nsh;bZ>QL(zOZE&4p#(*=WM2 zWUwoa9Pugjj~r)n{i~f{yPY zJ~_17GDpMV&Tqn#rO6>Np%nUjVhzKYz$8pvyF2I;TAzRP(fO`QC#Q*`Dr9DoDz|~v z*t@+-Y4!FV=)4;(er2jITeNj~8~#)8d>Y}7?_XrW;#{K>G8T3kbBm8rIQzakp>O|y4AqBJ_*GflT*Xei%jYqJ|0v$f7$cYV0P0s@w^GYXxY;U}jjsd@%a z9sdumuT&~tsS>qkry6pFv5MT7nr%mwl843cvvYHEt?ugTujhPX>afN8@%ZUGaXc8V z7d3(M#JLth0`U#i5zZ7?w6;4rvwDLShSTl`akXBboxS18BWMNF67+>>XdPOtr6lsG zS~wI_3qa$q&eiAZYt88reA%tfcUD{Vdb2w-2BVdy}qp;KC`L3bNe*G%Y^ zOTqNo`ckJ=jV%uepFX~(8>gFwQaw_ene806%$1eS+-w|rFjfO6^-$B-?tn2fR-;v9ZG%?kH|E4CQDNag)!@DX~ zkQP269Az`dI1}_m#x5~ZC-eczKE+@Q`;08f^0v%AsnDkwdx|QbWHQ!`{9UyJ-WK=z zT{8BSAGz(GiT90p@BeoGBfa5wPagDc?clfD6Zd?0{QKRHoabLC;+kW>kN%5dYB-H& z;lM=CGZS79t^ZQGLl!8#LpGGpD29ATzFWj1r%3aBsFnH$yp?E|jD0Wu=byQQsQ&nu z=kHdeDgN%x<|%UU+b>=m`~EvVbH@Q6Kwkyk)|bceNyS&l$2Vd!Yg&^g z=v`MR(Pc}Skm)v~KUewjvtMxu+%u`b-QU@migSAfea1^t1ah5~<^^r@S!R}XXgnb_ zn|`a^=|QK^3p*Qq*lgvSURYdF-MhoJ9{+%A*Xmp&+cQhHAM#l-ecX6J-Cl+7abQu_em zt~U8vDb`{QOi5POeI{=FfjGWN)P0P2!5H_$I z4){9=fAc&>4^h5Z%)a>c!VQbbRVr6=dayY1+(;#EnWJU3K(~omMK-kw|J&{o~^#ODLnH++{cVk=#=#Q zP`SK66S!Lte0K8NV@l1<54O1ra8dz;+bueewc9)8i-B+j8w}>RU)+9iY!S(Xjwykp zTn71P#+Ko~TIyiTN2!L=66mCW0&-QQ?%b8kTfRraF}^y%ch!CS5Jp7I4kO z#YLZmT3J}A!zTkp34&Rjd4|hFnGBEVv$*=5$FfgIeb8<0m)?n1>jAW1pXXKwbmSgX zH;rEmg+g{J3AmmS@9B=RG?wuz+B4b!S!7JnP1`NIwy7(iumk(S81BZfjB>aZc#h)* z9~0~{g{f2_$Bq#NbA2-|kkNAO7Z3wCvehXRLo%T)wEDCV6ER>4gH&9+T+{2Xt6b}2 ziuC{<)$;ygEf4YZ*c(w-lc#zkBDopvkg?CDJFlzeCft>W4hwa7nM5!iACd0BtR6#o z-1-NAUGN2fHutP4VD4s~ww;)Rx%0`1@0O>_<>}T;sWdYgAihNa)QTV&p!s3Y4?c;I z6rcPg0%I)mL2Uc6>Oxg^p0rEJgRSZEF0Z|OrapQ8zf=_d%qRKt%O~+#)p(4=i`|NE zKbWn#M4(^vrE`f+CJbK}Kh?O;Vi?3tS=n1NVh7%C6+Z@lAxERRT1=f(@_yW_|^eMtH2qwZVR zFO(ui6G)dCtqCcv z%km}4GcRWI_xRm;?t3uwZk|YJ389IDtyv#6=P=3*jz#^Zk3ZPF0QCPzpBA z=GJ9>aQ%vUnHMO3`Uj_YH@Lw)v^RJWPRXwv(#4PT7Z2WKe{lmsxQT9KKlg`q9R4Bf z=ea4pKGJ=U&QXb&I4TGIYoyv*hgDXk2&XM9Oq;;GvX5cb6fF;d~d zB>sDqe{WrSR=RwUEJdwv^R=v)gPf|Orr^oA^Twb#YHG6nJz4^sgMVz4p^YepWf_Y6 zUb}SZ?N(`y$fikPqfo_UlpulzSS)C2-~m4^6Jp}V68C_KtRi$JZe&^9W4Trd!?*X9 z9~W9lp_*DYWG`^3X@b};K1Qs{>-rAaNAG<+Zansdzpp5ZMd?G*58qsWlpyw}7`Rc2 zfk{%>TQvp1Bq@AMJ4L@FDY)%cKNc-ueXDa=Blwfo!|a&CS>WuK$YD*V`o@S`-4Z2j zr~Q8`=^r<)U-LWZqJC$yGc;{KwyOU1rHdkY-bG`gBHQlFjBCr4iSgAdyqL5`uP}8l z73p)NHJ)o@=)?Ve7D;DwpDB{{5&gX(N}_`0fpj`~#~~6??_Mbovs*AU((*`plG~rb zO7YBY)-SJcc^&~>;qF8FFW!+%30U}kI#F5(_Ci-nG=tI0aeNo|_Ue>um>2BQOMb-t zI|gXzMjj?vKWLPZ=VGO7&V#s>$P4m_!oZ8l=php5X71a-+u~{I-kWQS8$6><27b>k zc0?>2+VY3Btlu#8XeQzz`npMWQf98#INr(WFYvP?SmA5W3ipriCiQ$7`uUr%BHFGT z_qFJxjOmkQ1oAn|fcTegqe_hjZg-k7dzam6)(o@OY)t6-VdH*i&}zf&-EOkD*>nt} z)`Vwa+Yogt;X#osVNJ}BA?+p%3BnGdvwcYUyzd}7fBi74Vyr$rJZF;79A?lK2no9N zH=$4GI?WIAEN7rkDyUAPEnAnrdYCqStNQc}2;oiDr@wT4{>Rwj55CU%k_;)fFu>qq zHFOy_ZksE%z;+cFt^ybq_iw^df2S?*T=N&n4!&rAS-$mF%JN`tZ=yV}$LVfR$ zI(Lh&bKcyz`n5wx(xG{}gNILC=jLP14D@fu_tU}Ai_xKFTuFq(Mew6Q)DNHo6!mSB zXa;4n*;jm zq_oz-t{kMR!>DO;FMXbiwAgkJBl#4`y(T{hl-i7%%s$64pn*(m#J_SN10Ox7usuY5 zRaKjr6rOtqvz=fqpeXFe4rb-?bD{*KqMv;L`pX99>f)2P8R1+b$){j?83!Gnv2 zAFuA|Ryp+d(98V4D_i;=cR7Va9>^h5dtbBkZWp~dyItLS7Bi^gaTxmDdEp|OVe{eq z6H>A@E%Vvq4A*#C?yIYE0?|4x0)JNJJlwguwK@Uqps{^syHRc|gd@ju(JbN{|FtdG zyOT&#W4i%=VSCb49DWX@m7MELm``|!Y#ilSD$5dq{!o`p9&3C7C|v9BkZ?0x3)fn` z%^~o_Es>xeMrzVQSV;|`1Q9Y2Y+fGlwgx6*tim1#5JcZV3|vBAo;7rb+Ukc}JfLk2 z%*3B1gyhTePqyYQJM_z~kj!{2bSulgy0}xLvD@$}5wW$oiDuifD&h`bsd$y8(#Rcq zxQIi3u7IjoQmpAx+%{=_b2@6d6S_@|Qpxbz(+sT7`M_OXb?}~Y+%{N!YbtDcHN%q4 zvakE?8Is(zvLY2R7ImKeEpwOW5LsxHg`(!1AeSc*MtAZ-S(Wcvrz*Wuz#zRM;KQCE z^sx<@$d7RS?p)qSuW+1(CiYyT5h{5CGX5plX#KSQKwT1X65iD`9^!2J`g&##D7dQun+G&U*BuSoQIQUe*+#EIF~uSldPY{nL!>Vy$Ky-hm(tG- zl4$VAD-g40>ED7c!S~=}cPHe)2AbBh89B>WK-Fa#9lA6Pbet}DZ|6?iTfHH~992NS zB{M)sY(JUypW&Vv=WK2+{$AvN6J5|FUwmJ;uK1B=S^q}2)_}HfZ^cQB{f$s^&pA5LoS^4amHq`)|NHCHwTu1UQK~3(Z-hdc z<%vhR;Of*3N+uMJ6WML+#jA&ljk2ec>rXQ!J56fz?v(1gDS}Z^b_^3u9%FpA9WkGn zs-^U!-BqB!#a9uZ8qdRx$oRTE&7=qjeetH7Es*gXSH$hAczBrq^QAB>ttF*)eM#6y zaY_0pw(WFIdV<7K1ZBD@y&JPH23nYn7YXu06FVzttI;|~Gr<#Zx+hk}Q}3rd$wIsp zi%<+~<{2;`2EK}93jLuc-(ITKIjBXwR+1gPIu+}VOy!B&>Ie`!d3;iq<9Vh+TUM)t z;7EAd@<|X7-{K26vJ5>k^E?LK_4E8jUm@BF!femhb=a_zx-KhkC3Z%Y@!X zKzTvofCghK3`S!Y11ntg3s!<)ax$PqK>%9Vn=0I!%?m?I{f-o4hLpajIegNNXGuW? z3Z&7`Q4u$`wpI4&BdA7gW2$RVppJZ+soxM2)q6}?pcZ=PVOncYkrtE(IqoFiVB32I zeSM`rhrYDIV=7`z3|%pTN4ql5xC4XoNtyfp_64$L=lwG?{^IoX;<0IGes0n*CgB4?lT=su|Zr+<-nx1dD{5)KBTYR72>8{P;RWH}c(C2RoF+_*0Wldej#oAU=OlO`V zS%!&RN4TvldkSH`UQt|v*bX%T&yo-LzwwxfdGczfv7oex6s?98zFh+upnrBT7nC+c z3XhkDqUfR1xe5fOL;ZLNmD?6E_L;a!MfVv|Jh>teW(sI5L4iVOm4vd>HPmX&&x~Nm zNWTL*Ynkg8DHSp1wGx6!>G-dAWD9itK$|o}Rb~b=vN!Qby{h78s9ZL@^vDpU&h z>(FvT&y$ApJkD|i&QTp>AK&RJN*@3EtE0RUQ34_lB?n{qyF(0qFar$A%K&54j!HWi zy)fj&xG&PolMg6}u>oiAI-nei&@n*{RP)0J6oe>;E7D&|KKef&TpRYuBKh6{C7jCN zm(ECU;}{^AQxc;yg!30h7iDfXQ5+>_c_fF(u-V`0r}4C#9KXAryMcz86RNhEd#EO1 zLA_mtRRUcvhuAB4uEKaWP1v{|?u6xW*BqZIy9h0+4NwX4?;W64=iN8pV%Ml@DT;+z zqGa|EaQYBfc5pOul7UgTY3cWJ(+OS^z|Xy0O@%iX^i9+YHhA{l8)9gvcYNU>A}@)^ z$`=p%{s8PZZp2|fndb(nNyk7(d00BnSB@YEiO#Qwk+H6^uoD(chPYc13&aIX93Z@(62mFDI7MZ&m(S^X+9Rt zh2h*H#*&3j)q%foYKkn6zE12;idO~ahTr^Fekj*WY>{SInOmHzgssI^IO$X;s?OBn zRH2WkaS!O5%HrG~LRds|;5vDop#XlCPj4TR;(3ol3xc-2>qQx6Y=TjBN_s2UtDh*u z>E^z>dGz8C<-H-Q(>Vbxnd47dAA*zh;^A|=1>(68ufN`fGzFHxSLPUW&!(15VCpX* zFE8k35MhQ}gD23Hbmz^YnjIh-bi`JElTZ0 zg`MT0f^AuD^Ps}B(1G2u;0}=6)`@hUcxZC(|ATVd9VfS2uW-5COt9e7F%M_ja7b(S z-)u=;x@fY+Ma3jLwx2ck9itAeRzYP4~bka|!*@dSQPHT3#lfH(fmC zhN8>{LPp!SD5AZ~9||Z9K9maTD{q>dhC3?gx!!C!{Zm=qk#))!p`taaf8iEI^^drj zM)|r_v`#PHvZU04oDkRJonVJw<{kz`ixL!-WZ`j!h;9o}rQT%O{R-8gM}dAtS23nL z96o&X7A5(IH17rBbs8Nx{@|@wLM@XmYNw~A_evj^o|Aq#8#mL{u)+c-7xpRL&QZ^EmWoXmBb*%+)_ACmWfQ7(ecv75E z6z$LHMnANEfuDV`9Df5r-LPg9s=Jdyre3+sWouoA_U-x^C-wtJIQ-vB*Ve+Yi0b zExIUwd!PIToK!MrRh06<2XD6gcXJ7k>sa5oF7^Twz;cT$!3X0KPmUgYBW=W@buBb4 zoCMqF`SE5;_HV&}9)`@KEaG4=VaQ=(B6_PD>p!CK7Dg?Wy)k+FGq);5mdOxTiUx?9 z7re<*x>aGM_}#bEW^=x`q2dd?I;AG!$lSrM5%p}}ox>I=T( z_|a_WIiAO=QvrEFWuMT?`X`u5Kl-FB|B&bXkSss>QA#u?r0*g+jtn|^7u;KxBk!kX zRYN|>*h$$?XDR6gM+hZdP3ywXk)TJia@3@2S>HRXP2FIh+s05Ns4qM;DMKL}vzLTj z98Z6EmzMlUL-aV(L^4aojWzXh?|Q7I1Jax#Sd<-WG9Q@|MLlw*mjauh9d&(@&1VSOu1fKr1ilR z4?SNA+B^h(VKjfhXf~5qIP^f;SUDS)bK(d2?q0roz&cUNP_nt4Z8%ft^MUKDE$Pps z0Q1V>x+20`^)Txq{@-#*CtXN8Q=8W&y35v&*XuzLl!KtA&$h)1+PT@Ii*6<27vR5A z*cGcunQzBmz<9zVq%emjynib-@4HFbJhADt5TOon^QHyhcrtuvn@)=_z^7{L%v#s^ z1kOkBOa|yui5tGhOsBgxGYDtZ_(&>Ua(URXLJ8t=ts;t$0kyB)^w%`OYCPcv5 z61*k-N8-R)czAMQ&MpOtU%2E2idWhe{HJ+DrK@9dX+1CfSJLlGFG>GW`nS?+#Jiq< zlo&=v(K|+QX0vQI2VcJ~8puAhki(uIxqjI5H}QU4cIo6RwAXU{kUz>mI^rSZ4np>y zezJ)8lI)$qO`U_1`2EK?tKAU5RaFCG;9C8Ge7XLi9vbSg7Y!yC~ z?ofKj$@!ed=?l^?OTQ`of%MPd z+W$=mDUpUG%^$MHtqFT(7|`;@d%6=O9)7`QXE+U9XR~#aedp-)8#pcw9{aA3=D18O zxYY4_bL?V%d0%aWz1_TY+ey`eO^}~GPYPvKs0;IX1$;4oU3=t)>z&=szE=R@nNO?o z1)08>C$|ieYQ5`4A4y?!WVtIBs_g#F{Egn(-6xiV_GGf}GzT`S^5r{;22?Z z(h+Gn8Iwi$6J`qKb49`jtAqenJjGh}?;KMv3Kf|DxEGWENDXvjt|7nrSGjskG^V^f zAIt~say#*TdF?f#^R; !AecqWWwnu>dq_2UYMO7s#;oOKS7v(^z{gR}Q$;jJQk z8MzVsi(=&`K;??#vx(HW7g5^^DE&k34bH9VbK+;WcyJCcQ||sJ!`=25^LWQEf-V(+ zR(3bfvWV!)!t6v~ZINOz&r6)}7qkoMuu@ca;k?dGX^z3Pwb3c)J(vpt(cV{)KNWSS zu;mtmJl_ER5QOpi48l>);5^AV%T-4&rUhtFZYx3!tww!)Bn@of6@kH3#3nD#g9)j`G)qI|ANY?xt z`)!-l6;94D4KsCr_X@uI1tHl3z98M=H=chQzwzt^eBXrwzoBLRofh|OJ}TWV-HUiz z{o*uUaX&?aLj-fJaG^gc`#IeM?{<86qiXR{)J zhN@cHHK^VJ6kX!2SMyR1aOzsKw!f)cFG6GgW}#m0H8{Q} zH()TOC9=AGeSSWk^+3?=fW(0ztsOu)6&X@T_`zb`$4}9Zx+YCwoYC0)$VhW3D78xY zyunZ+WQCpC<@wHGXE^ooHOz5`SsPycUg8^@b*4gT7tEAJ9;ywZrbLb9? zYmCPPDg25#7l#wp$KpA2)0+5u@Gp$#esaRvg!3D5qp{j(<4U$G$4ljFdlkKD=#b$#Z{cKS}Et0DKj_9bfRgugVEk4?G{b-qOy_ zg(7wT4+h6vMbDpPtV22xD;N<;)etl5!Pk2{xR-C@G+!of3kLJJgx|2rwJkQMXuw_A`}~-T+-dqQCC!=5|Fl5SYKR zy*VpMBA=rK))&+&DZo``p7_+|25<|3$xo6$p)zTnQWdsGRW;uwOJHsOprt%7gCUyi zh`EI1ea!>ksPR*MessXwKf9@@a_#+mJMK%*>&ja{1phJ~{yls%&d_2?uq6I+Yo`TT_zxkmP-H2fp#t5Elo${?y_rgb94?w4#v4 z{%?KhCv@fROK>j3m|KQ^uqz!0tp+nxigcwSO(iB`*n+Af;|heoVKH4t3U>h^kS*Cm5*R+JS!4t5XY(2w9}E zOJr)v@(Ds_z&C z`)DS|eGd5`T!Zt(3d9z@r@xdGi(FPWWe z^T4UK%~qs^jzJ{Dag5hsdwwOdUE;*9YdtQ@wqaWIxKPtUHeW>Z`b||LBi? z*{Qg0#rg7m8fa|3clQI+GrD31`t7HXwA8;=OV)Z3kM^)ZL?wSn zhZYEw_k$EJNFSDdMEXhTE7I4c-@axS4C*(d-5u#H#WC zulgZ+!yB$2Y4Kmn3*=f}q{C;^A{{=P25aBQ+3{c7O(s+i|J;9)3X@m&IO^w;6UdHmEM>@KgPaPe{?vXwq{nU+*V_Qk) zNley+i&ZdQAQ_&5Yjp!CLRaL zPjVSHLAQ8!UN?b%Q8&B5|LGfVuc>=gyl>}_+O)0l;Cy}PXKcy40>@x5^dtH;p!zSz z_G<@I+|4_)ahn03-GomUf3kTX=^D=+KRqUM{BYrBS>d@CA8at^JBG<$9H4SONZb@) zldZR8?_NFh?V}Eb`@Z&>Y?ki8?*@s}1Z*TNS?`*F+J96!Aq}LrLGAy6%=%4Y&|5=M z=3y&YFi#Rs)6JGvga$y;HG%yW_BK1cY`K^Z=phee-%P!fq3&-p)v)~_nTzVybz3(~ z-!{wbwjqk)_j!_aV|SaQ0@CxoZNL*(44gaVSy|W_Je9b<28yb~fJi;#vhDBe<}<^A zfq>q&v9}k9Me?rg@A-Be{_WaaozjQoaa{U7>D|y{UzDCrR^yUI+c-@{lIMU;EhCYT z3=DPPww=PGZ}zA6WtQFI;XiRt3ww!lwNQ=t0=62)n6)a4^Y1dnw0+Y6!PI#wA`nyn zd;k;ec9O|?&-U9Wjy>GWm+W%A&HIVdM6mj~-DkPWH2Q{sur3=ORZ&bJE#aYy5u#t#J}P|jN+sB>m8;aav)qN<`0;s%X|4K_HHy9zOt1=nsg z0+$d)QE3TGPIn?OmD?4QC|#K%yH9E>PGA|XJz+Stsc6RW{gN8Fea8vq1_S$Ty6;A6 z$@iU^XsYHI6SiwufwQ7L$&_EEa6>~5r8K7n@`!UZqHr~ArF@=7OY&r>>h$B>%5Wjah%a)yn zh#<0NeBg%=#AyJ-)Sz|zUHd*sYOUjQ+uMAiYa4ESaX$&^_c8bD6i14Y`k?>k(L9|> zv$NL5`OT)lO$4=TIspuCZ6-OqlT?A2TwE2GzU5PqLV_{S>Onp9tzb~Ioy(25(yEBO zey|faE;gQfyHAsN(K`3X#XReG1lE*)=~CPX;I2!!#B~XFf<}zzq%4OB*kC$HZBAMT z8(rv@JS$mmA7L5IID%y3MVA13*wF~)21rl5SD^4NPBPor<*BV0{i&RvtAdze0u!pw zmAN`dmotV6ehVn;C61dvEa~e@_UKx)p1`WE_t&=8Qwi_x7wZhC4=F9k_QF_+KER1X z?AdJYlEa?|Z6NipaBg-0l{Bc=64`NAoUNlTymcLJvW$3V5(18X) zKot7wUuC=c%d-43A;iZGd0EE%&xvncHSsQ$2%p;ZNVC<^RPIiCimdnI{+8AW<6eK$ zBb!=C7N8qCFUyZV4xdkU-ZvPO2ZM_PvPjvhe?=AkO_dQX*`4=Z_TcZ&U-n)u_zHT! zb$^V{i%9t-)+N!MDoOmK^?-&Rs6s7m4ZD!syW-nS4Y6l!b07l@7*u|qOuCb#63@=Y zm8-miKoHE!2&sboWD!zj{=|vF#e43#DCJmF8ux8llTP9~<$<2!NrqA_nI6vPi-%CK zw9R3<$GShg6FTOZX^ePm%Lw?=6%#gJ$ho*?rBQPU*fHS<$RDPNsgQxhoJin~z*4z5 z$ob0KE9MF70#C&hJz58S2r<7qjA*z{!WSU>h;NtVJc*0xe9u*(I-P-%tUb<`TPK!JD!vCSruS8d^%c>PE-8r)~ zyEIb^s|aOT4QprFlpoHP?0V#zs_YQrpl_~Mjy7(aS+q=t1i$82efSHu2bEJt_Yj%PyIt26s34|l$hB9{x_A*ce=wnbSXSfN z50S{j+sLc|V(&`%ILh<7twWE07tf@YQ*eT`J8}BK)N?q^N)XjR_h_TXE^PcGsh|y;t6Xd z!=MkTvz-SpH83dRJAGuy%EmIxXul)fBi%1OEIlf{T{;hz=X;CuP{J*`;M=p$oGiwl zfB`kq^J*bz6bJm{af5Hu6%G0)P0>Grhp%u{HH^l5GTkHUW8w^&>|YPIgPmXyY?rs; zpXk9vnp0Ur*YF}ha8l^>34dq}TGv96_C@dJt z`S=p#j(9+6tQq;3WSrBNPVlG6+g&^HpEMpTQLtIw&8(Z zV+UoteqG$vSsG4#=5;aJ&6h4N-!#uF94Byz`~2MpHF*C&X1F>`F(v^A4aywjVZ~gNZI>c?tw3fs}O^ou~M@uQ24Nj{-XR|RSbILIngpkF2BLlZD&VX$mcreVf zclS7+weK9tGc=)An6tdIQ*Ng$x6kvil<_PlI{XT^lh;I)eTv`P;fs_|c;=xxI&a~TS-g>6364{}e zHleUe|M*=Lx`8=ao=}-y*e~RFnC4!s5~`CpV}l6MtC*?Bl@Z5_yG4Qa3pNMW!#OT5 zI^T9VxCp|>r+cQWtE=bN0}Q@I10+CVAOaAYBuMS>&l!mn$>9f- zh7v`IkVH^y?j9Wz)XI`ES}yIwvs`^JG$mOOy;=*{Bd?Z_kL;t7btEsi(y>f8#AGtjHHHB3`_B@!oy9_a3Y2PFH+1t$KC$kE)h4fAW@&GdZ!) zoow3en@_h@)w;>HqOf_i8H9#o*6)>rXeF*1VNgHPEcUH1Zen9ZUuS0wG8qRDyK+g6 zge}0ymSy~Mn|nmV2(7jbwW`o=Nw;=fxJjtW@me?0UPRm7HXa(Pf`%KkF|obI+QNj~ z;WJ7{o>-`{%;}jv?~)auZ5cF$Q_L<_)w}DQo>*TUq}q6b1nq+uJ)dEH%kuYh(?Rz| z)g$np?KE`b`Ur&vP=EJ(wE07mjr+Zcsh_@9xwhlGo^CKQw=1qUN+z$!l^=d@l;|_R zdVkBC@V*AW8m0Y|bQkk?zERrIUaDnP(D2(Es7RPhr9P{SYlglV-dK&I*T4cL_Iy?` zm&z7&zo@8Ru_uXh_-!KI^MJhtmYvJusdy+m@Y((P&&PQ>r4IMh|LXPoP=lFB*hI1+ zdfqk~Ts5JS9bvh2P$#EPZyt``OIg&l>H-1pZe6Nq9>ksg6ZZW-x%&Q2hxPpg4tyQbPQNuieL({ zpAUU=nPinso@2l!|q?@tPF*U=3zlNb%x}(Unp~LdDYDe4= zAi|Vd)5-AF|EcIONx^?RigWq$hG|)*WfDi%9aLI$RiV13SQcAv=JLJFlb6qtmr>h; z*Cdmf(sMv@v+&jsD~+C}i?HBLg4VAbK_#O+JIT#L`JKyl;Mq=y=4-mmkVZns_Aqmb z%6-k)hst-E#eO`l7oK%|+mtnyx?47Fc4I@tK=Z*Wl)9dPE7MB!ACcBshTHo}o(3@9 z&>F{hx{NS7gK-*fMt{8b$$41EjIC6$EVg)ccK_q*>#n+etI&Ext%hL$#Z@Vv!4X*T z-v(>`hglnOw}~u*d;B$MssYxJCnna5ls?d&py{W_dZ=Zz))Dk_&_n<6W%>J9nTCLc zYwWsUb^VeKN}lXE&FT7LZ?QhpbSgyGbz+!_`z|*&&pID>Ks3+AWC^N*t+l4IKi+aI z=UziYKpMAmw!b_vvD`n~@jOkd+IFK}Z`eN(O->wcLziz$gzY;_ur@|(uMQnZq^lUp^j!N)n-Z#9v@vz~j>AV^ z8$v5eLwhSt=`^!1?Dw8&rZrB9Oh2wr98rD4FoDfXs}ynTLah`q1cSY41VtHSysamc zCb|tP8@QCSOZjF(iArr(mR*~w<%@mlw$6WR5S183QQ76|c9$hC*xXR!$uj68@4O!O zdG~^;aG>$K>8rw~c(w~wZS*43TDU0^B0ZHjkPAYgflCfS9g6;fd&RWyJ6Zw8trZuVHVnt&2ZXbYc=p z&#`}Ssw;N_^T}E2Ajr<*du_eb(d{2sWryBO6gq=3O^7h1DKju}O=ADb>1o1h==i=g zbqDDfy5s?Fai;oi@;>{44}9S3V@Q0Ba+cDw%4_x_b+9rR93Mlj;noSMyHjP`3T6IW zcS`q5Zrq@2$u3vt^D&V$GHh!%foPs4uN9)!E@Z*X5p_Sgh97&z7*!!zc##oo{-wo~lKUUj9hcM>>mA_F6(Vag8XzgT>N!ae!Kxr|lTJjamR62&YI^PFY@nJ{jplt{ zPUfeQ&@t$H^R+V4gzLH`ko%~G>*%qGmWwHwQPl6EZ)HdCGxvZd>Be0i<){PIVjY70 z0lhV0Wx^irUj||=$973ZDj`7NjN;p&WuLnlvr>9%*zO%@aZ`txUL&>vwIO6FaMMLg zEh_L%q}cn>hpA?IetqUW54oMlvfey9;JiI%R1^}-M=CYdVAgXBtnfNpv&I}(CP&9F zVDkIDxQjRsNc%d}OuvXpkh_hic#`BWd@3@H9m9EggJ-5reD>j8xw3Qhs;pa}Mc76V z<@S^m-seb|;T^rii#PVmFY(C19PzIKAwW)KYR3(C`&m`tco=wieAht`_~oltL1U6_ zVw*_h5~-GfT~3TFkpe#3OP$CY37AIwEi}xYCv$HER#onsU_J|Pi7RMPw0vW}T#BrUQ zDT@A((>^*ejjpe^1jGj%q6-2g_9kut-r$yuH;cN!p_8LFy;$J&ZfsoPm5ORJSb@{r zobg<~$?%t90r`v7a&w>i2GnX*T9-~po6=e7c4k?9z4UKVq(%(S*>3e*#MZe-I2%*5X46ni1726!oJpJ_3TkO9_I-TR~_VHau<_GeO4NDEN zC5G3gLG@?2)j)f$6CMwvDEcHv8b%mm_McSFb6l0?q4uwn-omZ*%yYhpt1XwI|Mv&W zED5=WK1=JUY2$qaD4dqLZ&#OPhi?+@bYIdcB2agj6FJJa0fw3Xw`5(b&8dVCS#Krk zs{BS+m^m?~+l?JhBfn1#*&?!Hs!##TR;ocVi!zL;(>1j-qr=Her&mu@>ct2a5L7g$ zTHEHn6dq($c8CPQsnr9p?L-QK1=CF^AmaI#c8 zw7S@kJH8WPlfa=PHx^e9)!JH?AVS-zAFk7+TgL}N79mpaCKPTKF+jrh3h#HM!_YtP zKs#YM>m~sqBuilhA$n&C(rmR^_o`tDTP8W_XHHSGnad?(56>tH< z3{VJ#RXe=8I7#C}b)bs`Kps3^>n4w5qKl0G1PT>6ysi_$-l{;BlO zq<`UHS_~?E)U0mNd z>dU%D6dlxQg{p`!A5pbV^l9iKc?CN;SA`g5qk~@SLF#>UvaBp$JMV zj*KZfpc@+sCUc*heny0)^O|YtezhL`l5Z}IWpqUL;q+x*dEs>9@=`tV5)W+8*}A)*g*1z4vm zz*0o!MW!kk2Sru1Xi){<1ANrv@I)?y4}-pwGK5j|%|=6729AYMNXw)JGd_-Ov_EPO zsHS`~0!f?dCyLX#%G9LiSE@%+2gBShDprP5!A}0A?oCWh7`Aihh>)xJPE~433oI8( zs<*m>{$6kAqm5}5Iwn`(ZW(i(e|OVOpSbC!vGhD(J5Ex!11svRnk1ZVO$Whr3*^nk z3l}biy9xYZEt!Zby4jhv-r%>UL-@s1806SAIbj=R&7{-R31qK1c`9+P zlCP^lPyua7)pU5ut>Dfi47mx-Fe~n_Q_B6zJvv#bn6~9%Xq@cR$gSG?lB-Ts91Y!c zJz^-TVd>VVJH*r-(>5*Ja$()(!^|@&>n03SyVALKM+gJe)D0a03N%9=$eQBOSl1Oj zk4^eZwx2u@v#r=k7S=H_X>x5vTouzO6WV+DtrpjqnXP{@g5|`<(_9x(A`Ca;XPWYT zK6njgyDY=2WM0EpI-Sn8s<3&J!XQ&_Rv1#+io!6?;8R`U9?Hc5jgW;;G1PH|)$d`L zRo^$XYGO&m3%ZMVUhW~4ndsnKp;|CSv(JWRf49$FZ&%InUSp`1-`~ZBj;5HF>sn?+ zwHH_xm4Xpb)Gk;NZ9G3xbL0!~LslpTercFqK5{|#Xi_iqXtR;?WCf$CbKb0QpKFra zRMGZ?J3K&l4sZx{2Z7N0Hwt|{g@4NXvlFs3bjeO~ENCpNSs<*B6ga?Gqi*Zm=+Eir z*6+Dz9i8V!O8$d;-hIzd+0%QLeTL{Pl&QPB^hfT2V(uAJ{8_vYZ{T}C-y;iTL9)43 z1)&JnI$b@9bskpHTTNjJ=7I{kKIm$#7rnOYdv4czq`o*Yu~=^=?WsF&Uk$?5+wYue z*CwBssI{XbM~_rH^~pyjaPQUcq*iTk#~p*3opwCFZzp6O>VO!NBn`6sR4LbhRzZ1X zvG&;E5VRw!I*X-=6RkC*8trhy!eO4s=8~cYaU2lZk(Ey>a)-X#a0xfnr>k=dLT#4#x;3XghV{fI^CwAiOG7?qU}hXv z5m;no!h>iG~OhbSZAZWV@TmEw^K?hwa_uL;500bcK&*+t(uILp6 zbE_1mvx;n^NU~++r;F3KQx=~5I{ra7I>68uP1BE>r<#$Uoq%TK`V(stK5n=26H3|| zZL;kKmX=hU-H&*?Wejp2&z2zK#!x(47pUdXcsdu+aXEbLnc8$RQBRbL>sA`2K()D@ z{^a81-R`72D8&*x%znCvV?7%_FqG7x*JUfp)2YMr|CREr%*z4Yddq&|^M*Vg!} z=fxwfQ}ZP%fQJ5EjEGV_mtgiyS?>{V*p-JUr{R}b;Sc7Kg-?o?ejdyGLSaPQ!WR{G z3tVHGAYW#g9dlQWMj>lP@z&1|Rqe6D7rdOj>sns7A1y3>Sumtg(4vzz^If_Rb2JVx z3{Q)(yE60y4i#~RfW&1sRy+MjT3wldHB=n&~t{Zmn z!S{o@6nIo~H$iLHtV5Bd+uA$Oie-5=A(5xpha%IkwZl%uwN#l}zDJ>VyIxg+r}c+H zm-pMILf!|OzZQg!X<4v>_)igNVWwj^)%s}-w7uw%trAUTpxl6A|{Y1Foi=#Zts z?TTHkR0Gid@2OW5YST(R*5NDVVWOCAA65;Is4AgmSaAr|^r(ahicx+?rQ-}~mc=jj zbAV*@K3MA>>-1rSW8@w4Lq`9u%=p~R*4_D?f1g;sX^F155O_qELF=s;(Hk5Lee>_M zgCGrpe+&l#0?y=j-=|?H+ho>>JZ zY55`k@m@}##VcrEwM^eiBBP=j$OA9PDz~Gnn4hO&dS*qdL>T-ai&6Y6ua&4O+KAx# zqk;k3lNiXUX}}ZHH{+_|dD-GyCMwJ{=A@5Ff6!4LR)%gS9GDLxv;8iC#xyG(mX@Kt zS4(jpc|!SeuBS7Ib($#$X}_h@_&Cq(aSt`KEx_^HYDNX%n-gWn* z42Dj5>pc`6GUR)hC2=-U;Gy^M3QcTn5&zqnUMM|JT1;Y;<1EE_9#WZ~XMVxB$9O+X zrobi+LJS4N9F5itoUvbo89QR;@xn*o3Py`u!7undHZg~}ek#2P>((jenc3~Pa@!v3 z4B5;Icb@^p7L7B)clbQpbjF?KZ-1LvPnqHZWW1oLr9I1-p^RW=P?)J(#nuieCxzr) z7DmR*-T5kdc&;!r-&5SExsw40mcky%5{9K0K}g%eVZDjd z7QpygWpXsvM7dC0CPO^tnXn z=(nFO?Vmw4Px5u(@5;XQ$3S=DKWzo7SqbD-k?Qtop0hJs^BiI5w^FpsqWD{L=pmqU zZ8@&uPIfxQEH}N?P5Cr#?%;$8qEKGUqGZ-`5QDE9)daX3*j3+fbko!w!>_{S_}dz$ z1!|(5D_*6#MjD2JsmS;FMfvuRY#=7Cp~}fB)eNb$h6|)0!x?Q9f_DJ3ImWR!u|^10 z5m#NP1hZ1Fut@jQq`S;Ea{FtWP;ri^q@%wq8v-mz59?QH9x}y1esERs`#j50UL84f z56TCA+qI^wu;#^~WreX<3x_U$o9AK5>U%TH<_F~yyImPqXntAJi3dC%>C5R2I=Za$ z_@B;tnk_SLtV^si-ylQNp^x*`*bVlI72CKOWzEfoeSuiG5G&`(!M%_~`VgCQIDx`_ zC1!gB{a3e(T;>ZySurd_!CLlT(LS<`m@)8%52>aK{}>xCyuux2L~h*jGJ8sCuDh}R z@k3j3Pp2K&WDZqS#?a>9|`JA&@`>bC!Rn70M_551x-FZ{*c^@=xkxvk&uGTVBe zecl^u`vtzD7uzzRdl~8tc7pqdevHKp^@oP^ap9@A7s;<~|A1y3t>Vfn+E1PtVIRD0 z;}!2S<+hqUr8^H`Ifsxd5JmbyT$$ zxv@fts_InrOj{3OF=5_dfBGt$qKGx6Tbf%7(~7M*x)s2ej%UfBloa#MwDc3w&tmV| zw?eOO|I)Kb?+Yf`g9Wc_e|v!Q`$Nti{Q0R@w(~tHCO~NjC#)eYNYW^R&7d4R+ACia z=BE!>6-*+rVPPVP%GOSX1opX#br!xFJ{0kj9E%&#cBH-Eay^^a@VkF+yiM%cafC!U zU|GIEFotZN4AXen=D8=CW!vX(4v|zcetP@!qwuE(eq^u20N-*#u5KxMyc|hB-q7js zb7dtVdS&eC8{tMz$q*?A}bc)@or;39SCkn2LyGpxLc{mScI z95!gbPzF564q49R!@#pPt|r^-9R|I?VqH$c;7<4^I_o@q%evd?>f-8{fWhTI5FLvc zFw&#m!>Ud?M5SvAlyX!viKWPTw`Lm^YJ{5k^OQ~=o@kny;%Ry*sj$l}NiC@-osw>sUXQle9J6Lj zX4>9fuC9C$&GtC>NxxfC9fuM)Fua;`+eMDrNA72Kh0L6w{wp<4po>iLjv1!!o4`r6rrBC)Jqc=Y;e?9)pSiiF_Y7 zGg9Q%if-8|Q?^`m%WPx07K;dvosu&xr=wj&#&V;<`NFdCIAajACp4J(<~*t6uMsTM zHq4=V{bymO5m18l0J(sLZ!u0pY=4f|Rk|wby39QOhTFEK^JZhCfm@7+vuBoCGb);H zr5yZ9)c;&mLdlv+zFKM|UTc1|_-|`6w1*-~MIQ7cWjdiZB2H!=6-!qW?yT0!2ri+z zER!;w+j*YC^TIJn1nDjoWSV*JB1;*Ev1%`Uw@m5_qJFj9U{~PKRbU3W1y_u=%&pC*9x;sGFO3bt9NMBQgbH>i)xoeb^tsUxH}V)Db2%- zaE2i`{Ub>_0~OmdqE;FeO_#R~!s<%>vK@HZESkEik>u0t9 zdBdR8b?HxvAZ<-lTKOiGJx{Gr+oqL@tn1WODID9j5?8S@)mX7tfC(#9Gq+d;e?_0y z_E1y((NN2vufTUPA2W*;vLzoqHrmYTJ5IYXjN86Gg}NuG zuQAaZ?(FT04?R?0dFY{V<+V+`>dl;c-70+bQpA1r2hQm2cz-PL&LvBw^2+;!XH z|9jNX8RzA$RUhaiUylJm0P0mSYz~hI73)O=`zDDP1jeyPZh^8 zP^ufm_&r(P(sU9L@-?c_(~3=%O(QXlm^4xB8;%2yrN-|OctqE>Wch0{kv9=5b`yTB zXYs%M{YMW-0V?$}OW1xeS`@0&Z+IuZLFvJ$ie>p5C%kXS2E~~7mjq6dDa{~O4$CE< z@@QK=EBEpg1MHx$iKxT!p~W&)VjAg;MSDG##P2!jHsHI`T}Jvi*)C0pANcdSC30v?t0J@ zFhDHh@L$Qy2K;o+gWp)JEozIGIB(U{a`R3ZbJAeM8uAm((N}X0{{lRG@8Ts@aJDYr z*^~)JegRi=Kdr++qoA&YJ~H@4=xINv%4_iaSD@@QStVUrzNl!whWNa{#$4fYJIY~( zMJ`3DC}OZKQ13G*(810}RCx)?dd)A%>dy@qO{#BGFn0T&Xv)Rn4Ov_PqpvlNLUq?m zkme8Y_dEdwF9FTo?$>#;{3iB7N*_l!j-j`f*K}2>$@~gH!)akmKFcM66H<(Rc->W$ zVd$Wap=bl1zYw>e(!!hlvP@M&x1#h`Sg>MdjIG)XnO&KkJ*PxL7|w~iH&-!&Zn7gA zM#ZZ-p667(iebnXW>?tb7YwV~uBiEK?ph=jxkZrHIfjpk_=peVo_Kq;w@G+BWQnl3 zV{0sH1gk}N*t32UeIz>FxvU~5`DQqrwpi7B-CQ-#cDz6o!;;>BmH4e`Wa$XwLa1U? z@2lzx-Qod&ch0hqvrpQNuCWS7uT!deGuWVtUhUq*zMT~zbGtYYYPxNvq-NT>c9BPY zwbNO~mfF1vVULA|HB~pXiD?WDPS1(0H2$zu?Aal{QB~mFh@GNkhC!igxLt%fcXKy_ zIh^y#=se$pF{oA)^=ZZWHQe&|N#O8C`+~#v>jOK&Hkte$492HbrJ_DfZ(;XSKjO`G zQS9u8JYF)NAJKMz(SRqUbE6rn_c5b(vnI(Xn~1=?%ciO6mI)n# zSh}3Gr6jQVr2oYHH`Ypi8ydYQsA><%F2o*aF}oZqK5lS4Hbqn$lcpmuEfK z3l}H8G`PZ>WzECbbx&b7oq{f#MfR=bNI;B?JmzMXyH`fMAn#H^3xCU{Xp&Ldh`toq zpR@zrn0j=|&~aZ5X}QQLer&S(Ev(JAs*@`?_x+Koc%Gt`ah4wm2P zldfv5vY&KEgc5dmuBXB+oc&<7;5MJR8T7(fQJf8ihKRLfRl5XLWOF&whM!TiY>@&t z$&`{k25T1WZ%|GfcG7qNI=gAAsu&X(1Cjp**O}!X{T~0w-&cCs#;6>7N(_+PR*pWd z0mvfI4BNYQt<~}KP3FmzP4o@Q_nnQG{sR-kPSQBnNF1C|9>Mp`&ZhrUv4;##%1`Yz z!<6)Olt)}j-Zd(ZST-R+C87+zTp@I<4g%7{U2`jeg_pc}qY~);1x;36+!(jpR95sK zKcM_6?+M2&&s!cZHtbuB@mpe^#93arTa*KPIycRlDRBJt!12_az3FO=ar|^CO6t(9 zTT_wk63>pNwr)Knm2K3HG|Rk1hw|U;-|Wv8$mdV*)!t8XOUMTf*v>WPA$HqHJD2Tk zgO}OF_HmqN7$)P5Htv=P$2wq}mg_UmP~h&vnI&sWOdvDJbAq5VPM7C(N>*QP_pLRk zrc;cXad2EUWMk%Fb-c{#$4Yr`6C>uFHHPZ3=1>jYNS;1mm2-K^ef%+7#qBI||3)e_ z*mFA|pUs{wHD>y3 z&VvK#L{DMdqw2Y$t_M+pz5-RMc;T$WDmX$v%GHg7OV#~|-b04&N%3AHb6ulnK>w`R6sXM-szfCMlCd5{$3hKTrE1Hb8go7-@8USwFm^8)01AhhEc3WQHj@V>8Yu0x?PhQr0*SV{>Bjx>gg7LF1Yz)Kv?00f@rfch2O1yGhph%V1 zDe-2TcwW{=Z6lsZFj!*Cus005W0z}}ROc%~0NW8lW<|EaQ1iD5tj{CE;(hf8-$zJt zII}ZJ(C)Z$I?$6%8DXYbvZeim08!l88Z}>gQ)Mny-sH6A>ZVnno1HL>>9H;P4wKeq z-QG=>lFrRlOtU@*zkuWHyT%WxG4fzowx(#WSjnaaL_ERp!&g`y6hrO3%vlq}fr`=q zg>!>GvWGNKMr6S)`;Mt}xLP88n5dqpR~ILd@k8Ygidw0TgL%Uo6jpGQv-9!2|F)uX z53|SQT|dw5fV!}m?PV_$itNVdVr!ePF84Hl@xGYJAJli=&%Cy7NZWa}WYYDNqyOer z5>or>ROem=nN_S?4XFXEhLPSX4_O-rXi$R_xQ4mw3ODjyfrZM`YH8u}eIxN@%bBP< zwj3no4p{CAKWBJ#H-P`#x|h$P%Vd(-Kn{Vvk9!yE#q0C~)5U-g7!<+tYG9~Z6zQrF zEF6g1mSSs0#W8?yv8H%d#c?W@r`&UZN-Qd}<(Z~ujp*_wLn0cm?6k}_#@BsgmxV*< zXS))|r@dXV9v8(5@sZJ`W3j5VvM7^0P`rHD$&AsX!}Jft&V2zPLU4;*0C(s3a(wJA zN;jijVa(W#anqewv$vXRdUuZFC&ax2&41ZA^tV+mT^2pp)ZAv`+aS9y?l~Qbada`v zs)bN>1{+e^o|9v-j;}(SoxGmJ>+S1c8tt{1e_Y{S9Stq_-`rD1ZVWxf+(Cx)O;ZYC z?Xk|{d`ls5S(F@*yC@IUK<7}3ovao1twPqhI-HqXqeCa6ieU%w$vChLg}$)6URmc7 z`vAW_GI}aP#))>>8CO~1=S7Y%#3N~t<>*^yK$R%5`7!J9)^$rtH}W4k#Uaa!#6+Uba&CYBV`Uk%Q6#Y*h*+0*IPS0 zeEkA<@Zp#aPvNJgDkk3i<%(w9d#|e+zf7oAaaB7^&!(ZRx)qC(pX5M>UqHlGo0L)P zE#sP&`>=!(p$w7<4^fLZ&x`s4Lx-|H%r`rMae=L49N@Ssr6eP!O3y1HzaWU04qvEaI&ro)61`A>jK!j}r-WL*_3i z{XN@5IaQ8*?Q?|TZok)s)kC(Cf?Zs=6XshiO``K>#a;>xv7bjFO!*YFAInzdsyYQK z3WmVYStr zjb&o%KS{*&QRH8~q;OqA?eS=rUIuj54yFU#0yNdf_>58bpmOYxIgqP2p&w=e`<7`; zI!x6=S=xr+6Z`qd&eAoP8I#3>>)ZUb4_~KtpU=nqcUaOhTYnSb72e@>W!{!p$wgkn zMXpRKUn=En&M;9`mDhS$7q8(S(&+qAP~Tzjo_Ya7#O0KjCLYP@ON^*~cRex^6i19w zF&F$)iIV41w@M;6Epkg|{(VQ7e_vgik&a0lBKKBCQ*SIw<5nut(Ibs5BoYBunY&`Y z*N4BW5!+#phM3sd*t(+Inigx>&wA!cxbskI%6KF?3}xv~b9)us#@KWs-9FPjntcd=WH+4=EVw=SAz0XJ{9Y z__r$By9HliEGGUX?iz7P*D$#{3{%Iq9LMsVzhlg{Ou^tMbeO*3hOim^;3erLHWw|x zTy&F&FlQ96i8hqTrm>SWX-G^*XG4?onu<(tC9%;j1n`tRNHJH<`rsO;LsP94J=7Of*{G=PpcBr!)o^7__NoDgC;TCZjRaZbRy38T)C{va+0tJ>I7|3@Tg|USj33EobPj;yFt6pjoQtw zHwAz7;D)q)=i$zQ>}r|62d_W#L&;ZfIST3l7H#ABZ!bQBQC-`Fd z#uj6eRL%>D{`RB3GCZdOss$T~kMa-?7kQjm$?pY&0eqfEO%;A^OVT9hCvTQMB7F)o z(~Y{56iy^*?l#gHR?O#ELd0dlI|RqD(vcPpOW8sDUyCDMLC0|!%r(QmV#&{VzISA1 z$&&IctgSHRAl3rrYMX}!lh^b7a$CG;BPZF}-Nb;>5dN_O4Pvu# z)TRb)qvLOEsp!uiBkm+oRCp^j6`~o6YQhpd(zUl0*dfB7Q+kQF<6uN-=w^O@9kEDB z{E$cNpG`cZ5)T)6%DGJ5u(GD5L%VV1TO&zI)U208LIJ_`kC^x|3Qp%e=6U?;B62~z zF!2y)&chf$Eys`Z7{>mFbUV`l_v(*b^e{tgGY0wFS!?4Ongth3VYaw6eZ3>TUPmaj zk#DyWe+!Ab%TKmBZJ&~{t%HD};d;d2pB}&aw=!mq!n9Gc{!NTGAi7SduFFQD@J0s0 z+}j^hbcNE{yJistRB4=Ti_eC*4^xG#Ru5NI*;M`clv1iG{=Bbfa8^BB*5J*uLrIo`r2Iv&sWGf z)#knB0xh@#y!s9;cm{X>L_y97X6aw2I{Ostda+PFqmp8JmFEZeyjXVlFN}$|xHPjq_p>Z2W2F>nk-g6c9q2ac ze(4eP`$J3AoN&xWAT|-in5+&s63z8e_1y}u5s6NA+T3PB5jc`fO}{Q=8Z z;NnJp4(R>)$zv^;d2FJ}o~@V_7i4D#B&Zp7LtEB5u;%vwaX^m0{7?stP*r4j2oaTa zRc-a&0jf47RK9|6)Y0KcQJ~GkRtMBl_(!~GKB<_Kmg_ppib3gws!o8ETyfh~G-*(V zwnZ77m*T3l-c9a=JD?j|m{dm9P^8L;vW?}HbQhnk(H@X~Li%($uL@4oo7^9hp^E=Q zSf+2vB1yCk1+?%BbeToi1{N*a;V$zmy&PxmHm`IX%m<2wLtufiqw{ik`$?s_RBs-g z^gUH};8C4c7pjU*tk5By{_1uKqhOg**V}CBK%`!3PH~@IYHGG3Yym8!!I5_ zjL7pVD%}7!z4X_hGQB36Jv5h4f4YjO8SRG@mi7!3C1p#sEcH*Sb5%K<>CUI}+ffI5 zJ6&WkRXIH!X6@XMqCr$3husiqzr@w~NB5_YSYk;tj?!|zvIS`ovyU9S?XW|pF?@@9 za<9Ws72zwGs#;TIzlNPbOBe30DNiVtZfb;Bs{C$QJ5YnysP>3PRn3I|G?i-G8i+2L zoBe+9|Nh`VlVebqTiNWxGCANd>htJc78th5Avj!&GsQq9jV;#^f|*T(&^leHPO=G0 zsh#=F#Y(g?OO-&DeH)fJDs}DZWUEn~_B9ow*c3NNk4#S-u2<(1y9#=?d-&YRO8YLd zG`(^At!tHrw*?~3kDV}y?4Ua}ITua^W&{)m3eo4n+Cn`!w7OWgjCrqCsh$0y`;O+h zR6uX@*}Ofho$0M~Bv`)TaM2dH%g!C>=ay3=4uRtjLdH zKEbn!QXq0X0X<m!|&J|Nn@}sLJM&ej)%`MF&i5ELx|e3*cpFJ*=tuA z2~sZC|5Ex};HfmwHP+$qJ%9E=!}E*}8lS#RHO-$jP4zY<%xwVI;CWec;TPSQ2U&4c zhkyN^j~K=Wb>G)_&V2lCSm0(q#@x&BvK3~R!dz8STl3^TEGU>GC$7JzT35K zEQ7nvh78N4u!(B`)p8eJqg${T`TE(6|ksMbn+fV&{;Ok+Tn zRAq%lZm(#{28a*O2&{@jDwb25~ zc|+80tspe(is0!Fz6UbtDD!~BiIBQ7VlRX4E0Tu{*3l`eD?YGapx&!tUjS(hkF%}B zsJ?vS#7cwIjvPN(165@%Iu=e)T4|ycq&eACWLs&vptDYd)SEMj)i`^0ZBm|IKYO;{ zgjsWEs^4)d^Zk?SUC#=MPUk!&n1tsmQ`Dx)6qI07wOIkZG&okBHETxI370l+J-y)i zi>K!>sJ||9X7jaI2(n-b`t)JxDD>-7&?SNw2jm$6W`_3=>`TmTbZx)nMg4FTz&b1NJn4Us%yLTg#WP80`QMvK~Kji={Dkd5( zUE+zB*LQ+UzDXk?GLwJ#JvhUEGomP=HTSf0uCmA5qIeE0E^pQ zY1^Jv@;rdELMKC+VZqE9N{KW9ce~ONX-zsQodLOchqMKf;|(m^%$uaQO7D~|N*|Oy zCVdiQ$1g~qlfEGRvh<|%G|CVioyU73<<7|8Niyi9Oi;AB&{*s0Q0+EmoIZ`HjeWJ> ziq-OGuisL4-LIyD(*#bNBwa5_8IU9J?nRQqvJ{g6z;9Fd>%s3*alT)NUQrdQ8Lc3g z3xZY{&asmT!_cTQry7=`{6I2PPfs(KWXm;Rjn zn($x$jiN%4|CYV$%j^|%VZc6n`4vTE`an=qJxSW36XNr^&7{Y#V+`%9_auNo_P3ORxG{)F_4Ilfhq zi5=mEu;&gRW0uHp=*YH^#CePDMU6T3*{0H-#~$~TD({rspX0*s0F!Lr4l(tN?b!_k zLo~)68u0DNlg#mK=&xbRg?0VKV)@n{ek>}L6(aZ|yD?f=`KhRQsC^Z~*{>S5ElEWj z4Dz}uJudxMySXh~wNvi6&0MZP2C-1`p(8E}vhyBx{&B}XgZs*lu=XE1ws`5KBOTcR zD_DPa+I8gWglSGxWygKX-aH*;JXD|k?cG3)A_sEO2s_nk&f6i)b}qy-~V}>d;bgf^>nED&%S#7eS4@qK@7bbeg2E3MjY+`5zOYlG^YOpTmFkn z9OgoK2@mRp3!ixvg^rVVOe^TdsBZH1PGdUZ$?-wRb1Rv+}tT#2zNT|-0JjrE`Ba% zo{=+r_g=s!-jShGaD2DIClYOKn4|L+>E2y-#a3o^W}yJ+aK!^;WMTb7$few6lH)H8 zT@-4@1s?Np)<}F}IrRz0B0=&S9F0!RQ?FSM79$`a|aZY8ykne@tI^V}U}s(Ghxc1=f2M z?aUF({yL($gNT%I<5lMY36F>8CsJ#6Dm;Dn>3C|^jB1)cb9iaKO6r#{KT%(*_~9LQ zt&rur?udN5y>xim(I>l-RNzV-ft4C&0=KEE__p zpS9vlw}uu;b1BjVsdS#zPi^O}acbr=SGQdP3Ih+P*%C83L+~-IHe=S6t5>fI|Kvt{ z#KR7XsmVd&5yU>Y%p8jh`x!LeKLe7KEk>SUzOv<RAvYc-*OffK-;QVx;T3qh5 z+wkv^y{PQ8JDv94RAhbz+|L+MhIzln7_e46f`B?Se*2lhpE(z2-Wo8Fu7bqMd^Y}F z=Fr4EH$q={X2XIc@uJ8}b`W+J=8)sM-9ewD4d|Kp*-8Aih;+;Gaaml?5=h&7rMHwl z(1)N}bKVT$o#sQcC4gN!!y6_;fbgK z5*EVjGFArb#e?1wf5XEnve38A1`C7B(RbnYalsAT0TDR?rE4q`bdPy|3shh(BT%Ve zpCkDPSyIw0i@Qh45{5|=jJPxG3pO6HKHn0K_Nw~lA|CcH)Xe!_y~aq+G=aoB4peg4 z*<^97#CO7M*2w)cfM%0r>^g%{m+d^Eec9u0D4$cQuP2!!8~-fN6G`S4F39{=MtA9O zNpv}4=asa|GsBY^)y<(90K46AMYmYrgkqpM5cgEf13!ZMU>UU@!~9zvU>bq0=sN2O zW}?C!Qtr70y=@U5)4IIdogu=9)FW}4&lYE}3*%-f^ZJ6{o+Kwo;2cr3KqfLZCrk>T zfuZ{KNa1nxt~7v5Vn&pJe=63J8n>S zJKRA)xSirpdHEs?4aE- z)P*HQhtD)ikdF7@kA0%L!e&@RvhJ~f7}T-gS-1tWZj8$nv8%oUQsEju$CZHkJlkXA zHxTJAf9&5z(Z(Z>Y#l$|iJ~?;*@2Vo?Py~=iaKG`IUYvQ7JO`Vwm=PQWd#;K1gsSP z#?npp&`xxGdkYHMfO4;}^NsB`6pQa_hZ|8ChL1#&6z6tD%n@(1m2V0f+BD0Xy8_xf zTD$L)eyFrdCPj=Ttv<3!M|R;kW=2PLF;+1}gefE#2&wl4+qjA%{(5l=2mF1XF&RUU zke_%11Cn@IEoi)0ysy^>jb-cN_SP2Ep>r|Xx(qtXg=lMonQJ$ITiaX5!!0;{5zWKx zXbWnK72b$8;37I6ZEauKXcN7&bpd{M8Onk}wyy9?D73Tj2o%hI!~Vn5P8)c|?agqu zf%i5T8;5dwFzleA-6E7AEICY!a!W5OL?QtViw7vOqzzG@^cNdzvn(B;vO^vDQ#ub^$P1C|U zka>8#_*FpV#5Uu&V(EcpqU*D)IF{}!m|(#%izX2{;xpU+9n2<><5M#v$}?oNHaFTb zKPd>~AD^cNy(G(*_{YCENc)s)2Osare~lllgEo`!i}+t)?#Go2#xx8zWnP7%O*-o= zf!Q4Mj>yMH?|zucl=fzK*0)u~qZ;u7*QriL6ehhz!*K$~G5=6i>QiKHvK5=YLr@|r zLCrG#$=1|cpt!& zb!o9USQT14CQlsnSg6@txAR|HM#a}P!>GB5@7PXjtJP{dNf6AP4y)Dh^sVqQnd*Mk zCRM6B-ci4DwrW&lUpFixs2}e4`|n(f)w$;M)^u|YJ~}gNp###%astbB3OV>9{GT!e z^vvq8wkh}eb0WE3YwTUtXcN?^SV7I#ZDUJk*QR6nb#`qV%erk<1FPxQr-GaC@sS(S zknS=8n)ZmN3o2`Aue-^uATjd^XbmYS^_j`$wBt8wvrX6c%h|~0c21nwR1!a~SNoL- zw~$Xf_gRVYxvG|b8@C$=VXjkK<4VP zpD3FrPW&VzsE{Q(aKDY{H2f{QfVzih`2>5zhYGn-y!?-`+&7gr$g>w_witL<1$1p5 zGdi}0*ULwDezdAz9Pc1|ZK$p%3LNuHP8h`jYp`O~RK;>EMMZ?1+4WgvVwI$-+g@+t3_jJHCXHjK*5>3$ZZ57ar1HdJ=0#Pw z(noZDsVUDUc-M<**sRkkbug;Np&!GWmOQt9^NB+xY;^34m>-Pc6GdF%nkHZ`?2jb{^!_4aHH&*HgibuPxU z+HA)*@B{}KexeL>#Mqh_KG|sLyjyys^fu{&^ik=n(w~kXdhfk|!Y-!B_??xphR30E zmy9<~vUEbizX}twakDZ9HDr#nV-9jEb}9Baz%qCPQ`~4bbof#p$9&Mke@`tLQxF2L z32PvWn6iZt@fZ+K^<8JaC9`Wot~k5TEPCyEZtWf3C7Kf%+{ERt4rS33Ce}8GzRE8D zloBAO54EQ4Jbb4W7v8u2Q10bnrZ(8*Nq^%RuveG0?_YUX>EG}ldEMt6QWLttLrr=cCz zGp^Gc@`pe{zD~!W`S(s`_t}BF_|8H5HffFTEe`Kj*XZ6Iia$cHVV|q3f3EJ?zxMp< z(0+s91N(iM`=@|zo5{NjCu&Sf?|o6gNN!#4RBUA_<30*{wgq<8`fl8+-YZVh{n&~O zXJIT+8BJecYc9kn*^Q-jU>aW*S$X2gQFi6DJtyM5PFHD9p+sgk9Ow9 z=^MR%#YlV>zkQZ_(v)M?YGY#7GJ{c}APdBmB3`Y#Ypl17($DqTxqagXvS|15izHFxcss11AdfGG{~hF2 zsrVhx{_0Dsc-Ro1a475q{5SReDBP*Gs!Vr;&!V&~aSIO7P{A}W7cu6hSUf-1$A{~k znS8Etox4*MT^EcMO7(k-;zi1d(mM{qU$Gh(Ta7dP?c-~+ovHP_Jr9u49RajTR6Xzt^h>H?ggR437+y9vAaMb)Oqk(Vn`Su|dAt_4A)^JEfhu;tLMwiS z&d9Q6$TQTUM{BA<)n%#^n4v9M`}N|QD7sFxqf}EjaU5>y6+`(RwN*L;x8C7kTvtOR zH*(&AUy>@q5)Bkxk?Dr2zClB11}H{3f@Rja8qwJ`h2mv}*6wEsVU3EXZ>W}X99D#i zEz_oqaEb`Ygx{2W1sG=86wBN2Cg$P5?Mf-j%guls(8@EXF`S`1;qy?U6@5(SC zS<5j^TbJ8}+O4`4fO@2-hmIbq!IHVM!+&%u0i8)9D1?cu5S@}W%{1Y6RxvaqEg&np zW)gT_RdgcDYb4Mt&!xKG2!e*MQ%g51Y)vTk)>SEFR=J0OGq^lq7+YQJp9r(f_qo~b zH8X>)p*c+F`Iq5a?ts=s0H$f8bNn|E9l~HTRxmXR_NL=#4nz3NI89^4qW_ZeQ>tr} zef1dOm@3=QursV9%*|oG6J-_``qap77Ts@TE)A62x_i_w?SZYcqr7ey`EYPOd(#(|w+|Z`nOF5*F zD>Kg?F<6*S(5BpFH*!w&pVj0g8UAS(>W3#}o51Tp+pW%3|DZU%F!anP9c2~=NdUaK zHc2UT3zf8GN+)Xz#}WpL6Le>z+5BwunMqBB5@1LKcd&_2F4YaOXZx%+93*H{W*ggi zBr?JQVZB(EW(JtbcEzDyo%LrgpdrO1z)WJJZ6&AsPC9xgd-M+{quFl2pnZ~K3$+rd zMBa6aiiagh_O=}ypUr2&h@PkQS)ZF8+-X_s$R!Sa5sm#!i_4F1p3By#c@ zDk-iDt9klF94!1gVfhQz5YX};6U14tBY)1T&j%53A7mpXP>n}rnfP83Bo!I@z83kl z$$8CkRE}w?I+k`fNJU;x#gbL5IVI16V2EM0AS+hVt0Cls1#%^p$p)cEh@v@Oor0jJ z$7Uz}fH)efylGoldCk%uqlAiUMYSpXXoGThUhZ$m+HBtzd*1_^_JCfghtqMxbVEP# za7(VTXFKFJ`$+H{Ij+Zu^ftfPP#!{4$4i;2-Z@+Dds$=J;x#RZk&m$SF&`Sy66QujLN7$-Jz! z76mlHVoTr?tWc?}%Vw75^)as*Tu-t6lxmgUef!=x47 z6z7pa`BMLK4*l?hy+9ydKY|I7`OzMcD$!8EVIh!yQ9T;h=F9H|k; zDq1dCx)-Kwv^1SrJDC>2buC1KX^LLh%bjt>J`4`;MN)FK-9$H5P~R>REsxCDXhzG+ zQPa@d_qTQ9oGb@nfNZi3Z}yC za4IBO(yljzHS~n5g$ZV_#jLe$A_oMMSEH|^J0lZ0L|`VoLA)9HN3uvvS{DCD_Ca z-L#=*-Fw0{d5Jv(i?5;8T zL0YrS@ElgShgd07grySaIfvmN=r5acqUlMB{vT{te~|puhNHry2;{127!OV#37jRk z)M(4Fe65{;-V9%9@)1YY>_(uZ4PW^MFEne>0{jB8Q9pcUJq}^Qq%xvBtCe+Cc9vk} z0#&41+ExQgpQjp>dBhHW%u#|y3V(0+&@mC4FRGc5#4s&I-3+MPO`uV}S$Ypt~Jx_7TSKdEE-s zcB*lH(ZzpwFuiQmcEl4{-5`hNnA8I%2p{xBH zd%6nk1FHo`XQp^9@B4Oz5o^cy)EL$18ym#M9XrWs!>d1Dua&ODobBHM<1&!HMXDwqQ zNQq}yv#P28uLPPenOPX54*Zv{ADT%$>pxN)dXi)cIXwYuzd7k%=|SM%yQKF^ACrC> zxX7IyV5Nfw1r`jGBI@BPdN$9oYxo8M3o}(fr~_H7Kpq$|SZ7#?+yfHon6Fu6H8Uvigp2wf|`jp z7H1KLwDsdl++KNa7Hh|3b8TqL=p2u8`i=$vDb!Z%O2wvzS~CoU!FFNctQ}UVslLs3 zI(8szph{qO9RF>qN!535u!tr@HHGzE9k~|y8z0S#^VSgW7nwgOW`X^f^tiNhAnq6Z zSCH<$v)hI24|)%*+MW%HALRb$0mqkjV+{TsR-ky|RdjRjTJRc4M?G4i%@4hwGckD?{ z!G>+@Ri`~1#{~BO=M1}4zgrEvRKI*JiMsh3<9-|<{e6*RV(70I@BTwqAS`WrYpc`Y zf9RXd|7?RSVF*3wSW$L&YpdPne~+-h%%Tt2&;uUAc+3IMU4Tv6EyJOVewG=HgIA!} zCpgV80DGpJF${ZLWpy^0#+pU){-z#PUC>1A>Ev^c&-T@=^3ivYfzDG^Z{B70v#MoP znQ6_P_o`@A#T$xj|0*ATAAw2Qtwx5GO#PbgU;?hQD*Mwi7{dEm2{5dn$fAV&hGNmf zneMEW`dgRfpm`7T^B-O*76=|ApJTB{vZ{AcIXwWo)>4cGU1x!rk>JL)ahzh|mDlhP zaUuLgnN?{Yw$a0!Te=MjfuF-Pmbumz5(*BF6pM-mrTcS{f*#Ks)|o=599!^lg5}-{ zV4c^5HRuA%D$6y+7OESA?)o6s2K^+}JLw=vTb;BAI^envI&Xhnk2~E#0%}XQmlRXz zo_%xBi$_FQzOemBlLE1RwGyZ`-;I^9YRL^5{#jMok6mA_1(m7_cWILZ94dZ$pWb;9 z7A$FZxs#@yo#Kb&dN1*Gh6w*lzGDK%F|9QI5lb}jM%q~xO9G()B@K8^j2dl)@UL*GXIG*QJAo9k1(s1Z3(CI^7ls(Xty@w!Lt` zuKCp_fsT?^RW+DbmDruE%A6-M+>I60Z>egvGEt?#yriiA{hU+Z7jM8h6&NO%7HPcf zYl?QU_%*%WnGH|vsk3#=~xr)Q#W@^A6 zjE7YmS(&$?mpJ|t$ME)9Sw4%;9n0UzG6RpyyxamMWCRa-K)KN$M;U{aDFQRk!HhFZ zNaCH#sa(#IH(bkq@abW?K3(`odI_dpD0nl!H*Xj^IO7b^KEjudrYb8y%?erfAjZ5B zcMf^_r3l`pR1SYS*t(?ZpzQKTnwq`zO zVtladQP@qoDNCEemJ-o%Lw#4ETFMz!ozgt@3@kR)cd`Uf{|xh;Y{&+#$fE_#ly&W$ zXy87hdfJoBPp@W-Wm2L`qLXMM= z!YsTZ-OMtsmXSyfaE>17dd#ECp}y$Iw^jrT@fFtxIME#>**4olS0DUHj>Aldam4tn zrT~|ZPzEIR!mjF!Kb#jT%QtOf*??(AUZ(V$+#Lq@)I@)Y(Y`)d9UK!V7g>TlhDuz{ zwS4K&%w4K)t6R0%jk6oGvm3JyknLa4Odq*Vh+oml`XL#>&Rg$;qS7 zm)^aS5gu6X{OVwJ)~U3PT^0{+tTdRv$q&BA_;FOKBAz2!nbCIxGD4qP%z3PoG$*gi9w+9Ziggk@-YHS-#gGU1O26%^{B|6gM1ekzrn- zqkplPa&c?xDO*2&T(_^XTr6yVC)(QR==PSK?c<}JF_I=h#=(q+0Hy4AQv0 zuAf113_@XOM}^H7m>^xi4YNsACkrYagmaUgOwFl(q!5+VwJVRC$>Ta9KU&I$2{T8m zC>-8L$N7;gDB90byEYp-RC8BuqKfHxy~}dxDj#V#`~F(k*}((%B;++ z>ZQ+A`S#p=&w4S!w!Y|1WLAMQ-E${f%8ZfMz@i0t#mt~O60Co?|;t{*} z>>%I_UK^HS+Q2SrA7D5upPk*ooEc_zb@rTLkhK4QZ$xBdR#sI@Z5X8Lc;~(U|KI<< z|Nr~1l#MGYAs-qA&T1-3MKxuW&Y@bibVNkS=3B@|ELEfqM=mV$*zTtYs0h%SvNB}J z4RW!8D-H`+Y6`WK#sx-n5@^42WpUz0%VHl+Zm=+R zGjdRA?7_sSJVFWQ2-|Q6T@ZCK)FOJAox~W&xJrDABon~zUOu4Z##3ZjF|=3zZz|Jw z&l-yC)mveVl4MuPwGka1mC0oj(Rn=Ts8v}eP0dg)%C>TP)zuU`oUd5QlUR7_7323t zY`e0obS%^%m&)1_8b3_Re^{Vh1P31C5gl<^cY4;1etod*dvqmoX@vd?ScUeZ*?s$yY86=$n`@jhZ*9A#e@3rFI(pI~48 z_ah!Jh_LR^BHjWQ46d_r;Yh}7IDgqo%E^tAKULhnyC3;e<^ARTX_xc;I~zs^1*vml zxxfq3#3uHhRFWf!y&GQrf2pjd)s5S3xJ}vZ?ug%n3V(T(_XwBRIjFS0(I=QSI}%MEt4brw^%SKgaP77x!XR8 zk#0AWAxv%eDFNp2xc9Yr3}F9Od)_@`C?y`(en08|jFbJO+M2f&Th&q+h zE9AbiU(2;0xl^V5pZ6zss(?@LN$eZfckIEYU4zQIzQcT5nM6b!AFySG>L% z-9MPE19g9Yz7DDZdvm4aJUNn&u?$I>DK5!IddaZI5*)|z9MbXIwT(xeKfNCZX@YJs zJo}CN|I~SOL(1*UO6lIzDvuL_a+pcyRfCz-m-Yk^{`84B^)id@C9Yxj zdbu@YTeI`l$5i!W*21hFw&p$hF=M741oau?WAZCOO$+Ac0?j$@y2o7_x92Q(J~(DE zvoc#TnRP51@1^29`EjE{B@87#NP&n{jO3wOs4qVIX}-EXG*rq$Fi>0qjF6JI`= z?Vx6Q+5|mqNXMkRfCFJ#!wozJXkZD-J}7BTd8R)2M|fd*QH@L`p$Zd z66RRduxjXx=>}X_4kNTtU1%)z=6aP`9Rn)c^-|p^*(C$cw#SI2*FP=G+rq1XDdjaq zCoY33y}8<(s|E~h$5>FE>#c6W6p7(ZIWuKPKi*$%*GigcYNc9xxqn=DWaA!~TWzI2 z7xB8Bw_zF2w@UZl9M>a54&fcncbEq^!TKo?npakJQ&*V=72%EY{vx7ULt-DM28F*f zsuuwxS7l7?;;znQzj61?wV@%l-tjrN;ghzR_A6oPErG-tqzOL0W^pln>Qy8oi;Vksin0)^yYpe z3^QspL$_acUjBc!)|OhLx;y^zZ%}Fp0*ii{H?zVcBw(1%HgZ(DND7gib8{)FiF0XJJ{ZT2O7YmX7p%s+l?I^X}|? zZ&^t6FE|?$y8YnI>9!c%PU(;~ZbGxs9${K{rM&TxuPjgN$rQcN{|b5Bj5Kb7(eR%oa61Z_qUs)a!;8l_HHFjCws_ z4|rt{T3UY8yx5c1KEEcz8CuH|s`e7R;znJs{$Jd*iyp!_FuKOQ+B5xJW$J(i6+`1gLf4tg7;{W3sBI&$c!7qCl<@<6O8lsd^S2jnuQ~5p-6>Khwr! z`a$U#>4&BN`mal_V&i&G31jrYNxYAC+<(I&4tex~OOt}`Z*5)R?os@()#-d!gna=~ z5+9!s`Lq0~h$OL{wxfqg41K|!()nyJpSK*m&FII7D!{O{fJ@#^@U|sG5?{wg$q@@W`ea+U>l|tmZ~$AIG8of*&wdWR7;^{8g@{sHH0}~5{LLMj1#zjnaYO= zIV{uc{2djlVaf44r(}7NZMLGQW!ll`8L*i>rE_l{xnuu);Tl=aaMV^LD(RBTBR?OK zHl>r&ZPInhadcbKqI3lMkK3ekAcZHSivlNd zqb->4=cej$f5Ho!TKY96K)3*_c(z3dI^yq;lo`597lZ~J_h_Sltmxd4l5N? z5v+p_RI*q11VRFVriHW(PoaUf;xXBcqdmXa?P_(Knp)R1K^D~a6MVA8CE}wz>YYw! zu3rE7F#(PPK1+VO=8EzPxQ#PLRX)q{_nwg6FMUY*nDnF4=cF&9#WV7n3`QnZ!@_mU zPSEAw zGFrAhx4rDE&;P&-EI-ozt|scrXtGOe(_ww7WIJ zJd=V#c?oN{!_u~NJIrn$mEIw}5BinopuBz(%IkkXB#DuZ7H#-gu?(jc$>bNjcnbBP z_$%=?DZcF&%12bCU68Ef$UX%uo?D@KQ1{bPVWJ3Y#ga;&RiMEB+n`WlRVXk$^2csff>yn7cjR zmhuL4ct9KYgOFx*pXThPtB}F1`!!WJzzdhqI4@tnc&Kq`f|rHHlTYr!3+Lvb_WS}Q zxv&o}*CGAJLpRJzWeP6|Hij@89cSik(MDq?%$xEe44AXwx6bO-F_XqvN%P)Z4Cdz zv(^}D4XzO2*l?n9C5kLB$SVAkm84--iPJEdIwAj%3Q!$NF5co)iCcF~eY`BH(h^59 zk2&@*WW$FKo2d&lnzSDz6_uF{hg8kR7)7o9#s`sZ0x6{G+;S-=@ICtptthjlDKd+3 z0L^g!w>=n>-?-2|F`d>)p-m%is?7Gv^&px3>~uQzQ?1u8Gv&4a{MvseYh(>Z+Z|rt zj*ycwx`XxFIrbFHG)~GG8B&evKt;feWoW)wbMDJ%}QYt{4*DIcXic_v|DOtP9F{3wm6kf z$vN3`K&G0@32B@|{Yw2c6OK_Yz}c2b3>UMq)`P(~4j<9F>^})fRL@rCo_fG`s^zVX znVmOp#laV>TBqT-W+uxsPY>>XfF@qK?rp%MtvB!7XOV@_bu72w7m4{FlKO~pI*wp7 zK>{m~m(v2H(IW4+adLX&oNrX-D5vYNWff$4J5Bt!?)Ao{y7Ba&EJzgbMtA8`2d&=G zv8{jumZYR1)C!dADUu8btL~vt)i>*UWEB)jzA=4TDeBX>Ek;k{dYp#++#F6Ju?Hlr z6gA2Yzsnkx#b(7a)nK-ZJ`;z4+HL7gY1@?y6H#pKAvU^D?}~u^gBUu-^7;@|ZJkF) zKsTdOGUUr8={MN0_3yaDG*oJkJMQS~dS5qTLT?#{iMJK~2Mt|S75=JS(oId_@35_d z-#y|}MZZma$Z*t3N@2MEA^!Cjd|jcBiFd1p&0hgKMjk^5;|#Qbqhrz;=}zfh5la~u zC>ICTNO-SEarSUHE$|QsgbSj_Qq~2_|655n2&JZ_8>XonRQ;zTPD}&tH+Kac>K{8+ zI(Dot%Xh#L?jPhg|19J25HhEyT=AQaPDUL{Q^wr<)bukVz%P6ji+KNA=;2#XNdf8Vrh+ropVJFM}! z$rw5hD8FVKR0G*5it3xTWx#ZS>as$8(>Z(kv}Kh|KMZ|51a9os&W&QCu1JOy@=@0D z0>Vl^&aqZ9>)c(vWp{i9@T#ye(8Z}P%sa?fU-`?#(z%ObS2the;<2{Gceu#so93^N z&ln2OVR_7K99vX5vW7r$oSf6 z9JJUQ(rM|O^nmnU=>t42*6Y{8vB`I?kq0XLu%E=N-8+5*n&}ATE~g4w-$TiNO$2xP z{u|cLTCV8>2lRAd4|RWnhnyN4Z}xVLH+yUx;u53x4iGRey%DXhS_Qv15o-%Q)X|%87g{Lh+uJ{aTkm?k)W}J&{phZJ0<>L;8d(?C zfuU$4uvWjmPc*j4b%ALz8gT5G_F!Xk3@3D4Mju7O3Up422nksoqivde#&b9!P-~`l zGzAJTOvq>9Z&p4?6(X#l19p;*zq_jwI`ofajg(}0TTzH(n|7#clR*IMva%_wrmB>g zR<>7GbX#RpWVBay2gvBN-Yx>F`-tgUZ8tTaI!I21*o3`ZaS4Zl6cIX!Lj{ZNqv3eC z!JpVo=R`O`GKI7$a!RJ>c2HgWsonW|-(@+m6pI&eKM;$&#XSy=Wvkyjz!=bSgtX^d z=&sGzpOYa%cnpe5pyE2=3$S0)G;;^zddZ(u6-$5hRozn5cQVIdhOVG5x!iHiR-~E763iQ$i ze*EXQ=2EL9yQ=ES|GOTPl=3~|#)Rj#{oztcE|(v+eGuHDZ`*G8b$T?u=lR?F zW|+%lOP^VAs7YOFoGd9`5GhgkrunV;$X;)p-fk%~^;xpW)71F!WT^}kyva0`q%4~s z;^}?HG+|<|m`6BmcL5oydTSw9L4n1|6mMVs4{S!6(Jh&6sHG6{3=UIAF@Os5FXp#y zn_ag9GCMrI9Y!O2298M^2|ppRs2{hpiVD~L5pEe=rGriETaOU!N3_RrjP>|=Lknd& z)Qt08+`45K&YKvsC8XwgW?H1F=_Vh{g?dHNehOj%|}xeQ3U*Ui&DzMDPFEEmM(?gfKJ$ej5&@bb8c zHxV@-f3ZNe{#43RzK@P+FYpzc+@c_Druj^%oi^5+(6qFn${;?+Wk`OMS2xe;;ziH9 zc*%7yU3&_%GIgFWd+`FR%1FRgCkh{rqO4y>na!ZbM6qQ1)64MkF1Y~>Pc@rgBf+HP z;KQ9xcV{%$L~IESX50a^q)llJX53=D6Spxl;FyW#6G!5`n1`(A8(OnOfMJtz1;m2D!?#r0=}@&1b;B8zcDq!a`PCFE z;`eO$bSto)vjTod@gZwGwt6I$p`C0{kt*a>Ox`hnDt0y^&$lHg} zNd9F!kcD851lGH{U$y;r)!x!p+OxF?$nfp2cHd%8Kg@aQO)#^buy%}pXyAmKB={$=J9aV0k#`0HZg?=xoD(SObE+01caEZj zwb^#$+s{ToYsmS2UQryuW~ix`Rl0g+l1V3!sruyzxZEQA_rTn7o&a!vhB(M@^ktP^ zhf?ia#6taVMl7duMg}~GP`8$)b!n6HeLh1f;^?xa6s%+%0!u7!aOP4hy+mw__fZPa zv%~ax5*)mXoPr*u_$4#xeyFmbsBZ)ALMTJy;>A_aP%O@dP)a-?>=CN!?{VlBBSlyH zJyltdw~(_=L#11w+VJ}>FnJ|a(!j#86ps5=Nkb|@E$&LI(0^Z$E{Rx`Y>hh`Z61-) zFmaRR?nh+=lXgj&Wf#M>G`OpVCT=)RJSn4@U%8K15^!edLW$5I!y_Wf1tgDgR)(A1 z-;Eb%3`Pt?B~*(W9?VqlD^KMJ2?HBUL%>S1q+PJ6E-7 zY4*L0$%KL4D9kjNqN-+TH1`qllUAq1PhtaskDf0kq^RjBbovOxE@-rXRi8$h8V7+dtZJnA@CTvR{{bSkkJ0n|-pKVA zIBC=9+n$PGKkj3=G8rxR0D%=3v>)3gvcd|sdt)*av7V0Y8;eNLvo}%GV?cdBrIYkc zj{s3XuD=KMuarIHCuq&_<)nYdZMmn*WkjODcKt!!`;hK=`iDII2et2{fxk}NMh#Ygl(i!$fJ!>7KXXD?4eD#jLi~5>JMk>%y+c(Nmc()_{LnV85vQ`|~e!{^-6sznOyt6=c($ zuIbPrjYLBBQSwQdNU3g1e-3&V=V)T%d=I`ubt-fjE?&y@_(yYf%G;DQoyuM*^%BMt z^5D3D0nZ=_*Y3VHB${lI*n zX(sWokXzoizxwji&8H8@GX5Ag><72&Vt<9jg`TW98v2z!R8Imj-Zc=~)voRpt7q5H z=b+m0D_rdaEY9VF>cxnR>9t|sc6}=I#TxLTBKzZmntk}ck#;>B#*Ak^UDLmZ(gGbf z)vk}mo_Vnhc7%S3QNs(f$#amZL=SN3VwIiBGmD3>|uQH)ESY@*9jTw*Z2apiWa zr=e}mU;{B)PZIQJQey7AB{o9K!!ky#-xR?!dKl9laXL9v33@BEd2IMcs&Vsp62-)F zs&hdlZk{NYV&dwtJy)ZKRdWrmWSG>}87;-WhhUbLVcQBkGYIib<}t-!x}%wfR}aaG zqr~N?-!RNl63kT{TaA;bU$@Na@si_QHZ*22Lo-a3D$LR`R! z6A;@cM6A%%k^NLyiz27#ti{M)x*kUJuECo6l>qZh#hkY4~42{pljSEJWSNL?*8>H%>Wn6rq{Bklr*zT%JeGs zhlBnvE2G$-3;FXi4%cj0S7?+6`--0TQn9SA@r8Zwv zyImDd%0D@81wjIDj)~iUB3{DBK76}9_9UAyJ;>r|0p-^V-}f^vJWSc=&l9MP>B-g~IoQ7JiV*p*AUp zNN6eg_KjT4$NcPB(J9?cwV4&a;QPuvlE7e(G`=<>>+^I98_$zzd{DCc7o^H%N@(VV zzM96gFL<}_D49^_37sa@(Hvi_Ss#l+PK-k@Q@1GxHOQ@llpIkt48ROCpwM~53H>szN2o@6Yh(-P0S`jH#UsIef~htCIlrbdXv-bE zIm;P0(?{LHy1V?^D||iku=F13e}?v4ghA_d2RtBH4`Z<~^hd_Nm^&DvyE633+-tc> z*2^N+RSuD{KC2|<{u(+a;u0suJ6=QYM07tq1>E;H`IENBT%|3bHCh5pqjf~a?w>m| z4*DBBJQ@6u=h7SS(SryL41X-v`sjHN*+AZMoJQR&lVxbIV_T7l?CPpU;Ygv6mNhl7 z{5sJcdFJpzM(tHKgouAAgM-o4}A%V9=0_s_3+J`cxYvt*Svx4H{FTo3e4bhT9!B)NThmH29%x>XW}a-AaF_Vg%^? zmlznzh6-49(80fYuG3aju3kJ!xvfGWlfDk6FDI>~Hv7n|G z*hIliFTaUmoK~DXz5y>)J~xxprl>Th$6VAPtd?;%ghI^=5GF7=^P^a>wHnEZZU>kVxqPIY`b0>7MI3IEo^afq_F$O$E%!Z=dXBeQFI!n0;e7L{-v4`U zZS{_|^-aChO6Fr-wTb;SFj>Z6R~?u#bvP8=HRpB`IBz1)R^RcCs<*iKOE^^dN{scR z3*B9pgQQ4BdKmWuMtWFILsB4ZFM58hK*+kF?fKpG{ATr?@2q-DOTS>hiTLpEw+^I7 z$mhsj^6~NoK-6&&2?d+6y~KmzPWBd06N~sO95iN(oL%xcvZs95bb9s@&p17k;$eHy zBRZm*^l}=()NpM2 zl8yK`xD`VQrmmyw^!XHa&Wz|aM_i0^#u>$!J?hVKc%qJinye}19~V>~5)0?s>B3^l zTdFIs67(vb6R{yuyL~jMfJr8wX02m?+snNY(C~>3hI`enKlB0;5uI8VG%JQ1mRhET zQT|NNG;0w_Dxcb2*S_eQDlK`M9yTM(8Pxk`V8Y-1@3_wogCCe)@iN*`&zpkwC?$;@ z#KT^+{~6Lp_F>?oyJ;uRJMRZ7|7^rUXpUI;`KiQD%Kg;qkoz9B_Qu3MUWfM;`(t}l z=t;SsdL44#gZ3K}`#A0Ui+yoA@zdL)jHq-8E2HXfxGlmZgUQ9KtEC|wiUBV5->vUeb_y?^t3x~?NuZ0=P> zY~H8E)1MTluZWT1ze!($Y}Mm0cO}2St3cayo&!OJPcY%|)QhP<0mTz^qDNplTM)#FaJq9#xT zEj{0uWd7~i1CN}IU2WbU+&1v%HT~+`c1Jgr&>Ef_TA^aWS6queuDixx5vSC}1WqrVORG7GTV5lHFx={(ju&kNr;QxG3>BeOv zu-FnM(9k;Ss;2r{`>bNWwNi3QiNV$`d%96_EZcHjM|Yf(uGwb--*ZgH48QJ&%w{Gt zEW2ixDkWFb9rzN2YO5D0p{q1dwT1gB$?+y|53(*D=3`E=wEtSY~A&=i#T9EZFm6g!62sL2ZZ^ep1mw_pw%a#urG2K@zQz^uX z^&}~nu+}ITWUxHIYH@E9_wuA+koKtUxETAjRPJBBgxihzFC(JyhAbMTJGM{SJa{*A z>IUW>?PIFP0mnJAcznYI_hN?w;TtyW4>&+Vj|UME|NgB0AM3Rr`k@cU_r*W{WbkDF zS?eP+m+9sDeeZkUef8R(`0w*q9*Q5lZ>zHPaJ|+T+4_(pk}nYZJ0jA8=!ZGjK;}Bi z9S-T_YhuhP%8ya{V~R5OPUf=`zZ4IMHvaBupD_6j8UBF#HC6o!ae0TL+yO88{^;6Y zS5=9mzH)7D#i1btaCh^R3~ih&@Nt2R+cblCXJL5omLRFE%+5@J{*dwQ? zO`Q8R?S6;Y^wcAa$q2S2r%a4Q%b?%l@=%PZTG~*I7B@CE^U(2m-h|$F>ymQ6<#bxB z^M+rx2E+{G$dMa%#WX5*WHLQ8LVAB02TSFy9Rx63dT;Y+oj0AG)4h2{Het}#O6=G- zI#y^ax^Kp+S*e(+u7)8~bn7F~vNVmo~E*!?iHE$A;R1u^t>++io(utl3MK1vjD z1zpxo_p8y9d|>HR{c}tImhGQKYb4+PfMvW@_wDN!E&Ty#?!Q;oi2p6!BHvM|ZuxOw zU$=ezt%mghJ0Q>NmIhxaN)ZPM>DUl4CV0D<5rY%ENlIAO*b9Gl4E4&tZrFZG*bC!S znS9!F-u9nVwdbgMA6fD3oVv~!aeP4Yq;H?6D!otDGMh4P7ZC9140*er(vy+H1+$7i zHy^Nd%=Ut%e-F${P!?5RYys@^}I zUx6j0JIJzfl*bFx z?JBR2GK{7h7Z>fg8k2ThlO1zmAo4<>~eMl=pBFOL{^iXGg!~%EPgnuV*RS&!$f<^7^6X z^UgIM_vkLJ#c>-=7RHWQ251A(9u$t*Y#Fy^^VpP3+?TXVez^lJm^V7W#M3K#macS0 zhq7;oX=FN?OoLdhz;n}~9Wy&b9uDWIW15}(;FZs&mR1k*v;RSU1MTD}4m-~MYrxxE z3z$6#UO+*okUci&-o|? zwVNOALiOK4^NQ=Dq2EE1Fh2=aQ~th)wdr7igckb-B6EL(Sy^401sN=*?K8Lg!Z3)~ z2?7h)*FndQXauZ_xNCetF3t=;kBhy|XSrq1{GdS>j_jPV=R$O_gSTNw2+v7#=XD zJzm(~DA+9J%b{@@M$KX`mT#vr=&BW592gF8nXxcC!d;|o4iB%=PPPOF)Zijv9rr*P zD|tq%e{5^9#AerEM%!riXJ`8-`^{$mtN8UMF2<=>`J$XfYw%O1DK(WdUf$kbo1yWc z;qmo3)uQvw{)vs**^LwZW>#-sO|gTei1mj_e~tCp$?#*3Y%DBn)M~vmXUWPh+;-c> z#wR~HHYeHMZM(@@aVa%j;{KWKR&RjI-h+)a;t#s$t|##kGP3M^f552Y>n<}E=V$6p z(=O?BR(CX`J6Eq*jiR~dyDXTv1E0*a!+O(RV}{Kr7M5Xqjiz~2W25#nl3wO>n+}e` z`$@moW{7bvT&zkkT#PyNC|XNl9h)I1!dt`2>EzT-ZL|IZn#m}gzjdJmL*K9&o*fKc zc;R#R-uuIZGJMr?LlWyM(`}CgHYx7oD;#}8>deRUG#(}=2wafrtA9zfSO4dSHfLeT{w=R&I)Os9a~f3w$2+_f z*_}jlTZdY%7B(XiHqY8tqed-If<|bR53MvvX|YmSERmquZiZrR@K=0pfGE*Vh+&D^A?D!tNo5N6Ccdfsp$M30)bcIf`C&@S|YHcNE2MRCK1wmVS?pf#g{E z$h_q(B&58svQQ@Rd?=R}Vh@HNjew~dq*Gh!mGnSH{Vo9GGoGOUx|CFy;=g%*s}|6UUvhM&(Lpsa?v-LMC(A@12?e=sEJJ7HW^GsyKb& z8OENWHWjCQJRsIa+f#5-ah*1s$F%q)W%!R|Q+|k$hs5cFs%_iqgPQhWc0poQ{fMF| z9}%a&ix|_->Y@H@c9Hkh+_n~RBvA6{KtW554O_zakPjesO6^jqz1S{!o^jMkN{X(O z66dJld8Ia~mgYiPJH3 zI&U#P598qz*196sLXZVPn8w!7KQO>>2+6!3#jB0RY8?6V2@jnhsDinL3uG;Zu8q*z zwi_bdF3dTcY5bl z+zQ8L#af0AJ))GHQ2!UIhP(5 zXDO?oSiG_5;nUg)JxMP$KSdc|1%eW{Mk|IFG#5e_Diu4πR(XEyYV3az{Ot$Y*f93mYq^Lnu{qbYp!X!TA9&! zE-IItGEKZ{gMP4Nd#xGUa1=;JG3Pv}=~igMHBlVHo@se@2@*-F)x;^M`yc7LKu=nh zhA_grH$yzgP~Jdm()hD&SH=^MgaTh61QR<#GK=rQaO4x6U2~|tOMDBiVFfUVF-$`{ zM<|?NloMDpTixy!w|>^OBf`pPm2YOj_yE1m)YZVcW_SuUG!acvGpOPj*Q}t^SxvY6 zMw@@dD@iJ>i?)HcRjHqjUAt+&$qDU?<9a&##C}v@AjXWNIrQVpFoMK^u?a-Ih|y&6 z=4{#968MJCMOP#2CpnTs0ELJ9iK@U9fx#`V3x4B8_-}*}d01MIR-{eoG)8!ivO(o$ zI%4N8Hf?cCy{r4fzL-U^tjot~B7zSB-3Tyoq3m^2DlydUix~QaQyJ}W_{9hLb_FiV zBRa%Yv1%%yC)6>536NXkNE9!=fCo(j!nIUK4)ZxtPr6&WU;5sO9g6)()bis7tAirkm@kH)(n*}lhV+HnJ;M8R_7%gBj^6CN-l#Q*Co`X z5m#ya<-R7)lZ>Gz!2p@$Re;__w5$p=INcYnLKWXz+c`xSqe!e*aXLCMV(+K%gI}k7 z`@Iytabxq@8<6JJ%XqLjfd@+L68t6%Ie4-$HkTgln?EUi5Vfc18dX%7q-*)=uW4GkCT3cDubQN#OR zQkYUl8^)UQOVC~N2}@nxNz;YHOH&iOFqYxFClW#9k-B_nJVP`sf%|OSFMUHAV2d#< z%z4sjcNT_9%mw#BwMTz9EML17-HIKcWd9??}rG#6vLb&&H3?O}N$|=*M5^lwJ^cA=P>aYVnbJ!tJ*?!H zs{4qfr2C6{o(}>QV&IY?8aWQRaa}%?O5*V1j$Nm0joSqXTM=I~87EN$?E`=T+CI9Vj2(a|=eUl1b5h`w-Aby?L z=j)~`VlYY)MqH!xXCpM2mC%gX$YS44jR~T3m5v)ah=iva zY6&XRJV!QS2U>?I*;@BLsqSIK@akU*$nw#CQ^@zZa-Z@7uzefnk9^rbhWQe`toigI z3Mbv<>)6~*;vrqTOyRK)r!$$ubUud*xqo(;qF&~ywKJLZ`o;AkfnhT2wJ(YELt)vu z^Q7kdZ=rFaISnee&R&wX(84(Z zE~gM9Hd$Q4a;h-uO)i}N)^iVDerl4k)QnUW6y8ZcLx8^LKvIM~1d)(A|!u(Me?xuPj>HcX<)2BWg4C9Z1e z@BL9t31v-lwpv?`rpcj#ErV~pC@SBzbpPd?&Z|Y_J1vU1luZgVxstZP{hJ8keohNo z3FcC?sXK~7TaF(wYl|*WgUB*5-~wl<9;8LGGvnvcxCdp2u^BJ|DkhuIB} zQw6-SgLog_ytu{ESd%-r3vcHW@{k7(KS|z#lIm^sxSX_iYSCV@ie6V4eD8;KS9Phy zppCZ9+<)5g;L4(&;{GonK2=5GJw9D{Uw#8+V(4v4Q`j6@G7v=}Xk;+Q6wPYu#>8Ip z>SWv<6e~&y9mLDrlN?QEhU?rB94EJ0ar^o2m(N%P#!kLxoKR&lZ!y{EX}XGrbec?5 zJuYlZ%SMATActy8L{^)oX3!dppuFmA$5((gPS$I$y!HxTPr~(Q?DhHH0T3h%?1cp* z-~8DewyhZhBqN(LJwn+M^R#7KwjyiB-MLhw%pxsIwwE;zUcm?O8A!;Ofe#q1UD|PH zaIdhC-`0US78mhxUY=qj^tu}dk@Bwd}P31uP0{8|0Axx#4&@?q= zj!ROY`4nIA6*jUwH2G%QLE*4$mHT)?)q0~`-L6_RVyaSo?;U!`B9$&f+3A6HL_=!T zTi+1V5mh4=>UX@is;DfYmeNu&1xPf|mo$3p4awy7mE*93+=`e+ZCv_2NmAF=168W3 zD0golD;%;yr}rrOfyG#pbp^x3k_@|I<8EcF94kQcBPrg^G^*Im74VQO?WX$MH&?b~ zX$n)-n=9Ihay)!+IgUY+3=S&1UrZ@QAskd@9pR6nj+K)GG~Jz#d(&KdH(59@j;Q+3 z&6UY_Qks`;x)@$}yEvK&6g;A!Avvf>eqCVX=-S=rhIP-z4U|kN6_%!M+=KJ>yS2ZT zHgPYGZn90B!thNth*RZJEWcZBp!|x6Ksk00PU;66n+KKQAE{cSfXKsvd=4x{bNqV_ z{IjbZ-}+rB$Nf0F$+Dcv_)V7P9&&konZ)JIZgTVl;m(*XG)kBu!XdNV2i|Z4 z5WY;x{q-UKLug72qneb5>xhH}GQm{=t-Z#9s|F`Ye{H?oO@!YJ zFc~ypC!{b0g1-;8b$X6PWDD@**ph+lz!Ow#!l;tCqoBe31Dnj!Zktokn6xf#k9@Ox8M>uFNNpCNuV2^_?%104QQ>{9aOdmh%V?nbA|4(T zD@qzZ77q1L-{3u%Hym`BYYacZz3$1NPFYuQWEJ1-+g!o zDd+K7Ydl`dDo3zwaZsgR(*zY_Xwl+(6Jh!6z{iJn!E^oAoN!O1Tp_n{X z^>B1%+e#N`<6SWj^$hOY*nAhqhc7t)czAiF5<;lqQ@Ggu9~H%;mg@7pC0o|lQ)7=! zl!VQ9ntW)cX9TqTYOXZju=E#o^QD(eI9Y#lx+0{;m7Sygu4b`%pi#alU3rUwg5*4> zLQMto#x+J)cBjU#bNi?o%++S4Bhtw{{_AMAR^SxboG>{~CN>x@5mCqSu*mCoGp+4+ zj=UmsPsz*a6zna$rZ=;S|3q50a0q$vW`&#jB1kXi_9Wx8%if;*mSb;rMu-RIu8>VNx>g_>LcC|ya?7g-h zN$NOFj#QHtIV%2mJ>Qd#RWi1jQpok(RAMMOw@X$Wgk?k-Zy>m|l!C0*c+P|T5Dt)c`B{zIq!n-KrR$|SKX5-k?t29z>Md0EEoiP4#XwTv@Ga!x zxu{M^J^K6z`u1U{5nI@@Zp&+MY2c;F#Ys~iXtWg{N~fhaOYbP`J@c`B?yYnL?d$sK zvy^WBEVUeqS+?Wd&n|jx);}o^F+LqyK;sHQe^yTVjlg=*3XqTdBEkbzUxXGcyD-Fd z%^!)=)+c0LX1>RmbJAhV^O>x_g5Tb%lxijA*3qT7$8t+w@zN9fOyX~=V_PbDMyEvA zVVdv^Q7v0icgf)bMzz(d8ioyOs94Ob%vMZhDgIf@SDZLf9zseUQrs6% zTdz2+dHA+E-*T?`_Ep(zGKG(xvpEJysv@u_OxJnaijC^)mQtvx6+SqwErc9A)VF1s<=~-VXvn(70brRd z+djt*4Hs&BxLZkkPi!L%E^9xR^%?0NXeBR7e@FV!H!k(udU?z&ncKpnD;|c(;PWaN zP>qfH#*lrA3B8^|KyjW|6bE}bSJoe*YGr<&vy5{EmBOG=%sf@C4E=?JLUiT6_~GlW zO;8SELW}rEd1`Hy&L5eFjy|3%(`8}iyf&gKqS=o|zMQ;18XU7m8fK;{{QxD5C`K6E zd4NDwya2e$wm1ZD=0+P8s$c_Aw+fZ8OVXGLY>b&JX`fr*sNnN$!uSa1%^UsogvYn+ zvi>-B%orzEGJ&vj1$*&ol0DviCa!&R)R)%@la=`r>X`~b*C280ypw? zx58k=_3@Hi(lz}Vkq{n!%`$5hMb#6hG#3%ePU`p7Dz;?>%XH2)R*x5&yc zuBJhBUs1Fi3taPUNhFtxjY{>?7sJY2ZsqWgcWm>ADlO;nd zYg9Mus+5jHrC%m~>IXi;e;e$&c%kTrF8;QJTloV*DIX94JftjLNcETVbTc%z{;rFu zi9EYIvyr{s3XGd0^miO)=4M4)i3#L@NVh1|&9Cd)9JTaseklz%iwjXdqSHAFe{f-K zjcRsIKjz~J{EA&z4^wic^D%4p&Sn{?-yF*sU2x~VK6h<|KDjeaLG&YYbE7%SVaU6e zw$R1#wy;*7SbSLDJi-w)hQhKk9l4E`Rb4VDuCelH&fMC~R%v#F!JuJ6GYvg)}Wj&!&5p0WAP5yGc3vm=a-X)AI2 z^DV49r;TCTQ#p!Kek}d^KEi0ggE;nipkZ_kDCe{R=aOM|_nAB{KbMFQvp5xTG!h|rD3D&aS4p4rz@b7DTm(D8%ElMwb zKY;&Qc$m+xKD~D#HpVn4yUf}|QMR|fj*{G`&b+QVv3JSst^6ZjXha_BLqFS(v5SrK zwdN#7;-PQ7)}di}HYo*Ob-BM>tuEJKfVVnNR+37iW9t4VYWT3fTq7NPJXaa@KZnzG zpJnt%;3ziBqTE;!*``ebEDT!(UHfId*sa9@LCk@B=hsh)e&2z>T;FTglI2RPgY?h8;!DwMwyTE z6G*d&t1lYsZZ9ieFvk z8xnjI;UauT8t_kp-x0VmD)ov952De|#b_-VBxCX@TYZk)p4yW@v9QeDpq~I$C*@T0 zMsh<*&XWF6h>w5p&yL~@=BQ!_ai1 zszlcevJxF*+WI;)O^NF_Tv~4WYaz@f)svLYLh5LJtc7a|^(zizi)?;T)#Dj&eVyvW z)Sg!$Wtg)KVJ<(Jw1F84Uue+J!_uA7=cHf2nZkyEm`G;|BC1v*79P?lTN<~P<`4;k zu7HW^im+OF^vqs&n8w25YZh&-$8D^|#9jm^s1Dt1JvCHio)mrk)ahihGY z#*Nj7-PB6L<8UeK_#&1Km{Tk~wGdjGuF4pXhA5g0a@TAa;yHHRDVegaDjuUU8ZJ1i+_wL=fBRQ=F3EK5;zeU?D#x{h9A=~>GB!m#`?Vj`kOoRn^d8uPI91deJW zZjLiUhIuE9Ur`?w4<{V8hi9f#osB_KjSM;)=OJk83g?M4uP_VzN#KF#9qWNilvWFi;?T) z)YWN4nN=PADQg=Wm2K-O-BD+i|FLI!!hW3f~O(JSr~!myChw&&MrpM%Ua>LY3w`~V7>IEQe9`NZ}0d@X9vbO z=N11cLT{0k^NM_n7I6VbXHkA$4HjK&OE__rE|8gbL}xClM3`Sx7pT6uKC zI9oAsdQ5sJ=-wx|&pB_cXL46jY)6OFCAUjDsS?GR z10Kw*ds7TV*k~A@8Ij~F`kq?17S5Qaz)c~hIdgGBm>(+&F4Zc2ZT(%8*LKLoR@fFh zn=2;qL6$x(*-|T2|WSNT<+b=i#MuW*RYrsX>w=0XL70KG=u-tCPk<6HUfvAu?{HZ@S z2A?r;lB8Yb@uYM~dJaY>|M-T>11ka(FnKVv>xz(}O~kCk0mKpB><%}f&a^j&I3PKW z;9AEC+DA^7LBcCUT17U~*glix*zV=!$l^VVsCCS+h;5L(G}iMnBZf^ZH7UD+pw%HSuI;8 z`X-CDTA$awBhqmmmn18YA}Ed6N6B{7#cI+Nz^Ek7g5a!|SFtRNvVYMp<5s$UhQnE9 z%dCB&Rkvh_Vd#^qTi0-&ea+G%W^u&SY2Z&r{z%IFZT%GAsv}|K`-f9}tLYRLz|DrK zvqY|p!nQEQ5QCq^-be_m1QhYf>C~ScWAv;57dxX{UzPbHt^DQd*T1GImyint#>%gZ z{N~y&-YwQ8UqS=AFOew9@e*oM1SN$LefShR=D>*DOipzFY3$=}7lvpEb4upq*nP;2 z<)55=WY*R+Tb%xbEQ_#Kvi$29toe5=m>*FUN(WlxiM%>_9;+nH7SYp_K28Bq#_(yD z%Uqi6zibeTJ;W^1@K-liUruxR^)%P{FEO1Eoxw?$QXD(p{x_vV*^WUJr$auL306qN{&hf~5(ipO{qhF%HiBd$(yo3A01Jq+!j z`P|rS7xnvDU}c9s!a1A9^NerlKcHLw5d}EZH3RoMfNN7*Nx4PeM&Pa?_)IzXehWGO zIx|i7^^o&Q;HYw^NFfB3j`1zlM|Fu{Kj%?gUp8roYN%YFxHz@l6UNU|lE8;C4{t%!2I3A$gXX^cUCFLOF zmUblvL!tkJ$mEaBVzPyFISzWXfopDM4^nIQx~FjY7uTU?Nq>I*BCMk%-8jzfmyD8P3)3TT{gSEFK!`ElTU~)bwUzY9>CB{eady^PhV)8u*HU z%k*3&nwd>Zr2}p zkeigweXcWT&$t#<*ECaR#4rexO>IrpOn0U|aNI(?Je~U;WH|B|iVESQ(>+AV%kk2DIKOpv3yo`PM>Z?P`})zX(Hi!%&5e1b8}l9jIF-fkl|Uq3(w}^kNaUBZOo+0=u53qzTf_BzM{8*8a)(4ZKy)KfJr%s zB=EA^EHZ6^_;OV|OTMMj$kiK~Z{u?N1t3nhu4_LfCf;8VQ~HXhQn?}1$P8Y>;X_+D z7op#XWBw1uG8p%wXbwr$MOAJq=ZIO{E5ZGSTcq2i`}5If5@%RP{c)g^v4sf{9Zg{7 z;8J65lF{p@yYZmqXG?XAn~mNY7twJ;)6IJ61->rk>PI$?=x!vK`7v>NH=jv#aY8^= z>ZNNIbhEtYoZ)b1TFJUrs&C;pZ-)6DV=$3>0%57d0v8;+WVF_m#h(;$3TB|iA432C zp4?6a#!>lVl}oY(mdsg0gnLV^LSkTcyBN7*WCPnSSi=@=nR|oHZu^3ee7bsdNiYY8 z3pxKFi>pV6t6O~jYU)}pDi|58+JRW)A%T5?3y7HMN=wEvxmpm#n{_LCGh+|nJakfY zEV91l+t;`yx9#Wl&gk#6nXW?P?r*~Jba!j7OOD7xU@$>PNBC%%51mTGS-#?$Y42{` zhHP!WsLoap2PTa7Dl{ww^eGtnsMl0_-3(}^($~f`{X0Sgje?4sp-IfpQd~m^WdW(s zkMo&{=EF^@=#Nj@0_Xkz63kS72K0c#o1VhB^rIt3n-i|E*%2m{H~i(0dzH4jn*#1< zGqw7{FbX|afQX6JR9rHFnJDAG;<55D*&*MR;h^O3KOsz=H?1fLBh!q+AhOJPYRGgR zAHZXL0FUQYMZV!L`#Li$g;63Kj4>VBiAH z0G@p$v^)c&+v~RJmuB2fsZuh^Ny%1JquxO8J=cl-c?bFu*^n7ia6tsR6{gyHV7am1 za_R+pFCKq(QJV01>Zhx?eA#xHaK!l&xRQI4h(1-=p}$0#rdxz4s&Buf{r|;%3y>vO zd0wA$y8HC&cK7YR-F@HlxO4B_-I<-)o!Pnf&aQT}TCIe%gQNv52us>UDiaDWM>ximPmEsR~KqGImP1pb}KBkg8QBPMHwOHXBz=#UlTI zPQUIvRx5)l(rkC%ex3K}|3Clte}8_wA_eyUB7RgJDK4bPrFcIM%&;eSq&{Bj(oSw? zK8cp*H8kSliWy9~C@H{*!v3=^*4s)s`X1`MAW*(2cE;7K6<>w#v~9q{SDpMg&EU5P z+|}2 z;f{Nk-+AfHx7^fxszti*`@);w{41Zm?+bsHW1HYJh4@w>>7e0L=lE|KEu_n2sK*H+ zKH>!9b%1P&IGka8adc=9)q+YjsPVAo9qd=N{;i2)*StzQG7MeQXKMa|n!y*tR^#A- zLq;Vus1w_&$7_Qco$Ev^E~wP;Jk&{0uehX@;~f7?`D+Cud<%X`Oq4Nns`y;_y4JrRPGtMO*ikS=+9$=)~}3H z0!WE8>T!5|^r^;$M&rV#8;2LkD|5}+FJ;dj5YG;$pUuLr@jduDKiPPo z(Rko|&<(k2-S+-_SAET#U7wl!-raZq-ud(Yh`3?Zb!=|mcnWZbsaS+l) z2FhcK((k1x;k6Vt9Lai4F~Tv=7Rt+cAPaTMO*gC))vg4wAM{#&%dCXe*?RZQ@mvIw z@mOT#PYjI@7Hn>MeycNAapS>itKN8P5Z8va`0g}QGN#tIq2EUUd_aT0$ODT@PCd|P zWLU$s@iN`+5YwZtp_WNVhZ=YYO5p20YHAd1<{JN~p%cr3qYNXh{BIaTeU!kG-az!v zM6ePjGSI8osIqfm3UC^Z8%-pJLqNxay_;={>1ABrv7DB^jO>Ce0(wk39YKUp>|x47!iK zKW??+w}(o$KHF9PT&%12a5kEX%2UL~-OOUqA!2TrN5?%B+!7?4$>!PSdh;tJYArWt zM7*ZgOB#)^71@5JG9QkQ9sAnX{_)*+U#?!L)sw(-+=?45#DN3XWo$KF$Z9L89E%q5 zRpe*MBW~pf9OuO$@_DQchPl0ZEEGx}!{2a}NNc6OSZy?VjmCcn8jXc|{pO@^L%ogW zJl`Rk^3q*_XZeO-p`QO@&3BiY#5s7!2OA6UK;t6b&})22gGp7LJuFPG&ejnJ9sK&bV{wR9HlL>+r=hpUX<{wE^K0&*;mPopE)f?om}TI5ouJf2u_nj`t{22~`nV zrs6`Y%5?e&wQH_hbBG8TXmL=iD#jyJXBw{4N*Ed;ps)3gFHlR>a^LJFfo^$^^1)ZJ z29OPDw2HvPWF#D%a7|Re7UAbI`MFh4GMsRK5TKG290+tXNlg6~A0Dg@s(kYEtiA($ zb>1}NxP7N()oSxWFkibPY)6S{&aY;&$2H|e&=?j(#6>i5AnH{{SVIgf8biup|JzMs_M^5s2EhxK@15w$voH(YWEZ#DM~5sd!xiKzsuks``ccO6Q%!I zKkjF7;QQhyOrEijHwt|HQIJE|hfz7k`8to*g=&$m5FM4V)Mf8e}f2*W}BYs7u9HyEnH zNkk0z#|_mazI1@Q&q%>5#5nz!s#8sUhYEih)z!z+cIByE5PROv={g zre4C$#krMPe0NM5DEj!~yMED+B}yNM%$66IV+-`sxM44w%1$|C&s2X$#7IJc>3Zp3 zwhg4X#*I>rqZC4YpHyBi@MiBmPJd~+N!3bbGAU@J+7-0^u^W%@y9n+xtAwNSIuslz%&0NMLVW| zh<^4ncO0G|%G40%<@_CnZcV-98*-PYUrPM(T^?{Rw@K{_V*ayX2E@K_vydHrrV5(e zU_oDaIvF!7L&E19YoRgy&$w= z2bC+V*u&xIDM~kl-1`)sed+){QChzQ4IJxGDT6@EnA{1DfGfCpHuq0`UdlNu5>==a z{yzAwy7(fM-?oGOKEF`7qy8XG0ydMJMeIrWdQ%ErCu5{7jMKSVc~SVNS3qN(E5#V; z<(_prM*SthP<#Ph^xl9@qcDUuRhl2SZb6s5ElqtEtL|BW(Utw{YAKDS8%c$)<<^=~ zf?Ect+FOnfsa}xG&E<4$<4J^Le39G17X@&3x@~0a@YEl0E>CB=%a{VFETSF#?F%5| z&=)AB&uc11H^WVv(Ev}wMoHtAqD?XNQ%*w=q;D6IL3TRk8QL61oY0}xW_9DKyk}p< zpXadN&Y>sqq;Me4;&Wg+`}!&Gm2wizt)I_F&QsGV|KT6bzVwrloAP8j{c!f&xx9SW zpjT(!t9&}0^->-36dVRxdXW-xuQXlXSHqN{w-3xxI05(9rowW&1uH&@v*pn&lNaYkx_xJ-D9Na zz9(#kp0Dp3FAv&QQWu_|og}gB2i25&Z7S`JSC%@~2|}=YD58v~2ayq47Eic|kt<** zskKT-oSH^<45!z-PR9#%%hE%yBE;oeyDPlDqR9=f#2mvAzthBfo zBs6CcjRVmXNk%9FiiUJ)+QB<gzR!%I87o<+d9BvPKu_)I5yyMsIgt?89JArHkGie*fmy=MEwNtC%)kdMOW@_UEb= zVtnpr7!C1yNLf3bO+d-n%5`{@nUSY(MLDIsPI)UxK#B-z%n{a$ak^6-1TFj$_O_O@ zdFEFCWs>JoXfitk$oEC{qx4_SI*gocvst5#J2T@twATDZe94|Xh}=UYY5jPqfB#y8cIX>A~JKj zhUCKK`tYa-f)OWW*#<`1bOoI(a(%ui9Q~NsiW;havRu~Zh{c~V9E|6Jg$k}bYmsWV z8r5nM?8qd2NYrytv0s&Ysre@94bTMNH{fZ4@Yiej!fV&ArTw)>dSXRvkjGr~D2}T! z+5{3*_R&_!Q;jV0$RAOIfl{>KQOo$oacc8TdXq+uen}(VzkOI3_3t5M7IY_O(1lHI z)8qf1Tht3ZqJ8No(QbP0J!rKz9;Suv*Cc+yAvfOXhqQA>-B*@Q#- zj?D|PFPCEdIJEP%+S8I?_4`?L!7Oh}`TA>$FWn<=*=X8%ecHXEw^t6Y>~Ri*Cui%% zVQFc3J6$%0(?MyKSy9|vA97L;#5LuFa;sR^y8ylZ-O8iFyKY}~xrmpP9gKBJea+MT zSQoe&s2jP@nOl0qM5 zf9bXN9QlPKZZK>Tb!}2vKHQG98ng)Lup-LZ6?wK=r^HoAq+Lhnz} zSw%}+Ejffsfqz2+Y{H`c4oBm zQtVY&G;vrIBhCAu6xnzu=M2={CzQ`B|4jLp%D>5C0>(nf5Kd@<`&q2mxTIJe(1lon zS%zj6_9Z+P(o3=4Fwo`F4!l6D2x3);7Y~XB1@Q=00K8(82*Zqc^(c3wz|XS?BadI9 z!rCXz6RV?b!`4k&Q9V~xD@--in0toG6P0LM6X%4crV%y4u5M{DTxUr7X_>Gyb*PCQ z55ph;;r4n@s|XMh4=>A_-%2rRDa7xsDNv6rWlwX}@c7P$Wy;L7ka_evNtYhpmGAP? zQ>D&ObRC(cTcuy*Byajs+h^X!AIa8=#H!pfh=v7@SBgKP6G*P-P3e>@#ez*4(8Y0#LcR6c|j*kXrXi(GhHI!L7h*6%#xMM_EA(7#5rg@s} zX>i>$p)lf3&9k-Z-PV=uv>|ID%<80Qrt}Gr4Y*~oSM=_^Zo6nm*y7>5LmFU96U{pq0K-)N`w8)y>yq+2)r zm7yCPT<&Ic{gTonlxDabGw`DF!<3`s*uX2i1d>?zE%Bk?ff;wnGq!qo5tY8h!>T=T zoQi2#mg_iIK^N=kY)jQa^U=4eGmdN4n|0H5W-=WhO`|1|X**LHj-^xo+G?_IdTX<@ zRP7JgyZ1}?9nJSN=%hWBdWJRnA;@#f$R3E3(n{ffHI_t-JENVXR^bn8mbQe>D(cdb z_Hia@%2{^?4XkiXZFQ#0jK84zw#bOO#ULYxSVl;Vx8pGy$KhB}3NB;JPg{H!cIOBN zm*78uEZk_`43I7Rea2>g>jpE~ZPE#C{Nlb@&9E?-&%N^at#ax+-kq-(rO&rtrj*~> zvm|?FIQ`BWgs1DQBY|o~mLkDwGu-cZcls|R^?FjNMR8cE20^vr`o8Nrm5S(GX1$!J zescWO@x%>}ZLGn~hmRbtR=ob9zE^Q(=CjWBYrE?}o673~|;`6@(|F&==>wO$pn za}`+&jg=L_ytA@m*pIKEp0OephPR}hdJBmoMBwGnwu49>AZmV6*8lT$NW^j1MTA|< z20BmHgfF7Z8%R<;ttY5m2E$$?Rgv|!Gf)@ z6~b24ehj*&arLTUUlY+E`eNy|Rr~a(Awf-ja$wj4J72dXhm@Mq6r~2WI@+OCjYYw| zosk#*TO}fbl>iFp+jo6}YyUA<`pAG)D~Z6zBU0WcAl{HQflU{iV!o0bxacjZ>{<%p z(iLE{#5aOa5ZMb{q;Ek(Qzqetq9mht$pzI9QFWkF&EzZc-)X#^H>tW|mI|clj{2sQ@Zc&U124%8A4cVKHo7cLl2=m1o~G(r zRyI&ZwAkCiwHTy3*x+_MmAic`UhJt^Y!1CNr_U=(%2^n(50*7%j3S`VkQ%xzED}U~ zigj_lmgGl6^dj&?S;r&vbr>KL=LA9eMi-Uo6n&c&_dAV4_4=Wshw4>VrO=ho7M6Db-}HiM3Sa?yo#g| zKaIwn1GgQhMfc1NV4r+=zN0NWES#UrHxBngGPlu-42HDq8ub&CBDn~zqGHfJLsvDX zaaA+zC^nOd?rVgqM2V6EXU_HRih=`Y4s^$VT4j}Gt$W+XT-ZC@nA@0p(56&3ahi!d z=w~`*&{Nt_$+~7FF7%s<9h)krwqr4x$&uexo=CX}GQySQD1Pq+0|76Qu&j>1&4}7O z-c$*roJB_>#%UjtFl#1kE6iYTXP_{H?hJDhXlI1=;SNoMn=6PgmAcCRRj$DIZb2aa z@$I@Gau*(QtNdlN@P8nsrC(ZNMB{9Dame`a&S} z-&d3k!9}5r2g0WY*OahVBz!*2_c$5HiCl%`;t09}2uC;L#385^xmekxc(4CJTC$2L=L3l2{bStx zNKayFLNRL*o9~DMhZ^^|B@XRFRVcbB_XDnBiyNIsWx*?03BQY~%^%|?UngIHdA+9e zMI9*p5weRHm4Kw=qr7!)ya{owzWbW3tl+nuYB4@|#m)NrP?$K$3mnxbh+GEibZ)Gn ziI8ECvlO}JSJ#rL2JP$78G)?p4MFgt;-o7Y4}@K@u8j2RAd-#o5{!IF9{iWEt9~=`n{7kWZI#?g7&ocWYS6CU zM*PKU^ak%%qj^YsjyI`iVe7jK4@MZ1tpw&e*WX&x-mR|rg5=H49~ys_}D9gXMu4j+V7ZhVhSBR-me9V zj*ImL-EXwU*VmA!GFeBMST8O4!RZz~S&qmEeUJxR6T`mvw9T)|Vwuy;Iu(@>Bcgu$ ziEYc;e!?hm6#W0q|Ko2n>`y%Yv*dqCaMFZI8^+FQ<+UOTO5R6HN12rarh@VUQ8pn6 z9j+8JCS#vq*}3y+D7=m|zpH(j$1NWb!~Sz}7x~ZF#&ghnnznHTRkSOHePxOkHRC}$ z2lpc&KHWWk*^jZ)Z5#I1MKrTt3`HmG@B2-9HOAugVx;~|V{zXYsej)QxqpPzLWeE) z>&;iztE0J$ZVYR0?nZiai2eCRZvR+*7hbMI_eFr>|7;mgh~8ZI!(=fbgbzGV)_XJb zBq(TWzaswo82R#-zf1!Et?#QoMjlH(^@Zevd3l$VBg#my>Yh_B2(Gw+QM`Zz|Q-6qwht>7gi{r>_jk$}SJm^3(CpFJL! zl?YTw=B>1A74)Q;ck#FCF4x!#2j({I3xk8hcN1&anI|v(MPUo)gVT4P9*E5sEK4`3 zrGf(P`oT<#fb{+G^J9tvFdY8o8LNM@|8!&fk$>oZlk0KgQuX+m*^(80n7(IlS}E6O zB35cn2<_1$$rv8JnTXAh%TrUXa>#HVCwvB7h=zP1OabHChpDQznP{H-vnLoW$?+0(~gqyEhC>O)0y^}Nh6ut1LIRa&C2?ijgFUl74Rp^#uL9>7=B8F~@ zG3OW(FX8$C3xk^>oXU|TWU1=a$K-tAH^Mt=C)aBB`)ot6HJj!`u4#L!N^Os|4Li7|7${gByg)^x*upZ@x)23nD?nHF?&aa`3*lW5Nt96uR% z*@`HI66#$FW2Z|oveq)?!x3x}Xoj^J=4mTzeK=mf8I(UNnEO9aruu)B@wnq2;B()# zG|AhK9R7Kr07BhP%-N$w*ntmtoybrR%<*5_i|t=4_(u*){*nIFG(Qz0dU~QKOGW4S zBb-uKS8>{2T`e7N7mXk9x+srJ@!1e}GrAt;W|({V?zXQU+Z%BcvprK?WqSi|{uA4) z7;r55V#>>-D;1>%Eh%{fVHU(G@z{_LIW9>I(a)@w{41kwjLx2|oIN`>j5BA?j^Ot@ z#SgMz7-MmzIG5g#+8@(&e3+5CN*{d&*75+kX~b!U{%nJJu^g~MusWcDusWc*wjJYf z1ODoA7miMz95ExfX~fv*EFQAamiSTJgF6zBZi3U7%Xg%=izZ5KiX2NmE_qzm_1b zW4wsN%I#<&7~`rR5|0bIvMv(Y!rxHX0gz&Ali(ttJR1*j`EW&YKZ&S~aSd6a==yM( z>M}q}mmuFf*Lxpbm~o7D)1A}TDz&PrF8J>3hb#w;0IcR}8uuHvUK^MyW8^PsWf&P| zwW3vYM-LFR#hIl(VKqFLTGhbmB~1gSo1Q}mL(1#Qa?9(GRlhzkd911GZT>ubgT30p z3P^ccV)4eQ*ojQ4+6Qj|<;FLd<`}J6YrzTvt*Vnh(M(3DW`JC1YLrxU5!d>sKUMw; zzK@Br0y62ll#dA(lTEA)>0}C;R8&j4^k$S(;S_=sDVoo22I+Hs#L=%7=Lop!QMegv zF8v#?jmBI+7zGM)Mi|~!$7`GLGI$^nvaeW!7nnJ`9a*jDvB5nR%5{x$^|%J2DkbQw zW1HX7(blG0+M@8fw)9QYV&uKZb<50_Wi_FA_`lxQkp!2hOl6h^GErYeKs=>k!r(tB zJ0s+ss*-Rc%2m z;ld~UvX1d}bhA=|oUSF@pZUCTYvYSC8P9>lIRpTRk2V7HpByWuNHh)TV% zYJ>p|Lp7|q3>Uwt?$+Q}NCV%lh91;2At&!YoXQSMDF^w2uw+kxiKis>9FM6FQ}_6k zg*^3-7jT)u=<)VSyS*}jY#!MbgrQ=yO2{3WZ);ojeX6#Sf-v-DaX|E~^nuAr`)zaS z6LXWxgxsmwzIN98ZCzak?X&!xqA0uafAmK4U-oHux%~dNj5vdvm&@jTQvLsbQoMRf z0C=2ZU}Rum0OE?8jfdm;ZN4&aGwJ|E7;02EG{ETpKmR{w^kg&!ayb~7K&k;!1`J04 z0C=2ZU}Rum)L~!%k^g`Gf6VB~z{r3CI2ZwDk_3tX0C=43S=$bSAPjZ?v;Y6MiNc(V zQIOIW4vGm6jfsO^PHS%)hGBTUpGwXyz%Vj!@oM88@XJcTxl zxmYX3n)Bl(zlsi1J~p}bQnsP(tI505HProfJvRM&iC`kklSk~r+(YFf?!EL}D&L`V zVGfTN9#WpI#v^5mipPxC$%_w$KU}`O-(S=>fzE9dFHL{W#Zd2II!TDi`>}IUep>l= z*j!!4e3%8Ne3{PNA0u#V%>>9*-gxJ8y?X+hyGDgH#D;p%BEDm+5+Zb z{Xy7Pir2PB2z&n2lltu{ogutT{F#au3JcG-iky$ydn9Xxa-R;Ly^Wxj+5L%>O<|Bb zM|gQt_#a7#Z5Ea6auRyfz*>qWtFt|m#I{;Gm0*8IZ>!k@hW$X6JZ0WH%lQH#J$Z!y z0C=1|*L%2EWAg^^`L4qjLJ>kQAtWIxIv0vi*$7cO5Q<7~Qqe(_3hAtNN{S>2QAk3O zN-9MNQFM^R8;THqAOHOJbCt`oG`%jKIpfVd3abQIzwscdrGU6aU2bW?CBMyOICS(6z z=SP%vU$$q&q3{mf8*$joh;joX4lm949|7ZteGx~>UEcjsgCmYc`DnS1fn8xs#D6-n zf%_BZ#~-7$EUs=4fLj= zJPpM*DrWMX*OK9NzIx7|9&v%|1+ya>$do`)35gG>0ll@z`cR*jWBQ2*N)C_vc8FSH`DGG2|B5#6D>N|WBA@` zhHiC!n_9cz+tmzqb>B^G-Eh90KDXo9-F|oL|I(?4Ts`>QVMgwtVNbog(|#}9d*jnv zUwW(QE_L6HLtnW4aO~&4zu5j}Xn@#z)G*K--P*s--QSPj{qrJ*z!-x2 zP%%Tz^Dwy{AkG8sAENbebNev8MyP$HT1V4uw6ig48f#7-f%yoW@%T-^VS<n8F!ruG( zxso=ka9J&8HGXSgtQGSi+>cy8!uw;IeB%5QHGQhS^?JHNuQvF7e5vlQCb$2)B9Jmvsa!!aN1}8Z}!i=C?x%&khO|JQMD+P zst|<(%17bA^-(CjJqia`jlv<7qfn-M6v|p3+9?W$m1e`EP_9N44!1sHWfaQKj>6Fk zqfi0PvEq-N6NTeiMxmnE<4dvSQ8-~-6i%$j_*HVP#OI`DY+V#ihI7iWC{%WKs{1O= ztH3gj;v z4bE=l+fgrWf_F2YTUe(yQRuAKo$t{4bmy zxb_s+6URH%)=PXZ+>YJ4 zQQNz;e;2={@+?#1axu%*{T{#f-LHhblD4bxTBVlNus=}y8qbflc&_F55v+CUS?4+M zvHefkXEfR%-&eS9a{jg7`8T+IV|F*|$!6CrW@@Xmt>U)9-=+uO>dST-Z5Q{Q{T=3e z2jB1I-Kpjurhm}! z&n;2#tStN`=AY@2#IQ&TrP!`W68GLcldK%;$JRxXmuJP16qR9ZA}Q5{EsDfDXR?2% zNDl1C=0{T6y0rB{OCmXhZ<(f%l!fn|GAUO%lEbZ!Xc@_ogCp^5O^$|h%FWI%AZQ7obSA`*d~qHs7Nl9_d@zyBu`WIUQDw~;9jD(OJO#H z-E31N&7HTvsRcc}%O#iLU5r<;JjHx37k35RE9Gu!|0-Bl^SP!O+Ym{sl1Q$#z7BS4 z*EZrjN0YWaBWcIK9gZFFzhPV?H{#Y&u8xx(;;NQ&OdtB1Vey1&wbf(>{G{1Fs zB>tTzU8^#)&`ob{7uTKc-r15KINgCmPkHW?x0m={bnLD6KCL3T%N*P#=iRXT>SJGX z)KAX-6`1-5;4(mtdvF-2ANQ*NK3WWtZ;+l0R@?n%V2JvM&~d05hT3~T&Ie&UB!0NO z4_iO%e1x1M_>YulBp##W9i{fs`ZUH&je$QF_E_^V7S1^L@W-3e@nR>azeGwZfM;k*I!&410@zNMFM zxh~S5#eCm31MldoSFU8qzgIQ9OTVS&X(_*DG+U-`%k6m&OjgLZ0`B{8-j{zRpH=o& zsdY83AHe+p#u_}=%DLA4hxmPj^Ex%GQ{%_#_(V;gT7N3`Q+lk&bG@_Ae7wC}tC%Z)p1s?9KRWHji8McMF}jdj4$H^KJNSGc%sG$#%2! zojSi$=MH{5aQxnk>@>4Gar!|Yew6=5zk&a$ahKljQrAy@3qSMw8NXlf`~{cY_V@7p z)%^S>@9%v7(1Sna+^6QhJmdZr^ADeY_D1S^KP_yDG}#nsRxi@LC9_|&F4Fx5Mp~*k z(*3JOdO)j453CVs>5OfN^q~2X9=s^hL&il~hF@9hL)%1p7~gW`B0U`Dk-H-;&-dsG zksc%d80!k`KRqKowhR-0-0Vmzvg5^{(4Os!^u&3QR%#mQNphXU_as;+%W+C$#;*#_ zr*)6iH+Xt_u<4PW(TBl4Q|#GrtFMo==E6wN>Bn|PdTvRiwK_#wyJDnu#ME(K7e+nn zdgAM;xqdY!wt+eu(xK6)NY8_NKD)r$vo&puM`L(R*hMfd=HpqKHltlLd(Gu*fp-ho zmknd~iYG^UxjL@s80nSe8J;c0UB&0Bm62Y}TB+AFG`)@nt<`vaBQ`bCwzO-T=R2C8qA1X@3jfPW0@I@2%>(ZBC?J@asyeuDEwy6KOZG-PC!z ze7DQhU5|YKrak!etjy@$OMI{Gk@lV$sb^{0$KG8yd+$v9>T^GQ`imdXEYf@Q@*eAf zrI_oz^t~7N`^?UL;s?=n(DFzJ%XxnnMzm^#vrN>;H=338FulLCGWxQU|k5}P%k4#^4zCiu22l^ zR-}vkzTS3yhn7q5TPo)=G2Rc;_vpC-*84D5(rG14J@e94;#bq^1A9Kn(+~CFW14-8 z_b1LirT2O{*W3FHzt3s&x!5n{{6dZmt{ddt;5YH5^DpK3$}DY^XOp_VHX~oF^&2z2 znZ}!GvPJ*4>ho4Ho^9ziv-B;l->PvtO}>NkowFTk{9f!2&i_ZVU9|m4?LXu83)^ju z_u#fi+^@L*hRa@fznkqp%-^4$OZ(*Cr>4Ke{q6Vhw;0c}^q=*SMKRkMSz$?JNqe?1 zvUGN2S!FgevV34Tsi6k{nx&Z>=cw!4Mr?XywfNTB9a(MhwfWbZ6d4Bw}HG3@N0lyL+eK3 z8maxf$&sDU_X4<$heg(8U1S%EyJ%5lP2pY)^HRB+(a5teYtE-RPAzb4AbR{E)2l9UyTa@W zr(4U&Zr79U=H|b6_7K-&OJsMLiJoe_Q_P+Gdg)bfK7E|`(Z9RoyW4qR`TDB0AMX9l z*8sc*=+!-DVW9rp`>%<=Pwxkr%fV_MtS9%=#rtJ8)SL~a|493g z)AnK5Bh0`^{q+r=jgn)O^(eTbX*F6+qxEqN{$ptFT{9c!ew^3|t`o$U$X^0`qV**D zOcFC0{$w1cRE_L$+@`rcp)SwFY&tEUf-^&(W~k?B`ps0|OqkEeI}7Hsc+WN)&(mWL zPA}5>CHlO?f38`Xr*|)_0dm0%r^8;QcUr9o9nEH^jf8hBw(_ zeS3%QOT;Xp$Gdnf#c?Sv%j8=o_cAlLTs__iv*lvmGso}Yvx1Lz!fcgU^*)%b#^nRC zYv`~>jce7m7LO0beW;#~V1EQ_o%4^ye?s3+;jTBYpYi*mQ)FNIoqcKMzJj$8&rN3N zYdU?ye~VhSz}TvvTlHvLEoQF1^?cZ_Z@#Ou@940DhCAf@-Yk6&Yp1$@!1+hmKYB*| z55_J%-G%#4>igMz{vy{e=4`j#?bhc#wExxqZ|d2rKHu5dUf93uyR7A}`t<`F`^vFBPmy4jp%*eoXF3Y=K|+VoL^Kg@{7e@IxzBPe49;;yg3b<^YMJmFKZKdvD%91 za=G;t%_6^&o>$`6QZKH8do`Zd!0~RGUyI9i!y|9qp2^#qPa9`#;9l=~y*ye%H> z#I{#!2R-iK{svdi*8B$A-`J0>kGvx-JHqRzS2y8#GrwEp=+v0GcE+u<^Ult0H5a$h z={D;wX2UZ#?`p5BI=hLxosQkjV0YaAt4}@j;0`%^^7G8idpYZEZu-FWtj+J%v%B%Q zTd(`lt1k`u=|?{`^w;11W}!c<0qVcU{y z1A67XGk-|E!^J%;&j{L%gf|L?Z~1(TI>zepIJG^3(|9$FSH}diUjnPdyicUVM72E1 zZ<6{Z%k`K(K1SauwD640rUv6_X6X0RdiS*1nF;$DeVzq( z7QAQ8*R%GX-52?6JfEY(HP`ISOUmv155H|X<* zvp3cC7LDKXyI6$7Vlj)&#bTPi?fz}pOYmRf{9SpM@?YkUS9wd-oV^G=$7K%WoH(i(AV+^^N&wbmc;Sx5Je_2(0uKBe<|c)q>!&(!fb z?w_me3pu|qzZ=B+{?5OWcOyMEnwyQZ+eEWX`tda$U&HuDf4r;an_V~4WQ+Z+YT7D( zn>^p@$#xvJtL;13-#h!>41I4_cFOxB-n;xZcDeop<0lwD)8c3I`!n9Z;O*Tt->uF) z?)T94SAF```Zt_@H&1_9|0(Z2dH&M(zvTQ|KmKVGMNuz`3XP&DsT4)&zcw$5vQbf# zSB;{g;waj$3|kXLrRGP`{@bJIfXQrq6dkxTib~IpqJxG-(ZT!`9s(eAR$pk+klWzoF7r8p-Vc7 z6zOee?KrZ%)_M~u4JY6voPZN>1Wv*Mm@HelAp7L?_h#PgS~7qee8IzMdAPRwX?1YH z?vJ~qJI6ipz2iOtJUbpxe{t;N39pU=+~UX+yxt|1A>JK#aD@-YUFx5Xd*pA&ect-x zcz~hjJNB{m9vugG@ZMsjOk;FZkMcxS%}QqbBGN6j)vl#(a#e|GIB7XcSxFrkxe@VE zG>2?vOe#{XO0iItkwu|It<_E@CfpiR&&T7`>0zQu#851QhL1*s8YARLs8!TfkjSt{ zK}VmN{oh^lB+Ykjdx0rJOwMGM%v3fP(U;gT7xVuJdIx^jjH*G(KIM!;Nm|(KX}Vx3 zDz)`?R1)eTwl-B`jxj53&4>2(@)y9?b&vo60C=2rT?KUGMgr~d*p4BzP-afsO}5O; z+$)o8D~TK1axFWsWoBk(zA`g2Gcz+Y-H@b_o!j?f{r?9wjM~}YZ2BLXZPI@n00m>bLk<^}VC`N0BU zL9h^57%T!71&e{j!4hCe&VWf~~;TU>oosur1gQY!7w-JA$3S z&R`d?E7%R}4jhmN1yBSo7z9IL7?i*sU<8yw1yq3tYG6-L2R>+kCKv@{U>r<}?I0PID4g-gSBfyd1C~!151{@2H1IL3Cz=_}_a56XroC;0@ zr-L)VncysNHaG{I3(f=QgA2fg;39A_xCC4ZE(4c?E5McDD)3)$HMj;`3$6p#gB!q& z;3jZ0xCPt_ZUeW2JHVabE^s%v2iyzp1NVamz=Pl+@Gy7;JPIBIkAo+`li(@vG%ev4dT@QX0o)L71UH78z)j(1aC5i?+!AgDw}#um|G;hGc5r*R1Kbhr1b2qJz+K^P zaChjyJS@N>bm1Tzg2S)`_kbg?3@fk-Jy?T#!aDR}12*9(9E0O<0?vYa!M))=a9_9| z+#enQ4}=H7gW)0YPFFN7Dti{T~kQg|7>99{vhgjd1;!mHsm@LG5sydK^FZ-h6&o8c|+ zR(Kn{9o_-&gm=Na;XUwPcptnUJ^&wt55b4wBk)o97+04 zUxY8gm*Fe$Rrnfw9linIgm1yO;XCkM_#S*8egHp&AHk2|C-77F8T=f60l$P_!LQ*r z@LTvD{2u-Qe}q55pW!d?SNI$J9sU9Tgnz-m;Xm+SG#dg4B7`s^h$4nKN}wc4p$?Qr z8I(mi)QP%KH|jyXXbPH&rlIL*b~Fc?6U~L@M)RO~(R^rrv;bNVErb?Ei=ai(VrX%+ z1X>dHp{3B$Xc;sE^`ika6D^CDL(8KT(28g!v@%)+t%_DdtD`m0nrJPwHd+U*i`GNy zqYco8Xd|>S+5~NiHba}EEzp)|E3`G*2K@(Zi?&1CqaDzWXeYEY+6C>3c0;=(2jx)# z6_JYu(GVI&CA0?`L1k1yRpg->+7s20j~b|nM$s4=M-ylk+6(QC_Cfoi{m}mC0CXTa z2px(KS+26Q933EhltLARpY(Cz3B zbSJtC-Hq-+_oDmI{pbPoAbJQrj2=OcqQ}tV=n3>BdI~*_oy^Y>M@1pn6`{)DoA^He?j6Ol1qR-Ih=nM2E`U-uGzCquj@6h+? z2lONQ3H^+ILBFEk(C_FE^e6fY{f+)X|Kiy&zz`#hF~Jlw%y9xIaSC_fG|u2G&f!kn zg}ZSN?!{B^R6Gq&$Ft)(@SJ!qJU5;P&x_~7^Wz2Zf_NdkFkS>NiWkF+<0bHtxDPLd zm&VKB8Mq%0;F)+?yc}L0uYgy?E8&&#DtJ}A8eSc*f!D-q;kEHPcwM|6ULS9OH^dv^ zjqxUUQ@k189B+ZQ#9QI5@izEBcw4+3-X8COcf>p4o$)SsSG*hE9XmLW3%H0~Jcx(z zFfQRe@CYvB3a(-g*YKXWj(yy~O+1Rn@Hn2pv+!PcZ@drQ7w?Dn#|Pj8@j>`td*zlLAO zZ{RoaTlj7K4t^KEhu_B^;1BUf_+$JD{uFBuP@FgQQ7@WJ!*6k}lFsdPpys zLZ*^wWICCh%t7WPbCJ2pJY-%nADN#lKo%qmk%h@3WKpshS)43EmLz>-DY7(KhRh)S zWPr>h%aY~D@?-_FB3X&7OjaSQlGVuSWDT+=S&OVq)*_J9I znN&!Xc%(-5Bz5AG25FK}GDgP91erzlB72j4$i8GhvOhV197ql#2a`j{q2w@fI5~nG zNsb~%lVixSRBHiXxJGq10N$w(dlY7X$r{B2SZN$g|`*@;rHgyhvUmFOyfutK>EEI(dVIf0KX6zjQVVD5QvDN+_j_a+;t?nxY*vO*1r0bF`Co(Qev9d+8K9 zl}@A6>Fjh4Iwzfr&Q0f`^V0d~{B!}jAYF(qOc$Yx(#7cFbP2j7?W0T4rRg$s2JNQ< zbS7PvE=QNAE6^3`N_1tq3SE`1Mpvh6&^75=bZxp0U6-y$*QXoM4e3U7W4a05lx{{h zr(4i1=~i@Wx()pg-Ii`gx2HSM9qCSVXSxgBmF`A&rw+~20xeRP4$>hyOiOeRIzr2| zLaWrHHM%FQQ=c|ylaA6cI!-6(EV>uno9;vRrTfwS=>haWdJsLB9zqYLhtb375%frU z6g`?ALyx7$(c|d}^hA0RJ(-?DPo<~P)9D%XOnMeQo1R0@rRUM}=>_ycdJ(;tUP3RW zm(k1V74%Aa75y*0nqEV%rPtBx=?(NodK0~w-a>Dsx6#|_9rR9m7rmR_L+_>c(fjEG z^g;R%eV9H%AEl4c$LSOFN%|Chnm$9HrO(ml=?nBl`VxJazCvH6uhG}(8}v>37JZw( zL*J$E(f8>G^h5d){g{42Kc%11&*>NROZpZ4ntnsSrQgx-=@0Zr`V;+`{z8AHztP|6 zAM{W97yX<5L;q#7F~A^03^T$gV~n!|OR^N}U}=_NS(am+tc!KC9@fjIu&Hbso6cru zbFewtTx@PO51W_G$L41Xum#ydY+<$tTa+!v7H3PaC0QR^iY?8SVKZ1i8(=fpvTQlF zJX?XS$W~%2vsKutY&EtzTZ661)?#b3b=bOWJ+?mEfNjV&VjHtf*rseVwmI8^ZOOJ` zTeEH0f7rHcJGMRBf$hk4Vmq^4*sg3hwmWlJo)uV;xonUPv0+wXd$18!W))Ut9;>lE zS)KW;!J2H8jj?ey!Dg|&*xqa(wlCX{?avNi2eO0M!R!!rC_9WD&W>P5vZL71>=>hS6yN}(^9$*i$huFjH z5%ws1j6KetU{A8A*wgG8_AGmjJ>c(ldyl=( zK42fRkJ!iT6ZR?ljD60&U|+JY*w^eE_AUF4eb0ViKeC_L&+HfWEBlT8&i-J3vcK5h z>>u_o7xO<3IpUZTPC4V8CwP*lcn44O4A1f$@8n&)oA>ZuK7~)^)A)2gJD-Ek$>-v8 z^LhBZd_F!uUw|*j7vc-^Mfjq8F}^rof-lMY_)>gnz6_ti`}qK$$(QBJ@#Xmnd_}$z zUzxAMSLLhm)%hBHO}-Xio3F#y@4|QGyYbz*!}Gkri`?ade25S865oT5@G`IPD))Ge@5$@j=MCQE zqkN2y^9eqS@5T4#`|y4Fetds^06&l)#1H0&@I(1w{BV8*KawBCkLJhlWBGCXczyyu zk)Om*=BMye`Dy%geg;32pT*DS=kRm+dHj5S0l$!6#4qNT@Jsn+{BnK;zmi|Y|I4rD z*YIokb^LmM1HX~q#Bb)e@LTz9{C0i^zmwm^@8+)1OJi##DC_$@L&0F{CEBb|C9g4|K|Vje-pDM zKmyK&X7mrFm+32%>V>k~H&`l{dBBA1@7Z+fp{!YYM$C4=glyXmSh_!EJ77Y#Z3iqp z5VIXHA=|bCmYx~29WWu=wgZ-4HfB3uLbh!OEWKRJcEE&e+YVTI`Izm13E8$Cu=ENs z+W`}@Z98D;6=SvoCS==oz_?RrltxR9iC(8vua%vu+viq?N>$fa_HwOiIuw*Q0ZTe% zr(RJSQBeH4<4%WDE)7-t@?N9iRSYS()rMP7XyR6jMy`~K#j=~y#BVtDhOyG{YE+<_ zGtuRgYr{_7ZS*y3HMd@Hd=Y&kA*bA+PQ{t!RgqIEGN)Rsd!-^b&;GPitM!$t#Ztj( zcy%Ng5r1X3!>JdBOQZUAm?1f*UiZfOR$Qj&4)qniv1&{xyMv8RTd0?Yh8r1MY1RzQ zJ9XuOMWyp>M3v)?h&OA-uu%32BV#4sonpAxlnK`=OW*Ab?`)IjuoM}%ZF|b(W^GQa zqSNL?n`K+%IW4Z<(GGU%|1oTLWCh&rNE_x_bzAUp<3nrm zb+*YlOR*!PQ_6}=YqEB>$;n7D<)iM_Tqh`db+^&1>$L8QDJoc#SZyia)vkBil8R!? zu@%Rzc0FZD(==`j*S+S@aNn>iDzS3cJ&8e&)|xdtcG(tjddOQ-zGpI%7VB2bdnPkU z$Hdt~)|P0!lNz-;u!3uKpp7zdHKHofqbOP)Wm`lZa2sC`nsd%Gq;AP;J zYToJiHMbxtgwrT_>b*K_g*(1z*h>BgbQ(!#%&8YmM}7tl0v5v{x8ZG2Nn+vG&3h&UF9+`fTg5J%07JafdBXO0+o zg_yiTAUiQnoWK*&J=k*H$c2I}7Yarmj(IX1c;d%oKad+0TW(a0JnGreatRPZ#sIM^Wnv6??G%Zol@rMKZnkgU^6pX}6MkwJ!i%c#qFQuHI?0$JqDWRpi2RWStuEduZ0I6dE}1b> zCaz^8DoTCLPlP;`cl;4odqg$v(2xEgctwmjV2cB}ywebsXhL}cM%y^ys|9uu`?^ z)>DSatP8B^(RyIbYg%sffYuPdF;RAdK*dNt(8o%}#xT{SCoe{}MNx$MrF~`Yusa=#vr05)$#_is~zd7Ggda^wLyw z@hFL|FC!lApqz`DG8@ooc@;e|XB1A$jlN;QOm%BFnA)P1#oOpsyG`%0q|nc7i)e=t z_?3xkNkPlyl57Ff`MT#6MWh>jwNf<^GT}muUSzEhBiD*3?uNRecgqH3uvB*kWgRr! zcLtq$N%-D0O%G8pm2VcJ)?HzqZw{HBrYYL%W~r-R|MyT31MmPD2Nij!B&s zo6tjUTZw`Y!&vjCnYb4Drz&m8tUfZXMOG@Ms_7&%am}(K5_GuLiqxVvi+b9a6!}pX z(;Tyu`q3{+V9l4!r)jhd>yV%+TDY1V zT^b@@qHZ^cA(aM2T@T77ztN$nD0#9yO)65VI76}}6j0jGNRIABLe)iQsK#DuzHM=P zQLIf)MvC!6E$CQ&v@NW)$;n8`X{c9er0uD;U@v{O>nTf0Yuu~_1rGfR{iI8T*+*D>=BZz81HPVSBku@TXc(;No8$&NL zam}JS8$xO~l5x?pq-UfpmXv6PElY1}*lNBSQtdeMEE#bfm@Y)&OJrL_o9pTx@#sBr zt*UJ;3Ov`U+EEDKCEFquqJ*w9DOdYhh3YuTm4C==npdsAjLNqVle*Rc+RC zkz`h&1EJ_O^JP~B(WsJ# zEH`d6%gsfw-+n74^k`gG%QL~Ge|oD}cS_ZuI<=c*TSOCJRE|=XU@TXH&4FaZjZs*z zk`XsXVLW;*E(-AIgq`P+nv4Wv7Ok+SEFm;>%`#ES5=_{B)huQuBW^O$Z&vM06tq*L zW-Tl#9kxOg(Si78n5eLpCM-$3gI9FT3X6uS*~AiKIdaU(T|~DamxW9oMZ8uv^WJQW zn2fmawcM;!{k|cm#tatEN<}sFvcK_l9GM|Ptcqwf>ZO`n#F8XcA0&OO(}L%Xlw{0m z6TDDsDwjxrsfD^*EQ!&zZ2kKC^1+s3SGztfE=3cd?nw-Cwx;tg5^$mJ)e_>z_eCwK zCqvZF3#JX|kYLzrm{-&!A)j*Dehd|4yU?uH-D+W?FJEftBoBn5+`+Aqq-tR_Vsc;;GJ9b(6lGXyVKlDj)wQ^$ z7DihnxiA`+?1j;|iCP$qOKM>>F6lNPu8GNETo_Nsc*NAgXvoyUXvlQ64QaEM4DmP* zV7BOvmI`v8SQp@A!~-MWj~fY|DVCg}x>M;hJMbY54F=){104cYysBxB0;2XM4M`QH z=QDKkqp_CyEva8i1C}(PrJ0sAQ%lQQ(z04w&XSfBvGeuLHI|6UAFo~%vGc>Wiy4wL z&zfh3F)2&v6`3SKl=ah9zVa_G+$a(L;(v zrQtzGpD5N$vyLU=qI=Kh^Rl*y<|glrcgSbi^d%wDDXmGW*c==*^_6POU9;ee1YqJX zFFJ&zD+-A2?TLaZ^=tA&V=WC>(g1gd%(y~5O~Ra8@%AXmLo0Qi z)+tNqHCT+bswIEeq*ks~H9}F0aAJNaVY6nxanHgI|+`Nk(0=pBz8Ov7H_%Kp3kxWLsTf?%`92yP=N}0H3B3N~s zqUR{v5j2ts&##nB*3W4R&6-~-y3r7J>i;oJS-N>IG2|F3%O#@Ndqrw@Ak=I1l4-#* zam~DXBPfN*h#RA^Qgy^Ol6;z59d*m1g0zmmyC*T2(xRCjxU)^pMT)8EmJs=D?a{=w zu8>Bj5Mt8wkXe0)DVCF%M2_RHW^KsCwI~8%Q!*_sSx59HF-XU>$VSbnxjK8Mw`h@n zJ(HPa;$jrPXsahCML|X*=1g46hScojM4SgO<<=eF#F%PKUB4irz}?2MTd%s}RY$E6 z9uHVn0KXCCOETh9?L4y&ShnlaY{~Bax+gKn*jjlg=GH4ToFT8;?$#K@;$$ygx9ihw zNpw#7#GuZ(Nla3f$RutS-Lz;m%cVjoNHfDE@I-wUi8~S0@d-Nz6Cp(cCB>iYjzoEo z&@>f%P_(4-&6{9QDyt4CwY>Gz|6@4&B)Un3-bsz-h^g^ZnKHTAw749l zQuibV@rXvL*43`ZtwyQX)vm{57N%-vn;f?orgCSS91lDiYjw5jEmp@1lUtQ~Je>A4 z9SmB#&New7irU1RBow8`{S24LI@{!_ZA$+neky%>Oscr@(uRJ`p2}RuTyKp>u|kP7!Eg2dM7oCr)a%dHUspoc0Ha{ep!qp{YjEa8_X5g#PHlHigCV~ z%}o1$rt$O$uwi>J)2Qf-p76>5hqWDN=GdNSh1D6HGb zi0c+Qib7b26Cu^EqdJ?6xONlP(L_kIA?ml>D6SL4u7e%6qFqLHE*WuS6xOk1#C4|_ z)F~b?onlrUN?C%Ad{}1^Aq@OjmEzs5SoK^f!$!xAWm>Kr9eNabW>Le6KL zLMkGq$RJ;-MFs`SMZu4e(TEg1oxcGYkBr=LHzGr&!N}gQTe4gYH!9_b?ct0%k+VH& zLs5+O@GWbikXY7yE8G!xA|jQU)+<$tmO;^SQt_-;s?-K-GBYAxV=yA32wP;hW|8WU zMQV+-O{`FBeldz$&5Cs08H)_+`N+L5hRYTc*%I0Fha(UCJk=3pt&)7x-_H;~28Ky468LaoC z4Y6iA>6k<{6CPBDT)DtdZD4s^H!)Z?_e`)vsX;MIteO1|jXU(iT)Z$uKF8ep4D$@Q zC>vf`ot>A%!;~Sqsnl4thk=2b*c$AMLf>A?tKk5t5xG6)i^N}tlM-e zG$t2|3Z5`3G~8k$)UZTo$gSjt+^V{cP|25unqJdS8)49`I3ni_lQ=Mui&!Ex3~SV# zsxOGAPKT@aH-rzF({dslFCiKmZHy&CL!|~4f5XkZe3YGhW~l7tMblStMPu*yJ%;)v zr_X81Etqo2nWjZ~LqaaB`ChXztgLiv1G(!Wo6kY%1yLGRzx}Bp&l@t`71fvz)tYK^ zD5vK6O8Tt@PMUbn>##Ubl9ngw9XF8n}#KkmAVt_wYbQgN?sS& zRy7$3+J#bmYu~+9?Y4zr-#xB%NE+NfV}{^ic`Gg06Uj+XbsM7ZHCywRke0X}-cbx# zMgn!BPFJmvB7p>}lynM9l$3`jYr|gE^%eBRP+_#r3{2_OHC;%oBXSzbb^V-%(RqiI zB@l(P>epI9h&WZyPY=7bXqhQuG5{X1j$wB^v=b7ww_r$0Uc*qk@oqgCV&S{z*GdgD zmgE7;4SUVHTKh5gk+PBC*UF_vI^qqlmIzr!AiXtck~g3^jjUr7mXOsrT$fEoJTUTt zbNLYujZ7&^Mtq8ft?Rg*ZL)DA4UKnUo0*KbiF}mFDN8W!!f|{u;>MkIzQ7XF8k^G3 z1Jc z+)W}1cBo(DJ2NCvsusMVYN_E-S-qHbz!G<_Yj4xDoU(V&NnMvAqyA2a&f6y>kWk1HN#x1 z8hWhCWJk!nqMHqfnP-Jo)led|D#sF`x4|?eG*!n^12WDG;^yfKFyV`~TZAmSxYFQ+ zK1df3HN;|urAC};a4(i>%*Ci$cd!Da#b0#ZjR%aDMNM?;2~qlWslyVb%1%vGV(pp6 z8PPM!yNIG)l!KSFre-LUQq0V&43N2w87*Xi8laHpk*x)lB>-RwATWUSUqEG3(4_ zi>~4$T>gl1T20DB{^p#ZhUQR@dGiiiOerF|Ix#e43VUVkfxIs3ClqWr{)jegin1fG z5QNPhRu>k^&7q;7y19W=Tu~m?3HN>{lue zm;k!SA_3B}{)Qa^4_HzHIV=@3?uv-IFz_2*(W_EfkDHZD#T5fA*}>~{4XH4%c=d^N z#jQ5`>UT{$zt6}RE=idm>h zOHgSBhyDYG1jvfNy61c9%)3+Z6CoESVwA5gxqD90E%JaTE223wUj|Z;S3HrAO)(1# zkKbh#QrWJ1w1{H~b0Td7i5i%cB?v>gLlZL$1>sZB-4X>;>erlH&{#_YmNd|*m#wPu zFnV6Rs9VfhiY$l8h#Si_(`Ly5k*y@E?wGIkJF`{Ur-=IA=Z}>dh2d;fZXQ^RXA#dR z7%ggrRJf5_=XJN(ROjY+wW&)q5`b1mOU06tsE$_5)kBFo>}|u4sIi(M89Ap6&f<-_ zU0zKM>BZEiXuj8xj!9H9QK&`hBqsCe*e6_gz|yhXFFar!HAkdEpS}SrNIAS-!VKZ& z*`H9UCXe6>RCmwD1Th?Q$|E9x zz}vB5*DV+1QQqK{Wlhqb12V$6X_*Y88YH7ZKmbKE*P~%syoEZRqC3YHu}kyOQobHu z{fIjnmNqYAwe(@Vum33(S(|s zFNxMo*frxM0n(~P3Ys|{u$%(+WX=*2;U*83NEw+!H^Rt#G673OcjB9F|BQsNG|r4;Uv2gLfyP)uTmDK#vV-669MbHz0t zP*RhN&K+_xP^gzwN1V1ve}`J=HbW6+NTyczUDtwrn&xqZwj*Q%yMp*$2hv4<(SRy7LVzEayF@_>^)n_k@^>e^sBwza?m zmX7Tk@PLuJQ*`Pn@muoLr!ie7FK*<$u}s}9xFU)B3eAR?Q!ztR@~INOZy5{EuyDVH z2P`}@E3juBX-Y=C%RqZqBqpT{Q~9QGhklq%3q#~nexym*DHcl&Qg?^kajw54*f)b} zAl|K3o{%>db?FFcQX|#*D=4BYr>u6A1Kwp|Jj#}oGR#C-Vp8|=o=8J4{5DFr!3}4` z4Q8{MxJESjO7qdkTtMy@ zO1|&aedZTDPi`m4{g1I?U6hS_hhL2Dd@w^geOG=+)T+xJwn8;Y`|eOher-vNz?{(@ zF%xUMK9+3}yDT1@FN;aqfprKh;u!^_tK=c=Rj73|oNHCJ1C<*JMRSvo>d>vvhebT4 zpxLR`7|RFM3mVKHcEk(%N%1r_k|@~W50~7sd4(=R?E4%>ipEt_ZRP*jRIPo^R%HCs zwlJQuSYS0=d`MYB5J$bsXNc{ed^xumL?B9^4qM@dj8hFnQUrTeL_y)RS2OEHSYnZA z>d1bVFF%u8be&>fkVWa3G(|H{&Q|-}uxsdSleNWg;WH=;bF|BTu;ws{6KOWBT{hKw z5`#%BPy9d26P;~Zk5VeGT+Isa{%2dnUW-Rp>vOHDex0gk?)A&hsYXd<%RPZ2W~L*- zI$5?woEmU*vp(>yt6kTU=xWOK;IdviCS`p6VPvyz+8a^5v0}ZCr6xi_r)BubSW}Z@ zT2DlyB+9mkvq#)lVMN~bPHHqqn;LmOWpXne=0sTik`bp8IyzSBXitA+L-TY9!y=@Z zTE>lDJJNVS1*ilTD)xcpkRpLZP*taI%q``;DgKBU>jsO~VV~I9CQpwm_IGS2GwF(p zx-i(14#Bnh;SO8r35h*cYZ22SR|BAc^(xSI*t%7n78C5l){_`?#Cf9w6oHf;5reqUWKYnb-*Ds?`%`MV~P$T+oGiu*JjM%gjzHj69Xn;+N>8`k+(yl`xc|i zkzgufNJ>22qE~U{ISvbpM5?*vvg*Z!T~F;h*)y-;t08jh$9&&IZ>)PFz2#XPqG%%g z0;fjm%b^kxwW2J3U8j;(J6|QUc)Rm3_! z5OHnf*BsNiCnKJgF#O76E@b5)^YW3v1Dpv!e-uMSd2m-f8C?z&ajb^7!k8h#TeX>| zvqNDa$t4t(7Tx|tMHHR7z2?~&YC$C=4JR)qAL`e1R0hWvT5_!_)dFvrLm^0jg!nV- z&k|)D&UneXIh2ezZ@6Vw?j&at8EsI+!HC*mqS{_sSy`b zrO3OkcD*~2qK}NkwOmBaM@1|l5#nUSt;$8*zCHI$iyAH>;^@WBh^fvkWa`{*$W-^7 z4Cy!zU`p+s>TlKN6xOE&^mlMDIf$>KjZ!*-l29 z2%ss?#N|D65-w#4J+dj2-%WEHVmxWiFK1iCl;OIRYAouSD2`6U4GLeYOtm5&BMomP z+3<$s@}b;x4xo55h5DtM3~`ld=yUVzCk@Xl`$Dc)#cXg|Lw{(a?&{%U^!>8^Ex2`^05?bq>)F`2j6_&;8btojti~KS|Qjp-At_r5quh~r0SW5$zG$4F) z%>si&LKVH7myTV!iRxSlBJfS(jC`oAIQjLNig4JJb5ar6yj#o}W+y`^ z5QSMolr^VPVvSK{12#r!Lv2SUS8Pa-#nWh>Vg{>6AMNSW?=|H>-_irdiSxd0$?cE+#@M4b-w+WT0uf zS;@;J)!!oG0prc8ZUcw_URC}!CZ>vCc@#nJWEKkY7P#5#Y1LEBYB<@a8uMnYpq50D z091cNCE4`zeR|uRD43DIYHdjOc_HNzsg_g%wQnBTP&BPkwPfDIFeQiU-aKF`WYO1& z+(7~+M&+j^8}f8Ui29SGdd0WqRuiKocTDYEcPONW5N?r=mgG5zhD%0E71v9SmZ}rx zqQ8RTx8C%r`t47QdZmIZ&qL%!khKLCO-c1_w)f$%tnRG%H()kiyY= zYRoAIy*JgE=|?|N!zKAEhL&S)zF@w2O*Iw|IoRf7;>UMtH9A%rEcMOMkAAKmB5*80 zVyrYGKPOXiuv}+JnR7d`!^#BM^+h{Z3ytJ%o59x6Xrrj!%;4ZqQ9xza7802m+>mjq z0n-mZA#Zx9&lAiwCYzz*KBp*8Wy!ILJ^q~b|4cjE45(Jp z2~&HaJ`qyko4ueOFffkC^WHd~aLYA5A==sr(Xuglu&J4M*(}eih_0Her_g4b?SHsI F?~0aZ)an2L diff --git a/docs/validmind_files/libs/bootstrap/bootstrap.min.js b/docs/validmind_files/libs/bootstrap/bootstrap.min.js deleted file mode 100644 index e8f21f703..000000000 --- a/docs/validmind_files/libs/bootstrap/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v5.3.1 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.1"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return n(e)},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"

"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=":not(.dropdown-toggle)",zs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',Rs=`.nav-link${Bs}, .list-group-item${Bs}, [role="tab"]${Bs}, ${zs}`,qs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Vs extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Vs.getOrCreateInstance(i).show())}_getChildren(){return z.find(Rs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(Rs)?t:z.findOne(Rs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Vs.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,zs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Vs.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(qs))Vs.getOrCreateInstance(t)})),m(Vs);const Ks=".bs.toast",Qs=`mouseover${Ks}`,Xs=`mouseout${Ks}`,Ys=`focusin${Ks}`,Us=`focusout${Ks}`,Gs=`hide${Ks}`,Js=`hidden${Ks}`,Zs=`show${Ks}`,to=`shown${Ks}`,eo="hide",io="show",no="showing",so={animation:"boolean",autohide:"boolean",delay:"number"},oo={animation:!0,autohide:!0,delay:5e3};class ro extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return oo}static get DefaultType(){return so}static get NAME(){return"toast"}show(){N.trigger(this._element,Zs).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(eo),d(this._element),this._element.classList.add(io,no),this._queueCallback((()=>{this._element.classList.remove(no),N.trigger(this._element,to),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Gs).defaultPrevented||(this._element.classList.add(no),this._queueCallback((()=>{this._element.classList.add(eo),this._element.classList.remove(no,io),N.trigger(this._element,Js)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(io),super.dispose()}isShown(){return this._element.classList.contains(io)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Qs,(t=>this._onInteraction(t,!0))),N.on(this._element,Xs,(t=>this._onInteraction(t,!1))),N.on(this._element,Ys,(t=>this._onInteraction(t,!0))),N.on(this._element,Us,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ro.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ro),m(ro),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Vs,Toast:ro,Tooltip:cs}})); -//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/docs/validmind_files/libs/clipboard/clipboard.min.js b/docs/validmind_files/libs/clipboard/clipboard.min.js deleted file mode 100644 index 1103f811e..000000000 --- a/docs/validmind_files/libs/clipboard/clipboard.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * clipboard.js v2.0.11 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1.anchorjs-link,.anchorjs-link:focus{opacity:1}",A.sheet.cssRules.length),A.sheet.insertRule("[data-anchorjs-icon]::after{content:attr(data-anchorjs-icon)}",A.sheet.cssRules.length),A.sheet.insertRule('@font-face{font-family:anchorjs-icons;src:url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype")}',A.sheet.cssRules.length)),h=document.querySelectorAll("[id]"),t=[].map.call(h,function(A){return A.id}),i=0;i\]./()*\\\n\t\b\v\u00A0]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),A=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||A||!1}}}); -// @license-end \ No newline at end of file diff --git a/docs/validmind_files/libs/quarto-html/popper.min.js b/docs/validmind_files/libs/quarto-html/popper.min.js deleted file mode 100644 index e3726d728..000000000 --- a/docs/validmind_files/libs/quarto-html/popper.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/** - * @popperjs/core v2.11.7 - MIT License - */ - -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){"use strict";function t(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function n(e){return e instanceof t(e).Element||e instanceof Element}function r(e){return e instanceof t(e).HTMLElement||e instanceof HTMLElement}function o(e){return"undefined"!=typeof ShadowRoot&&(e instanceof t(e).ShadowRoot||e instanceof ShadowRoot)}var i=Math.max,a=Math.min,s=Math.round;function f(){var e=navigator.userAgentData;return null!=e&&e.brands&&Array.isArray(e.brands)?e.brands.map((function(e){return e.brand+"/"+e.version})).join(" "):navigator.userAgent}function c(){return!/^((?!chrome|android).)*safari/i.test(f())}function p(e,o,i){void 0===o&&(o=!1),void 0===i&&(i=!1);var a=e.getBoundingClientRect(),f=1,p=1;o&&r(e)&&(f=e.offsetWidth>0&&s(a.width)/e.offsetWidth||1,p=e.offsetHeight>0&&s(a.height)/e.offsetHeight||1);var u=(n(e)?t(e):window).visualViewport,l=!c()&&i,d=(a.left+(l&&u?u.offsetLeft:0))/f,h=(a.top+(l&&u?u.offsetTop:0))/p,m=a.width/f,v=a.height/p;return{width:m,height:v,top:h,right:d+m,bottom:h+v,left:d,x:d,y:h}}function u(e){var n=t(e);return{scrollLeft:n.pageXOffset,scrollTop:n.pageYOffset}}function l(e){return e?(e.nodeName||"").toLowerCase():null}function d(e){return((n(e)?e.ownerDocument:e.document)||window.document).documentElement}function h(e){return p(d(e)).left+u(e).scrollLeft}function m(e){return t(e).getComputedStyle(e)}function v(e){var t=m(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function y(e,n,o){void 0===o&&(o=!1);var i,a,f=r(n),c=r(n)&&function(e){var t=e.getBoundingClientRect(),n=s(t.width)/e.offsetWidth||1,r=s(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(n),m=d(n),y=p(e,c,o),g={scrollLeft:0,scrollTop:0},b={x:0,y:0};return(f||!f&&!o)&&(("body"!==l(n)||v(m))&&(g=(i=n)!==t(i)&&r(i)?{scrollLeft:(a=i).scrollLeft,scrollTop:a.scrollTop}:u(i)),r(n)?((b=p(n,!0)).x+=n.clientLeft,b.y+=n.clientTop):m&&(b.x=h(m))),{x:y.left+g.scrollLeft-b.x,y:y.top+g.scrollTop-b.y,width:y.width,height:y.height}}function g(e){var t=p(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function b(e){return"html"===l(e)?e:e.assignedSlot||e.parentNode||(o(e)?e.host:null)||d(e)}function x(e){return["html","body","#document"].indexOf(l(e))>=0?e.ownerDocument.body:r(e)&&v(e)?e:x(b(e))}function w(e,n){var r;void 0===n&&(n=[]);var o=x(e),i=o===(null==(r=e.ownerDocument)?void 0:r.body),a=t(o),s=i?[a].concat(a.visualViewport||[],v(o)?o:[]):o,f=n.concat(s);return i?f:f.concat(w(b(s)))}function O(e){return["table","td","th"].indexOf(l(e))>=0}function j(e){return r(e)&&"fixed"!==m(e).position?e.offsetParent:null}function E(e){for(var n=t(e),i=j(e);i&&O(i)&&"static"===m(i).position;)i=j(i);return i&&("html"===l(i)||"body"===l(i)&&"static"===m(i).position)?n:i||function(e){var t=/firefox/i.test(f());if(/Trident/i.test(f())&&r(e)&&"fixed"===m(e).position)return null;var n=b(e);for(o(n)&&(n=n.host);r(n)&&["html","body"].indexOf(l(n))<0;){var i=m(n);if("none"!==i.transform||"none"!==i.perspective||"paint"===i.contain||-1!==["transform","perspective"].indexOf(i.willChange)||t&&"filter"===i.willChange||t&&i.filter&&"none"!==i.filter)return n;n=n.parentNode}return null}(e)||n}var D="top",A="bottom",L="right",P="left",M="auto",k=[D,A,L,P],W="start",B="end",H="viewport",T="popper",R=k.reduce((function(e,t){return e.concat([t+"-"+W,t+"-"+B])}),[]),S=[].concat(k,[M]).reduce((function(e,t){return e.concat([t,t+"-"+W,t+"-"+B])}),[]),V=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function q(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}function C(e){return e.split("-")[0]}function N(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&o(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function I(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function _(e,r,o){return r===H?I(function(e,n){var r=t(e),o=d(e),i=r.visualViewport,a=o.clientWidth,s=o.clientHeight,f=0,p=0;if(i){a=i.width,s=i.height;var u=c();(u||!u&&"fixed"===n)&&(f=i.offsetLeft,p=i.offsetTop)}return{width:a,height:s,x:f+h(e),y:p}}(e,o)):n(r)?function(e,t){var n=p(e,!1,"fixed"===t);return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}(r,o):I(function(e){var t,n=d(e),r=u(e),o=null==(t=e.ownerDocument)?void 0:t.body,a=i(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=i(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),f=-r.scrollLeft+h(e),c=-r.scrollTop;return"rtl"===m(o||n).direction&&(f+=i(n.clientWidth,o?o.clientWidth:0)-a),{width:a,height:s,x:f,y:c}}(d(e)))}function F(e,t,o,s){var f="clippingParents"===t?function(e){var t=w(b(e)),o=["absolute","fixed"].indexOf(m(e).position)>=0&&r(e)?E(e):e;return n(o)?t.filter((function(e){return n(e)&&N(e,o)&&"body"!==l(e)})):[]}(e):[].concat(t),c=[].concat(f,[o]),p=c[0],u=c.reduce((function(t,n){var r=_(e,n,s);return t.top=i(r.top,t.top),t.right=a(r.right,t.right),t.bottom=a(r.bottom,t.bottom),t.left=i(r.left,t.left),t}),_(e,p,s));return u.width=u.right-u.left,u.height=u.bottom-u.top,u.x=u.left,u.y=u.top,u}function U(e){return e.split("-")[1]}function z(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function X(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?C(o):null,a=o?U(o):null,s=n.x+n.width/2-r.width/2,f=n.y+n.height/2-r.height/2;switch(i){case D:t={x:s,y:n.y-r.height};break;case A:t={x:s,y:n.y+n.height};break;case L:t={x:n.x+n.width,y:f};break;case P:t={x:n.x-r.width,y:f};break;default:t={x:n.x,y:n.y}}var c=i?z(i):null;if(null!=c){var p="y"===c?"height":"width";switch(a){case W:t[c]=t[c]-(n[p]/2-r[p]/2);break;case B:t[c]=t[c]+(n[p]/2-r[p]/2)}}return t}function Y(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function G(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function J(e,t){void 0===t&&(t={});var r=t,o=r.placement,i=void 0===o?e.placement:o,a=r.strategy,s=void 0===a?e.strategy:a,f=r.boundary,c=void 0===f?"clippingParents":f,u=r.rootBoundary,l=void 0===u?H:u,h=r.elementContext,m=void 0===h?T:h,v=r.altBoundary,y=void 0!==v&&v,g=r.padding,b=void 0===g?0:g,x=Y("number"!=typeof b?b:G(b,k)),w=m===T?"reference":T,O=e.rects.popper,j=e.elements[y?w:m],E=F(n(j)?j:j.contextElement||d(e.elements.popper),c,l,s),P=p(e.elements.reference),M=X({reference:P,element:O,strategy:"absolute",placement:i}),W=I(Object.assign({},O,M)),B=m===T?W:P,R={top:E.top-B.top+x.top,bottom:B.bottom-E.bottom+x.bottom,left:E.left-B.left+x.left,right:B.right-E.right+x.right},S=e.modifiersData.offset;if(m===T&&S){var V=S[i];Object.keys(R).forEach((function(e){var t=[L,A].indexOf(e)>=0?1:-1,n=[D,A].indexOf(e)>=0?"y":"x";R[e]+=V[n]*t}))}return R}var K={placement:"bottom",modifiers:[],strategy:"absolute"};function Q(){for(var e=arguments.length,t=new Array(e),n=0;n=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],s=i[1];return a=a||0,s=(s||0)*o,[P,L].indexOf(r)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,i),e}),{}),s=a[t.placement],f=s.x,c=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=f,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=a}},se={left:"right",right:"left",bottom:"top",top:"bottom"};function fe(e){return e.replace(/left|right|bottom|top/g,(function(e){return se[e]}))}var ce={start:"end",end:"start"};function pe(e){return e.replace(/start|end/g,(function(e){return ce[e]}))}function ue(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,f=n.allowedAutoPlacements,c=void 0===f?S:f,p=U(r),u=p?s?R:R.filter((function(e){return U(e)===p})):k,l=u.filter((function(e){return c.indexOf(e)>=0}));0===l.length&&(l=u);var d=l.reduce((function(t,n){return t[n]=J(e,{placement:n,boundary:o,rootBoundary:i,padding:a})[C(n)],t}),{});return Object.keys(d).sort((function(e,t){return d[e]-d[t]}))}var le={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,a=n.altAxis,s=void 0===a||a,f=n.fallbackPlacements,c=n.padding,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.flipVariations,h=void 0===d||d,m=n.allowedAutoPlacements,v=t.options.placement,y=C(v),g=f||(y===v||!h?[fe(v)]:function(e){if(C(e)===M)return[];var t=fe(e);return[pe(e),t,pe(t)]}(v)),b=[v].concat(g).reduce((function(e,n){return e.concat(C(n)===M?ue(t,{placement:n,boundary:p,rootBoundary:u,padding:c,flipVariations:h,allowedAutoPlacements:m}):n)}),[]),x=t.rects.reference,w=t.rects.popper,O=new Map,j=!0,E=b[0],k=0;k=0,S=R?"width":"height",V=J(t,{placement:B,boundary:p,rootBoundary:u,altBoundary:l,padding:c}),q=R?T?L:P:T?A:D;x[S]>w[S]&&(q=fe(q));var N=fe(q),I=[];if(i&&I.push(V[H]<=0),s&&I.push(V[q]<=0,V[N]<=0),I.every((function(e){return e}))){E=B,j=!1;break}O.set(B,I)}if(j)for(var _=function(e){var t=b.find((function(t){var n=O.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return E=t,"break"},F=h?3:1;F>0;F--){if("break"===_(F))break}t.placement!==E&&(t.modifiersData[r]._skip=!0,t.placement=E,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function de(e,t,n){return i(e,a(t,n))}var he={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,s=void 0===o||o,f=n.altAxis,c=void 0!==f&&f,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.padding,h=n.tether,m=void 0===h||h,v=n.tetherOffset,y=void 0===v?0:v,b=J(t,{boundary:p,rootBoundary:u,padding:d,altBoundary:l}),x=C(t.placement),w=U(t.placement),O=!w,j=z(x),M="x"===j?"y":"x",k=t.modifiersData.popperOffsets,B=t.rects.reference,H=t.rects.popper,T="function"==typeof y?y(Object.assign({},t.rects,{placement:t.placement})):y,R="number"==typeof T?{mainAxis:T,altAxis:T}:Object.assign({mainAxis:0,altAxis:0},T),S=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,V={x:0,y:0};if(k){if(s){var q,N="y"===j?D:P,I="y"===j?A:L,_="y"===j?"height":"width",F=k[j],X=F+b[N],Y=F-b[I],G=m?-H[_]/2:0,K=w===W?B[_]:H[_],Q=w===W?-H[_]:-B[_],Z=t.elements.arrow,$=m&&Z?g(Z):{width:0,height:0},ee=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},te=ee[N],ne=ee[I],re=de(0,B[_],$[_]),oe=O?B[_]/2-G-re-te-R.mainAxis:K-re-te-R.mainAxis,ie=O?-B[_]/2+G+re+ne+R.mainAxis:Q+re+ne+R.mainAxis,ae=t.elements.arrow&&E(t.elements.arrow),se=ae?"y"===j?ae.clientTop||0:ae.clientLeft||0:0,fe=null!=(q=null==S?void 0:S[j])?q:0,ce=F+ie-fe,pe=de(m?a(X,F+oe-fe-se):X,F,m?i(Y,ce):Y);k[j]=pe,V[j]=pe-F}if(c){var ue,le="x"===j?D:P,he="x"===j?A:L,me=k[M],ve="y"===M?"height":"width",ye=me+b[le],ge=me-b[he],be=-1!==[D,P].indexOf(x),xe=null!=(ue=null==S?void 0:S[M])?ue:0,we=be?ye:me-B[ve]-H[ve]-xe+R.altAxis,Oe=be?me+B[ve]+H[ve]-xe-R.altAxis:ge,je=m&&be?function(e,t,n){var r=de(e,t,n);return r>n?n:r}(we,me,Oe):de(m?we:ye,me,m?Oe:ge);k[M]=je,V[M]=je-me}t.modifiersData[r]=V}},requiresIfExists:["offset"]};var me={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=C(n.placement),f=z(s),c=[P,L].indexOf(s)>=0?"height":"width";if(i&&a){var p=function(e,t){return Y("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:G(e,k))}(o.padding,n),u=g(i),l="y"===f?D:P,d="y"===f?A:L,h=n.rects.reference[c]+n.rects.reference[f]-a[f]-n.rects.popper[c],m=a[f]-n.rects.reference[f],v=E(i),y=v?"y"===f?v.clientHeight||0:v.clientWidth||0:0,b=h/2-m/2,x=p[l],w=y-u[c]-p[d],O=y/2-u[c]/2+b,j=de(x,O,w),M=f;n.modifiersData[r]=((t={})[M]=j,t.centerOffset=j-O,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&N(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ve(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function ye(e){return[D,L,A,P].some((function(t){return e[t]>=0}))}var ge={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=J(t,{elementContext:"reference"}),s=J(t,{altBoundary:!0}),f=ve(a,r),c=ve(s,o,i),p=ye(f),u=ye(c);t.modifiersData[n]={referenceClippingOffsets:f,popperEscapeOffsets:c,isReferenceHidden:p,hasPopperEscaped:u},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":u})}},be=Z({defaultModifiers:[ee,te,oe,ie]}),xe=[ee,te,oe,ie,ae,le,he,me,ge],we=Z({defaultModifiers:xe});e.applyStyles=ie,e.arrow=me,e.computeStyles=oe,e.createPopper=we,e.createPopperLite=be,e.defaultModifiers=xe,e.detectOverflow=J,e.eventListeners=ee,e.flip=le,e.hide=ge,e.offset=ae,e.popperGenerator=Z,e.popperOffsets=te,e.preventOverflow=he,Object.defineProperty(e,"__esModule",{value:!0})})); - diff --git a/docs/validmind_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css b/docs/validmind_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css deleted file mode 100644 index 80e34e41a..000000000 --- a/docs/validmind_files/libs/quarto-html/quarto-syntax-highlighting-549806ee2085284f45b00abea8c6df48.css +++ /dev/null @@ -1,205 +0,0 @@ -/* quarto syntax highlight colors */ -:root { - --quarto-hl-ot-color: #003B4F; - --quarto-hl-at-color: #657422; - --quarto-hl-ss-color: #20794D; - --quarto-hl-an-color: #5E5E5E; - --quarto-hl-fu-color: #4758AB; - --quarto-hl-st-color: #20794D; - --quarto-hl-cf-color: #003B4F; - --quarto-hl-op-color: #5E5E5E; - --quarto-hl-er-color: #AD0000; - --quarto-hl-bn-color: #AD0000; - --quarto-hl-al-color: #AD0000; - --quarto-hl-va-color: #111111; - --quarto-hl-bu-color: inherit; - --quarto-hl-ex-color: inherit; - --quarto-hl-pp-color: #AD0000; - --quarto-hl-in-color: #5E5E5E; - --quarto-hl-vs-color: #20794D; - --quarto-hl-wa-color: #5E5E5E; - --quarto-hl-do-color: #5E5E5E; - --quarto-hl-im-color: #00769E; - --quarto-hl-ch-color: #20794D; - --quarto-hl-dt-color: #AD0000; - --quarto-hl-fl-color: #AD0000; - --quarto-hl-co-color: #5E5E5E; - --quarto-hl-cv-color: #5E5E5E; - --quarto-hl-cn-color: #8f5902; - --quarto-hl-sc-color: #5E5E5E; - --quarto-hl-dv-color: #AD0000; - --quarto-hl-kw-color: #003B4F; -} - -/* other quarto variables */ -:root { - --quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; -} - -pre > code.sourceCode > span { - color: #003B4F; -} - -code span { - color: #003B4F; -} - -code.sourceCode > span { - color: #003B4F; -} - -div.sourceCode, -div.sourceCode pre.sourceCode { - color: #003B4F; -} - -code span.ot { - color: #003B4F; - font-style: inherit; -} - -code span.at { - color: #657422; - font-style: inherit; -} - -code span.ss { - color: #20794D; - font-style: inherit; -} - -code span.an { - color: #5E5E5E; - font-style: inherit; -} - -code span.fu { - color: #4758AB; - font-style: inherit; -} - -code span.st { - color: #20794D; - font-style: inherit; -} - -code span.cf { - color: #003B4F; - font-weight: bold; - font-style: inherit; -} - -code span.op { - color: #5E5E5E; - font-style: inherit; -} - -code span.er { - color: #AD0000; - font-style: inherit; -} - -code span.bn { - color: #AD0000; - font-style: inherit; -} - -code span.al { - color: #AD0000; - font-style: inherit; -} - -code span.va { - color: #111111; - font-style: inherit; -} - -code span.bu { - font-style: inherit; -} - -code span.ex { - font-style: inherit; -} - -code span.pp { - color: #AD0000; - font-style: inherit; -} - -code span.in { - color: #5E5E5E; - font-style: inherit; -} - -code span.vs { - color: #20794D; - font-style: inherit; -} - -code span.wa { - color: #5E5E5E; - font-style: italic; -} - -code span.do { - color: #5E5E5E; - font-style: italic; -} - -code span.im { - color: #00769E; - font-style: inherit; -} - -code span.ch { - color: #20794D; - font-style: inherit; -} - -code span.dt { - color: #AD0000; - font-style: inherit; -} - -code span.fl { - color: #AD0000; - font-style: inherit; -} - -code span.co { - color: #5E5E5E; - font-style: inherit; -} - -code span.cv { - color: #5E5E5E; - font-style: italic; -} - -code span.cn { - color: #8f5902; - font-style: inherit; -} - -code span.sc { - color: #5E5E5E; - font-style: inherit; -} - -code span.dv { - color: #AD0000; - font-style: inherit; -} - -code span.kw { - color: #003B4F; - font-weight: bold; - font-style: inherit; -} - -.prevent-inlining { - content: " { - // Find any conflicting margin elements and add margins to the - // top to prevent overlap - const marginChildren = window.document.querySelectorAll( - ".column-margin.column-container > *, .margin-caption, .aside" - ); - - let lastBottom = 0; - for (const marginChild of marginChildren) { - if (marginChild.offsetParent !== null) { - // clear the top margin so we recompute it - marginChild.style.marginTop = null; - const top = marginChild.getBoundingClientRect().top + window.scrollY; - if (top < lastBottom) { - const marginChildStyle = window.getComputedStyle(marginChild); - const marginBottom = parseFloat(marginChildStyle["marginBottom"]); - const margin = lastBottom - top + marginBottom; - marginChild.style.marginTop = `${margin}px`; - } - const styles = window.getComputedStyle(marginChild); - const marginTop = parseFloat(styles["marginTop"]); - lastBottom = top + marginChild.getBoundingClientRect().height + marginTop; - } - } -}; - -window.document.addEventListener("DOMContentLoaded", function (_event) { - // Recompute the position of margin elements anytime the body size changes - if (window.ResizeObserver) { - const resizeObserver = new window.ResizeObserver( - throttle(() => { - layoutMarginEls(); - if ( - window.document.body.getBoundingClientRect().width < 990 && - isReaderMode() - ) { - quartoToggleReader(); - } - }, 50) - ); - resizeObserver.observe(window.document.body); - } - - const tocEl = window.document.querySelector('nav.toc-active[role="doc-toc"]'); - const sidebarEl = window.document.getElementById("quarto-sidebar"); - const leftTocEl = window.document.getElementById("quarto-sidebar-toc-left"); - const marginSidebarEl = window.document.getElementById( - "quarto-margin-sidebar" - ); - // function to determine whether the element has a previous sibling that is active - const prevSiblingIsActiveLink = (el) => { - const sibling = el.previousElementSibling; - if (sibling && sibling.tagName === "A") { - return sibling.classList.contains("active"); - } else { - return false; - } - }; - - // fire slideEnter for bootstrap tab activations (for htmlwidget resize behavior) - function fireSlideEnter(e) { - const event = window.document.createEvent("Event"); - event.initEvent("slideenter", true, true); - window.document.dispatchEvent(event); - } - const tabs = window.document.querySelectorAll('a[data-bs-toggle="tab"]'); - tabs.forEach((tab) => { - tab.addEventListener("shown.bs.tab", fireSlideEnter); - }); - - // fire slideEnter for tabby tab activations (for htmlwidget resize behavior) - document.addEventListener("tabby", fireSlideEnter, false); - - // Track scrolling and mark TOC links as active - // get table of contents and sidebar (bail if we don't have at least one) - const tocLinks = tocEl - ? [...tocEl.querySelectorAll("a[data-scroll-target]")] - : []; - const makeActive = (link) => tocLinks[link].classList.add("active"); - const removeActive = (link) => tocLinks[link].classList.remove("active"); - const removeAllActive = () => - [...Array(tocLinks.length).keys()].forEach((link) => removeActive(link)); - - // activate the anchor for a section associated with this TOC entry - tocLinks.forEach((link) => { - link.addEventListener("click", () => { - if (link.href.indexOf("#") !== -1) { - const anchor = link.href.split("#")[1]; - const heading = window.document.querySelector( - `[data-anchor-id="${anchor}"]` - ); - if (heading) { - // Add the class - heading.classList.add("reveal-anchorjs-link"); - - // function to show the anchor - const handleMouseout = () => { - heading.classList.remove("reveal-anchorjs-link"); - heading.removeEventListener("mouseout", handleMouseout); - }; - - // add a function to clear the anchor when the user mouses out of it - heading.addEventListener("mouseout", handleMouseout); - } - } - }); - }); - - const sections = tocLinks.map((link) => { - const target = link.getAttribute("data-scroll-target"); - if (target.startsWith("#")) { - return window.document.getElementById(decodeURI(`${target.slice(1)}`)); - } else { - return window.document.querySelector(decodeURI(`${target}`)); - } - }); - - const sectionMargin = 200; - let currentActive = 0; - // track whether we've initialized state the first time - let init = false; - - const updateActiveLink = () => { - // The index from bottom to top (e.g. reversed list) - let sectionIndex = -1; - if ( - window.innerHeight + window.pageYOffset >= - window.document.body.offsetHeight - ) { - // This is the no-scroll case where last section should be the active one - sectionIndex = 0; - } else { - // This finds the last section visible on screen that should be made active - sectionIndex = [...sections].reverse().findIndex((section) => { - if (section) { - return window.pageYOffset >= section.offsetTop - sectionMargin; - } else { - return false; - } - }); - } - if (sectionIndex > -1) { - const current = sections.length - sectionIndex - 1; - if (current !== currentActive) { - removeAllActive(); - currentActive = current; - makeActive(current); - if (init) { - window.dispatchEvent(sectionChanged); - } - init = true; - } - } - }; - - const inHiddenRegion = (top, bottom, hiddenRegions) => { - for (const region of hiddenRegions) { - if (top <= region.bottom && bottom >= region.top) { - return true; - } - } - return false; - }; - - const categorySelector = "header.quarto-title-block .quarto-category"; - const activateCategories = (href) => { - // Find any categories - // Surround them with a link pointing back to: - // #category=Authoring - try { - const categoryEls = window.document.querySelectorAll(categorySelector); - for (const categoryEl of categoryEls) { - const categoryText = categoryEl.textContent; - if (categoryText) { - const link = `${href}#category=${encodeURIComponent(categoryText)}`; - const linkEl = window.document.createElement("a"); - linkEl.setAttribute("href", link); - for (const child of categoryEl.childNodes) { - linkEl.append(child); - } - categoryEl.appendChild(linkEl); - } - } - } catch { - // Ignore errors - } - }; - function hasTitleCategories() { - return window.document.querySelector(categorySelector) !== null; - } - - function offsetRelativeUrl(url) { - const offset = getMeta("quarto:offset"); - return offset ? offset + url : url; - } - - function offsetAbsoluteUrl(url) { - const offset = getMeta("quarto:offset"); - const baseUrl = new URL(offset, window.location); - - const projRelativeUrl = url.replace(baseUrl, ""); - if (projRelativeUrl.startsWith("/")) { - return projRelativeUrl; - } else { - return "/" + projRelativeUrl; - } - } - - // read a meta tag value - function getMeta(metaName) { - const metas = window.document.getElementsByTagName("meta"); - for (let i = 0; i < metas.length; i++) { - if (metas[i].getAttribute("name") === metaName) { - return metas[i].getAttribute("content"); - } - } - return ""; - } - - async function findAndActivateCategories() { - // Categories search with listing only use path without query - const currentPagePath = offsetAbsoluteUrl( - window.location.origin + window.location.pathname - ); - const response = await fetch(offsetRelativeUrl("listings.json")); - if (response.status == 200) { - return response.json().then(function (listingPaths) { - const listingHrefs = []; - for (const listingPath of listingPaths) { - const pathWithoutLeadingSlash = listingPath.listing.substring(1); - for (const item of listingPath.items) { - if ( - item === currentPagePath || - item === currentPagePath + "index.html" - ) { - // Resolve this path against the offset to be sure - // we already are using the correct path to the listing - // (this adjusts the listing urls to be rooted against - // whatever root the page is actually running against) - const relative = offsetRelativeUrl(pathWithoutLeadingSlash); - const baseUrl = window.location; - const resolvedPath = new URL(relative, baseUrl); - listingHrefs.push(resolvedPath.pathname); - break; - } - } - } - - // Look up the tree for a nearby linting and use that if we find one - const nearestListing = findNearestParentListing( - offsetAbsoluteUrl(window.location.pathname), - listingHrefs - ); - if (nearestListing) { - activateCategories(nearestListing); - } else { - // See if the referrer is a listing page for this item - const referredRelativePath = offsetAbsoluteUrl(document.referrer); - const referrerListing = listingHrefs.find((listingHref) => { - const isListingReferrer = - listingHref === referredRelativePath || - listingHref === referredRelativePath + "index.html"; - return isListingReferrer; - }); - - if (referrerListing) { - // Try to use the referrer if possible - activateCategories(referrerListing); - } else if (listingHrefs.length > 0) { - // Otherwise, just fall back to the first listing - activateCategories(listingHrefs[0]); - } - } - }); - } - } - if (hasTitleCategories()) { - findAndActivateCategories(); - } - - const findNearestParentListing = (href, listingHrefs) => { - if (!href || !listingHrefs) { - return undefined; - } - // Look up the tree for a nearby linting and use that if we find one - const relativeParts = href.substring(1).split("/"); - while (relativeParts.length > 0) { - const path = relativeParts.join("/"); - for (const listingHref of listingHrefs) { - if (listingHref.startsWith(path)) { - return listingHref; - } - } - relativeParts.pop(); - } - - return undefined; - }; - - const manageSidebarVisiblity = (el, placeholderDescriptor) => { - let isVisible = true; - let elRect; - - return (hiddenRegions) => { - if (el === null) { - return; - } - - // Find the last element of the TOC - const lastChildEl = el.lastElementChild; - - if (lastChildEl) { - // Converts the sidebar to a menu - const convertToMenu = () => { - for (const child of el.children) { - child.style.opacity = 0; - child.style.overflow = "hidden"; - child.style.pointerEvents = "none"; - } - - nexttick(() => { - const toggleContainer = window.document.createElement("div"); - toggleContainer.style.width = "100%"; - toggleContainer.classList.add("zindex-over-content"); - toggleContainer.classList.add("quarto-sidebar-toggle"); - toggleContainer.classList.add("headroom-target"); // Marks this to be managed by headeroom - toggleContainer.id = placeholderDescriptor.id; - toggleContainer.style.position = "fixed"; - - const toggleIcon = window.document.createElement("i"); - toggleIcon.classList.add("quarto-sidebar-toggle-icon"); - toggleIcon.classList.add("bi"); - toggleIcon.classList.add("bi-caret-down-fill"); - - const toggleTitle = window.document.createElement("div"); - const titleEl = window.document.body.querySelector( - placeholderDescriptor.titleSelector - ); - if (titleEl) { - toggleTitle.append( - titleEl.textContent || titleEl.innerText, - toggleIcon - ); - } - toggleTitle.classList.add("zindex-over-content"); - toggleTitle.classList.add("quarto-sidebar-toggle-title"); - toggleContainer.append(toggleTitle); - - const toggleContents = window.document.createElement("div"); - toggleContents.classList = el.classList; - toggleContents.classList.add("zindex-over-content"); - toggleContents.classList.add("quarto-sidebar-toggle-contents"); - for (const child of el.children) { - if (child.id === "toc-title") { - continue; - } - - const clone = child.cloneNode(true); - clone.style.opacity = 1; - clone.style.pointerEvents = null; - clone.style.display = null; - toggleContents.append(clone); - } - toggleContents.style.height = "0px"; - const positionToggle = () => { - // position the element (top left of parent, same width as parent) - if (!elRect) { - elRect = el.getBoundingClientRect(); - } - toggleContainer.style.left = `${elRect.left}px`; - toggleContainer.style.top = `${elRect.top}px`; - toggleContainer.style.width = `${elRect.width}px`; - }; - positionToggle(); - - toggleContainer.append(toggleContents); - el.parentElement.prepend(toggleContainer); - - // Process clicks - let tocShowing = false; - // Allow the caller to control whether this is dismissed - // when it is clicked (e.g. sidebar navigation supports - // opening and closing the nav tree, so don't dismiss on click) - const clickEl = placeholderDescriptor.dismissOnClick - ? toggleContainer - : toggleTitle; - - const closeToggle = () => { - if (tocShowing) { - toggleContainer.classList.remove("expanded"); - toggleContents.style.height = "0px"; - tocShowing = false; - } - }; - - // Get rid of any expanded toggle if the user scrolls - window.document.addEventListener( - "scroll", - throttle(() => { - closeToggle(); - }, 50) - ); - - // Handle positioning of the toggle - window.addEventListener( - "resize", - throttle(() => { - elRect = undefined; - positionToggle(); - }, 50) - ); - - window.addEventListener("quarto-hrChanged", () => { - elRect = undefined; - }); - - // Process the click - clickEl.onclick = () => { - if (!tocShowing) { - toggleContainer.classList.add("expanded"); - toggleContents.style.height = null; - tocShowing = true; - } else { - closeToggle(); - } - }; - }); - }; - - // Converts a sidebar from a menu back to a sidebar - const convertToSidebar = () => { - for (const child of el.children) { - child.style.opacity = 1; - child.style.overflow = null; - child.style.pointerEvents = null; - } - - const placeholderEl = window.document.getElementById( - placeholderDescriptor.id - ); - if (placeholderEl) { - placeholderEl.remove(); - } - - el.classList.remove("rollup"); - }; - - if (isReaderMode()) { - convertToMenu(); - isVisible = false; - } else { - // Find the top and bottom o the element that is being managed - const elTop = el.offsetTop; - const elBottom = - elTop + lastChildEl.offsetTop + lastChildEl.offsetHeight; - - if (!isVisible) { - // If the element is current not visible reveal if there are - // no conflicts with overlay regions - if (!inHiddenRegion(elTop, elBottom, hiddenRegions)) { - convertToSidebar(); - isVisible = true; - } - } else { - // If the element is visible, hide it if it conflicts with overlay regions - // and insert a placeholder toggle (or if we're in reader mode) - if (inHiddenRegion(elTop, elBottom, hiddenRegions)) { - convertToMenu(); - isVisible = false; - } - } - } - } - }; - }; - - const tabEls = document.querySelectorAll('a[data-bs-toggle="tab"]'); - for (const tabEl of tabEls) { - const id = tabEl.getAttribute("data-bs-target"); - if (id) { - const columnEl = document.querySelector( - `${id} .column-margin, .tabset-margin-content` - ); - if (columnEl) - tabEl.addEventListener("shown.bs.tab", function (event) { - const el = event.srcElement; - if (el) { - const visibleCls = `${el.id}-margin-content`; - // walk up until we find a parent tabset - let panelTabsetEl = el.parentElement; - while (panelTabsetEl) { - if (panelTabsetEl.classList.contains("panel-tabset")) { - break; - } - panelTabsetEl = panelTabsetEl.parentElement; - } - - if (panelTabsetEl) { - const prevSib = panelTabsetEl.previousElementSibling; - if ( - prevSib && - prevSib.classList.contains("tabset-margin-container") - ) { - const childNodes = prevSib.querySelectorAll( - ".tabset-margin-content" - ); - for (const childEl of childNodes) { - if (childEl.classList.contains(visibleCls)) { - childEl.classList.remove("collapse"); - } else { - childEl.classList.add("collapse"); - } - } - } - } - } - - layoutMarginEls(); - }); - } - } - - // Manage the visibility of the toc and the sidebar - const marginScrollVisibility = manageSidebarVisiblity(marginSidebarEl, { - id: "quarto-toc-toggle", - titleSelector: "#toc-title", - dismissOnClick: true, - }); - const sidebarScrollVisiblity = manageSidebarVisiblity(sidebarEl, { - id: "quarto-sidebarnav-toggle", - titleSelector: ".title", - dismissOnClick: false, - }); - let tocLeftScrollVisibility; - if (leftTocEl) { - tocLeftScrollVisibility = manageSidebarVisiblity(leftTocEl, { - id: "quarto-lefttoc-toggle", - titleSelector: "#toc-title", - dismissOnClick: true, - }); - } - - // Find the first element that uses formatting in special columns - const conflictingEls = window.document.body.querySelectorAll( - '[class^="column-"], [class*=" column-"], aside, [class*="margin-caption"], [class*=" margin-caption"], [class*="margin-ref"], [class*=" margin-ref"]' - ); - - // Filter all the possibly conflicting elements into ones - // the do conflict on the left or ride side - const arrConflictingEls = Array.from(conflictingEls); - const leftSideConflictEls = arrConflictingEls.filter((el) => { - if (el.tagName === "ASIDE") { - return false; - } - return Array.from(el.classList).find((className) => { - return ( - className !== "column-body" && - className.startsWith("column-") && - !className.endsWith("right") && - !className.endsWith("container") && - className !== "column-margin" - ); - }); - }); - const rightSideConflictEls = arrConflictingEls.filter((el) => { - if (el.tagName === "ASIDE") { - return true; - } - - const hasMarginCaption = Array.from(el.classList).find((className) => { - return className == "margin-caption"; - }); - if (hasMarginCaption) { - return true; - } - - return Array.from(el.classList).find((className) => { - return ( - className !== "column-body" && - !className.endsWith("container") && - className.startsWith("column-") && - !className.endsWith("left") - ); - }); - }); - - const kOverlapPaddingSize = 10; - function toRegions(els) { - return els.map((el) => { - const boundRect = el.getBoundingClientRect(); - const top = - boundRect.top + - document.documentElement.scrollTop - - kOverlapPaddingSize; - return { - top, - bottom: top + el.scrollHeight + 2 * kOverlapPaddingSize, - }; - }); - } - - let hasObserved = false; - const visibleItemObserver = (els) => { - let visibleElements = [...els]; - const intersectionObserver = new IntersectionObserver( - (entries, _observer) => { - entries.forEach((entry) => { - if (entry.isIntersecting) { - if (visibleElements.indexOf(entry.target) === -1) { - visibleElements.push(entry.target); - } - } else { - visibleElements = visibleElements.filter((visibleEntry) => { - return visibleEntry !== entry; - }); - } - }); - - if (!hasObserved) { - hideOverlappedSidebars(); - } - hasObserved = true; - }, - {} - ); - els.forEach((el) => { - intersectionObserver.observe(el); - }); - - return { - getVisibleEntries: () => { - return visibleElements; - }, - }; - }; - - const rightElementObserver = visibleItemObserver(rightSideConflictEls); - const leftElementObserver = visibleItemObserver(leftSideConflictEls); - - const hideOverlappedSidebars = () => { - marginScrollVisibility(toRegions(rightElementObserver.getVisibleEntries())); - sidebarScrollVisiblity(toRegions(leftElementObserver.getVisibleEntries())); - if (tocLeftScrollVisibility) { - tocLeftScrollVisibility( - toRegions(leftElementObserver.getVisibleEntries()) - ); - } - }; - - window.quartoToggleReader = () => { - // Applies a slow class (or removes it) - // to update the transition speed - const slowTransition = (slow) => { - const manageTransition = (id, slow) => { - const el = document.getElementById(id); - if (el) { - if (slow) { - el.classList.add("slow"); - } else { - el.classList.remove("slow"); - } - } - }; - - manageTransition("TOC", slow); - manageTransition("quarto-sidebar", slow); - }; - const readerMode = !isReaderMode(); - setReaderModeValue(readerMode); - - // If we're entering reader mode, slow the transition - if (readerMode) { - slowTransition(readerMode); - } - highlightReaderToggle(readerMode); - hideOverlappedSidebars(); - - // If we're exiting reader mode, restore the non-slow transition - if (!readerMode) { - slowTransition(!readerMode); - } - }; - - const highlightReaderToggle = (readerMode) => { - const els = document.querySelectorAll(".quarto-reader-toggle"); - if (els) { - els.forEach((el) => { - if (readerMode) { - el.classList.add("reader"); - } else { - el.classList.remove("reader"); - } - }); - } - }; - - const setReaderModeValue = (val) => { - if (window.location.protocol !== "file:") { - window.localStorage.setItem("quarto-reader-mode", val); - } else { - localReaderMode = val; - } - }; - - const isReaderMode = () => { - if (window.location.protocol !== "file:") { - return window.localStorage.getItem("quarto-reader-mode") === "true"; - } else { - return localReaderMode; - } - }; - let localReaderMode = null; - - const tocOpenDepthStr = tocEl?.getAttribute("data-toc-expanded"); - const tocOpenDepth = tocOpenDepthStr ? Number(tocOpenDepthStr) : 1; - - // Walk the TOC and collapse/expand nodes - // Nodes are expanded if: - // - they are top level - // - they have children that are 'active' links - // - they are directly below an link that is 'active' - const walk = (el, depth) => { - // Tick depth when we enter a UL - if (el.tagName === "UL") { - depth = depth + 1; - } - - // It this is active link - let isActiveNode = false; - if (el.tagName === "A" && el.classList.contains("active")) { - isActiveNode = true; - } - - // See if there is an active child to this element - let hasActiveChild = false; - for (child of el.children) { - hasActiveChild = walk(child, depth) || hasActiveChild; - } - - // Process the collapse state if this is an UL - if (el.tagName === "UL") { - if (tocOpenDepth === -1 && depth > 1) { - // toc-expand: false - el.classList.add("collapse"); - } else if ( - depth <= tocOpenDepth || - hasActiveChild || - prevSiblingIsActiveLink(el) - ) { - el.classList.remove("collapse"); - } else { - el.classList.add("collapse"); - } - - // untick depth when we leave a UL - depth = depth - 1; - } - return hasActiveChild || isActiveNode; - }; - - // walk the TOC and expand / collapse any items that should be shown - if (tocEl) { - updateActiveLink(); - walk(tocEl, 0); - } - - // Throttle the scroll event and walk peridiocally - window.document.addEventListener( - "scroll", - throttle(() => { - if (tocEl) { - updateActiveLink(); - walk(tocEl, 0); - } - if (!isReaderMode()) { - hideOverlappedSidebars(); - } - }, 5) - ); - window.addEventListener( - "resize", - throttle(() => { - if (tocEl) { - updateActiveLink(); - walk(tocEl, 0); - } - if (!isReaderMode()) { - hideOverlappedSidebars(); - } - }, 10) - ); - hideOverlappedSidebars(); - highlightReaderToggle(isReaderMode()); -}); - -// grouped tabsets -window.addEventListener("pageshow", (_event) => { - function getTabSettings() { - const data = localStorage.getItem("quarto-persistent-tabsets-data"); - if (!data) { - localStorage.setItem("quarto-persistent-tabsets-data", "{}"); - return {}; - } - if (data) { - return JSON.parse(data); - } - } - - function setTabSettings(data) { - localStorage.setItem( - "quarto-persistent-tabsets-data", - JSON.stringify(data) - ); - } - - function setTabState(groupName, groupValue) { - const data = getTabSettings(); - data[groupName] = groupValue; - setTabSettings(data); - } - - function toggleTab(tab, active) { - const tabPanelId = tab.getAttribute("aria-controls"); - const tabPanel = document.getElementById(tabPanelId); - if (active) { - tab.classList.add("active"); - tabPanel.classList.add("active"); - } else { - tab.classList.remove("active"); - tabPanel.classList.remove("active"); - } - } - - function toggleAll(selectedGroup, selectorsToSync) { - for (const [thisGroup, tabs] of Object.entries(selectorsToSync)) { - const active = selectedGroup === thisGroup; - for (const tab of tabs) { - toggleTab(tab, active); - } - } - } - - function findSelectorsToSyncByLanguage() { - const result = {}; - const tabs = Array.from( - document.querySelectorAll(`div[data-group] a[id^='tabset-']`) - ); - for (const item of tabs) { - const div = item.parentElement.parentElement.parentElement; - const group = div.getAttribute("data-group"); - if (!result[group]) { - result[group] = {}; - } - const selectorsToSync = result[group]; - const value = item.innerHTML; - if (!selectorsToSync[value]) { - selectorsToSync[value] = []; - } - selectorsToSync[value].push(item); - } - return result; - } - - function setupSelectorSync() { - const selectorsToSync = findSelectorsToSyncByLanguage(); - Object.entries(selectorsToSync).forEach(([group, tabSetsByValue]) => { - Object.entries(tabSetsByValue).forEach(([value, items]) => { - items.forEach((item) => { - item.addEventListener("click", (_event) => { - setTabState(group, value); - toggleAll(value, selectorsToSync[group]); - }); - }); - }); - }); - return selectorsToSync; - } - - const selectorsToSync = setupSelectorSync(); - for (const [group, selectedName] of Object.entries(getTabSettings())) { - const selectors = selectorsToSync[group]; - // it's possible that stale state gives us empty selections, so we explicitly check here. - if (selectors) { - toggleAll(selectedName, selectors); - } - } -}); - -function throttle(func, wait) { - let waiting = false; - return function () { - if (!waiting) { - func.apply(this, arguments); - waiting = true; - setTimeout(function () { - waiting = false; - }, wait); - } - }; -} - -function nexttick(func) { - return setTimeout(func, 0); -} diff --git a/docs/validmind_files/libs/quarto-html/tippy.css b/docs/validmind_files/libs/quarto-html/tippy.css deleted file mode 100644 index e6ae635cb..000000000 --- a/docs/validmind_files/libs/quarto-html/tippy.css +++ /dev/null @@ -1 +0,0 @@ -.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1} \ No newline at end of file diff --git a/docs/validmind_files/libs/quarto-html/tippy.umd.min.js b/docs/validmind_files/libs/quarto-html/tippy.umd.min.js deleted file mode 100644 index ca292be32..000000000 --- a/docs/validmind_files/libs/quarto-html/tippy.umd.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],t):(e=e||self).tippy=t(e.Popper)}(this,(function(e){"use strict";var t={passive:!0,capture:!0},n=function(){return document.body};function r(e,t,n){if(Array.isArray(e)){var r=e[t];return null==r?Array.isArray(n)?n[t]:n:r}return e}function o(e,t){var n={}.toString.call(e);return 0===n.indexOf("[object")&&n.indexOf(t+"]")>-1}function i(e,t){return"function"==typeof e?e.apply(void 0,t):e}function a(e,t){return 0===t?e:function(r){clearTimeout(n),n=setTimeout((function(){e(r)}),t)};var n}function s(e,t){var n=Object.assign({},e);return t.forEach((function(e){delete n[e]})),n}function u(e){return[].concat(e)}function c(e,t){-1===e.indexOf(t)&&e.push(t)}function p(e){return e.split("-")[0]}function f(e){return[].slice.call(e)}function l(e){return Object.keys(e).reduce((function(t,n){return void 0!==e[n]&&(t[n]=e[n]),t}),{})}function d(){return document.createElement("div")}function v(e){return["Element","Fragment"].some((function(t){return o(e,t)}))}function m(e){return o(e,"MouseEvent")}function g(e){return!(!e||!e._tippy||e._tippy.reference!==e)}function h(e){return v(e)?[e]:function(e){return o(e,"NodeList")}(e)?f(e):Array.isArray(e)?e:f(document.querySelectorAll(e))}function b(e,t){e.forEach((function(e){e&&(e.style.transitionDuration=t+"ms")}))}function y(e,t){e.forEach((function(e){e&&e.setAttribute("data-state",t)}))}function w(e){var t,n=u(e)[0];return null!=n&&null!=(t=n.ownerDocument)&&t.body?n.ownerDocument:document}function E(e,t,n){var r=t+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(t){e[r](t,n)}))}function O(e,t){for(var n=t;n;){var r;if(e.contains(n))return!0;n=null==n.getRootNode||null==(r=n.getRootNode())?void 0:r.host}return!1}var x={isTouch:!1},C=0;function T(){x.isTouch||(x.isTouch=!0,window.performance&&document.addEventListener("mousemove",A))}function A(){var e=performance.now();e-C<20&&(x.isTouch=!1,document.removeEventListener("mousemove",A)),C=e}function L(){var e=document.activeElement;if(g(e)){var t=e._tippy;e.blur&&!t.state.isVisible&&e.blur()}}var D=!!("undefined"!=typeof window&&"undefined"!=typeof document)&&!!window.msCrypto,R=Object.assign({appendTo:n,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),k=Object.keys(R);function P(e){var t=(e.plugins||[]).reduce((function(t,n){var r,o=n.name,i=n.defaultValue;o&&(t[o]=void 0!==e[o]?e[o]:null!=(r=R[o])?r:i);return t}),{});return Object.assign({},e,t)}function j(e,t){var n=Object.assign({},t,{content:i(t.content,[e])},t.ignoreAttributes?{}:function(e,t){return(t?Object.keys(P(Object.assign({},R,{plugins:t}))):k).reduce((function(t,n){var r=(e.getAttribute("data-tippy-"+n)||"").trim();if(!r)return t;if("content"===n)t[n]=r;else try{t[n]=JSON.parse(r)}catch(e){t[n]=r}return t}),{})}(e,t.plugins));return n.aria=Object.assign({},R.aria,n.aria),n.aria={expanded:"auto"===n.aria.expanded?t.interactive:n.aria.expanded,content:"auto"===n.aria.content?t.interactive?null:"describedby":n.aria.content},n}function M(e,t){e.innerHTML=t}function V(e){var t=d();return!0===e?t.className="tippy-arrow":(t.className="tippy-svg-arrow",v(e)?t.appendChild(e):M(t,e)),t}function I(e,t){v(t.content)?(M(e,""),e.appendChild(t.content)):"function"!=typeof t.content&&(t.allowHTML?M(e,t.content):e.textContent=t.content)}function S(e){var t=e.firstElementChild,n=f(t.children);return{box:t,content:n.find((function(e){return e.classList.contains("tippy-content")})),arrow:n.find((function(e){return e.classList.contains("tippy-arrow")||e.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(e){return e.classList.contains("tippy-backdrop")}))}}function N(e){var t=d(),n=d();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=d();function o(n,r){var o=S(t),i=o.box,a=o.content,s=o.arrow;r.theme?i.setAttribute("data-theme",r.theme):i.removeAttribute("data-theme"),"string"==typeof r.animation?i.setAttribute("data-animation",r.animation):i.removeAttribute("data-animation"),r.inertia?i.setAttribute("data-inertia",""):i.removeAttribute("data-inertia"),i.style.maxWidth="number"==typeof r.maxWidth?r.maxWidth+"px":r.maxWidth,r.role?i.setAttribute("role",r.role):i.removeAttribute("role"),n.content===r.content&&n.allowHTML===r.allowHTML||I(a,e.props),r.arrow?s?n.arrow!==r.arrow&&(i.removeChild(s),i.appendChild(V(r.arrow))):i.appendChild(V(r.arrow)):s&&i.removeChild(s)}return r.className="tippy-content",r.setAttribute("data-state","hidden"),I(r,e.props),t.appendChild(n),n.appendChild(r),o(e.props,e.props),{popper:t,onUpdate:o}}N.$$tippy=!0;var B=1,H=[],U=[];function _(o,s){var v,g,h,C,T,A,L,k,M=j(o,Object.assign({},R,P(l(s)))),V=!1,I=!1,N=!1,_=!1,F=[],W=a(we,M.interactiveDebounce),X=B++,Y=(k=M.plugins).filter((function(e,t){return k.indexOf(e)===t})),$={id:X,reference:o,popper:d(),popperInstance:null,props:M,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:Y,clearDelayTimeouts:function(){clearTimeout(v),clearTimeout(g),cancelAnimationFrame(h)},setProps:function(e){if($.state.isDestroyed)return;ae("onBeforeUpdate",[$,e]),be();var t=$.props,n=j(o,Object.assign({},t,l(e),{ignoreAttributes:!0}));$.props=n,he(),t.interactiveDebounce!==n.interactiveDebounce&&(ce(),W=a(we,n.interactiveDebounce));t.triggerTarget&&!n.triggerTarget?u(t.triggerTarget).forEach((function(e){e.removeAttribute("aria-expanded")})):n.triggerTarget&&o.removeAttribute("aria-expanded");ue(),ie(),J&&J(t,n);$.popperInstance&&(Ce(),Ae().forEach((function(e){requestAnimationFrame(e._tippy.popperInstance.forceUpdate)})));ae("onAfterUpdate",[$,e])},setContent:function(e){$.setProps({content:e})},show:function(){var e=$.state.isVisible,t=$.state.isDestroyed,o=!$.state.isEnabled,a=x.isTouch&&!$.props.touch,s=r($.props.duration,0,R.duration);if(e||t||o||a)return;if(te().hasAttribute("disabled"))return;if(ae("onShow",[$],!1),!1===$.props.onShow($))return;$.state.isVisible=!0,ee()&&(z.style.visibility="visible");ie(),de(),$.state.isMounted||(z.style.transition="none");if(ee()){var u=re(),p=u.box,f=u.content;b([p,f],0)}A=function(){var e;if($.state.isVisible&&!_){if(_=!0,z.offsetHeight,z.style.transition=$.props.moveTransition,ee()&&$.props.animation){var t=re(),n=t.box,r=t.content;b([n,r],s),y([n,r],"visible")}se(),ue(),c(U,$),null==(e=$.popperInstance)||e.forceUpdate(),ae("onMount",[$]),$.props.animation&&ee()&&function(e,t){me(e,t)}(s,(function(){$.state.isShown=!0,ae("onShown",[$])}))}},function(){var e,t=$.props.appendTo,r=te();e=$.props.interactive&&t===n||"parent"===t?r.parentNode:i(t,[r]);e.contains(z)||e.appendChild(z);$.state.isMounted=!0,Ce()}()},hide:function(){var e=!$.state.isVisible,t=$.state.isDestroyed,n=!$.state.isEnabled,o=r($.props.duration,1,R.duration);if(e||t||n)return;if(ae("onHide",[$],!1),!1===$.props.onHide($))return;$.state.isVisible=!1,$.state.isShown=!1,_=!1,V=!1,ee()&&(z.style.visibility="hidden");if(ce(),ve(),ie(!0),ee()){var i=re(),a=i.box,s=i.content;$.props.animation&&(b([a,s],o),y([a,s],"hidden"))}se(),ue(),$.props.animation?ee()&&function(e,t){me(e,(function(){!$.state.isVisible&&z.parentNode&&z.parentNode.contains(z)&&t()}))}(o,$.unmount):$.unmount()},hideWithInteractivity:function(e){ne().addEventListener("mousemove",W),c(H,W),W(e)},enable:function(){$.state.isEnabled=!0},disable:function(){$.hide(),$.state.isEnabled=!1},unmount:function(){$.state.isVisible&&$.hide();if(!$.state.isMounted)return;Te(),Ae().forEach((function(e){e._tippy.unmount()})),z.parentNode&&z.parentNode.removeChild(z);U=U.filter((function(e){return e!==$})),$.state.isMounted=!1,ae("onHidden",[$])},destroy:function(){if($.state.isDestroyed)return;$.clearDelayTimeouts(),$.unmount(),be(),delete o._tippy,$.state.isDestroyed=!0,ae("onDestroy",[$])}};if(!M.render)return $;var q=M.render($),z=q.popper,J=q.onUpdate;z.setAttribute("data-tippy-root",""),z.id="tippy-"+$.id,$.popper=z,o._tippy=$,z._tippy=$;var G=Y.map((function(e){return e.fn($)})),K=o.hasAttribute("aria-expanded");return he(),ue(),ie(),ae("onCreate",[$]),M.showOnCreate&&Le(),z.addEventListener("mouseenter",(function(){$.props.interactive&&$.state.isVisible&&$.clearDelayTimeouts()})),z.addEventListener("mouseleave",(function(){$.props.interactive&&$.props.trigger.indexOf("mouseenter")>=0&&ne().addEventListener("mousemove",W)})),$;function Q(){var e=$.props.touch;return Array.isArray(e)?e:[e,0]}function Z(){return"hold"===Q()[0]}function ee(){var e;return!(null==(e=$.props.render)||!e.$$tippy)}function te(){return L||o}function ne(){var e=te().parentNode;return e?w(e):document}function re(){return S(z)}function oe(e){return $.state.isMounted&&!$.state.isVisible||x.isTouch||C&&"focus"===C.type?0:r($.props.delay,e?0:1,R.delay)}function ie(e){void 0===e&&(e=!1),z.style.pointerEvents=$.props.interactive&&!e?"":"none",z.style.zIndex=""+$.props.zIndex}function ae(e,t,n){var r;(void 0===n&&(n=!0),G.forEach((function(n){n[e]&&n[e].apply(n,t)})),n)&&(r=$.props)[e].apply(r,t)}function se(){var e=$.props.aria;if(e.content){var t="aria-"+e.content,n=z.id;u($.props.triggerTarget||o).forEach((function(e){var r=e.getAttribute(t);if($.state.isVisible)e.setAttribute(t,r?r+" "+n:n);else{var o=r&&r.replace(n,"").trim();o?e.setAttribute(t,o):e.removeAttribute(t)}}))}}function ue(){!K&&$.props.aria.expanded&&u($.props.triggerTarget||o).forEach((function(e){$.props.interactive?e.setAttribute("aria-expanded",$.state.isVisible&&e===te()?"true":"false"):e.removeAttribute("aria-expanded")}))}function ce(){ne().removeEventListener("mousemove",W),H=H.filter((function(e){return e!==W}))}function pe(e){if(!x.isTouch||!N&&"mousedown"!==e.type){var t=e.composedPath&&e.composedPath()[0]||e.target;if(!$.props.interactive||!O(z,t)){if(u($.props.triggerTarget||o).some((function(e){return O(e,t)}))){if(x.isTouch)return;if($.state.isVisible&&$.props.trigger.indexOf("click")>=0)return}else ae("onClickOutside",[$,e]);!0===$.props.hideOnClick&&($.clearDelayTimeouts(),$.hide(),I=!0,setTimeout((function(){I=!1})),$.state.isMounted||ve())}}}function fe(){N=!0}function le(){N=!1}function de(){var e=ne();e.addEventListener("mousedown",pe,!0),e.addEventListener("touchend",pe,t),e.addEventListener("touchstart",le,t),e.addEventListener("touchmove",fe,t)}function ve(){var e=ne();e.removeEventListener("mousedown",pe,!0),e.removeEventListener("touchend",pe,t),e.removeEventListener("touchstart",le,t),e.removeEventListener("touchmove",fe,t)}function me(e,t){var n=re().box;function r(e){e.target===n&&(E(n,"remove",r),t())}if(0===e)return t();E(n,"remove",T),E(n,"add",r),T=r}function ge(e,t,n){void 0===n&&(n=!1),u($.props.triggerTarget||o).forEach((function(r){r.addEventListener(e,t,n),F.push({node:r,eventType:e,handler:t,options:n})}))}function he(){var e;Z()&&(ge("touchstart",ye,{passive:!0}),ge("touchend",Ee,{passive:!0})),(e=$.props.trigger,e.split(/\s+/).filter(Boolean)).forEach((function(e){if("manual"!==e)switch(ge(e,ye),e){case"mouseenter":ge("mouseleave",Ee);break;case"focus":ge(D?"focusout":"blur",Oe);break;case"focusin":ge("focusout",Oe)}}))}function be(){F.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),F=[]}function ye(e){var t,n=!1;if($.state.isEnabled&&!xe(e)&&!I){var r="focus"===(null==(t=C)?void 0:t.type);C=e,L=e.currentTarget,ue(),!$.state.isVisible&&m(e)&&H.forEach((function(t){return t(e)})),"click"===e.type&&($.props.trigger.indexOf("mouseenter")<0||V)&&!1!==$.props.hideOnClick&&$.state.isVisible?n=!0:Le(e),"click"===e.type&&(V=!n),n&&!r&&De(e)}}function we(e){var t=e.target,n=te().contains(t)||z.contains(t);"mousemove"===e.type&&n||function(e,t){var n=t.clientX,r=t.clientY;return e.every((function(e){var t=e.popperRect,o=e.popperState,i=e.props.interactiveBorder,a=p(o.placement),s=o.modifiersData.offset;if(!s)return!0;var u="bottom"===a?s.top.y:0,c="top"===a?s.bottom.y:0,f="right"===a?s.left.x:0,l="left"===a?s.right.x:0,d=t.top-r+u>i,v=r-t.bottom-c>i,m=t.left-n+f>i,g=n-t.right-l>i;return d||v||m||g}))}(Ae().concat(z).map((function(e){var t,n=null==(t=e._tippy.popperInstance)?void 0:t.state;return n?{popperRect:e.getBoundingClientRect(),popperState:n,props:M}:null})).filter(Boolean),e)&&(ce(),De(e))}function Ee(e){xe(e)||$.props.trigger.indexOf("click")>=0&&V||($.props.interactive?$.hideWithInteractivity(e):De(e))}function Oe(e){$.props.trigger.indexOf("focusin")<0&&e.target!==te()||$.props.interactive&&e.relatedTarget&&z.contains(e.relatedTarget)||De(e)}function xe(e){return!!x.isTouch&&Z()!==e.type.indexOf("touch")>=0}function Ce(){Te();var t=$.props,n=t.popperOptions,r=t.placement,i=t.offset,a=t.getReferenceClientRect,s=t.moveTransition,u=ee()?S(z).arrow:null,c=a?{getBoundingClientRect:a,contextElement:a.contextElement||te()}:o,p=[{name:"offset",options:{offset:i}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(e){var t=e.state;if(ee()){var n=re().box;["placement","reference-hidden","escaped"].forEach((function(e){"placement"===e?n.setAttribute("data-placement",t.placement):t.attributes.popper["data-popper-"+e]?n.setAttribute("data-"+e,""):n.removeAttribute("data-"+e)})),t.attributes.popper={}}}}];ee()&&u&&p.push({name:"arrow",options:{element:u,padding:3}}),p.push.apply(p,(null==n?void 0:n.modifiers)||[]),$.popperInstance=e.createPopper(c,z,Object.assign({},n,{placement:r,onFirstUpdate:A,modifiers:p}))}function Te(){$.popperInstance&&($.popperInstance.destroy(),$.popperInstance=null)}function Ae(){return f(z.querySelectorAll("[data-tippy-root]"))}function Le(e){$.clearDelayTimeouts(),e&&ae("onTrigger",[$,e]),de();var t=oe(!0),n=Q(),r=n[0],o=n[1];x.isTouch&&"hold"===r&&o&&(t=o),t?v=setTimeout((function(){$.show()}),t):$.show()}function De(e){if($.clearDelayTimeouts(),ae("onUntrigger",[$,e]),$.state.isVisible){if(!($.props.trigger.indexOf("mouseenter")>=0&&$.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(e.type)>=0&&V)){var t=oe(!1);t?g=setTimeout((function(){$.state.isVisible&&$.hide()}),t):h=requestAnimationFrame((function(){$.hide()}))}}else ve()}}function F(e,n){void 0===n&&(n={});var r=R.plugins.concat(n.plugins||[]);document.addEventListener("touchstart",T,t),window.addEventListener("blur",L);var o=Object.assign({},n,{plugins:r}),i=h(e).reduce((function(e,t){var n=t&&_(t,o);return n&&e.push(n),e}),[]);return v(e)?i[0]:i}F.defaultProps=R,F.setDefaultProps=function(e){Object.keys(e).forEach((function(t){R[t]=e[t]}))},F.currentInput=x;var W=Object.assign({},e.applyStyles,{effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow)}}),X={mouseover:"mouseenter",focusin:"focus",click:"click"};var Y={name:"animateFill",defaultValue:!1,fn:function(e){var t;if(null==(t=e.props.render)||!t.$$tippy)return{};var n=S(e.popper),r=n.box,o=n.content,i=e.props.animateFill?function(){var e=d();return e.className="tippy-backdrop",y([e],"hidden"),e}():null;return{onCreate:function(){i&&(r.insertBefore(i,r.firstElementChild),r.setAttribute("data-animatefill",""),r.style.overflow="hidden",e.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(i){var e=r.style.transitionDuration,t=Number(e.replace("ms",""));o.style.transitionDelay=Math.round(t/10)+"ms",i.style.transitionDuration=e,y([i],"visible")}},onShow:function(){i&&(i.style.transitionDuration="0ms")},onHide:function(){i&&y([i],"hidden")}}}};var $={clientX:0,clientY:0},q=[];function z(e){var t=e.clientX,n=e.clientY;$={clientX:t,clientY:n}}var J={name:"followCursor",defaultValue:!1,fn:function(e){var t=e.reference,n=w(e.props.triggerTarget||t),r=!1,o=!1,i=!0,a=e.props;function s(){return"initial"===e.props.followCursor&&e.state.isVisible}function u(){n.addEventListener("mousemove",f)}function c(){n.removeEventListener("mousemove",f)}function p(){r=!0,e.setProps({getReferenceClientRect:null}),r=!1}function f(n){var r=!n.target||t.contains(n.target),o=e.props.followCursor,i=n.clientX,a=n.clientY,s=t.getBoundingClientRect(),u=i-s.left,c=a-s.top;!r&&e.props.interactive||e.setProps({getReferenceClientRect:function(){var e=t.getBoundingClientRect(),n=i,r=a;"initial"===o&&(n=e.left+u,r=e.top+c);var s="horizontal"===o?e.top:r,p="vertical"===o?e.right:n,f="horizontal"===o?e.bottom:r,l="vertical"===o?e.left:n;return{width:p-l,height:f-s,top:s,right:p,bottom:f,left:l}}})}function l(){e.props.followCursor&&(q.push({instance:e,doc:n}),function(e){e.addEventListener("mousemove",z)}(n))}function d(){0===(q=q.filter((function(t){return t.instance!==e}))).filter((function(e){return e.doc===n})).length&&function(e){e.removeEventListener("mousemove",z)}(n)}return{onCreate:l,onDestroy:d,onBeforeUpdate:function(){a=e.props},onAfterUpdate:function(t,n){var i=n.followCursor;r||void 0!==i&&a.followCursor!==i&&(d(),i?(l(),!e.state.isMounted||o||s()||u()):(c(),p()))},onMount:function(){e.props.followCursor&&!o&&(i&&(f($),i=!1),s()||u())},onTrigger:function(e,t){m(t)&&($={clientX:t.clientX,clientY:t.clientY}),o="focus"===t.type},onHidden:function(){e.props.followCursor&&(p(),c(),i=!0)}}}};var G={name:"inlinePositioning",defaultValue:!1,fn:function(e){var t,n=e.reference;var r=-1,o=!1,i=[],a={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(o){var a=o.state;e.props.inlinePositioning&&(-1!==i.indexOf(a.placement)&&(i=[]),t!==a.placement&&-1===i.indexOf(a.placement)&&(i.push(a.placement),e.setProps({getReferenceClientRect:function(){return function(e){return function(e,t,n,r){if(n.length<2||null===e)return t;if(2===n.length&&r>=0&&n[0].left>n[1].right)return n[r]||t;switch(e){case"top":case"bottom":var o=n[0],i=n[n.length-1],a="top"===e,s=o.top,u=i.bottom,c=a?o.left:i.left,p=a?o.right:i.right;return{top:s,bottom:u,left:c,right:p,width:p-c,height:u-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(e){return e.left}))),l=Math.max.apply(Math,n.map((function(e){return e.right}))),d=n.filter((function(t){return"left"===e?t.left===f:t.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return t}}(p(e),n.getBoundingClientRect(),f(n.getClientRects()),r)}(a.placement)}})),t=a.placement)}};function s(){var t;o||(t=function(e,t){var n;return{popperOptions:Object.assign({},e.popperOptions,{modifiers:[].concat(((null==(n=e.popperOptions)?void 0:n.modifiers)||[]).filter((function(e){return e.name!==t.name})),[t])})}}(e.props,a),o=!0,e.setProps(t),o=!1)}return{onCreate:s,onAfterUpdate:s,onTrigger:function(t,n){if(m(n)){var o=f(e.reference.getClientRects()),i=o.find((function(e){return e.left-2<=n.clientX&&e.right+2>=n.clientX&&e.top-2<=n.clientY&&e.bottom+2>=n.clientY})),a=o.indexOf(i);r=a>-1?a:r}},onHidden:function(){r=-1}}}};var K={name:"sticky",defaultValue:!1,fn:function(e){var t=e.reference,n=e.popper;function r(t){return!0===e.props.sticky||e.props.sticky===t}var o=null,i=null;function a(){var s=r("reference")?(e.popperInstance?e.popperInstance.state.elements.reference:t).getBoundingClientRect():null,u=r("popper")?n.getBoundingClientRect():null;(s&&Q(o,s)||u&&Q(i,u))&&e.popperInstance&&e.popperInstance.update(),o=s,i=u,e.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){e.props.sticky&&a()}}}};function Q(e,t){return!e||!t||(e.top!==t.top||e.right!==t.right||e.bottom!==t.bottom||e.left!==t.left)}return F.setDefaultProps({plugins:[Y,J,G,K],render:N}),F.createSingleton=function(e,t){var n;void 0===t&&(t={});var r,o=e,i=[],a=[],c=t.overrides,p=[],f=!1;function l(){a=o.map((function(e){return u(e.props.triggerTarget||e.reference)})).reduce((function(e,t){return e.concat(t)}),[])}function v(){i=o.map((function(e){return e.reference}))}function m(e){o.forEach((function(t){e?t.enable():t.disable()}))}function g(e){return o.map((function(t){var n=t.setProps;return t.setProps=function(o){n(o),t.reference===r&&e.setProps(o)},function(){t.setProps=n}}))}function h(e,t){var n=a.indexOf(t);if(t!==r){r=t;var s=(c||[]).concat("content").reduce((function(e,t){return e[t]=o[n].props[t],e}),{});e.setProps(Object.assign({},s,{getReferenceClientRect:"function"==typeof s.getReferenceClientRect?s.getReferenceClientRect:function(){var e;return null==(e=i[n])?void 0:e.getBoundingClientRect()}}))}}m(!1),v(),l();var b={fn:function(){return{onDestroy:function(){m(!0)},onHidden:function(){r=null},onClickOutside:function(e){e.props.showOnCreate&&!f&&(f=!0,r=null)},onShow:function(e){e.props.showOnCreate&&!f&&(f=!0,h(e,i[0]))},onTrigger:function(e,t){h(e,t.currentTarget)}}}},y=F(d(),Object.assign({},s(t,["overrides"]),{plugins:[b].concat(t.plugins||[]),triggerTarget:a,popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat((null==(n=t.popperOptions)?void 0:n.modifiers)||[],[W])})})),w=y.show;y.show=function(e){if(w(),!r&&null==e)return h(y,i[0]);if(!r||null!=e){if("number"==typeof e)return i[e]&&h(y,i[e]);if(o.indexOf(e)>=0){var t=e.reference;return h(y,t)}return i.indexOf(e)>=0?h(y,e):void 0}},y.showNext=function(){var e=i[0];if(!r)return y.show(0);var t=i.indexOf(r);y.show(i[t+1]||e)},y.showPrevious=function(){var e=i[i.length-1];if(!r)return y.show(e);var t=i.indexOf(r),n=i[t-1]||e;y.show(n)};var E=y.setProps;return y.setProps=function(e){c=e.overrides||c,E(e)},y.setInstances=function(e){m(!0),p.forEach((function(e){return e()})),o=e,m(!1),v(),l(),p=g(y),y.setProps({triggerTarget:a})},p=g(y),y},F.delegate=function(e,n){var r=[],o=[],i=!1,a=n.target,c=s(n,["target"]),p=Object.assign({},c,{trigger:"manual",touch:!1}),f=Object.assign({touch:R.touch},c,{showOnCreate:!0}),l=F(e,p);function d(e){if(e.target&&!i){var t=e.target.closest(a);if(t){var r=t.getAttribute("data-tippy-trigger")||n.trigger||R.trigger;if(!t._tippy&&!("touchstart"===e.type&&"boolean"==typeof f.touch||"touchstart"!==e.type&&r.indexOf(X[e.type])<0)){var s=F(t,f);s&&(o=o.concat(s))}}}}function v(e,t,n,o){void 0===o&&(o=!1),e.addEventListener(t,n,o),r.push({node:e,eventType:t,handler:n,options:o})}return u(l).forEach((function(e){var n=e.destroy,a=e.enable,s=e.disable;e.destroy=function(e){void 0===e&&(e=!0),e&&o.forEach((function(e){e.destroy()})),o=[],r.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),r=[],n()},e.enable=function(){a(),o.forEach((function(e){return e.enable()})),i=!1},e.disable=function(){s(),o.forEach((function(e){return e.disable()})),i=!0},function(e){var n=e.reference;v(n,"touchstart",d,t),v(n,"mouseover",d),v(n,"focusin",d),v(n,"click",d)}(e)})),l},F.hideAll=function(e){var t=void 0===e?{}:e,n=t.exclude,r=t.duration;U.forEach((function(e){var t=!1;if(n&&(t=g(n)?e.reference===n:e.popper===n.popper),!t){var o=e.props.duration;e.setProps({duration:r}),e.hide(),e.state.isDestroyed||e.setProps({duration:o})}}))},F.roundArrow='',F})); - diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 18a20c216..d9f935970 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -7,6 +7,7 @@ import mdformat from docstring_parser import parse, Style from glob import glob +import subprocess def resolve_alias(member: Dict[str, Any], data: Dict[str, Any]) -> Dict[str, Any]: """Resolve an alias to its target member.""" @@ -80,23 +81,23 @@ def is_public(member: Dict[str, Any], module: Dict[str, Any], full_data: Dict[st # Skip private members except __init__ and __post_init__ if name.startswith('_') and name not in {'__init__', '__post_init__'}: - print(f"- Skipping private member: {name}") + # print(f"- Skipping private member: {name}") return False # At root level, only show items from __all__ if is_root: root_all = get_all_members(full_data['validmind'].get('members', {})) - print(f"- Root __all__: {root_all}") + # print(f"- Root __all__: {root_all}") return name in root_all # If module has __all__, only include members listed there if module and '__all__' in module.get('members', {}): module_all = get_all_members(module.get('members', {})) - print(f"- Module __all__: {module_all}") - print(f"- Is {name} in module __all__? {name in module_all}") + # print(f"- Module __all__: {module_all}") + # print(f"- Is {name} in module __all__? {name in module_all}") return name in module_all - print(f"- No __all__ found, including {name}") + # print(f"- No __all__ found, including {name}") return True def ensure_dir(path): @@ -157,19 +158,22 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: return result +# Add at module level +written_qmd_files = {} + def process_module(module: Dict[str, Any], path: List[str], env: Environment, full_data: Dict[str, Any]): """Process a module and its submodules.""" - if module.get('name') == 'tests': - print("\nProcessing tests module members:") - for name, member in module.get('members', {}).items(): - if is_public(member, module, full_data): - print(f"\n{name}:") - print(f" Original: kind={member.get('kind')}") - if member.get('kind') == 'alias': - resolved = resolve_alias(member, full_data) - print(f" Resolved: kind={resolved.get('kind')}") - print(f" Target path: {member.get('target_path')}") - print(f" In __all__: {name in get_all_members(module.get('members', {}))}") + # if module.get('name') == 'tests': + # print("\nProcessing tests module members:") + # for name, member in module.get('members', {}).items(): + # if is_public(member, module, full_data): + # print(f"\n{name}:") + # print(f" Original: kind={member.get('kind')}") + # if member.get('kind') == 'alias': + # resolved = resolve_alias(member, full_data) + # print(f" Resolved: kind={resolved.get('kind')}") + # print(f" Target path: {member.get('target_path')}") + # print(f" In __all__: {name in get_all_members(module.get('members', {}))}") # Parse docstrings first parse_docstrings_recursively(module) @@ -194,6 +198,11 @@ def process_module(module: Dict[str, Any], path: List[str], env: Environment, fu with open(output_path, 'w') as f: f.write(output) + # Track with full path and print full path + full_path = os.path.join("docs", os.path.relpath(output_path, "docs")) + print(f"Wrote file: {full_path}") + written_qmd_files[filename] = full_path + # Process submodules members = module.get('members', {}) for name, member in members.items(): @@ -414,45 +423,11 @@ def generate_module_doc(module, full_data, env, output_dir): def find_qmd_files(base_path: str) -> Dict[str, List[str]]: """Find all .qmd files and their associated folders in docs/validmind.""" print("\nEntering find_qmd_files()") + print(f"\nFiles written during documentation generation (count: {len(written_qmd_files)}):") + for filename, path in written_qmd_files.items(): + print(f" {filename}: {path}") - base_path = os.path.abspath(base_path) - validmind_path = os.path.join(base_path, 'validmind') - print(f"Looking in: {validmind_path}") - print(f"Path exists: {os.path.exists(validmind_path)}") - print(f"Is directory: {os.path.isdir(validmind_path)}") - print(f"Directory contents: {os.listdir(validmind_path)}") - - qmd_files = {} - - # Debug: Print full directory tree - print("\nWalking directory tree:") - for root, dirs, files in os.walk(validmind_path, followlinks=True): - print(f"\nDirectory: {root}") - print(f" Is directory: {os.path.isdir(root)}") - print(f" Directory exists: {os.path.exists(root)}") - print(f" Direct contents: {os.listdir(root)}") - print(f" Subdirs from walk: {dirs}") - print(f" Files from walk: {files}") - print(f" QMD files: {[f for f in files if f.endswith('.qmd')]}") - - rel_path = os.path.relpath(root, base_path) - print(f" Relative path: {rel_path}") - - # Get module name from the filename instead of path - for file in files: - if file.endswith('.qmd'): - # Extract module name from the filename (remove .qmd extension) - module = file[:-4] - if module not in qmd_files: - qmd_files[module] = [] - - full_path = os.path.join(root, file) - ref_path = f"reference/{os.path.relpath(full_path, base_path)}".replace('\\', '/') - qmd_files[module].append(ref_path) - print(f"Found: {ref_path}") - - print(f"\nCollected qmd_files: {json.dumps(qmd_files, indent=2)}") - return qmd_files + return written_qmd_files def generate_docs(json_path: str, template_dir: str, output_dir: str): """Generate documentation from JSON data using templates.""" @@ -477,18 +452,18 @@ def generate_docs(json_path: str, template_dir: str, output_dir: str): env.globals['get_all_members'] = get_all_members env.globals['get_inherited_members'] = get_inherited_members - print("\nAbout to call find_qmd_files()") - qmd_files = find_qmd_files(output_dir) - print(f"Found QMD files: {qmd_files}") - - # Add to template context - env.globals['qmd_files'] = qmd_files - # Start processing from root module if 'validmind' in data: # First pass: Generate module documentation process_module(data['validmind'], ['validmind'], env, data) + print("\nAbout to call find_qmd_files()") + qmd_files = find_qmd_files(output_dir) + print(f"Found QMD files: {qmd_files}") + + # Add to template context + env.globals['qmd_files'] = qmd_files + # Second pass: Collect all documented items documented_items = collect_documented_items( module=data['validmind'], From 19c25f46c7773ab80fc2d07f8a651c5a7a9ba506 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 29 Jan 2025 08:25:51 -0800 Subject: [PATCH 028/207] Got sidebar working --- docs/_sidebar.yml | 107 +++++++++--------- docs/templates/module.qmd.jinja2 | 1 + docs/templates/sidebar.qmd.jinja2 | 55 ++++----- docs/validmind.qmd | 1 + docs/validmind/datasets.qmd | 1 + docs/validmind/datasets/classification.qmd | 1 + .../classification/customer_churn.qmd | 1 + .../datasets/classification/taiwan_credit.qmd | 1 + docs/validmind/datasets/credit_risk.qmd | 1 + .../datasets/credit_risk/lending_club.qmd | 1 + .../credit_risk/lending_club_bias.qmd | 1 + docs/validmind/datasets/nlp.qmd | 1 + docs/validmind/datasets/nlp/cnn_dailymail.qmd | 1 + .../datasets/nlp/twitter_covid_19.qmd | 1 + docs/validmind/datasets/regression.qmd | 1 + docs/validmind/datasets/regression/fred.qmd | 1 + .../datasets/regression/lending_club.qmd | 1 + docs/validmind/errors.qmd | 1 + docs/validmind/test_suites.qmd | 1 + docs/validmind/test_suites/classifier.qmd | 1 + docs/validmind/test_suites/cluster.qmd | 1 + docs/validmind/test_suites/embeddings.qmd | 1 + docs/validmind/test_suites/llm.qmd | 1 + docs/validmind/test_suites/nlp.qmd | 1 + .../test_suites/parameters_optimization.qmd | 1 + docs/validmind/test_suites/regression.qmd | 1 + .../test_suites/statsmodels_timeseries.qmd | 1 + docs/validmind/test_suites/summarization.qmd | 1 + .../test_suites/tabular_datasets.qmd | 1 + docs/validmind/test_suites/text_data.qmd | 1 + docs/validmind/test_suites/time_series.qmd | 1 + docs/validmind/tests.qmd | 1 + docs/validmind/tests/data_validation.qmd | 1 + .../tests/data_validation/ACFandPACFPlot.qmd | 1 + docs/validmind/tests/data_validation/ADF.qmd | 1 + .../tests/data_validation/AutoAR.qmd | 1 + .../tests/data_validation/AutoMA.qmd | 1 + .../data_validation/AutoStationarity.qmd | 1 + .../data_validation/BivariateScatterPlots.qmd | 1 + .../tests/data_validation/BoxPierce.qmd | 1 + .../ChiSquaredFeaturesTable.qmd | 1 + .../tests/data_validation/ClassImbalance.qmd | 1 + .../data_validation/DatasetDescription.qmd | 1 + .../tests/data_validation/DatasetSplit.qmd | 1 + .../data_validation/DescriptiveStatistics.qmd | 1 + .../tests/data_validation/DickeyFullerGLS.qmd | 1 + .../tests/data_validation/Duplicates.qmd | 1 + .../data_validation/EngleGrangerCoint.qmd | 1 + .../FeatureTargetCorrelationPlot.qmd | 1 + .../tests/data_validation/HighCardinality.qmd | 1 + .../HighPearsonCorrelation.qmd | 1 + .../data_validation/IQROutliersBarPlot.qmd | 1 + .../data_validation/IQROutliersTable.qmd | 1 + .../IsolationForestOutliers.qmd | 1 + .../tests/data_validation/JarqueBera.qmd | 1 + docs/validmind/tests/data_validation/KPSS.qmd | 1 + .../tests/data_validation/LJungBox.qmd | 1 + .../LaggedCorrelationHeatmap.qmd | 1 + .../tests/data_validation/MissingValues.qmd | 1 + .../data_validation/MissingValuesBarPlot.qmd | 1 + .../data_validation/MutualInformation.qmd | 1 + .../PearsonCorrelationMatrix.qmd | 1 + .../data_validation/PhillipsPerronArch.qmd | 1 + .../ProtectedClassesCombination.qmd | 1 + .../ProtectedClassesDescription.qmd | 1 + .../ProtectedClassesDisparity.qmd | 1 + .../ProtectedClassesThresholdOptimizer.qmd | 1 + .../data_validation/RollingStatsPlot.qmd | 1 + .../tests/data_validation/RunsTest.qmd | 1 + .../tests/data_validation/ScatterPlot.qmd | 1 + .../data_validation/ScoreBandDefaultRates.qmd | 1 + .../data_validation/SeasonalDecompose.qmd | 1 + .../tests/data_validation/ShapiroWilk.qmd | 1 + .../tests/data_validation/Skewness.qmd | 1 + .../tests/data_validation/SpreadPlot.qmd | 1 + .../TabularCategoricalBarPlots.qmd | 1 + .../TabularDateTimeHistograms.qmd | 1 + .../TabularDescriptionTables.qmd | 1 + .../TabularNumericalHistograms.qmd | 1 + .../data_validation/TargetRateBarPlots.qmd | 1 + .../data_validation/TimeSeriesDescription.qmd | 1 + .../TimeSeriesDescriptiveStatistics.qmd | 1 + .../data_validation/TimeSeriesFrequency.qmd | 1 + .../data_validation/TimeSeriesHistogram.qmd | 1 + .../data_validation/TimeSeriesLinePlot.qmd | 1 + .../TimeSeriesMissingValues.qmd | 1 + .../data_validation/TimeSeriesOutliers.qmd | 1 + .../data_validation/TooManyZeroValues.qmd | 1 + .../tests/data_validation/UniqueRows.qmd | 1 + .../tests/data_validation/WOEBinPlots.qmd | 1 + .../tests/data_validation/WOEBinTable.qmd | 1 + .../data_validation/ZivotAndrewsArch.qmd | 1 + docs/validmind/tests/data_validation/nlp.qmd | 1 + .../tests/data_validation/nlp/CommonWords.qmd | 1 + .../tests/data_validation/nlp/Hashtags.qmd | 1 + .../data_validation/nlp/LanguageDetection.qmd | 1 + .../tests/data_validation/nlp/Mentions.qmd | 1 + .../nlp/PolarityAndSubjectivity.qmd | 1 + .../data_validation/nlp/Punctuations.qmd | 1 + .../tests/data_validation/nlp/Sentiment.qmd | 1 + .../tests/data_validation/nlp/StopWords.qmd | 1 + .../data_validation/nlp/TextDescription.qmd | 1 + .../tests/data_validation/nlp/Toxicity.qmd | 1 + docs/validmind/tests/model_validation.qmd | 1 + .../tests/model_validation/BertScore.qmd | 1 + .../tests/model_validation/BleuScore.qmd | 1 + .../ClusterSizeDistribution.qmd | 1 + .../model_validation/ContextualRecall.qmd | 1 + .../tests/model_validation/FeaturesAUC.qmd | 1 + .../tests/model_validation/MeteorScore.qmd | 1 + .../tests/model_validation/ModelMetadata.qmd | 1 + .../ModelPredictionResiduals.qmd | 1 + .../tests/model_validation/RegardScore.qmd | 1 + .../RegressionResidualsPlot.qmd | 1 + .../tests/model_validation/RougeScore.qmd | 1 + .../TimeSeriesPredictionWithCI.qmd | 1 + .../TimeSeriesPredictionsPlot.qmd | 1 + .../TimeSeriesR2SquareBySegments.qmd | 1 + .../tests/model_validation/TokenDisparity.qmd | 1 + .../tests/model_validation/ToxicityScore.qmd | 1 + .../tests/model_validation/sklearn.qmd | 1 + .../sklearn/AdjustedMutualInformation.qmd | 1 + .../sklearn/AdjustedRandIndex.qmd | 1 + .../sklearn/CalibrationCurve.qmd | 1 + .../sklearn/ClassifierPerformance.qmd | 1 + .../ClassifierThresholdOptimization.qmd | 1 + .../sklearn/ClusterCosineSimilarity.qmd | 1 + .../sklearn/ClusterPerformanceMetrics.qmd | 1 + .../sklearn/CompletenessScore.qmd | 1 + .../sklearn/ConfusionMatrix.qmd | 1 + .../sklearn/FeatureImportance.qmd | 1 + .../sklearn/FowlkesMallowsScore.qmd | 1 + .../sklearn/HomogeneityScore.qmd | 1 + .../sklearn/HyperParametersTuning.qmd | 1 + .../sklearn/KMeansClustersOptimization.qmd | 1 + .../sklearn/MinimumAccuracy.qmd | 1 + .../sklearn/MinimumF1Score.qmd | 1 + .../sklearn/MinimumROCAUCScore.qmd | 1 + .../sklearn/ModelParameters.qmd | 1 + .../sklearn/ModelsPerformanceComparison.qmd | 1 + .../sklearn/OverfitDiagnosis.qmd | 1 + .../sklearn/PermutationFeatureImportance.qmd | 1 + .../sklearn/PopulationStabilityIndex.qmd | 1 + .../sklearn/PrecisionRecallCurve.qmd | 1 + .../model_validation/sklearn/ROCCurve.qmd | 1 + .../sklearn/RegressionErrors.qmd | 1 + .../sklearn/RegressionErrorsComparison.qmd | 1 + .../sklearn/RegressionPerformance.qmd | 1 + .../sklearn/RegressionR2Square.qmd | 1 + .../sklearn/RegressionR2SquareComparison.qmd | 1 + .../sklearn/RobustnessDiagnosis.qmd | 1 + .../sklearn/SHAPGlobalImportance.qmd | 1 + .../sklearn/ScoreProbabilityAlignment.qmd | 1 + .../sklearn/SilhouettePlot.qmd | 1 + .../sklearn/TrainingTestDegradation.qmd | 1 + .../model_validation/sklearn/VMeasure.qmd | 1 + .../sklearn/WeakspotsDiagnosis.qmd | 1 + .../tests/model_validation/statsmodels.qmd | 1 + .../statsmodels/AutoARIMA.qmd | 1 + .../CumulativePredictionProbabilities.qmd | 1 + .../statsmodels/DurbinWatsonTest.qmd | 1 + .../statsmodels/GINITable.qmd | 1 + .../statsmodels/KolmogorovSmirnov.qmd | 1 + .../statsmodels/Lilliefors.qmd | 1 + .../PredictionProbabilitiesHistogram.qmd | 1 + .../statsmodels/RegressionCoeffs.qmd | 1 + .../RegressionFeatureSignificance.qmd | 1 + .../RegressionModelForecastPlot.qmd | 1 + .../RegressionModelForecastPlotLevels.qmd | 1 + .../RegressionModelSensitivityPlot.qmd | 1 + .../statsmodels/RegressionModelSummary.qmd | 1 + ...RegressionPermutationFeatureImportance.qmd | 1 + .../statsmodels/ScorecardHistogram.qmd | 1 + .../statsmodels/statsutils.qmd | 1 + docs/validmind/tests/prompt_validation.qmd | 1 + .../tests/prompt_validation/Bias.qmd | 1 + .../tests/prompt_validation/Clarity.qmd | 1 + .../tests/prompt_validation/Conciseness.qmd | 1 + .../tests/prompt_validation/Delimitation.qmd | 1 + .../prompt_validation/NegativeInstruction.qmd | 1 + .../tests/prompt_validation/Robustness.qmd | 1 + .../tests/prompt_validation/Specificity.qmd | 1 + .../prompt_validation/ai_powered_test.qmd | 1 + docs/validmind/unit_metrics.qmd | 1 + docs/validmind/vm_models.qmd | 1 + scripts/generate_quarto_docs.py | 6 +- 186 files changed, 270 insertions(+), 81 deletions(-) diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml index f94c979f2..e0044a122 100644 --- a/docs/_sidebar.yml +++ b/docs/_sidebar.yml @@ -1,56 +1,59 @@ website: sidebar: - - text: "ValidMind Library" - file: reference/validmind.qmd + - id: validmind-reference + title: "ValidMind Library" contents: - # Root level functions from validmind.qmd - - text: "__version__" - file: reference/validmind.qmd#__version__ - - text: "get_test_suite()" - file: reference/validmind.html#get_test_suite - - text: "init()" - file: reference/validmind.html#init - - text: "init_dataset()" - file: reference/validmind.html#init_dataset - - text: "init_model()" - file: reference/validmind.html#init_model - - text: "init_r_model()" - file: reference/validmind.html#init_r_model - - text: "log_metric()" - file: reference/validmind.html#log_metric - - text: "preview_template()" - file: reference/validmind.html#preview_template - - text: "reload()" - file: reference/validmind.html#reload - - text: "run_documentation_tests()" - file: reference/validmind.html#run_documentation_tests - - text: "run_test_suite()" - file: reference/validmind.html#run_test_suite - - text: "tags()" - file: reference/validmind.html#tags - - text: "tasks()" - file: reference/validmind.html#tasks - - text: "test()" - file: reference/validmind.html#test - - # All module documentation pages - - text: "Submodules" - - text: "datasets" - file: reference/validmind/datasets.qmd - contents: - - reference/validmind/datasets/** - - text: "errors" - file: reference/validmind/errors.qmd - - text: "test_suites" - file: reference/validmind/test_suites.qmd - contents: - - reference/validmind/test_suites/** - - text: "tests" - file: reference/validmind/tests.qmd - contents: - - reference/validmind/tests/** - - text: "unit_metrics" - file: reference/validmind/unit_metrics.qmd - - text: "vm_models" - file: reference/validmind/vm_models.qmd + - reference/validmind.qmd + - text: "---" + - text: "Python API" + # Root level functions from validmind.qmd + - text: "__version__" + file: reference/validmind.qmd#__version__ + - text: "get_test_suite()" + file: reference/validmind.qmd#get_test_suite + - text: "init()" + file: reference/validmind.qmd#init + - text: "init_dataset()" + file: reference/validmind.qmd#init_dataset + - text: "init_model()" + file: reference/validmind.qmd#init_model + - text: "init_r_model()" + file: reference/validmind.qmd#init_r_model + - text: "log_metric()" + file: reference/validmind.qmd#log_metric + - text: "preview_template()" + file: reference/validmind.qmd#preview_template + - text: "reload()" + file: reference/validmind.qmd#reload + - text: "run_documentation_tests()" + file: reference/validmind.qmd#run_documentation_tests + - text: "run_test_suite()" + file: reference/validmind.qmd#run_test_suite + - text: "tags()" + file: reference/validmind.qmd#tags + - text: "tasks()" + file: reference/validmind.qmd#tasks + - text: "test()" + file: reference/validmind.qmd#test + # All module documentation pages + - text: "---" + - text: "Submodules" + - text: "datasets" + file: reference/validmind/datasets.qmd + contents: + - reference/validmind/datasets/** + - text: "errors" + file: reference/validmind/errors.qmd + - text: "test_suites" + file: reference/validmind/test_suites.qmd + contents: + - reference/validmind/test_suites/** + - text: "tests" + file: reference/validmind/tests.qmd + contents: + - reference/validmind/tests/** + - text: "unit_metrics" + file: reference/validmind/unit_metrics.qmd + - text: "vm_models" + file: reference/validmind/vm_models.qmd \ No newline at end of file diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index 041269c1d..6cb752447 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -9,6 +9,7 @@ toc-expand: 3 aliases: - index.html {% endif %} +sidebar: validmind-reference --- {% if module.docstring %} diff --git a/docs/templates/sidebar.qmd.jinja2 b/docs/templates/sidebar.qmd.jinja2 index 6617a2045..8d97a6e56 100644 --- a/docs/templates/sidebar.qmd.jinja2 +++ b/docs/templates/sidebar.qmd.jinja2 @@ -1,30 +1,33 @@ website: sidebar: - - text: "ValidMind Library" - file: reference/validmind.qmd + - id: validmind-reference + title: "ValidMind Library" contents: - # Root level functions from validmind.qmd - {% if module.members.__version__ %} - - text: "__version__" - file: reference/validmind.qmd#__version__ - {% endif %} - {% if documented_items.get('root') %} - {% for item in documented_items['root'] %} - - text: "{{ item.text }}" - file: {{ item.file }} - {% endfor %} - {% endif %} - - # All module documentation pages - - text: "Submodules" - {% for member in module.members | sort_members %} - {% if is_public(member, module, full_data, is_root) and member.kind == "module" %} - {% set module_name = member.name %} - - text: "{{ module_name }}" - file: reference/validmind/{{ module_name }}.qmd - {% if module_name in ['datasets', 'test_suites', 'tests'] %} - contents: - - reference/validmind/{{ module_name }}/** + - reference/validmind.qmd + - text: "---" + - text: "Python API" + # Root level functions from validmind.qmd + {% if module.members.__version__ %} + - text: "__version__" + file: reference/validmind.qmd#__version__ {% endif %} - {% endif %} - {% endfor %} \ No newline at end of file + {% if documented_items.get('root') %} + {% for item in documented_items['root'] %} + - text: "{{ item.text }}" + file: {{ item.file }} + {% endfor %} + {% endif %} + # All module documentation pages + - text: "---" + - text: "Submodules" + {% for member in module.members | sort_members %} + {% if is_public(member, module, full_data, is_root) and member.kind == "module" %} + {% set module_name = member.name %} + - text: "{{ module_name }}" + file: reference/validmind/{{ module_name }}.qmd + {% if module_name in ['datasets', 'test_suites', 'tests'] %} + contents: + - reference/validmind/{{ module_name }}/** + {% endif %} + {% endif %} + {% endfor %} \ No newline at end of file diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 1477cbe82..b5b5f0629 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -4,6 +4,7 @@ toc-depth: 3 toc-expand: 3 aliases: - index.html +sidebar: validmind-reference --- The ValidMind Library is a suite of developer tools and methods designed to automate the documentation and validation of your models. Designed to be model agnostic, the ValidMind Library provides all the standard functionality without requiring you to rewrite any functions as long as your model is built in Python. diff --git a/docs/validmind/datasets.qmd b/docs/validmind/datasets.qmd index cd5a57ab5..55441dd9b 100644 --- a/docs/validmind/datasets.qmd +++ b/docs/validmind/datasets.qmd @@ -2,6 +2,7 @@ title: datasets toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Example datasets that can be used with the ValidMind Library. diff --git a/docs/validmind/datasets/classification.qmd b/docs/validmind/datasets/classification.qmd index af7cb044a..6d64ede2e 100644 --- a/docs/validmind/datasets/classification.qmd +++ b/docs/validmind/datasets/classification.qmd @@ -2,6 +2,7 @@ title: classification toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Entrypoint for classification datasets. diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index c21df4612..90d1237c8 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -2,6 +2,7 @@ title: customer_churn toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## simple_preprocess_booleans[()]{.muted} diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index fa1b8ebc2..30597b15a 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -2,6 +2,7 @@ title: taiwan_credit toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## simple_preprocess_booleans[()]{.muted} diff --git a/docs/validmind/datasets/credit_risk.qmd b/docs/validmind/datasets/credit_risk.qmd index dd3e77d77..69af78452 100644 --- a/docs/validmind/datasets/credit_risk.qmd +++ b/docs/validmind/datasets/credit_risk.qmd @@ -2,6 +2,7 @@ title: credit_risk toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Entrypoint for credit risk datasets. diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index c5ff18d19..0db645ec3 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -2,6 +2,7 @@ title: lending_club toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## compute_scores[()]{.muted} diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index a846594f6..cc9f7b8e7 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -2,6 +2,7 @@ title: lending_club_bias toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## compute_scores[()]{.muted} diff --git a/docs/validmind/datasets/nlp.qmd b/docs/validmind/datasets/nlp.qmd index 0835a2569..bb8ac75c2 100644 --- a/docs/validmind/datasets/nlp.qmd +++ b/docs/validmind/datasets/nlp.qmd @@ -2,6 +2,7 @@ title: nlp toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Example datasets that can be used with the ValidMind Library. diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index 8f92e13a9..2e52f2cfd 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -2,6 +2,7 @@ title: cnn_dailymail toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## display_nice[()]{.muted} diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index c7f58ff40..bd1a3c9d6 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -2,6 +2,7 @@ title: twitter_covid_19 toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## load_data[()]{.muted} diff --git a/docs/validmind/datasets/regression.qmd b/docs/validmind/datasets/regression.qmd index 7755b0df2..7e1d75e5e 100644 --- a/docs/validmind/datasets/regression.qmd +++ b/docs/validmind/datasets/regression.qmd @@ -2,6 +2,7 @@ title: regression toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Entrypoint for regression datasets diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index 7912c42e4..b85b3736e 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -2,6 +2,7 @@ title: fred toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## load_all_data[()]{.muted} diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index e3150727e..e78bd11cc 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -2,6 +2,7 @@ title: lending_club toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## load_data[()]{.muted} diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index ce9877fcc..8020ace71 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -2,6 +2,7 @@ title: errors toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- This module contains all the custom errors that are used in the ValidMind Library. The following base errors are defined for others: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index e61792081..b0e4200ec 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -2,6 +2,7 @@ title: test_suites toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Entrypoint for test suites. diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index 797c4933e..3eed413d8 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -2,6 +2,7 @@ title: classifier toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Test suites for sklearn-compatible classifier models Ideal setup is to have the API client to read a custom test suite from the project's configuration diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index 5cbb3fa6d..4dd2d7bb8 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -2,6 +2,7 @@ title: cluster toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Test suites for sklearn-compatible clustering models Ideal setup is to have the API client to read a custom test suite from the project's configuration diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index 0c23f7de1..de017c761 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -2,6 +2,7 @@ title: embeddings toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Test suites for embeddings models Ideal setup is to have the API client to read a custom test suite from the project's configuration diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index 31e95f0a1..17e74f28b 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -2,6 +2,7 @@ title: llm toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Test suites for LLMs diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index 39d2acb65..e38ea6649 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -2,6 +2,7 @@ title: nlp toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Test suites for NLP models diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index 185d01e58..e22837021 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -2,6 +2,7 @@ title: parameters_optimization toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Test suites for sklearn-compatible hyper parameters tunning Ideal setup is to have the API client to read a custom test suite from the project's configuration diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index 1bc2b19ca..65cf14794 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -2,6 +2,7 @@ title: regression toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## [class]{.muted} RegressionFullSuite diff --git a/docs/validmind/test_suites/statsmodels_timeseries.qmd b/docs/validmind/test_suites/statsmodels_timeseries.qmd index c18e8878a..564182bcb 100644 --- a/docs/validmind/test_suites/statsmodels_timeseries.qmd +++ b/docs/validmind/test_suites/statsmodels_timeseries.qmd @@ -2,6 +2,7 @@ title: statsmodels_timeseries toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Time Series Test Suites from statsmodels diff --git a/docs/validmind/test_suites/summarization.qmd b/docs/validmind/test_suites/summarization.qmd index c60e59821..41e8b021f 100644 --- a/docs/validmind/test_suites/summarization.qmd +++ b/docs/validmind/test_suites/summarization.qmd @@ -2,6 +2,7 @@ title: summarization toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Test suites for llm summarization models diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd index ac42b160b..cf28087d6 100644 --- a/docs/validmind/test_suites/tabular_datasets.qmd +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -2,6 +2,7 @@ title: tabular_datasets toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Test suites for tabular datasets diff --git a/docs/validmind/test_suites/text_data.qmd b/docs/validmind/test_suites/text_data.qmd index 609d00266..a8f1c4935 100644 --- a/docs/validmind/test_suites/text_data.qmd +++ b/docs/validmind/test_suites/text_data.qmd @@ -2,6 +2,7 @@ title: text_data toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Test suites for text datasets diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index 39f721861..ff69edaf6 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -2,6 +2,7 @@ title: time_series toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Time Series Test Suites diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 7d2711f4e..1761becbf 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -2,6 +2,7 @@ title: tests toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ValidMind Tests Module diff --git a/docs/validmind/tests/data_validation.qmd b/docs/validmind/tests/data_validation.qmd index 21cd9413c..f699893b5 100644 --- a/docs/validmind/tests/data_validation.qmd +++ b/docs/validmind/tests/data_validation.qmd @@ -2,6 +2,7 @@ title: data_validation toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- - [ACFandPACFPlot](data_validation/ACFandPACFPlot.qmd) diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index bde3f6208..87069d94d 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -2,6 +2,7 @@ title: ACFandPACFPlot toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ACFandPACFPlot[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index bd6e6d5fa..afa30502b 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -2,6 +2,7 @@ title: ADF toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 841d3edce..08afd839e 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -2,6 +2,7 @@ title: AutoAR toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index 5702203f2..0b1cf96b9 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -2,6 +2,7 @@ title: AutoMA toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index d2264535d..05632c75f 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -2,6 +2,7 @@ title: AutoStationarity toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## AutoStationarity[()]{.muted} diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index e00ee8505..ff5e650fd 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -2,6 +2,7 @@ title: BivariateScatterPlots toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## BivariateScatterPlots[()]{.muted} diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index b79968ef3..fa028f00a 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -2,6 +2,7 @@ title: BoxPierce toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## BoxPierce[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 7eb8517f7..66b3170f9 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -2,6 +2,7 @@ title: ChiSquaredFeaturesTable toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ChiSquaredFeaturesTable[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 9db47fa77..c4359caf1 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -2,6 +2,7 @@ title: ClassImbalance toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Threshold based tests diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index dd4c1e4d5..990ad7957 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -2,6 +2,7 @@ title: DatasetDescription toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 963ce497f..cffbb5aa7 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -2,6 +2,7 @@ title: DatasetSplit toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## DatasetSplit[()]{.muted} diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 7ed4b42ad..f66f28d80 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -2,6 +2,7 @@ title: DescriptiveStatistics toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## format_records[()]{.muted} diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 4bebade2a..711410e4f 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -2,6 +2,7 @@ title: DickeyFullerGLS toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index f2801e09c..8bf0ee0c5 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -2,6 +2,7 @@ title: Duplicates toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## Duplicates[()]{.muted} diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index b083e5ea6..451e23745 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -2,6 +2,7 @@ title: EngleGrangerCoint toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## EngleGrangerCoint[()]{.muted} diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 6aec5e592..d10c9cec9 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -2,6 +2,7 @@ title: FeatureTargetCorrelationPlot toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## FeatureTargetCorrelationPlot[()]{.muted} diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 577a61bfc..45167d8a3 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -2,6 +2,7 @@ title: HighCardinality toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## HighCardinality[()]{.muted} diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index eeac7282c..619bf7d0d 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -2,6 +2,7 @@ title: HighPearsonCorrelation toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## HighPearsonCorrelation[()]{.muted} diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index c3854427f..e4d50f33b 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -2,6 +2,7 @@ title: IQROutliersBarPlot toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## compute_outliers[()]{.muted} diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index a6fa48f42..0e0d4382c 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -2,6 +2,7 @@ title: IQROutliersTable toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## compute_outliers[()]{.muted} diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index ed6403100..bcac35c26 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -2,6 +2,7 @@ title: IsolationForestOutliers toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## IsolationForestOutliers[()]{.muted} diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index badb0c52e..9e1d890ef 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -2,6 +2,7 @@ title: JarqueBera toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## JarqueBera[()]{.muted} diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index bc57a7853..7d581a546 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -2,6 +2,7 @@ title: KPSS toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 7c22880b7..94e376809 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -2,6 +2,7 @@ title: LJungBox toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## LJungBox[()]{.muted} diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index 436db31fa..411a0b365 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -2,6 +2,7 @@ title: LaggedCorrelationHeatmap toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## LaggedCorrelationHeatmap[()]{.muted} diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 1b60b9db1..b3cf11054 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -2,6 +2,7 @@ title: MissingValues toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## MissingValues[()]{.muted} diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 293d65a1b..9a3aec8d4 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -2,6 +2,7 @@ title: MissingValuesBarPlot toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## MissingValuesBarPlot[()]{.muted} diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 8658f882f..f467ddd2b 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -2,6 +2,7 @@ title: MutualInformation toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## MutualInformation[()]{.muted} diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index f0f8cdcb8..cfe8faa63 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -2,6 +2,7 @@ title: PearsonCorrelationMatrix toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## PearsonCorrelationMatrix[()]{.muted} diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index ad9c3352d..225da3537 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -2,6 +2,7 @@ title: PhillipsPerronArch toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 29d889c85..d86a6ee48 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -2,6 +2,7 @@ title: ProtectedClassesCombination toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index 6a0e1c9f1..31fd8519d 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -2,6 +2,7 @@ title: ProtectedClassesDescription toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 53ddf82c6..dfdd43d1e 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -2,6 +2,7 @@ title: ProtectedClassesDisparity toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 97370b88e..9bcd1438e 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -2,6 +2,7 @@ title: ProtectedClassesThresholdOptimizer toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 95a89f7f8..3c9d1a8bc 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -2,6 +2,7 @@ title: RollingStatsPlot toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## plot_rolling_statistics[()]{.muted} diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 142eaacf0..dd87bfc7e 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -2,6 +2,7 @@ title: RunsTest toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## RunsTest[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index f34b31d90..8e217ea94 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -2,6 +2,7 @@ title: ScatterPlot toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ScatterPlot[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 40e345535..b8c952fb7 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -2,6 +2,7 @@ title: ScoreBandDefaultRates toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ScoreBandDefaultRates[()]{.muted} diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index af3f6c928..3b50c4db5 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -2,6 +2,7 @@ title: SeasonalDecompose toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 0846c1248..231bac6be 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -2,6 +2,7 @@ title: ShapiroWilk toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ShapiroWilk[()]{.muted} diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index b819476d5..a8c87253f 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -2,6 +2,7 @@ title: Skewness toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## Skewness[()]{.muted} diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index aea8ded22..8eea8aa38 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -2,6 +2,7 @@ title: SpreadPlot toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## SpreadPlot[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 7af1564cf..293d97519 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -2,6 +2,7 @@ title: TabularCategoricalBarPlots toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## TabularCategoricalBarPlots[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index f70ce9cfa..b38d80293 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -2,6 +2,7 @@ title: TabularDateTimeHistograms toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## TabularDateTimeHistograms[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 4439d49ff..8b446d304 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -2,6 +2,7 @@ title: TabularDescriptionTables toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_categorical_columns[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 56fa444df..929830ce7 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -2,6 +2,7 @@ title: TabularNumericalHistograms toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## TabularNumericalHistograms[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index f877e1a47..e9024cfef 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -2,6 +2,7 @@ title: TargetRateBarPlots toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## TargetRateBarPlots[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 40bb88f38..2c7ccf932 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -2,6 +2,7 @@ title: TimeSeriesDescription toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## TimeSeriesDescription[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index ec80df98d..8c8299d58 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -2,6 +2,7 @@ title: TimeSeriesDescriptiveStatistics toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## TimeSeriesDescriptiveStatistics[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 1f4ee28d1..b1a146d87 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -2,6 +2,7 @@ title: TimeSeriesFrequency toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## TimeSeriesFrequency[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index a97b04b30..20305074f 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -2,6 +2,7 @@ title: TimeSeriesHistogram toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index aa4aed0d8..cc53b9747 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -2,6 +2,7 @@ title: TimeSeriesLinePlot toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## TimeSeriesLinePlot[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 55b5291a6..e1babaf28 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -2,6 +2,7 @@ title: TimeSeriesMissingValues toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## TimeSeriesMissingValues[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 1acb094ba..437bf3fac 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -2,6 +2,7 @@ title: TimeSeriesOutliers toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## TimeSeriesOutliers[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 120b6d845..dca83b47a 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -2,6 +2,7 @@ title: TooManyZeroValues toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## TooManyZeroValues[()]{.muted} diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index ce71bd54d..c76a83c44 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -2,6 +2,7 @@ title: UniqueRows toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## UniqueRows[()]{.muted} diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 00d3a07ec..bab629628 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -2,6 +2,7 @@ title: WOEBinPlots toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 31c9bfe58..ecb3c3d74 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -2,6 +2,7 @@ title: WOEBinTable toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## WOEBinTable[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 45986aa56..f1d61bfe7 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -2,6 +2,7 @@ title: ZivotAndrewsArch toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/data_validation/nlp.qmd b/docs/validmind/tests/data_validation/nlp.qmd index 2901408fa..3f4bd778a 100644 --- a/docs/validmind/tests/data_validation/nlp.qmd +++ b/docs/validmind/tests/data_validation/nlp.qmd @@ -2,6 +2,7 @@ title: nlp toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- - [CommonWords](nlp/CommonWords.qmd) diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index 8d9b1343f..87bb99e62 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -2,6 +2,7 @@ title: CommonWords toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## CommonWords[()]{.muted} diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 1c15d583a..f6b21c450 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -2,6 +2,7 @@ title: Hashtags toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## Hashtags[()]{.muted} diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 999faa7fd..aca2983c4 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -2,6 +2,7 @@ title: LanguageDetection toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## LanguageDetection[()]{.muted} diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 0eee33be5..5f47cbe36 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -2,6 +2,7 @@ title: Mentions toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## Mentions[()]{.muted} diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index fb329503b..e03a86436 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -2,6 +2,7 @@ title: PolarityAndSubjectivity toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## PolarityAndSubjectivity[()]{.muted} diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index c59c498da..903e8326b 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -2,6 +2,7 @@ title: Punctuations toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Metrics functions for any Pandas-compatible datasets diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index 85ae0273f..60e0a6819 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -2,6 +2,7 @@ title: Sentiment toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## Sentiment[()]{.muted} diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index e9500ae84..2527110f1 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -2,6 +2,7 @@ title: StopWords toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Threshold based tests diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index c90e7fc87..0ce3670e9 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -2,6 +2,7 @@ title: TextDescription toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## create_metrics_df[()]{.muted} diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index 3b5252377..7086e9985 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -2,6 +2,7 @@ title: Toxicity toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## Toxicity[()]{.muted} diff --git a/docs/validmind/tests/model_validation.qmd b/docs/validmind/tests/model_validation.qmd index 43c00931d..a542e1afc 100644 --- a/docs/validmind/tests/model_validation.qmd +++ b/docs/validmind/tests/model_validation.qmd @@ -2,6 +2,7 @@ title: model_validation toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- - [BertScore](model_validation/BertScore.qmd) diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index f477270fc..9c129ce05 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -2,6 +2,7 @@ title: BertScore toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## validate_prediction[()]{.muted} diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 4f5caf9d9..d275de252 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -2,6 +2,7 @@ title: BleuScore toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## validate_prediction[()]{.muted} diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index db7a28a47..2fcad4cf0 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -2,6 +2,7 @@ title: ClusterSizeDistribution toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ClusterSizeDistribution[()]{.muted} diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 5d80ae6d3..ce57f5e42 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -2,6 +2,7 @@ title: ContextualRecall toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## validate_prediction[()]{.muted} diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index f9f05f7ea..0ce576503 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -2,6 +2,7 @@ title: FeaturesAUC toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 2e1887195..507c6e46b 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -2,6 +2,7 @@ title: MeteorScore toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## validate_prediction[()]{.muted} diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index 006fe1566..2f1411012 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -2,6 +2,7 @@ title: ModelMetadata toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_model_info[()]{.muted} diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index bcf846e0a..5a52c36f9 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -2,6 +2,7 @@ title: ModelPredictionResiduals toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ModelPredictionResiduals[()]{.muted} diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 1a5ba0268..0e7e8849f 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -2,6 +2,7 @@ title: RegardScore toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## validate_prediction[()]{.muted} diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index a745498f1..aa1daebfa 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -2,6 +2,7 @@ title: RegressionResidualsPlot toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## RegressionResidualsPlot[()]{.muted} diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 470497f5b..f76ef7536 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -2,6 +2,7 @@ title: RougeScore toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## RougeScore[()]{.muted} diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index 2c087a058..06632d57f 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -2,6 +2,7 @@ title: TimeSeriesPredictionWithCI toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## TimeSeriesPredictionWithCI[()]{.muted} diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index e83e5ea6a..59da73f33 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -2,6 +2,7 @@ title: TimeSeriesPredictionsPlot toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## TimeSeriesPredictionsPlot[()]{.muted} diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index a9374c9ae..03be40ce5 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -2,6 +2,7 @@ title: TimeSeriesR2SquareBySegments toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## TimeSeriesR2SquareBySegments[()]{.muted} diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index 354342b2e..f9b5dfca1 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -2,6 +2,7 @@ title: TokenDisparity toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## TokenDisparity[()]{.muted} diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index 7bf0f1daa..129196c9b 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -2,6 +2,7 @@ title: ToxicityScore toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ToxicityScore[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn.qmd b/docs/validmind/tests/model_validation/sklearn.qmd index a35f66a40..3fff41e31 100644 --- a/docs/validmind/tests/model_validation/sklearn.qmd +++ b/docs/validmind/tests/model_validation/sklearn.qmd @@ -2,6 +2,7 @@ title: sklearn toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- - [AdjustedMutualInformation](sklearn/AdjustedMutualInformation.qmd) diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 6bb3429a0..9e6038152 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -2,6 +2,7 @@ title: AdjustedMutualInformation toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## AdjustedMutualInformation[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 920f0bf9b..1b7816f01 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -2,6 +2,7 @@ title: AdjustedRandIndex toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## AdjustedRandIndex[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index e96b3f84b..c358c51b9 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -2,6 +2,7 @@ title: CalibrationCurve toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## CalibrationCurve[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index a4b43cc4b..cd48a2324 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -2,6 +2,7 @@ title: ClassifierPerformance toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ClassifierPerformance[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index f3ef5f60c..032314d14 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -2,6 +2,7 @@ title: ClassifierThresholdOptimization toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ClassifierThresholdOptimization[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index f1e703c59..8b73d07c2 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -2,6 +2,7 @@ title: ClusterCosineSimilarity toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ClusterCosineSimilarity[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 3ec95a741..135908dda 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -2,6 +2,7 @@ title: ClusterPerformanceMetrics toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ClusterPerformanceMetrics[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 164fb5e9d..234d17b3e 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -2,6 +2,7 @@ title: CompletenessScore toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## CompletenessScore[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 51af351e6..ef99c78d7 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -2,6 +2,7 @@ title: ConfusionMatrix toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ConfusionMatrix[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index bd5eabf47..b1429a0cb 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -2,6 +2,7 @@ title: FeatureImportance toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## FeatureImportance[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 6877aee98..5776f8a17 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -2,6 +2,7 @@ title: FowlkesMallowsScore toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## FowlkesMallowsScore[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 0788c0000..67571431a 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -2,6 +2,7 @@ title: HomogeneityScore toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## HomogeneityScore[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 353b78c93..490fe7d6d 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -2,6 +2,7 @@ title: HyperParametersTuning toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## custom_recall[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index d3b52d06c..11f32b785 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -2,6 +2,7 @@ title: KMeansClustersOptimization toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## KMeansClustersOptimization[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index faedc528e..f8b28a169 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -2,6 +2,7 @@ title: MinimumAccuracy toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## MinimumAccuracy[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 15fe1d364..be3914dbd 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -2,6 +2,7 @@ title: MinimumF1Score toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## MinimumF1Score[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 630b6197e..55a7ddb33 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -2,6 +2,7 @@ title: MinimumROCAUCScore toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## MinimumROCAUCScore[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 0a367daf1..675bce23c 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -2,6 +2,7 @@ title: ModelParameters toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ModelParameters[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 248b4bc56..fb0369e10 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -2,6 +2,7 @@ title: ModelsPerformanceComparison toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## multiclass_roc_auc_score[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index c384e9e13..0c62c55e2 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -2,6 +2,7 @@ title: OverfitDiagnosis toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index ebffc4309..d544258a9 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -2,6 +2,7 @@ title: PermutationFeatureImportance toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 269ed2bff..72f2fc3f8 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -2,6 +2,7 @@ title: PopulationStabilityIndex toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 5a5a29ece..1abf6be18 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -2,6 +2,7 @@ title: PrecisionRecallCurve toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## PrecisionRecallCurve[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 80e0e55a0..930b6f366 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -2,6 +2,7 @@ title: ROCCurve toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ROCCurve[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index 4660e8630..86e3e0e37 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -2,6 +2,7 @@ title: RegressionErrors toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## RegressionErrors[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 53bd58c21..dfddd5faa 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -2,6 +2,7 @@ title: RegressionErrorsComparison toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 4aeed614f..facb858d7 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -2,6 +2,7 @@ title: RegressionPerformance toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 4ff4dd805..79a6ca336 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -2,6 +2,7 @@ title: RegressionR2Square toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## adj_r2_score[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index e1dfa4d93..31431c1ff 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -2,6 +2,7 @@ title: RegressionR2SquareComparison toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## adj_r2_score[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 52a290dc1..37d091bed 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -2,6 +2,7 @@ title: RobustnessDiagnosis toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index e99f6ed56..c70958e08 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -2,6 +2,7 @@ title: SHAPGlobalImportance toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index b665db115..731b577b7 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -2,6 +2,7 @@ title: ScoreProbabilityAlignment toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ScoreProbabilityAlignment[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index ab7b64616..93a4962dc 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -2,6 +2,7 @@ title: SilhouettePlot toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## SilhouettePlot[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 9f8e0c3a6..12007906a 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -2,6 +2,7 @@ title: TrainingTestDegradation toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## TrainingTestDegradation[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 4ae17832f..b14fb0d30 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -2,6 +2,7 @@ title: VMeasure toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## VMeasure[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index c477753c0..8c41e137c 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -2,6 +2,7 @@ title: WeakspotsDiagnosis toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## WeakspotsDiagnosis[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels.qmd b/docs/validmind/tests/model_validation/statsmodels.qmd index 7b5bf3a0f..c1628f56e 100644 --- a/docs/validmind/tests/model_validation/statsmodels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels.qmd @@ -2,6 +2,7 @@ title: statsmodels toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- - [AutoARIMA](statsmodels/AutoARIMA.qmd) diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 13a20b015..c993a1537 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -2,6 +2,7 @@ title: AutoARIMA toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index ecd8476b3..7679c6bb5 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -2,6 +2,7 @@ title: CumulativePredictionProbabilities toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## CumulativePredictionProbabilities[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 81e018489..680022c24 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -2,6 +2,7 @@ title: DurbinWatsonTest toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## DurbinWatsonTest[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index 5f32a39d2..f8b872cde 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -2,6 +2,7 @@ title: GINITable toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## GINITable[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index a91338aa1..d79b57aea 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -2,6 +2,7 @@ title: KolmogorovSmirnov toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## KolmogorovSmirnov[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 169e0b548..3819a4ca9 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -2,6 +2,7 @@ title: Lilliefors toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## Lilliefors[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index 9a68bfa7e..4ab60c659 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -2,6 +2,7 @@ title: PredictionProbabilitiesHistogram toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## PredictionProbabilitiesHistogram[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 8bbffb997..93df31a3e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -2,6 +2,7 @@ title: RegressionCoeffs toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## RegressionCoeffs[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 2e4af5002..28ac3d13f 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -2,6 +2,7 @@ title: RegressionFeatureSignificance toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index f821dca66..9db88287e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -2,6 +2,7 @@ title: RegressionModelForecastPlot toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 21d3a26cf..e066af9d2 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -2,6 +2,7 @@ title: RegressionModelForecastPlotLevels toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## integrate_diff[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index ebb7290c5..0be4f7866 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -2,6 +2,7 @@ title: RegressionModelSensitivityPlot toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 6415fce91..7bca2ce9b 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -2,6 +2,7 @@ title: RegressionModelSummary toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## adj_r2_score[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index db078f624..8e5640c1b 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -2,6 +2,7 @@ title: RegressionPermutationFeatureImportance toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## get_logger[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index df0210a44..e651fc2d3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -2,6 +2,7 @@ title: ScorecardHistogram toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## ScorecardHistogram[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 271e44656..0f55606fa 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -2,6 +2,7 @@ title: statsutils toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## adj_r2_score[()]{.muted} diff --git a/docs/validmind/tests/prompt_validation.qmd b/docs/validmind/tests/prompt_validation.qmd index 679d7531b..0c02bfbdf 100644 --- a/docs/validmind/tests/prompt_validation.qmd +++ b/docs/validmind/tests/prompt_validation.qmd @@ -2,6 +2,7 @@ title: prompt_validation toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- - [ai_powered_test](prompt_validation/ai_powered_test.qmd) diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 2d03f0137..b6d344496 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -2,6 +2,7 @@ title: Bias toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## call_model[()]{.muted} diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 1da1de2d8..d605802de 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -2,6 +2,7 @@ title: Clarity toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## call_model[()]{.muted} diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index a1e298592..c6153e39c 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -2,6 +2,7 @@ title: Conciseness toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## call_model[()]{.muted} diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 8490e0b8b..2ebe9ef5a 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -2,6 +2,7 @@ title: Delimitation toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## call_model[()]{.muted} diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 3927f4ac0..55507a5c6 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -2,6 +2,7 @@ title: NegativeInstruction toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## call_model[()]{.muted} diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 2054176bf..550b2c8f1 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -2,6 +2,7 @@ title: Robustness toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## call_model[()]{.muted} diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index acf5edf23..679dd5190 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -2,6 +2,7 @@ title: Specificity toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## call_model[()]{.muted} diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index ccad2956d..ad5a23214 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -2,6 +2,7 @@ title: ai_powered_test toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## call_model[()]{.muted} diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index e79096650..acf98b645 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -2,6 +2,7 @@ title: unit_metrics toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- ## describe_metric[()]{.muted} diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 1d28772b6..62c24c39c 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -2,6 +2,7 @@ title: vm_models toc-depth: 3 toc-expand: 3 +sidebar: validmind-reference --- Models entrypoint diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index d9f935970..a289815e0 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -123,11 +123,11 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: continue if member['kind'] in ('function', 'class'): - # For root module items, always use reference/validmind.html path + # For root module items, always use reference/validmind.qmd path file_prefix = 'reference/validmind' if is_root else file_path module_items.append({ 'text': f"{member['name']}()" if member['kind'] == 'function' else member['name'], - 'file': f"{file_prefix}.html#{member['name']}" + 'file': f"{file_prefix}.qmd#{member['name']}" }) elif member['kind'] == 'alias': target = resolve_alias(member, full_data) @@ -135,7 +135,7 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: file_prefix = 'reference/validmind' if is_root else file_path module_items.append({ 'text': f"{member['name']}()", - 'file': f"{file_prefix}.html#{member['name']}" + 'file': f"{file_prefix}.qmd#{member['name']}" }) if module_items: From b3bd81c8b05f999b90a93fd330bcdd602294f1e9 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 29 Jan 2025 10:41:04 -0800 Subject: [PATCH 029/207] Save point --- docs.qmd | 375 ++++++++++++++++++ docs/templates/module.qmd.jinja2 | 4 +- docs/validmind.qmd | 4 +- docs/validmind/datasets.qmd | 2 - docs/validmind/datasets/classification.qmd | 2 - .../classification/customer_churn.qmd | 2 - .../datasets/classification/taiwan_credit.qmd | 2 - docs/validmind/datasets/credit_risk.qmd | 2 - .../datasets/credit_risk/lending_club.qmd | 2 - .../credit_risk/lending_club_bias.qmd | 2 - docs/validmind/datasets/nlp.qmd | 2 - docs/validmind/datasets/nlp/cnn_dailymail.qmd | 2 - .../datasets/nlp/twitter_covid_19.qmd | 2 - docs/validmind/datasets/regression.qmd | 2 - docs/validmind/datasets/regression/fred.qmd | 2 - .../datasets/regression/lending_club.qmd | 2 - docs/validmind/errors.qmd | 2 - docs/validmind/test_suites.qmd | 2 - docs/validmind/test_suites/classifier.qmd | 2 - docs/validmind/test_suites/cluster.qmd | 2 - docs/validmind/test_suites/embeddings.qmd | 2 - docs/validmind/test_suites/llm.qmd | 2 - docs/validmind/test_suites/nlp.qmd | 2 - .../test_suites/parameters_optimization.qmd | 2 - docs/validmind/test_suites/regression.qmd | 2 - .../test_suites/statsmodels_timeseries.qmd | 2 - docs/validmind/test_suites/summarization.qmd | 2 - .../test_suites/tabular_datasets.qmd | 2 - docs/validmind/test_suites/text_data.qmd | 2 - docs/validmind/test_suites/time_series.qmd | 2 - docs/validmind/tests.qmd | 2 - docs/validmind/tests/data_validation.qmd | 2 - .../tests/data_validation/ACFandPACFPlot.qmd | 2 - docs/validmind/tests/data_validation/ADF.qmd | 2 - .../tests/data_validation/AutoAR.qmd | 2 - .../tests/data_validation/AutoMA.qmd | 2 - .../data_validation/AutoStationarity.qmd | 2 - .../data_validation/BivariateScatterPlots.qmd | 2 - .../tests/data_validation/BoxPierce.qmd | 2 - .../ChiSquaredFeaturesTable.qmd | 2 - .../tests/data_validation/ClassImbalance.qmd | 2 - .../data_validation/DatasetDescription.qmd | 2 - .../tests/data_validation/DatasetSplit.qmd | 2 - .../data_validation/DescriptiveStatistics.qmd | 2 - .../tests/data_validation/DickeyFullerGLS.qmd | 2 - .../tests/data_validation/Duplicates.qmd | 2 - .../data_validation/EngleGrangerCoint.qmd | 2 - .../FeatureTargetCorrelationPlot.qmd | 2 - .../tests/data_validation/HighCardinality.qmd | 2 - .../HighPearsonCorrelation.qmd | 2 - .../data_validation/IQROutliersBarPlot.qmd | 2 - .../data_validation/IQROutliersTable.qmd | 2 - .../IsolationForestOutliers.qmd | 2 - .../tests/data_validation/JarqueBera.qmd | 2 - docs/validmind/tests/data_validation/KPSS.qmd | 2 - .../tests/data_validation/LJungBox.qmd | 2 - .../LaggedCorrelationHeatmap.qmd | 2 - .../tests/data_validation/MissingValues.qmd | 2 - .../data_validation/MissingValuesBarPlot.qmd | 2 - .../data_validation/MutualInformation.qmd | 2 - .../PearsonCorrelationMatrix.qmd | 2 - .../data_validation/PhillipsPerronArch.qmd | 2 - .../ProtectedClassesCombination.qmd | 2 - .../ProtectedClassesDescription.qmd | 2 - .../ProtectedClassesDisparity.qmd | 2 - .../ProtectedClassesThresholdOptimizer.qmd | 2 - .../data_validation/RollingStatsPlot.qmd | 2 - .../tests/data_validation/RunsTest.qmd | 2 - .../tests/data_validation/ScatterPlot.qmd | 2 - .../data_validation/ScoreBandDefaultRates.qmd | 2 - .../data_validation/SeasonalDecompose.qmd | 2 - .../tests/data_validation/ShapiroWilk.qmd | 2 - .../tests/data_validation/Skewness.qmd | 2 - .../tests/data_validation/SpreadPlot.qmd | 2 - .../TabularCategoricalBarPlots.qmd | 2 - .../TabularDateTimeHistograms.qmd | 2 - .../TabularDescriptionTables.qmd | 2 - .../TabularNumericalHistograms.qmd | 2 - .../data_validation/TargetRateBarPlots.qmd | 2 - .../data_validation/TimeSeriesDescription.qmd | 2 - .../TimeSeriesDescriptiveStatistics.qmd | 2 - .../data_validation/TimeSeriesFrequency.qmd | 2 - .../data_validation/TimeSeriesHistogram.qmd | 2 - .../data_validation/TimeSeriesLinePlot.qmd | 2 - .../TimeSeriesMissingValues.qmd | 2 - .../data_validation/TimeSeriesOutliers.qmd | 2 - .../data_validation/TooManyZeroValues.qmd | 2 - .../tests/data_validation/UniqueRows.qmd | 2 - .../tests/data_validation/WOEBinPlots.qmd | 2 - .../tests/data_validation/WOEBinTable.qmd | 2 - .../data_validation/ZivotAndrewsArch.qmd | 2 - docs/validmind/tests/data_validation/nlp.qmd | 2 - .../tests/data_validation/nlp/CommonWords.qmd | 2 - .../tests/data_validation/nlp/Hashtags.qmd | 2 - .../data_validation/nlp/LanguageDetection.qmd | 2 - .../tests/data_validation/nlp/Mentions.qmd | 2 - .../nlp/PolarityAndSubjectivity.qmd | 2 - .../data_validation/nlp/Punctuations.qmd | 2 - .../tests/data_validation/nlp/Sentiment.qmd | 2 - .../tests/data_validation/nlp/StopWords.qmd | 2 - .../data_validation/nlp/TextDescription.qmd | 2 - .../tests/data_validation/nlp/Toxicity.qmd | 2 - docs/validmind/tests/model_validation.qmd | 2 - .../tests/model_validation/BertScore.qmd | 2 - .../tests/model_validation/BleuScore.qmd | 2 - .../ClusterSizeDistribution.qmd | 2 - .../model_validation/ContextualRecall.qmd | 2 - .../tests/model_validation/FeaturesAUC.qmd | 2 - .../tests/model_validation/MeteorScore.qmd | 2 - .../tests/model_validation/ModelMetadata.qmd | 2 - .../ModelPredictionResiduals.qmd | 2 - .../tests/model_validation/RegardScore.qmd | 2 - .../RegressionResidualsPlot.qmd | 2 - .../tests/model_validation/RougeScore.qmd | 2 - .../TimeSeriesPredictionWithCI.qmd | 2 - .../TimeSeriesPredictionsPlot.qmd | 2 - .../TimeSeriesR2SquareBySegments.qmd | 2 - .../tests/model_validation/TokenDisparity.qmd | 2 - .../tests/model_validation/ToxicityScore.qmd | 2 - .../tests/model_validation/sklearn.qmd | 2 - .../sklearn/AdjustedMutualInformation.qmd | 2 - .../sklearn/AdjustedRandIndex.qmd | 2 - .../sklearn/CalibrationCurve.qmd | 2 - .../sklearn/ClassifierPerformance.qmd | 2 - .../ClassifierThresholdOptimization.qmd | 2 - .../sklearn/ClusterCosineSimilarity.qmd | 2 - .../sklearn/ClusterPerformanceMetrics.qmd | 2 - .../sklearn/CompletenessScore.qmd | 2 - .../sklearn/ConfusionMatrix.qmd | 2 - .../sklearn/FeatureImportance.qmd | 2 - .../sklearn/FowlkesMallowsScore.qmd | 2 - .../sklearn/HomogeneityScore.qmd | 2 - .../sklearn/HyperParametersTuning.qmd | 2 - .../sklearn/KMeansClustersOptimization.qmd | 2 - .../sklearn/MinimumAccuracy.qmd | 2 - .../sklearn/MinimumF1Score.qmd | 2 - .../sklearn/MinimumROCAUCScore.qmd | 2 - .../sklearn/ModelParameters.qmd | 2 - .../sklearn/ModelsPerformanceComparison.qmd | 2 - .../sklearn/OverfitDiagnosis.qmd | 2 - .../sklearn/PermutationFeatureImportance.qmd | 2 - .../sklearn/PopulationStabilityIndex.qmd | 2 - .../sklearn/PrecisionRecallCurve.qmd | 2 - .../model_validation/sklearn/ROCCurve.qmd | 2 - .../sklearn/RegressionErrors.qmd | 2 - .../sklearn/RegressionErrorsComparison.qmd | 2 - .../sklearn/RegressionPerformance.qmd | 2 - .../sklearn/RegressionR2Square.qmd | 2 - .../sklearn/RegressionR2SquareComparison.qmd | 2 - .../sklearn/RobustnessDiagnosis.qmd | 2 - .../sklearn/SHAPGlobalImportance.qmd | 2 - .../sklearn/ScoreProbabilityAlignment.qmd | 2 - .../sklearn/SilhouettePlot.qmd | 2 - .../sklearn/TrainingTestDegradation.qmd | 2 - .../model_validation/sklearn/VMeasure.qmd | 2 - .../sklearn/WeakspotsDiagnosis.qmd | 2 - .../tests/model_validation/statsmodels.qmd | 2 - .../statsmodels/AutoARIMA.qmd | 2 - .../CumulativePredictionProbabilities.qmd | 2 - .../statsmodels/DurbinWatsonTest.qmd | 2 - .../statsmodels/GINITable.qmd | 2 - .../statsmodels/KolmogorovSmirnov.qmd | 2 - .../statsmodels/Lilliefors.qmd | 2 - .../PredictionProbabilitiesHistogram.qmd | 2 - .../statsmodels/RegressionCoeffs.qmd | 2 - .../RegressionFeatureSignificance.qmd | 2 - .../RegressionModelForecastPlot.qmd | 2 - .../RegressionModelForecastPlotLevels.qmd | 2 - .../RegressionModelSensitivityPlot.qmd | 2 - .../statsmodels/RegressionModelSummary.qmd | 2 - ...RegressionPermutationFeatureImportance.qmd | 2 - .../statsmodels/ScorecardHistogram.qmd | 2 - .../statsmodels/statsutils.qmd | 2 - docs/validmind/tests/prompt_validation.qmd | 2 - .../tests/prompt_validation/Bias.qmd | 2 - .../tests/prompt_validation/Clarity.qmd | 2 - .../tests/prompt_validation/Conciseness.qmd | 2 - .../tests/prompt_validation/Delimitation.qmd | 2 - .../prompt_validation/NegativeInstruction.qmd | 2 - .../tests/prompt_validation/Robustness.qmd | 2 - .../tests/prompt_validation/Specificity.qmd | 2 - .../prompt_validation/ai_powered_test.qmd | 2 - docs/validmind/unit_metrics.qmd | 2 - docs/validmind/vm_models.qmd | 2 - scripts/generate_quarto_docs.py | 12 +- 185 files changed, 383 insertions(+), 374 deletions(-) create mode 100644 docs.qmd diff --git a/docs.qmd b/docs.qmd new file mode 100644 index 000000000..e877aeb44 --- /dev/null +++ b/docs.qmd @@ -0,0 +1,375 @@ +--- +title: ValidMind Library +aliases: + - index.html +sidebar: validmind-reference +--- + +The ValidMind Library is a suite of developer tools and methods designed to automate the documentation and validation of your models. +Designed to be model agnostic, the ValidMind Library provides all the standard functionality without requiring you to rewrite any functions as long as your model is built in Python. + +With a rich array of documentation tools and test suites, from documenting descriptions of your datasets to testing your models for weak spots and overfit areas, the ValidMind Library helps you automate model documentation by feeding the ValidMind Platform with documentation artifacts and test results. + +To install the ValidMind Library: + +```bash +pip install validmind +``` + +To initialize the ValidMind Library, paste the code snippet with the model identifier credentials directly into your development source code, replacing this example with your own: + +```python +import validmind as vm + +vm.init( + api_host = "https://api.dev.vm.validmind.ai/api/v1/tracking/tracking", + api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + api_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + project = "" +) +``` + +After you have pasted the code snippet into your development source code and executed the code, the Python Library API will register with ValidMind. You can now use the ValidMind Library to document and test your models, and to upload to the ValidMind Platform. + +## Python API + +### __version__ + +```python +2.8.0 +``` + +### get_test_suite[()]{.muted} + +```python +def get_test_suite( + test_suite_id: str = None, + section: str = None, + *args = (), + **kwargs = {}) -> TestSuite: +``` + +Gets a TestSuite object for the current project or a specific test suite +This function provides an interface to retrieve the TestSuite instance for the +current project or a specific TestSuite instance identified by test_suite_id. +The project Test Suite will contain sections for every section in the project's +documentation template and these Test Suite Sections will contain all the tests +associated with that template section. + +**Parameters** +- **test_suite_id** str: The test suite name. If not passed, then the +project's test suite will be returned. Defaults to None. +- **section** str: The section of the documentation template from which +to retrieve the test suite. This only applies if test_suite_id is None. +Defaults to None. +- **args**: Additional arguments to pass to the TestSuite +- **kwargs**: Additional keyword arguments to pass to the TestSuite +### init[()]{.muted} + +```python +def init( + project: Optional = None, + api_key: Optional = None, + api_secret: Optional = None, + api_host: Optional = None, + model: Optional = None, + monitoring: bool = False): +``` + +Initializes the API client instances and calls the /ping endpoint to ensure +the provided credentials are valid and we can connect to the ValidMind API. + +If the API key and secret are not provided, the client will attempt to +retrieve them from the environment variables `VM_API_KEY` and `VM_API_SECRET`. + +**Parameters** +- **project** str: The project CUID. Alias for model. Defaults to None. [DEPRECATED] +- **model** str: The model CUID. Defaults to None. +- **api_key** str: The API key. Defaults to None. +- **api_secret** str: The API secret. Defaults to None. +- **api_host** str: The API host. Defaults to None. +- **monitoring** bool: The ongoing monitoring flag. Defaults to False. + +**Raises** +- **ValueError**: If the API key and secret are not provided +### init_dataset[()]{.muted} + +```python +def init_dataset( + dataset, + model = None, + index = None, + index_name: str = None, + date_time_index: bool = False, + columns: list = None, + text_column: str = None, + target_column: str = None, + feature_columns: list = None, + extra_columns: dict = None, + class_labels: dict = None, + type: str = None, + input_id: str = None, + __log = True) -> VMDataset: +``` + +Initializes a VM Dataset, which can then be passed to other functions +that can perform additional analysis and tests on the data. This function +also ensures we are reading a valid dataset type. + +The following dataset types are supported: +- Pandas DataFrame +- Polars DataFrame +- Numpy ndarray +- Torch TensorDataset + +Args: + dataset : dataset from various python libraries + model (VMModel): ValidMind model object + targets (vm.vm.DatasetTargets): A list of target variables + target_column (str): The name of the target column in the dataset + feature_columns (list): A list of names of feature columns in the dataset + extra_columns (dictionary): A dictionary containing the names of the + prediction_column and group_by_columns in the dataset + class_labels (dict): A list of class labels for classification problems + type (str): The type of dataset (one of DATASET_TYPES) + input_id (str): The input ID for the dataset (e.g. "my_dataset"). By default, + this will be set to `dataset` but if you are passing this dataset as a + test input using some other key than `dataset`, then you should set + this to the same key. + +Raises: + ValueError: If the dataset type is not supported + +Returns: + vm.vm.Dataset: A VM Dataset instance +### init_model[()]{.muted} + +```python +def init_model( + model: object = None, + input_id: str = 'model', + attributes: dict = None, + predict_fn: callable = None, + __log = True, + **kwargs = {}) -> VMModel: +``` + +Initializes a VM Model, which can then be passed to other functions +that can perform additional analysis and tests on the data. This function +also ensures we are creating a model supported libraries. + +**Parameters** +- **model**: A trained model or VMModel instance +- **input_id** str: The input ID for the model (e.g. "my_model"). By default, +this will be set to `model` but if you are passing this model as a +test input using some other key than `model`, then you should set +this to the same key. +- **attributes** dict: A dictionary of model attributes +- **predict_fn** callable: A function that takes an input and returns a prediction +- ****kwargs**: Additional arguments to pass to the model + +**Returns** +- A VM Model instance + +**Raises** +- **ValueError**: If the model type is not supported +### init_r_model[()]{.muted} + +```python +def init_r_model( + model_path: str, + input_id: str = 'model') -> VMModel: +``` + +Initializes a VM Model for an R model +R models must be saved to disk and the filetype depends on the model type... +Currently we support the following model types: + +- LogisticRegression `glm` model in R: saved as an RDS file with `saveRDS` +- LinearRegression `lm` model in R: saved as an RDS file with `saveRDS` +- XGBClassifier: saved as a .json or .bin file with `xgb.save` +- XGBRegressor: saved as a .json or .bin file with `xgb.save` + +LogisticRegression and LinearRegression models are converted to sklearn models by extracting +the coefficients and intercept from the R model. XGB models are loaded using the xgboost +since xgb models saved in .json or .bin format can be loaded directly with either Python or R + +**Parameters** +- **model_path** str: The path to the R model saved as an RDS or XGB file +- **model_type** str: The type of the model (one of R_MODEL_TYPES) + +**Returns** +- A VM Model instance +### log_metric[()]{.muted} + +```python +def log_metric( + key: str, + value: float, + inputs: Optional = None, + params: Optional = None, + recorded_at: Optional = None, + thresholds: Optional = None): +``` + +Logs a unit metric +Unit metrics are key-value pairs where the key is the metric name and the value is +a scalar (int or float). These key-value pairs are associated with the currently +selected model (inventory model in the ValidMind Platform) and keys can be logged +to over time to create a history of the metric. On the ValidMind Platform, these metrics +will be used to create plots/visualizations for documentation and dashboards etc. + +**Parameters** +- **key** str: The metric key +- **value** float: The metric value +- **inputs** list: A list of input IDs that were used to compute the metric. +- **params** dict: Dictionary of parameters used to compute the metric. +- **recorded_at** str: The timestamp of the metric. Server will use +current time if not provided. +- **thresholds** dict: Dictionary of thresholds for the metric. +### preview_template[()]{.muted} + +```python +def preview_template( +): +``` + +Preview the documentation template for the current project +This function will display the documentation template for the current project. If +the project has not been initialized, then an error will be raised. + +**Raises** +- **ValueError**: If the project has not been initialized +### reload[()]{.muted} + +```python +def reload( +): +``` + +Reconnect to the ValidMind API and reload the project configuration +### run_documentation_tests[()]{.muted} + +```python +def run_documentation_tests( + section = None, + send = True, + fail_fast = False, + inputs = None, + config = None, + **kwargs = {}): +``` + +Collect and run all the tests associated with a template +This function will analyze the current project's documentation template and collect +all the tests associated with it into a test suite. It will then run the test +suite, log the results to the ValidMind API, and display them to the user. + +**Parameters** +- **section** str or list: The section(s) to preview. Defaults to None. +- **send** bool: Whether to send the results to the ValidMind API. Defaults to True. +- **fail_fast** bool: Whether to stop running tests after the first failure. Defaults to False. +- **inputs** dict: A dictionary of test inputs to pass to the TestSuite +- **config**: A dictionary of test parameters to override the defaults +- ****kwargs**: backwards compatibility for passing in test inputs using keyword arguments + +**Returns** +- TestSuite or dict: The completed TestSuite instance or a dictionary of TestSuites if section is a list. + +**Raises** +- **ValueError**: If the project has not been initialized +### run_test_suite[()]{.muted} + +```python +def run_test_suite( + test_suite_id, + send = True, + fail_fast = False, + config = None, + inputs = None, + **kwargs = {}): +``` + +High Level function for running a test suite +This function provides a high level interface for running a test suite. A test suite is +a collection of tests. This function will automatically find the correct test suite +class based on the test_suite_id, initialize each of the tests, and run them. + +**Parameters** +- **test_suite_id** str: The test suite name (e.g. 'classifier_full_suite') +- **config** dict: A dictionary of parameters to pass to the tests in the +test suite. Defaults to None. +- **send** bool: Whether to post the test results to the API. send=False +is useful for testing. Defaults to True. +- **fail_fast** bool: Whether to stop running tests after the first failure. Defaults to False. +- **inputs** dict: A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` +`models` etc. These inputs will be accessible by any test in the test suite. See the test +documentation or `vm.describe_test()` for more details on the inputs required for each. +- ****kwargs**: backwards compatibility for passing in test inputs using keyword arguments + +**Returns** +- the TestSuite instance + +**Raises** +- **ValueError**: If the test suite name is not found or if there is an error initializing the test suite +### tags[()]{.muted} + +```python +def tags( + *tags = ()): +``` + +Decorator for specifying tags for a test. + +**Parameters** +- ***tags**: The tags to apply to the test. +### tasks[()]{.muted} + +```python +def tasks( + *tasks = ()): +``` + +Decorator for specifying the task types that a test is designed for. + +**Parameters** +- ***tasks**: The task types that the test is designed for. +### test[()]{.muted} + +```python +def test( + func_or_id): +``` + +Decorator for creating and registering custom tests +This decorator registers the function it wraps as a test function within ValidMind +under the provided ID. Once decorated, the function can be run using the +`validmind.tests.run_test` function. + +The function can take two different types of arguments: + +- Inputs: ValidMind model or dataset (or list of models/datasets). These arguments + must use the following names: `model`, `models`, `dataset`, `datasets`. +- Parameters: Any additional keyword arguments of any type (must have a default + value) that can have any name. + +The function should return one of the following types: + +- Table: Either a list of dictionaries or a pandas DataFrame +- Plot: Either a matplotlib figure or a plotly figure +- Scalar: A single number (int or float) +- Boolean: A single boolean value indicating whether the test passed or failed + +The function may also include a docstring. This docstring will be used and logged +as the metric's description. + +**Parameters** +- **func**: The function to decorate +- **test_id**: The identifier for the metric. If not provided, the function name is used. + +**Returns** +- The decorated function. + + + + diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index 6cb752447..1b011844d 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -2,9 +2,7 @@ {% import "macros/types.jinja2" as types %} {% import "macros/navigation.jinja2" as nav %} --- -title: {{ module.name }} -toc-depth: 3 -toc-expand: 3 +title: {% if module.name == "validmind" %}ValidMind Library{% else %}{{ module.name }}{% endif +%} {% if module.name == "validmind" %} aliases: - index.html diff --git a/docs/validmind.qmd b/docs/validmind.qmd index b5b5f0629..c98f54907 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -1,7 +1,5 @@ --- -title: validmind -toc-depth: 3 -toc-expand: 3 +title: ValidMind Library aliases: - index.html sidebar: validmind-reference diff --git a/docs/validmind/datasets.qmd b/docs/validmind/datasets.qmd index 55441dd9b..8ea281205 100644 --- a/docs/validmind/datasets.qmd +++ b/docs/validmind/datasets.qmd @@ -1,7 +1,5 @@ --- title: datasets -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/classification.qmd b/docs/validmind/datasets/classification.qmd index 6d64ede2e..6d3270467 100644 --- a/docs/validmind/datasets/classification.qmd +++ b/docs/validmind/datasets/classification.qmd @@ -1,7 +1,5 @@ --- title: classification -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index 90d1237c8..6b8c8ff3b 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -1,7 +1,5 @@ --- title: customer_churn -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index 30597b15a..d1a7ae255 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -1,7 +1,5 @@ --- title: taiwan_credit -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/credit_risk.qmd b/docs/validmind/datasets/credit_risk.qmd index 69af78452..5f8b67feb 100644 --- a/docs/validmind/datasets/credit_risk.qmd +++ b/docs/validmind/datasets/credit_risk.qmd @@ -1,7 +1,5 @@ --- title: credit_risk -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index 0db645ec3..8a8f1831a 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -1,7 +1,5 @@ --- title: lending_club -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index cc9f7b8e7..00030b60a 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -1,7 +1,5 @@ --- title: lending_club_bias -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/nlp.qmd b/docs/validmind/datasets/nlp.qmd index bb8ac75c2..f79364afc 100644 --- a/docs/validmind/datasets/nlp.qmd +++ b/docs/validmind/datasets/nlp.qmd @@ -1,7 +1,5 @@ --- title: nlp -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index 2e52f2cfd..9af90d74b 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -1,7 +1,5 @@ --- title: cnn_dailymail -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index bd1a3c9d6..5281f3601 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -1,7 +1,5 @@ --- title: twitter_covid_19 -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/regression.qmd b/docs/validmind/datasets/regression.qmd index 7e1d75e5e..294de30bb 100644 --- a/docs/validmind/datasets/regression.qmd +++ b/docs/validmind/datasets/regression.qmd @@ -1,7 +1,5 @@ --- title: regression -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index b85b3736e..9b38dcc25 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -1,7 +1,5 @@ --- title: fred -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index e78bd11cc..70d44390e 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -1,7 +1,5 @@ --- title: lending_club -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index 8020ace71..bf89d61c6 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -1,7 +1,5 @@ --- title: errors -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index b0e4200ec..aaca42c88 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -1,7 +1,5 @@ --- title: test_suites -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index 3eed413d8..0483c3d91 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -1,7 +1,5 @@ --- title: classifier -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index 4dd2d7bb8..c42db0a9a 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -1,7 +1,5 @@ --- title: cluster -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index de017c761..0172e4d58 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -1,7 +1,5 @@ --- title: embeddings -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index 17e74f28b..bc579ccee 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -1,7 +1,5 @@ --- title: llm -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index e38ea6649..2619dd691 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -1,7 +1,5 @@ --- title: nlp -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index e22837021..c22075c1d 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -1,7 +1,5 @@ --- title: parameters_optimization -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index 65cf14794..280e605fa 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -1,7 +1,5 @@ --- title: regression -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/statsmodels_timeseries.qmd b/docs/validmind/test_suites/statsmodels_timeseries.qmd index 564182bcb..48d4e6ccf 100644 --- a/docs/validmind/test_suites/statsmodels_timeseries.qmd +++ b/docs/validmind/test_suites/statsmodels_timeseries.qmd @@ -1,7 +1,5 @@ --- title: statsmodels_timeseries -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/summarization.qmd b/docs/validmind/test_suites/summarization.qmd index 41e8b021f..a6b8e06a0 100644 --- a/docs/validmind/test_suites/summarization.qmd +++ b/docs/validmind/test_suites/summarization.qmd @@ -1,7 +1,5 @@ --- title: summarization -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd index cf28087d6..bde08da01 100644 --- a/docs/validmind/test_suites/tabular_datasets.qmd +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -1,7 +1,5 @@ --- title: tabular_datasets -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/text_data.qmd b/docs/validmind/test_suites/text_data.qmd index a8f1c4935..4cd45912f 100644 --- a/docs/validmind/test_suites/text_data.qmd +++ b/docs/validmind/test_suites/text_data.qmd @@ -1,7 +1,5 @@ --- title: text_data -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index ff69edaf6..b488309ef 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -1,7 +1,5 @@ --- title: time_series -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 1761becbf..958c57f99 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -1,7 +1,5 @@ --- title: tests -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation.qmd b/docs/validmind/tests/data_validation.qmd index f699893b5..afc5e9f81 100644 --- a/docs/validmind/tests/data_validation.qmd +++ b/docs/validmind/tests/data_validation.qmd @@ -1,7 +1,5 @@ --- title: data_validation -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 87069d94d..794a6cfe2 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -1,7 +1,5 @@ --- title: ACFandPACFPlot -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index afa30502b..c83f5a95d 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -1,7 +1,5 @@ --- title: ADF -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 08afd839e..8f654e818 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -1,7 +1,5 @@ --- title: AutoAR -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index 0b1cf96b9..dc904f51a 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -1,7 +1,5 @@ --- title: AutoMA -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 05632c75f..d06d954dd 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -1,7 +1,5 @@ --- title: AutoStationarity -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index ff5e650fd..392bd01a9 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -1,7 +1,5 @@ --- title: BivariateScatterPlots -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index fa028f00a..dbc68d816 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -1,7 +1,5 @@ --- title: BoxPierce -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 66b3170f9..a8ae83021 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -1,7 +1,5 @@ --- title: ChiSquaredFeaturesTable -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index c4359caf1..5ae61f7f9 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -1,7 +1,5 @@ --- title: ClassImbalance -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 990ad7957..5fa4099f9 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -1,7 +1,5 @@ --- title: DatasetDescription -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index cffbb5aa7..ee58a987e 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -1,7 +1,5 @@ --- title: DatasetSplit -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index f66f28d80..f27b7c271 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -1,7 +1,5 @@ --- title: DescriptiveStatistics -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 711410e4f..780f08ce8 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -1,7 +1,5 @@ --- title: DickeyFullerGLS -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 8bf0ee0c5..6feb2dfa6 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -1,7 +1,5 @@ --- title: Duplicates -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 451e23745..274743184 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -1,7 +1,5 @@ --- title: EngleGrangerCoint -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index d10c9cec9..1d83ced17 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -1,7 +1,5 @@ --- title: FeatureTargetCorrelationPlot -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 45167d8a3..720d91e84 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -1,7 +1,5 @@ --- title: HighCardinality -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 619bf7d0d..d12375f38 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -1,7 +1,5 @@ --- title: HighPearsonCorrelation -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index e4d50f33b..0533c2232 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -1,7 +1,5 @@ --- title: IQROutliersBarPlot -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 0e0d4382c..9c512a32d 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -1,7 +1,5 @@ --- title: IQROutliersTable -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index bcac35c26..55976e9dd 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -1,7 +1,5 @@ --- title: IsolationForestOutliers -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index 9e1d890ef..fc4c4fa93 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -1,7 +1,5 @@ --- title: JarqueBera -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 7d581a546..ef6723fa5 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -1,7 +1,5 @@ --- title: KPSS -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 94e376809..2b9cba131 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -1,7 +1,5 @@ --- title: LJungBox -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index 411a0b365..3a561a931 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -1,7 +1,5 @@ --- title: LaggedCorrelationHeatmap -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index b3cf11054..f288c6f17 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -1,7 +1,5 @@ --- title: MissingValues -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 9a3aec8d4..617e0b86a 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -1,7 +1,5 @@ --- title: MissingValuesBarPlot -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index f467ddd2b..6e56e3e86 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -1,7 +1,5 @@ --- title: MutualInformation -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index cfe8faa63..3513e47a3 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -1,7 +1,5 @@ --- title: PearsonCorrelationMatrix -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 225da3537..d428b4ca6 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -1,7 +1,5 @@ --- title: PhillipsPerronArch -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index d86a6ee48..7a7aafcdd 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -1,7 +1,5 @@ --- title: ProtectedClassesCombination -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index 31fd8519d..433462f63 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -1,7 +1,5 @@ --- title: ProtectedClassesDescription -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index dfdd43d1e..da1d6ef82 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -1,7 +1,5 @@ --- title: ProtectedClassesDisparity -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 9bcd1438e..61f54c596 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -1,7 +1,5 @@ --- title: ProtectedClassesThresholdOptimizer -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 3c9d1a8bc..4a625b505 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -1,7 +1,5 @@ --- title: RollingStatsPlot -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index dd87bfc7e..4b1a5b332 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -1,7 +1,5 @@ --- title: RunsTest -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 8e217ea94..89f27e2be 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -1,7 +1,5 @@ --- title: ScatterPlot -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index b8c952fb7..d93720418 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -1,7 +1,5 @@ --- title: ScoreBandDefaultRates -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 3b50c4db5..e48f06a53 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -1,7 +1,5 @@ --- title: SeasonalDecompose -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 231bac6be..4ccbb9638 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -1,7 +1,5 @@ --- title: ShapiroWilk -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index a8c87253f..9f313ad54 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -1,7 +1,5 @@ --- title: Skewness -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 8eea8aa38..0d6acb051 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -1,7 +1,5 @@ --- title: SpreadPlot -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 293d97519..0419cc43d 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -1,7 +1,5 @@ --- title: TabularCategoricalBarPlots -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index b38d80293..37db80140 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -1,7 +1,5 @@ --- title: TabularDateTimeHistograms -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 8b446d304..6adf22046 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -1,7 +1,5 @@ --- title: TabularDescriptionTables -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 929830ce7..928354baa 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -1,7 +1,5 @@ --- title: TabularNumericalHistograms -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index e9024cfef..c4fa4f8c9 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -1,7 +1,5 @@ --- title: TargetRateBarPlots -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 2c7ccf932..4732205ec 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -1,7 +1,5 @@ --- title: TimeSeriesDescription -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 8c8299d58..7ac571aef 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -1,7 +1,5 @@ --- title: TimeSeriesDescriptiveStatistics -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index b1a146d87..efa23ae8b 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -1,7 +1,5 @@ --- title: TimeSeriesFrequency -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 20305074f..f3e6335f7 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -1,7 +1,5 @@ --- title: TimeSeriesHistogram -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index cc53b9747..4d1f34685 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -1,7 +1,5 @@ --- title: TimeSeriesLinePlot -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index e1babaf28..5577c5d3a 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -1,7 +1,5 @@ --- title: TimeSeriesMissingValues -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 437bf3fac..8e1bccdcf 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -1,7 +1,5 @@ --- title: TimeSeriesOutliers -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index dca83b47a..7f90d4933 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -1,7 +1,5 @@ --- title: TooManyZeroValues -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index c76a83c44..fc2ccaa3b 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -1,7 +1,5 @@ --- title: UniqueRows -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index bab629628..1760879a7 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -1,7 +1,5 @@ --- title: WOEBinPlots -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index ecb3c3d74..32b189b44 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -1,7 +1,5 @@ --- title: WOEBinTable -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index f1d61bfe7..5fef6860c 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -1,7 +1,5 @@ --- title: ZivotAndrewsArch -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp.qmd b/docs/validmind/tests/data_validation/nlp.qmd index 3f4bd778a..704c64c05 100644 --- a/docs/validmind/tests/data_validation/nlp.qmd +++ b/docs/validmind/tests/data_validation/nlp.qmd @@ -1,7 +1,5 @@ --- title: nlp -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index 87bb99e62..053d35d04 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -1,7 +1,5 @@ --- title: CommonWords -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index f6b21c450..8f52898ed 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -1,7 +1,5 @@ --- title: Hashtags -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index aca2983c4..e5df57a3e 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -1,7 +1,5 @@ --- title: LanguageDetection -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 5f47cbe36..7885309b1 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -1,7 +1,5 @@ --- title: Mentions -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index e03a86436..db019e952 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -1,7 +1,5 @@ --- title: PolarityAndSubjectivity -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index 903e8326b..4b8a4f272 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -1,7 +1,5 @@ --- title: Punctuations -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index 60e0a6819..e31f0ba31 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -1,7 +1,5 @@ --- title: Sentiment -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index 2527110f1..afbde88fc 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -1,7 +1,5 @@ --- title: StopWords -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 0ce3670e9..8b44b5a05 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -1,7 +1,5 @@ --- title: TextDescription -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index 7086e9985..193a321a3 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -1,7 +1,5 @@ --- title: Toxicity -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation.qmd b/docs/validmind/tests/model_validation.qmd index a542e1afc..8e2ba5d2e 100644 --- a/docs/validmind/tests/model_validation.qmd +++ b/docs/validmind/tests/model_validation.qmd @@ -1,7 +1,5 @@ --- title: model_validation -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 9c129ce05..9fa650606 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -1,7 +1,5 @@ --- title: BertScore -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index d275de252..a4c7e414a 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -1,7 +1,5 @@ --- title: BleuScore -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 2fcad4cf0..50b3b553e 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -1,7 +1,5 @@ --- title: ClusterSizeDistribution -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index ce57f5e42..e723adf55 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -1,7 +1,5 @@ --- title: ContextualRecall -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 0ce576503..2f73fe021 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -1,7 +1,5 @@ --- title: FeaturesAUC -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 507c6e46b..2a141d1c2 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -1,7 +1,5 @@ --- title: MeteorScore -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index 2f1411012..a29130c30 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -1,7 +1,5 @@ --- title: ModelMetadata -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index 5a52c36f9..dd9dcf999 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -1,7 +1,5 @@ --- title: ModelPredictionResiduals -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 0e7e8849f..7bf155d2c 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -1,7 +1,5 @@ --- title: RegardScore -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index aa1daebfa..21531215c 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -1,7 +1,5 @@ --- title: RegressionResidualsPlot -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index f76ef7536..20c84b7d7 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -1,7 +1,5 @@ --- title: RougeScore -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index 06632d57f..4839a8bec 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -1,7 +1,5 @@ --- title: TimeSeriesPredictionWithCI -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index 59da73f33..eceb6fcd0 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -1,7 +1,5 @@ --- title: TimeSeriesPredictionsPlot -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 03be40ce5..c3cc7200e 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -1,7 +1,5 @@ --- title: TimeSeriesR2SquareBySegments -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index f9b5dfca1..7d3c0dd86 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -1,7 +1,5 @@ --- title: TokenDisparity -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index 129196c9b..8405890b3 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -1,7 +1,5 @@ --- title: ToxicityScore -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn.qmd b/docs/validmind/tests/model_validation/sklearn.qmd index 3fff41e31..7075775ba 100644 --- a/docs/validmind/tests/model_validation/sklearn.qmd +++ b/docs/validmind/tests/model_validation/sklearn.qmd @@ -1,7 +1,5 @@ --- title: sklearn -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 9e6038152..66269e640 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -1,7 +1,5 @@ --- title: AdjustedMutualInformation -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 1b7816f01..3cd5764fe 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -1,7 +1,5 @@ --- title: AdjustedRandIndex -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index c358c51b9..cc1498c1f 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -1,7 +1,5 @@ --- title: CalibrationCurve -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index cd48a2324..cab9366af 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -1,7 +1,5 @@ --- title: ClassifierPerformance -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 032314d14..485d6ee01 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -1,7 +1,5 @@ --- title: ClassifierThresholdOptimization -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 8b73d07c2..aa7535492 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -1,7 +1,5 @@ --- title: ClusterCosineSimilarity -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 135908dda..a95488ad7 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -1,7 +1,5 @@ --- title: ClusterPerformanceMetrics -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 234d17b3e..ea89fedbe 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -1,7 +1,5 @@ --- title: CompletenessScore -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index ef99c78d7..1d69962ed 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -1,7 +1,5 @@ --- title: ConfusionMatrix -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index b1429a0cb..d8a9c799d 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -1,7 +1,5 @@ --- title: FeatureImportance -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 5776f8a17..ecdd72bf2 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -1,7 +1,5 @@ --- title: FowlkesMallowsScore -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 67571431a..76716c5a3 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -1,7 +1,5 @@ --- title: HomogeneityScore -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 490fe7d6d..34b5c7e06 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -1,7 +1,5 @@ --- title: HyperParametersTuning -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 11f32b785..0f10f42bb 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -1,7 +1,5 @@ --- title: KMeansClustersOptimization -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index f8b28a169..7e3f6baf5 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -1,7 +1,5 @@ --- title: MinimumAccuracy -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index be3914dbd..38ae4717d 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -1,7 +1,5 @@ --- title: MinimumF1Score -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 55a7ddb33..127945388 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -1,7 +1,5 @@ --- title: MinimumROCAUCScore -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 675bce23c..938957f95 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -1,7 +1,5 @@ --- title: ModelParameters -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index fb0369e10..988869374 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -1,7 +1,5 @@ --- title: ModelsPerformanceComparison -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 0c62c55e2..388962772 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -1,7 +1,5 @@ --- title: OverfitDiagnosis -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index d544258a9..2129835db 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -1,7 +1,5 @@ --- title: PermutationFeatureImportance -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 72f2fc3f8..4c5be8b56 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -1,7 +1,5 @@ --- title: PopulationStabilityIndex -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 1abf6be18..3e8dc3c97 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -1,7 +1,5 @@ --- title: PrecisionRecallCurve -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 930b6f366..b11ba9f45 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -1,7 +1,5 @@ --- title: ROCCurve -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index 86e3e0e37..c60070776 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -1,7 +1,5 @@ --- title: RegressionErrors -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index dfddd5faa..4fcd45bb0 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -1,7 +1,5 @@ --- title: RegressionErrorsComparison -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index facb858d7..a3b60cba3 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -1,7 +1,5 @@ --- title: RegressionPerformance -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 79a6ca336..d5d129d82 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -1,7 +1,5 @@ --- title: RegressionR2Square -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 31431c1ff..5ab901459 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -1,7 +1,5 @@ --- title: RegressionR2SquareComparison -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 37d091bed..2ed06e920 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -1,7 +1,5 @@ --- title: RobustnessDiagnosis -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index c70958e08..57ecf0e62 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -1,7 +1,5 @@ --- title: SHAPGlobalImportance -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 731b577b7..e8e9afe82 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -1,7 +1,5 @@ --- title: ScoreProbabilityAlignment -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 93a4962dc..f6fb3a2fe 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -1,7 +1,5 @@ --- title: SilhouettePlot -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 12007906a..e03266c76 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -1,7 +1,5 @@ --- title: TrainingTestDegradation -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index b14fb0d30..adb5d0ec0 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -1,7 +1,5 @@ --- title: VMeasure -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 8c41e137c..02070cb42 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -1,7 +1,5 @@ --- title: WeakspotsDiagnosis -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels.qmd b/docs/validmind/tests/model_validation/statsmodels.qmd index c1628f56e..ef6e4788e 100644 --- a/docs/validmind/tests/model_validation/statsmodels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels.qmd @@ -1,7 +1,5 @@ --- title: statsmodels -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index c993a1537..dba74ac8d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -1,7 +1,5 @@ --- title: AutoARIMA -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 7679c6bb5..9d2169862 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -1,7 +1,5 @@ --- title: CumulativePredictionProbabilities -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 680022c24..9f47e3053 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -1,7 +1,5 @@ --- title: DurbinWatsonTest -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index f8b872cde..8df9a473c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -1,7 +1,5 @@ --- title: GINITable -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index d79b57aea..fa0ac68b2 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -1,7 +1,5 @@ --- title: KolmogorovSmirnov -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 3819a4ca9..cb66eae19 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -1,7 +1,5 @@ --- title: Lilliefors -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index 4ab60c659..058a36637 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -1,7 +1,5 @@ --- title: PredictionProbabilitiesHistogram -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 93df31a3e..23d1eb09c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -1,7 +1,5 @@ --- title: RegressionCoeffs -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 28ac3d13f..1cfb94860 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -1,7 +1,5 @@ --- title: RegressionFeatureSignificance -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 9db88287e..e30719c79 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -1,7 +1,5 @@ --- title: RegressionModelForecastPlot -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index e066af9d2..970986618 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -1,7 +1,5 @@ --- title: RegressionModelForecastPlotLevels -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 0be4f7866..c638f75ba 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -1,7 +1,5 @@ --- title: RegressionModelSensitivityPlot -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 7bca2ce9b..55dc43cec 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -1,7 +1,5 @@ --- title: RegressionModelSummary -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 8e5640c1b..2fd4c960b 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -1,7 +1,5 @@ --- title: RegressionPermutationFeatureImportance -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index e651fc2d3..49f021e38 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -1,7 +1,5 @@ --- title: ScorecardHistogram -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 0f55606fa..e863835d9 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -1,7 +1,5 @@ --- title: statsutils -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/prompt_validation.qmd b/docs/validmind/tests/prompt_validation.qmd index 0c02bfbdf..53e9d39d0 100644 --- a/docs/validmind/tests/prompt_validation.qmd +++ b/docs/validmind/tests/prompt_validation.qmd @@ -1,7 +1,5 @@ --- title: prompt_validation -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index b6d344496..6ebe39fab 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -1,7 +1,5 @@ --- title: Bias -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index d605802de..6bc086480 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -1,7 +1,5 @@ --- title: Clarity -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index c6153e39c..e8c22b4f1 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -1,7 +1,5 @@ --- title: Conciseness -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 2ebe9ef5a..59b17aac3 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -1,7 +1,5 @@ --- title: Delimitation -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 55507a5c6..d1472d59f 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -1,7 +1,5 @@ --- title: NegativeInstruction -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 550b2c8f1..d29b03d50 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -1,7 +1,5 @@ --- title: Robustness -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 679dd5190..0a602348c 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -1,7 +1,5 @@ --- title: Specificity -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index ad5a23214..261d7ac27 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -1,7 +1,5 @@ --- title: ai_powered_test -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index acf98b645..a63368468 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -1,7 +1,5 @@ --- title: unit_metrics -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 62c24c39c..6819eb09c 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -1,7 +1,5 @@ --- title: vm_models -toc-depth: 3 -toc-expand: 3 sidebar: validmind-reference --- diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index a289815e0..92c111761 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -422,17 +422,17 @@ def generate_module_doc(module, full_data, env, output_dir): def find_qmd_files(base_path: str) -> Dict[str, List[str]]: """Find all .qmd files and their associated folders in docs/validmind.""" - print("\nEntering find_qmd_files()") - print(f"\nFiles written during documentation generation (count: {len(written_qmd_files)}):") - for filename, path in written_qmd_files.items(): - print(f" {filename}: {path}") + # print("\nEntering find_qmd_files()") + # print(f"\nFiles written during documentation generation (count: {len(written_qmd_files)}):") + # for filename, path in written_qmd_files.items(): + # print(f" {filename}: {path}") return written_qmd_files def generate_docs(json_path: str, template_dir: str, output_dir: str): """Generate documentation from JSON data using templates.""" - print("\nEntering generate_docs()") - print(f"output_dir: {output_dir}") + # print("\nEntering generate_docs()") + # print(f"output_dir: {output_dir}") # Load JSON data with open(json_path) as f: From 09517795e73c424045d6d0c053e72d1a354ee179 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 29 Jan 2025 10:42:38 -0800 Subject: [PATCH 030/207] Save point --- scripts/generate_quarto_docs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 92c111761..ddc30a6e5 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -200,7 +200,7 @@ def process_module(module: Dict[str, Any], path: List[str], env: Environment, fu # Track with full path and print full path full_path = os.path.join("docs", os.path.relpath(output_path, "docs")) - print(f"Wrote file: {full_path}") + # print(f"Wrote file: {full_path}") written_qmd_files[filename] = full_path # Process submodules From 458836868dbe67fe9474c62f2128d2e5304376cd Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 29 Jan 2025 20:32:21 -0800 Subject: [PATCH 031/207] Save point with first complete sidebar --- docs/_sidebar.yml | 356 +++++++++++++++++++++++++++++- docs/templates/sidebar.qmd.jinja2 | 23 +- scripts/generate_quarto_docs.py | 70 +++++- 3 files changed, 435 insertions(+), 14 deletions(-) diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml index e0044a122..d9f7297db 100644 --- a/docs/_sidebar.yml +++ b/docs/_sidebar.yml @@ -41,17 +41,367 @@ website: - text: "datasets" file: reference/validmind/datasets.qmd contents: - - reference/validmind/datasets/** + - text: "classification" + file: validmind/datasets/classification.qmd + contents: + - text: "customer_churn" + file: validmind/datasets/classification/customer_churn.qmd + - text: "taiwan_credit" + file: validmind/datasets/classification/taiwan_credit.qmd + - text: "credit_risk" + file: validmind/datasets/credit_risk.qmd + contents: + - text: "lending_club_bias" + file: validmind/datasets/credit_risk/lending_club_bias.qmd + - text: "nlp" + file: validmind/datasets/nlp.qmd + contents: + - text: "cnn_dailymail" + file: validmind/datasets/nlp/cnn_dailymail.qmd + - text: "twitter_covid_19" + file: validmind/datasets/nlp/twitter_covid_19.qmd + - text: "regression" + file: validmind/datasets/regression.qmd + contents: + - text: "fred" + file: validmind/datasets/regression/fred.qmd + - text: "lending_club" + file: validmind/datasets/regression/lending_club.qmd - text: "errors" file: reference/validmind/errors.qmd - text: "test_suites" file: reference/validmind/test_suites.qmd contents: - - reference/validmind/test_suites/** + - text: "classifier" + file: validmind/test_suites/classifier.qmd + - text: "cluster" + file: validmind/test_suites/cluster.qmd + - text: "embeddings" + file: validmind/test_suites/embeddings.qmd + - text: "llm" + file: validmind/test_suites/llm.qmd + - text: "parameters_optimization" + file: validmind/test_suites/parameters_optimization.qmd + - text: "regression" + file: validmind/test_suites/regression.qmd + - text: "statsmodels_timeseries" + file: validmind/test_suites/statsmodels_timeseries.qmd + - text: "summarization" + file: validmind/test_suites/summarization.qmd + - text: "tabular_datasets" + file: validmind/test_suites/tabular_datasets.qmd + - text: "text_data" + file: validmind/test_suites/text_data.qmd + - text: "time_series" + file: validmind/test_suites/time_series.qmd - text: "tests" file: reference/validmind/tests.qmd contents: - - reference/validmind/tests/** + - text: "data_validation" + file: validmind/tests/data_validation.qmd + contents: + - text: "ACFandPACFPlot" + file: validmind/tests/data_validation/ACFandPACFPlot.qmd + - text: "ADF" + file: validmind/tests/data_validation/ADF.qmd + - text: "AutoAR" + file: validmind/tests/data_validation/AutoAR.qmd + - text: "AutoMA" + file: validmind/tests/data_validation/AutoMA.qmd + - text: "AutoStationarity" + file: validmind/tests/data_validation/AutoStationarity.qmd + - text: "BivariateScatterPlots" + file: validmind/tests/data_validation/BivariateScatterPlots.qmd + - text: "BoxPierce" + file: validmind/tests/data_validation/BoxPierce.qmd + - text: "ChiSquaredFeaturesTable" + file: validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd + - text: "ClassImbalance" + file: validmind/tests/data_validation/ClassImbalance.qmd + - text: "CommonWords" + file: validmind/tests/data_validation/nlp/CommonWords.qmd + - text: "DatasetDescription" + file: validmind/tests/data_validation/DatasetDescription.qmd + - text: "DatasetSplit" + file: validmind/tests/data_validation/DatasetSplit.qmd + - text: "DescriptiveStatistics" + file: validmind/tests/data_validation/DescriptiveStatistics.qmd + - text: "DickeyFullerGLS" + file: validmind/tests/data_validation/DickeyFullerGLS.qmd + - text: "Duplicates" + file: validmind/tests/data_validation/Duplicates.qmd + - text: "EngleGrangerCoint" + file: validmind/tests/data_validation/EngleGrangerCoint.qmd + - text: "FeatureTargetCorrelationPlot" + file: validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd + - text: "Hashtags" + file: validmind/tests/data_validation/nlp/Hashtags.qmd + - text: "HighCardinality" + file: validmind/tests/data_validation/HighCardinality.qmd + - text: "HighPearsonCorrelation" + file: validmind/tests/data_validation/HighPearsonCorrelation.qmd + - text: "IQROutliersBarPlot" + file: validmind/tests/data_validation/IQROutliersBarPlot.qmd + - text: "IQROutliersTable" + file: validmind/tests/data_validation/IQROutliersTable.qmd + - text: "IsolationForestOutliers" + file: validmind/tests/data_validation/IsolationForestOutliers.qmd + - text: "JarqueBera" + file: validmind/tests/data_validation/JarqueBera.qmd + - text: "KPSS" + file: validmind/tests/data_validation/KPSS.qmd + - text: "LJungBox" + file: validmind/tests/data_validation/LJungBox.qmd + - text: "LaggedCorrelationHeatmap" + file: validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd + - text: "LanguageDetection" + file: validmind/tests/data_validation/nlp/LanguageDetection.qmd + - text: "Mentions" + file: validmind/tests/data_validation/nlp/Mentions.qmd + - text: "MissingValues" + file: validmind/tests/data_validation/MissingValues.qmd + - text: "MissingValuesBarPlot" + file: validmind/tests/data_validation/MissingValuesBarPlot.qmd + - text: "MutualInformation" + file: validmind/tests/data_validation/MutualInformation.qmd + - text: "PearsonCorrelationMatrix" + file: validmind/tests/data_validation/PearsonCorrelationMatrix.qmd + - text: "PhillipsPerronArch" + file: validmind/tests/data_validation/PhillipsPerronArch.qmd + - text: "PolarityAndSubjectivity" + file: validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd + - text: "ProtectedClassesCombination" + file: validmind/tests/data_validation/ProtectedClassesCombination.qmd + - text: "ProtectedClassesDescription" + file: validmind/tests/data_validation/ProtectedClassesDescription.qmd + - text: "ProtectedClassesDisparity" + file: validmind/tests/data_validation/ProtectedClassesDisparity.qmd + - text: "ProtectedClassesThresholdOptimizer" + file: validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd + - text: "Punctuations" + file: validmind/tests/data_validation/nlp/Punctuations.qmd + - text: "RollingStatsPlot" + file: validmind/tests/data_validation/RollingStatsPlot.qmd + - text: "RunsTest" + file: validmind/tests/data_validation/RunsTest.qmd + - text: "ScatterPlot" + file: validmind/tests/data_validation/ScatterPlot.qmd + - text: "ScoreBandDefaultRates" + file: validmind/tests/data_validation/ScoreBandDefaultRates.qmd + - text: "SeasonalDecompose" + file: validmind/tests/data_validation/SeasonalDecompose.qmd + - text: "Sentiment" + file: validmind/tests/data_validation/nlp/Sentiment.qmd + - text: "ShapiroWilk" + file: validmind/tests/data_validation/ShapiroWilk.qmd + - text: "Skewness" + file: validmind/tests/data_validation/Skewness.qmd + - text: "SpreadPlot" + file: validmind/tests/data_validation/SpreadPlot.qmd + - text: "StopWords" + file: validmind/tests/data_validation/nlp/StopWords.qmd + - text: "TabularCategoricalBarPlots" + file: validmind/tests/data_validation/TabularCategoricalBarPlots.qmd + - text: "TabularDateTimeHistograms" + file: validmind/tests/data_validation/TabularDateTimeHistograms.qmd + - text: "TabularDescriptionTables" + file: validmind/tests/data_validation/TabularDescriptionTables.qmd + - text: "TabularNumericalHistograms" + file: validmind/tests/data_validation/TabularNumericalHistograms.qmd + - text: "TargetRateBarPlots" + file: validmind/tests/data_validation/TargetRateBarPlots.qmd + - text: "TextDescription" + file: validmind/tests/data_validation/nlp/TextDescription.qmd + - text: "TimeSeriesDescription" + file: validmind/tests/data_validation/TimeSeriesDescription.qmd + - text: "TimeSeriesDescriptiveStatistics" + file: validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd + - text: "TimeSeriesFrequency" + file: validmind/tests/data_validation/TimeSeriesFrequency.qmd + - text: "TimeSeriesHistogram" + file: validmind/tests/data_validation/TimeSeriesHistogram.qmd + - text: "TimeSeriesLinePlot" + file: validmind/tests/data_validation/TimeSeriesLinePlot.qmd + - text: "TimeSeriesMissingValues" + file: validmind/tests/data_validation/TimeSeriesMissingValues.qmd + - text: "TimeSeriesOutliers" + file: validmind/tests/data_validation/TimeSeriesOutliers.qmd + - text: "TooManyZeroValues" + file: validmind/tests/data_validation/TooManyZeroValues.qmd + - text: "Toxicity" + file: validmind/tests/data_validation/nlp/Toxicity.qmd + - text: "UniqueRows" + file: validmind/tests/data_validation/UniqueRows.qmd + - text: "WOEBinPlots" + file: validmind/tests/data_validation/WOEBinPlots.qmd + - text: "WOEBinTable" + file: validmind/tests/data_validation/WOEBinTable.qmd + - text: "ZivotAndrewsArch" + file: validmind/tests/data_validation/ZivotAndrewsArch.qmd + - text: "nlp" + file: validmind/tests/data_validation/nlp.qmd + - text: "model_validation" + file: validmind/tests/model_validation.qmd + contents: + - text: "AdjustedMutualInformation" + file: validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd + - text: "AdjustedRandIndex" + file: validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd + - text: "AutoARIMA" + file: validmind/tests/model_validation/statsmodels/AutoARIMA.qmd + - text: "BertScore" + file: validmind/tests/model_validation/BertScore.qmd + - text: "BleuScore" + file: validmind/tests/model_validation/BleuScore.qmd + - text: "CalibrationCurve" + file: validmind/tests/model_validation/sklearn/CalibrationCurve.qmd + - text: "ClassifierPerformance" + file: validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd + - text: "ClassifierThresholdOptimization" + file: validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd + - text: "ClusterCosineSimilarity" + file: validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd + - text: "ClusterPerformanceMetrics" + file: validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd + - text: "ClusterSizeDistribution" + file: validmind/tests/model_validation/ClusterSizeDistribution.qmd + - text: "CompletenessScore" + file: validmind/tests/model_validation/sklearn/CompletenessScore.qmd + - text: "ConfusionMatrix" + file: validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd + - text: "ContextualRecall" + file: validmind/tests/model_validation/ContextualRecall.qmd + - text: "CumulativePredictionProbabilities" + file: validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd + - text: "DurbinWatsonTest" + file: validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd + - text: "FeatureImportance" + file: validmind/tests/model_validation/sklearn/FeatureImportance.qmd + - text: "FeaturesAUC" + file: validmind/tests/model_validation/FeaturesAUC.qmd + - text: "FowlkesMallowsScore" + file: validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd + - text: "GINITable" + file: validmind/tests/model_validation/statsmodels/GINITable.qmd + - text: "HomogeneityScore" + file: validmind/tests/model_validation/sklearn/HomogeneityScore.qmd + - text: "HyperParametersTuning" + file: validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd + - text: "KMeansClustersOptimization" + file: validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd + - text: "KolmogorovSmirnov" + file: validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd + - text: "Lilliefors" + file: validmind/tests/model_validation/statsmodels/Lilliefors.qmd + - text: "MeteorScore" + file: validmind/tests/model_validation/MeteorScore.qmd + - text: "MinimumAccuracy" + file: validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd + - text: "MinimumF1Score" + file: validmind/tests/model_validation/sklearn/MinimumF1Score.qmd + - text: "MinimumROCAUCScore" + file: validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd + - text: "ModelMetadata" + file: validmind/tests/model_validation/ModelMetadata.qmd + - text: "ModelParameters" + file: validmind/tests/model_validation/sklearn/ModelParameters.qmd + - text: "ModelPredictionResiduals" + file: validmind/tests/model_validation/ModelPredictionResiduals.qmd + - text: "ModelsPerformanceComparison" + file: validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd + - text: "OverfitDiagnosis" + file: validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd + - text: "PermutationFeatureImportance" + file: validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd + - text: "PopulationStabilityIndex" + file: validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd + - text: "PrecisionRecallCurve" + file: validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd + - text: "PredictionProbabilitiesHistogram" + file: validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd + - text: "ROCCurve" + file: validmind/tests/model_validation/sklearn/ROCCurve.qmd + - text: "RegardScore" + file: validmind/tests/model_validation/RegardScore.qmd + - text: "RegressionCoeffs" + file: validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd + - text: "RegressionErrors" + file: validmind/tests/model_validation/sklearn/RegressionErrors.qmd + - text: "RegressionErrorsComparison" + file: validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd + - text: "RegressionFeatureSignificance" + file: validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd + - text: "RegressionModelForecastPlot" + file: validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd + - text: "RegressionModelForecastPlotLevels" + file: validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd + - text: "RegressionModelSensitivityPlot" + file: validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd + - text: "RegressionModelSummary" + file: validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd + - text: "RegressionPerformance" + file: validmind/tests/model_validation/sklearn/RegressionPerformance.qmd + - text: "RegressionPermutationFeatureImportance" + file: validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd + - text: "RegressionR2Square" + file: validmind/tests/model_validation/sklearn/RegressionR2Square.qmd + - text: "RegressionR2SquareComparison" + file: validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd + - text: "RegressionResidualsPlot" + file: validmind/tests/model_validation/RegressionResidualsPlot.qmd + - text: "RobustnessDiagnosis" + file: validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd + - text: "RougeScore" + file: validmind/tests/model_validation/RougeScore.qmd + - text: "SHAPGlobalImportance" + file: validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd + - text: "ScoreProbabilityAlignment" + file: validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd + - text: "ScorecardHistogram" + file: validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd + - text: "SilhouettePlot" + file: validmind/tests/model_validation/sklearn/SilhouettePlot.qmd + - text: "TimeSeriesPredictionWithCI" + file: validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd + - text: "TimeSeriesPredictionsPlot" + file: validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd + - text: "TimeSeriesR2SquareBySegments" + file: validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd + - text: "TokenDisparity" + file: validmind/tests/model_validation/TokenDisparity.qmd + - text: "ToxicityScore" + file: validmind/tests/model_validation/ToxicityScore.qmd + - text: "TrainingTestDegradation" + file: validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd + - text: "VMeasure" + file: validmind/tests/model_validation/sklearn/VMeasure.qmd + - text: "WeakspotsDiagnosis" + file: validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd + - text: "sklearn" + file: validmind/tests/model_validation/sklearn.qmd + - text: "statsmodels" + file: validmind/tests/model_validation/statsmodels.qmd + - text: "statsutils" + file: validmind/tests/model_validation/statsmodels/statsutils.qmd + - text: "prompt_validation" + file: validmind/tests/prompt_validation.qmd + contents: + - text: "Bias" + file: validmind/tests/prompt_validation/Bias.qmd + - text: "Clarity" + file: validmind/tests/prompt_validation/Clarity.qmd + - text: "Conciseness" + file: validmind/tests/prompt_validation/Conciseness.qmd + - text: "Delimitation" + file: validmind/tests/prompt_validation/Delimitation.qmd + - text: "NegativeInstruction" + file: validmind/tests/prompt_validation/NegativeInstruction.qmd + - text: "Robustness" + file: validmind/tests/prompt_validation/Robustness.qmd + - text: "Specificity" + file: validmind/tests/prompt_validation/Specificity.qmd + - text: "ai_powered_test" + file: validmind/tests/prompt_validation/ai_powered_test.qmd - text: "unit_metrics" file: reference/validmind/unit_metrics.qmd - text: "vm_models" diff --git a/docs/templates/sidebar.qmd.jinja2 b/docs/templates/sidebar.qmd.jinja2 index 8d97a6e56..d408ba182 100644 --- a/docs/templates/sidebar.qmd.jinja2 +++ b/docs/templates/sidebar.qmd.jinja2 @@ -23,11 +23,28 @@ website: {% for member in module.members | sort_members %} {% if is_public(member, module, full_data, is_root) and member.kind == "module" %} {% set module_name = member.name %} + {% set has_children = qmd_files | has_subfiles(module_name) %} + {% if has_children %} - text: "{{ module_name }}" file: reference/validmind/{{ module_name }}.qmd - {% if module_name in ['datasets', 'test_suites', 'tests'] %} contents: - - reference/validmind/{{ module_name }}/** - {% endif %} + {% for item in qmd_files | get_child_files(module_name) %} + {% if item.contents is defined %} + - text: "{{ item.text }}" + file: {{ item.file }} + contents: + {% for child in item.contents %} + - text: "{{ child.text }}" + file: {{ child.file }} + {% endfor %} + {% else %} + - text: "{{ item.text }}" + file: {{ item.file }} + {% endif %} + {% endfor %} + {% else %} + - text: "{{ module_name }}" + file: reference/validmind/{{ module_name }}.qmd + {% endif %} {% endif %} {% endfor %} \ No newline at end of file diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index ddc30a6e5..3472ff246 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -420,14 +420,66 @@ def generate_module_doc(module, full_data, env, output_dir): with open(output_path, 'w') as f: f.write(output) -def find_qmd_files(base_path: str) -> Dict[str, List[str]]: - """Find all .qmd files and their associated folders in docs/validmind.""" - # print("\nEntering find_qmd_files()") - # print(f"\nFiles written during documentation generation (count: {len(written_qmd_files)}):") - # for filename, path in written_qmd_files.items(): - # print(f" {filename}: {path}") - - return written_qmd_files +def get_child_files(files_dict: Dict[str, str], module_name: str) -> List[Dict[str, Any]]: + """Get all child QMD files for a given module.""" + prefix = f'docs/validmind/{module_name}/' + directory_structure = {} + + # First pass: organize files by directory + for filename, path in files_dict.items(): + if path.startswith(prefix) and path != f'docs/validmind/{module_name}.qmd': + # Remove the prefix to get the relative path + rel_path = path.replace('docs/', '') + parts = Path(rel_path).parts[2:] # Skip 'validmind' and module_name + + # Handle directory-level QMD and its children + if len(parts) == 1: # Direct child + dir_name = Path(parts[0]).stem + if dir_name not in directory_structure: + directory_structure[dir_name] = { + 'text': dir_name, + 'file': rel_path + } + else: # Nested file + dir_name = parts[0] + if dir_name not in directory_structure: + directory_structure[dir_name] = { + 'text': dir_name, + 'file': f'validmind/{module_name}/{dir_name}.qmd' + } + + # Add to contents if it's a child file + if 'contents' not in directory_structure[dir_name]: + directory_structure[dir_name]['contents'] = [] + + directory_structure[dir_name]['contents'].append({ + 'text': Path(parts[-1]).stem, + 'file': rel_path + }) + + # Sort children within each directory + for dir_info in directory_structure.values(): + if 'contents' in dir_info: + dir_info['contents'].sort(key=lambda x: x['text']) + + # Return sorted list of directories + return sorted(directory_structure.values(), key=lambda x: x['text']) + +def has_subfiles(files_dict, module_name): + """Check if a module has child QMD files.""" + prefix = f'docs/validmind/{module_name}/' + return any(path.startswith(prefix) for path in files_dict.values()) + +def find_qmd_files(base_path: str) -> Dict[str, str]: + """Find all .qmd files and their associated paths.""" + # Convert the written_qmd_files paths to be relative to docs/ + relative_paths = {} + for filename, path in written_qmd_files.items(): + if path.startswith('docs/'): + relative_paths[filename] = path + else: + relative_paths[filename] = f'docs/{path}' + return relative_paths def generate_docs(json_path: str, template_dir: str, output_dir: str): """Generate documentation from JSON data using templates.""" @@ -447,6 +499,8 @@ def generate_docs(json_path: str, template_dir: str, output_dir: str): # Add custom filters and globals env.filters['sort_members'] = sort_members + env.filters['has_subfiles'] = has_subfiles + env.filters['get_child_files'] = get_child_files env.globals['is_public'] = is_public env.globals['resolve_alias'] = resolve_alias env.globals['get_all_members'] = get_all_members From 5f7559e53afe552459b25046672427495225cb8a Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 29 Jan 2025 20:34:45 -0800 Subject: [PATCH 032/207] Save point with first complete sidebar --- scripts/generate_quarto_docs.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 3472ff246..918bb79ee 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -425,6 +425,12 @@ def get_child_files(files_dict: Dict[str, str], module_name: str) -> List[Dict[s prefix = f'docs/validmind/{module_name}/' directory_structure = {} + def ensure_reference_path(path: str) -> str: + """Ensure path starts with reference/""" + if path.startswith('validmind/'): + return f'reference/{path}' + return path + # First pass: organize files by directory for filename, path in files_dict.items(): if path.startswith(prefix) and path != f'docs/validmind/{module_name}.qmd': @@ -438,14 +444,14 @@ def get_child_files(files_dict: Dict[str, str], module_name: str) -> List[Dict[s if dir_name not in directory_structure: directory_structure[dir_name] = { 'text': dir_name, - 'file': rel_path + 'file': ensure_reference_path(rel_path) } else: # Nested file dir_name = parts[0] if dir_name not in directory_structure: directory_structure[dir_name] = { 'text': dir_name, - 'file': f'validmind/{module_name}/{dir_name}.qmd' + 'file': ensure_reference_path(f'validmind/{module_name}/{dir_name}.qmd') } # Add to contents if it's a child file @@ -454,7 +460,7 @@ def get_child_files(files_dict: Dict[str, str], module_name: str) -> List[Dict[s directory_structure[dir_name]['contents'].append({ 'text': Path(parts[-1]).stem, - 'file': rel_path + 'file': ensure_reference_path(rel_path) }) # Sort children within each directory From f1efb981bcbefa573c563c1776d19feb86517d5e Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 29 Jan 2025 20:41:14 -0800 Subject: [PATCH 033/207] Sidebar works --- docs/_sidebar.yml | 346 ++++++++++++++++---------------- scripts/generate_quarto_docs.py | 12 +- 2 files changed, 176 insertions(+), 182 deletions(-) diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml index d9f7297db..e2d2b8bf1 100644 --- a/docs/_sidebar.yml +++ b/docs/_sidebar.yml @@ -42,366 +42,366 @@ website: file: reference/validmind/datasets.qmd contents: - text: "classification" - file: validmind/datasets/classification.qmd + file: reference/validmind/datasets/classification.qmd contents: - text: "customer_churn" - file: validmind/datasets/classification/customer_churn.qmd + file: reference/validmind/datasets/classification/customer_churn.qmd - text: "taiwan_credit" - file: validmind/datasets/classification/taiwan_credit.qmd + file: reference/validmind/datasets/classification/taiwan_credit.qmd - text: "credit_risk" - file: validmind/datasets/credit_risk.qmd + file: reference/validmind/datasets/credit_risk.qmd contents: - text: "lending_club_bias" - file: validmind/datasets/credit_risk/lending_club_bias.qmd + file: reference/validmind/datasets/credit_risk/lending_club_bias.qmd - text: "nlp" - file: validmind/datasets/nlp.qmd + file: reference/validmind/datasets/nlp.qmd contents: - text: "cnn_dailymail" - file: validmind/datasets/nlp/cnn_dailymail.qmd + file: reference/validmind/datasets/nlp/cnn_dailymail.qmd - text: "twitter_covid_19" - file: validmind/datasets/nlp/twitter_covid_19.qmd + file: reference/validmind/datasets/nlp/twitter_covid_19.qmd - text: "regression" - file: validmind/datasets/regression.qmd + file: reference/validmind/datasets/regression.qmd contents: - text: "fred" - file: validmind/datasets/regression/fred.qmd + file: reference/validmind/datasets/regression/fred.qmd - text: "lending_club" - file: validmind/datasets/regression/lending_club.qmd + file: reference/validmind/datasets/regression/lending_club.qmd - text: "errors" file: reference/validmind/errors.qmd - text: "test_suites" file: reference/validmind/test_suites.qmd contents: - text: "classifier" - file: validmind/test_suites/classifier.qmd + file: reference/validmind/test_suites/classifier.qmd - text: "cluster" - file: validmind/test_suites/cluster.qmd + file: reference/validmind/test_suites/cluster.qmd - text: "embeddings" - file: validmind/test_suites/embeddings.qmd + file: reference/validmind/test_suites/embeddings.qmd - text: "llm" - file: validmind/test_suites/llm.qmd + file: reference/validmind/test_suites/llm.qmd - text: "parameters_optimization" - file: validmind/test_suites/parameters_optimization.qmd + file: reference/validmind/test_suites/parameters_optimization.qmd - text: "regression" - file: validmind/test_suites/regression.qmd + file: reference/validmind/test_suites/regression.qmd - text: "statsmodels_timeseries" - file: validmind/test_suites/statsmodels_timeseries.qmd + file: reference/validmind/test_suites/statsmodels_timeseries.qmd - text: "summarization" - file: validmind/test_suites/summarization.qmd + file: reference/validmind/test_suites/summarization.qmd - text: "tabular_datasets" - file: validmind/test_suites/tabular_datasets.qmd + file: reference/validmind/test_suites/tabular_datasets.qmd - text: "text_data" - file: validmind/test_suites/text_data.qmd + file: reference/validmind/test_suites/text_data.qmd - text: "time_series" - file: validmind/test_suites/time_series.qmd + file: reference/validmind/test_suites/time_series.qmd - text: "tests" file: reference/validmind/tests.qmd contents: - text: "data_validation" - file: validmind/tests/data_validation.qmd + file: reference/validmind/tests/data_validation.qmd contents: - text: "ACFandPACFPlot" - file: validmind/tests/data_validation/ACFandPACFPlot.qmd + file: reference/validmind/tests/data_validation/ACFandPACFPlot.qmd - text: "ADF" - file: validmind/tests/data_validation/ADF.qmd + file: reference/validmind/tests/data_validation/ADF.qmd - text: "AutoAR" - file: validmind/tests/data_validation/AutoAR.qmd + file: reference/validmind/tests/data_validation/AutoAR.qmd - text: "AutoMA" - file: validmind/tests/data_validation/AutoMA.qmd + file: reference/validmind/tests/data_validation/AutoMA.qmd - text: "AutoStationarity" - file: validmind/tests/data_validation/AutoStationarity.qmd + file: reference/validmind/tests/data_validation/AutoStationarity.qmd - text: "BivariateScatterPlots" - file: validmind/tests/data_validation/BivariateScatterPlots.qmd + file: reference/validmind/tests/data_validation/BivariateScatterPlots.qmd - text: "BoxPierce" - file: validmind/tests/data_validation/BoxPierce.qmd + file: reference/validmind/tests/data_validation/BoxPierce.qmd - text: "ChiSquaredFeaturesTable" - file: validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd + file: reference/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd - text: "ClassImbalance" - file: validmind/tests/data_validation/ClassImbalance.qmd + file: reference/validmind/tests/data_validation/ClassImbalance.qmd - text: "CommonWords" - file: validmind/tests/data_validation/nlp/CommonWords.qmd + file: reference/validmind/tests/data_validation/nlp/CommonWords.qmd - text: "DatasetDescription" - file: validmind/tests/data_validation/DatasetDescription.qmd + file: reference/validmind/tests/data_validation/DatasetDescription.qmd - text: "DatasetSplit" - file: validmind/tests/data_validation/DatasetSplit.qmd + file: reference/validmind/tests/data_validation/DatasetSplit.qmd - text: "DescriptiveStatistics" - file: validmind/tests/data_validation/DescriptiveStatistics.qmd + file: reference/validmind/tests/data_validation/DescriptiveStatistics.qmd - text: "DickeyFullerGLS" - file: validmind/tests/data_validation/DickeyFullerGLS.qmd + file: reference/validmind/tests/data_validation/DickeyFullerGLS.qmd - text: "Duplicates" - file: validmind/tests/data_validation/Duplicates.qmd + file: reference/validmind/tests/data_validation/Duplicates.qmd - text: "EngleGrangerCoint" - file: validmind/tests/data_validation/EngleGrangerCoint.qmd + file: reference/validmind/tests/data_validation/EngleGrangerCoint.qmd - text: "FeatureTargetCorrelationPlot" - file: validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd + file: reference/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd - text: "Hashtags" - file: validmind/tests/data_validation/nlp/Hashtags.qmd + file: reference/validmind/tests/data_validation/nlp/Hashtags.qmd - text: "HighCardinality" - file: validmind/tests/data_validation/HighCardinality.qmd + file: reference/validmind/tests/data_validation/HighCardinality.qmd - text: "HighPearsonCorrelation" - file: validmind/tests/data_validation/HighPearsonCorrelation.qmd + file: reference/validmind/tests/data_validation/HighPearsonCorrelation.qmd - text: "IQROutliersBarPlot" - file: validmind/tests/data_validation/IQROutliersBarPlot.qmd + file: reference/validmind/tests/data_validation/IQROutliersBarPlot.qmd - text: "IQROutliersTable" - file: validmind/tests/data_validation/IQROutliersTable.qmd + file: reference/validmind/tests/data_validation/IQROutliersTable.qmd - text: "IsolationForestOutliers" - file: validmind/tests/data_validation/IsolationForestOutliers.qmd + file: reference/validmind/tests/data_validation/IsolationForestOutliers.qmd - text: "JarqueBera" - file: validmind/tests/data_validation/JarqueBera.qmd + file: reference/validmind/tests/data_validation/JarqueBera.qmd - text: "KPSS" - file: validmind/tests/data_validation/KPSS.qmd + file: reference/validmind/tests/data_validation/KPSS.qmd - text: "LJungBox" - file: validmind/tests/data_validation/LJungBox.qmd + file: reference/validmind/tests/data_validation/LJungBox.qmd - text: "LaggedCorrelationHeatmap" - file: validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd + file: reference/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd - text: "LanguageDetection" - file: validmind/tests/data_validation/nlp/LanguageDetection.qmd + file: reference/validmind/tests/data_validation/nlp/LanguageDetection.qmd - text: "Mentions" - file: validmind/tests/data_validation/nlp/Mentions.qmd + file: reference/validmind/tests/data_validation/nlp/Mentions.qmd - text: "MissingValues" - file: validmind/tests/data_validation/MissingValues.qmd + file: reference/validmind/tests/data_validation/MissingValues.qmd - text: "MissingValuesBarPlot" - file: validmind/tests/data_validation/MissingValuesBarPlot.qmd + file: reference/validmind/tests/data_validation/MissingValuesBarPlot.qmd - text: "MutualInformation" - file: validmind/tests/data_validation/MutualInformation.qmd + file: reference/validmind/tests/data_validation/MutualInformation.qmd - text: "PearsonCorrelationMatrix" - file: validmind/tests/data_validation/PearsonCorrelationMatrix.qmd + file: reference/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd - text: "PhillipsPerronArch" - file: validmind/tests/data_validation/PhillipsPerronArch.qmd + file: reference/validmind/tests/data_validation/PhillipsPerronArch.qmd - text: "PolarityAndSubjectivity" - file: validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd + file: reference/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd - text: "ProtectedClassesCombination" - file: validmind/tests/data_validation/ProtectedClassesCombination.qmd + file: reference/validmind/tests/data_validation/ProtectedClassesCombination.qmd - text: "ProtectedClassesDescription" - file: validmind/tests/data_validation/ProtectedClassesDescription.qmd + file: reference/validmind/tests/data_validation/ProtectedClassesDescription.qmd - text: "ProtectedClassesDisparity" - file: validmind/tests/data_validation/ProtectedClassesDisparity.qmd + file: reference/validmind/tests/data_validation/ProtectedClassesDisparity.qmd - text: "ProtectedClassesThresholdOptimizer" - file: validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd + file: reference/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd - text: "Punctuations" - file: validmind/tests/data_validation/nlp/Punctuations.qmd + file: reference/validmind/tests/data_validation/nlp/Punctuations.qmd - text: "RollingStatsPlot" - file: validmind/tests/data_validation/RollingStatsPlot.qmd + file: reference/validmind/tests/data_validation/RollingStatsPlot.qmd - text: "RunsTest" - file: validmind/tests/data_validation/RunsTest.qmd + file: reference/validmind/tests/data_validation/RunsTest.qmd - text: "ScatterPlot" - file: validmind/tests/data_validation/ScatterPlot.qmd + file: reference/validmind/tests/data_validation/ScatterPlot.qmd - text: "ScoreBandDefaultRates" - file: validmind/tests/data_validation/ScoreBandDefaultRates.qmd + file: reference/validmind/tests/data_validation/ScoreBandDefaultRates.qmd - text: "SeasonalDecompose" - file: validmind/tests/data_validation/SeasonalDecompose.qmd + file: reference/validmind/tests/data_validation/SeasonalDecompose.qmd - text: "Sentiment" - file: validmind/tests/data_validation/nlp/Sentiment.qmd + file: reference/validmind/tests/data_validation/nlp/Sentiment.qmd - text: "ShapiroWilk" - file: validmind/tests/data_validation/ShapiroWilk.qmd + file: reference/validmind/tests/data_validation/ShapiroWilk.qmd - text: "Skewness" - file: validmind/tests/data_validation/Skewness.qmd + file: reference/validmind/tests/data_validation/Skewness.qmd - text: "SpreadPlot" - file: validmind/tests/data_validation/SpreadPlot.qmd + file: reference/validmind/tests/data_validation/SpreadPlot.qmd - text: "StopWords" - file: validmind/tests/data_validation/nlp/StopWords.qmd + file: reference/validmind/tests/data_validation/nlp/StopWords.qmd - text: "TabularCategoricalBarPlots" - file: validmind/tests/data_validation/TabularCategoricalBarPlots.qmd + file: reference/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd - text: "TabularDateTimeHistograms" - file: validmind/tests/data_validation/TabularDateTimeHistograms.qmd + file: reference/validmind/tests/data_validation/TabularDateTimeHistograms.qmd - text: "TabularDescriptionTables" - file: validmind/tests/data_validation/TabularDescriptionTables.qmd + file: reference/validmind/tests/data_validation/TabularDescriptionTables.qmd - text: "TabularNumericalHistograms" - file: validmind/tests/data_validation/TabularNumericalHistograms.qmd + file: reference/validmind/tests/data_validation/TabularNumericalHistograms.qmd - text: "TargetRateBarPlots" - file: validmind/tests/data_validation/TargetRateBarPlots.qmd + file: reference/validmind/tests/data_validation/TargetRateBarPlots.qmd - text: "TextDescription" - file: validmind/tests/data_validation/nlp/TextDescription.qmd + file: reference/validmind/tests/data_validation/nlp/TextDescription.qmd - text: "TimeSeriesDescription" - file: validmind/tests/data_validation/TimeSeriesDescription.qmd + file: reference/validmind/tests/data_validation/TimeSeriesDescription.qmd - text: "TimeSeriesDescriptiveStatistics" - file: validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd + file: reference/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd - text: "TimeSeriesFrequency" - file: validmind/tests/data_validation/TimeSeriesFrequency.qmd + file: reference/validmind/tests/data_validation/TimeSeriesFrequency.qmd - text: "TimeSeriesHistogram" - file: validmind/tests/data_validation/TimeSeriesHistogram.qmd + file: reference/validmind/tests/data_validation/TimeSeriesHistogram.qmd - text: "TimeSeriesLinePlot" - file: validmind/tests/data_validation/TimeSeriesLinePlot.qmd + file: reference/validmind/tests/data_validation/TimeSeriesLinePlot.qmd - text: "TimeSeriesMissingValues" - file: validmind/tests/data_validation/TimeSeriesMissingValues.qmd + file: reference/validmind/tests/data_validation/TimeSeriesMissingValues.qmd - text: "TimeSeriesOutliers" - file: validmind/tests/data_validation/TimeSeriesOutliers.qmd + file: reference/validmind/tests/data_validation/TimeSeriesOutliers.qmd - text: "TooManyZeroValues" - file: validmind/tests/data_validation/TooManyZeroValues.qmd + file: reference/validmind/tests/data_validation/TooManyZeroValues.qmd - text: "Toxicity" - file: validmind/tests/data_validation/nlp/Toxicity.qmd + file: reference/validmind/tests/data_validation/nlp/Toxicity.qmd - text: "UniqueRows" - file: validmind/tests/data_validation/UniqueRows.qmd + file: reference/validmind/tests/data_validation/UniqueRows.qmd - text: "WOEBinPlots" - file: validmind/tests/data_validation/WOEBinPlots.qmd + file: reference/validmind/tests/data_validation/WOEBinPlots.qmd - text: "WOEBinTable" - file: validmind/tests/data_validation/WOEBinTable.qmd + file: reference/validmind/tests/data_validation/WOEBinTable.qmd - text: "ZivotAndrewsArch" - file: validmind/tests/data_validation/ZivotAndrewsArch.qmd + file: reference/validmind/tests/data_validation/ZivotAndrewsArch.qmd - text: "nlp" - file: validmind/tests/data_validation/nlp.qmd + file: reference/validmind/tests/data_validation/nlp.qmd - text: "model_validation" - file: validmind/tests/model_validation.qmd + file: reference/validmind/tests/model_validation.qmd contents: - text: "AdjustedMutualInformation" - file: validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd + file: reference/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd - text: "AdjustedRandIndex" - file: validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd + file: reference/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd - text: "AutoARIMA" - file: validmind/tests/model_validation/statsmodels/AutoARIMA.qmd + file: reference/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd - text: "BertScore" - file: validmind/tests/model_validation/BertScore.qmd + file: reference/validmind/tests/model_validation/BertScore.qmd - text: "BleuScore" - file: validmind/tests/model_validation/BleuScore.qmd + file: reference/validmind/tests/model_validation/BleuScore.qmd - text: "CalibrationCurve" - file: validmind/tests/model_validation/sklearn/CalibrationCurve.qmd + file: reference/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd - text: "ClassifierPerformance" - file: validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd + file: reference/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd - text: "ClassifierThresholdOptimization" - file: validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd + file: reference/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd - text: "ClusterCosineSimilarity" - file: validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd + file: reference/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd - text: "ClusterPerformanceMetrics" - file: validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd + file: reference/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd - text: "ClusterSizeDistribution" - file: validmind/tests/model_validation/ClusterSizeDistribution.qmd + file: reference/validmind/tests/model_validation/ClusterSizeDistribution.qmd - text: "CompletenessScore" - file: validmind/tests/model_validation/sklearn/CompletenessScore.qmd + file: reference/validmind/tests/model_validation/sklearn/CompletenessScore.qmd - text: "ConfusionMatrix" - file: validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd + file: reference/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd - text: "ContextualRecall" - file: validmind/tests/model_validation/ContextualRecall.qmd + file: reference/validmind/tests/model_validation/ContextualRecall.qmd - text: "CumulativePredictionProbabilities" - file: validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd + file: reference/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd - text: "DurbinWatsonTest" - file: validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd + file: reference/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd - text: "FeatureImportance" - file: validmind/tests/model_validation/sklearn/FeatureImportance.qmd + file: reference/validmind/tests/model_validation/sklearn/FeatureImportance.qmd - text: "FeaturesAUC" - file: validmind/tests/model_validation/FeaturesAUC.qmd + file: reference/validmind/tests/model_validation/FeaturesAUC.qmd - text: "FowlkesMallowsScore" - file: validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd + file: reference/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd - text: "GINITable" - file: validmind/tests/model_validation/statsmodels/GINITable.qmd + file: reference/validmind/tests/model_validation/statsmodels/GINITable.qmd - text: "HomogeneityScore" - file: validmind/tests/model_validation/sklearn/HomogeneityScore.qmd + file: reference/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd - text: "HyperParametersTuning" - file: validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd + file: reference/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd - text: "KMeansClustersOptimization" - file: validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd + file: reference/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd - text: "KolmogorovSmirnov" - file: validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd + file: reference/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd - text: "Lilliefors" - file: validmind/tests/model_validation/statsmodels/Lilliefors.qmd + file: reference/validmind/tests/model_validation/statsmodels/Lilliefors.qmd - text: "MeteorScore" - file: validmind/tests/model_validation/MeteorScore.qmd + file: reference/validmind/tests/model_validation/MeteorScore.qmd - text: "MinimumAccuracy" - file: validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd + file: reference/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd - text: "MinimumF1Score" - file: validmind/tests/model_validation/sklearn/MinimumF1Score.qmd + file: reference/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd - text: "MinimumROCAUCScore" - file: validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd + file: reference/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd - text: "ModelMetadata" - file: validmind/tests/model_validation/ModelMetadata.qmd + file: reference/validmind/tests/model_validation/ModelMetadata.qmd - text: "ModelParameters" - file: validmind/tests/model_validation/sklearn/ModelParameters.qmd + file: reference/validmind/tests/model_validation/sklearn/ModelParameters.qmd - text: "ModelPredictionResiduals" - file: validmind/tests/model_validation/ModelPredictionResiduals.qmd + file: reference/validmind/tests/model_validation/ModelPredictionResiduals.qmd - text: "ModelsPerformanceComparison" - file: validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd + file: reference/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd - text: "OverfitDiagnosis" - file: validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd + file: reference/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd - text: "PermutationFeatureImportance" - file: validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd + file: reference/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd - text: "PopulationStabilityIndex" - file: validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd + file: reference/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd - text: "PrecisionRecallCurve" - file: validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd + file: reference/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd - text: "PredictionProbabilitiesHistogram" - file: validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd + file: reference/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd - text: "ROCCurve" - file: validmind/tests/model_validation/sklearn/ROCCurve.qmd + file: reference/validmind/tests/model_validation/sklearn/ROCCurve.qmd - text: "RegardScore" - file: validmind/tests/model_validation/RegardScore.qmd + file: reference/validmind/tests/model_validation/RegardScore.qmd - text: "RegressionCoeffs" - file: validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd + file: reference/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd - text: "RegressionErrors" - file: validmind/tests/model_validation/sklearn/RegressionErrors.qmd + file: reference/validmind/tests/model_validation/sklearn/RegressionErrors.qmd - text: "RegressionErrorsComparison" - file: validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd + file: reference/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd - text: "RegressionFeatureSignificance" - file: validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd + file: reference/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd - text: "RegressionModelForecastPlot" - file: validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd + file: reference/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd - text: "RegressionModelForecastPlotLevels" - file: validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd + file: reference/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd - text: "RegressionModelSensitivityPlot" - file: validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd + file: reference/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd - text: "RegressionModelSummary" - file: validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd + file: reference/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd - text: "RegressionPerformance" - file: validmind/tests/model_validation/sklearn/RegressionPerformance.qmd + file: reference/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd - text: "RegressionPermutationFeatureImportance" - file: validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd + file: reference/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd - text: "RegressionR2Square" - file: validmind/tests/model_validation/sklearn/RegressionR2Square.qmd + file: reference/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd - text: "RegressionR2SquareComparison" - file: validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd + file: reference/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd - text: "RegressionResidualsPlot" - file: validmind/tests/model_validation/RegressionResidualsPlot.qmd + file: reference/validmind/tests/model_validation/RegressionResidualsPlot.qmd - text: "RobustnessDiagnosis" - file: validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd + file: reference/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd - text: "RougeScore" - file: validmind/tests/model_validation/RougeScore.qmd + file: reference/validmind/tests/model_validation/RougeScore.qmd - text: "SHAPGlobalImportance" - file: validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd + file: reference/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd - text: "ScoreProbabilityAlignment" - file: validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd + file: reference/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd - text: "ScorecardHistogram" - file: validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd + file: reference/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd - text: "SilhouettePlot" - file: validmind/tests/model_validation/sklearn/SilhouettePlot.qmd + file: reference/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd - text: "TimeSeriesPredictionWithCI" - file: validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd + file: reference/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd - text: "TimeSeriesPredictionsPlot" - file: validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd + file: reference/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd - text: "TimeSeriesR2SquareBySegments" - file: validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd + file: reference/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd - text: "TokenDisparity" - file: validmind/tests/model_validation/TokenDisparity.qmd + file: reference/validmind/tests/model_validation/TokenDisparity.qmd - text: "ToxicityScore" - file: validmind/tests/model_validation/ToxicityScore.qmd + file: reference/validmind/tests/model_validation/ToxicityScore.qmd - text: "TrainingTestDegradation" - file: validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd + file: reference/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd - text: "VMeasure" - file: validmind/tests/model_validation/sklearn/VMeasure.qmd + file: reference/validmind/tests/model_validation/sklearn/VMeasure.qmd - text: "WeakspotsDiagnosis" - file: validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd + file: reference/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd - text: "sklearn" - file: validmind/tests/model_validation/sklearn.qmd + file: reference/validmind/tests/model_validation/sklearn.qmd - text: "statsmodels" - file: validmind/tests/model_validation/statsmodels.qmd + file: reference/validmind/tests/model_validation/statsmodels.qmd - text: "statsutils" - file: validmind/tests/model_validation/statsmodels/statsutils.qmd + file: reference/validmind/tests/model_validation/statsmodels/statsutils.qmd - text: "prompt_validation" - file: validmind/tests/prompt_validation.qmd + file: reference/validmind/tests/prompt_validation.qmd contents: - text: "Bias" - file: validmind/tests/prompt_validation/Bias.qmd + file: reference/validmind/tests/prompt_validation/Bias.qmd - text: "Clarity" - file: validmind/tests/prompt_validation/Clarity.qmd + file: reference/validmind/tests/prompt_validation/Clarity.qmd - text: "Conciseness" - file: validmind/tests/prompt_validation/Conciseness.qmd + file: reference/validmind/tests/prompt_validation/Conciseness.qmd - text: "Delimitation" - file: validmind/tests/prompt_validation/Delimitation.qmd + file: reference/validmind/tests/prompt_validation/Delimitation.qmd - text: "NegativeInstruction" - file: validmind/tests/prompt_validation/NegativeInstruction.qmd + file: reference/validmind/tests/prompt_validation/NegativeInstruction.qmd - text: "Robustness" - file: validmind/tests/prompt_validation/Robustness.qmd + file: reference/validmind/tests/prompt_validation/Robustness.qmd - text: "Specificity" - file: validmind/tests/prompt_validation/Specificity.qmd + file: reference/validmind/tests/prompt_validation/Specificity.qmd - text: "ai_powered_test" - file: validmind/tests/prompt_validation/ai_powered_test.qmd + file: reference/validmind/tests/prompt_validation/ai_powered_test.qmd - text: "unit_metrics" file: reference/validmind/unit_metrics.qmd - text: "vm_models" diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 918bb79ee..4465a2e6b 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -425,12 +425,6 @@ def get_child_files(files_dict: Dict[str, str], module_name: str) -> List[Dict[s prefix = f'docs/validmind/{module_name}/' directory_structure = {} - def ensure_reference_path(path: str) -> str: - """Ensure path starts with reference/""" - if path.startswith('validmind/'): - return f'reference/{path}' - return path - # First pass: organize files by directory for filename, path in files_dict.items(): if path.startswith(prefix) and path != f'docs/validmind/{module_name}.qmd': @@ -444,14 +438,14 @@ def ensure_reference_path(path: str) -> str: if dir_name not in directory_structure: directory_structure[dir_name] = { 'text': dir_name, - 'file': ensure_reference_path(rel_path) + 'file': f'reference/{rel_path}' # Add reference/ prefix } else: # Nested file dir_name = parts[0] if dir_name not in directory_structure: directory_structure[dir_name] = { 'text': dir_name, - 'file': ensure_reference_path(f'validmind/{module_name}/{dir_name}.qmd') + 'file': f'reference/validmind/{module_name}/{dir_name}.qmd' # Add reference/ prefix } # Add to contents if it's a child file @@ -460,7 +454,7 @@ def ensure_reference_path(path: str) -> str: directory_structure[dir_name]['contents'].append({ 'text': Path(parts[-1]).stem, - 'file': ensure_reference_path(rel_path) + 'file': f'reference/{rel_path}' # Add reference/ prefix }) # Sort children within each directory From f523ec82533ad4cc3af0a7004d633172f5180931 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 29 Jan 2025 21:38:34 -0800 Subject: [PATCH 034/207] Add root-level classes --- docs/_sidebar.yml | 2 + docs/templates/module.qmd.jinja2 | 19 +++ docs/validmind.qmd | 199 ++++++++++++++++++++++++++++++- scripts/generate_quarto_docs.py | 36 +++++- 4 files changed, 251 insertions(+), 5 deletions(-) diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml index e2d2b8bf1..5032f3b06 100644 --- a/docs/_sidebar.yml +++ b/docs/_sidebar.yml @@ -23,6 +23,8 @@ website: file: reference/validmind.qmd#log_metric - text: "preview_template()" file: reference/validmind.qmd#preview_template + - text: "print_env()" + file: reference/validmind.qmd#print_env - text: "reload()" file: reference/validmind.qmd#reload - text: "run_documentation_tests()" diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index 1b011844d..04cb868b2 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -104,3 +104,22 @@ def {{ member.name }}( {% endif %} {% endfor %} {% endif %} + +{# Add this section at the end, after all existing code #} +{% if module.name == "validmind" %} +## Other Members + + +{% for member in module.members | sort_members %} + +{% if is_public(member, module, full_data, is_root) %} + +{% set resolved = resolve_alias(member, full_data) %} + +{% if member.kind == "class" or (member.kind == "alias" and member.target_path and member.target_path.split(".")[-1][0].isupper()) %} + +{% include "class.qmd.jinja2" with context %} +{% endif %} +{% endif %} +{% endfor %} +{% endif %} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index c98f54907..86ab8fe7b 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -35,7 +35,7 @@ After you have pasted the code snippet into your development source code and exe ### __version__ ```python -2.8.0 +2.8.4 ``` ### get_test_suite[()]{.muted} @@ -66,7 +66,8 @@ def init( api_secret: Optional = None, api_host: Optional = None, model: Optional = None, - monitoring: bool = False): + monitoring: bool = False, + generate_descriptions: Optional = None): ``` Initializes the API client instances and calls the /ping endpoint to ensure the provided credentials are valid and we can connect to the ValidMind API. @@ -81,6 +82,7 @@ If the API key and secret are not provided, the client will attempt to retrieve - **api_secret** str: The API secret. Defaults to None. - **api_host** str: The API host. Defaults to None. - **monitoring** bool: The ongoing monitoring flag. Defaults to False. +- **generate_descriptions** bool: Whether to use GenAI to generate test result descriptions. Defaults to True. **Raises** @@ -213,6 +215,15 @@ Preview the documentation template for the current project This function will di - **ValueError**: If the project has not been initialized +### print_env[()]{.muted} + +```python +def print_env( +): +``` + +Prints a log of the running environment for debugging. Output includes: ValidMind Library version, operating system details, installed dependencies, and the ISO 8601 timestamp at log creation. + ### reload[()]{.muted} ```python @@ -341,3 +352,187 @@ The function may also include a docstring. This docstring will be used and logge **Returns** - The decorated function. + +## Other Members + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +## [class]{.muted} RawData + +```python +class RawData(): +``` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 4465a2e6b..5c25d0694 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -9,19 +9,49 @@ from glob import glob import subprocess +# Add at module level +_alias_cache = {} # Cache for resolved aliases + def resolve_alias(member: Dict[str, Any], data: Dict[str, Any]) -> Dict[str, Any]: """Resolve an alias to its target member.""" if member.get('kind') == 'alias' and member.get('target_path'): - path_parts = member['target_path'].split('.') + target_path = member['target_path'] + + # Check cache first + if target_path in _alias_cache: + return _alias_cache[target_path] + + path_parts = target_path.split('.') # Skip resolution if it's not in our codebase if path_parts[0] != 'validmind': return member + + # Debug only for specific problematic paths + debug = any(x in target_path for x in ['vm_models.result.RawData', 'vm_models.result.Result']) + + if debug: + print(f"\nResolving alias: {target_path}") + current = data[path_parts[0]] # Start at validmind for part in path_parts[1:]: + if debug: + print(f" Resolving part: {part}") + print(f" Available members: {sorted(list(current.get('members', {}).keys()))}") + if part in current.get('members', {}): current = current['members'][part] else: + if debug: + print(f" Failed to find {part}") return member + + if debug: + print(f" Resolution successful") + print(f" Final kind: {current.get('kind')}") + print(f" Has docstring: {bool(current.get('docstring'))}") + + # Cache the result + _alias_cache[target_path] = current return current return member @@ -511,9 +541,9 @@ def generate_docs(json_path: str, template_dir: str, output_dir: str): # First pass: Generate module documentation process_module(data['validmind'], ['validmind'], env, data) - print("\nAbout to call find_qmd_files()") + # print("\nAbout to call find_qmd_files()") qmd_files = find_qmd_files(output_dir) - print(f"Found QMD files: {qmd_files}") + # print(f"Found QMD files: {qmd_files}") # Add to template context env.globals['qmd_files'] = qmd_files From 1878dbeb87186736cdc0da6d74d031d7bee218c1 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Thu, 30 Jan 2025 12:19:25 -0800 Subject: [PATCH 035/207] Undo save point --- docs/_sidebar.yml | 6 +- docs/templates/module.qmd.jinja2 | 45 +++++-- docs/templates/sidebar.qmd.jinja2 | 15 ++- docs/validmind.qmd | 190 ++++-------------------------- scripts/generate_quarto_docs.py | 12 +- 5 files changed, 81 insertions(+), 187 deletions(-) diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml index 5032f3b06..3510bdc88 100644 --- a/docs/_sidebar.yml +++ b/docs/_sidebar.yml @@ -2,13 +2,13 @@ website: sidebar: - id: validmind-reference title: "ValidMind Library" + collapsed: false + collapse-level: 2 contents: - reference/validmind.qmd - text: "---" - text: "Python API" - # Root level functions from validmind.qmd - - text: "__version__" - file: reference/validmind.qmd#__version__ + # Root level items from validmind.qmd - text: "get_test_suite()" file: reference/validmind.qmd#get_test_suite - text: "init()" diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index 04cb868b2..af6ca62cf 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -18,7 +18,7 @@ sidebar: validmind-reference ## Python API {% if module.members.__version__ %} -### __version__ +### \_\_version\_\_ ```python {{ module.members.__version__.value | replace("'", "") if module.members.__version__.value else module.members.__version__.members.__version__.value | replace("'", "") }} @@ -105,20 +105,47 @@ def {{ member.name }}( {% endfor %} {% endif %} -{# Add this section at the end, after all existing code #} {% if module.name == "validmind" %} -## Other Members - {% for member in module.members | sort_members %} - {% if is_public(member, module, full_data, is_root) %} - {% set resolved = resolve_alias(member, full_data) %} - {% if member.kind == "class" or (member.kind == "alias" and member.target_path and member.target_path.split(".")[-1][0].isupper()) %} - -{% include "class.qmd.jinja2" with context %} +{% set target = resolve_alias(resolved, full_data) %} + +## [class]{.muted} {{ member.name }} + +```python +class {{ member.name }}(): +``` + +{% if target.docstring %} +{{ doc.format_docstring(target.docstring) }} +{% endif %} + +{% if target.members %} +{% for method_name, method in target.members.items() %} +{% if method.kind == "function" and (not method_name.startswith('_') or method_name in ['__init__']) %} + +### {{ member.name if method_name == '__init__' else method_name }}[()]{.muted} + +```python +def {{ method_name }}( +{%- for param in method.parameters %} + {{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %}, +{% endif %} +{%- endfor %} +):{% if method.returns %} -> {{ method.returns }}{% endif +%} +``` + +{% if method.docstring %} +{{ doc.format_docstring(method.docstring) }} +{% endif %} + +{% endif %} +{% endfor %} +{% endif %} + {% endif %} {% endif %} {% endfor %} diff --git a/docs/templates/sidebar.qmd.jinja2 b/docs/templates/sidebar.qmd.jinja2 index d408ba182..96f5f6df4 100644 --- a/docs/templates/sidebar.qmd.jinja2 +++ b/docs/templates/sidebar.qmd.jinja2 @@ -2,19 +2,24 @@ website: sidebar: - id: validmind-reference title: "ValidMind Library" + collapsed: false + collapse-level: 2 contents: - reference/validmind.qmd - text: "---" - text: "Python API" - # Root level functions from validmind.qmd - {% if module.members.__version__ %} - - text: "__version__" - file: reference/validmind.qmd#__version__ - {% endif %} + # Root level items from validmind.qmd {% if documented_items.get('root') %} {% for item in documented_items['root'] %} - text: "{{ item.text }}" file: {{ item.file }} + {% if item.contents %} + contents: + {% for method in item.contents %} + - text: "{{ method.text }}" + file: {{ method.file }} + {% endfor %} + {% endif %} {% endfor %} {% endif %} # All module documentation pages diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 86ab8fe7b..33d7a73c1 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -32,7 +32,7 @@ After you have pasted the code snippet into your development source code and exe ## Python API -### __version__ +### \_\_version\_\_ ```python 2.8.4 @@ -353,186 +353,40 @@ The function may also include a docstring. This docstring will be used and logge - The decorated function. -## Other Members - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ## [class]{.muted} RawData ```python class RawData(): ``` - - - - - - - - - - - - - - - - - - - +Holds raw data for a test result - +### RawData[()]{.muted} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +```python +def __init__( self, + log: bool = False, + kwargs = {}): +``` - +Create a new RawData object - +**Parameters** - +- **log** bool: If True, log the raw data to ValidMind +- \*\***kwargs**: Keyword arguments to set as attributes e.g. `RawData(log=True, dataset_duplicates=df_duplicates)` - +### inspect[()]{.muted} - +```python +def inspect( self, + show: bool = True): +``` - +Inspect the raw data - +### serialize[()]{.muted} - +```python +def serialize( self): +``` diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 5c25d0694..c3af8bb38 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -252,11 +252,19 @@ def lint_markdown_files(output_dir: str): # Preserve front matter and format the rest front_matter = parts[1] body = parts[2] - formatted_body = mdformat.text(body, options={"wrap": "no"}) + formatted_body = mdformat.text(body, options={ + "wrap": "no", + "number": False, + "normalize_whitespace": True + }) formatted = f"---{front_matter}---\n\n{formatted_body}" else: # No front matter, format everything - formatted = mdformat.text(content, options={"wrap": "no"}) + formatted = mdformat.text(content, options={ + "wrap": "no", + "number": False, + "normalize_whitespace": True + }) with open(path, 'w') as f: f.write(formatted) From 68ab754dc1c0b16593f17b5611af494fc8b9000b Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Thu, 30 Jan 2025 15:34:51 -0800 Subject: [PATCH 036/207] Sidebar fixes complete --- docs/_sidebar.yml | 39 +-- docs/templates/module.qmd.jinja2 | 6 +- docs/templates/sidebar.qmd.jinja2 | 10 +- docs/templates/template.qmd.jinja2_OLD | 331 ------------------------- docs/validmind.qmd | 10 +- scripts/generate_quarto_docs.py | 178 +++++++++---- 6 files changed, 165 insertions(+), 409 deletions(-) delete mode 100644 docs/templates/template.qmd.jinja2_OLD diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml index 3510bdc88..b2d9bbdfa 100644 --- a/docs/_sidebar.yml +++ b/docs/_sidebar.yml @@ -9,34 +9,45 @@ website: - text: "---" - text: "Python API" # Root level items from validmind.qmd - - text: "get_test_suite()" + - text: "\\_\\_version\\_\\_" + file: reference/validmind.qmd#\\_\\_version\\_\\_ + - text: "get_test_suite[()]{.muted}" file: reference/validmind.qmd#get_test_suite - - text: "init()" + - text: "init[()]{.muted}" file: reference/validmind.qmd#init - - text: "init_dataset()" + - text: "init_dataset[()]{.muted}" file: reference/validmind.qmd#init_dataset - - text: "init_model()" + - text: "init_model[()]{.muted}" file: reference/validmind.qmd#init_model - - text: "init_r_model()" + - text: "init_r_model[()]{.muted}" file: reference/validmind.qmd#init_r_model - - text: "log_metric()" + - text: "log_metric[()]{.muted}" file: reference/validmind.qmd#log_metric - - text: "preview_template()" + - text: "preview_template[()]{.muted}" file: reference/validmind.qmd#preview_template - - text: "print_env()" + - text: "print_env[()]{.muted}" file: reference/validmind.qmd#print_env - - text: "reload()" + - text: "reload[()]{.muted}" file: reference/validmind.qmd#reload - - text: "run_documentation_tests()" + - text: "run_documentation_tests[()]{.muted}" file: reference/validmind.qmd#run_documentation_tests - - text: "run_test_suite()" + - text: "run_test_suite[()]{.muted}" file: reference/validmind.qmd#run_test_suite - - text: "tags()" + - text: "tags[()]{.muted}" file: reference/validmind.qmd#tags - - text: "tasks()" + - text: "tasks[()]{.muted}" file: reference/validmind.qmd#tasks - - text: "test()" + - text: "test[()]{.muted}" file: reference/validmind.qmd#test + - text: "[class]{.muted} RawData" + file: reference/validmind.qmd#class-rawdata + contents: + - text: "RawData[()]{.muted}" + file: reference/validmind.qmd#rawdata + - text: "inspect[()]{.muted}" + file: reference/validmind.qmd#inspect + - text: "serialize[()]{.muted}" + file: reference/validmind.qmd#serialize # All module documentation pages - text: "---" - text: "Submodules" diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index af6ca62cf..f5d745428 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -18,7 +18,7 @@ sidebar: validmind-reference ## Python API {% if module.members.__version__ %} -### \_\_version\_\_ +### \\_\\_version\\_\\_ ```python {{ module.members.__version__.value | replace("'", "") if module.members.__version__.value else module.members.__version__.members.__version__.value | replace("'", "") }} @@ -113,7 +113,7 @@ def {{ member.name }}( {% if member.kind == "class" or (member.kind == "alias" and member.target_path and member.target_path.split(".")[-1][0].isupper()) %} {% set target = resolve_alias(resolved, full_data) %} -## [class]{.muted} {{ member.name }} +### [class]{.muted} {{ member.name }} ```python class {{ member.name }}(): @@ -127,7 +127,7 @@ class {{ member.name }}(): {% for method_name, method in target.members.items() %} {% if method.kind == "function" and (not method_name.startswith('_') or method_name in ['__init__']) %} -### {{ member.name if method_name == '__init__' else method_name }}[()]{.muted} +#### {{ member.name if method_name == '__init__' else method_name }}[()]{.muted} ```python def {{ method_name }}( diff --git a/docs/templates/sidebar.qmd.jinja2 b/docs/templates/sidebar.qmd.jinja2 index 96f5f6df4..5a459d61f 100644 --- a/docs/templates/sidebar.qmd.jinja2 +++ b/docs/templates/sidebar.qmd.jinja2 @@ -11,13 +11,17 @@ website: # Root level items from validmind.qmd {% if documented_items.get('root') %} {% for item in documented_items['root'] %} - - text: "{{ item.text }}" - file: {{ item.file }} {% if item.contents %} + {% for child in item.contents %} + - text: "{{ child.text }}" + file: {{ child.file }} + {% if child.contents %} contents: - {% for method in item.contents %} + {% for method in child.contents %} - text: "{{ method.text }}" file: {{ method.file }} + {% endfor %} + {% endif %} {% endfor %} {% endif %} {% endfor %} diff --git a/docs/templates/template.qmd.jinja2_OLD b/docs/templates/template.qmd.jinja2_OLD deleted file mode 100644 index 94222c381..000000000 --- a/docs/templates/template.qmd.jinja2_OLD +++ /dev/null @@ -1,331 +0,0 @@ -{%- macro is_public(doc) -%} - {%- if doc.name == "__init__" and (doc.docstring or (doc.kind == "function" and doc.signature_without_self.parameters)) -%} - true - {%- elif doc.name == "__doc__" -%} - {%- elif doc.kind == "module" and doc.fullname not in all_modules -%} - {%- elif (doc.qualname or doc.name) is in(validmind.members.__all__.value.elements if validmind.members.__all__ and validmind.members.__all__.value.elements else []) -%} - true - {%- elif not doc.name.startswith("_") and (doc.kind != "variable" or doc.is_enum_member or doc.docstring) -%} - true - {%- endif -%} -{%- endmacro -%} - -{%- macro format_return_type(returns) -%} -{%- if returns.cls == "ExprName" -%} - {%- if returns.name in validmind.members.client.members and validmind.members.client.members[returns.name].kind == "alias" -%} - {{ validmind.members.client.members[returns.name].target_path }} - {%- else -%} - {{ returns.name }} - {%- endif -%} -{%- elif returns.cls == "ExprSubscript" and returns.left is defined -%} - {{ returns.left.name }}[ - {%- if returns.slice.cls == "ExprTuple" -%} - {{ returns.slice.elements|map(attribute="name")|join(", ") }} - {%- else -%} - {{ returns.slice.name }} - {%- endif -%} - ] -{%- else -%} - {{ returns|string }} -{%- endif -%} -{%- endmacro %} - -{%- macro resolve_alias_path(member) -%} - {%- if member.kind == "alias" and member.target_path -%} - {{ member.target_path }} - {%- else -%} - {{ "" }} - {%- endif -%} -{%- endmacro -%} - -{%- macro get_flattened_members(module, level=1) -%} - {% if module.members -%} - {% for member_name, member in module.members.items() -%} - {% if member.kind == "module" and not member_name.startswith("_") and member_name not in ["preprocess", "preprocessing"] %} -{{ "#" * (level + 2) }} {{ member_name }} - -{% if member.docstring %} -{{ member.docstring.value if member.docstring.value is defined else member.docstring }} -{% endif %} - -{% if member.members %} -{{ get_flattened_members(member, level + 1) }} -{% endif %} - - {% elif member.kind == "class" and not member_name.startswith("_") %} -{{ "#" * (level + 3) }} class {{ member_name }}{% if member.bases %}({{ member.bases[0].name }}){% endif %} - -{{ member.docstring.value if member.docstring and member.docstring.value else member.docstring }} - - {% if member.members %} - {% for method_name, method in member.members.items() -%} - {% if not method_name.startswith("_") %} - -{{ "#" * (level + 4) }} {{ method_name }}() -```python -def {{ method_name }}({% for param in method.parameters %}{{ param.name }}{% if param.default is not none %} = {{ param.default }}{% endif -%}{% if not loop.last %}, {% endif -%}{% endfor %}): -``` -{% if member.docstring %} -{{ format_docstring_content(member.docstring.value if member.docstring.value is defined else member.docstring) }} -{% endif %} - - {%- endif -%} - {% endfor %} - {%- endif -%} - {% elif member.kind == "function" and not member_name.startswith("_") - and not member_name.startswith("simple_preprocess") %} - -{{ "#" * (level + 4) }} {{ member_name }}() - -```python -def {{ member_name }}({% for param in member.parameters %}{{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation.left.name if param.annotation.cls == "ExprSubscript" else "" }}{% endif -%}{% if param.default is not none %} = {{ param.default }}{% endif -%}{% if not loop.last %}, {% endif -%}{% endfor %}){% if member.returns %} -> {{ format_return_type(member.returns) }}{% endif %} -``` - -{% if member.docstring %} -{{ format_docstring_content(member.docstring.value if member.docstring.value is defined else member.docstring) }} -{% endif %} - - {% endif -%} - {% endfor %} - {% endif -%} -{% endmacro -%} - -{%- macro show_submodules(module) -%} - {%- if module.members -%} -#### Module Hierarchy - - {%- for submember_name, submember in module.members.items() -%} - {%- if submember.kind == "module" and not submember_name.startswith("_") -%} - -##### {{ submember_name }} - -* [{{ submember_name }}]({{ submember_name }}.qmd) -{% if submember.docstring %} -{{ submember.docstring.value if submember.docstring.value is defined else submember.docstring }} - -{% endif -%} - {%- if submember.members -%} - {%- for subsubmember_name, subsubmember in submember.members.items() -%} - {%- if subsubmember.kind == "module" and not subsubmember_name.startswith("_") -%} - -###### {{ subsubmember_name }} - -* [{{ subsubmember_name }}]({{ submember_name }}/{{ subsubmember_name }}.qmd) -{% if subsubmember.docstring %} -{{ subsubmember.docstring.value if subsubmember.docstring.value is defined else subsubmember.docstring }} - -{% endif -%} - {%- endif -%} - {%- endfor -%} - {%- endif -%} - {%- endif -%} - {%- endfor -%} - {%- endif -%} -{%- endmacro -%} - -{%- macro resolve_decorator(member, validmind) -%} - {%- if member.kind == "alias" and member.target_path -%} - {%- set path_parts = member.target_path.split(".") -%} - {%- set current_module = validmind -%} - - {%- if "tests" in current_module.members -%} - {%- set current_module = current_module.members["tests"] -%} - {%- if "decorator" in current_module.members -%} - {%- set current_module = current_module.members["decorator"] -%} - {%- set target_name = path_parts[-1] -%} - {%- if target_name in current_module.members -%} - {%- set target = current_module.members[target_name] -%} -```python -def {{ target_name }}({% if target.parameters -%} - {%- for param in target.parameters -%} - {{ param.name }}{% if param.kind == "variadic positional" %}*{% endif -%}{% if param.kind == "variadic keyword" %}**{% endif -%}{% if param.default is not none %} = {{ param.default }}{% endif -%}{% if not loop.last %}, {% endif -%} - {%- endfor -%} -{%- endif -%}): -``` - -{% if target.docstring %} -{{ format_docstring_content(target.docstring.value if target.docstring.value is defined else target.docstring) }} -{%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endif -%} - {%- endif -%} -{%- endmacro -%} - -{%- macro format_docstring_content(docstring) -%} - {%- set docstring = docstring.replace(':\n-', ':\n\n-') -%} - {%- set docstring = docstring.replace('\n ', ' ') -%} - {%- set docstring = docstring.replace(':param ', '\n**Parameters**\n\n- **') -%} - {%- set docstring = docstring.replace(': ', '**: ', 1) -%} - {%- set docstring = docstring.replace(':return: ', '\n**Returns**\n\n- ') -%} - {%- set lines = docstring.split('\n') -%} - {%- set formatted_lines = [] -%} - {%- for line in lines -%} - {%- if line.startswith('### ') -%} - {%- set line = line.replace('### ', '###### ') -%} - {%- elif line.strip() == 'Args:' -%} - {%- set line = '**Arguments**\n' -%} - {%- elif line.strip() == 'Attributes:' -%} - {%- set line = '**Attributes**\n' -%} - {%- elif line.strip() == 'Raises:' -%} - {%- set line = '**Raises**\n' -%} - {%- elif line.strip() == 'Returns:' -%} - {%- set line = '**Returns**\n' -%} - {%- elif line.startswith(' ') -%} - {%- set trimmed = line.strip() -%} - {%- if ':' in trimmed -%} - {%- set parts = trimmed.split(':', 1) -%} - {%- set param = parts[0].strip() -%} - {%- set desc = parts[1].strip() -%} - {%- if '[DEPRECATED]' in desc -%} - {%- set desc = desc.replace('[DEPRECATED]', '') ~ '^[**Deprecation notice**
`' ~ param ~ '` has been deprecated and will be removed in a future release.]' -%} - {%- endif -%} - {%- set line = '- **' ~ param ~ '**: ' ~ desc -%} - {%- else -%} - {%- set line = '- ' ~ trimmed -%} - {%- endif -%} - {%- endif -%} - {%- if line.strip() or line.startswith(' ') -%} - {%- set _ = formatted_lines.append(line) -%} - {%- else -%} - {%- set _ = formatted_lines.append('') -%} - {%- endif -%} - {%- endfor -%} - {{ formatted_lines | join('\n') }} -{%- endmacro -%} - ---- -title: {{ "ValidMind Library" if validmind.name == "validmind" else validmind.name | capitalize }} -toc-depth: 4 -toc-expand: 4 -toc-location: left -toc-title: "" ---- -{% if validmind.name != "validmind" %} - {% set parentmodule = validmind.filepath.split("/")[-2] if validmind.filepath is defined and "/" in validmind.filepath else None %} - {% if parentmodule and parentmodule in all_modules %} - [← {{ parentmodule }}](../{{ parentmodule }}.qmd) - {% endif -%} -{% endif -%} - -{% if validmind.docstring %} -{{ validmind.docstring.value if validmind.docstring.value is defined else validmind.docstring }} -{%- endif -%} -{% if validmind.members %} - -## Python Library API -{% for member_name, member in validmind.members.items() -%} - {% if member_name == "__version__" - or (member.kind != "module" and "'" + member_name + "'" in validmind.members.__all__.value.elements) - or (member.kind == "alias" - and member.target_path - and member.target_path.startswith("validmind.") - and not member.name.startswith("_") - and ("'" + member.target_path.split(".")[-2] + "'" in validmind.members.__all__.value.elements)) %} -{% set display_name = "\_\_version\_\_" if member_name == "__version__" else member_name + "()" %} -### {{ display_name }} -{%- set resolved = member -%} -{% if member.kind == "alias" -%} - {% if member_name in ['tags', 'tasks', 'test'] -%} - {% set resolved = None -%} - {% set decorator_output = resolve_decorator(member, validmind) -%} - {% else -%} - {% set target_path = resolve_alias_path(member) -%} - {% if target_path -%} - {% set path_parts = target_path.split(".") -%} - {% set module_name = path_parts[-2] -%} - {% if module_name in validmind.members -%} - {% set module = validmind.members[module_name] -%} - {% set target_name = path_parts[-1] -%} - {% if target_name in module.members -%} - {% set resolved = module.members[target_name] -%} - {%- if resolved.kind == "alias" and resolved.target_path %} - {% set inner_module_name = resolved.target_path.split(".")[-2] -%} - {% set inner_target_name = resolved.target_path.split(".")[-1] -%} - {% if inner_module_name in validmind.members -%} - {% set inner_module = validmind.members[inner_module_name] -%} - {% if inner_target_name in inner_module.members -%} - {% set resolved = inner_module.members[inner_target_name] -%} - {%- endif %} - {%- endif %} - {%- endif %} - {%- endif %} - {%- endif %} - {%- endif %} - {%- endif %} -{%- endif %} - -{% if member_name in ['tags', 'tasks', 'test'] and decorator_output is defined -%} -{{ decorator_output }} -{% elif resolved and resolved.kind == "function" -%} -{%- if resolved.labels and "async" in resolved.labels %}async {% endif -%} -```python -def {{ member_name }}{% if resolved.parameters %}( -{%- for param in resolved.parameters %} - {{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation.left.name if param.annotation.cls == "ExprSubscript" else "" }}{% endif -%}{% if param.default is not none %} = {{ param.default }}{% endif -%}{% if not loop.last %}, {% endif -%} -{%- endfor %} -){% else %}(){% endif -%} -{%- if resolved.returns %} -> {{ format_return_type(resolved.returns) }}:{% endif %} -``` -{% if resolved.docstring %} -{{ format_docstring_content(resolved.docstring.value if resolved.docstring.value is defined else resolved.docstring) }} -{%- endif -%} - -{% if resolved.decorators %} -#### Decorators: - -{% for decorator in resolved.decorators %} -- {{ decorator.value.values[0].name if decorator.value.cls == "ExprAttribute" else decorator.value }} -{% endfor %} -{% endif -%} - -{% elif member_name == "__version__" -%} -{% set version_value = member.members.__version__.value if member.members and member.members.__version__ -%} -```python -{{ version_value | replace("'", "") }} -``` -{% elif resolved.kind == "class" %} -{% if resolved.docstring %} -{{ format_docstring_content(resolved.docstring.value if resolved.docstring.value is defined else resolved.docstring) }} -{% endif -%} - -{% if resolved.bases %} -**Bases**: {% for base in resolved.bases %}{{ base[2] }}{% if not loop.last %}, {% endif -%}{% endfor %} -{% endif -%} - -{% if resolved.decorators %} -**Decorators**: -{% for decorator in resolved.decorators %} -- {{ decorator.value.name if decorator.value.cls == "ExprName" else decorator.value.values[0].name if decorator.value.cls == "ExprAttribute" else decorator.value }} -{% endfor %} -{% endif -%} - -{% else %} -{% if resolved.target_path %}**Import Path**: `{{ resolved.target_path }}`{% endif -%} - -{% if resolved.docstring %} -{{ format_docstring_content(resolved.docstring.value if resolved.docstring.value is defined else resolved.docstring) }} -{% endif -%} -{% endif -%} - - {% endif -%} -{% endfor %} - -## Submodules -{% for member_name, member in validmind.members.items() %} - {% if member.kind == "module" and "'" + member_name + "'" in validmind.members.__all__.value.elements %} -{% set display_name = "\_\_version\_\_" if member_name == "__version__" else member_name -%} -### {{ display_name }} - -{% if member.target_path %}**Import Path**: `{{ member.target_path }}`{% endif -%} - -{% if member.docstring %} -{{ member.docstring.value if member.docstring.value is defined else member.docstring }} -{% endif -%} - -{{ get_flattened_members(member) }} - {% endif -%} -{% endfor %} - -{{ show_submodules(validmind) }} -{% endif -%} \ No newline at end of file diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 33d7a73c1..7c9db1d20 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -32,7 +32,7 @@ After you have pasted the code snippet into your development source code and exe ## Python API -### \_\_version\_\_ +### \\_\\_version\\_\\_ ```python 2.8.4 @@ -353,7 +353,7 @@ The function may also include a docstring. This docstring will be used and logge - The decorated function. -## [class]{.muted} RawData +### [class]{.muted} RawData ```python class RawData(): @@ -361,7 +361,7 @@ class RawData(): Holds raw data for a test result -### RawData[()]{.muted} +#### RawData[()]{.muted} ```python def __init__( self, @@ -376,7 +376,7 @@ Create a new RawData object - **log** bool: If True, log the raw data to ValidMind - \*\***kwargs**: Keyword arguments to set as attributes e.g. `RawData(log=True, dataset_duplicates=df_duplicates)` -### inspect[()]{.muted} +#### inspect[()]{.muted} ```python def inspect( self, @@ -385,7 +385,7 @@ def inspect( self, Inspect the raw data -### serialize[()]{.muted} +#### serialize[()]{.muted} ```python def serialize( self): diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index c3af8bb38..c6708a648 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -8,6 +8,7 @@ from docstring_parser import parse, Style from glob import glob import subprocess +import re # Add at module level _alias_cache = {} # Cache for resolved aliases @@ -25,31 +26,15 @@ def resolve_alias(member: Dict[str, Any], data: Dict[str, Any]) -> Dict[str, Any # Skip resolution if it's not in our codebase if path_parts[0] != 'validmind': return member - - # Debug only for specific problematic paths - debug = any(x in target_path for x in ['vm_models.result.RawData', 'vm_models.result.Result']) - - if debug: - print(f"\nResolving alias: {target_path}") - + current = data[path_parts[0]] # Start at validmind for part in path_parts[1:]: - if debug: - print(f" Resolving part: {part}") - print(f" Available members: {sorted(list(current.get('members', {}).keys()))}") - if part in current.get('members', {}): current = current['members'][part] else: - if debug: - print(f" Failed to find {part}") return member - if debug: - print(f" Resolution successful") - print(f" Final kind: {current.get('kind')}") - print(f" Has docstring: {bool(current.get('docstring'))}") - + # Cache the result _alias_cache[target_path] = current return current @@ -134,6 +119,25 @@ def ensure_dir(path): """Create directory if it doesn't exist.""" Path(path).mkdir(parents=True, exist_ok=True) +def clean_anchor_text(heading: str) -> str: + """Safely clean heading text for anchor generation. + + Handles: + - [()]{.muted} + - [class]{.muted} + - {.muted} + - Other Quarto formatting + """ + # First check if this is a class heading + if '[class]' in heading: + # Remove both [...] and {...} patterns from the class name + class_name = re.sub(r'(\[[^\]]*\]|\{[^}]*\})', '', heading) + return 'class-' + class_name.strip().lower() + + # For other headings, remove both [...] and {...} patterns + cleaned = re.sub(r'(\[[^\]]*\]|\{[^}]*\})', '', heading) + return cleaned.strip().lower() + def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: Dict[str, Any], is_root: bool = False) -> Dict[str, List[Dict[str, str]]]: """Collect all documented items from a module and its submodules.""" result = {} @@ -146,30 +150,97 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: file_path = '/'.join(path) module_name = module.get('name', 'root') - # Collect items from this module - module_items = [] - for member in sort_members(module['members'], module.get('name') == 'errors'): - if not is_public(member, module, full_data, is_root): - continue + # For root module, parse validmind.qmd to get headings + if is_root: + module_items = [] + qmd_filename = f"{path[-1]}.qmd" + qmd_path = written_qmd_files.get(qmd_filename) + + if qmd_path and os.path.exists(qmd_path): + print(f"\nParsing headings from: {qmd_path}") + with open(qmd_path, 'r') as f: + content = f.read() - if member['kind'] in ('function', 'class'): - # For root module items, always use reference/validmind.qmd path - file_prefix = 'reference/validmind' if is_root else file_path - module_items.append({ - 'text': f"{member['name']}()" if member['kind'] == 'function' else member['name'], - 'file': f"{file_prefix}.qmd#{member['name']}" - }) - elif member['kind'] == 'alias': - target = resolve_alias(member, full_data) - if target and target.get('docstring'): - file_prefix = 'reference/validmind' if is_root else file_path - module_items.append({ - 'text': f"{member['name']}()", - 'file': f"{file_prefix}.qmd#{member['name']}" - }) - - if module_items: - result['root' if is_root else module_name] = module_items + print("\nRaw content:") + for line in content.split('\n'): + if line.startswith('#'): + print(f"Found heading line: {line}") + + # Track current class for nesting methods + current_class = None + + # Parse headings + current_section = None + for line in content.split('\n'): + if line.startswith('## '): + heading = line[3:].strip() + print(f"Found L2 heading: {heading}") + anchor = clean_anchor_text(heading) + item = { + 'text': heading, + 'file': f"reference/validmind.qmd#{anchor}", + 'contents': [] + } + module_items.append(item) + current_section = item + current_class = None + elif line.startswith('### '): + if current_section: + heading = line[4:].strip() + print(f" Found L3 heading under {current_section['text']}: {heading}") + anchor = clean_anchor_text(heading) + item = { + 'text': heading, + 'file': f"reference/validmind.qmd#{anchor}" + } + if '[class]' in heading: + item['contents'] = [] + current_class = item + print(f" Set current_class to: {heading}") + current_section['contents'].append(item) + print(f" Current section contents: {current_section['contents']}") + elif line.startswith('#### '): + if current_class: + heading = line[5:].strip() + print(f" Found L4 heading under class {current_class['text']}: {heading}") + anchor = clean_anchor_text(heading) + method_item = { + 'text': heading, + 'file': f"reference/validmind.qmd#{anchor}" + } + current_class['contents'].append(method_item) + print(f" Added method to class. Class contents now: {current_class['contents']}") + + # Clean up empty contents lists at the end + for item in module_items: + if not item.get('contents'): + del item['contents'] + else: + for child in item['contents']: + if child.get('contents') and not child['contents']: + del child['contents'] + + print("\nFinal structure:") + for item in module_items: + print(f"Section: {item['text']}") + if 'contents' in item: + for child in item['contents']: + print(f" Child: {child['text']}") + if 'contents' in child: + for method in child['contents']: + print(f" Method: {method['text']}") + + if module_items: + result['root'] = module_items + print("\nCollected items:") + for item in module_items: + print(f" {item['text']} -> {item['file']}") + if item.get('contents'): + for child in item['contents']: + print(f" - {child['text']} -> {child['file']}") + if child.get('contents'): # Add this to show class methods + for method in child['contents']: + print(f" * {method['text']} -> {method['file']}") # Recursively collect from submodules for member in sort_members(module['members'], module.get('name') == 'errors'): @@ -193,18 +264,6 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: def process_module(module: Dict[str, Any], path: List[str], env: Environment, full_data: Dict[str, Any]): """Process a module and its submodules.""" - # if module.get('name') == 'tests': - # print("\nProcessing tests module members:") - # for name, member in module.get('members', {}).items(): - # if is_public(member, module, full_data): - # print(f"\n{name}:") - # print(f" Original: kind={member.get('kind')}") - # if member.get('kind') == 'alias': - # resolved = resolve_alias(member, full_data) - # print(f" Resolved: kind={resolved.get('kind')}") - # print(f" Target path: {member.get('target_path')}") - # print(f" In __all__: {name in get_all_members(module.get('members', {}))}") - # Parse docstrings first parse_docstrings_recursively(module) @@ -214,6 +273,19 @@ def process_module(module: Dict[str, Any], path: List[str], env: Environment, fu # Get module template module_template = env.get_template('module.qmd.jinja2') + # Debug template rendering for root module + # if len(path) <= 1: # Root module + # print("\nGenerating root module (validmind.qmd):") + # for name, member in module.get('members', {}).items(): + # if member['kind'] != 'module': + # print(f"\nMember: {name}") + # print(f" Kind: {member['kind']}") + # print(f" Has docstring: {'docstring' in member}") + # if member.get('members'): + # print(" Methods:") + # for method_name, method in member['members'].items(): + # print(f" - {method_name} ({method.get('kind')})") + # Generate module documentation output = module_template.render( module=module, From 0730e473346774fa7fd5ea59ebe87f6f952fbb82 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Thu, 30 Jan 2025 17:40:02 -0800 Subject: [PATCH 037/207] Add codeblock template comments --- docs/templates/class.qmd.jinja2 | 2 + docs/templates/errors.qmd.jinja2 | 18 ++++ docs/templates/function.qmd.jinja2 | 1 + docs/templates/module.qmd.jinja2 | 5 ++ docs/validmind.qmd | 38 ++++++++ .../classification/customer_churn.qmd | 12 +++ .../datasets/classification/taiwan_credit.qmd | 10 +++ .../datasets/credit_risk/lending_club.qmd | 20 +++++ .../credit_risk/lending_club_bias.qmd | 8 ++ docs/validmind/datasets/nlp/cnn_dailymail.qmd | 4 + .../datasets/nlp/twitter_covid_19.qmd | 2 + docs/validmind/datasets/regression/fred.qmd | 16 ++++ .../datasets/regression/lending_club.qmd | 6 ++ docs/validmind/errors.qmd | 88 +++++++++++++++++++ docs/validmind/test_suites.qmd | 74 ++++++++++++++++ docs/validmind/test_suites/classifier.qmd | 14 +++ docs/validmind/test_suites/cluster.qmd | 8 ++ docs/validmind/test_suites/embeddings.qmd | 6 ++ docs/validmind/test_suites/llm.qmd | 12 +++ docs/validmind/test_suites/nlp.qmd | 10 +++ .../test_suites/parameters_optimization.qmd | 2 + docs/validmind/test_suites/regression.qmd | 10 +++ .../test_suites/statsmodels_timeseries.qmd | 4 + docs/validmind/test_suites/summarization.qmd | 2 + .../test_suites/tabular_datasets.qmd | 6 ++ docs/validmind/test_suites/text_data.qmd | 2 + docs/validmind/test_suites/time_series.qmd | 14 +++ docs/validmind/tests.qmd | 36 ++++++++ .../tests/data_validation/ACFandPACFPlot.qmd | 2 + docs/validmind/tests/data_validation/ADF.qmd | 4 + .../tests/data_validation/AutoAR.qmd | 4 + .../tests/data_validation/AutoMA.qmd | 4 + .../data_validation/AutoStationarity.qmd | 2 + .../data_validation/BivariateScatterPlots.qmd | 2 + .../tests/data_validation/BoxPierce.qmd | 2 + .../ChiSquaredFeaturesTable.qmd | 4 + .../tests/data_validation/ClassImbalance.qmd | 4 + .../data_validation/DatasetDescription.qmd | 14 +++ .../tests/data_validation/DatasetSplit.qmd | 2 + .../data_validation/DescriptiveStatistics.qmd | 10 +++ .../tests/data_validation/DickeyFullerGLS.qmd | 6 ++ .../tests/data_validation/Duplicates.qmd | 2 + .../data_validation/EngleGrangerCoint.qmd | 4 + .../FeatureTargetCorrelationPlot.qmd | 2 + .../tests/data_validation/HighCardinality.qmd | 2 + .../HighPearsonCorrelation.qmd | 2 + .../data_validation/IQROutliersBarPlot.qmd | 4 + .../data_validation/IQROutliersTable.qmd | 4 + .../IsolationForestOutliers.qmd | 2 + .../tests/data_validation/JarqueBera.qmd | 2 + docs/validmind/tests/data_validation/KPSS.qmd | 6 ++ .../tests/data_validation/LJungBox.qmd | 2 + .../LaggedCorrelationHeatmap.qmd | 2 + .../tests/data_validation/MissingValues.qmd | 2 + .../data_validation/MissingValuesBarPlot.qmd | 2 + .../data_validation/MutualInformation.qmd | 2 + .../PearsonCorrelationMatrix.qmd | 2 + .../data_validation/PhillipsPerronArch.qmd | 6 ++ .../ProtectedClassesCombination.qmd | 6 ++ .../ProtectedClassesDescription.qmd | 4 + .../ProtectedClassesDisparity.qmd | 6 ++ .../ProtectedClassesThresholdOptimizer.qmd | 18 ++++ .../data_validation/RollingStatsPlot.qmd | 6 ++ .../tests/data_validation/RunsTest.qmd | 2 + .../tests/data_validation/ScatterPlot.qmd | 2 + .../data_validation/ScoreBandDefaultRates.qmd | 2 + .../data_validation/SeasonalDecompose.qmd | 6 ++ .../tests/data_validation/ShapiroWilk.qmd | 2 + .../tests/data_validation/Skewness.qmd | 2 + .../tests/data_validation/SpreadPlot.qmd | 4 + .../TabularCategoricalBarPlots.qmd | 4 + .../TabularDateTimeHistograms.qmd | 4 + .../TabularDescriptionTables.qmd | 14 +++ .../TabularNumericalHistograms.qmd | 2 + .../data_validation/TargetRateBarPlots.qmd | 4 + .../data_validation/TimeSeriesDescription.qmd | 2 + .../TimeSeriesDescriptiveStatistics.qmd | 2 + .../data_validation/TimeSeriesFrequency.qmd | 4 + .../data_validation/TimeSeriesHistogram.qmd | 4 + .../data_validation/TimeSeriesLinePlot.qmd | 4 + .../TimeSeriesMissingValues.qmd | 4 + .../data_validation/TimeSeriesOutliers.qmd | 4 + .../data_validation/TooManyZeroValues.qmd | 2 + .../tests/data_validation/UniqueRows.qmd | 2 + .../tests/data_validation/WOEBinPlots.qmd | 6 ++ .../tests/data_validation/WOEBinTable.qmd | 4 + .../data_validation/ZivotAndrewsArch.qmd | 6 ++ .../tests/data_validation/nlp/CommonWords.qmd | 2 + .../tests/data_validation/nlp/Hashtags.qmd | 4 + .../data_validation/nlp/LanguageDetection.qmd | 2 + .../tests/data_validation/nlp/Mentions.qmd | 4 + .../nlp/PolarityAndSubjectivity.qmd | 2 + .../data_validation/nlp/Punctuations.qmd | 2 + .../tests/data_validation/nlp/Sentiment.qmd | 2 + .../tests/data_validation/nlp/StopWords.qmd | 2 + .../data_validation/nlp/TextDescription.qmd | 4 + .../tests/data_validation/nlp/Toxicity.qmd | 2 + .../tests/model_validation/BertScore.qmd | 4 + .../tests/model_validation/BleuScore.qmd | 4 + .../ClusterSizeDistribution.qmd | 2 + .../model_validation/ContextualRecall.qmd | 4 + .../tests/model_validation/FeaturesAUC.qmd | 6 ++ .../tests/model_validation/MeteorScore.qmd | 4 + .../tests/model_validation/ModelMetadata.qmd | 4 + .../ModelPredictionResiduals.qmd | 2 + .../tests/model_validation/RegardScore.qmd | 4 + .../RegressionResidualsPlot.qmd | 2 + .../tests/model_validation/RougeScore.qmd | 2 + .../TimeSeriesPredictionWithCI.qmd | 2 + .../TimeSeriesPredictionsPlot.qmd | 2 + .../TimeSeriesR2SquareBySegments.qmd | 2 + .../tests/model_validation/TokenDisparity.qmd | 2 + .../tests/model_validation/ToxicityScore.qmd | 2 + .../sklearn/AdjustedMutualInformation.qmd | 2 + .../sklearn/AdjustedRandIndex.qmd | 2 + .../sklearn/CalibrationCurve.qmd | 2 + .../sklearn/ClassifierPerformance.qmd | 4 + .../ClassifierThresholdOptimization.qmd | 4 + .../sklearn/ClusterCosineSimilarity.qmd | 4 + .../sklearn/ClusterPerformanceMetrics.qmd | 2 + .../sklearn/CompletenessScore.qmd | 2 + .../sklearn/ConfusionMatrix.qmd | 2 + .../sklearn/FeatureImportance.qmd | 2 + .../sklearn/FowlkesMallowsScore.qmd | 2 + .../sklearn/HomogeneityScore.qmd | 2 + .../sklearn/HyperParametersTuning.qmd | 4 + .../sklearn/KMeansClustersOptimization.qmd | 4 + .../sklearn/MinimumAccuracy.qmd | 2 + .../sklearn/MinimumF1Score.qmd | 2 + .../sklearn/MinimumROCAUCScore.qmd | 2 + .../sklearn/ModelParameters.qmd | 2 + .../sklearn/ModelsPerformanceComparison.qmd | 4 + .../sklearn/OverfitDiagnosis.qmd | 4 + .../sklearn/PermutationFeatureImportance.qmd | 6 ++ .../sklearn/PopulationStabilityIndex.qmd | 8 ++ .../sklearn/PrecisionRecallCurve.qmd | 4 + .../model_validation/sklearn/ROCCurve.qmd | 4 + .../sklearn/RegressionErrors.qmd | 2 + .../sklearn/RegressionErrorsComparison.qmd | 4 + .../sklearn/RegressionPerformance.qmd | 4 + .../sklearn/RegressionR2Square.qmd | 4 + .../sklearn/RegressionR2SquareComparison.qmd | 4 + .../sklearn/RobustnessDiagnosis.qmd | 6 ++ .../sklearn/SHAPGlobalImportance.qmd | 10 +++ .../sklearn/ScoreProbabilityAlignment.qmd | 2 + .../sklearn/SilhouettePlot.qmd | 2 + .../sklearn/TrainingTestDegradation.qmd | 2 + .../model_validation/sklearn/VMeasure.qmd | 2 + .../sklearn/WeakspotsDiagnosis.qmd | 2 + .../statsmodels/AutoARIMA.qmd | 4 + .../CumulativePredictionProbabilities.qmd | 2 + .../statsmodels/DurbinWatsonTest.qmd | 2 + .../statsmodels/GINITable.qmd | 2 + .../statsmodels/KolmogorovSmirnov.qmd | 4 + .../statsmodels/Lilliefors.qmd | 2 + .../PredictionProbabilitiesHistogram.qmd | 2 + .../statsmodels/RegressionCoeffs.qmd | 4 + .../RegressionFeatureSignificance.qmd | 6 ++ .../RegressionModelForecastPlot.qmd | 4 + .../RegressionModelForecastPlotLevels.qmd | 4 + .../RegressionModelSensitivityPlot.qmd | 6 ++ .../statsmodels/RegressionModelSummary.qmd | 4 + ...RegressionPermutationFeatureImportance.qmd | 4 + .../statsmodels/ScorecardHistogram.qmd | 2 + .../statsmodels/statsutils.qmd | 2 + .../tests/prompt_validation/Bias.qmd | 10 +++ .../tests/prompt_validation/Clarity.qmd | 10 +++ .../tests/prompt_validation/Conciseness.qmd | 10 +++ .../tests/prompt_validation/Delimitation.qmd | 10 +++ .../prompt_validation/NegativeInstruction.qmd | 10 +++ .../tests/prompt_validation/Robustness.qmd | 8 ++ .../tests/prompt_validation/Specificity.qmd | 10 +++ .../prompt_validation/ai_powered_test.qmd | 6 ++ docs/validmind/unit_metrics.qmd | 6 ++ docs/validmind/vm_models.qmd | 66 ++++++++++++++ 175 files changed, 1064 insertions(+) diff --git a/docs/templates/class.qmd.jinja2 b/docs/templates/class.qmd.jinja2 index 442647a5b..932e1a4d7 100644 --- a/docs/templates/class.qmd.jinja2 +++ b/docs/templates/class.qmd.jinja2 @@ -1,5 +1,6 @@ ## [class]{.muted} {{ resolved.name }} + ```python class {{ resolved.name }}({% for base in resolved.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): ``` @@ -32,6 +33,7 @@ class {{ resolved.name }}({% for base in resolved.bases %}{{ base.name }}{% if n {% if member.kind in ['method', 'function'] and not member.name.startswith('_') %} ### [{{ member.name }}[()]{.muted}](#{{ member.name }}) + ```python {{ member.name }}({{ member.parameters | map(attribute='name') | join(', ') }}) ``` diff --git a/docs/templates/errors.qmd.jinja2 b/docs/templates/errors.qmd.jinja2 index dd8a4c851..47dfb39bd 100644 --- a/docs/templates/errors.qmd.jinja2 +++ b/docs/templates/errors.qmd.jinja2 @@ -16,6 +16,7 @@ toc-expand: 3 {% if member.kind == 'class' and member.name in ['BaseError', 'APIRequestError'] %} ### [class]{.muted} {{ member.name }} + ```python class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): ``` @@ -28,6 +29,8 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% for method in member.members.values() | sort(attribute='name') %} {% if method.kind == 'method' and not method.name.startswith('_') %} #### [{{ method.name }}[()]{.muted}](#{{ method.name }}) + + ```python {{ method.name }}({{ method.parameters | map(attribute='name') | join(', ') }}) ``` @@ -43,6 +46,7 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% if member.kind == 'class' and (member.name.startswith('API') or member.name.endswith('APIError')) and member.name != 'APIRequestError' %} ### [class]{.muted} {{ member.name }} + ```python class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): ``` @@ -55,6 +59,8 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% for method in member.members.values() | sort(attribute='name') %} {% if method.kind == 'method' and not method.name.startswith('_') %} #### [{{ method.name }}[()]{.muted}](#{{ method.name }}) + + ```python {{ method.name }}({{ method.parameters | map(attribute='name') | join(', ') }}) ``` @@ -70,6 +76,7 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% if member.kind == 'class' and 'Model' in member.name %} ### [class]{.muted} {{ member.name }} + ```python class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): ``` @@ -82,6 +89,8 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% for method in member.members.values() | sort(attribute='name') %} {% if method.kind == 'method' and not method.name.startswith('_') %} #### [{{ method.name }}[()]{.muted}](#{{ method.name }}) + + ```python {{ method.name }}({{ method.parameters | map(attribute='name') | join(', ') }}) ``` @@ -97,6 +106,7 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% if member.kind == 'class' and 'Test' in member.name %} ### [class]{.muted} {{ member.name }} + ```python class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): ``` @@ -109,6 +119,8 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% for method in member.members.values() | sort(attribute='name') %} {% if method.kind == 'method' and not method.name.startswith('_') %} #### [{{ method.name }}[()]{.muted}](#{{ method.name }}) + + ```python {{ method.name }}({{ method.parameters | map(attribute='name') | join(', ') }}) ``` @@ -124,6 +136,7 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% if member.kind == 'class' and (member.name.startswith('Invalid') or member.name.startswith('Missing')) %} ### [class]{.muted} {{ member.name }} + ```python class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): ``` @@ -136,6 +149,8 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% for method in member.members.values() | sort(attribute='name') %} {% if method.kind == 'method' and not method.name.startswith('_') %} #### [{{ method.name }}[()]{.muted}](#{{ method.name }}) + + ```python {{ method.name }}({{ method.parameters | map(attribute='name') | join(', ') }}) ``` @@ -151,6 +166,7 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% if member.kind == 'class' and member.name.startswith('Unsupported') %} ### [class]{.muted} {{ member.name }} + ```python class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): ``` @@ -163,6 +179,8 @@ class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not l {% for method in member.members.values() | sort(attribute='name') %} {% if method.kind == 'method' and not method.name.startswith('_') %} #### [{{ method.name }}[()]{.muted}](#{{ method.name }}) + + ```python {{ method.name }}({{ method.parameters | map(attribute='name') | join(', ') }}) ``` diff --git a/docs/templates/function.qmd.jinja2 b/docs/templates/function.qmd.jinja2 index 936b6c284..270ab66c0 100644 --- a/docs/templates/function.qmd.jinja2 +++ b/docs/templates/function.qmd.jinja2 @@ -2,6 +2,7 @@ ## {{ member_name | default(member.name) }}[()]{.muted} + ```python {% if member.labels and "async" in member.labels %}async {% endif %}def {{ member_name | default(member.name) }}( {% for param in member.parameters %} diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index f5d745428..64b19ef6a 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -20,6 +20,7 @@ sidebar: validmind-reference {% if module.members.__version__ %} ### \\_\\_version\\_\\_ + ```python {{ module.members.__version__.value | replace("'", "") if module.members.__version__.value else module.members.__version__.members.__version__.value | replace("'", "") }} ``` @@ -33,6 +34,7 @@ sidebar: validmind-reference ### {{ member.name }}[()]{.muted} {% if target.kind == "function" %} + ```python {% if target.labels and "async" in target.labels %}async {% endif %} def {{ member.name }}( @@ -75,6 +77,7 @@ def {{ member.name }}( {% if resolved.kind == "function" %} ## {{ member.name }}[()]{.muted} + ```python {% if resolved.labels and "async" in resolved.labels %}async {% endif %}def {{ member.name }}( {% for param in resolved.parameters %} @@ -115,6 +118,7 @@ def {{ member.name }}( ### [class]{.muted} {{ member.name }} + ```python class {{ member.name }}(): ``` @@ -129,6 +133,7 @@ class {{ member.name }}(): #### {{ member.name if method_name == '__init__' else method_name }}[()]{.muted} + ```python def {{ method_name }}( {%- for param in method.parameters %} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 7c9db1d20..cf0a59acd 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -34,12 +34,16 @@ After you have pasted the code snippet into your development source code and exe ### \\_\\_version\\_\\_ + + ```python 2.8.4 ``` ### get_test_suite[()]{.muted} + + ```python def get_test_suite( test_suite_id: str = None, @@ -59,6 +63,8 @@ Gets a TestSuite object for the current project or a specific test suite This fu ### init[()]{.muted} + + ```python def init( project: Optional = None, @@ -90,6 +96,8 @@ If the API key and secret are not provided, the client will attempt to retrieve ### init_dataset[()]{.muted} + + ```python def init_dataset( dataset, @@ -125,6 +133,8 @@ Returns: vm.vm.Dataset: A VM Dataset instance ### init_model[()]{.muted} + + ```python def init_model( model: object = None, @@ -155,6 +165,8 @@ Initializes a VM Model, which can then be passed to other functions that can per ### init_r_model[()]{.muted} + + ```python def init_r_model( model_path: str, @@ -181,6 +193,8 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ### log_metric[()]{.muted} + + ```python def log_metric( key: str, @@ -204,6 +218,8 @@ Logs a unit metric Unit metrics are key-value pairs where the key is the metric ### preview_template[()]{.muted} + + ```python def preview_template( ): @@ -217,6 +233,8 @@ Preview the documentation template for the current project This function will di ### print_env[()]{.muted} + + ```python def print_env( ): @@ -226,6 +244,8 @@ Prints a log of the running environment for debugging. Output includes: ValidMin ### reload[()]{.muted} + + ```python def reload( ): @@ -235,6 +255,8 @@ Reconnect to the ValidMind API and reload the project configuration ### run_documentation_tests[()]{.muted} + + ```python def run_documentation_tests( section = None, @@ -266,6 +288,8 @@ Collect and run all the tests associated with a template This function will anal ### run_test_suite[()]{.muted} + + ```python def run_test_suite( test_suite_id, @@ -297,6 +321,8 @@ High Level function for running a test suite This function provides a high level ### tags[()]{.muted} + + ```python def tags( *tags = ()): @@ -310,6 +336,8 @@ Decorator for specifying tags for a test. ### tasks[()]{.muted} + + ```python def tasks( *tasks = ()): @@ -323,6 +351,8 @@ Decorator for specifying the task types that a test is designed for. ### test[()]{.muted} + + ```python def test( func_or_id): @@ -355,6 +385,8 @@ The function may also include a docstring. This docstring will be used and logge ### [class]{.muted} RawData + + ```python class RawData(): ``` @@ -363,6 +395,8 @@ Holds raw data for a test result #### RawData[()]{.muted} + + ```python def __init__( self, log: bool = False, @@ -378,6 +412,8 @@ Create a new RawData object #### inspect[()]{.muted} + + ```python def inspect( self, show: bool = True): @@ -387,6 +423,8 @@ Inspect the raw data #### serialize[()]{.muted} + + ```python def serialize( self): ``` diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index 6b8c8ff3b..c843917b0 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## simple_preprocess_booleans[()]{.muted} + + ```python def simple_preprocess_booleans( df, columns): @@ -23,6 +25,8 @@ Preprocess boolean columns. ## simple_preprocess_categoricals[()]{.muted} + + ```python def simple_preprocess_categoricals( df, columns): @@ -41,6 +45,8 @@ Preprocess categorical columns. ## simple_preprocess_numericals[()]{.muted} + + ```python def simple_preprocess_numericals( df, columns): @@ -59,6 +65,8 @@ Preprocess numerical columns. ## get_demo_test_config[()]{.muted} + + ```python def get_demo_test_config( test_suite = None): @@ -83,6 +91,8 @@ We assign the following inputs depending on the input config expected by each te ## load_data[()]{.muted} + + ```python def load_data( full_dataset = False): @@ -90,6 +100,8 @@ def load_data( ## preprocess[()]{.muted} + + ```python def preprocess( df): diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index d1a7ae255..7aebbf2d5 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## simple_preprocess_booleans[()]{.muted} + + ```python def simple_preprocess_booleans( df, columns): @@ -23,6 +25,8 @@ Preprocess boolean columns. ## simple_preprocess_categoricals[()]{.muted} + + ```python def simple_preprocess_categoricals( df, columns): @@ -41,6 +45,8 @@ Preprocess categorical columns. ## simple_preprocess_numericals[()]{.muted} + + ```python def simple_preprocess_numericals( df, columns): @@ -59,6 +65,8 @@ Preprocess numerical columns. ## load_data[()]{.muted} + + ```python def load_data( ): @@ -66,6 +74,8 @@ def load_data( ## preprocess[()]{.muted} + + ```python def preprocess( df): diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index 8a8f1831a..11079612e 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## compute_scores[()]{.muted} + + ```python def compute_scores( probabilities): @@ -12,6 +14,8 @@ def compute_scores( ## feature_engineering[()]{.muted} + + ```python def feature_engineering( df, @@ -20,6 +24,8 @@ def feature_engineering( ## get_demo_test_config[()]{.muted} + + ```python def get_demo_test_config( x_test = None, @@ -39,6 +45,8 @@ Get demo test configuration. ## init_vm_objects[()]{.muted} + + ```python def init_vm_objects( scorecard): @@ -46,6 +54,8 @@ def init_vm_objects( ## load_data[()]{.muted} + + ```python def load_data( source = 'online', @@ -56,6 +66,8 @@ Load data from either an online source or offline files, automatically dropping ## load_scorecard[()]{.muted} + + ```python def load_scorecard( ): @@ -63,6 +75,8 @@ def load_scorecard( ## load_test_config[()]{.muted} + + ```python def load_test_config( scorecard): @@ -70,6 +84,8 @@ def load_test_config( ## preprocess[()]{.muted} + + ```python def preprocess( df, @@ -78,6 +94,8 @@ def preprocess( ## split[()]{.muted} + + ```python def split( df, @@ -102,6 +120,8 @@ Split dataset into train, validation (optional), and test sets. ## woe_encoding[()]{.muted} + + ```python def woe_encoding( df, diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 00030b60a..2fe93ffa9 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## compute_scores[()]{.muted} + + ```python def compute_scores( probabilities): @@ -12,6 +14,8 @@ def compute_scores( ## load_data[()]{.muted} + + ```python def load_data( ): @@ -21,6 +25,8 @@ Load data from the specified CSV file. :return: DataFrame containing the loaded ## preprocess[()]{.muted} + + ```python def preprocess( df): @@ -28,6 +34,8 @@ def preprocess( ## split[()]{.muted} + + ```python def split( df, diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index 9af90d74b..d36612d17 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## display_nice[()]{.muted} + + ```python def display_nice( df, @@ -15,6 +17,8 @@ Primary function to format and display a DataFrame. ## load_data[()]{.muted} + + ```python def load_data( source = 'online', diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index 5281f3601..41d271f1c 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## load_data[()]{.muted} + + ```python def load_data( full_dataset = False): diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index 9b38dcc25..130cb8069 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## load_all_data[()]{.muted} + + ```python def load_all_data( ): @@ -12,6 +14,8 @@ def load_all_data( ## load_data[()]{.muted} + + ```python def load_data( ): @@ -19,6 +23,8 @@ def load_data( ## load_model[()]{.muted} + + ```python def load_model( model_name): @@ -26,6 +32,8 @@ def load_model( ## load_processed_data[()]{.muted} + + ```python def load_processed_data( ): @@ -33,6 +41,8 @@ def load_processed_data( ## load_test_dataset[()]{.muted} + + ```python def load_test_dataset( model_name): @@ -40,6 +50,8 @@ def load_test_dataset( ## load_train_dataset[()]{.muted} + + ```python def load_train_dataset( model_path): @@ -47,6 +59,8 @@ def load_train_dataset( ## preprocess[()]{.muted} + + ```python def preprocess( df, @@ -70,6 +84,8 @@ Split a time series DataFrame into train, validation, and test sets. ## transform[()]{.muted} + + ```python def transform( df, diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 70d44390e..f4a15179f 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## load_data[()]{.muted} + + ```python def load_data( ): @@ -12,6 +14,8 @@ def load_data( ## preprocess[()]{.muted} + + ```python def preprocess( df, @@ -35,6 +39,8 @@ Split a time series DataFrame into train, validation, and test sets. ## transform[()]{.muted} + + ```python def transform( df, diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index bf89d61c6..bc3a68cfb 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -10,6 +10,8 @@ This module contains all the custom errors that are used in the ValidMind Librar ## [class]{.muted} APIRequestError + + ```python class APIRequestError(BaseError): ``` @@ -23,6 +25,8 @@ Generic error for API request errors that are not known. ## [class]{.muted} BaseError + + ```python class BaseError(Exception): ``` @@ -33,12 +37,16 @@ class BaseError(Exception): ### [description[()]{.muted}](#description) + + ```python description(self, args, kwargs) ``` ## [class]{.muted} GetTestSuiteError + + ```python class GetTestSuiteError(BaseError): ``` @@ -52,6 +60,8 @@ When the test suite could not be found. ## [class]{.muted} InitializeTestSuiteError + + ```python class InitializeTestSuiteError(BaseError): ``` @@ -65,6 +75,8 @@ When the test suite was found but could not be initialized. ## [class]{.muted} InvalidAPICredentialsError + + ```python class InvalidAPICredentialsError(APIRequestError): ``` @@ -76,12 +88,16 @@ class InvalidAPICredentialsError(APIRequestError): ### [description[()]{.muted}](#description) + + ```python description(self, args, kwargs) ``` ## [class]{.muted} InvalidContentIdPrefixError + + ```python class InvalidContentIdPrefixError(APIRequestError): ``` @@ -95,6 +111,8 @@ When an invalid text content_id is sent to the API. ## [class]{.muted} InvalidInputError + + ```python class InvalidInputError(BaseError): ``` @@ -108,6 +126,8 @@ When an invalid input object. ## [class]{.muted} InvalidMetricResultsError + + ```python class InvalidMetricResultsError(APIRequestError): ``` @@ -121,6 +141,8 @@ When an invalid metric results object is sent to the API. ## [class]{.muted} InvalidProjectError + + ```python class InvalidProjectError(APIRequestError): ``` @@ -132,12 +154,16 @@ class InvalidProjectError(APIRequestError): ### [description[()]{.muted}](#description) + + ```python description(self, args, kwargs) ``` ## [class]{.muted} InvalidRequestBodyError + + ```python class InvalidRequestBodyError(APIRequestError): ``` @@ -151,6 +177,8 @@ When a POST/PUT request is made with an invalid request body. ## [class]{.muted} InvalidTestParametersError + + ```python class InvalidTestParametersError(BaseError): ``` @@ -164,6 +192,8 @@ When an invalid parameters for the test. ## [class]{.muted} InvalidTestResultsError + + ```python class InvalidTestResultsError(APIRequestError): ``` @@ -177,6 +207,8 @@ When an invalid test results object is sent to the API. ## [class]{.muted} InvalidTextObjectError + + ```python class InvalidTextObjectError(APIRequestError): ``` @@ -190,6 +222,8 @@ When an invalid Metadat (Text) object is sent to the API. ## [class]{.muted} InvalidValueFormatterError + + ```python class InvalidValueFormatterError(BaseError): ``` @@ -203,6 +237,8 @@ When an invalid value formatter is provided when serializing results. ## [class]{.muted} InvalidXGBoostTrainedModelError + + ```python class InvalidXGBoostTrainedModelError(BaseError): ``` @@ -216,6 +252,8 @@ When an invalid XGBoost trained model is used when calling init_r_model. ## [class]{.muted} LoadTestError + + ```python class LoadTestError(BaseError): ``` @@ -229,6 +267,8 @@ Exception raised when an error occurs while loading a test ## [class]{.muted} MismatchingClassLabelsError + + ```python class MismatchingClassLabelsError(BaseError): ``` @@ -242,6 +282,8 @@ When the class labels found in the dataset don't match the provided target label ## [class]{.muted} MissingAPICredentialsError + + ```python class MissingAPICredentialsError(BaseError): ``` @@ -253,12 +295,16 @@ class MissingAPICredentialsError(BaseError): ### [description[()]{.muted}](#description) + + ```python description(self, args, kwargs) ``` ## [class]{.muted} MissingCacheResultsArgumentsError + + ```python class MissingCacheResultsArgumentsError(BaseError): ``` @@ -272,6 +318,8 @@ When the cache_results function is missing arguments. ## [class]{.muted} MissingClassLabelError + + ```python class MissingClassLabelError(BaseError): ``` @@ -285,6 +333,8 @@ When the one or more class labels are missing from provided dataset targets. ## [class]{.muted} MissingDependencyError + + ```python class MissingDependencyError(BaseError): ``` @@ -298,6 +348,8 @@ When a required dependency is missing. ## [class]{.muted} MissingDocumentationTemplate + + ```python class MissingDocumentationTemplate(BaseError): ``` @@ -311,6 +363,8 @@ When the client config is missing the documentation template. ## [class]{.muted} MissingModelIdError + + ```python class MissingModelIdError(BaseError): ``` @@ -322,12 +376,16 @@ class MissingModelIdError(BaseError): ### [description[()]{.muted}](#description) + + ```python description(self, args, kwargs) ``` ## [class]{.muted} MissingOrInvalidModelPredictFnError + + ```python class MissingOrInvalidModelPredictFnError(BaseError): ``` @@ -341,6 +399,8 @@ When the pytorch model is missing a predict function or its predict method does ## [class]{.muted} MissingRequiredTestInputError + + ```python class MissingRequiredTestInputError(BaseError): ``` @@ -354,6 +414,8 @@ When a required test context variable is missing. ## [class]{.muted} MissingRExtrasError + + ```python class MissingRExtrasError(BaseError): ``` @@ -367,12 +429,16 @@ When the R extras have not been installed. ### [description[()]{.muted}](#description) + + ```python description(self, args, kwargs) ``` ## [class]{.muted} MissingTextContentIdError + + ```python class MissingTextContentIdError(APIRequestError): ``` @@ -386,6 +452,8 @@ When a Text object is sent to the API without a content_id. ## [class]{.muted} MissingTextContentsError + + ```python class MissingTextContentsError(APIRequestError): ``` @@ -399,6 +467,8 @@ When a Text object is sent to the API without a "text" attribute. ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` @@ -412,6 +482,8 @@ Useful error to throw when a test cannot be executed. ## [class]{.muted} TestInputInvalidDatasetError + + ```python class TestInputInvalidDatasetError(BaseError): ``` @@ -425,6 +497,8 @@ When an invalid dataset is used in a test context. ## [class]{.muted} UnsupportedColumnTypeError + + ```python class UnsupportedColumnTypeError(BaseError): ``` @@ -438,6 +512,8 @@ When an unsupported column type is found on a dataset. ## [class]{.muted} UnsupportedDatasetError + + ```python class UnsupportedDatasetError(BaseError): ``` @@ -451,6 +527,8 @@ When an unsupported dataset is used. ## [class]{.muted} UnsupportedFigureError + + ```python class UnsupportedFigureError(BaseError): ``` @@ -464,6 +542,8 @@ When an unsupported figure object is constructed. ## [class]{.muted} UnsupportedModelError + + ```python class UnsupportedModelError(BaseError): ``` @@ -477,6 +557,8 @@ When an unsupported model is used. ## [class]{.muted} UnsupportedModelForSHAPError + + ```python class UnsupportedModelForSHAPError(BaseError): ``` @@ -490,6 +572,8 @@ When an unsupported model is used for SHAP importance. ## [class]{.muted} UnsupportedRModelError + + ```python class UnsupportedRModelError(BaseError): ``` @@ -503,6 +587,8 @@ When an unsupported R model is used. ## raise_api_error[()]{.muted} + + ```python def raise_api_error( error_string): @@ -512,6 +598,8 @@ Safely try to parse JSON from the response message in case the API returns a non ## should_raise_on_fail_fast[()]{.muted} + + ```python def should_raise_on_fail_fast( error) -> bool: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index aaca42c88..33ae7f5de 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -20,6 +20,8 @@ Entrypoint for test suites. ## format_dataframe[()]{.muted} + + ```python def format_dataframe( df: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: @@ -29,6 +31,8 @@ Format a pandas DataFrame for display purposes ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -38,6 +42,8 @@ Get a logger for the given module name ## test_id_to_name[()]{.muted} + + ```python def test_id_to_name( test_id: {'cls': 'ExprName', 'name': 'str'}) -> {'cls': 'ExprName', 'name': 'str'}: @@ -55,6 +61,8 @@ Convert a test ID to a human-readable name. ## describe_suite[()]{.muted} + + ```python def describe_suite( test_suite_id: str, @@ -74,6 +82,8 @@ Describes a Test Suite by ID ## get_by_id[()]{.muted} + + ```python def get_by_id( test_suite_id: str): @@ -83,6 +93,8 @@ Returns the test suite by ID ## list_suites[()]{.muted} + + ```python def list_suites( pretty: bool = True): @@ -92,6 +104,8 @@ Returns a list of all available test suites ## register_test_suite[()]{.muted} + + ```python def register_test_suite( suite_id: str, @@ -102,6 +116,8 @@ Registers a custom test suite ## [class]{.muted} ClassifierDiagnosis + + ```python class ClassifierDiagnosis(TestSuite): ``` @@ -112,6 +128,8 @@ Test suite for sklearn classifier model diagnosis tests ## [class]{.muted} ClassifierFullSuite + + ```python class ClassifierFullSuite(TestSuite): ``` @@ -122,6 +140,8 @@ Full test suite for binary classification models. ## [class]{.muted} ClassifierMetrics + + ```python class ClassifierMetrics(TestSuite): ``` @@ -132,6 +152,8 @@ Test suite for sklearn classifier metrics ## [class]{.muted} ClassifierModelValidation + + ```python class ClassifierModelValidation(TestSuite): ``` @@ -142,6 +164,8 @@ Test suite for binary classification models. ## [class]{.muted} ClassifierPerformance + + ```python class ClassifierPerformance(TestSuite): ``` @@ -152,6 +176,8 @@ Test suite for sklearn classifier models ## [class]{.muted} ClusterFullSuite + + ```python class ClusterFullSuite(TestSuite): ``` @@ -162,6 +188,8 @@ Full test suite for clustering models. ## [class]{.muted} ClusterMetrics + + ```python class ClusterMetrics(TestSuite): ``` @@ -172,6 +200,8 @@ Test suite for sklearn clustering metrics ## [class]{.muted} ClusterPerformance + + ```python class ClusterPerformance(TestSuite): ``` @@ -182,6 +212,8 @@ Test suite for sklearn cluster performance ## [class]{.muted} EmbeddingsFullSuite + + ```python class EmbeddingsFullSuite(TestSuite): ``` @@ -192,6 +224,8 @@ Full test suite for embeddings models. ## [class]{.muted} EmbeddingsMetrics + + ```python class EmbeddingsMetrics(TestSuite): ``` @@ -202,6 +236,8 @@ Test suite for embeddings metrics ## [class]{.muted} EmbeddingsPerformance + + ```python class EmbeddingsPerformance(TestSuite): ``` @@ -212,6 +248,8 @@ Test suite for embeddings model performance ## [class]{.muted} KmeansParametersOptimization + + ```python class KmeansParametersOptimization(TestSuite): ``` @@ -222,6 +260,8 @@ Test suite for sklearn hyperparameters optimization ## [class]{.muted} LLMClassifierFullSuite + + ```python class LLMClassifierFullSuite(TestSuite): ``` @@ -232,6 +272,8 @@ Full test suite for LLM classification models. ## [class]{.muted} NLPClassifierFullSuite + + ```python class NLPClassifierFullSuite(TestSuite): ``` @@ -242,6 +284,8 @@ Full test suite for NLP classification models. ## [class]{.muted} PromptValidation + + ```python class PromptValidation(TestSuite): ``` @@ -252,6 +296,8 @@ Test suite for prompt validation ## [class]{.muted} RegressionFullSuite + + ```python class RegressionFullSuite(TestSuite): ``` @@ -262,6 +308,8 @@ Full test suite for regression models. ## [class]{.muted} RegressionMetrics + + ```python class RegressionMetrics(TestSuite): ``` @@ -272,6 +320,8 @@ Test suite for performance metrics of regression metrics ## [class]{.muted} RegressionModelDescription + + ```python class RegressionModelDescription(TestSuite): ``` @@ -282,6 +332,8 @@ Test suite for performance metric of regression model of statsmodels library ## [class]{.muted} RegressionModelsEvaluation + + ```python class RegressionModelsEvaluation(TestSuite): ``` @@ -292,6 +344,8 @@ Test suite for metrics comparison of regression model of statsmodels library ## [class]{.muted} RegressionPerformance + + ```python class RegressionPerformance(TestSuite): ``` @@ -302,6 +356,8 @@ Test suite for regression model performance ## [class]{.muted} SummarizationMetrics + + ```python class SummarizationMetrics(TestSuite): ``` @@ -312,6 +368,8 @@ Test suite for Summarization metrics ## [class]{.muted} TabularDataQuality + + ```python class TabularDataQuality(TestSuite): ``` @@ -322,6 +380,8 @@ Test suite for data quality on tabular datasets ## [class]{.muted} TabularDataset + + ```python class TabularDataset(TestSuite): ``` @@ -332,6 +392,8 @@ Test suite for tabular datasets. ## [class]{.muted} TabularDatasetDescription + + ```python class TabularDatasetDescription(TestSuite): ``` @@ -342,6 +404,8 @@ Test suite to extract metadata and descriptive statistics from a tabular dataset ## [class]{.muted} TextDataQuality + + ```python class TextDataQuality(TestSuite): ``` @@ -352,6 +416,8 @@ Test suite for data quality on text data ## [class]{.muted} TimeSeriesDataQuality + + ```python class TimeSeriesDataQuality(TestSuite): ``` @@ -362,6 +428,8 @@ Test suite for data quality on time series datasets ## [class]{.muted} TimeSeriesDataset + + ```python class TimeSeriesDataset(TestSuite): ``` @@ -372,6 +440,8 @@ Test suite for time series datasets. ## [class]{.muted} TimeSeriesModelValidation + + ```python class TimeSeriesModelValidation(TestSuite): ``` @@ -382,6 +452,8 @@ Test suite for time series model validation. ## [class]{.muted} TimeSeriesMultivariate + + ```python class TimeSeriesMultivariate(TestSuite): ``` @@ -392,6 +464,8 @@ This test suite provides a preliminary understanding of the features and relatio ## [class]{.muted} TimeSeriesUnivariate + + ```python class TimeSeriesUnivariate(TestSuite): ``` diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index 0483c3d91..7c0803524 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -7,6 +7,8 @@ Test suites for sklearn-compatible classifier models Ideal setup is to have the ## [class]{.muted} ClassifierDiagnosis + + ```python class ClassifierDiagnosis(TestSuite): ``` @@ -17,6 +19,8 @@ Test suite for sklearn classifier model diagnosis tests ## [class]{.muted} ClassifierFullSuite + + ```python class ClassifierFullSuite(TestSuite): ``` @@ -27,6 +31,8 @@ Full test suite for binary classification models. ## [class]{.muted} ClassifierMetrics + + ```python class ClassifierMetrics(TestSuite): ``` @@ -37,6 +43,8 @@ Test suite for sklearn classifier metrics ## [class]{.muted} ClassifierModelValidation + + ```python class ClassifierModelValidation(TestSuite): ``` @@ -47,6 +55,8 @@ Test suite for binary classification models. ## [class]{.muted} ClassifierPerformance + + ```python class ClassifierPerformance(TestSuite): ``` @@ -57,6 +67,8 @@ Test suite for sklearn classifier models ## [class]{.muted} TabularDataQuality + + ```python class TabularDataQuality(TestSuite): ``` @@ -67,6 +79,8 @@ Test suite for data quality on tabular datasets ## [class]{.muted} TabularDatasetDescription + + ```python class TabularDatasetDescription(TestSuite): ``` diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index c42db0a9a..36d43ad49 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -7,6 +7,8 @@ Test suites for sklearn-compatible clustering models Ideal setup is to have the ## [class]{.muted} ClusterFullSuite + + ```python class ClusterFullSuite(TestSuite): ``` @@ -17,6 +19,8 @@ Full test suite for clustering models. ## [class]{.muted} ClusterMetrics + + ```python class ClusterMetrics(TestSuite): ``` @@ -27,6 +31,8 @@ Test suite for sklearn clustering metrics ## [class]{.muted} ClusterPerformance + + ```python class ClusterPerformance(TestSuite): ``` @@ -37,6 +43,8 @@ Test suite for sklearn cluster performance ## [class]{.muted} KmeansParametersOptimization + + ```python class KmeansParametersOptimization(TestSuite): ``` diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index 0172e4d58..427bf748c 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -7,6 +7,8 @@ Test suites for embeddings models Ideal setup is to have the API client to read ## [class]{.muted} EmbeddingsFullSuite + + ```python class EmbeddingsFullSuite(TestSuite): ``` @@ -17,6 +19,8 @@ Full test suite for embeddings models. ## [class]{.muted} EmbeddingsMetrics + + ```python class EmbeddingsMetrics(TestSuite): ``` @@ -27,6 +31,8 @@ Test suite for embeddings metrics ## [class]{.muted} EmbeddingsPerformance + + ```python class EmbeddingsPerformance(TestSuite): ``` diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index bc579ccee..d68c3c000 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -7,6 +7,8 @@ Test suites for LLMs ## [class]{.muted} LLMClassifierFullSuite + + ```python class LLMClassifierFullSuite(TestSuite): ``` @@ -17,6 +19,8 @@ Full test suite for LLM classification models. ## [class]{.muted} PromptValidation + + ```python class PromptValidation(TestSuite): ``` @@ -27,6 +31,8 @@ Test suite for prompt validation ## [class]{.muted} ClassifierDiagnosis + + ```python class ClassifierDiagnosis(TestSuite): ``` @@ -37,6 +43,8 @@ Test suite for sklearn classifier model diagnosis tests ## [class]{.muted} ClassifierMetrics + + ```python class ClassifierMetrics(TestSuite): ``` @@ -47,6 +55,8 @@ Test suite for sklearn classifier metrics ## [class]{.muted} ClassifierPerformance + + ```python class ClassifierPerformance(TestSuite): ``` @@ -57,6 +67,8 @@ Test suite for sklearn classifier models ## [class]{.muted} TextDataQuality + + ```python class TextDataQuality(TestSuite): ``` diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index 2619dd691..0c99a2fbe 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -7,6 +7,8 @@ Test suites for NLP models ## [class]{.muted} NLPClassifierFullSuite + + ```python class NLPClassifierFullSuite(TestSuite): ``` @@ -17,6 +19,8 @@ Full test suite for NLP classification models. ## [class]{.muted} ClassifierDiagnosis + + ```python class ClassifierDiagnosis(TestSuite): ``` @@ -27,6 +31,8 @@ Test suite for sklearn classifier model diagnosis tests ## [class]{.muted} ClassifierMetrics + + ```python class ClassifierMetrics(TestSuite): ``` @@ -37,6 +43,8 @@ Test suite for sklearn classifier metrics ## [class]{.muted} ClassifierPerformance + + ```python class ClassifierPerformance(TestSuite): ``` @@ -47,6 +55,8 @@ Test suite for sklearn classifier models ## [class]{.muted} TextDataQuality + + ```python class TextDataQuality(TestSuite): ``` diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index c22075c1d..a6da9e38b 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -7,6 +7,8 @@ Test suites for sklearn-compatible hyper parameters tunning Ideal setup is to ha ## [class]{.muted} KmeansParametersOptimization + + ```python class KmeansParametersOptimization(TestSuite): ``` diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index 280e605fa..3aea4073a 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## [class]{.muted} RegressionFullSuite + + ```python class RegressionFullSuite(TestSuite): ``` @@ -15,6 +17,8 @@ Full test suite for regression models. ## [class]{.muted} RegressionMetrics + + ```python class RegressionMetrics(TestSuite): ``` @@ -25,6 +29,8 @@ Test suite for performance metrics of regression metrics ## [class]{.muted} RegressionPerformance + + ```python class RegressionPerformance(TestSuite): ``` @@ -35,6 +41,8 @@ Test suite for regression model performance ## [class]{.muted} TabularDataQuality + + ```python class TabularDataQuality(TestSuite): ``` @@ -45,6 +53,8 @@ Test suite for data quality on tabular datasets ## [class]{.muted} TabularDatasetDescription + + ```python class TabularDatasetDescription(TestSuite): ``` diff --git a/docs/validmind/test_suites/statsmodels_timeseries.qmd b/docs/validmind/test_suites/statsmodels_timeseries.qmd index 48d4e6ccf..725354022 100644 --- a/docs/validmind/test_suites/statsmodels_timeseries.qmd +++ b/docs/validmind/test_suites/statsmodels_timeseries.qmd @@ -7,6 +7,8 @@ Time Series Test Suites from statsmodels ## [class]{.muted} RegressionModelDescription + + ```python class RegressionModelDescription(TestSuite): ``` @@ -17,6 +19,8 @@ Test suite for performance metric of regression model of statsmodels library ## [class]{.muted} RegressionModelsEvaluation + + ```python class RegressionModelsEvaluation(TestSuite): ``` diff --git a/docs/validmind/test_suites/summarization.qmd b/docs/validmind/test_suites/summarization.qmd index a6b8e06a0..9d4fdf7d7 100644 --- a/docs/validmind/test_suites/summarization.qmd +++ b/docs/validmind/test_suites/summarization.qmd @@ -7,6 +7,8 @@ Test suites for llm summarization models ## [class]{.muted} SummarizationMetrics + + ```python class SummarizationMetrics(TestSuite): ``` diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd index bde08da01..21cf2b620 100644 --- a/docs/validmind/test_suites/tabular_datasets.qmd +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -7,6 +7,8 @@ Test suites for tabular datasets ## [class]{.muted} TabularDataQuality + + ```python class TabularDataQuality(TestSuite): ``` @@ -17,6 +19,8 @@ Test suite for data quality on tabular datasets ## [class]{.muted} TabularDataset + + ```python class TabularDataset(TestSuite): ``` @@ -27,6 +31,8 @@ Test suite for tabular datasets. ## [class]{.muted} TabularDatasetDescription + + ```python class TabularDatasetDescription(TestSuite): ``` diff --git a/docs/validmind/test_suites/text_data.qmd b/docs/validmind/test_suites/text_data.qmd index 4cd45912f..9daa7e65b 100644 --- a/docs/validmind/test_suites/text_data.qmd +++ b/docs/validmind/test_suites/text_data.qmd @@ -7,6 +7,8 @@ Test suites for text datasets ## [class]{.muted} TextDataQuality + + ```python class TextDataQuality(TestSuite): ``` diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index b488309ef..48bfe873e 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -7,6 +7,8 @@ Time Series Test Suites ## [class]{.muted} TimeSeriesDataQuality + + ```python class TimeSeriesDataQuality(TestSuite): ``` @@ -17,6 +19,8 @@ Test suite for data quality on time series datasets ## [class]{.muted} TimeSeriesDataset + + ```python class TimeSeriesDataset(TestSuite): ``` @@ -27,6 +31,8 @@ Test suite for time series datasets. ## [class]{.muted} TimeSeriesModelValidation + + ```python class TimeSeriesModelValidation(TestSuite): ``` @@ -37,6 +43,8 @@ Test suite for time series model validation. ## [class]{.muted} TimeSeriesMultivariate + + ```python class TimeSeriesMultivariate(TestSuite): ``` @@ -47,6 +55,8 @@ This test suite provides a preliminary understanding of the features and relatio ## [class]{.muted} TimeSeriesUnivariate + + ```python class TimeSeriesUnivariate(TestSuite): ``` @@ -59,6 +69,8 @@ The raw time series data provides a visual inspection of the target variable's b ## [class]{.muted} RegressionModelDescription + + ```python class RegressionModelDescription(TestSuite): ``` @@ -69,6 +81,8 @@ Test suite for performance metric of regression model of statsmodels library ## [class]{.muted} RegressionModelsEvaluation + + ```python class RegressionModelsEvaluation(TestSuite): ``` diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 958c57f99..3527b536f 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -11,6 +11,8 @@ ValidMind Tests Module ## describe_test[()]{.muted} + + ```python def describe_test( test_id: {'cls': 'ExprName', 'name': 'TestID'} = None, raw: {'cls': 'ExprName', 'name': 'bool'} = False, show: {'cls': 'ExprName', 'name': 'bool'} = True): @@ -25,6 +27,8 @@ Get or show details about the test This function can be used to see test details ## list_tags[()]{.muted} + + ```python def list_tags( ): @@ -34,6 +38,8 @@ List unique tags from all test classes. ## list_tasks[()]{.muted} + + ```python def list_tasks( ): @@ -43,6 +49,8 @@ List unique tasks from all test classes. ## list_tasks_and_tags[()]{.muted} + + ```python def list_tasks_and_tags( as_json = False): @@ -56,6 +64,8 @@ List all task types and their associated tags, with one row per task type and al ## list_tests[()]{.muted} + + ```python def list_tests( filter = None, task = None, tags = None, pretty = True, truncate = True): @@ -77,6 +87,8 @@ List all tests in the tests directory. ## load_test[()]{.muted} + + ```python def load_test( test_id: {'cls': 'ExprName', 'name': 'str'}, test_func: {'cls': 'ExprName', 'name': 'callable'} = None, reload: {'cls': 'ExprName', 'name': 'bool'} = False): @@ -91,6 +103,8 @@ Load a test by test ID Test IDs are in the format `namespace.path_to_module.Test ## run_test[()]{.muted} + + ```python def run_test( test_id: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'TestID'}, 'None'], 'implicit': True}} = None, name: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None, unit_metrics: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'TestID'}}, 'None'], 'implicit': True}} = None, inputs: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, 'None'], 'implicit': True}} = None, input_grid: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'Any'}}], 'implicit': True}}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}, 'None'], 'implicit': True}} = None, params: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, 'None'], 'implicit': True}} = None, param_grid: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'Any'}}], 'implicit': True}}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}, 'None'], 'implicit': True}} = None, show: {'cls': 'ExprName', 'name': 'bool'} = True, generate_description: {'cls': 'ExprName', 'name': 'bool'} = True, title: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, post_process_fn: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Callable'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, 'None'], 'implicit': True}}, 'None'], 'implicit': True}} = None, kwargs = {}) -> {'cls': 'ExprName', 'name': 'TestResult'}: @@ -127,6 +141,8 @@ Run a ValidMind or custom test This function is the main entry point for running ## tags[()]{.muted} + + ```python def tags( tags = ()): @@ -140,6 +156,8 @@ Decorator for specifying tags for a test. ## tasks[()]{.muted} + + ```python def tasks( tasks = ()): @@ -153,6 +171,8 @@ Decorator for specifying the task types that a test is designed for. ## test[()]{.muted} + + ```python def test( func_or_id): @@ -185,6 +205,8 @@ The function may also include a docstring. This docstring will be used and logge ## register_test_provider[()]{.muted} + + ```python def register_test_provider( namespace: str, @@ -200,6 +222,8 @@ Register an external test provider ## [class]{.muted} LoadTestError + + ```python class LoadTestError(BaseError): ``` @@ -213,6 +237,8 @@ Exception raised when an error occurs while loading a test ## [class]{.muted} LocalTestProvider + + ```python class LocalTestProvider(): ``` @@ -246,6 +272,8 @@ test = test_provider.load_test("my_namespace.my_test_class") ### [list_tests[()]{.muted}](#list_tests) + + ```python list_tests(self) ``` @@ -258,6 +286,8 @@ List all tests in the given namespace ### [load_test[()]{.muted}](#load_test) + + ```python load_test(self, test_id) ``` @@ -270,6 +300,8 @@ Raises: LocalTestProviderLoadModuleError: If the test module cannot be imported ## [class]{.muted} TestProvider + + ```python class TestProvider(Protocol): ``` @@ -280,6 +312,8 @@ Protocol for user-defined test providers ### [list_tests[()]{.muted}](#list_tests) + + ```python list_tests(self) ``` @@ -292,6 +326,8 @@ List all tests in the given namespace ### [load_test[()]{.muted}](#load_test) + + ```python load_test(self, test_id) ``` diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 794a6cfe2..af04765f8 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ACFandPACFPlot[()]{.muted} + + ```python def ACFandPACFPlot( dataset: VMDataset): diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index c83f5a95d..9e5d2b5d5 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## ADF[()]{.muted} + + ```python def ADF( dataset: VMDataset): diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 8f654e818..033d52689 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## AutoAR[()]{.muted} + + ```python def AutoAR( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index dc904f51a..d28cdf6ba 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## AutoMA[()]{.muted} + + ```python def AutoMA( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index d06d954dd..f50723e4c 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## AutoStationarity[()]{.muted} + + ```python def AutoStationarity( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 392bd01a9..b73c6d2c9 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## BivariateScatterPlots[()]{.muted} + + ```python def BivariateScatterPlots( dataset): diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index dbc68d816..3c765d11f 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## BoxPierce[()]{.muted} + + ```python def BoxPierce( dataset): diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index a8ae83021..36aca0779 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ChiSquaredFeaturesTable[()]{.muted} + + ```python def ChiSquaredFeaturesTable( dataset, @@ -41,6 +43,8 @@ The function creates a contingency table for each categorical feature and the ta ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 5ae61f7f9..0d465ae9b 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -7,6 +7,8 @@ Threshold based tests ## ClassImbalance[()]{.muted} + + ```python def ClassImbalance( dataset: VMDataset, @@ -47,6 +49,8 @@ This Class Imbalance test operates by calculating the frequency (expressed as a ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 5fa4099f9..d547d78e0 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## DatasetDescription[()]{.muted} + + ```python def DatasetDescription( dataset: VMDataset): @@ -53,6 +57,8 @@ The DatasetDescription class accomplishes the purpose as follows: firstly, the t ## describe_column[()]{.muted} + + ```python def describe_column( df, @@ -63,6 +69,8 @@ Gets descriptive statistics for a single column in a Pandas DataFrame. ## get_column_histograms[()]{.muted} + + ```python def get_column_histograms( df, @@ -76,6 +84,8 @@ Will be used in favor of \_get_histogram in the future ## get_numerical_histograms[()]{.muted} + + ```python def get_numerical_histograms( df, @@ -86,6 +96,8 @@ Returns a collection of histograms for a numerical column, each one with a diffe ## infer_datatypes[()]{.muted} + + ```python def infer_datatypes( df): @@ -93,6 +105,8 @@ def infer_datatypes( ## [class]{.muted} UnsupportedColumnTypeError + + ```python class UnsupportedColumnTypeError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index ee58a987e..66ca9fe48 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## DatasetSplit[()]{.muted} + + ```python def DatasetSplit( datasets: List): diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index f27b7c271..44d8aade9 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## format_records[()]{.muted} + + ```python def format_records( df: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}: @@ -20,6 +22,8 @@ We do this for display purposes before sending data to ValidMind. Rules: ## DescriptiveStatistics[()]{.muted} + + ```python def DescriptiveStatistics( dataset: VMDataset): @@ -55,6 +59,8 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des ## get_summary_statistics_categorical[()]{.muted} + + ```python def get_summary_statistics_categorical( df, @@ -63,6 +69,8 @@ def get_summary_statistics_categorical( ## get_summary_statistics_numerical[()]{.muted} + + ```python def get_summary_statistics_numerical( df, @@ -71,6 +79,8 @@ def get_summary_statistics_numerical( ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 780f08ce8..8511c2d86 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## DickeyFullerGLS[()]{.muted} + + ```python def DickeyFullerGLS( dataset: VMDataset): @@ -47,6 +51,8 @@ This code implements the Dickey-Fuller GLS unit root test on each attribute of t ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 6feb2dfa6..fe403cc17 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## Duplicates[()]{.muted} + + ```python def Duplicates( dataset, diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 274743184..659af1586 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## EngleGrangerCoint[()]{.muted} + + ```python def EngleGrangerCoint( dataset: VMDataset, @@ -39,6 +41,8 @@ The test first drops any non-applicable values from the input dataset and then i ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 1d83ced17..a46c4c9df 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## FeatureTargetCorrelationPlot[()]{.muted} + + ```python def FeatureTargetCorrelationPlot( dataset, diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 720d91e84..a800d8c47 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## HighCardinality[()]{.muted} + + ```python def HighCardinality( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index d12375f38..01477a3a7 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## HighPearsonCorrelation[()]{.muted} + + ```python def HighPearsonCorrelation( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 0533c2232..4bcae797b 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## compute_outliers[()]{.muted} + + ```python def compute_outliers( series, @@ -13,6 +15,8 @@ def compute_outliers( ## IQROutliersBarPlot[()]{.muted} + + ```python def IQROutliersBarPlot( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 9c512a32d..5ca5326a4 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## compute_outliers[()]{.muted} + + ```python def compute_outliers( series, @@ -13,6 +15,8 @@ def compute_outliers( ## IQROutliersTable[()]{.muted} + + ```python def IQROutliersTable( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index 55976e9dd..1cc4719c0 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## IsolationForestOutliers[()]{.muted} + + ```python def IsolationForestOutliers( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index fc4c4fa93..b0440153a 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## JarqueBera[()]{.muted} + + ```python def JarqueBera( dataset): diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index ef6723fa5..dd6611c39 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## KPSS[()]{.muted} + + ```python def KPSS( dataset: VMDataset): @@ -47,6 +51,8 @@ This test calculates the KPSS score for each feature in the dataset. The KPSS sc ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 2b9cba131..66c2fcc8f 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## LJungBox[()]{.muted} + + ```python def LJungBox( dataset): diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index 3a561a931..1c1897847 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## LaggedCorrelationHeatmap[()]{.muted} + + ```python def LaggedCorrelationHeatmap( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index f288c6f17..8c1eb8544 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## MissingValues[()]{.muted} + + ```python def MissingValues( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 617e0b86a..17f31979e 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## MissingValuesBarPlot[()]{.muted} + + ```python def MissingValuesBarPlot( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 6e56e3e86..d2859ddd0 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## MutualInformation[()]{.muted} + + ```python def MutualInformation( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index 3513e47a3..196779968 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## PearsonCorrelationMatrix[()]{.muted} + + ```python def PearsonCorrelationMatrix( dataset): diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index d428b4ca6..bc09df067 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## PhillipsPerronArch[()]{.muted} + + ```python def PhillipsPerronArch( dataset: VMDataset): @@ -53,6 +57,8 @@ The PP test is conducted for each feature in the dataset as follows: ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 7a7aafcdd..b74bc028e 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## ProtectedClassesCombination[()]{.muted} + + ```python def ProtectedClassesCombination( dataset, @@ -55,6 +59,8 @@ The test performs the following steps: ## [class]{.muted} MissingDependencyError + + ```python class MissingDependencyError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index 433462f63..1dfd7947a 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## ProtectedClassesDescription[()]{.muted} + + ```python def ProtectedClassesDescription( dataset, diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index da1d6ef82..f427713db 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## ProtectedClassesDisparity[()]{.muted} + + ```python def ProtectedClassesDisparity( dataset, @@ -59,6 +63,8 @@ The test performs the following steps: ## [class]{.muted} MissingDependencyError + + ```python class MissingDependencyError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 61f54c596..ece2aaf11 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## calculate_fairness_metrics[()]{.muted} + + ```python def calculate_fairness_metrics( test_df, @@ -24,6 +28,8 @@ def calculate_fairness_metrics( ## calculate_group_metrics[()]{.muted} + + ```python def calculate_group_metrics( test_df, @@ -34,6 +40,8 @@ def calculate_group_metrics( ## get_thresholds_by_group[()]{.muted} + + ```python def get_thresholds_by_group( threshold_optimizer): @@ -41,6 +49,8 @@ def get_thresholds_by_group( ## initialize_and_fit_optimizer[()]{.muted} + + ```python def initialize_and_fit_optimizer( pipeline, @@ -51,6 +61,8 @@ def initialize_and_fit_optimizer( ## make_predictions[()]{.muted} + + ```python def make_predictions( threshold_optimizer, @@ -60,6 +72,8 @@ def make_predictions( ## plot_thresholds[()]{.muted} + + ```python def plot_thresholds( threshold_optimizer): @@ -67,6 +81,8 @@ def plot_thresholds( ## ProtectedClassesThresholdOptimizer[()]{.muted} + + ```python def ProtectedClassesThresholdOptimizer( dataset, @@ -111,6 +127,8 @@ The test uses Fairlearn's ThresholdOptimizer to: ## [class]{.muted} MissingDependencyError + + ```python class MissingDependencyError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 4a625b505..1720371b0 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## plot_rolling_statistics[()]{.muted} + + ```python def plot_rolling_statistics( df, @@ -14,6 +16,8 @@ def plot_rolling_statistics( ## RollingStatsPlot[()]{.muted} + + ```python def RollingStatsPlot( dataset: VMDataset, @@ -51,6 +55,8 @@ This mechanism is comprised of two steps. Initially, the rolling mean and standa ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 4b1a5b332..ccf6cea34 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## RunsTest[()]{.muted} + + ```python def RunsTest( dataset): diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 89f27e2be..39478ebb9 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ScatterPlot[()]{.muted} + + ```python def ScatterPlot( dataset): diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index d93720418..86638d1d2 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ScoreBandDefaultRates[()]{.muted} + + ```python def ScoreBandDefaultRates( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index e48f06a53..d9ca8e2e5 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## SeasonalDecompose[()]{.muted} + + ```python def SeasonalDecompose( dataset: VMDataset, @@ -50,6 +54,8 @@ The testing process leverages the `seasonal_decompose` function from the `statsm ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 4ccbb9638..fa0a5361a 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ShapiroWilk[()]{.muted} + + ```python def ShapiroWilk( dataset): diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index 9f313ad54..1027b6d02 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## Skewness[()]{.muted} + + ```python def Skewness( dataset, diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 0d6acb051..0baaf81c7 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## SpreadPlot[()]{.muted} + + ```python def SpreadPlot( dataset: VMDataset): @@ -42,6 +44,8 @@ The SpreadPlot test computes and represents the spread between each pair of time ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 0419cc43d..8052785aa 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## TabularCategoricalBarPlots[()]{.muted} + + ```python def TabularCategoricalBarPlots( dataset: VMDataset): @@ -39,6 +41,8 @@ The provided dataset is first checked to determine if it contains any categorica ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 37db80140..cf040b091 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## TabularDateTimeHistograms[()]{.muted} + + ```python def TabularDateTimeHistograms( dataset: VMDataset): @@ -40,6 +42,8 @@ This test operates by first identifying all datetime columns and extracting them ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 6adf22046..1db047b3e 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_categorical_columns[()]{.muted} + + ```python def get_categorical_columns( dataset): @@ -12,6 +14,8 @@ def get_categorical_columns( ## get_datetime_columns[()]{.muted} + + ```python def get_datetime_columns( dataset): @@ -19,6 +23,8 @@ def get_datetime_columns( ## get_numerical_columns[()]{.muted} + + ```python def get_numerical_columns( dataset): @@ -26,6 +32,8 @@ def get_numerical_columns( ## get_summary_statistics_categorical[()]{.muted} + + ```python def get_summary_statistics_categorical( dataset, @@ -34,6 +42,8 @@ def get_summary_statistics_categorical( ## get_summary_statistics_datetime[()]{.muted} + + ```python def get_summary_statistics_datetime( dataset, @@ -42,6 +52,8 @@ def get_summary_statistics_datetime( ## get_summary_statistics_numerical[()]{.muted} + + ```python def get_summary_statistics_numerical( dataset, @@ -50,6 +62,8 @@ def get_summary_statistics_numerical( ## TabularDescriptionTables[()]{.muted} + + ```python def TabularDescriptionTables( dataset): diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 928354baa..1d8da73cf 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## TabularNumericalHistograms[()]{.muted} + + ```python def TabularNumericalHistograms( dataset: VMDataset): diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index c4fa4f8c9..40bca565e 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## TargetRateBarPlots[()]{.muted} + + ```python def TargetRateBarPlots( dataset: VMDataset): @@ -36,6 +38,8 @@ The test involves creating a pair of bar plots for each categorical feature in t ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 4732205ec..ecc81d606 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## TimeSeriesDescription[()]{.muted} + + ```python def TimeSeriesDescription( dataset): diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 7ac571aef..0018ad8f3 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## TimeSeriesDescriptiveStatistics[()]{.muted} + + ```python def TimeSeriesDescriptiveStatistics( dataset): diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index efa23ae8b..f7fe18844 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## TimeSeriesFrequency[()]{.muted} + + ```python def TimeSeriesFrequency( dataset: VMDataset): @@ -39,6 +41,8 @@ Initially, the test checks if the dataframe index is in datetime format. Subsequ ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index f3e6335f7..35074eca3 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## TimeSeriesHistogram[()]{.muted} + + ```python def TimeSeriesHistogram( dataset, diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 4d1f34685..8ec631130 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## TimeSeriesLinePlot[()]{.muted} + + ```python def TimeSeriesLinePlot( dataset: VMDataset): @@ -41,6 +43,8 @@ The mechanism for this Python class involves extracting the column names from th ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 5577c5d3a..0ea3abd92 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## TimeSeriesMissingValues[()]{.muted} + + ```python def TimeSeriesMissingValues( dataset: VMDataset, @@ -40,6 +42,8 @@ The test method commences by validating if the dataset has a datetime index; if ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 8e1bccdcf..2609cb216 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## TimeSeriesOutliers[()]{.muted} + + ```python def TimeSeriesOutliers( dataset: VMDataset, @@ -45,6 +47,8 @@ The test processes a given dataset which must have datetime indexing, checks if ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 7f90d4933..64c83dacb 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## TooManyZeroValues[()]{.muted} + + ```python def TooManyZeroValues( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index fc2ccaa3b..89b692867 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## UniqueRows[()]{.muted} + + ```python def UniqueRows( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 1760879a7..f8289a33d 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## WOEBinPlots[()]{.muted} + + ```python def WOEBinPlots( dataset: VMDataset, @@ -53,6 +57,8 @@ The test implementation follows defined steps. Initially, it selects non-numeric ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 32b189b44..e41c5b595 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## WOEBinTable[()]{.muted} + + ```python def WOEBinTable( dataset: VMDataset, @@ -39,6 +41,8 @@ The test uses the `scorecardpy.woebin` method to perform automatic binning of th ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 5fef6860c..38fcb9a0e 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## ZivotAndrewsArch[()]{.muted} + + ```python def ZivotAndrewsArch( dataset: VMDataset): @@ -46,6 +50,8 @@ The Zivot-Andrews unit root test is performed on each feature in the dataset usi ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index 053d35d04..d83bcc4c7 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## CommonWords[()]{.muted} + + ```python def CommonWords( dataset: VMDataset): diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 8f52898ed..c52e2d545 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## Hashtags[()]{.muted} + + ```python def Hashtags( dataset: VMDataset, @@ -42,6 +44,8 @@ The test implements a regular expression (regex) to extract all hashtags from th ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index e5df57a3e..62326fdc2 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## LanguageDetection[()]{.muted} + + ```python def LanguageDetection( dataset): diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 7885309b1..a7be691a3 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## Mentions[()]{.muted} + + ```python def Mentions( dataset: VMDataset, @@ -40,6 +42,8 @@ The test first verifies the existence of a text column in the provided dataset. ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index db019e952..192c174dc 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## PolarityAndSubjectivity[()]{.muted} + + ```python def PolarityAndSubjectivity( dataset, diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index 4b8a4f272..cfa7d796d 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -7,6 +7,8 @@ Metrics functions for any Pandas-compatible datasets ## Punctuations[()]{.muted} + + ```python def Punctuations( dataset, diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index e31f0ba31..3f8abed5d 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## Sentiment[()]{.muted} + + ```python def Sentiment( dataset): diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index afbde88fc..fe6d9f937 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -7,6 +7,8 @@ Threshold based tests ## StopWords[()]{.muted} + + ```python def StopWords( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 8b44b5a05..e7b47983a 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## create_metrics_df[()]{.muted} + + ```python def create_metrics_df( df, @@ -15,6 +17,8 @@ def create_metrics_df( ## TextDescription[()]{.muted} + + ```python def TextDescription( dataset: VMDataset, diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index 193a321a3..5c1e57250 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## Toxicity[()]{.muted} + + ```python def Toxicity( dataset): diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 9fa650606..fe504df51 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## validate_prediction[()]{.muted} + + ```python def validate_prediction( y_true, y_pred, dataset_id = None): @@ -24,6 +26,8 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ## BertScore[()]{.muted} + + ```python def BertScore( dataset, diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index a4c7e414a..3c416b1c3 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## validate_prediction[()]{.muted} + + ```python def validate_prediction( y_true, y_pred, dataset_id = None): @@ -24,6 +26,8 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ## BleuScore[()]{.muted} + + ```python def BleuScore( dataset, diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 50b3b553e..88e69503e 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ClusterSizeDistribution[()]{.muted} + + ```python def ClusterSizeDistribution( dataset: VMDataset, diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index e723adf55..24e40ba1f 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## validate_prediction[()]{.muted} + + ```python def validate_prediction( y_true, y_pred, dataset_id = None): @@ -24,6 +26,8 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ## ContextualRecall[()]{.muted} + + ```python def ContextualRecall( dataset, diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 2f73fe021..19cb4a64c 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## FeaturesAUC[()]{.muted} + + ```python def FeaturesAUC( dataset: VMDataset, @@ -49,6 +53,8 @@ For each feature, the metric treats the feature values as raw scores to compute ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 2a141d1c2..15eddcf56 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## validate_prediction[()]{.muted} + + ```python def validate_prediction( y_true, y_pred, dataset_id = None): @@ -24,6 +26,8 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ## MeteorScore[()]{.muted} + + ```python def MeteorScore( dataset, diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index a29130c30..ae9762f8d 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_model_info[()]{.muted} + + ```python def get_model_info( model): @@ -14,6 +16,8 @@ Attempts to extract all model info from a model object instance ## ModelMetadata[()]{.muted} + + ```python def ModelMetadata( model): diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index dd9dcf999..9000b562a 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ModelPredictionResiduals[()]{.muted} + + ```python def ModelPredictionResiduals( dataset, diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 7bf155d2c..a7389104a 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## validate_prediction[()]{.muted} + + ```python def validate_prediction( y_true, y_pred, dataset_id = None): @@ -24,6 +26,8 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ## RegardScore[()]{.muted} + + ```python def RegardScore( dataset, diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 21531215c..8db076b7b 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## RegressionResidualsPlot[()]{.muted} + + ```python def RegressionResidualsPlot( model: VMModel, diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 20c84b7d7..43ee644ab 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## RougeScore[()]{.muted} + + ```python def RougeScore( dataset, diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index 4839a8bec..088d0e928 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## TimeSeriesPredictionWithCI[()]{.muted} + + ```python def TimeSeriesPredictionWithCI( dataset, diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index eceb6fcd0..607d5125f 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## TimeSeriesPredictionsPlot[()]{.muted} + + ```python def TimeSeriesPredictionsPlot( dataset, diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index c3cc7200e..e567561fd 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## TimeSeriesR2SquareBySegments[()]{.muted} + + ```python def TimeSeriesR2SquareBySegments( dataset, diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index 7d3c0dd86..a1a64673d 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## TokenDisparity[()]{.muted} + + ```python def TokenDisparity( dataset, diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index 8405890b3..6ba38e5ff 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ToxicityScore[()]{.muted} + + ```python def ToxicityScore( dataset, diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 66269e640..570737550 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## AdjustedMutualInformation[()]{.muted} + + ```python def AdjustedMutualInformation( model: VMModel, diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 3cd5764fe..a9bcc4f90 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## AdjustedRandIndex[()]{.muted} + + ```python def AdjustedRandIndex( model: VMModel, diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index cc1498c1f..256cb0cb3 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## CalibrationCurve[()]{.muted} + + ```python def CalibrationCurve( model: VMModel, diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index cab9366af..ad6d63064 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ClassifierPerformance[()]{.muted} + + ```python def ClassifierPerformance( dataset: VMDataset, @@ -42,6 +44,8 @@ The test produces a report that includes precision, recall, F1-Score, and accura ## multiclass_roc_auc_score[()]{.muted} + + ```python def multiclass_roc_auc_score( y_test, diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 485d6ee01..4a82a7d78 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ClassifierThresholdOptimization[()]{.muted} + + ```python def ClassifierThresholdOptimization( dataset: VMDataset, @@ -77,6 +79,8 @@ The test implements multiple threshold optimization methods: ## find_optimal_threshold[()]{.muted} + + ```python def find_optimal_threshold( y_true, diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index aa7535492..fd0c5109d 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ClusterCosineSimilarity[()]{.muted} + + ```python def ClusterCosineSimilarity( model: VMModel, @@ -41,6 +43,8 @@ This test works by first extracting the true and predicted clusters of the model ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index a95488ad7..5b8c51d0d 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ClusterPerformanceMetrics[()]{.muted} + + ```python def ClusterPerformanceMetrics( model: VMModel, diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index ea89fedbe..37789570d 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## CompletenessScore[()]{.muted} + + ```python def CompletenessScore( model: VMModel, diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 1d69962ed..eff9cae7e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ConfusionMatrix[()]{.muted} + + ```python def ConfusionMatrix( dataset: VMDataset, diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index d8a9c799d..91297386d 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## FeatureImportance[()]{.muted} + + ```python def FeatureImportance( dataset: VMDataset, diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index ecdd72bf2..9d1a80878 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## FowlkesMallowsScore[()]{.muted} + + ```python def FowlkesMallowsScore( dataset: VMDataset, diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 76716c5a3..7391cb50c 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## HomogeneityScore[()]{.muted} + + ```python def HomogeneityScore( dataset: VMDataset, diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 34b5c7e06..50c9192a0 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## custom_recall[()]{.muted} + + ```python def custom_recall( y_true, @@ -14,6 +16,8 @@ def custom_recall( ## HyperParametersTuning[()]{.muted} + + ```python def HyperParametersTuning( model: VMModel, diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 0f10f42bb..d88546a68 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## KMeansClustersOptimization[()]{.muted} + + ```python def KMeansClustersOptimization( model: VMModel, @@ -43,6 +45,8 @@ The test mechanism involves iterating over a predefined range of cluster numbers ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 7e3f6baf5..c6cbb721d 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## MinimumAccuracy[()]{.muted} + + ```python def MinimumAccuracy( dataset: VMDataset, diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 38ae4717d..468ce661f 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## MinimumF1Score[()]{.muted} + + ```python def MinimumF1Score( dataset: VMDataset, diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 127945388..bbc6781a3 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## MinimumROCAUCScore[()]{.muted} + + ```python def MinimumROCAUCScore( dataset: VMDataset, diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 938957f95..1c9a5f57c 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ModelParameters[()]{.muted} + + ```python def ModelParameters( model, diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 988869374..979342a85 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## multiclass_roc_auc_score[()]{.muted} + + ```python def multiclass_roc_auc_score( y_test, y_pred, average = 'macro'): @@ -12,6 +14,8 @@ def multiclass_roc_auc_score( ## ModelsPerformanceComparison[()]{.muted} + + ```python def ModelsPerformanceComparison( dataset: VMDataset, diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 388962772..5867380d2 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## OverfitDiagnosis[()]{.muted} + + ```python def OverfitDiagnosis( model: VMModel, diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 2129835db..871b47461 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## PermutationFeatureImportance[()]{.muted} + + ```python def PermutationFeatureImportance( model: VMModel, @@ -51,6 +55,8 @@ PFI is calculated via the `permutation_importance` method from the `sklearn.insp ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 4c5be8b56..0072665c7 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## calculate_psi[()]{.muted} + + ```python def calculate_psi( score_initial, @@ -26,6 +30,8 @@ Taken from: https://towardsdatascience.com/checking-model-stability-and-populati ## PopulationStabilityIndex[()]{.muted} + + ```python def PopulationStabilityIndex( datasets: List, @@ -65,6 +71,8 @@ The implementation of the PSI in this script involves calculating the PSI for ea ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 3e8dc3c97..b4e09b563 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## PrecisionRecallCurve[()]{.muted} + + ```python def PrecisionRecallCurve( model: VMModel, @@ -39,6 +41,8 @@ The test extracts ground truth labels and prediction probabilities from the mode ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index b11ba9f45..bd65de313 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ROCCurve[()]{.muted} + + ```python def ROCCurve( model: VMModel, @@ -40,6 +42,8 @@ First, this script selects the target model and datasets that require binary cla ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index c60070776..ffb2ee87a 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## RegressionErrors[()]{.muted} + + ```python def RegressionErrors( model, diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 4fcd45bb0..4566d4533 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## RegressionErrorsComparison[()]{.muted} + + ```python def RegressionErrorsComparison( datasets, diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index a3b60cba3..1861c2185 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## RegressionPerformance[()]{.muted} + + ```python def RegressionPerformance( model: VMModel, diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index d5d129d82..cef8d1b82 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## adj_r2_score[()]{.muted} + + ```python def adj_r2_score( actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: {'cls': 'ExprName', 'name': 'int'}, featurecount: {'cls': 'ExprName', 'name': 'int'}): @@ -14,6 +16,8 @@ Adjusted R2 Score ## RegressionR2Square[()]{.muted} + + ```python def RegressionR2Square( dataset, diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 5ab901459..54328eb0f 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## adj_r2_score[()]{.muted} + + ```python def adj_r2_score( actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: {'cls': 'ExprName', 'name': 'int'}, featurecount: {'cls': 'ExprName', 'name': 'int'}): @@ -14,6 +16,8 @@ Adjusted R2 Score ## RegressionR2SquareComparison[()]{.muted} + + ```python def RegressionR2SquareComparison( datasets, diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 2ed06e920..b0c3dfe50 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## RobustnessDiagnosis[()]{.muted} + + ```python def RobustnessDiagnosis( datasets: List, @@ -57,6 +61,8 @@ This test introduces Gaussian noise to the numeric input features of the dataset ## [class]{.muted} MissingOrInvalidModelPredictFnError + + ```python class MissingOrInvalidModelPredictFnError(BaseError): ``` diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 57ecf0e62..601754afb 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## generate_shap_plot[()]{.muted} + + ```python def generate_shap_plot( type_, @@ -35,6 +39,8 @@ Plots two types of SHAP global importance (SHAP). ## select_shap_values[()]{.muted} + + ```python def select_shap_values( shap_values, @@ -58,6 +64,8 @@ Selects SHAP values for binary or multiclass classification. For regression mode ## SHAPGlobalImportance[()]{.muted} + + ```python def SHAPGlobalImportance( model: VMModel, @@ -99,6 +107,8 @@ The exam begins with the selection of a suitable explainer which aligns with the ## [class]{.muted} UnsupportedModelForSHAPError + + ```python class UnsupportedModelForSHAPError(BaseError): ``` diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index e8e9afe82..4246bbcdb 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ScoreProbabilityAlignment[()]{.muted} + + ```python def ScoreProbabilityAlignment( model: VMModel, diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index f6fb3a2fe..53bfeb424 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## SilhouettePlot[()]{.muted} + + ```python def SilhouettePlot( model: VMModel, diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index e03266c76..db174ecce 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## TrainingTestDegradation[()]{.muted} + + ```python def TrainingTestDegradation( datasets: List, diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index adb5d0ec0..e75d2c121 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## VMeasure[()]{.muted} + + ```python def VMeasure( dataset: VMDataset, diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 02070cb42..16a18b4e1 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## WeakspotsDiagnosis[()]{.muted} + + ```python def WeakspotsDiagnosis( datasets: List, diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index dba74ac8d..520c03599 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## AutoARIMA[()]{.muted} + + ```python def AutoARIMA( model: VMModel, diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 9d2169862..a34f874ef 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## CumulativePredictionProbabilities[()]{.muted} + + ```python def CumulativePredictionProbabilities( dataset, diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 9f47e3053..5dcf0b9f7 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## DurbinWatsonTest[()]{.muted} + + ```python def DurbinWatsonTest( dataset, diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index 8df9a473c..fda8831e8 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## GINITable[()]{.muted} + + ```python def GINITable( dataset, diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index fa0ac68b2..fbcfcf00c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## KolmogorovSmirnov[()]{.muted} + + ```python def KolmogorovSmirnov( model: VMModel, @@ -41,6 +43,8 @@ This test calculates the KS statistic and corresponding p-value for each feature ## [class]{.muted} InvalidTestParametersError + + ```python class InvalidTestParametersError(BaseError): ``` diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index cb66eae19..bd62cd501 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## Lilliefors[()]{.muted} + + ```python def Lilliefors( dataset: VMDataset): diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index 058a36637..16c0d6780 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## PredictionProbabilitiesHistogram[()]{.muted} + + ```python def PredictionProbabilitiesHistogram( dataset, diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 23d1eb09c..bd51e98d2 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## RegressionCoeffs[()]{.muted} + + ```python def RegressionCoeffs( model): @@ -39,6 +41,8 @@ The function operates by extracting the estimated coefficients and their standar ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 1cfb94860..4aa22a3da 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## RegressionFeatureSignificance[()]{.muted} + + ```python def RegressionFeatureSignificance( model: VMModel, @@ -50,6 +54,8 @@ The test mechanism involves extracting the model's coefficients and p-values for ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index e30719c79..e162b81af 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## RegressionModelForecastPlot[()]{.muted} + + ```python def RegressionModelForecastPlot( model: VMModel, diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 970986618..ece92605a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## integrate_diff[()]{.muted} + + ```python def integrate_diff( series_diff, @@ -13,6 +15,8 @@ def integrate_diff( ## RegressionModelForecastPlotLevels[()]{.muted} + + ```python def RegressionModelForecastPlotLevels( model: VMModel, diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index c638f75ba..fca12d633 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## integrate_diff[()]{.muted} + + ```python def integrate_diff( series_diff, @@ -22,6 +26,8 @@ def integrate_diff( ## RegressionModelSensitivityPlot[()]{.muted} + + ```python def RegressionModelSensitivityPlot( dataset: VMDataset, diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 55dc43cec..8e9827392 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## adj_r2_score[()]{.muted} + + ```python def adj_r2_score( actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: {'cls': 'ExprName', 'name': 'int'}, featurecount: {'cls': 'ExprName', 'name': 'int'}): @@ -14,6 +16,8 @@ Adjusted R2 Score ## RegressionModelSummary[()]{.muted} + + ```python def RegressionModelSummary( dataset: VMDataset, diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 2fd4c960b..91b145a1d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## get_logger[()]{.muted} + + ```python def get_logger( name = 'validmind', log_level = None): @@ -14,6 +16,8 @@ Get a logger for the given module name ## RegressionPermutationFeatureImportance[()]{.muted} + + ```python def RegressionPermutationFeatureImportance( dataset: VMDataset, diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index 49f021e38..9396cdf80 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## ScorecardHistogram[()]{.muted} + + ```python def ScorecardHistogram( dataset, diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index e863835d9..10c862769 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## adj_r2_score[()]{.muted} + + ```python def adj_r2_score( actual: , diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 6ebe39fab..e24175ddc 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## call_model[()]{.muted} + + ```python def call_model( system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): @@ -14,6 +16,8 @@ Call LLM with the given prompts and return the response ## get_explanation[()]{.muted} + + ```python def get_explanation( response: {'cls': 'ExprName', 'name': 'str'}): @@ -29,6 +33,8 @@ Explanation: " -> "" ## get_score[()]{.muted} + + ```python def get_score( response: {'cls': 'ExprName', 'name': 'str'}): @@ -44,6 +50,8 @@ Explanation: " -> 8 ## Bias[()]{.muted} + + ```python def Bias( model, @@ -84,6 +92,8 @@ For each test case, the LLM grades the input prompt on a scale of 1 to 10. It ev ## [class]{.muted} MissingRequiredTestInputError + + ```python class MissingRequiredTestInputError(BaseError): ``` diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 6bc086480..54ed6a904 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## call_model[()]{.muted} + + ```python def call_model( system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): @@ -14,6 +16,8 @@ Call LLM with the given prompts and return the response ## get_explanation[()]{.muted} + + ```python def get_explanation( response: {'cls': 'ExprName', 'name': 'str'}): @@ -29,6 +33,8 @@ Explanation: " -> "" ## get_score[()]{.muted} + + ```python def get_score( response: {'cls': 'ExprName', 'name': 'str'}): @@ -44,6 +50,8 @@ Explanation: " -> 8 ## Clarity[()]{.muted} + + ```python def Clarity( model, @@ -79,6 +87,8 @@ The evaluation uses an LLM to scrutinize the clarity of prompts, factoring in co ## [class]{.muted} MissingRequiredTestInputError + + ```python class MissingRequiredTestInputError(BaseError): ``` diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index e8c22b4f1..05c025936 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## call_model[()]{.muted} + + ```python def call_model( system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): @@ -14,6 +16,8 @@ Call LLM with the given prompts and return the response ## get_explanation[()]{.muted} + + ```python def get_explanation( response: {'cls': 'ExprName', 'name': 'str'}): @@ -29,6 +33,8 @@ Explanation: " -> "" ## get_score[()]{.muted} + + ```python def get_score( response: {'cls': 'ExprName', 'name': 'str'}): @@ -44,6 +50,8 @@ Explanation: " -> 8 ## Conciseness[()]{.muted} + + ```python def Conciseness( model, @@ -81,6 +89,8 @@ Using an LLM, this test conducts a conciseness analysis on input prompts. The an ## [class]{.muted} MissingRequiredTestInputError + + ```python class MissingRequiredTestInputError(BaseError): ``` diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 59b17aac3..babc3731f 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## call_model[()]{.muted} + + ```python def call_model( system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): @@ -14,6 +16,8 @@ Call LLM with the given prompts and return the response ## get_explanation[()]{.muted} + + ```python def get_explanation( response: {'cls': 'ExprName', 'name': 'str'}): @@ -29,6 +33,8 @@ Explanation: " -> "" ## get_score[()]{.muted} + + ```python def get_score( response: {'cls': 'ExprName', 'name': 'str'}): @@ -44,6 +50,8 @@ Explanation: " -> 8 ## Delimitation[()]{.muted} + + ```python def Delimitation( model, @@ -80,6 +88,8 @@ The test employs an LLM to examine prompts for appropriate use of delimiters suc ## [class]{.muted} MissingRequiredTestInputError + + ```python class MissingRequiredTestInputError(BaseError): ``` diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index d1472d59f..092681ff8 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## call_model[()]{.muted} + + ```python def call_model( system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): @@ -14,6 +16,8 @@ Call LLM with the given prompts and return the response ## get_explanation[()]{.muted} + + ```python def get_explanation( response: {'cls': 'ExprName', 'name': 'str'}): @@ -29,6 +33,8 @@ Explanation: " -> "" ## get_score[()]{.muted} + + ```python def get_score( response: {'cls': 'ExprName', 'name': 'str'}): @@ -44,6 +50,8 @@ Explanation: " -> 8 ## NegativeInstruction[()]{.muted} + + ```python def NegativeInstruction( model, @@ -80,6 +88,8 @@ An LLM is employed to evaluate each prompt. The prompt is graded based on its us ## [class]{.muted} MissingRequiredTestInputError + + ```python class MissingRequiredTestInputError(BaseError): ``` diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index d29b03d50..d841f7700 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## call_model[()]{.muted} + + ```python def call_model( system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): @@ -14,6 +16,8 @@ Call LLM with the given prompts and return the response ## Robustness[()]{.muted} + + ```python def Robustness( model, @@ -50,6 +54,8 @@ The Robustness test appraises prompts under various conditions, alterations, and ## [class]{.muted} MissingRequiredTestInputError + + ```python class MissingRequiredTestInputError(BaseError): ``` @@ -63,6 +69,8 @@ When a required test context variable is missing. ## [class]{.muted} SkipTestError + + ```python class SkipTestError(BaseError): ``` diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 0a602348c..ef45537ed 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## call_model[()]{.muted} + + ```python def call_model( system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): @@ -14,6 +16,8 @@ Call LLM with the given prompts and return the response ## get_explanation[()]{.muted} + + ```python def get_explanation( response: {'cls': 'ExprName', 'name': 'str'}): @@ -29,6 +33,8 @@ Explanation: " -> "" ## get_score[()]{.muted} + + ```python def get_score( response: {'cls': 'ExprName', 'name': 'str'}): @@ -44,6 +50,8 @@ Explanation: " -> 8 ## Specificity[()]{.muted} + + ```python def Specificity( model, @@ -80,6 +88,8 @@ The Specificity Test employs an LLM to grade each prompt based on clarity, detai ## [class]{.muted} MissingRequiredTestInputError + + ```python class MissingRequiredTestInputError(BaseError): ``` diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index 261d7ac27..c960bf7ff 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## call_model[()]{.muted} + + ```python def call_model( system_prompt: str, @@ -17,6 +19,8 @@ Call LLM with the given prompts and return the response ## get_explanation[()]{.muted} + + ```python def get_explanation( response: str): @@ -32,6 +36,8 @@ Explanation: " -> "" ## get_score[()]{.muted} + + ```python def get_score( response: str): diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index a63368468..865b905b9 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -5,6 +5,8 @@ sidebar: validmind-reference ## describe_metric[()]{.muted} + + ```python def describe_metric( metric_id: str, @@ -15,6 +17,8 @@ Describe a metric ## list_metrics[()]{.muted} + + ```python def list_metrics( **kwargs = {}): @@ -24,6 +28,8 @@ List all metrics ## run_metric[()]{.muted} + + ```python def run_metric( metric_id: str, diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 6819eb09c..9a1f722ff 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -7,6 +7,8 @@ Models entrypoint ## [class]{.muted} Figure + + ```python class Figure(): ``` @@ -15,6 +17,8 @@ Figure objects track the schema supported by the ValidMind API ### [serialize[()]{.muted}](#serialize) + + ```python serialize(self) ``` @@ -23,6 +27,8 @@ Serializes the Figure to a dictionary so it can be sent to the API ### [serialize_files[()]{.muted}](#serialize_files) + + ```python serialize_files(self) ``` @@ -31,6 +37,8 @@ Creates a `requests`-compatible files object to be sent to the API ### [to_widget[()]{.muted}](#to_widget) + + ```python to_widget(self) ``` @@ -39,6 +47,8 @@ Returns the ipywidget compatible representation of the figure. Ideally we would ## [class]{.muted} ModelAttributes + + ```python class ModelAttributes(): ``` @@ -47,6 +57,8 @@ Model attributes definition ### [from_dict[()]{.muted}](#from_dict) + + ```python from_dict(cls, data) ``` @@ -55,6 +67,8 @@ Creates a ModelAttributes instance from a dictionary ## [class]{.muted} TestSuite + + ```python class TestSuite(): ``` @@ -65,6 +79,8 @@ Tests can be a flat list of strings or may be nested into sections by using a di ### [get_default_config[()]{.muted}](#get_default_config) + + ```python get_default_config(self) ``` @@ -77,6 +93,8 @@ Returns the default configuration for the test suite Each test in a test suite c ### [get_tests[()]{.muted}](#get_tests) + + ```python get_tests(self) ``` @@ -85,6 +103,8 @@ Get all test suite test objects from all sections ### [num_tests[()]{.muted}](#num_tests) + + ```python num_tests(self) ``` @@ -93,6 +113,8 @@ Returns the total number of tests in the test suite ## [class]{.muted} TestSuiteRunner + + ```python class TestSuiteRunner(): ``` @@ -101,6 +123,8 @@ Runs a test suite ### [log_results[()]{.muted}](#log_results) + + ```python log_results(self) ``` @@ -109,6 +133,8 @@ Logs the results of the test suite to ValidMind This method will be called after ### [run[()]{.muted}](#run) + + ```python run(self, send, fail_fast) ``` @@ -122,12 +148,16 @@ Runs the test suite, renders the summary and sends the results to ValidMind ### [summarize[()]{.muted}](#summarize) + + ```python summarize(self, show_link) ``` ## [class]{.muted} VMDataset + + ```python class VMDataset(VMInput): ``` @@ -155,6 +185,8 @@ This way we can support multiple dataset types but under the hood we only need t ### [add_extra_column[()]{.muted}](#add_extra_column) + + ```python add_extra_column(self, column_name, column_values) ``` @@ -168,6 +200,8 @@ Adds an extra column to the dataset without modifying the dataset `features` and ### [assign_predictions[()]{.muted}](#assign_predictions) + + ```python assign_predictions(self, model, prediction_column, prediction_values, probability_column, probability_values, prediction_probabilities, kwargs) ``` @@ -186,6 +220,8 @@ Assign predictions and probabilities to the dataset. ### [prediction_column[()]{.muted}](#prediction_column) + + ```python prediction_column(self, model, column_name) ``` @@ -194,6 +230,8 @@ Get or set the prediction column for a model. ### [probability_column[()]{.muted}](#probability_column) + + ```python probability_column(self, model, column_name) ``` @@ -202,6 +240,8 @@ Get or set the probability column for a model. ### [target_classes[()]{.muted}](#target_classes) + + ```python target_classes(self) ``` @@ -210,6 +250,8 @@ Returns the target class labels or unique values of the target column. ### [with_options[()]{.muted}](#with_options) + + ```python with_options(self, kwargs) ``` @@ -227,6 +269,8 @@ Support options provided when passing an input to run_test or run_test_suite ### [x_df[()]{.muted}](#x_df) + + ```python x_df(self) ``` @@ -235,6 +279,8 @@ Returns a dataframe containing only the feature columns ### [y_df[()]{.muted}](#y_df) + + ```python y_df(self) ``` @@ -243,6 +289,8 @@ Returns a dataframe containing the target column ### [y_pred[()]{.muted}](#y_pred) + + ```python y_pred(self, model) ``` @@ -259,6 +307,8 @@ Returns the predictions for a given model. Attempts to stack complex prediction ### [y_pred_df[()]{.muted}](#y_pred_df) + + ```python y_pred_df(self, model) ``` @@ -267,6 +317,8 @@ Returns a dataframe containing the predictions for a given model ### [y_prob[()]{.muted}](#y_prob) + + ```python y_prob(self, model) ``` @@ -283,6 +335,8 @@ Returns the probabilities for a given model. ### [y_prob_df[()]{.muted}](#y_prob_df) + + ```python y_prob_df(self, model) ``` @@ -291,6 +345,8 @@ Returns a dataframe containing the probabilities for a given model ## [class]{.muted} VMInput + + ```python class VMInput(ABC): ``` @@ -301,6 +357,8 @@ Base class for ValidMind Input types ### [with_options[()]{.muted}](#with_options) + + ```python with_options(self, kwargs) ``` @@ -319,6 +377,8 @@ To allow options, just override this method in the subclass (see VMDataset) and ## [class]{.muted} VMModel + + ```python class VMModel(VMInput): ``` @@ -336,6 +396,8 @@ An base class that wraps a trained model instance and its associated data. ### [predict[()]{.muted}](#predict) + + ```python predict(self, args, kwargs) ``` @@ -344,6 +406,8 @@ Predict method for the model. This is a wrapper around the model's ### [predict_proba[()]{.muted}](#predict_proba) + + ```python predict_proba(self, args, kwargs) ``` @@ -352,6 +416,8 @@ Predict probabilties - must be implemented by subclass if needed ### [serialize[()]{.muted}](#serialize) + + ```python serialize(self) ``` From 838a135122a245d68a938417668fbba4fde98ba7 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 31 Jan 2025 07:07:45 -0800 Subject: [PATCH 038/207] Markup fixes --- docs/_sidebar.yml | 43 ++++++++----------- docs/templates/module.qmd.jinja2 | 12 +++--- docs/templates/sidebar.qmd.jinja2 | 4 ++ docs/templates/version.qmd.jinja2 | 9 ++++ docs/templates/vm_models.qmd.jinja2 | 36 ---------------- docs/validmind.qmd | 40 ++++++++--------- docs/validmind/datasets.qmd | 2 +- docs/validmind/datasets/classification.qmd | 2 +- .../classification/customer_churn.qmd | 8 ++-- .../datasets/classification/taiwan_credit.qmd | 8 ++-- docs/validmind/datasets/credit_risk.qmd | 2 +- .../datasets/credit_risk/lending_club.qmd | 2 +- .../credit_risk/lending_club_bias.qmd | 2 +- docs/validmind/datasets/nlp.qmd | 2 +- docs/validmind/datasets/nlp/cnn_dailymail.qmd | 2 +- .../datasets/nlp/twitter_covid_19.qmd | 2 +- docs/validmind/datasets/regression.qmd | 2 +- docs/validmind/datasets/regression/fred.qmd | 2 +- .../datasets/regression/lending_club.qmd | 2 +- docs/validmind/errors.qmd | 2 +- docs/validmind/test_suites.qmd | 8 ++-- docs/validmind/test_suites/classifier.qmd | 2 +- docs/validmind/test_suites/cluster.qmd | 2 +- docs/validmind/test_suites/embeddings.qmd | 2 +- docs/validmind/test_suites/llm.qmd | 2 +- docs/validmind/test_suites/nlp.qmd | 2 +- .../test_suites/parameters_optimization.qmd | 2 +- docs/validmind/test_suites/regression.qmd | 2 +- .../test_suites/statsmodels_timeseries.qmd | 2 +- docs/validmind/test_suites/summarization.qmd | 2 +- .../test_suites/tabular_datasets.qmd | 2 +- docs/validmind/test_suites/text_data.qmd | 2 +- docs/validmind/test_suites/time_series.qmd | 2 +- docs/validmind/tests.qmd | 22 +++++----- docs/validmind/tests/data_validation.qmd | 2 +- .../tests/data_validation/ACFandPACFPlot.qmd | 2 +- docs/validmind/tests/data_validation/ADF.qmd | 4 +- .../tests/data_validation/AutoAR.qmd | 4 +- .../tests/data_validation/AutoMA.qmd | 4 +- .../data_validation/AutoStationarity.qmd | 2 +- .../data_validation/BivariateScatterPlots.qmd | 2 +- .../tests/data_validation/BoxPierce.qmd | 2 +- .../ChiSquaredFeaturesTable.qmd | 2 +- .../tests/data_validation/ClassImbalance.qmd | 2 +- .../data_validation/DatasetDescription.qmd | 4 +- .../tests/data_validation/DatasetSplit.qmd | 2 +- .../data_validation/DescriptiveStatistics.qmd | 4 +- .../tests/data_validation/DickeyFullerGLS.qmd | 4 +- .../tests/data_validation/Duplicates.qmd | 2 +- .../data_validation/EngleGrangerCoint.qmd | 2 +- .../FeatureTargetCorrelationPlot.qmd | 2 +- .../tests/data_validation/HighCardinality.qmd | 2 +- .../HighPearsonCorrelation.qmd | 2 +- .../data_validation/IQROutliersBarPlot.qmd | 2 +- .../data_validation/IQROutliersTable.qmd | 2 +- .../IsolationForestOutliers.qmd | 2 +- .../tests/data_validation/JarqueBera.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 4 +- .../tests/data_validation/LJungBox.qmd | 2 +- .../LaggedCorrelationHeatmap.qmd | 2 +- .../tests/data_validation/MissingValues.qmd | 2 +- .../data_validation/MissingValuesBarPlot.qmd | 2 +- .../data_validation/MutualInformation.qmd | 2 +- .../PearsonCorrelationMatrix.qmd | 2 +- .../data_validation/PhillipsPerronArch.qmd | 4 +- .../ProtectedClassesCombination.qmd | 4 +- .../ProtectedClassesDescription.qmd | 4 +- .../ProtectedClassesDisparity.qmd | 4 +- .../ProtectedClassesThresholdOptimizer.qmd | 4 +- .../data_validation/RollingStatsPlot.qmd | 2 +- .../tests/data_validation/RunsTest.qmd | 2 +- .../tests/data_validation/ScatterPlot.qmd | 2 +- .../data_validation/ScoreBandDefaultRates.qmd | 2 +- .../data_validation/SeasonalDecompose.qmd | 4 +- .../tests/data_validation/ShapiroWilk.qmd | 2 +- .../tests/data_validation/Skewness.qmd | 2 +- .../tests/data_validation/SpreadPlot.qmd | 2 +- .../TabularCategoricalBarPlots.qmd | 2 +- .../TabularDateTimeHistograms.qmd | 2 +- .../TabularDescriptionTables.qmd | 2 +- .../TabularNumericalHistograms.qmd | 2 +- .../data_validation/TargetRateBarPlots.qmd | 2 +- .../data_validation/TimeSeriesDescription.qmd | 2 +- .../TimeSeriesDescriptiveStatistics.qmd | 2 +- .../data_validation/TimeSeriesFrequency.qmd | 2 +- .../data_validation/TimeSeriesHistogram.qmd | 4 +- .../data_validation/TimeSeriesLinePlot.qmd | 2 +- .../TimeSeriesMissingValues.qmd | 2 +- .../data_validation/TimeSeriesOutliers.qmd | 2 +- .../data_validation/TooManyZeroValues.qmd | 2 +- .../tests/data_validation/UniqueRows.qmd | 2 +- .../tests/data_validation/WOEBinPlots.qmd | 4 +- .../tests/data_validation/WOEBinTable.qmd | 2 +- .../data_validation/ZivotAndrewsArch.qmd | 4 +- docs/validmind/tests/data_validation/nlp.qmd | 2 +- .../tests/data_validation/nlp/CommonWords.qmd | 2 +- .../tests/data_validation/nlp/Hashtags.qmd | 2 +- .../data_validation/nlp/LanguageDetection.qmd | 2 +- .../tests/data_validation/nlp/Mentions.qmd | 2 +- .../nlp/PolarityAndSubjectivity.qmd | 2 +- .../data_validation/nlp/Punctuations.qmd | 2 +- .../tests/data_validation/nlp/Sentiment.qmd | 2 +- .../tests/data_validation/nlp/StopWords.qmd | 2 +- .../data_validation/nlp/TextDescription.qmd | 2 +- .../tests/data_validation/nlp/Toxicity.qmd | 2 +- docs/validmind/tests/model_validation.qmd | 2 +- .../tests/model_validation/BertScore.qmd | 4 +- .../tests/model_validation/BleuScore.qmd | 4 +- .../ClusterSizeDistribution.qmd | 2 +- .../model_validation/ContextualRecall.qmd | 4 +- .../tests/model_validation/FeaturesAUC.qmd | 4 +- .../tests/model_validation/MeteorScore.qmd | 4 +- .../tests/model_validation/ModelMetadata.qmd | 4 +- .../ModelPredictionResiduals.qmd | 2 +- .../tests/model_validation/RegardScore.qmd | 4 +- .../RegressionResidualsPlot.qmd | 2 +- .../tests/model_validation/RougeScore.qmd | 2 +- .../TimeSeriesPredictionWithCI.qmd | 2 +- .../TimeSeriesPredictionsPlot.qmd | 2 +- .../TimeSeriesR2SquareBySegments.qmd | 2 +- .../tests/model_validation/TokenDisparity.qmd | 2 +- .../tests/model_validation/ToxicityScore.qmd | 2 +- .../tests/model_validation/sklearn.qmd | 2 +- .../sklearn/AdjustedMutualInformation.qmd | 2 +- .../sklearn/AdjustedRandIndex.qmd | 2 +- .../sklearn/CalibrationCurve.qmd | 2 +- .../sklearn/ClassifierPerformance.qmd | 2 +- .../ClassifierThresholdOptimization.qmd | 2 +- .../sklearn/ClusterCosineSimilarity.qmd | 2 +- .../sklearn/ClusterPerformanceMetrics.qmd | 2 +- .../sklearn/CompletenessScore.qmd | 2 +- .../sklearn/ConfusionMatrix.qmd | 2 +- .../sklearn/FeatureImportance.qmd | 2 +- .../sklearn/FowlkesMallowsScore.qmd | 2 +- .../sklearn/HomogeneityScore.qmd | 2 +- .../sklearn/HyperParametersTuning.qmd | 2 +- .../sklearn/KMeansClustersOptimization.qmd | 2 +- .../sklearn/MinimumAccuracy.qmd | 2 +- .../sklearn/MinimumF1Score.qmd | 2 +- .../sklearn/MinimumROCAUCScore.qmd | 2 +- .../sklearn/ModelParameters.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 4 +- .../sklearn/OverfitDiagnosis.qmd | 4 +- .../sklearn/PermutationFeatureImportance.qmd | 4 +- .../sklearn/PopulationStabilityIndex.qmd | 4 +- .../sklearn/PrecisionRecallCurve.qmd | 2 +- .../model_validation/sklearn/ROCCurve.qmd | 2 +- .../sklearn/RegressionErrors.qmd | 2 +- .../sklearn/RegressionErrorsComparison.qmd | 4 +- .../sklearn/RegressionPerformance.qmd | 4 +- .../sklearn/RegressionR2Square.qmd | 4 +- .../sklearn/RegressionR2SquareComparison.qmd | 4 +- .../sklearn/RobustnessDiagnosis.qmd | 4 +- .../sklearn/SHAPGlobalImportance.qmd | 4 +- .../sklearn/ScoreProbabilityAlignment.qmd | 2 +- .../sklearn/SilhouettePlot.qmd | 2 +- .../sklearn/TrainingTestDegradation.qmd | 2 +- .../model_validation/sklearn/VMeasure.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 2 +- .../tests/model_validation/statsmodels.qmd | 2 +- .../statsmodels/AutoARIMA.qmd | 4 +- .../CumulativePredictionProbabilities.qmd | 2 +- .../statsmodels/DurbinWatsonTest.qmd | 2 +- .../statsmodels/GINITable.qmd | 2 +- .../statsmodels/KolmogorovSmirnov.qmd | 2 +- .../statsmodels/Lilliefors.qmd | 2 +- .../PredictionProbabilitiesHistogram.qmd | 2 +- .../statsmodels/RegressionCoeffs.qmd | 2 +- .../RegressionFeatureSignificance.qmd | 4 +- .../RegressionModelForecastPlot.qmd | 4 +- .../RegressionModelForecastPlotLevels.qmd | 2 +- .../RegressionModelSensitivityPlot.qmd | 4 +- .../statsmodels/RegressionModelSummary.qmd | 4 +- ...RegressionPermutationFeatureImportance.qmd | 4 +- .../statsmodels/ScorecardHistogram.qmd | 2 +- .../statsmodels/statsutils.qmd | 2 +- docs/validmind/tests/prompt_validation.qmd | 2 +- .../tests/prompt_validation/Bias.qmd | 8 ++-- .../tests/prompt_validation/Clarity.qmd | 8 ++-- .../tests/prompt_validation/Conciseness.qmd | 8 ++-- .../tests/prompt_validation/Delimitation.qmd | 8 ++-- .../prompt_validation/NegativeInstruction.qmd | 8 ++-- .../tests/prompt_validation/Robustness.qmd | 4 +- .../tests/prompt_validation/Specificity.qmd | 8 ++-- .../prompt_validation/ai_powered_test.qmd | 2 +- docs/validmind/unit_metrics.qmd | 2 +- docs/validmind/version.qmd | 10 +++++ docs/validmind/vm_models.qmd | 2 +- scripts/generate_quarto_docs.py | 31 +++++++++---- 189 files changed, 348 insertions(+), 353 deletions(-) create mode 100644 docs/templates/version.qmd.jinja2 delete mode 100644 docs/templates/vm_models.qmd.jinja2 create mode 100644 docs/validmind/version.qmd diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml index b2d9bbdfa..42165df0e 100644 --- a/docs/_sidebar.yml +++ b/docs/_sidebar.yml @@ -9,48 +9,43 @@ website: - text: "---" - text: "Python API" # Root level items from validmind.qmd - - text: "\\_\\_version\\_\\_" - file: reference/validmind.qmd#\\_\\_version\\_\\_ - - text: "get_test_suite[()]{.muted}" + - text: "__version__" + file: reference/validmind.qmd#__version__ + - text: "get_test_suite()" file: reference/validmind.qmd#get_test_suite - - text: "init[()]{.muted}" + - text: "init()" file: reference/validmind.qmd#init - - text: "init_dataset[()]{.muted}" + - text: "init_dataset()" file: reference/validmind.qmd#init_dataset - - text: "init_model[()]{.muted}" + - text: "init_model()" file: reference/validmind.qmd#init_model - - text: "init_r_model[()]{.muted}" + - text: "init_r_model()" file: reference/validmind.qmd#init_r_model - - text: "log_metric[()]{.muted}" + - text: "log_metric()" file: reference/validmind.qmd#log_metric - - text: "preview_template[()]{.muted}" + - text: "preview_template()" file: reference/validmind.qmd#preview_template - - text: "print_env[()]{.muted}" + - text: "print_env()" file: reference/validmind.qmd#print_env - - text: "reload[()]{.muted}" + - text: "reload()" file: reference/validmind.qmd#reload - - text: "run_documentation_tests[()]{.muted}" + - text: "run_documentation_tests()" file: reference/validmind.qmd#run_documentation_tests - - text: "run_test_suite[()]{.muted}" + - text: "run_test_suite()" file: reference/validmind.qmd#run_test_suite - - text: "tags[()]{.muted}" + - text: "tags()" file: reference/validmind.qmd#tags - - text: "tasks[()]{.muted}" + - text: "tasks()" file: reference/validmind.qmd#tasks - - text: "test[()]{.muted}" + - text: "test()" file: reference/validmind.qmd#test - - text: "[class]{.muted} RawData" + - text: "class RawData" file: reference/validmind.qmd#class-rawdata - contents: - - text: "RawData[()]{.muted}" - file: reference/validmind.qmd#rawdata - - text: "inspect[()]{.muted}" - file: reference/validmind.qmd#inspect - - text: "serialize[()]{.muted}" - file: reference/validmind.qmd#serialize # All module documentation pages - text: "---" - text: "Submodules" + - text: "__version__" + file: reference/validmind/version.qmd - text: "datasets" file: reference/validmind/datasets.qmd contents: diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index 64b19ef6a..23daf0a4b 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -2,7 +2,7 @@ {% import "macros/types.jinja2" as types %} {% import "macros/navigation.jinja2" as nav %} --- -title: {% if module.name == "validmind" %}ValidMind Library{% else %}{{ module.name }}{% endif +%} +title: "{% if module.name == "validmind" %}ValidMind Library{% else %}[validmind](/reference/validmind.html).{{ module.name }}{% endif +%}" {% if module.name == "validmind" %} aliases: - index.html @@ -18,7 +18,7 @@ sidebar: validmind-reference ## Python API {% if module.members.__version__ %} -### \\_\\_version\\_\\_ +### __version__ ```python @@ -31,7 +31,7 @@ sidebar: validmind-reference {% if is_public(member, module, full_data, is_root) and member.kind == "alias" %} {% set target = resolve_alias(member, full_data) %} {% if target and target.docstring %} -### {{ member.name }}[()]{.muted} +### {{ member.name }}() {% if target.kind == "function" %} @@ -75,7 +75,7 @@ def {{ member.name }}( {% if is_public(member, module, full_data, is_root) and member.kind == "alias" %} {% set resolved = resolve_alias(member, full_data) %} {% if resolved.kind == "function" %} -## {{ member.name }}[()]{.muted} +## {{ member.name }}() ```python @@ -116,7 +116,7 @@ def {{ member.name }}( {% if member.kind == "class" or (member.kind == "alias" and member.target_path and member.target_path.split(".")[-1][0].isupper()) %} {% set target = resolve_alias(resolved, full_data) %} -### [class]{.muted} {{ member.name }} +### class {{ member.name }} ```python @@ -131,7 +131,7 @@ class {{ member.name }}(): {% for method_name, method in target.members.items() %} {% if method.kind == "function" and (not method_name.startswith('_') or method_name in ['__init__']) %} -#### {{ member.name if method_name == '__init__' else method_name }}[()]{.muted} +#### {{ member.name if method_name == '__init__' else method_name }}() ```python diff --git a/docs/templates/sidebar.qmd.jinja2 b/docs/templates/sidebar.qmd.jinja2 index 5a459d61f..7212f8b80 100644 --- a/docs/templates/sidebar.qmd.jinja2 +++ b/docs/templates/sidebar.qmd.jinja2 @@ -29,6 +29,10 @@ website: # All module documentation pages - text: "---" - text: "Submodules" + {% if module.members.__version__ %} + - text: "__version__" + file: reference/validmind/version.qmd + {% endif %} {% for member in module.members | sort_members %} {% if is_public(member, module, full_data, is_root) and member.kind == "module" %} {% set module_name = member.name %} diff --git a/docs/templates/version.qmd.jinja2 b/docs/templates/version.qmd.jinja2 new file mode 100644 index 000000000..461452469 --- /dev/null +++ b/docs/templates/version.qmd.jinja2 @@ -0,0 +1,9 @@ +--- +title: "[validmind](/reference/validmind.html).__version__" +sidebar: validmind-reference +--- + + +```python +{{ module.members.__version__.value | replace("'", "") if module.members.__version__.value else module.members.__version__.members.__version__.value | replace("'", "") }} +``` diff --git a/docs/templates/vm_models.qmd.jinja2 b/docs/templates/vm_models.qmd.jinja2 deleted file mode 100644 index 8beb288da..000000000 --- a/docs/templates/vm_models.qmd.jinja2 +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: vm_models -toc-depth: 3 -toc-expand: 3 ---- - -Models entrypoint - -{% if module.members %} -{% set vm_members = module.members %} -{% if '__all__' in vm_members %} -{% set all_list = [] %} -{% for element in vm_members['__all__'].value.elements %} - {% set _ = all_list.append(element.strip("'")) %} -{% endfor %} - -{# Process each item in __all__ #} -{% for item_name in all_list %} - {% if item_name in vm_members %} - {% set member = vm_members[item_name] %} - {% set resolved = resolve_alias(member, full_data) %} - - ## [{{ resolved.kind }}]{.muted} {{ item_name }} - - ```python - {{ resolved.kind }} {{ item_name }}{% if resolved.bases %}({{ resolved.bases | join(', ') }}){% endif %}: - ``` - - {% if resolved.docstring %} - {{ doc.format_docstring(resolved.docstring) }} - {% endif %} - - {% endif %} -{% endfor %} -{% endif %} -{% endif %} \ No newline at end of file diff --git a/docs/validmind.qmd b/docs/validmind.qmd index cf0a59acd..cd329ab12 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -1,5 +1,5 @@ --- -title: ValidMind Library +title: "ValidMind Library" aliases: - index.html sidebar: validmind-reference @@ -32,7 +32,7 @@ After you have pasted the code snippet into your development source code and exe ## Python API -### \\_\\_version\\_\\_ +### \_\_version\_\_ @@ -40,7 +40,7 @@ After you have pasted the code snippet into your development source code and exe 2.8.4 ``` -### get_test_suite[()]{.muted} +### get_test_suite() @@ -61,7 +61,7 @@ Gets a TestSuite object for the current project or a specific test suite This fu - **args**: Additional arguments to pass to the TestSuite - **kwargs**: Additional keyword arguments to pass to the TestSuite -### init[()]{.muted} +### init() @@ -94,7 +94,7 @@ If the API key and secret are not provided, the client will attempt to retrieve - **ValueError**: If the API key and secret are not provided -### init_dataset[()]{.muted} +### init_dataset() @@ -131,7 +131,7 @@ Raises: ValueError: If the dataset type is not supported Returns: vm.vm.Dataset: A VM Dataset instance -### init_model[()]{.muted} +### init_model() @@ -163,7 +163,7 @@ Initializes a VM Model, which can then be passed to other functions that can per - **ValueError**: If the model type is not supported -### init_r_model[()]{.muted} +### init_r_model() @@ -191,7 +191,7 @@ LogisticRegression and LinearRegression models are converted to sklearn models b - A VM Model instance -### log_metric[()]{.muted} +### log_metric() @@ -216,7 +216,7 @@ Logs a unit metric Unit metrics are key-value pairs where the key is the metric - **recorded_at** str: The timestamp of the metric. Server will use current time if not provided. - **thresholds** dict: Dictionary of thresholds for the metric. -### preview_template[()]{.muted} +### preview_template() @@ -231,7 +231,7 @@ Preview the documentation template for the current project This function will di - **ValueError**: If the project has not been initialized -### print_env[()]{.muted} +### print_env() @@ -242,7 +242,7 @@ def print_env( Prints a log of the running environment for debugging. Output includes: ValidMind Library version, operating system details, installed dependencies, and the ISO 8601 timestamp at log creation. -### reload[()]{.muted} +### reload() @@ -253,7 +253,7 @@ def reload( Reconnect to the ValidMind API and reload the project configuration -### run_documentation_tests[()]{.muted} +### run_documentation_tests() @@ -286,7 +286,7 @@ Collect and run all the tests associated with a template This function will anal - **ValueError**: If the project has not been initialized -### run_test_suite[()]{.muted} +### run_test_suite() @@ -319,7 +319,7 @@ High Level function for running a test suite This function provides a high level - **ValueError**: If the test suite name is not found or if there is an error initializing the test suite -### tags[()]{.muted} +### tags() @@ -334,7 +334,7 @@ Decorator for specifying tags for a test. - \***tags**: The tags to apply to the test. -### tasks[()]{.muted} +### tasks() @@ -349,7 +349,7 @@ Decorator for specifying the task types that a test is designed for. - \***tasks**: The task types that the test is designed for. -### test[()]{.muted} +### test() @@ -383,7 +383,7 @@ The function may also include a docstring. This docstring will be used and logge - The decorated function. -### [class]{.muted} RawData +### class RawData @@ -393,7 +393,7 @@ class RawData(): Holds raw data for a test result -#### RawData[()]{.muted} +#### RawData() @@ -410,7 +410,7 @@ Create a new RawData object - **log** bool: If True, log the raw data to ValidMind - \*\***kwargs**: Keyword arguments to set as attributes e.g. `RawData(log=True, dataset_duplicates=df_duplicates)` -#### inspect[()]{.muted} +#### inspect() @@ -421,7 +421,7 @@ def inspect( self, Inspect the raw data -#### serialize[()]{.muted} +#### serialize() diff --git a/docs/validmind/datasets.qmd b/docs/validmind/datasets.qmd index 8ea281205..08534d62a 100644 --- a/docs/validmind/datasets.qmd +++ b/docs/validmind/datasets.qmd @@ -1,5 +1,5 @@ --- -title: datasets +title: "[validmind](/reference/validmind.html).datasets" sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/classification.qmd b/docs/validmind/datasets/classification.qmd index 6d3270467..6d2c5d7da 100644 --- a/docs/validmind/datasets/classification.qmd +++ b/docs/validmind/datasets/classification.qmd @@ -1,5 +1,5 @@ --- -title: classification +title: "[validmind](/reference/validmind.html).classification" sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index c843917b0..40a11b481 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -1,9 +1,9 @@ --- -title: customer_churn +title: "[validmind](/reference/validmind.html).customer_churn" sidebar: validmind-reference --- -## simple_preprocess_booleans[()]{.muted} +## simple_preprocess_booleans() @@ -23,7 +23,7 @@ Preprocess boolean columns. - Preprocessed dataframe. -## simple_preprocess_categoricals[()]{.muted} +## simple_preprocess_categoricals() @@ -43,7 +43,7 @@ Preprocess categorical columns. - Preprocessed dataframe. -## simple_preprocess_numericals[()]{.muted} +## simple_preprocess_numericals() diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index 7aebbf2d5..74651c3a4 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -1,9 +1,9 @@ --- -title: taiwan_credit +title: "[validmind](/reference/validmind.html).taiwan_credit" sidebar: validmind-reference --- -## simple_preprocess_booleans[()]{.muted} +## simple_preprocess_booleans() @@ -23,7 +23,7 @@ Preprocess boolean columns. - Preprocessed dataframe. -## simple_preprocess_categoricals[()]{.muted} +## simple_preprocess_categoricals() @@ -43,7 +43,7 @@ Preprocess categorical columns. - Preprocessed dataframe. -## simple_preprocess_numericals[()]{.muted} +## simple_preprocess_numericals() diff --git a/docs/validmind/datasets/credit_risk.qmd b/docs/validmind/datasets/credit_risk.qmd index 5f8b67feb..a51bd1882 100644 --- a/docs/validmind/datasets/credit_risk.qmd +++ b/docs/validmind/datasets/credit_risk.qmd @@ -1,5 +1,5 @@ --- -title: credit_risk +title: "[validmind](/reference/validmind.html).credit_risk" sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index 11079612e..123d3447c 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -1,5 +1,5 @@ --- -title: lending_club +title: "[validmind](/reference/validmind.html).lending_club" sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 2fe93ffa9..15fb5d279 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -1,5 +1,5 @@ --- -title: lending_club_bias +title: "[validmind](/reference/validmind.html).lending_club_bias" sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/nlp.qmd b/docs/validmind/datasets/nlp.qmd index f79364afc..d1f765e1c 100644 --- a/docs/validmind/datasets/nlp.qmd +++ b/docs/validmind/datasets/nlp.qmd @@ -1,5 +1,5 @@ --- -title: nlp +title: "[validmind](/reference/validmind.html).nlp" sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index d36612d17..8e6986bdc 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -1,5 +1,5 @@ --- -title: cnn_dailymail +title: "[validmind](/reference/validmind.html).cnn_dailymail" sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index 41d271f1c..1221c6ef5 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -1,5 +1,5 @@ --- -title: twitter_covid_19 +title: "[validmind](/reference/validmind.html).twitter_covid_19" sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/regression.qmd b/docs/validmind/datasets/regression.qmd index 294de30bb..7d3cd0d37 100644 --- a/docs/validmind/datasets/regression.qmd +++ b/docs/validmind/datasets/regression.qmd @@ -1,5 +1,5 @@ --- -title: regression +title: "[validmind](/reference/validmind.html).regression" sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index 130cb8069..cb46ecee8 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -1,5 +1,5 @@ --- -title: fred +title: "[validmind](/reference/validmind.html).fred" sidebar: validmind-reference --- diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index f4a15179f..79fea9683 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -1,5 +1,5 @@ --- -title: lending_club +title: "[validmind](/reference/validmind.html).lending_club" sidebar: validmind-reference --- diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index bc3a68cfb..a8c726ad2 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -1,5 +1,5 @@ --- -title: errors +title: "[validmind](/reference/validmind.html).errors" sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 33ae7f5de..58b065aba 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -1,5 +1,5 @@ --- -title: test_suites +title: "[validmind](/reference/validmind.html).test_suites" sidebar: validmind-reference --- @@ -18,7 +18,7 @@ Entrypoint for test suites. - [text_data](test_suites/text_data.qmd) - [time_series](test_suites/time_series.qmd) -## format_dataframe[()]{.muted} +## format_dataframe() @@ -29,7 +29,7 @@ def format_dataframe( Format a pandas DataFrame for display purposes -## get_logger[()]{.muted} +## get_logger() @@ -40,7 +40,7 @@ def get_logger( Get a logger for the given module name -## test_id_to_name[()]{.muted} +## test_id_to_name() diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index 7c0803524..a4987281e 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -1,5 +1,5 @@ --- -title: classifier +title: "[validmind](/reference/validmind.html).classifier" sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index 36d43ad49..8056a3a61 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -1,5 +1,5 @@ --- -title: cluster +title: "[validmind](/reference/validmind.html).cluster" sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index 427bf748c..0f28805e7 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -1,5 +1,5 @@ --- -title: embeddings +title: "[validmind](/reference/validmind.html).embeddings" sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index d68c3c000..5e41878ed 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -1,5 +1,5 @@ --- -title: llm +title: "[validmind](/reference/validmind.html).llm" sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index 0c99a2fbe..8cb5c3a11 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -1,5 +1,5 @@ --- -title: nlp +title: "[validmind](/reference/validmind.html).nlp" sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index a6da9e38b..42701ae05 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -1,5 +1,5 @@ --- -title: parameters_optimization +title: "[validmind](/reference/validmind.html).parameters_optimization" sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index 3aea4073a..8d642ec2a 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -1,5 +1,5 @@ --- -title: regression +title: "[validmind](/reference/validmind.html).regression" sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/statsmodels_timeseries.qmd b/docs/validmind/test_suites/statsmodels_timeseries.qmd index 725354022..f6266ff9e 100644 --- a/docs/validmind/test_suites/statsmodels_timeseries.qmd +++ b/docs/validmind/test_suites/statsmodels_timeseries.qmd @@ -1,5 +1,5 @@ --- -title: statsmodels_timeseries +title: "[validmind](/reference/validmind.html).statsmodels_timeseries" sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/summarization.qmd b/docs/validmind/test_suites/summarization.qmd index 9d4fdf7d7..41e51c9ad 100644 --- a/docs/validmind/test_suites/summarization.qmd +++ b/docs/validmind/test_suites/summarization.qmd @@ -1,5 +1,5 @@ --- -title: summarization +title: "[validmind](/reference/validmind.html).summarization" sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd index 21cf2b620..5050e0c35 100644 --- a/docs/validmind/test_suites/tabular_datasets.qmd +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -1,5 +1,5 @@ --- -title: tabular_datasets +title: "[validmind](/reference/validmind.html).tabular_datasets" sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/text_data.qmd b/docs/validmind/test_suites/text_data.qmd index 9daa7e65b..578bca21e 100644 --- a/docs/validmind/test_suites/text_data.qmd +++ b/docs/validmind/test_suites/text_data.qmd @@ -1,5 +1,5 @@ --- -title: text_data +title: "[validmind](/reference/validmind.html).text_data" sidebar: validmind-reference --- diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index 48bfe873e..1e9e2e883 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -1,5 +1,5 @@ --- -title: time_series +title: "[validmind](/reference/validmind.html).time_series" sidebar: validmind-reference --- diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 3527b536f..6491aef05 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -1,5 +1,5 @@ --- -title: tests +title: "[validmind](/reference/validmind.html).tests" sidebar: validmind-reference --- @@ -9,7 +9,7 @@ ValidMind Tests Module - [model_validation](tests/model_validation.qmd) - [prompt_validation](tests/prompt_validation.qmd) -## describe_test[()]{.muted} +## describe_test() @@ -25,7 +25,7 @@ Get or show details about the test This function can be used to see test details - **test_id** str: The test ID. Defaults to None. - **raw** bool: If True, returns a dictionary with the test details. Defaults to False. -## list_tags[()]{.muted} +## list_tags() @@ -36,7 +36,7 @@ def list_tags( List unique tags from all test classes. -## list_tasks[()]{.muted} +## list_tasks() @@ -47,7 +47,7 @@ def list_tasks( List unique tasks from all test classes. -## list_tasks_and_tags[()]{.muted} +## list_tasks_and_tags() @@ -62,7 +62,7 @@ List all task types and their associated tags, with one row per task type and al - A DataFrame with 'Task Type' and concatenated 'Tags'. -## list_tests[()]{.muted} +## list_tests() @@ -85,7 +85,7 @@ List all tests in the tests directory. - list or pandas.DataFrame: A list of all tests or a formatted table. -## load_test[()]{.muted} +## load_test() @@ -101,7 +101,7 @@ Load a test by test ID Test IDs are in the format `namespace.path_to_module.Test - **test_id** str: The test ID in the format `namespace.path_to_module.TestName[:tag]` - **test_func** callable: The test function to load. If not provided, the test will be loaded from the test provider. Defaults to None. -## run_test[()]{.muted} +## run_test() @@ -139,7 +139,7 @@ Run a ValidMind or custom test This function is the main entry point for running - **ValueError**: If the test inputs are invalid - **LoadTestError**: If the test class fails to load -## tags[()]{.muted} +## tags() @@ -154,7 +154,7 @@ Decorator for specifying tags for a test. - \***tags**: The tags to apply to the test. -## tasks[()]{.muted} +## tasks() @@ -169,7 +169,7 @@ Decorator for specifying the task types that a test is designed for. - \***tasks**: The task types that the test is designed for. -## test[()]{.muted} +## test() diff --git a/docs/validmind/tests/data_validation.qmd b/docs/validmind/tests/data_validation.qmd index afc5e9f81..79a8cbc3f 100644 --- a/docs/validmind/tests/data_validation.qmd +++ b/docs/validmind/tests/data_validation.qmd @@ -1,5 +1,5 @@ --- -title: data_validation +title: "[validmind](/reference/validmind.html).data_validation" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index af04765f8..666cf6099 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -1,5 +1,5 @@ --- -title: ACFandPACFPlot +title: "[validmind](/reference/validmind.html).ACFandPACFPlot" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 9e5d2b5d5..a0124827d 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -1,9 +1,9 @@ --- -title: ADF +title: "[validmind](/reference/validmind.html).ADF" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 033d52689..e50512ac0 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -1,9 +1,9 @@ --- -title: AutoAR +title: "[validmind](/reference/validmind.html).AutoAR" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index d28cdf6ba..f716c36d7 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -1,9 +1,9 @@ --- -title: AutoMA +title: "[validmind](/reference/validmind.html).AutoMA" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index f50723e4c..ba9522245 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -1,5 +1,5 @@ --- -title: AutoStationarity +title: "[validmind](/reference/validmind.html).AutoStationarity" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index b73c6d2c9..03bdba7d7 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -1,5 +1,5 @@ --- -title: BivariateScatterPlots +title: "[validmind](/reference/validmind.html).BivariateScatterPlots" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index 3c765d11f..884c894b4 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -1,5 +1,5 @@ --- -title: BoxPierce +title: "[validmind](/reference/validmind.html).BoxPierce" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 36aca0779..b33e5e1e2 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -1,5 +1,5 @@ --- -title: ChiSquaredFeaturesTable +title: "[validmind](/reference/validmind.html).ChiSquaredFeaturesTable" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 0d465ae9b..538465998 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -1,5 +1,5 @@ --- -title: ClassImbalance +title: "[validmind](/reference/validmind.html).ClassImbalance" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index d547d78e0..0527016dc 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -1,9 +1,9 @@ --- -title: DatasetDescription +title: "[validmind](/reference/validmind.html).DatasetDescription" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 66ca9fe48..91880bd62 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -1,5 +1,5 @@ --- -title: DatasetSplit +title: "[validmind](/reference/validmind.html).DatasetSplit" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 44d8aade9..733956d55 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -1,9 +1,9 @@ --- -title: DescriptiveStatistics +title: "[validmind](/reference/validmind.html).DescriptiveStatistics" sidebar: validmind-reference --- -## format_records[()]{.muted} +## format_records() diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 8511c2d86..d2f8b7425 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -1,9 +1,9 @@ --- -title: DickeyFullerGLS +title: "[validmind](/reference/validmind.html).DickeyFullerGLS" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index fe403cc17..f5d963cd3 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -1,5 +1,5 @@ --- -title: Duplicates +title: "[validmind](/reference/validmind.html).Duplicates" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 659af1586..5592d4938 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -1,5 +1,5 @@ --- -title: EngleGrangerCoint +title: "[validmind](/reference/validmind.html).EngleGrangerCoint" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index a46c4c9df..11d334389 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -1,5 +1,5 @@ --- -title: FeatureTargetCorrelationPlot +title: "[validmind](/reference/validmind.html).FeatureTargetCorrelationPlot" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index a800d8c47..64c641587 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -1,5 +1,5 @@ --- -title: HighCardinality +title: "[validmind](/reference/validmind.html).HighCardinality" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 01477a3a7..faadf2ee2 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -1,5 +1,5 @@ --- -title: HighPearsonCorrelation +title: "[validmind](/reference/validmind.html).HighPearsonCorrelation" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 4bcae797b..84e8bfec0 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -1,5 +1,5 @@ --- -title: IQROutliersBarPlot +title: "[validmind](/reference/validmind.html).IQROutliersBarPlot" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 5ca5326a4..98bfca33b 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -1,5 +1,5 @@ --- -title: IQROutliersTable +title: "[validmind](/reference/validmind.html).IQROutliersTable" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index 1cc4719c0..1e2baea0f 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -1,5 +1,5 @@ --- -title: IsolationForestOutliers +title: "[validmind](/reference/validmind.html).IsolationForestOutliers" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index b0440153a..7f88988e2 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -1,5 +1,5 @@ --- -title: JarqueBera +title: "[validmind](/reference/validmind.html).JarqueBera" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index dd6611c39..afd267862 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -1,9 +1,9 @@ --- -title: KPSS +title: "[validmind](/reference/validmind.html).KPSS" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 66c2fcc8f..b727dce25 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -1,5 +1,5 @@ --- -title: LJungBox +title: "[validmind](/reference/validmind.html).LJungBox" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index 1c1897847..f32c92bd1 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -1,5 +1,5 @@ --- -title: LaggedCorrelationHeatmap +title: "[validmind](/reference/validmind.html).LaggedCorrelationHeatmap" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 8c1eb8544..b351b55c1 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -1,5 +1,5 @@ --- -title: MissingValues +title: "[validmind](/reference/validmind.html).MissingValues" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 17f31979e..3ac50249a 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -1,5 +1,5 @@ --- -title: MissingValuesBarPlot +title: "[validmind](/reference/validmind.html).MissingValuesBarPlot" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index d2859ddd0..d6824aa33 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -1,5 +1,5 @@ --- -title: MutualInformation +title: "[validmind](/reference/validmind.html).MutualInformation" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index 196779968..f2195ca90 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -1,5 +1,5 @@ --- -title: PearsonCorrelationMatrix +title: "[validmind](/reference/validmind.html).PearsonCorrelationMatrix" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index bc09df067..956027eed 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -1,9 +1,9 @@ --- -title: PhillipsPerronArch +title: "[validmind](/reference/validmind.html).PhillipsPerronArch" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index b74bc028e..542df6970 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -1,9 +1,9 @@ --- -title: ProtectedClassesCombination +title: "[validmind](/reference/validmind.html).ProtectedClassesCombination" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index 1dfd7947a..64f70bf8e 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -1,9 +1,9 @@ --- -title: ProtectedClassesDescription +title: "[validmind](/reference/validmind.html).ProtectedClassesDescription" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index f427713db..4fac8bbf2 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -1,9 +1,9 @@ --- -title: ProtectedClassesDisparity +title: "[validmind](/reference/validmind.html).ProtectedClassesDisparity" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index ece2aaf11..f614d7c1a 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -1,9 +1,9 @@ --- -title: ProtectedClassesThresholdOptimizer +title: "[validmind](/reference/validmind.html).ProtectedClassesThresholdOptimizer" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 1720371b0..33c6cd8a3 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -1,5 +1,5 @@ --- -title: RollingStatsPlot +title: "[validmind](/reference/validmind.html).RollingStatsPlot" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index ccf6cea34..49e67d820 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -1,5 +1,5 @@ --- -title: RunsTest +title: "[validmind](/reference/validmind.html).RunsTest" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 39478ebb9..e2e3256c5 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -1,5 +1,5 @@ --- -title: ScatterPlot +title: "[validmind](/reference/validmind.html).ScatterPlot" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 86638d1d2..d686b70d0 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -1,5 +1,5 @@ --- -title: ScoreBandDefaultRates +title: "[validmind](/reference/validmind.html).ScoreBandDefaultRates" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index d9ca8e2e5..1df51245b 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -1,9 +1,9 @@ --- -title: SeasonalDecompose +title: "[validmind](/reference/validmind.html).SeasonalDecompose" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index fa0a5361a..10aa7380b 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -1,5 +1,5 @@ --- -title: ShapiroWilk +title: "[validmind](/reference/validmind.html).ShapiroWilk" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index 1027b6d02..cc1627e3b 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -1,5 +1,5 @@ --- -title: Skewness +title: "[validmind](/reference/validmind.html).Skewness" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 0baaf81c7..0f4d07d7d 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -1,5 +1,5 @@ --- -title: SpreadPlot +title: "[validmind](/reference/validmind.html).SpreadPlot" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 8052785aa..8d688dcaf 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -1,5 +1,5 @@ --- -title: TabularCategoricalBarPlots +title: "[validmind](/reference/validmind.html).TabularCategoricalBarPlots" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index cf040b091..4989940e8 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -1,5 +1,5 @@ --- -title: TabularDateTimeHistograms +title: "[validmind](/reference/validmind.html).TabularDateTimeHistograms" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 1db047b3e..4e3b6a712 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -1,5 +1,5 @@ --- -title: TabularDescriptionTables +title: "[validmind](/reference/validmind.html).TabularDescriptionTables" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 1d8da73cf..b06d01989 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -1,5 +1,5 @@ --- -title: TabularNumericalHistograms +title: "[validmind](/reference/validmind.html).TabularNumericalHistograms" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 40bca565e..25e028f10 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -1,5 +1,5 @@ --- -title: TargetRateBarPlots +title: "[validmind](/reference/validmind.html).TargetRateBarPlots" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index ecc81d606..cf3872d02 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -1,5 +1,5 @@ --- -title: TimeSeriesDescription +title: "[validmind](/reference/validmind.html).TimeSeriesDescription" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 0018ad8f3..29731f64c 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -1,5 +1,5 @@ --- -title: TimeSeriesDescriptiveStatistics +title: "[validmind](/reference/validmind.html).TimeSeriesDescriptiveStatistics" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index f7fe18844..bd26eed62 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -1,5 +1,5 @@ --- -title: TimeSeriesFrequency +title: "[validmind](/reference/validmind.html).TimeSeriesFrequency" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 35074eca3..2dfec0fb0 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -1,9 +1,9 @@ --- -title: TimeSeriesHistogram +title: "[validmind](/reference/validmind.html).TimeSeriesHistogram" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 8ec631130..2bbb87083 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -1,5 +1,5 @@ --- -title: TimeSeriesLinePlot +title: "[validmind](/reference/validmind.html).TimeSeriesLinePlot" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 0ea3abd92..be9f2bfe7 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -1,5 +1,5 @@ --- -title: TimeSeriesMissingValues +title: "[validmind](/reference/validmind.html).TimeSeriesMissingValues" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 2609cb216..e92db292b 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -1,5 +1,5 @@ --- -title: TimeSeriesOutliers +title: "[validmind](/reference/validmind.html).TimeSeriesOutliers" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 64c83dacb..ec748a4dc 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -1,5 +1,5 @@ --- -title: TooManyZeroValues +title: "[validmind](/reference/validmind.html).TooManyZeroValues" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 89b692867..f7e56d52b 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -1,5 +1,5 @@ --- -title: UniqueRows +title: "[validmind](/reference/validmind.html).UniqueRows" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index f8289a33d..e858b526f 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -1,9 +1,9 @@ --- -title: WOEBinPlots +title: "[validmind](/reference/validmind.html).WOEBinPlots" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index e41c5b595..6275b676f 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -1,5 +1,5 @@ --- -title: WOEBinTable +title: "[validmind](/reference/validmind.html).WOEBinTable" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 38fcb9a0e..786653e07 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -1,9 +1,9 @@ --- -title: ZivotAndrewsArch +title: "[validmind](/reference/validmind.html).ZivotAndrewsArch" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/data_validation/nlp.qmd b/docs/validmind/tests/data_validation/nlp.qmd index 704c64c05..fde548839 100644 --- a/docs/validmind/tests/data_validation/nlp.qmd +++ b/docs/validmind/tests/data_validation/nlp.qmd @@ -1,5 +1,5 @@ --- -title: nlp +title: "[validmind](/reference/validmind.html).nlp" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index d83bcc4c7..93b9225e7 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -1,5 +1,5 @@ --- -title: CommonWords +title: "[validmind](/reference/validmind.html).CommonWords" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index c52e2d545..e33dce71a 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -1,5 +1,5 @@ --- -title: Hashtags +title: "[validmind](/reference/validmind.html).Hashtags" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 62326fdc2..817a50188 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -1,5 +1,5 @@ --- -title: LanguageDetection +title: "[validmind](/reference/validmind.html).LanguageDetection" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index a7be691a3..6885490ab 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -1,5 +1,5 @@ --- -title: Mentions +title: "[validmind](/reference/validmind.html).Mentions" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index 192c174dc..e536a640e 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -1,5 +1,5 @@ --- -title: PolarityAndSubjectivity +title: "[validmind](/reference/validmind.html).PolarityAndSubjectivity" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index cfa7d796d..554c0dfef 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -1,5 +1,5 @@ --- -title: Punctuations +title: "[validmind](/reference/validmind.html).Punctuations" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index 3f8abed5d..5d252686b 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -1,5 +1,5 @@ --- -title: Sentiment +title: "[validmind](/reference/validmind.html).Sentiment" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index fe6d9f937..80c95b0e4 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -1,5 +1,5 @@ --- -title: StopWords +title: "[validmind](/reference/validmind.html).StopWords" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index e7b47983a..245a59a37 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -1,5 +1,5 @@ --- -title: TextDescription +title: "[validmind](/reference/validmind.html).TextDescription" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index 5c1e57250..190da7b20 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -1,5 +1,5 @@ --- -title: Toxicity +title: "[validmind](/reference/validmind.html).Toxicity" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation.qmd b/docs/validmind/tests/model_validation.qmd index 8e2ba5d2e..a8a110e82 100644 --- a/docs/validmind/tests/model_validation.qmd +++ b/docs/validmind/tests/model_validation.qmd @@ -1,5 +1,5 @@ --- -title: model_validation +title: "[validmind](/reference/validmind.html).model_validation" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index fe504df51..aecf1b6e2 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -1,9 +1,9 @@ --- -title: BertScore +title: "[validmind](/reference/validmind.html).BertScore" sidebar: validmind-reference --- -## validate_prediction[()]{.muted} +## validate_prediction() diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 3c416b1c3..1e935dfae 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -1,9 +1,9 @@ --- -title: BleuScore +title: "[validmind](/reference/validmind.html).BleuScore" sidebar: validmind-reference --- -## validate_prediction[()]{.muted} +## validate_prediction() diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 88e69503e..93fb605ce 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -1,5 +1,5 @@ --- -title: ClusterSizeDistribution +title: "[validmind](/reference/validmind.html).ClusterSizeDistribution" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 24e40ba1f..f2ffbcbf5 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -1,9 +1,9 @@ --- -title: ContextualRecall +title: "[validmind](/reference/validmind.html).ContextualRecall" sidebar: validmind-reference --- -## validate_prediction[()]{.muted} +## validate_prediction() diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 19cb4a64c..c6b75e5c2 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -1,9 +1,9 @@ --- -title: FeaturesAUC +title: "[validmind](/reference/validmind.html).FeaturesAUC" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 15eddcf56..d8b1902c5 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -1,9 +1,9 @@ --- -title: MeteorScore +title: "[validmind](/reference/validmind.html).MeteorScore" sidebar: validmind-reference --- -## validate_prediction[()]{.muted} +## validate_prediction() diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index ae9762f8d..c073d4362 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -1,9 +1,9 @@ --- -title: ModelMetadata +title: "[validmind](/reference/validmind.html).ModelMetadata" sidebar: validmind-reference --- -## get_model_info[()]{.muted} +## get_model_info() diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index 9000b562a..062e997b7 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -1,5 +1,5 @@ --- -title: ModelPredictionResiduals +title: "[validmind](/reference/validmind.html).ModelPredictionResiduals" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index a7389104a..6d10a4da6 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -1,9 +1,9 @@ --- -title: RegardScore +title: "[validmind](/reference/validmind.html).RegardScore" sidebar: validmind-reference --- -## validate_prediction[()]{.muted} +## validate_prediction() diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 8db076b7b..c4621a25d 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -1,5 +1,5 @@ --- -title: RegressionResidualsPlot +title: "[validmind](/reference/validmind.html).RegressionResidualsPlot" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 43ee644ab..cc172824f 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -1,5 +1,5 @@ --- -title: RougeScore +title: "[validmind](/reference/validmind.html).RougeScore" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index 088d0e928..5721ee4cc 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -1,5 +1,5 @@ --- -title: TimeSeriesPredictionWithCI +title: "[validmind](/reference/validmind.html).TimeSeriesPredictionWithCI" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index 607d5125f..7e4201a34 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -1,5 +1,5 @@ --- -title: TimeSeriesPredictionsPlot +title: "[validmind](/reference/validmind.html).TimeSeriesPredictionsPlot" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index e567561fd..cbe19d674 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -1,5 +1,5 @@ --- -title: TimeSeriesR2SquareBySegments +title: "[validmind](/reference/validmind.html).TimeSeriesR2SquareBySegments" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index a1a64673d..3eeaea4e6 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -1,5 +1,5 @@ --- -title: TokenDisparity +title: "[validmind](/reference/validmind.html).TokenDisparity" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index 6ba38e5ff..64b734e4c 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -1,5 +1,5 @@ --- -title: ToxicityScore +title: "[validmind](/reference/validmind.html).ToxicityScore" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn.qmd b/docs/validmind/tests/model_validation/sklearn.qmd index 7075775ba..59615c1d5 100644 --- a/docs/validmind/tests/model_validation/sklearn.qmd +++ b/docs/validmind/tests/model_validation/sklearn.qmd @@ -1,5 +1,5 @@ --- -title: sklearn +title: "[validmind](/reference/validmind.html).sklearn" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 570737550..1b64e6dd8 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -1,5 +1,5 @@ --- -title: AdjustedMutualInformation +title: "[validmind](/reference/validmind.html).AdjustedMutualInformation" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index a9bcc4f90..6953a455c 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -1,5 +1,5 @@ --- -title: AdjustedRandIndex +title: "[validmind](/reference/validmind.html).AdjustedRandIndex" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 256cb0cb3..e374fd0a2 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -1,5 +1,5 @@ --- -title: CalibrationCurve +title: "[validmind](/reference/validmind.html).CalibrationCurve" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index ad6d63064..c0537a6a6 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -1,5 +1,5 @@ --- -title: ClassifierPerformance +title: "[validmind](/reference/validmind.html).ClassifierPerformance" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 4a82a7d78..5a9b92b51 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -1,5 +1,5 @@ --- -title: ClassifierThresholdOptimization +title: "[validmind](/reference/validmind.html).ClassifierThresholdOptimization" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index fd0c5109d..53abe586f 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -1,5 +1,5 @@ --- -title: ClusterCosineSimilarity +title: "[validmind](/reference/validmind.html).ClusterCosineSimilarity" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 5b8c51d0d..4a2c7da8b 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -1,5 +1,5 @@ --- -title: ClusterPerformanceMetrics +title: "[validmind](/reference/validmind.html).ClusterPerformanceMetrics" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 37789570d..aa0244f52 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -1,5 +1,5 @@ --- -title: CompletenessScore +title: "[validmind](/reference/validmind.html).CompletenessScore" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index eff9cae7e..a9f46434f 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -1,5 +1,5 @@ --- -title: ConfusionMatrix +title: "[validmind](/reference/validmind.html).ConfusionMatrix" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 91297386d..55bf57ea9 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -1,5 +1,5 @@ --- -title: FeatureImportance +title: "[validmind](/reference/validmind.html).FeatureImportance" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 9d1a80878..1b7ca3d8b 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -1,5 +1,5 @@ --- -title: FowlkesMallowsScore +title: "[validmind](/reference/validmind.html).FowlkesMallowsScore" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 7391cb50c..6cd2a5880 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -1,5 +1,5 @@ --- -title: HomogeneityScore +title: "[validmind](/reference/validmind.html).HomogeneityScore" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 50c9192a0..283ec11e0 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -1,5 +1,5 @@ --- -title: HyperParametersTuning +title: "[validmind](/reference/validmind.html).HyperParametersTuning" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index d88546a68..ce2a8b936 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -1,5 +1,5 @@ --- -title: KMeansClustersOptimization +title: "[validmind](/reference/validmind.html).KMeansClustersOptimization" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index c6cbb721d..5aaa83ec3 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -1,5 +1,5 @@ --- -title: MinimumAccuracy +title: "[validmind](/reference/validmind.html).MinimumAccuracy" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 468ce661f..d884d957d 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -1,5 +1,5 @@ --- -title: MinimumF1Score +title: "[validmind](/reference/validmind.html).MinimumF1Score" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index bbc6781a3..497af5e70 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -1,5 +1,5 @@ --- -title: MinimumROCAUCScore +title: "[validmind](/reference/validmind.html).MinimumROCAUCScore" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 1c9a5f57c..4d9dd03f2 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -1,5 +1,5 @@ --- -title: ModelParameters +title: "[validmind](/reference/validmind.html).ModelParameters" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 979342a85..32f8c5c28 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -1,9 +1,9 @@ --- -title: ModelsPerformanceComparison +title: "[validmind](/reference/validmind.html).ModelsPerformanceComparison" sidebar: validmind-reference --- -## multiclass_roc_auc_score[()]{.muted} +## multiclass_roc_auc_score() diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 5867380d2..0569c6b97 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -1,9 +1,9 @@ --- -title: OverfitDiagnosis +title: "[validmind](/reference/validmind.html).OverfitDiagnosis" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 871b47461..2528dc2e3 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -1,9 +1,9 @@ --- -title: PermutationFeatureImportance +title: "[validmind](/reference/validmind.html).PermutationFeatureImportance" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 0072665c7..217878de0 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -1,9 +1,9 @@ --- -title: PopulationStabilityIndex +title: "[validmind](/reference/validmind.html).PopulationStabilityIndex" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index b4e09b563..199ef08ce 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -1,5 +1,5 @@ --- -title: PrecisionRecallCurve +title: "[validmind](/reference/validmind.html).PrecisionRecallCurve" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index bd65de313..c2162c63e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -1,5 +1,5 @@ --- -title: ROCCurve +title: "[validmind](/reference/validmind.html).ROCCurve" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index ffb2ee87a..54bcb7ab8 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -1,5 +1,5 @@ --- -title: RegressionErrors +title: "[validmind](/reference/validmind.html).RegressionErrors" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 4566d4533..445350e3c 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -1,9 +1,9 @@ --- -title: RegressionErrorsComparison +title: "[validmind](/reference/validmind.html).RegressionErrorsComparison" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 1861c2185..d92b89095 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -1,9 +1,9 @@ --- -title: RegressionPerformance +title: "[validmind](/reference/validmind.html).RegressionPerformance" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index cef8d1b82..e0f102df0 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -1,9 +1,9 @@ --- -title: RegressionR2Square +title: "[validmind](/reference/validmind.html).RegressionR2Square" sidebar: validmind-reference --- -## adj_r2_score[()]{.muted} +## adj_r2_score() diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 54328eb0f..2ebd58475 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -1,9 +1,9 @@ --- -title: RegressionR2SquareComparison +title: "[validmind](/reference/validmind.html).RegressionR2SquareComparison" sidebar: validmind-reference --- -## adj_r2_score[()]{.muted} +## adj_r2_score() diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index b0c3dfe50..451f82c8d 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -1,9 +1,9 @@ --- -title: RobustnessDiagnosis +title: "[validmind](/reference/validmind.html).RobustnessDiagnosis" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 601754afb..8bc466339 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -1,9 +1,9 @@ --- -title: SHAPGlobalImportance +title: "[validmind](/reference/validmind.html).SHAPGlobalImportance" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 4246bbcdb..2f9c3686f 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -1,5 +1,5 @@ --- -title: ScoreProbabilityAlignment +title: "[validmind](/reference/validmind.html).ScoreProbabilityAlignment" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 53bfeb424..32d8df32a 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -1,5 +1,5 @@ --- -title: SilhouettePlot +title: "[validmind](/reference/validmind.html).SilhouettePlot" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index db174ecce..e41d9230c 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -1,5 +1,5 @@ --- -title: TrainingTestDegradation +title: "[validmind](/reference/validmind.html).TrainingTestDegradation" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index e75d2c121..172ee5539 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -1,5 +1,5 @@ --- -title: VMeasure +title: "[validmind](/reference/validmind.html).VMeasure" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 16a18b4e1..35effdd16 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -1,5 +1,5 @@ --- -title: WeakspotsDiagnosis +title: "[validmind](/reference/validmind.html).WeakspotsDiagnosis" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels.qmd b/docs/validmind/tests/model_validation/statsmodels.qmd index ef6e4788e..7a9ffec1d 100644 --- a/docs/validmind/tests/model_validation/statsmodels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels.qmd @@ -1,5 +1,5 @@ --- -title: statsmodels +title: "[validmind](/reference/validmind.html).statsmodels" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 520c03599..9d8da03f1 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -1,9 +1,9 @@ --- -title: AutoARIMA +title: "[validmind](/reference/validmind.html).AutoARIMA" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index a34f874ef..1baf4ab00 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -1,5 +1,5 @@ --- -title: CumulativePredictionProbabilities +title: "[validmind](/reference/validmind.html).CumulativePredictionProbabilities" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 5dcf0b9f7..dd7e4d990 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -1,5 +1,5 @@ --- -title: DurbinWatsonTest +title: "[validmind](/reference/validmind.html).DurbinWatsonTest" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index fda8831e8..239725959 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -1,5 +1,5 @@ --- -title: GINITable +title: "[validmind](/reference/validmind.html).GINITable" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index fbcfcf00c..f58ec3b32 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -1,5 +1,5 @@ --- -title: KolmogorovSmirnov +title: "[validmind](/reference/validmind.html).KolmogorovSmirnov" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index bd62cd501..76b36337e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -1,5 +1,5 @@ --- -title: Lilliefors +title: "[validmind](/reference/validmind.html).Lilliefors" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index 16c0d6780..0b958e026 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -1,5 +1,5 @@ --- -title: PredictionProbabilitiesHistogram +title: "[validmind](/reference/validmind.html).PredictionProbabilitiesHistogram" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index bd51e98d2..56123b99b 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -1,5 +1,5 @@ --- -title: RegressionCoeffs +title: "[validmind](/reference/validmind.html).RegressionCoeffs" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 4aa22a3da..d9aeb2ab1 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -1,9 +1,9 @@ --- -title: RegressionFeatureSignificance +title: "[validmind](/reference/validmind.html).RegressionFeatureSignificance" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index e162b81af..c61e706e7 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -1,9 +1,9 @@ --- -title: RegressionModelForecastPlot +title: "[validmind](/reference/validmind.html).RegressionModelForecastPlot" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index ece92605a..14e11714f 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -1,5 +1,5 @@ --- -title: RegressionModelForecastPlotLevels +title: "[validmind](/reference/validmind.html).RegressionModelForecastPlotLevels" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index fca12d633..e58d30856 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -1,9 +1,9 @@ --- -title: RegressionModelSensitivityPlot +title: "[validmind](/reference/validmind.html).RegressionModelSensitivityPlot" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 8e9827392..8b0786cd1 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -1,9 +1,9 @@ --- -title: RegressionModelSummary +title: "[validmind](/reference/validmind.html).RegressionModelSummary" sidebar: validmind-reference --- -## adj_r2_score[()]{.muted} +## adj_r2_score() diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 91b145a1d..92833694a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -1,9 +1,9 @@ --- -title: RegressionPermutationFeatureImportance +title: "[validmind](/reference/validmind.html).RegressionPermutationFeatureImportance" sidebar: validmind-reference --- -## get_logger[()]{.muted} +## get_logger() diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index 9396cdf80..a4e808cf7 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -1,5 +1,5 @@ --- -title: ScorecardHistogram +title: "[validmind](/reference/validmind.html).ScorecardHistogram" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 10c862769..13333b382 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -1,5 +1,5 @@ --- -title: statsutils +title: "[validmind](/reference/validmind.html).statsutils" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/prompt_validation.qmd b/docs/validmind/tests/prompt_validation.qmd index 53e9d39d0..4aa94a1b9 100644 --- a/docs/validmind/tests/prompt_validation.qmd +++ b/docs/validmind/tests/prompt_validation.qmd @@ -1,5 +1,5 @@ --- -title: prompt_validation +title: "[validmind](/reference/validmind.html).prompt_validation" sidebar: validmind-reference --- diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index e24175ddc..67e2afc01 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -1,9 +1,9 @@ --- -title: Bias +title: "[validmind](/reference/validmind.html).Bias" sidebar: validmind-reference --- -## call_model[()]{.muted} +## call_model() @@ -14,7 +14,7 @@ def call_model( Call LLM with the given prompts and return the response -## get_explanation[()]{.muted} +## get_explanation() @@ -31,7 +31,7 @@ e.g. "Score: 8 Explanation: " -> "" -## get_score[()]{.muted} +## get_score() diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 54ed6a904..d7e12678a 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -1,9 +1,9 @@ --- -title: Clarity +title: "[validmind](/reference/validmind.html).Clarity" sidebar: validmind-reference --- -## call_model[()]{.muted} +## call_model() @@ -14,7 +14,7 @@ def call_model( Call LLM with the given prompts and return the response -## get_explanation[()]{.muted} +## get_explanation() @@ -31,7 +31,7 @@ e.g. "Score: 8 Explanation: " -> "" -## get_score[()]{.muted} +## get_score() diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 05c025936..7fe0e7ed3 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -1,9 +1,9 @@ --- -title: Conciseness +title: "[validmind](/reference/validmind.html).Conciseness" sidebar: validmind-reference --- -## call_model[()]{.muted} +## call_model() @@ -14,7 +14,7 @@ def call_model( Call LLM with the given prompts and return the response -## get_explanation[()]{.muted} +## get_explanation() @@ -31,7 +31,7 @@ e.g. "Score: 8 Explanation: " -> "" -## get_score[()]{.muted} +## get_score() diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index babc3731f..2693ebf1d 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -1,9 +1,9 @@ --- -title: Delimitation +title: "[validmind](/reference/validmind.html).Delimitation" sidebar: validmind-reference --- -## call_model[()]{.muted} +## call_model() @@ -14,7 +14,7 @@ def call_model( Call LLM with the given prompts and return the response -## get_explanation[()]{.muted} +## get_explanation() @@ -31,7 +31,7 @@ e.g. "Score: 8 Explanation: " -> "" -## get_score[()]{.muted} +## get_score() diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 092681ff8..1fbc64465 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -1,9 +1,9 @@ --- -title: NegativeInstruction +title: "[validmind](/reference/validmind.html).NegativeInstruction" sidebar: validmind-reference --- -## call_model[()]{.muted} +## call_model() @@ -14,7 +14,7 @@ def call_model( Call LLM with the given prompts and return the response -## get_explanation[()]{.muted} +## get_explanation() @@ -31,7 +31,7 @@ e.g. "Score: 8 Explanation: " -> "" -## get_score[()]{.muted} +## get_score() diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index d841f7700..0f8998d08 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -1,9 +1,9 @@ --- -title: Robustness +title: "[validmind](/reference/validmind.html).Robustness" sidebar: validmind-reference --- -## call_model[()]{.muted} +## call_model() diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index ef45537ed..e11926197 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -1,9 +1,9 @@ --- -title: Specificity +title: "[validmind](/reference/validmind.html).Specificity" sidebar: validmind-reference --- -## call_model[()]{.muted} +## call_model() @@ -14,7 +14,7 @@ def call_model( Call LLM with the given prompts and return the response -## get_explanation[()]{.muted} +## get_explanation() @@ -31,7 +31,7 @@ e.g. "Score: 8 Explanation: " -> "" -## get_score[()]{.muted} +## get_score() diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index c960bf7ff..cfb1c5ff1 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -1,5 +1,5 @@ --- -title: ai_powered_test +title: "[validmind](/reference/validmind.html).ai_powered_test" sidebar: validmind-reference --- diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 865b905b9..bdfb8ae51 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -1,5 +1,5 @@ --- -title: unit_metrics +title: "[validmind](/reference/validmind.html).unit_metrics" sidebar: validmind-reference --- diff --git a/docs/validmind/version.qmd b/docs/validmind/version.qmd new file mode 100644 index 000000000..45f1fa8cf --- /dev/null +++ b/docs/validmind/version.qmd @@ -0,0 +1,10 @@ +--- +title: "[validmind](/reference/validmind.html).__version__" +sidebar: validmind-reference +--- + + + +```python +2.8.4 +``` diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 9a1f722ff..1e769ac6c 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -1,5 +1,5 @@ --- -title: vm_models +title: "[validmind](/reference/validmind.html).vm_models" sidebar: validmind-reference --- diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index c6708a648..94ca8d519 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -123,19 +123,19 @@ def clean_anchor_text(heading: str) -> str: """Safely clean heading text for anchor generation. Handles: - - [()]{.muted} - - [class]{.muted} - - {.muted} - - Other Quarto formatting + - () + - class + - Other HTML formatting """ # First check if this is a class heading - if '[class]' in heading: - # Remove both [...] and {...} patterns from the class name - class_name = re.sub(r'(\[[^\]]*\]|\{[^}]*\})', '', heading) + if 'class' in heading or 'class' in heading: + # Remove the HTML span for class + class_name = re.sub(r'class\s*', '', heading) return 'class-' + class_name.strip().lower() - # For other headings, remove both [...] and {...} patterns - cleaned = re.sub(r'(\[[^\]]*\]|\{[^}]*\})', '', heading) + # For other headings, remove any HTML spans + cleaned = re.sub(r'\(\)', '', heading) + cleaned = re.sub(r'[^<]*', '', cleaned) return cleaned.strip().lower() def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: Dict[str, Any], is_root: bool = False) -> Dict[str, List[Dict[str, str]]]: @@ -305,6 +305,19 @@ def process_module(module: Dict[str, Any], path: List[str], env: Environment, fu # print(f"Wrote file: {full_path}") written_qmd_files[filename] = full_path + # Generate version.qmd for root module + if module.get('name') == 'validmind' and module.get('members', {}).get('__version__'): + version_template = env.get_template('version.qmd.jinja2') + version_output = version_template.render( + module=module, + full_data=full_data + ) + # Removed the underscores from the filename as Quarto treats files with underscores differently + version_path = os.path.join('docs/validmind', 'version.qmd') + with open(version_path, 'w') as f: + f.write(version_output) + written_qmd_files['version.qmd'] = version_path + # Process submodules members = module.get('members', {}) for name, member in members.items(): From 4ddbdac7985d0967111e3d49b40137975b04548c Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 31 Jan 2025 07:21:20 -0800 Subject: [PATCH 039/207] Fix sidebar regression --- docs/_sidebar.yml | 7 +++++++ scripts/generate_quarto_docs.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml index 42165df0e..00ea4a439 100644 --- a/docs/_sidebar.yml +++ b/docs/_sidebar.yml @@ -41,6 +41,13 @@ website: file: reference/validmind.qmd#test - text: "class RawData" file: reference/validmind.qmd#class-rawdata + contents: + - text: "RawData()" + file: reference/validmind.qmd#rawdata + - text: "inspect()" + file: reference/validmind.qmd#inspect + - text: "serialize()" + file: reference/validmind.qmd#serialize # All module documentation pages - text: "---" - text: "Submodules" diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 94ca8d519..cae8e303c 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -193,7 +193,7 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: 'text': heading, 'file': f"reference/validmind.qmd#{anchor}" } - if '[class]' in heading: + if 'class' in heading or 'class' in heading: item['contents'] = [] current_class = item print(f" Set current_class to: {heading}") From 14f9ec66e20293b69e1615871fdf587a835f135d Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 31 Jan 2025 07:21:46 -0800 Subject: [PATCH 040/207] Fix sidebar regression --- scripts/generate_quarto_docs.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index cae8e303c..47fa43b7b 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -76,13 +76,17 @@ def get_sort_key(member): else: return ('6', '0', name) else: - # Default sorting for non-error modules - if kind == 'class': - return ('0', name.lower()) - elif kind == 'function': + # Special handling for root-level aliases + if kind == 'alias': + if name == '__init__': + return ('0', '0', name) # Put __init__ aliases first + return ('0', '1', name.lower()) # Other aliases next + elif kind == 'class': return ('1', name.lower()) - else: + elif kind == 'function': return ('2', name.lower()) + else: + return ('3', name.lower()) return sorted(members, key=get_sort_key) From 712947026aff006c2341aeae6410fa26e90f7bcb Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 31 Jan 2025 07:22:36 -0800 Subject: [PATCH 041/207] Undo stray commit --- docs/validmind/test_suites.qmd | 110 +++++++++--------- docs/validmind/test_suites/classifier.qmd | 42 +++---- docs/validmind/test_suites/cluster.qmd | 24 ++-- docs/validmind/test_suites/llm.qmd | 36 +++--- docs/validmind/test_suites/nlp.qmd | 24 ++-- docs/validmind/test_suites/regression.qmd | 30 ++--- docs/validmind/test_suites/time_series.qmd | 46 ++++---- docs/validmind/tests.qmd | 34 +++--- .../ChiSquaredFeaturesTable.qmd | 30 ++--- .../tests/data_validation/ClassImbalance.qmd | 30 ++--- .../data_validation/DatasetDescription.qmd | 30 ++--- .../data_validation/DescriptiveStatistics.qmd | 30 ++--- .../tests/data_validation/DickeyFullerGLS.qmd | 30 ++--- .../data_validation/EngleGrangerCoint.qmd | 30 ++--- docs/validmind/tests/data_validation/KPSS.qmd | 30 ++--- .../data_validation/PhillipsPerronArch.qmd | 30 ++--- .../ProtectedClassesCombination.qmd | 30 ++--- .../ProtectedClassesDisparity.qmd | 30 ++--- .../ProtectedClassesThresholdOptimizer.qmd | 30 ++--- .../data_validation/RollingStatsPlot.qmd | 30 ++--- .../data_validation/SeasonalDecompose.qmd | 30 ++--- .../tests/data_validation/SpreadPlot.qmd | 30 ++--- .../TabularCategoricalBarPlots.qmd | 30 ++--- .../TabularDateTimeHistograms.qmd | 30 ++--- .../data_validation/TargetRateBarPlots.qmd | 30 ++--- .../data_validation/TimeSeriesFrequency.qmd | 30 ++--- .../data_validation/TimeSeriesLinePlot.qmd | 30 ++--- .../TimeSeriesMissingValues.qmd | 30 ++--- .../data_validation/TimeSeriesOutliers.qmd | 30 ++--- .../tests/data_validation/WOEBinPlots.qmd | 30 ++--- .../tests/data_validation/WOEBinTable.qmd | 30 ++--- .../data_validation/ZivotAndrewsArch.qmd | 30 ++--- .../tests/data_validation/nlp/Hashtags.qmd | 30 ++--- .../tests/data_validation/nlp/Mentions.qmd | 30 ++--- .../tests/model_validation/FeaturesAUC.qmd | 30 ++--- .../sklearn/ClusterCosineSimilarity.qmd | 30 ++--- .../sklearn/KMeansClustersOptimization.qmd | 30 ++--- .../sklearn/PermutationFeatureImportance.qmd | 30 ++--- .../sklearn/PopulationStabilityIndex.qmd | 30 ++--- .../sklearn/PrecisionRecallCurve.qmd | 30 ++--- .../model_validation/sklearn/ROCCurve.qmd | 30 ++--- .../sklearn/RobustnessDiagnosis.qmd | 30 ++--- .../sklearn/SHAPGlobalImportance.qmd | 30 ++--- .../statsmodels/KolmogorovSmirnov.qmd | 30 ++--- .../statsmodels/RegressionCoeffs.qmd | 30 ++--- .../RegressionFeatureSignificance.qmd | 30 ++--- .../tests/prompt_validation/Bias.qmd | 30 ++--- .../tests/prompt_validation/Clarity.qmd | 30 ++--- .../tests/prompt_validation/Conciseness.qmd | 30 ++--- .../tests/prompt_validation/Delimitation.qmd | 30 ++--- .../prompt_validation/NegativeInstruction.qmd | 30 ++--- .../tests/prompt_validation/Robustness.qmd | 60 +++++----- .../tests/prompt_validation/Specificity.qmd | 30 ++--- scripts/generate_quarto_docs.py | 14 +-- 54 files changed, 868 insertions(+), 872 deletions(-) diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 58b065aba..425c40897 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -59,61 +59,6 @@ Convert a test ID to a human-readable name. - A human-readable name derived from the test ID. -## describe_suite[()]{.muted} - - - -```python -def describe_suite( - test_suite_id: str, - verbose = False): -``` - -Describes a Test Suite by ID - -**Parameters** - -- **test_suite_id**: Test Suite ID -- **verbose**: If True, describe all plans and tests in the Test Suite - -**Returns** - -- A formatted table with the Test Suite description - -## get_by_id[()]{.muted} - - - -```python -def get_by_id( - test_suite_id: str): -``` - -Returns the test suite by ID - -## list_suites[()]{.muted} - - - -```python -def list_suites( - pretty: bool = True): -``` - -Returns a list of all available test suites - -## register_test_suite[()]{.muted} - - - -```python -def register_test_suite( - suite_id: str, - suite: TestSuite): -``` - -Registers a custom test suite - ## [class]{.muted} ClassifierDiagnosis @@ -475,3 +420,58 @@ This test suite provides a preliminary understanding of the target variable(s) u The raw time series data provides a visual inspection of the target variable's behavior over time. This helps to identify any patterns or trends in the data, as well as any potential outliers or anomalies. The histogram of the target variable displays the distribution of values, providing insight into the range and frequency of values observed in the data. **Inherited members** + +## describe_suite[()]{.muted} + + + +```python +def describe_suite( + test_suite_id: str, + verbose = False): +``` + +Describes a Test Suite by ID + +**Parameters** + +- **test_suite_id**: Test Suite ID +- **verbose**: If True, describe all plans and tests in the Test Suite + +**Returns** + +- A formatted table with the Test Suite description + +## get_by_id[()]{.muted} + + + +```python +def get_by_id( + test_suite_id: str): +``` + +Returns the test suite by ID + +## list_suites[()]{.muted} + + + +```python +def list_suites( + pretty: bool = True): +``` + +Returns a list of all available test suites + +## register_test_suite[()]{.muted} + + + +```python +def register_test_suite( + suite_id: str, + suite: TestSuite): +``` + +Registers a custom test suite diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index a4987281e..17ad32b7c 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -5,86 +5,86 @@ sidebar: validmind-reference Test suites for sklearn-compatible classifier models Ideal setup is to have the API client to read a custom test suite from the project's configuration -## [class]{.muted} ClassifierDiagnosis +## [class]{.muted} TabularDataQuality ```python -class ClassifierDiagnosis(TestSuite): +class TabularDataQuality(TestSuite): ``` -Test suite for sklearn classifier model diagnosis tests +Test suite for data quality on tabular datasets **Inherited members** -## [class]{.muted} ClassifierFullSuite +## [class]{.muted} TabularDatasetDescription ```python -class ClassifierFullSuite(TestSuite): +class TabularDatasetDescription(TestSuite): ``` -Full test suite for binary classification models. +Test suite to extract metadata and descriptive statistics from a tabular dataset **Inherited members** -## [class]{.muted} ClassifierMetrics +## [class]{.muted} ClassifierDiagnosis ```python -class ClassifierMetrics(TestSuite): +class ClassifierDiagnosis(TestSuite): ``` -Test suite for sklearn classifier metrics +Test suite for sklearn classifier model diagnosis tests **Inherited members** -## [class]{.muted} ClassifierModelValidation +## [class]{.muted} ClassifierFullSuite ```python -class ClassifierModelValidation(TestSuite): +class ClassifierFullSuite(TestSuite): ``` -Test suite for binary classification models. +Full test suite for binary classification models. **Inherited members** -## [class]{.muted} ClassifierPerformance +## [class]{.muted} ClassifierMetrics ```python -class ClassifierPerformance(TestSuite): +class ClassifierMetrics(TestSuite): ``` -Test suite for sklearn classifier models +Test suite for sklearn classifier metrics **Inherited members** -## [class]{.muted} TabularDataQuality +## [class]{.muted} ClassifierModelValidation ```python -class TabularDataQuality(TestSuite): +class ClassifierModelValidation(TestSuite): ``` -Test suite for data quality on tabular datasets +Test suite for binary classification models. **Inherited members** -## [class]{.muted} TabularDatasetDescription +## [class]{.muted} ClassifierPerformance ```python -class TabularDatasetDescription(TestSuite): +class ClassifierPerformance(TestSuite): ``` -Test suite to extract metadata and descriptive statistics from a tabular dataset +Test suite for sklearn classifier models **Inherited members** diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index 8056a3a61..c63be2884 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -5,50 +5,50 @@ sidebar: validmind-reference Test suites for sklearn-compatible clustering models Ideal setup is to have the API client to read a custom test suite from the project's configuration -## [class]{.muted} ClusterFullSuite +## [class]{.muted} KmeansParametersOptimization ```python -class ClusterFullSuite(TestSuite): +class KmeansParametersOptimization(TestSuite): ``` -Full test suite for clustering models. +Test suite for sklearn hyperparameters optimization **Inherited members** -## [class]{.muted} ClusterMetrics +## [class]{.muted} ClusterFullSuite ```python -class ClusterMetrics(TestSuite): +class ClusterFullSuite(TestSuite): ``` -Test suite for sklearn clustering metrics +Full test suite for clustering models. **Inherited members** -## [class]{.muted} ClusterPerformance +## [class]{.muted} ClusterMetrics ```python -class ClusterPerformance(TestSuite): +class ClusterMetrics(TestSuite): ``` -Test suite for sklearn cluster performance +Test suite for sklearn clustering metrics **Inherited members** -## [class]{.muted} KmeansParametersOptimization +## [class]{.muted} ClusterPerformance ```python -class KmeansParametersOptimization(TestSuite): +class ClusterPerformance(TestSuite): ``` -Test suite for sklearn hyperparameters optimization +Test suite for sklearn cluster performance **Inherited members** diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index 5e41878ed..2b27fda83 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -5,74 +5,74 @@ sidebar: validmind-reference Test suites for LLMs -## [class]{.muted} LLMClassifierFullSuite +## [class]{.muted} ClassifierDiagnosis ```python -class LLMClassifierFullSuite(TestSuite): +class ClassifierDiagnosis(TestSuite): ``` -Full test suite for LLM classification models. +Test suite for sklearn classifier model diagnosis tests **Inherited members** -## [class]{.muted} PromptValidation +## [class]{.muted} ClassifierMetrics ```python -class PromptValidation(TestSuite): +class ClassifierMetrics(TestSuite): ``` -Test suite for prompt validation +Test suite for sklearn classifier metrics **Inherited members** -## [class]{.muted} ClassifierDiagnosis +## [class]{.muted} ClassifierPerformance ```python -class ClassifierDiagnosis(TestSuite): +class ClassifierPerformance(TestSuite): ``` -Test suite for sklearn classifier model diagnosis tests +Test suite for sklearn classifier models **Inherited members** -## [class]{.muted} ClassifierMetrics +## [class]{.muted} TextDataQuality ```python -class ClassifierMetrics(TestSuite): +class TextDataQuality(TestSuite): ``` -Test suite for sklearn classifier metrics +Test suite for data quality on text data **Inherited members** -## [class]{.muted} ClassifierPerformance +## [class]{.muted} LLMClassifierFullSuite ```python -class ClassifierPerformance(TestSuite): +class LLMClassifierFullSuite(TestSuite): ``` -Test suite for sklearn classifier models +Full test suite for LLM classification models. **Inherited members** -## [class]{.muted} TextDataQuality +## [class]{.muted} PromptValidation ```python -class TextDataQuality(TestSuite): +class PromptValidation(TestSuite): ``` -Test suite for data quality on text data +Test suite for prompt validation **Inherited members** diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index 8cb5c3a11..d6b9c6c68 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -5,18 +5,6 @@ sidebar: validmind-reference Test suites for NLP models -## [class]{.muted} NLPClassifierFullSuite - - - -```python -class NLPClassifierFullSuite(TestSuite): -``` - -Full test suite for NLP classification models. - -**Inherited members** - ## [class]{.muted} ClassifierDiagnosis @@ -64,3 +52,15 @@ class TextDataQuality(TestSuite): Test suite for data quality on text data **Inherited members** + +## [class]{.muted} NLPClassifierFullSuite + + + +```python +class NLPClassifierFullSuite(TestSuite): +``` + +Full test suite for NLP classification models. + +**Inherited members** diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index 8d642ec2a..57cd47925 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -3,62 +3,62 @@ title: "[validmind](/reference/validmind.html).regression" sidebar: validmind-reference --- -## [class]{.muted} RegressionFullSuite +## [class]{.muted} TabularDataQuality ```python -class RegressionFullSuite(TestSuite): +class TabularDataQuality(TestSuite): ``` -Full test suite for regression models. +Test suite for data quality on tabular datasets **Inherited members** -## [class]{.muted} RegressionMetrics +## [class]{.muted} TabularDatasetDescription ```python -class RegressionMetrics(TestSuite): +class TabularDatasetDescription(TestSuite): ``` -Test suite for performance metrics of regression metrics +Test suite to extract metadata and descriptive statistics from a tabular dataset **Inherited members** -## [class]{.muted} RegressionPerformance +## [class]{.muted} RegressionFullSuite ```python -class RegressionPerformance(TestSuite): +class RegressionFullSuite(TestSuite): ``` -Test suite for regression model performance +Full test suite for regression models. **Inherited members** -## [class]{.muted} TabularDataQuality +## [class]{.muted} RegressionMetrics ```python -class TabularDataQuality(TestSuite): +class RegressionMetrics(TestSuite): ``` -Test suite for data quality on tabular datasets +Test suite for performance metrics of regression metrics **Inherited members** -## [class]{.muted} TabularDatasetDescription +## [class]{.muted} RegressionPerformance ```python -class TabularDatasetDescription(TestSuite): +class RegressionPerformance(TestSuite): ``` -Test suite to extract metadata and descriptive statistics from a tabular dataset +Test suite for regression model performance **Inherited members** diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index 1e9e2e883..48f2c6777 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -5,88 +5,88 @@ sidebar: validmind-reference Time Series Test Suites -## [class]{.muted} TimeSeriesDataQuality +## [class]{.muted} RegressionModelDescription ```python -class TimeSeriesDataQuality(TestSuite): +class RegressionModelDescription(TestSuite): ``` -Test suite for data quality on time series datasets +Test suite for performance metric of regression model of statsmodels library **Inherited members** -## [class]{.muted} TimeSeriesDataset +## [class]{.muted} RegressionModelsEvaluation ```python -class TimeSeriesDataset(TestSuite): +class RegressionModelsEvaluation(TestSuite): ``` -Test suite for time series datasets. +Test suite for metrics comparison of regression model of statsmodels library **Inherited members** -## [class]{.muted} TimeSeriesModelValidation +## [class]{.muted} TimeSeriesDataQuality ```python -class TimeSeriesModelValidation(TestSuite): +class TimeSeriesDataQuality(TestSuite): ``` -Test suite for time series model validation. +Test suite for data quality on time series datasets **Inherited members** -## [class]{.muted} TimeSeriesMultivariate +## [class]{.muted} TimeSeriesDataset ```python -class TimeSeriesMultivariate(TestSuite): +class TimeSeriesDataset(TestSuite): ``` -This test suite provides a preliminary understanding of the features and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. +Test suite for time series datasets. **Inherited members** -## [class]{.muted} TimeSeriesUnivariate +## [class]{.muted} TimeSeriesModelValidation ```python -class TimeSeriesUnivariate(TestSuite): +class TimeSeriesModelValidation(TestSuite): ``` -This test suite provides a preliminary understanding of the target variable(s) used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). - -The raw time series data provides a visual inspection of the target variable's behavior over time. This helps to identify any patterns or trends in the data, as well as any potential outliers or anomalies. The histogram of the target variable displays the distribution of values, providing insight into the range and frequency of values observed in the data. +Test suite for time series model validation. **Inherited members** -## [class]{.muted} RegressionModelDescription +## [class]{.muted} TimeSeriesMultivariate ```python -class RegressionModelDescription(TestSuite): +class TimeSeriesMultivariate(TestSuite): ``` -Test suite for performance metric of regression model of statsmodels library +This test suite provides a preliminary understanding of the features and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. **Inherited members** -## [class]{.muted} RegressionModelsEvaluation +## [class]{.muted} TimeSeriesUnivariate ```python -class RegressionModelsEvaluation(TestSuite): +class TimeSeriesUnivariate(TestSuite): ``` -Test suite for metrics comparison of regression model of statsmodels library +This test suite provides a preliminary understanding of the target variable(s) used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). + +The raw time series data provides a visual inspection of the target variable's behavior over time. This helps to identify any patterns or trends in the data, as well as any potential outliers or anomalies. The histogram of the target variable displays the distribution of values, providing insight into the range and frequency of values observed in the data. **Inherited members** diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 6491aef05..d391949e7 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -203,23 +203,6 @@ The function may also include a docstring. This docstring will be used and logge - The decorated function. -## register_test_provider[()]{.muted} - - - -```python -def register_test_provider( - namespace: str, - test_provider: TestProvider) -> None: -``` - -Register an external test provider - -**Parameters** - -- **namespace** str: The namespace of the test provider -- **test_provider** TestProvider: The test provider - ## [class]{.muted} LoadTestError @@ -345,3 +328,20 @@ Load the test function identified by the given test_id **Raises** - **FileNotFoundError**: If the test is not found + +## register_test_provider[()]{.muted} + + + +```python +def register_test_provider( + namespace: str, + test_provider: TestProvider) -> None: +``` + +Register an external test provider + +**Parameters** + +- **namespace** str: The namespace of the test provider +- **test_provider** TestProvider: The test provider diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index b33e5e1e2..6b1543656 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).ChiSquaredFeaturesTable" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## ChiSquaredFeaturesTable[()]{.muted} @@ -40,18 +55,3 @@ The function creates a contingency table for each categorical feature and the ta - The test is designed for classification tasks and is not applicable to regression problems. - As with all hypothesis tests, the Chi-Squared test can only detect associations, not causal relationships. - The choice of p-value threshold can affect the interpretation of feature relevance, and different thresholds may lead to different conclusions. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 538465998..1b6faab7a 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -5,6 +5,21 @@ sidebar: validmind-reference Threshold based tests +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## ClassImbalance[()]{.muted} @@ -46,18 +61,3 @@ This Class Imbalance test operates by calculating the frequency (expressed as a - Regardless of the percentage threshold, it doesn't account for varying costs or impacts of misclassifying different classes, which might fluctuate based on specific applications or domains. - While it can identify imbalances in class distribution, it doesn't provide direct methods to address or correct these imbalances. - The test is only applicable for classification operations and unsuitable for regression or clustering tasks. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 0527016dc..196ec608e 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -14,6 +14,21 @@ def get_logger( Get a logger for the given module name +## [class]{.muted} UnsupportedColumnTypeError + + + +```python +class UnsupportedColumnTypeError(BaseError): +``` + +When an unsupported column type is found on a dataset. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## DatasetDescription[()]{.muted} @@ -102,18 +117,3 @@ Returns a collection of histograms for a numerical column, each one with a diffe def infer_datatypes( df): ``` - -## [class]{.muted} UnsupportedColumnTypeError - - - -```python -class UnsupportedColumnTypeError(BaseError): -``` - -When an unsupported column type is found on a dataset. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 733956d55..a4de52ac7 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -20,6 +20,21 @@ We do this for display purposes before sending data to ValidMind. Rules: - If the column's smallest number has more decimals 6, use that number's precision so we can avoid rendering a 0 instead - If the column's smallest number has less decimals than 6, use 6 decimal places +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## DescriptiveStatistics[()]{.muted} @@ -76,18 +91,3 @@ def get_summary_statistics_numerical( df, numerical_fields): ``` - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index d2f8b7425..5cb779222 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -14,6 +14,21 @@ def get_logger( Get a logger for the given module name +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## DickeyFullerGLS[()]{.muted} @@ -48,18 +63,3 @@ This code implements the Dickey-Fuller GLS unit root test on each attribute of t - Despite its benefits, the DFGLS test does present some drawbacks. It can potentially lead to inaccurate conclusions if the time series data incorporates a structural break. - If the time series tends to follow a trend while still being stationary, the test might misinterpret it, necessitating further detrending. - The test also presents challenges when dealing with shorter time series data or volatile data, not producing reliable results in these cases. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 5592d4938..2fece895d 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).EngleGrangerCoint" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## EngleGrangerCoint[()]{.muted} @@ -38,18 +53,3 @@ The test first drops any non-applicable values from the input dataset and then i - Assumes that the time series are integrated of the same order, which isn't always true in multivariate time series datasets. - The presence of non-stationary characteristics in the series or structural breaks can result in falsely positive or negative cointegration results. - May not perform well for small sample sizes due to lack of statistical power and should be supplemented with other predictive indicators for a more robust model evaluation. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index afd267862..699a0a5cb 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -14,6 +14,21 @@ def get_logger( Get a logger for the given module name +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## KPSS[()]{.muted} @@ -48,18 +63,3 @@ This test calculates the KPSS score for each feature in the dataset. The KPSS sc - Assumes the absence of a unit root in the series and doesn't differentiate between series that are stationary and those border-lining stationarity. - The test may have restricted power against certain alternatives. - The reliability of the test is contingent on the number of lags selected, which introduces potential bias in the measurement. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 956027eed..1fe0cb0de 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -14,6 +14,21 @@ def get_logger( Get a logger for the given module name +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## PhillipsPerronArch[()]{.muted} @@ -54,18 +69,3 @@ The PP test is conducted for each feature in the dataset as follows: - Applicable only within a univariate time series framework. - Relies on asymptotic theory, which may reduce the test’s power for small sample sizes. - Non-stationary time series must be converted to stationary series through differencing, potentially leading to loss of important data points. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 542df6970..7c16ba2b4 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -14,6 +14,21 @@ def get_logger( Get a logger for the given module name +## [class]{.muted} MissingDependencyError + + + +```python +class MissingDependencyError(BaseError): +``` + +When a required dependency is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## ProtectedClassesCombination[()]{.muted} @@ -56,18 +71,3 @@ The test performs the following steps: - May become complex and difficult to interpret with a large number of protected classes or combinations. - Does not provide statistical significance of observed differences. - Visualization alone may not capture all nuances of intersectional fairness. - -## [class]{.muted} MissingDependencyError - - - -```python -class MissingDependencyError(BaseError): -``` - -When a required dependency is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 4fac8bbf2..3b1c3e725 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -14,6 +14,21 @@ def get_logger( Get a logger for the given module name +## [class]{.muted} MissingDependencyError + + + +```python +class MissingDependencyError(BaseError): +``` + +When a required dependency is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## ProtectedClassesDisparity[()]{.muted} @@ -60,18 +75,3 @@ The test performs the following steps: - Relies on a predefined reference group for each protected class, which may not always be the most appropriate choice. - Does not account for intersectionality between different protected attributes. - The interpretation of results may require domain expertise to understand the implications of observed disparities. - -## [class]{.muted} MissingDependencyError - - - -```python -class MissingDependencyError(BaseError): -``` - -When a required dependency is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index f614d7c1a..1b5acee88 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -14,6 +14,21 @@ def get_logger( Get a logger for the given module name +## [class]{.muted} MissingDependencyError + + + +```python +class MissingDependencyError(BaseError): +``` + +When a required dependency is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## calculate_fairness_metrics[()]{.muted} @@ -124,18 +139,3 @@ The test uses Fairlearn's ThresholdOptimizer to: - May lead to a decrease in overall model performance while improving fairness. - Requires access to protected attribute information at prediction time. - The effectiveness can vary depending on the chosen fairness constraint and objective. - -## [class]{.muted} MissingDependencyError - - - -```python -class MissingDependencyError(BaseError): -``` - -When a required dependency is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 33c6cd8a3..7ddc09279 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).RollingStatsPlot" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## plot_rolling_statistics[()]{.muted} @@ -52,18 +67,3 @@ This mechanism is comprised of two steps. Initially, the rolling mean and standa - For all columns, a fixed-size window is utilized. This may not accurately capture patterns in datasets where different features may require different optimal window sizes. - Requires the dataset to be indexed by date and time, hence it may not be usable for datasets without a timestamp index. - Primarily serves for data visualization as it does not facilitate any quantitative measures for stationarity, such as through statistical tests. Therefore, the interpretation is subjective and depends heavily on modeler discretion. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 1df51245b..df4e35795 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -14,6 +14,21 @@ def get_logger( Get a logger for the given module name +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## SeasonalDecompose[()]{.muted} @@ -51,18 +66,3 @@ The testing process leverages the `seasonal_decompose` function from the `statsm - **Dependence on Assumptions**: Assumes that dataset features are periodically distributed. Features with no inferable frequency are excluded from the test. - **Handling Non-Finite Values**: Disregards non-finite values during analysis, potentially resulting in an incomplete understanding of the dataset. - **Unreliability with Noisy Datasets**: Produces unreliable results when used with datasets that contain heavy noise. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 0f4d07d7d..154109698 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).SpreadPlot" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## SpreadPlot[()]{.muted} @@ -41,18 +56,3 @@ The SpreadPlot test computes and represents the spread between each pair of time - Heavily relies on the quality and granularity of the data—missing data or outliers can notably disturb the interpretation of relationships. - Can become inefficient or difficult to interpret with a high number of variables due to the profuse number of plots. - Might not completely capture intricate non-linear relationships between the variables. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 8d688dcaf..f224a4ffc 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).TabularCategoricalBarPlots" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## TabularCategoricalBarPlots[()]{.muted} @@ -38,18 +53,3 @@ The provided dataset is first checked to determine if it contains any categorica - This method only works with categorical data and won't apply to numerical variables. - It does not provide informative value when there are too many categories, as the bar chart could become cluttered and hard to interpret. - Offers no insights into the model's performance or precision, but rather provides a descriptive analysis of the input. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 4989940e8..7d8929a2b 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).TabularDateTimeHistograms" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## TabularDateTimeHistograms[()]{.muted} @@ -39,18 +54,3 @@ This test operates by first identifying all datetime columns and extracting them - The metric might overlook complex or multi-dimensional trends in the data. - The test is only applicable to datasets containing datetime columns and will fail if such columns are unavailable. - The interpretation of the histograms relies heavily on the domain expertise and experience of the reviewer. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 25e028f10..e1a71b85d 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).TargetRateBarPlots" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## TargetRateBarPlots[()]{.muted} @@ -35,18 +50,3 @@ The test involves creating a pair of bar plots for each categorical feature in t ### Limitations - The readability of the bar plots drops as the number of distinct categories increases in the dataset, which can make them harder to understand and less useful. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index bd26eed62..592f1a2f2 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).TimeSeriesFrequency" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## TimeSeriesFrequency[()]{.muted} @@ -38,18 +53,3 @@ Initially, the test checks if the dataframe index is in datetime format. Subsequ - This test is only applicable to time-series datasets and hence not suitable for other types of datasets. - The `infer_freq` method might not always correctly infer frequency when faced with missing or irregular data points. - Depending on context or the model under development, mixed frequencies might sometimes be acceptable, but this test considers them a failing condition. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 2bbb87083..8de1f5ed7 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).TimeSeriesLinePlot" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## TimeSeriesLinePlot[()]{.muted} @@ -40,18 +55,3 @@ The mechanism for this Python class involves extracting the column names from th - Exclusively a visual tool, it lacks the capability to provide quantitative measurements, making it less effective for comparing and ranking multiple models or when specific numerical diagnostics are needed. - The metric necessitates that the time-specific data has been transformed into a datetime index, with the data formatted correctly. - The metric has an inherent limitation in that it cannot extract deeper statistical insights from the time series data, which can limit its efficacy with complex data structures and phenomena. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index be9f2bfe7..41a554f3a 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).TimeSeriesMissingValues" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## TimeSeriesMissingValues[()]{.muted} @@ -39,18 +54,3 @@ The test method commences by validating if the dataset has a datetime index; if - The test demands that the dataset should have a datetime index, hence limiting its use only to time series analysis. - The test's sensitivity to the 'min_threshold' parameter may raise false alarms if set too strictly or may overlook problematic data if set too loosely. - Solely focuses on the 'missingness' of the data and might fall short in addressing other aspects of data quality. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index e92db292b..3915aa5db 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).TimeSeriesOutliers" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## TimeSeriesOutliers[()]{.muted} @@ -44,18 +59,3 @@ The test processes a given dataset which must have datetime indexing, checks if - The method relies on a subjective z-score threshold for deciding what constitutes an outlier, which might not always be suitable depending on the dataset and use case. - It does not address possible ways to handle identified outliers in the data. - The requirement for a datetime index could limit its application. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index e858b526f..fe3d5a7f3 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -14,6 +14,21 @@ def get_logger( Get a logger for the given module name +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## WOEBinPlots[()]{.muted} @@ -54,18 +69,3 @@ The test implementation follows defined steps. Initially, it selects non-numeric - While excellent for categorical data, the encoding of continuous variables into categorical can sometimes lead to information loss. - Extreme or outlier values can dramatically affect the computation of WoE and IV, skewing results. - The method requires a sufficient number of events per bin to generate a reliable information value and weight of evidence. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 6275b676f..c77875a07 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).WOEBinTable" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## WOEBinTable[()]{.muted} @@ -38,18 +53,3 @@ The test uses the `scorecardpy.woebin` method to perform automatic binning of th - Primarily designed for binary classification tasks, making it less applicable or reliable for multi-class classification or regression tasks. - Potential difficulties if the dataset has many features, non-binnable features, or non-numeric features. - The metric does not help in distinguishing whether the observed predictive factor is due to data randomness or a true phenomenon. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 786653e07..86646d47c 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -14,6 +14,21 @@ def get_logger( Get a logger for the given module name +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## ZivotAndrewsArch[()]{.muted} @@ -47,18 +62,3 @@ The Zivot-Andrews unit root test is performed on each feature in the dataset usi - Assumes data is derived from a single-equation, autoregressive model, making it less appropriate for multivariate time series data or data not aligning with this model. - May not account for unexpected shocks or changes in the series trend, both of which can significantly impact data stationarity. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index e33dce71a..1248f0329 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).Hashtags" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## Hashtags[()]{.muted} @@ -41,18 +56,3 @@ The test implements a regular expression (regex) to extract all hashtags from th - Language-specific limitations of hashtag formulations are not taken into account. - Does not account for typographical errors, variations, or synonyms in hashtags. - Does not provide context or sentiment associated with the hashtags, so the information provided may have limited utility on its own. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 6885490ab..8599c8631 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).Mentions" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## Mentions[()]{.muted} @@ -39,18 +54,3 @@ The test first verifies the existence of a text column in the provided dataset. - The test only recognizes mentions that are prefixed by '@', hence useful textual aspects not preceded by '@' might be ignored. - This test isn't suited for datasets devoid of textual data. - It does not provide insights on less frequently occurring data or outliers, which means potentially significant patterns could be overlooked. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index c6b75e5c2..8956c655f 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -14,6 +14,21 @@ def get_logger( Get a logger for the given module name +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## FeaturesAUC[()]{.muted} @@ -50,18 +65,3 @@ For each feature, the metric treats the feature values as raw scores to compute - Does not reflect the combined effects of features or any interaction between them, which can be critical in certain models. - The AUC values are calculated without considering the model's use of the features, which could lead to different interpretations of feature importance when considering the model holistically. - This metric is applicable only to binary classification tasks and cannot be directly extended to multiclass classification or regression without modifications. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 53abe586f..c0303644e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).ClusterCosineSimilarity" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## ClusterCosineSimilarity[()]{.muted} @@ -40,18 +55,3 @@ This test works by first extracting the true and predicted clusters of the model - This method summarily assumes that centroids represent the average behavior of data points in each cluster. This might not always be true, especially in clusters with high amounts of variance or non-spherical shapes. - It primarily works with continuous variables and is not suitable for binary or categorical variables. - Lastly, although rare, perfect perpendicular vectors (cosine similarity = 0) could be within the same cluster, which may give an inaccurate representation of a 'bad' cluster due to low cosine similarity score. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index ce2a8b936..4111863ff 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).KMeansClustersOptimization" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## KMeansClustersOptimization[()]{.muted} @@ -42,18 +57,3 @@ The test mechanism involves iterating over a predefined range of cluster numbers - Both methods may fail to provide definitive answers when the data lacks clear cluster structures. - Might not be straightforward to determine the 'elbow' point or maximize the silhouette average score, especially in larger and complicated datasets. - Assumes spherical clusters (due to using the Euclidean distance in the Elbow method), which might not align with the actual structure of the data. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 2528dc2e3..015b0ed60 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -14,6 +14,21 @@ def get_logger( Get a logger for the given module name +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## PermutationFeatureImportance[()]{.muted} @@ -52,18 +67,3 @@ PFI is calculated via the `permutation_importance` method from the `sklearn.insp - Does not imply causality; it only presents the amount of information that a feature provides for the prediction task. - Does not account for interactions between features. If features are correlated, the permutation importance may allocate importance to one and not the other. - Cannot interact with certain libraries like statsmodels, pytorch, catboost, etc., thus limiting its applicability. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 217878de0..38c61ed3f 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -14,6 +14,21 @@ def get_logger( Get a logger for the given module name +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## calculate_psi[()]{.muted} @@ -68,18 +83,3 @@ The implementation of the PSI in this script involves calculating the PSI for ea - The PSI test does not inherently provide insights into why there are differences in distributions or why the PSI values may have changed. - The test may not handle features with significant outliers adequately. - Additionally, the PSI test is performed on model predictions, not on the underlying data distributions which can lead to misinterpretations. Any changes in PSI could be due to shifts in the model (model drift), changes in the relationships between features and the target variable (concept drift), or both. However, distinguishing between these causes is non-trivial. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 199ef08ce..6b02862e6 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).PrecisionRecallCurve" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## PrecisionRecallCurve[()]{.muted} @@ -38,18 +53,3 @@ The test extracts ground truth labels and prediction probabilities from the mode - This metric is only applicable to binary classification models - it raises errors for multiclass classification models or Foundation models. - It may not fully represent the overall accuracy of the model if the cost of false positives and false negatives are extremely different, or if the dataset is heavily imbalanced. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index c2162c63e..8c141708e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).ROCCurve" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## ROCCurve[()]{.muted} @@ -39,18 +54,3 @@ First, this script selects the target model and datasets that require binary cla - The primary limitation is that this test is exclusively structured for binary classification tasks, thus limiting its application towards other model types. - Furthermore, its performance might be subpar with models that output probabilities highly skewed towards 0 or 1. - At the extreme, the ROC curve could reflect high performance even when the majority of classifications are incorrect, provided that the model's ranking format is retained. This phenomenon is commonly termed the "Class Imbalance Problem". - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 451f82c8d..a4ac75f88 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -14,6 +14,21 @@ def get_logger( Get a logger for the given module name +## [class]{.muted} MissingOrInvalidModelPredictFnError + + + +```python +class MissingOrInvalidModelPredictFnError(BaseError): +``` + +When the pytorch model is missing a predict function or its predict method does not have the expected arguments. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## RobustnessDiagnosis[()]{.muted} @@ -58,18 +73,3 @@ This test introduces Gaussian noise to the numeric input features of the dataset - Gaussian noise might not adequately represent all types of real-world data perturbations. - Performance thresholds are somewhat arbitrary and might need tuning. - The test may not account for more complex or unstructured noise patterns that could affect model robustness. - -## [class]{.muted} MissingOrInvalidModelPredictFnError - - - -```python -class MissingOrInvalidModelPredictFnError(BaseError): -``` - -When the pytorch model is missing a predict function or its predict method does not have the expected arguments. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 8bc466339..225b2c3f2 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -14,6 +14,21 @@ def get_logger( Get a logger for the given module name +## [class]{.muted} UnsupportedModelForSHAPError + + + +```python +class UnsupportedModelForSHAPError(BaseError): +``` + +When an unsupported model is used for SHAP importance. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## generate_shap_plot[()]{.muted} @@ -104,18 +119,3 @@ The exam begins with the selection of a suitable explainer which aligns with the - High-dimensional data can convolute interpretations. - Associating importance with tangible real-world impact still involves a certain degree of subjectivity. - -## [class]{.muted} UnsupportedModelForSHAPError - - - -```python -class UnsupportedModelForSHAPError(BaseError): -``` - -When an unsupported model is used for SHAP importance. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index f58ec3b32..8d490104c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).KolmogorovSmirnov" sidebar: validmind-reference --- +## [class]{.muted} InvalidTestParametersError + + + +```python +class InvalidTestParametersError(BaseError): +``` + +When an invalid parameters for the test. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## KolmogorovSmirnov[()]{.muted} @@ -40,18 +55,3 @@ This test calculates the KS statistic and corresponding p-value for each feature - The test's sensitivity to disparities in the tails of data distribution might cause false alarms about non-normality. - Less effective for multivariate distributions, as it is designed for univariate distributions. - Does not identify specific types of non-normality, such as skewness or kurtosis, which could impact model fitting. - -## [class]{.muted} InvalidTestParametersError - - - -```python -class InvalidTestParametersError(BaseError): -``` - -When an invalid parameters for the test. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 56123b99b..58cb4fe96 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -3,6 +3,21 @@ title: "[validmind](/reference/validmind.html).RegressionCoeffs" sidebar: validmind-reference --- +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## RegressionCoeffs[()]{.muted} @@ -38,18 +53,3 @@ The function operates by extracting the estimated coefficients and their standar - The method assumes normality of residuals and independence of observations, assumptions that may not always hold true in practice. - It does not address issues related to multi-collinearity among predictor variables, which can affect the interpretation of coefficients. - This metric is limited to regression tasks using tabular data and is not applicable to other types of machine learning tasks or data structures. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index d9aeb2ab1..655254a00 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -14,6 +14,21 @@ def get_logger( Get a logger for the given module name +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## RegressionFeatureSignificance[()]{.muted} @@ -51,18 +66,3 @@ The test mechanism involves extracting the model's coefficients and p-values for - The p-value strategy for feature selection doesn't take into account the magnitude of the effect, focusing solely on whether the feature is likely non-zero. - This test is specific to regression models and wouldn't be suitable for other types of ML models. - P-value thresholds are somewhat arbitrary and do not always indicate practical significance, only statistical significance. - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 67e2afc01..346d97797 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -48,6 +48,21 @@ e.g. "Score: 8 Explanation: " -> 8 +## [class]{.muted} MissingRequiredTestInputError + + + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## Bias[()]{.muted} @@ -89,18 +104,3 @@ For each test case, the LLM grades the input prompt on a scale of 1 to 10. It ev - The test may not pick up on more subtle forms of bias or biases that are not directly related to the distribution or order of exemplars. - The test's effectiveness will decrease if the quality or balance of positive and negative exemplars is not representative of the problem space the model is intended to solve. - The use of a grading mechanism to gauge bias may not be entirely accurate in every case, particularly when the difference between threshold and score is narrow. - -## [class]{.muted} MissingRequiredTestInputError - - - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index d7e12678a..602c4520d 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -48,6 +48,21 @@ e.g. "Score: 8 Explanation: " -> 8 +## [class]{.muted} MissingRequiredTestInputError + + + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## Clarity[()]{.muted} @@ -84,18 +99,3 @@ The evaluation uses an LLM to scrutinize the clarity of prompts, factoring in co - Scoring system is subjective and relies on the AI’s interpretation of 'clarity' - The test assumes that all required factors (detail inclusion, persona adoption, step-by-step instructions, use of examples, and specification of output length) contribute equally to clarity, which might not always be the case - The evaluation may not be as effective if used on non-textual models - -## [class]{.muted} MissingRequiredTestInputError - - - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 7fe0e7ed3..2f09bdd0b 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -48,6 +48,21 @@ e.g. "Score: 8 Explanation: " -> 8 +## [class]{.muted} MissingRequiredTestInputError + + + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## Conciseness[()]{.muted} @@ -86,18 +101,3 @@ Using an LLM, this test conducts a conciseness analysis on input prompts. The an - The conciseness score is based on an AI's assessment, which might not fully capture human interpretation of conciseness. - The predefined threshold for conciseness could be subjective and might need adjustment based on application. - The test is dependent on the LLM’s understanding of conciseness, which might vary from model to model. - -## [class]{.muted} MissingRequiredTestInputError - - - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 2693ebf1d..7a7ef558d 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -48,6 +48,21 @@ e.g. "Score: 8 Explanation: " -> 8 +## [class]{.muted} MissingRequiredTestInputError + + + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## Delimitation[()]{.muted} @@ -85,18 +100,3 @@ The test employs an LLM to examine prompts for appropriate use of delimiters suc - Only checks for the presence and placement of delimiters, not whether the correct delimiter type is used for the specific data or task. - May not fully reveal the impacts of poor delimitation on the LLM's final performance. - The preset score threshold may not be refined enough for complex tasks and prompts, requiring regular manual adjustment. - -## [class]{.muted} MissingRequiredTestInputError - - - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 1fbc64465..b2af317ca 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -48,6 +48,21 @@ e.g. "Score: 8 Explanation: " -> 8 +## [class]{.muted} MissingRequiredTestInputError + + + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## NegativeInstruction[()]{.muted} @@ -85,18 +100,3 @@ An LLM is employed to evaluate each prompt. The prompt is graded based on its us - The test necessitates an LLM for evaluation, which might not be available or feasible in certain scenarios. - A numeric scoring system, while straightforward, may oversimplify complex issues related to prompt designing and instruction clarity. - The effectiveness of the test hinges significantly on the predetermined threshold level, which can be subjective and may need to be adjusted according to specific use-cases. - -## [class]{.muted} MissingRequiredTestInputError - - - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 0f8998d08..5f426a850 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -14,6 +14,36 @@ def call_model( Call LLM with the given prompts and return the response +## [class]{.muted} MissingRequiredTestInputError + + + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## Robustness[()]{.muted} @@ -51,33 +81,3 @@ The Robustness test appraises prompts under various conditions, alterations, and - Currently, the test only supports single-variable prompts, which restricts its application to more complex models. - When there are too many target classes (over 10), the test is skipped, which can leave potential vulnerabilities unchecked in complex multi-class models. - The test may not account for all potential conditions or alterations that could show up in practical use scenarios. - -## [class]{.muted} MissingRequiredTestInputError - - - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index e11926197..672b25339 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -48,6 +48,21 @@ e.g. "Score: 8 Explanation: " -> 8 +## [class]{.muted} MissingRequiredTestInputError + + + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + ## Specificity[()]{.muted} @@ -85,18 +100,3 @@ The Specificity Test employs an LLM to grade each prompt based on clarity, detai - This test doesn't consider the content comprehension capability of the LLM - High specificity score doesn't guarantee a high-quality response from the LLM, as the model's performance is also dependent on various other factors - Striking a balance between specificity and verbosity can be challenging, as overly detailed prompts might confuse or mislead the model - -## [class]{.muted} MissingRequiredTestInputError - - - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 47fa43b7b..cae8e303c 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -76,17 +76,13 @@ def get_sort_key(member): else: return ('6', '0', name) else: - # Special handling for root-level aliases - if kind == 'alias': - if name == '__init__': - return ('0', '0', name) # Put __init__ aliases first - return ('0', '1', name.lower()) # Other aliases next - elif kind == 'class': - return ('1', name.lower()) + # Default sorting for non-error modules + if kind == 'class': + return ('0', name.lower()) elif kind == 'function': - return ('2', name.lower()) + return ('1', name.lower()) else: - return ('3', name.lower()) + return ('2', name.lower()) return sorted(members, key=get_sort_key) From c2d2f9c28e245996e00f6c43fe9fb9fcb30652fc Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 31 Jan 2025 07:33:06 -0800 Subject: [PATCH 042/207] Save point --- docs/validmind/test_suites.qmd | 110 +++++++++--------- docs/validmind/test_suites/classifier.qmd | 42 +++---- docs/validmind/test_suites/cluster.qmd | 24 ++-- docs/validmind/test_suites/llm.qmd | 36 +++--- docs/validmind/test_suites/nlp.qmd | 24 ++-- docs/validmind/test_suites/regression.qmd | 30 ++--- docs/validmind/test_suites/time_series.qmd | 46 ++++---- docs/validmind/tests.qmd | 34 +++--- .../ChiSquaredFeaturesTable.qmd | 30 ++--- .../tests/data_validation/ClassImbalance.qmd | 30 ++--- .../data_validation/DatasetDescription.qmd | 30 ++--- .../data_validation/DescriptiveStatistics.qmd | 30 ++--- .../tests/data_validation/DickeyFullerGLS.qmd | 30 ++--- .../data_validation/EngleGrangerCoint.qmd | 30 ++--- docs/validmind/tests/data_validation/KPSS.qmd | 30 ++--- .../data_validation/PhillipsPerronArch.qmd | 30 ++--- .../ProtectedClassesCombination.qmd | 30 ++--- .../ProtectedClassesDisparity.qmd | 30 ++--- .../ProtectedClassesThresholdOptimizer.qmd | 30 ++--- .../data_validation/RollingStatsPlot.qmd | 30 ++--- .../data_validation/SeasonalDecompose.qmd | 30 ++--- .../tests/data_validation/SpreadPlot.qmd | 30 ++--- .../TabularCategoricalBarPlots.qmd | 30 ++--- .../TabularDateTimeHistograms.qmd | 30 ++--- .../data_validation/TargetRateBarPlots.qmd | 30 ++--- .../data_validation/TimeSeriesFrequency.qmd | 30 ++--- .../data_validation/TimeSeriesLinePlot.qmd | 30 ++--- .../TimeSeriesMissingValues.qmd | 30 ++--- .../data_validation/TimeSeriesOutliers.qmd | 30 ++--- .../tests/data_validation/WOEBinPlots.qmd | 30 ++--- .../tests/data_validation/WOEBinTable.qmd | 30 ++--- .../data_validation/ZivotAndrewsArch.qmd | 30 ++--- .../tests/data_validation/nlp/Hashtags.qmd | 30 ++--- .../tests/data_validation/nlp/Mentions.qmd | 30 ++--- .../tests/model_validation/FeaturesAUC.qmd | 30 ++--- .../sklearn/ClusterCosineSimilarity.qmd | 30 ++--- .../sklearn/KMeansClustersOptimization.qmd | 30 ++--- .../sklearn/PermutationFeatureImportance.qmd | 30 ++--- .../sklearn/PopulationStabilityIndex.qmd | 30 ++--- .../sklearn/PrecisionRecallCurve.qmd | 30 ++--- .../model_validation/sklearn/ROCCurve.qmd | 30 ++--- .../sklearn/RobustnessDiagnosis.qmd | 30 ++--- .../sklearn/SHAPGlobalImportance.qmd | 30 ++--- .../statsmodels/KolmogorovSmirnov.qmd | 30 ++--- .../statsmodels/RegressionCoeffs.qmd | 30 ++--- .../RegressionFeatureSignificance.qmd | 30 ++--- .../tests/prompt_validation/Bias.qmd | 30 ++--- .../tests/prompt_validation/Clarity.qmd | 30 ++--- .../tests/prompt_validation/Conciseness.qmd | 30 ++--- .../tests/prompt_validation/Delimitation.qmd | 30 ++--- .../prompt_validation/NegativeInstruction.qmd | 30 ++--- .../tests/prompt_validation/Robustness.qmd | 60 +++++----- .../tests/prompt_validation/Specificity.qmd | 30 ++--- 53 files changed, 863 insertions(+), 863 deletions(-) diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 425c40897..58b065aba 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -59,6 +59,61 @@ Convert a test ID to a human-readable name. - A human-readable name derived from the test ID. +## describe_suite[()]{.muted} + + + +```python +def describe_suite( + test_suite_id: str, + verbose = False): +``` + +Describes a Test Suite by ID + +**Parameters** + +- **test_suite_id**: Test Suite ID +- **verbose**: If True, describe all plans and tests in the Test Suite + +**Returns** + +- A formatted table with the Test Suite description + +## get_by_id[()]{.muted} + + + +```python +def get_by_id( + test_suite_id: str): +``` + +Returns the test suite by ID + +## list_suites[()]{.muted} + + + +```python +def list_suites( + pretty: bool = True): +``` + +Returns a list of all available test suites + +## register_test_suite[()]{.muted} + + + +```python +def register_test_suite( + suite_id: str, + suite: TestSuite): +``` + +Registers a custom test suite + ## [class]{.muted} ClassifierDiagnosis @@ -420,58 +475,3 @@ This test suite provides a preliminary understanding of the target variable(s) u The raw time series data provides a visual inspection of the target variable's behavior over time. This helps to identify any patterns or trends in the data, as well as any potential outliers or anomalies. The histogram of the target variable displays the distribution of values, providing insight into the range and frequency of values observed in the data. **Inherited members** - -## describe_suite[()]{.muted} - - - -```python -def describe_suite( - test_suite_id: str, - verbose = False): -``` - -Describes a Test Suite by ID - -**Parameters** - -- **test_suite_id**: Test Suite ID -- **verbose**: If True, describe all plans and tests in the Test Suite - -**Returns** - -- A formatted table with the Test Suite description - -## get_by_id[()]{.muted} - - - -```python -def get_by_id( - test_suite_id: str): -``` - -Returns the test suite by ID - -## list_suites[()]{.muted} - - - -```python -def list_suites( - pretty: bool = True): -``` - -Returns a list of all available test suites - -## register_test_suite[()]{.muted} - - - -```python -def register_test_suite( - suite_id: str, - suite: TestSuite): -``` - -Registers a custom test suite diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index 17ad32b7c..a4987281e 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -5,86 +5,86 @@ sidebar: validmind-reference Test suites for sklearn-compatible classifier models Ideal setup is to have the API client to read a custom test suite from the project's configuration -## [class]{.muted} TabularDataQuality +## [class]{.muted} ClassifierDiagnosis ```python -class TabularDataQuality(TestSuite): +class ClassifierDiagnosis(TestSuite): ``` -Test suite for data quality on tabular datasets +Test suite for sklearn classifier model diagnosis tests **Inherited members** -## [class]{.muted} TabularDatasetDescription +## [class]{.muted} ClassifierFullSuite ```python -class TabularDatasetDescription(TestSuite): +class ClassifierFullSuite(TestSuite): ``` -Test suite to extract metadata and descriptive statistics from a tabular dataset +Full test suite for binary classification models. **Inherited members** -## [class]{.muted} ClassifierDiagnosis +## [class]{.muted} ClassifierMetrics ```python -class ClassifierDiagnosis(TestSuite): +class ClassifierMetrics(TestSuite): ``` -Test suite for sklearn classifier model diagnosis tests +Test suite for sklearn classifier metrics **Inherited members** -## [class]{.muted} ClassifierFullSuite +## [class]{.muted} ClassifierModelValidation ```python -class ClassifierFullSuite(TestSuite): +class ClassifierModelValidation(TestSuite): ``` -Full test suite for binary classification models. +Test suite for binary classification models. **Inherited members** -## [class]{.muted} ClassifierMetrics +## [class]{.muted} ClassifierPerformance ```python -class ClassifierMetrics(TestSuite): +class ClassifierPerformance(TestSuite): ``` -Test suite for sklearn classifier metrics +Test suite for sklearn classifier models **Inherited members** -## [class]{.muted} ClassifierModelValidation +## [class]{.muted} TabularDataQuality ```python -class ClassifierModelValidation(TestSuite): +class TabularDataQuality(TestSuite): ``` -Test suite for binary classification models. +Test suite for data quality on tabular datasets **Inherited members** -## [class]{.muted} ClassifierPerformance +## [class]{.muted} TabularDatasetDescription ```python -class ClassifierPerformance(TestSuite): +class TabularDatasetDescription(TestSuite): ``` -Test suite for sklearn classifier models +Test suite to extract metadata and descriptive statistics from a tabular dataset **Inherited members** diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index c63be2884..8056a3a61 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -5,18 +5,6 @@ sidebar: validmind-reference Test suites for sklearn-compatible clustering models Ideal setup is to have the API client to read a custom test suite from the project's configuration -## [class]{.muted} KmeansParametersOptimization - - - -```python -class KmeansParametersOptimization(TestSuite): -``` - -Test suite for sklearn hyperparameters optimization - -**Inherited members** - ## [class]{.muted} ClusterFullSuite @@ -52,3 +40,15 @@ class ClusterPerformance(TestSuite): Test suite for sklearn cluster performance **Inherited members** + +## [class]{.muted} KmeansParametersOptimization + + + +```python +class KmeansParametersOptimization(TestSuite): +``` + +Test suite for sklearn hyperparameters optimization + +**Inherited members** diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index 2b27fda83..5e41878ed 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -5,74 +5,74 @@ sidebar: validmind-reference Test suites for LLMs -## [class]{.muted} ClassifierDiagnosis +## [class]{.muted} LLMClassifierFullSuite ```python -class ClassifierDiagnosis(TestSuite): +class LLMClassifierFullSuite(TestSuite): ``` -Test suite for sklearn classifier model diagnosis tests +Full test suite for LLM classification models. **Inherited members** -## [class]{.muted} ClassifierMetrics +## [class]{.muted} PromptValidation ```python -class ClassifierMetrics(TestSuite): +class PromptValidation(TestSuite): ``` -Test suite for sklearn classifier metrics +Test suite for prompt validation **Inherited members** -## [class]{.muted} ClassifierPerformance +## [class]{.muted} ClassifierDiagnosis ```python -class ClassifierPerformance(TestSuite): +class ClassifierDiagnosis(TestSuite): ``` -Test suite for sklearn classifier models +Test suite for sklearn classifier model diagnosis tests **Inherited members** -## [class]{.muted} TextDataQuality +## [class]{.muted} ClassifierMetrics ```python -class TextDataQuality(TestSuite): +class ClassifierMetrics(TestSuite): ``` -Test suite for data quality on text data +Test suite for sklearn classifier metrics **Inherited members** -## [class]{.muted} LLMClassifierFullSuite +## [class]{.muted} ClassifierPerformance ```python -class LLMClassifierFullSuite(TestSuite): +class ClassifierPerformance(TestSuite): ``` -Full test suite for LLM classification models. +Test suite for sklearn classifier models **Inherited members** -## [class]{.muted} PromptValidation +## [class]{.muted} TextDataQuality ```python -class PromptValidation(TestSuite): +class TextDataQuality(TestSuite): ``` -Test suite for prompt validation +Test suite for data quality on text data **Inherited members** diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index d6b9c6c68..8cb5c3a11 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -5,6 +5,18 @@ sidebar: validmind-reference Test suites for NLP models +## [class]{.muted} NLPClassifierFullSuite + + + +```python +class NLPClassifierFullSuite(TestSuite): +``` + +Full test suite for NLP classification models. + +**Inherited members** + ## [class]{.muted} ClassifierDiagnosis @@ -52,15 +64,3 @@ class TextDataQuality(TestSuite): Test suite for data quality on text data **Inherited members** - -## [class]{.muted} NLPClassifierFullSuite - - - -```python -class NLPClassifierFullSuite(TestSuite): -``` - -Full test suite for NLP classification models. - -**Inherited members** diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index 57cd47925..8d642ec2a 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -3,62 +3,62 @@ title: "[validmind](/reference/validmind.html).regression" sidebar: validmind-reference --- -## [class]{.muted} TabularDataQuality +## [class]{.muted} RegressionFullSuite ```python -class TabularDataQuality(TestSuite): +class RegressionFullSuite(TestSuite): ``` -Test suite for data quality on tabular datasets +Full test suite for regression models. **Inherited members** -## [class]{.muted} TabularDatasetDescription +## [class]{.muted} RegressionMetrics ```python -class TabularDatasetDescription(TestSuite): +class RegressionMetrics(TestSuite): ``` -Test suite to extract metadata and descriptive statistics from a tabular dataset +Test suite for performance metrics of regression metrics **Inherited members** -## [class]{.muted} RegressionFullSuite +## [class]{.muted} RegressionPerformance ```python -class RegressionFullSuite(TestSuite): +class RegressionPerformance(TestSuite): ``` -Full test suite for regression models. +Test suite for regression model performance **Inherited members** -## [class]{.muted} RegressionMetrics +## [class]{.muted} TabularDataQuality ```python -class RegressionMetrics(TestSuite): +class TabularDataQuality(TestSuite): ``` -Test suite for performance metrics of regression metrics +Test suite for data quality on tabular datasets **Inherited members** -## [class]{.muted} RegressionPerformance +## [class]{.muted} TabularDatasetDescription ```python -class RegressionPerformance(TestSuite): +class TabularDatasetDescription(TestSuite): ``` -Test suite for regression model performance +Test suite to extract metadata and descriptive statistics from a tabular dataset **Inherited members** diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index 48f2c6777..1e9e2e883 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -5,88 +5,88 @@ sidebar: validmind-reference Time Series Test Suites -## [class]{.muted} RegressionModelDescription +## [class]{.muted} TimeSeriesDataQuality ```python -class RegressionModelDescription(TestSuite): +class TimeSeriesDataQuality(TestSuite): ``` -Test suite for performance metric of regression model of statsmodels library +Test suite for data quality on time series datasets **Inherited members** -## [class]{.muted} RegressionModelsEvaluation +## [class]{.muted} TimeSeriesDataset ```python -class RegressionModelsEvaluation(TestSuite): +class TimeSeriesDataset(TestSuite): ``` -Test suite for metrics comparison of regression model of statsmodels library +Test suite for time series datasets. **Inherited members** -## [class]{.muted} TimeSeriesDataQuality +## [class]{.muted} TimeSeriesModelValidation ```python -class TimeSeriesDataQuality(TestSuite): +class TimeSeriesModelValidation(TestSuite): ``` -Test suite for data quality on time series datasets +Test suite for time series model validation. **Inherited members** -## [class]{.muted} TimeSeriesDataset +## [class]{.muted} TimeSeriesMultivariate ```python -class TimeSeriesDataset(TestSuite): +class TimeSeriesMultivariate(TestSuite): ``` -Test suite for time series datasets. +This test suite provides a preliminary understanding of the features and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. **Inherited members** -## [class]{.muted} TimeSeriesModelValidation +## [class]{.muted} TimeSeriesUnivariate ```python -class TimeSeriesModelValidation(TestSuite): +class TimeSeriesUnivariate(TestSuite): ``` -Test suite for time series model validation. +This test suite provides a preliminary understanding of the target variable(s) used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). + +The raw time series data provides a visual inspection of the target variable's behavior over time. This helps to identify any patterns or trends in the data, as well as any potential outliers or anomalies. The histogram of the target variable displays the distribution of values, providing insight into the range and frequency of values observed in the data. **Inherited members** -## [class]{.muted} TimeSeriesMultivariate +## [class]{.muted} RegressionModelDescription ```python -class TimeSeriesMultivariate(TestSuite): +class RegressionModelDescription(TestSuite): ``` -This test suite provides a preliminary understanding of the features and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. +Test suite for performance metric of regression model of statsmodels library **Inherited members** -## [class]{.muted} TimeSeriesUnivariate +## [class]{.muted} RegressionModelsEvaluation ```python -class TimeSeriesUnivariate(TestSuite): +class RegressionModelsEvaluation(TestSuite): ``` -This test suite provides a preliminary understanding of the target variable(s) used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). - -The raw time series data provides a visual inspection of the target variable's behavior over time. This helps to identify any patterns or trends in the data, as well as any potential outliers or anomalies. The histogram of the target variable displays the distribution of values, providing insight into the range and frequency of values observed in the data. +Test suite for metrics comparison of regression model of statsmodels library **Inherited members** diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index d391949e7..6491aef05 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -203,6 +203,23 @@ The function may also include a docstring. This docstring will be used and logge - The decorated function. +## register_test_provider[()]{.muted} + + + +```python +def register_test_provider( + namespace: str, + test_provider: TestProvider) -> None: +``` + +Register an external test provider + +**Parameters** + +- **namespace** str: The namespace of the test provider +- **test_provider** TestProvider: The test provider + ## [class]{.muted} LoadTestError @@ -328,20 +345,3 @@ Load the test function identified by the given test_id **Raises** - **FileNotFoundError**: If the test is not found - -## register_test_provider[()]{.muted} - - - -```python -def register_test_provider( - namespace: str, - test_provider: TestProvider) -> None: -``` - -Register an external test provider - -**Parameters** - -- **namespace** str: The namespace of the test provider -- **test_provider** TestProvider: The test provider diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 6b1543656..b33e5e1e2 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).ChiSquaredFeaturesTable" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## ChiSquaredFeaturesTable[()]{.muted} @@ -55,3 +40,18 @@ The function creates a contingency table for each categorical feature and the ta - The test is designed for classification tasks and is not applicable to regression problems. - As with all hypothesis tests, the Chi-Squared test can only detect associations, not causal relationships. - The choice of p-value threshold can affect the interpretation of feature relevance, and different thresholds may lead to different conclusions. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 1b6faab7a..538465998 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -5,21 +5,6 @@ sidebar: validmind-reference Threshold based tests -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## ClassImbalance[()]{.muted} @@ -61,3 +46,18 @@ This Class Imbalance test operates by calculating the frequency (expressed as a - Regardless of the percentage threshold, it doesn't account for varying costs or impacts of misclassifying different classes, which might fluctuate based on specific applications or domains. - While it can identify imbalances in class distribution, it doesn't provide direct methods to address or correct these imbalances. - The test is only applicable for classification operations and unsuitable for regression or clustering tasks. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 196ec608e..0527016dc 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -14,21 +14,6 @@ def get_logger( Get a logger for the given module name -## [class]{.muted} UnsupportedColumnTypeError - - - -```python -class UnsupportedColumnTypeError(BaseError): -``` - -When an unsupported column type is found on a dataset. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## DatasetDescription[()]{.muted} @@ -117,3 +102,18 @@ Returns a collection of histograms for a numerical column, each one with a diffe def infer_datatypes( df): ``` + +## [class]{.muted} UnsupportedColumnTypeError + + + +```python +class UnsupportedColumnTypeError(BaseError): +``` + +When an unsupported column type is found on a dataset. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index a4de52ac7..733956d55 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -20,21 +20,6 @@ We do this for display purposes before sending data to ValidMind. Rules: - If the column's smallest number has more decimals 6, use that number's precision so we can avoid rendering a 0 instead - If the column's smallest number has less decimals than 6, use 6 decimal places -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## DescriptiveStatistics[()]{.muted} @@ -91,3 +76,18 @@ def get_summary_statistics_numerical( df, numerical_fields): ``` + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 5cb779222..d2f8b7425 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -14,21 +14,6 @@ def get_logger( Get a logger for the given module name -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## DickeyFullerGLS[()]{.muted} @@ -63,3 +48,18 @@ This code implements the Dickey-Fuller GLS unit root test on each attribute of t - Despite its benefits, the DFGLS test does present some drawbacks. It can potentially lead to inaccurate conclusions if the time series data incorporates a structural break. - If the time series tends to follow a trend while still being stationary, the test might misinterpret it, necessitating further detrending. - The test also presents challenges when dealing with shorter time series data or volatile data, not producing reliable results in these cases. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 2fece895d..5592d4938 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).EngleGrangerCoint" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## EngleGrangerCoint[()]{.muted} @@ -53,3 +38,18 @@ The test first drops any non-applicable values from the input dataset and then i - Assumes that the time series are integrated of the same order, which isn't always true in multivariate time series datasets. - The presence of non-stationary characteristics in the series or structural breaks can result in falsely positive or negative cointegration results. - May not perform well for small sample sizes due to lack of statistical power and should be supplemented with other predictive indicators for a more robust model evaluation. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 699a0a5cb..afd267862 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -14,21 +14,6 @@ def get_logger( Get a logger for the given module name -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## KPSS[()]{.muted} @@ -63,3 +48,18 @@ This test calculates the KPSS score for each feature in the dataset. The KPSS sc - Assumes the absence of a unit root in the series and doesn't differentiate between series that are stationary and those border-lining stationarity. - The test may have restricted power against certain alternatives. - The reliability of the test is contingent on the number of lags selected, which introduces potential bias in the measurement. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 1fe0cb0de..956027eed 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -14,21 +14,6 @@ def get_logger( Get a logger for the given module name -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## PhillipsPerronArch[()]{.muted} @@ -69,3 +54,18 @@ The PP test is conducted for each feature in the dataset as follows: - Applicable only within a univariate time series framework. - Relies on asymptotic theory, which may reduce the test’s power for small sample sizes. - Non-stationary time series must be converted to stationary series through differencing, potentially leading to loss of important data points. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 7c16ba2b4..542df6970 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -14,21 +14,6 @@ def get_logger( Get a logger for the given module name -## [class]{.muted} MissingDependencyError - - - -```python -class MissingDependencyError(BaseError): -``` - -When a required dependency is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## ProtectedClassesCombination[()]{.muted} @@ -71,3 +56,18 @@ The test performs the following steps: - May become complex and difficult to interpret with a large number of protected classes or combinations. - Does not provide statistical significance of observed differences. - Visualization alone may not capture all nuances of intersectional fairness. + +## [class]{.muted} MissingDependencyError + + + +```python +class MissingDependencyError(BaseError): +``` + +When a required dependency is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 3b1c3e725..4fac8bbf2 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -14,21 +14,6 @@ def get_logger( Get a logger for the given module name -## [class]{.muted} MissingDependencyError - - - -```python -class MissingDependencyError(BaseError): -``` - -When a required dependency is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## ProtectedClassesDisparity[()]{.muted} @@ -75,3 +60,18 @@ The test performs the following steps: - Relies on a predefined reference group for each protected class, which may not always be the most appropriate choice. - Does not account for intersectionality between different protected attributes. - The interpretation of results may require domain expertise to understand the implications of observed disparities. + +## [class]{.muted} MissingDependencyError + + + +```python +class MissingDependencyError(BaseError): +``` + +When a required dependency is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 1b5acee88..f614d7c1a 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -14,21 +14,6 @@ def get_logger( Get a logger for the given module name -## [class]{.muted} MissingDependencyError - - - -```python -class MissingDependencyError(BaseError): -``` - -When a required dependency is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## calculate_fairness_metrics[()]{.muted} @@ -139,3 +124,18 @@ The test uses Fairlearn's ThresholdOptimizer to: - May lead to a decrease in overall model performance while improving fairness. - Requires access to protected attribute information at prediction time. - The effectiveness can vary depending on the chosen fairness constraint and objective. + +## [class]{.muted} MissingDependencyError + + + +```python +class MissingDependencyError(BaseError): +``` + +When a required dependency is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 7ddc09279..33c6cd8a3 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).RollingStatsPlot" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## plot_rolling_statistics[()]{.muted} @@ -67,3 +52,18 @@ This mechanism is comprised of two steps. Initially, the rolling mean and standa - For all columns, a fixed-size window is utilized. This may not accurately capture patterns in datasets where different features may require different optimal window sizes. - Requires the dataset to be indexed by date and time, hence it may not be usable for datasets without a timestamp index. - Primarily serves for data visualization as it does not facilitate any quantitative measures for stationarity, such as through statistical tests. Therefore, the interpretation is subjective and depends heavily on modeler discretion. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index df4e35795..1df51245b 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -14,21 +14,6 @@ def get_logger( Get a logger for the given module name -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## SeasonalDecompose[()]{.muted} @@ -66,3 +51,18 @@ The testing process leverages the `seasonal_decompose` function from the `statsm - **Dependence on Assumptions**: Assumes that dataset features are periodically distributed. Features with no inferable frequency are excluded from the test. - **Handling Non-Finite Values**: Disregards non-finite values during analysis, potentially resulting in an incomplete understanding of the dataset. - **Unreliability with Noisy Datasets**: Produces unreliable results when used with datasets that contain heavy noise. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 154109698..0f4d07d7d 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).SpreadPlot" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## SpreadPlot[()]{.muted} @@ -56,3 +41,18 @@ The SpreadPlot test computes and represents the spread between each pair of time - Heavily relies on the quality and granularity of the data—missing data or outliers can notably disturb the interpretation of relationships. - Can become inefficient or difficult to interpret with a high number of variables due to the profuse number of plots. - Might not completely capture intricate non-linear relationships between the variables. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index f224a4ffc..8d688dcaf 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).TabularCategoricalBarPlots" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## TabularCategoricalBarPlots[()]{.muted} @@ -53,3 +38,18 @@ The provided dataset is first checked to determine if it contains any categorica - This method only works with categorical data and won't apply to numerical variables. - It does not provide informative value when there are too many categories, as the bar chart could become cluttered and hard to interpret. - Offers no insights into the model's performance or precision, but rather provides a descriptive analysis of the input. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 7d8929a2b..4989940e8 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).TabularDateTimeHistograms" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## TabularDateTimeHistograms[()]{.muted} @@ -54,3 +39,18 @@ This test operates by first identifying all datetime columns and extracting them - The metric might overlook complex or multi-dimensional trends in the data. - The test is only applicable to datasets containing datetime columns and will fail if such columns are unavailable. - The interpretation of the histograms relies heavily on the domain expertise and experience of the reviewer. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index e1a71b85d..25e028f10 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).TargetRateBarPlots" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## TargetRateBarPlots[()]{.muted} @@ -50,3 +35,18 @@ The test involves creating a pair of bar plots for each categorical feature in t ### Limitations - The readability of the bar plots drops as the number of distinct categories increases in the dataset, which can make them harder to understand and less useful. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 592f1a2f2..bd26eed62 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).TimeSeriesFrequency" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## TimeSeriesFrequency[()]{.muted} @@ -53,3 +38,18 @@ Initially, the test checks if the dataframe index is in datetime format. Subsequ - This test is only applicable to time-series datasets and hence not suitable for other types of datasets. - The `infer_freq` method might not always correctly infer frequency when faced with missing or irregular data points. - Depending on context or the model under development, mixed frequencies might sometimes be acceptable, but this test considers them a failing condition. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 8de1f5ed7..2bbb87083 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).TimeSeriesLinePlot" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## TimeSeriesLinePlot[()]{.muted} @@ -55,3 +40,18 @@ The mechanism for this Python class involves extracting the column names from th - Exclusively a visual tool, it lacks the capability to provide quantitative measurements, making it less effective for comparing and ranking multiple models or when specific numerical diagnostics are needed. - The metric necessitates that the time-specific data has been transformed into a datetime index, with the data formatted correctly. - The metric has an inherent limitation in that it cannot extract deeper statistical insights from the time series data, which can limit its efficacy with complex data structures and phenomena. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 41a554f3a..be9f2bfe7 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).TimeSeriesMissingValues" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## TimeSeriesMissingValues[()]{.muted} @@ -54,3 +39,18 @@ The test method commences by validating if the dataset has a datetime index; if - The test demands that the dataset should have a datetime index, hence limiting its use only to time series analysis. - The test's sensitivity to the 'min_threshold' parameter may raise false alarms if set too strictly or may overlook problematic data if set too loosely. - Solely focuses on the 'missingness' of the data and might fall short in addressing other aspects of data quality. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 3915aa5db..e92db292b 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).TimeSeriesOutliers" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## TimeSeriesOutliers[()]{.muted} @@ -59,3 +44,18 @@ The test processes a given dataset which must have datetime indexing, checks if - The method relies on a subjective z-score threshold for deciding what constitutes an outlier, which might not always be suitable depending on the dataset and use case. - It does not address possible ways to handle identified outliers in the data. - The requirement for a datetime index could limit its application. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index fe3d5a7f3..e858b526f 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -14,21 +14,6 @@ def get_logger( Get a logger for the given module name -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## WOEBinPlots[()]{.muted} @@ -69,3 +54,18 @@ The test implementation follows defined steps. Initially, it selects non-numeric - While excellent for categorical data, the encoding of continuous variables into categorical can sometimes lead to information loss. - Extreme or outlier values can dramatically affect the computation of WoE and IV, skewing results. - The method requires a sufficient number of events per bin to generate a reliable information value and weight of evidence. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index c77875a07..6275b676f 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).WOEBinTable" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## WOEBinTable[()]{.muted} @@ -53,3 +38,18 @@ The test uses the `scorecardpy.woebin` method to perform automatic binning of th - Primarily designed for binary classification tasks, making it less applicable or reliable for multi-class classification or regression tasks. - Potential difficulties if the dataset has many features, non-binnable features, or non-numeric features. - The metric does not help in distinguishing whether the observed predictive factor is due to data randomness or a true phenomenon. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 86646d47c..786653e07 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -14,21 +14,6 @@ def get_logger( Get a logger for the given module name -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## ZivotAndrewsArch[()]{.muted} @@ -62,3 +47,18 @@ The Zivot-Andrews unit root test is performed on each feature in the dataset usi - Assumes data is derived from a single-equation, autoregressive model, making it less appropriate for multivariate time series data or data not aligning with this model. - May not account for unexpected shocks or changes in the series trend, both of which can significantly impact data stationarity. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 1248f0329..e33dce71a 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).Hashtags" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## Hashtags[()]{.muted} @@ -56,3 +41,18 @@ The test implements a regular expression (regex) to extract all hashtags from th - Language-specific limitations of hashtag formulations are not taken into account. - Does not account for typographical errors, variations, or synonyms in hashtags. - Does not provide context or sentiment associated with the hashtags, so the information provided may have limited utility on its own. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 8599c8631..6885490ab 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).Mentions" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## Mentions[()]{.muted} @@ -54,3 +39,18 @@ The test first verifies the existence of a text column in the provided dataset. - The test only recognizes mentions that are prefixed by '@', hence useful textual aspects not preceded by '@' might be ignored. - This test isn't suited for datasets devoid of textual data. - It does not provide insights on less frequently occurring data or outliers, which means potentially significant patterns could be overlooked. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 8956c655f..c6b75e5c2 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -14,21 +14,6 @@ def get_logger( Get a logger for the given module name -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## FeaturesAUC[()]{.muted} @@ -65,3 +50,18 @@ For each feature, the metric treats the feature values as raw scores to compute - Does not reflect the combined effects of features or any interaction between them, which can be critical in certain models. - The AUC values are calculated without considering the model's use of the features, which could lead to different interpretations of feature importance when considering the model holistically. - This metric is applicable only to binary classification tasks and cannot be directly extended to multiclass classification or regression without modifications. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index c0303644e..53abe586f 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).ClusterCosineSimilarity" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## ClusterCosineSimilarity[()]{.muted} @@ -55,3 +40,18 @@ This test works by first extracting the true and predicted clusters of the model - This method summarily assumes that centroids represent the average behavior of data points in each cluster. This might not always be true, especially in clusters with high amounts of variance or non-spherical shapes. - It primarily works with continuous variables and is not suitable for binary or categorical variables. - Lastly, although rare, perfect perpendicular vectors (cosine similarity = 0) could be within the same cluster, which may give an inaccurate representation of a 'bad' cluster due to low cosine similarity score. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 4111863ff..ce2a8b936 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).KMeansClustersOptimization" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## KMeansClustersOptimization[()]{.muted} @@ -57,3 +42,18 @@ The test mechanism involves iterating over a predefined range of cluster numbers - Both methods may fail to provide definitive answers when the data lacks clear cluster structures. - Might not be straightforward to determine the 'elbow' point or maximize the silhouette average score, especially in larger and complicated datasets. - Assumes spherical clusters (due to using the Euclidean distance in the Elbow method), which might not align with the actual structure of the data. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 015b0ed60..2528dc2e3 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -14,21 +14,6 @@ def get_logger( Get a logger for the given module name -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## PermutationFeatureImportance[()]{.muted} @@ -67,3 +52,18 @@ PFI is calculated via the `permutation_importance` method from the `sklearn.insp - Does not imply causality; it only presents the amount of information that a feature provides for the prediction task. - Does not account for interactions between features. If features are correlated, the permutation importance may allocate importance to one and not the other. - Cannot interact with certain libraries like statsmodels, pytorch, catboost, etc., thus limiting its applicability. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 38c61ed3f..217878de0 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -14,21 +14,6 @@ def get_logger( Get a logger for the given module name -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## calculate_psi[()]{.muted} @@ -83,3 +68,18 @@ The implementation of the PSI in this script involves calculating the PSI for ea - The PSI test does not inherently provide insights into why there are differences in distributions or why the PSI values may have changed. - The test may not handle features with significant outliers adequately. - Additionally, the PSI test is performed on model predictions, not on the underlying data distributions which can lead to misinterpretations. Any changes in PSI could be due to shifts in the model (model drift), changes in the relationships between features and the target variable (concept drift), or both. However, distinguishing between these causes is non-trivial. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 6b02862e6..199ef08ce 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).PrecisionRecallCurve" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## PrecisionRecallCurve[()]{.muted} @@ -53,3 +38,18 @@ The test extracts ground truth labels and prediction probabilities from the mode - This metric is only applicable to binary classification models - it raises errors for multiclass classification models or Foundation models. - It may not fully represent the overall accuracy of the model if the cost of false positives and false negatives are extremely different, or if the dataset is heavily imbalanced. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 8c141708e..c2162c63e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).ROCCurve" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## ROCCurve[()]{.muted} @@ -54,3 +39,18 @@ First, this script selects the target model and datasets that require binary cla - The primary limitation is that this test is exclusively structured for binary classification tasks, thus limiting its application towards other model types. - Furthermore, its performance might be subpar with models that output probabilities highly skewed towards 0 or 1. - At the extreme, the ROC curve could reflect high performance even when the majority of classifications are incorrect, provided that the model's ranking format is retained. This phenomenon is commonly termed the "Class Imbalance Problem". + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index a4ac75f88..451f82c8d 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -14,21 +14,6 @@ def get_logger( Get a logger for the given module name -## [class]{.muted} MissingOrInvalidModelPredictFnError - - - -```python -class MissingOrInvalidModelPredictFnError(BaseError): -``` - -When the pytorch model is missing a predict function or its predict method does not have the expected arguments. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## RobustnessDiagnosis[()]{.muted} @@ -73,3 +58,18 @@ This test introduces Gaussian noise to the numeric input features of the dataset - Gaussian noise might not adequately represent all types of real-world data perturbations. - Performance thresholds are somewhat arbitrary and might need tuning. - The test may not account for more complex or unstructured noise patterns that could affect model robustness. + +## [class]{.muted} MissingOrInvalidModelPredictFnError + + + +```python +class MissingOrInvalidModelPredictFnError(BaseError): +``` + +When the pytorch model is missing a predict function or its predict method does not have the expected arguments. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 225b2c3f2..8bc466339 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -14,21 +14,6 @@ def get_logger( Get a logger for the given module name -## [class]{.muted} UnsupportedModelForSHAPError - - - -```python -class UnsupportedModelForSHAPError(BaseError): -``` - -When an unsupported model is used for SHAP importance. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## generate_shap_plot[()]{.muted} @@ -119,3 +104,18 @@ The exam begins with the selection of a suitable explainer which aligns with the - High-dimensional data can convolute interpretations. - Associating importance with tangible real-world impact still involves a certain degree of subjectivity. + +## [class]{.muted} UnsupportedModelForSHAPError + + + +```python +class UnsupportedModelForSHAPError(BaseError): +``` + +When an unsupported model is used for SHAP importance. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 8d490104c..f58ec3b32 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).KolmogorovSmirnov" sidebar: validmind-reference --- -## [class]{.muted} InvalidTestParametersError - - - -```python -class InvalidTestParametersError(BaseError): -``` - -When an invalid parameters for the test. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## KolmogorovSmirnov[()]{.muted} @@ -55,3 +40,18 @@ This test calculates the KS statistic and corresponding p-value for each feature - The test's sensitivity to disparities in the tails of data distribution might cause false alarms about non-normality. - Less effective for multivariate distributions, as it is designed for univariate distributions. - Does not identify specific types of non-normality, such as skewness or kurtosis, which could impact model fitting. + +## [class]{.muted} InvalidTestParametersError + + + +```python +class InvalidTestParametersError(BaseError): +``` + +When an invalid parameters for the test. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 58cb4fe96..56123b99b 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -3,21 +3,6 @@ title: "[validmind](/reference/validmind.html).RegressionCoeffs" sidebar: validmind-reference --- -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## RegressionCoeffs[()]{.muted} @@ -53,3 +38,18 @@ The function operates by extracting the estimated coefficients and their standar - The method assumes normality of residuals and independence of observations, assumptions that may not always hold true in practice. - It does not address issues related to multi-collinearity among predictor variables, which can affect the interpretation of coefficients. - This metric is limited to regression tasks using tabular data and is not applicable to other types of machine learning tasks or data structures. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 655254a00..d9aeb2ab1 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -14,21 +14,6 @@ def get_logger( Get a logger for the given module name -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## RegressionFeatureSignificance[()]{.muted} @@ -66,3 +51,18 @@ The test mechanism involves extracting the model's coefficients and p-values for - The p-value strategy for feature selection doesn't take into account the magnitude of the effect, focusing solely on whether the feature is likely non-zero. - This test is specific to regression models and wouldn't be suitable for other types of ML models. - P-value thresholds are somewhat arbitrary and do not always indicate practical significance, only statistical significance. + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 346d97797..67e2afc01 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -48,21 +48,6 @@ e.g. "Score: 8 Explanation: " -> 8 -## [class]{.muted} MissingRequiredTestInputError - - - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## Bias[()]{.muted} @@ -104,3 +89,18 @@ For each test case, the LLM grades the input prompt on a scale of 1 to 10. It ev - The test may not pick up on more subtle forms of bias or biases that are not directly related to the distribution or order of exemplars. - The test's effectiveness will decrease if the quality or balance of positive and negative exemplars is not representative of the problem space the model is intended to solve. - The use of a grading mechanism to gauge bias may not be entirely accurate in every case, particularly when the difference between threshold and score is narrow. + +## [class]{.muted} MissingRequiredTestInputError + + + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 602c4520d..d7e12678a 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -48,21 +48,6 @@ e.g. "Score: 8 Explanation: " -> 8 -## [class]{.muted} MissingRequiredTestInputError - - - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## Clarity[()]{.muted} @@ -99,3 +84,18 @@ The evaluation uses an LLM to scrutinize the clarity of prompts, factoring in co - Scoring system is subjective and relies on the AI’s interpretation of 'clarity' - The test assumes that all required factors (detail inclusion, persona adoption, step-by-step instructions, use of examples, and specification of output length) contribute equally to clarity, which might not always be the case - The evaluation may not be as effective if used on non-textual models + +## [class]{.muted} MissingRequiredTestInputError + + + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 2f09bdd0b..7fe0e7ed3 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -48,21 +48,6 @@ e.g. "Score: 8 Explanation: " -> 8 -## [class]{.muted} MissingRequiredTestInputError - - - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## Conciseness[()]{.muted} @@ -101,3 +86,18 @@ Using an LLM, this test conducts a conciseness analysis on input prompts. The an - The conciseness score is based on an AI's assessment, which might not fully capture human interpretation of conciseness. - The predefined threshold for conciseness could be subjective and might need adjustment based on application. - The test is dependent on the LLM’s understanding of conciseness, which might vary from model to model. + +## [class]{.muted} MissingRequiredTestInputError + + + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 7a7ef558d..2693ebf1d 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -48,21 +48,6 @@ e.g. "Score: 8 Explanation: " -> 8 -## [class]{.muted} MissingRequiredTestInputError - - - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## Delimitation[()]{.muted} @@ -100,3 +85,18 @@ The test employs an LLM to examine prompts for appropriate use of delimiters suc - Only checks for the presence and placement of delimiters, not whether the correct delimiter type is used for the specific data or task. - May not fully reveal the impacts of poor delimitation on the LLM's final performance. - The preset score threshold may not be refined enough for complex tasks and prompts, requiring regular manual adjustment. + +## [class]{.muted} MissingRequiredTestInputError + + + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index b2af317ca..1fbc64465 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -48,21 +48,6 @@ e.g. "Score: 8 Explanation: " -> 8 -## [class]{.muted} MissingRequiredTestInputError - - - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## NegativeInstruction[()]{.muted} @@ -100,3 +85,18 @@ An LLM is employed to evaluate each prompt. The prompt is graded based on its us - The test necessitates an LLM for evaluation, which might not be available or feasible in certain scenarios. - A numeric scoring system, while straightforward, may oversimplify complex issues related to prompt designing and instruction clarity. - The effectiveness of the test hinges significantly on the predetermined threshold level, which can be subjective and may need to be adjusted according to specific use-cases. + +## [class]{.muted} MissingRequiredTestInputError + + + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 5f426a850..0f8998d08 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -14,36 +14,6 @@ def call_model( Call LLM with the given prompts and return the response -## [class]{.muted} MissingRequiredTestInputError - - - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - -## [class]{.muted} SkipTestError - - - -```python -class SkipTestError(BaseError): -``` - -Useful error to throw when a test cannot be executed. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## Robustness[()]{.muted} @@ -81,3 +51,33 @@ The Robustness test appraises prompts under various conditions, alterations, and - Currently, the test only supports single-variable prompts, which restricts its application to more complex models. - When there are too many target classes (over 10), the test is skipped, which can leave potential vulnerabilities unchecked in complex multi-class models. - The test may not account for all potential conditions or alterations that could show up in practical use scenarios. + +## [class]{.muted} MissingRequiredTestInputError + + + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note + +## [class]{.muted} SkipTestError + + + +```python +class SkipTestError(BaseError): +``` + +Useful error to throw when a test cannot be executed. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 672b25339..e11926197 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -48,21 +48,6 @@ e.g. "Score: 8 Explanation: " -> 8 -## [class]{.muted} MissingRequiredTestInputError - - - -```python -class MissingRequiredTestInputError(BaseError): -``` - -When a required test context variable is missing. - -**Inherited members** - -- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) -- **From builtins.BaseException**: with_traceback, add_note - ## Specificity[()]{.muted} @@ -100,3 +85,18 @@ The Specificity Test employs an LLM to grade each prompt based on clarity, detai - This test doesn't consider the content comprehension capability of the LLM - High specificity score doesn't guarantee a high-quality response from the LLM, as the model's performance is also dependent on various other factors - Striking a balance between specificity and verbosity can be challenging, as overly detailed prompts might confuse or mislead the model + +## [class]{.muted} MissingRequiredTestInputError + + + +```python +class MissingRequiredTestInputError(BaseError): +``` + +When a required test context variable is missing. + +**Inherited members** + +- **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) +- **From builtins.BaseException**: with_traceback, add_note From 0d788e5590029c8fb15ee42772103436fd2c805e Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 31 Jan 2025 08:09:42 -0800 Subject: [PATCH 043/207] Save point --- docs/templates/module.qmd.jinja2 | 11 +++++------ docs/validmind.qmd | 11 +++++------ docs/validmind/datasets.qmd | 2 ++ docs/validmind/datasets/classification.qmd | 2 ++ .../datasets/classification/customer_churn.qmd | 2 ++ .../datasets/classification/taiwan_credit.qmd | 2 ++ docs/validmind/datasets/credit_risk.qmd | 2 ++ docs/validmind/datasets/credit_risk/lending_club.qmd | 2 ++ .../datasets/credit_risk/lending_club_bias.qmd | 2 ++ docs/validmind/datasets/nlp.qmd | 2 ++ docs/validmind/datasets/nlp/cnn_dailymail.qmd | 2 ++ docs/validmind/datasets/nlp/twitter_covid_19.qmd | 2 ++ docs/validmind/datasets/regression.qmd | 2 ++ docs/validmind/datasets/regression/fred.qmd | 2 ++ docs/validmind/datasets/regression/lending_club.qmd | 2 ++ docs/validmind/errors.qmd | 2 ++ docs/validmind/test_suites.qmd | 2 ++ docs/validmind/test_suites/classifier.qmd | 2 ++ docs/validmind/test_suites/cluster.qmd | 2 ++ docs/validmind/test_suites/embeddings.qmd | 2 ++ docs/validmind/test_suites/llm.qmd | 2 ++ docs/validmind/test_suites/nlp.qmd | 2 ++ .../validmind/test_suites/parameters_optimization.qmd | 2 ++ docs/validmind/test_suites/regression.qmd | 2 ++ docs/validmind/test_suites/statsmodels_timeseries.qmd | 2 ++ docs/validmind/test_suites/summarization.qmd | 2 ++ docs/validmind/test_suites/tabular_datasets.qmd | 2 ++ docs/validmind/test_suites/text_data.qmd | 2 ++ docs/validmind/test_suites/time_series.qmd | 2 ++ docs/validmind/tests.qmd | 2 ++ docs/validmind/tests/data_validation.qmd | 2 ++ .../tests/data_validation/ACFandPACFPlot.qmd | 2 ++ docs/validmind/tests/data_validation/ADF.qmd | 2 ++ docs/validmind/tests/data_validation/AutoAR.qmd | 2 ++ docs/validmind/tests/data_validation/AutoMA.qmd | 2 ++ .../tests/data_validation/AutoStationarity.qmd | 2 ++ .../tests/data_validation/BivariateScatterPlots.qmd | 2 ++ docs/validmind/tests/data_validation/BoxPierce.qmd | 2 ++ .../tests/data_validation/ChiSquaredFeaturesTable.qmd | 2 ++ .../tests/data_validation/ClassImbalance.qmd | 2 ++ .../tests/data_validation/DatasetDescription.qmd | 2 ++ docs/validmind/tests/data_validation/DatasetSplit.qmd | 2 ++ .../tests/data_validation/DescriptiveStatistics.qmd | 2 ++ .../tests/data_validation/DickeyFullerGLS.qmd | 2 ++ docs/validmind/tests/data_validation/Duplicates.qmd | 2 ++ .../tests/data_validation/EngleGrangerCoint.qmd | 2 ++ .../data_validation/FeatureTargetCorrelationPlot.qmd | 2 ++ .../tests/data_validation/HighCardinality.qmd | 2 ++ .../tests/data_validation/HighPearsonCorrelation.qmd | 2 ++ .../tests/data_validation/IQROutliersBarPlot.qmd | 2 ++ .../tests/data_validation/IQROutliersTable.qmd | 2 ++ .../tests/data_validation/IsolationForestOutliers.qmd | 2 ++ docs/validmind/tests/data_validation/JarqueBera.qmd | 2 ++ docs/validmind/tests/data_validation/KPSS.qmd | 2 ++ docs/validmind/tests/data_validation/LJungBox.qmd | 2 ++ .../data_validation/LaggedCorrelationHeatmap.qmd | 2 ++ .../validmind/tests/data_validation/MissingValues.qmd | 2 ++ .../tests/data_validation/MissingValuesBarPlot.qmd | 2 ++ .../tests/data_validation/MutualInformation.qmd | 2 ++ .../data_validation/PearsonCorrelationMatrix.qmd | 2 ++ .../tests/data_validation/PhillipsPerronArch.qmd | 2 ++ .../data_validation/ProtectedClassesCombination.qmd | 2 ++ .../data_validation/ProtectedClassesDescription.qmd | 2 ++ .../data_validation/ProtectedClassesDisparity.qmd | 2 ++ .../ProtectedClassesThresholdOptimizer.qmd | 2 ++ .../tests/data_validation/RollingStatsPlot.qmd | 2 ++ docs/validmind/tests/data_validation/RunsTest.qmd | 2 ++ docs/validmind/tests/data_validation/ScatterPlot.qmd | 2 ++ .../tests/data_validation/ScoreBandDefaultRates.qmd | 2 ++ .../tests/data_validation/SeasonalDecompose.qmd | 2 ++ docs/validmind/tests/data_validation/ShapiroWilk.qmd | 2 ++ docs/validmind/tests/data_validation/Skewness.qmd | 2 ++ docs/validmind/tests/data_validation/SpreadPlot.qmd | 2 ++ .../data_validation/TabularCategoricalBarPlots.qmd | 2 ++ .../data_validation/TabularDateTimeHistograms.qmd | 2 ++ .../data_validation/TabularDescriptionTables.qmd | 2 ++ .../data_validation/TabularNumericalHistograms.qmd | 2 ++ .../tests/data_validation/TargetRateBarPlots.qmd | 2 ++ .../tests/data_validation/TimeSeriesDescription.qmd | 2 ++ .../TimeSeriesDescriptiveStatistics.qmd | 2 ++ .../tests/data_validation/TimeSeriesFrequency.qmd | 2 ++ .../tests/data_validation/TimeSeriesHistogram.qmd | 2 ++ .../tests/data_validation/TimeSeriesLinePlot.qmd | 2 ++ .../tests/data_validation/TimeSeriesMissingValues.qmd | 2 ++ .../tests/data_validation/TimeSeriesOutliers.qmd | 2 ++ .../tests/data_validation/TooManyZeroValues.qmd | 2 ++ docs/validmind/tests/data_validation/UniqueRows.qmd | 2 ++ docs/validmind/tests/data_validation/WOEBinPlots.qmd | 2 ++ docs/validmind/tests/data_validation/WOEBinTable.qmd | 2 ++ .../tests/data_validation/ZivotAndrewsArch.qmd | 2 ++ docs/validmind/tests/data_validation/nlp.qmd | 2 ++ .../tests/data_validation/nlp/CommonWords.qmd | 2 ++ docs/validmind/tests/data_validation/nlp/Hashtags.qmd | 2 ++ .../tests/data_validation/nlp/LanguageDetection.qmd | 2 ++ docs/validmind/tests/data_validation/nlp/Mentions.qmd | 2 ++ .../data_validation/nlp/PolarityAndSubjectivity.qmd | 2 ++ .../tests/data_validation/nlp/Punctuations.qmd | 2 ++ .../validmind/tests/data_validation/nlp/Sentiment.qmd | 2 ++ .../validmind/tests/data_validation/nlp/StopWords.qmd | 2 ++ .../tests/data_validation/nlp/TextDescription.qmd | 2 ++ docs/validmind/tests/data_validation/nlp/Toxicity.qmd | 2 ++ docs/validmind/tests/model_validation.qmd | 2 ++ docs/validmind/tests/model_validation/BertScore.qmd | 2 ++ docs/validmind/tests/model_validation/BleuScore.qmd | 2 ++ .../model_validation/ClusterSizeDistribution.qmd | 2 ++ .../tests/model_validation/ContextualRecall.qmd | 2 ++ docs/validmind/tests/model_validation/FeaturesAUC.qmd | 2 ++ docs/validmind/tests/model_validation/MeteorScore.qmd | 2 ++ .../tests/model_validation/ModelMetadata.qmd | 2 ++ .../model_validation/ModelPredictionResiduals.qmd | 2 ++ docs/validmind/tests/model_validation/RegardScore.qmd | 2 ++ .../model_validation/RegressionResidualsPlot.qmd | 2 ++ docs/validmind/tests/model_validation/RougeScore.qmd | 2 ++ .../model_validation/TimeSeriesPredictionWithCI.qmd | 2 ++ .../model_validation/TimeSeriesPredictionsPlot.qmd | 2 ++ .../model_validation/TimeSeriesR2SquareBySegments.qmd | 2 ++ .../tests/model_validation/TokenDisparity.qmd | 2 ++ .../tests/model_validation/ToxicityScore.qmd | 2 ++ docs/validmind/tests/model_validation/sklearn.qmd | 2 ++ .../sklearn/AdjustedMutualInformation.qmd | 2 ++ .../model_validation/sklearn/AdjustedRandIndex.qmd | 2 ++ .../model_validation/sklearn/CalibrationCurve.qmd | 2 ++ .../sklearn/ClassifierPerformance.qmd | 2 ++ .../sklearn/ClassifierThresholdOptimization.qmd | 2 ++ .../sklearn/ClusterCosineSimilarity.qmd | 2 ++ .../sklearn/ClusterPerformanceMetrics.qmd | 2 ++ .../model_validation/sklearn/CompletenessScore.qmd | 2 ++ .../model_validation/sklearn/ConfusionMatrix.qmd | 2 ++ .../model_validation/sklearn/FeatureImportance.qmd | 2 ++ .../model_validation/sklearn/FowlkesMallowsScore.qmd | 2 ++ .../model_validation/sklearn/HomogeneityScore.qmd | 2 ++ .../sklearn/HyperParametersTuning.qmd | 2 ++ .../sklearn/KMeansClustersOptimization.qmd | 2 ++ .../model_validation/sklearn/MinimumAccuracy.qmd | 2 ++ .../tests/model_validation/sklearn/MinimumF1Score.qmd | 2 ++ .../model_validation/sklearn/MinimumROCAUCScore.qmd | 2 ++ .../model_validation/sklearn/ModelParameters.qmd | 2 ++ .../sklearn/ModelsPerformanceComparison.qmd | 2 ++ .../model_validation/sklearn/OverfitDiagnosis.qmd | 2 ++ .../sklearn/PermutationFeatureImportance.qmd | 2 ++ .../sklearn/PopulationStabilityIndex.qmd | 2 ++ .../model_validation/sklearn/PrecisionRecallCurve.qmd | 2 ++ .../tests/model_validation/sklearn/ROCCurve.qmd | 2 ++ .../model_validation/sklearn/RegressionErrors.qmd | 2 ++ .../sklearn/RegressionErrorsComparison.qmd | 2 ++ .../sklearn/RegressionPerformance.qmd | 2 ++ .../model_validation/sklearn/RegressionR2Square.qmd | 2 ++ .../sklearn/RegressionR2SquareComparison.qmd | 2 ++ .../model_validation/sklearn/RobustnessDiagnosis.qmd | 2 ++ .../model_validation/sklearn/SHAPGlobalImportance.qmd | 2 ++ .../sklearn/ScoreProbabilityAlignment.qmd | 2 ++ .../tests/model_validation/sklearn/SilhouettePlot.qmd | 2 ++ .../sklearn/TrainingTestDegradation.qmd | 2 ++ .../tests/model_validation/sklearn/VMeasure.qmd | 2 ++ .../model_validation/sklearn/WeakspotsDiagnosis.qmd | 2 ++ docs/validmind/tests/model_validation/statsmodels.qmd | 2 ++ .../tests/model_validation/statsmodels/AutoARIMA.qmd | 2 ++ .../statsmodels/CumulativePredictionProbabilities.qmd | 2 ++ .../model_validation/statsmodels/DurbinWatsonTest.qmd | 2 ++ .../tests/model_validation/statsmodels/GINITable.qmd | 2 ++ .../statsmodels/KolmogorovSmirnov.qmd | 2 ++ .../tests/model_validation/statsmodels/Lilliefors.qmd | 2 ++ .../statsmodels/PredictionProbabilitiesHistogram.qmd | 2 ++ .../model_validation/statsmodels/RegressionCoeffs.qmd | 2 ++ .../statsmodels/RegressionFeatureSignificance.qmd | 2 ++ .../statsmodels/RegressionModelForecastPlot.qmd | 2 ++ .../statsmodels/RegressionModelForecastPlotLevels.qmd | 2 ++ .../statsmodels/RegressionModelSensitivityPlot.qmd | 2 ++ .../statsmodels/RegressionModelSummary.qmd | 2 ++ .../RegressionPermutationFeatureImportance.qmd | 2 ++ .../statsmodels/ScorecardHistogram.qmd | 2 ++ .../tests/model_validation/statsmodels/statsutils.qmd | 2 ++ docs/validmind/tests/prompt_validation.qmd | 2 ++ docs/validmind/tests/prompt_validation/Bias.qmd | 2 ++ docs/validmind/tests/prompt_validation/Clarity.qmd | 2 ++ .../validmind/tests/prompt_validation/Conciseness.qmd | 2 ++ .../tests/prompt_validation/Delimitation.qmd | 2 ++ .../tests/prompt_validation/NegativeInstruction.qmd | 2 ++ docs/validmind/tests/prompt_validation/Robustness.qmd | 2 ++ .../validmind/tests/prompt_validation/Specificity.qmd | 2 ++ .../tests/prompt_validation/ai_powered_test.qmd | 2 ++ docs/validmind/unit_metrics.qmd | 2 ++ docs/validmind/vm_models.qmd | 2 ++ 183 files changed, 372 insertions(+), 12 deletions(-) diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index 23daf0a4b..33cc1bc8f 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -8,6 +8,8 @@ aliases: - index.html {% endif %} sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- {% if module.docstring %} @@ -37,12 +39,9 @@ sidebar: validmind-reference ```python {% if target.labels and "async" in target.labels %}async {% endif %} -def {{ member.name }}( -{% for param in target.parameters %} - {{ '**' if param.kind == 'variadic keyword' else '*' if param.kind == 'variadic positional' else '' }}{{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation.left.name if param.annotation.cls == "ExprSubscript" else "" }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %}, -{% endif %} -{%- endfor %} -){% if target.returns %} -> {{ types.format_module_return_type(target.returns, module, full_data) }}{% endif %}: +def {{ member.name }}{% if target.parameters|length > 0 %}( +{% for param in target.parameters %} {{ '**' if param.kind == 'variadic keyword' else '*' if param.kind == 'variadic positional' else '' }}{{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation.left.name if param.annotation.cls == "ExprSubscript" else "" }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %}, +{% endif %}{% endfor %}){% else %}(){% endif %}{% if target.returns %} -> {{ types.format_module_return_type(target.returns, module, full_data) }}{% endif %}: ``` {% endif %} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index cd329ab12..3fc3d784e 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -3,6 +3,8 @@ title: "ValidMind Library" aliases: - index.html sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- The ValidMind Library is a suite of developer tools and methods designed to automate the documentation and validation of your models. Designed to be model agnostic, the ValidMind Library provides all the standard functionality without requiring you to rewrite any functions as long as your model is built in Python. @@ -221,8 +223,7 @@ Logs a unit metric Unit metrics are key-value pairs where the key is the metric ```python -def preview_template( -): +def preview_template(): ``` Preview the documentation template for the current project This function will display the documentation template for the current project. If the project has not been initialized, then an error will be raised. @@ -236,8 +237,7 @@ Preview the documentation template for the current project This function will di ```python -def print_env( -): +def print_env(): ``` Prints a log of the running environment for debugging. Output includes: ValidMind Library version, operating system details, installed dependencies, and the ISO 8601 timestamp at log creation. @@ -247,8 +247,7 @@ Prints a log of the running environment for debugging. Output includes: ValidMin ```python -def reload( -): +def reload(): ``` Reconnect to the ValidMind API and reload the project configuration diff --git a/docs/validmind/datasets.qmd b/docs/validmind/datasets.qmd index 08534d62a..ed9673a26 100644 --- a/docs/validmind/datasets.qmd +++ b/docs/validmind/datasets.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).datasets" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Example datasets that can be used with the ValidMind Library. diff --git a/docs/validmind/datasets/classification.qmd b/docs/validmind/datasets/classification.qmd index 6d2c5d7da..81f67f971 100644 --- a/docs/validmind/datasets/classification.qmd +++ b/docs/validmind/datasets/classification.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).classification" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Entrypoint for classification datasets. diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index 40a11b481..8f0d02d4d 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).customer_churn" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## simple_preprocess_booleans() diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index 74651c3a4..dbd2e59d0 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).taiwan_credit" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## simple_preprocess_booleans() diff --git a/docs/validmind/datasets/credit_risk.qmd b/docs/validmind/datasets/credit_risk.qmd index a51bd1882..fe09d89fd 100644 --- a/docs/validmind/datasets/credit_risk.qmd +++ b/docs/validmind/datasets/credit_risk.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).credit_risk" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Entrypoint for credit risk datasets. diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index 123d3447c..9240f5b00 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).lending_club" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## compute_scores[()]{.muted} diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 15fb5d279..4424b36c0 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).lending_club_bias" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## compute_scores[()]{.muted} diff --git a/docs/validmind/datasets/nlp.qmd b/docs/validmind/datasets/nlp.qmd index d1f765e1c..bfbeb61d0 100644 --- a/docs/validmind/datasets/nlp.qmd +++ b/docs/validmind/datasets/nlp.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).nlp" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Example datasets that can be used with the ValidMind Library. diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index 8e6986bdc..f0e93d97d 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).cnn_dailymail" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## display_nice[()]{.muted} diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index 1221c6ef5..a136726f4 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).twitter_covid_19" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## load_data[()]{.muted} diff --git a/docs/validmind/datasets/regression.qmd b/docs/validmind/datasets/regression.qmd index 7d3cd0d37..88dfcf2fa 100644 --- a/docs/validmind/datasets/regression.qmd +++ b/docs/validmind/datasets/regression.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).regression" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Entrypoint for regression datasets diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index cb46ecee8..44591b624 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).fred" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## load_all_data[()]{.muted} diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 79fea9683..8127a016c 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).lending_club" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## load_data[()]{.muted} diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index a8c726ad2..f75478b1e 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).errors" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- This module contains all the custom errors that are used in the ValidMind Library. The following base errors are defined for others: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 58b065aba..0d51c4e1c 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).test_suites" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Entrypoint for test suites. diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index a4987281e..d2c1340e2 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).classifier" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Test suites for sklearn-compatible classifier models Ideal setup is to have the API client to read a custom test suite from the project's configuration diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index 8056a3a61..146c3eaed 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).cluster" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Test suites for sklearn-compatible clustering models Ideal setup is to have the API client to read a custom test suite from the project's configuration diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index 0f28805e7..182018f42 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).embeddings" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Test suites for embeddings models Ideal setup is to have the API client to read a custom test suite from the project's configuration diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index 5e41878ed..752e338ba 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).llm" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Test suites for LLMs diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index 8cb5c3a11..d5f1a0b20 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).nlp" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Test suites for NLP models diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index 42701ae05..4833dd6bf 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).parameters_optimization" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Test suites for sklearn-compatible hyper parameters tunning Ideal setup is to have the API client to read a custom test suite from the project's configuration diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index 8d642ec2a..32401cd0a 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).regression" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## [class]{.muted} RegressionFullSuite diff --git a/docs/validmind/test_suites/statsmodels_timeseries.qmd b/docs/validmind/test_suites/statsmodels_timeseries.qmd index f6266ff9e..f0d1a21b9 100644 --- a/docs/validmind/test_suites/statsmodels_timeseries.qmd +++ b/docs/validmind/test_suites/statsmodels_timeseries.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).statsmodels_timeseries" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Time Series Test Suites from statsmodels diff --git a/docs/validmind/test_suites/summarization.qmd b/docs/validmind/test_suites/summarization.qmd index 41e51c9ad..abf50b7d4 100644 --- a/docs/validmind/test_suites/summarization.qmd +++ b/docs/validmind/test_suites/summarization.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).summarization" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Test suites for llm summarization models diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd index 5050e0c35..158f9f5ff 100644 --- a/docs/validmind/test_suites/tabular_datasets.qmd +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).tabular_datasets" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Test suites for tabular datasets diff --git a/docs/validmind/test_suites/text_data.qmd b/docs/validmind/test_suites/text_data.qmd index 578bca21e..c5e4ece66 100644 --- a/docs/validmind/test_suites/text_data.qmd +++ b/docs/validmind/test_suites/text_data.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).text_data" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Test suites for text datasets diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index 1e9e2e883..cda6fe4f1 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).time_series" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Time Series Test Suites diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 6491aef05..cf72850e2 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).tests" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ValidMind Tests Module diff --git a/docs/validmind/tests/data_validation.qmd b/docs/validmind/tests/data_validation.qmd index 79a8cbc3f..6851ede08 100644 --- a/docs/validmind/tests/data_validation.qmd +++ b/docs/validmind/tests/data_validation.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).data_validation" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- - [ACFandPACFPlot](data_validation/ACFandPACFPlot.qmd) diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 666cf6099..88985633b 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ACFandPACFPlot" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ACFandPACFPlot[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index a0124827d..e28b1e504 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ADF" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index e50512ac0..47410a9c8 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).AutoAR" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index f716c36d7..a2009d02d 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).AutoMA" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index ba9522245..a70e7ed7f 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).AutoStationarity" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## AutoStationarity[()]{.muted} diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 03bdba7d7..ed6612cdb 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).BivariateScatterPlots" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## BivariateScatterPlots[()]{.muted} diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index 884c894b4..8187ba6aa 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).BoxPierce" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## BoxPierce[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index b33e5e1e2..363f7d80c 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ChiSquaredFeaturesTable" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ChiSquaredFeaturesTable[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 538465998..6d4f3212e 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ClassImbalance" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Threshold based tests diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 0527016dc..026ef3f1b 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).DatasetDescription" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 91880bd62..238df5414 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).DatasetSplit" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## DatasetSplit[()]{.muted} diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 733956d55..09352bfcc 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).DescriptiveStatistics" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## format_records() diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index d2f8b7425..68d02aa5d 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).DickeyFullerGLS" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index f5d963cd3..16aeb550a 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).Duplicates" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## Duplicates[()]{.muted} diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 5592d4938..b2df9103a 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).EngleGrangerCoint" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## EngleGrangerCoint[()]{.muted} diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 11d334389..2936c3d09 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).FeatureTargetCorrelationPlot" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## FeatureTargetCorrelationPlot[()]{.muted} diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 64c641587..a23e30029 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).HighCardinality" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## HighCardinality[()]{.muted} diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index faadf2ee2..5630cd01c 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).HighPearsonCorrelation" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## HighPearsonCorrelation[()]{.muted} diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 84e8bfec0..2d127209d 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).IQROutliersBarPlot" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## compute_outliers[()]{.muted} diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 98bfca33b..c928217d5 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).IQROutliersTable" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## compute_outliers[()]{.muted} diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index 1e2baea0f..f52d3ac53 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).IsolationForestOutliers" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## IsolationForestOutliers[()]{.muted} diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index 7f88988e2..4b8a7ab73 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).JarqueBera" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## JarqueBera[()]{.muted} diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index afd267862..acd7def3f 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).KPSS" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index b727dce25..000252915 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).LJungBox" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## LJungBox[()]{.muted} diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index f32c92bd1..ae4341ebd 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).LaggedCorrelationHeatmap" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## LaggedCorrelationHeatmap[()]{.muted} diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index b351b55c1..578f26fff 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).MissingValues" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## MissingValues[()]{.muted} diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 3ac50249a..ba5b3b0ff 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).MissingValuesBarPlot" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## MissingValuesBarPlot[()]{.muted} diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index d6824aa33..02cf422ea 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).MutualInformation" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## MutualInformation[()]{.muted} diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index f2195ca90..8725467f6 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).PearsonCorrelationMatrix" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## PearsonCorrelationMatrix[()]{.muted} diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 956027eed..2e49b6c34 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).PhillipsPerronArch" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 542df6970..99d5f526b 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ProtectedClassesCombination" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index 64f70bf8e..2de4a4dcf 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ProtectedClassesDescription" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 4fac8bbf2..12c9479b1 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ProtectedClassesDisparity" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index f614d7c1a..b3b1a1ac2 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ProtectedClassesThresholdOptimizer" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 33c6cd8a3..51deea587 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RollingStatsPlot" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## plot_rolling_statistics[()]{.muted} diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 49e67d820..10db48fa5 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RunsTest" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## RunsTest[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index e2e3256c5..8b7b3eb30 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ScatterPlot" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ScatterPlot[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index d686b70d0..502c3df5c 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ScoreBandDefaultRates" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ScoreBandDefaultRates[()]{.muted} diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 1df51245b..65a7bcb94 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).SeasonalDecompose" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 10aa7380b..03939b01c 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ShapiroWilk" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ShapiroWilk[()]{.muted} diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index cc1627e3b..cc51e3c51 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).Skewness" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## Skewness[()]{.muted} diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 0f4d07d7d..c579ca67d 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).SpreadPlot" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## SpreadPlot[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 8d688dcaf..3ed3f99d2 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TabularCategoricalBarPlots" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## TabularCategoricalBarPlots[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 4989940e8..204c39db7 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TabularDateTimeHistograms" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## TabularDateTimeHistograms[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 4e3b6a712..736dd32f5 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TabularDescriptionTables" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_categorical_columns[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index b06d01989..13a1f56f1 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TabularNumericalHistograms" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## TabularNumericalHistograms[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 25e028f10..425adc01f 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TargetRateBarPlots" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## TargetRateBarPlots[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index cf3872d02..8eff9dc88 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TimeSeriesDescription" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## TimeSeriesDescription[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 29731f64c..2d2d6d3c0 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TimeSeriesDescriptiveStatistics" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## TimeSeriesDescriptiveStatistics[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index bd26eed62..4c6fe7e4b 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TimeSeriesFrequency" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## TimeSeriesFrequency[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 2dfec0fb0..aad767b2e 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TimeSeriesHistogram" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 2bbb87083..d68e379a2 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TimeSeriesLinePlot" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## TimeSeriesLinePlot[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index be9f2bfe7..429f76ebe 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TimeSeriesMissingValues" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## TimeSeriesMissingValues[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index e92db292b..d5dc7dd7a 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TimeSeriesOutliers" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## TimeSeriesOutliers[()]{.muted} diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index ec748a4dc..b202d3228 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TooManyZeroValues" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## TooManyZeroValues[()]{.muted} diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index f7e56d52b..4e170e980 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).UniqueRows" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## UniqueRows[()]{.muted} diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index e858b526f..632533a4d 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).WOEBinPlots" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 6275b676f..f4e0601f8 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).WOEBinTable" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## WOEBinTable[()]{.muted} diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 786653e07..3e07a9a2d 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ZivotAndrewsArch" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/data_validation/nlp.qmd b/docs/validmind/tests/data_validation/nlp.qmd index fde548839..4dde30e85 100644 --- a/docs/validmind/tests/data_validation/nlp.qmd +++ b/docs/validmind/tests/data_validation/nlp.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).nlp" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- - [CommonWords](nlp/CommonWords.qmd) diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index 93b9225e7..a50433449 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).CommonWords" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## CommonWords[()]{.muted} diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index e33dce71a..e2787eb41 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).Hashtags" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## Hashtags[()]{.muted} diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 817a50188..7c219836a 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).LanguageDetection" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## LanguageDetection[()]{.muted} diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 6885490ab..448038fac 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).Mentions" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## Mentions[()]{.muted} diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index e536a640e..db69c4b6e 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).PolarityAndSubjectivity" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## PolarityAndSubjectivity[()]{.muted} diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index 554c0dfef..ed775e6c0 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).Punctuations" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Metrics functions for any Pandas-compatible datasets diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index 5d252686b..751987c6f 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).Sentiment" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## Sentiment[()]{.muted} diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index 80c95b0e4..b42cbfa2f 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).StopWords" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Threshold based tests diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 245a59a37..c95632d49 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TextDescription" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## create_metrics_df[()]{.muted} diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index 190da7b20..ac4a645ae 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).Toxicity" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## Toxicity[()]{.muted} diff --git a/docs/validmind/tests/model_validation.qmd b/docs/validmind/tests/model_validation.qmd index a8a110e82..01dcff7f6 100644 --- a/docs/validmind/tests/model_validation.qmd +++ b/docs/validmind/tests/model_validation.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).model_validation" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- - [BertScore](model_validation/BertScore.qmd) diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index aecf1b6e2..88f12da46 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).BertScore" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## validate_prediction() diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 1e935dfae..11f12e77a 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).BleuScore" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## validate_prediction() diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 93fb605ce..67e137679 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ClusterSizeDistribution" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ClusterSizeDistribution[()]{.muted} diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index f2ffbcbf5..a9489dbfe 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ContextualRecall" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## validate_prediction() diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index c6b75e5c2..00efb2ac9 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).FeaturesAUC" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index d8b1902c5..c091030f4 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).MeteorScore" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## validate_prediction() diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index c073d4362..bd38f9488 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ModelMetadata" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_model_info() diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index 062e997b7..7eb01bb05 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ModelPredictionResiduals" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ModelPredictionResiduals[()]{.muted} diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 6d10a4da6..16a254137 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RegardScore" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## validate_prediction() diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index c4621a25d..7ba48cf62 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RegressionResidualsPlot" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## RegressionResidualsPlot[()]{.muted} diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index cc172824f..71deeef36 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RougeScore" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## RougeScore[()]{.muted} diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index 5721ee4cc..a20cc6597 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TimeSeriesPredictionWithCI" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## TimeSeriesPredictionWithCI[()]{.muted} diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index 7e4201a34..8ea071139 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TimeSeriesPredictionsPlot" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## TimeSeriesPredictionsPlot[()]{.muted} diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index cbe19d674..ccfd8ea2e 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TimeSeriesR2SquareBySegments" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## TimeSeriesR2SquareBySegments[()]{.muted} diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index 3eeaea4e6..670a9b938 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TokenDisparity" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## TokenDisparity[()]{.muted} diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index 64b734e4c..7a39812f0 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ToxicityScore" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ToxicityScore[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn.qmd b/docs/validmind/tests/model_validation/sklearn.qmd index 59615c1d5..871dfb51e 100644 --- a/docs/validmind/tests/model_validation/sklearn.qmd +++ b/docs/validmind/tests/model_validation/sklearn.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).sklearn" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- - [AdjustedMutualInformation](sklearn/AdjustedMutualInformation.qmd) diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 1b64e6dd8..7efc72467 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).AdjustedMutualInformation" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## AdjustedMutualInformation[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 6953a455c..87a07ece1 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).AdjustedRandIndex" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## AdjustedRandIndex[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index e374fd0a2..8cb83b252 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).CalibrationCurve" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## CalibrationCurve[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index c0537a6a6..a0fd45845 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ClassifierPerformance" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ClassifierPerformance[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 5a9b92b51..7cca622a9 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ClassifierThresholdOptimization" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ClassifierThresholdOptimization[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 53abe586f..9d21f1c5a 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ClusterCosineSimilarity" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ClusterCosineSimilarity[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 4a2c7da8b..f8ab27f97 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ClusterPerformanceMetrics" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ClusterPerformanceMetrics[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index aa0244f52..c1eff609e 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).CompletenessScore" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## CompletenessScore[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index a9f46434f..bc8d18ad7 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ConfusionMatrix" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ConfusionMatrix[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 55bf57ea9..c8f893c0a 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).FeatureImportance" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## FeatureImportance[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 1b7ca3d8b..f4f8b3d90 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).FowlkesMallowsScore" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## FowlkesMallowsScore[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 6cd2a5880..3dcd8bed5 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).HomogeneityScore" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## HomogeneityScore[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 283ec11e0..91c4afef2 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).HyperParametersTuning" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## custom_recall[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index ce2a8b936..9fc0aa1fc 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).KMeansClustersOptimization" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## KMeansClustersOptimization[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 5aaa83ec3..79d40678e 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).MinimumAccuracy" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## MinimumAccuracy[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index d884d957d..1c36fd7e4 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).MinimumF1Score" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## MinimumF1Score[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 497af5e70..0464d0472 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).MinimumROCAUCScore" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## MinimumROCAUCScore[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 4d9dd03f2..265130e64 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ModelParameters" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ModelParameters[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 32f8c5c28..73b7fe1cb 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ModelsPerformanceComparison" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## multiclass_roc_auc_score() diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 0569c6b97..723936682 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).OverfitDiagnosis" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 2528dc2e3..ccf3c6408 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).PermutationFeatureImportance" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 217878de0..58799c123 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).PopulationStabilityIndex" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 199ef08ce..a443ad57f 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).PrecisionRecallCurve" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## PrecisionRecallCurve[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index c2162c63e..3a9b5862a 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ROCCurve" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ROCCurve[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index 54bcb7ab8..eb7573403 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RegressionErrors" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## RegressionErrors[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 445350e3c..e9fd262ee 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RegressionErrorsComparison" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index d92b89095..2975a3150 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RegressionPerformance" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index e0f102df0..3b456cf8b 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RegressionR2Square" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## adj_r2_score() diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 2ebd58475..ba259f23e 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RegressionR2SquareComparison" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## adj_r2_score() diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 451f82c8d..63ceaed13 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RobustnessDiagnosis" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 8bc466339..53dda6e46 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).SHAPGlobalImportance" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 2f9c3686f..f1e74f9c5 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ScoreProbabilityAlignment" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ScoreProbabilityAlignment[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 32d8df32a..a82f66688 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).SilhouettePlot" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## SilhouettePlot[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index e41d9230c..12f53f696 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).TrainingTestDegradation" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## TrainingTestDegradation[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 172ee5539..a18d8e66c 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).VMeasure" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## VMeasure[()]{.muted} diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 35effdd16..78f0f7dc2 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).WeakspotsDiagnosis" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## WeakspotsDiagnosis[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels.qmd b/docs/validmind/tests/model_validation/statsmodels.qmd index 7a9ffec1d..799310a34 100644 --- a/docs/validmind/tests/model_validation/statsmodels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).statsmodels" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- - [AutoARIMA](statsmodels/AutoARIMA.qmd) diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 9d8da03f1..5d617a93e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).AutoARIMA" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 1baf4ab00..9ecf30654 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).CumulativePredictionProbabilities" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## CumulativePredictionProbabilities[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index dd7e4d990..6b4fe48a5 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).DurbinWatsonTest" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## DurbinWatsonTest[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index 239725959..9d909bbb3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).GINITable" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## GINITable[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index f58ec3b32..a1b9aa9cc 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).KolmogorovSmirnov" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## KolmogorovSmirnov[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 76b36337e..74f82fd42 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).Lilliefors" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## Lilliefors[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index 0b958e026..772c20034 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).PredictionProbabilitiesHistogram" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## PredictionProbabilitiesHistogram[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 56123b99b..42d64dd7d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RegressionCoeffs" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## RegressionCoeffs[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index d9aeb2ab1..011a69b41 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RegressionFeatureSignificance" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index c61e706e7..cef3f38a4 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RegressionModelForecastPlot" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 14e11714f..c5de2a0fa 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RegressionModelForecastPlotLevels" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## integrate_diff[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index e58d30856..7122aac05 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RegressionModelSensitivityPlot" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 8b0786cd1..29a7e764d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RegressionModelSummary" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## adj_r2_score() diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 92833694a..9fe85af97 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).RegressionPermutationFeatureImportance" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## get_logger() diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index a4e808cf7..271e44b69 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ScorecardHistogram" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## ScorecardHistogram[()]{.muted} diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 13333b382..c9c215771 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).statsutils" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## adj_r2_score[()]{.muted} diff --git a/docs/validmind/tests/prompt_validation.qmd b/docs/validmind/tests/prompt_validation.qmd index 4aa94a1b9..503410fce 100644 --- a/docs/validmind/tests/prompt_validation.qmd +++ b/docs/validmind/tests/prompt_validation.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).prompt_validation" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- - [ai_powered_test](prompt_validation/ai_powered_test.qmd) diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 67e2afc01..bf5cf8f81 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).Bias" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## call_model() diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index d7e12678a..8c0d0073e 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).Clarity" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## call_model() diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 7fe0e7ed3..43abd9b2e 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).Conciseness" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## call_model() diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 2693ebf1d..eb95c33f5 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).Delimitation" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## call_model() diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 1fbc64465..33f59de4e 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).NegativeInstruction" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## call_model() diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 0f8998d08..7b333cbbd 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).Robustness" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## call_model() diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index e11926197..8cdc09929 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).Specificity" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## call_model() diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index cfb1c5ff1..df7167c3e 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).ai_powered_test" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## call_model[()]{.muted} diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index bdfb8ae51..b73f4019d 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).unit_metrics" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- ## describe_metric[()]{.muted} diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 1e769ac6c..4ec6b2b4f 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -1,6 +1,8 @@ --- title: "[validmind](/reference/validmind.html).vm_models" sidebar: validmind-reference +toc-depth: 4 +toc-expand: 4 --- Models entrypoint From 89c6c4be52fc2c5519314788a156cc5bc26ccf99 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 31 Jan 2025 08:20:40 -0800 Subject: [PATCH 044/207] Save point --- docs/templates/function.qmd.jinja2 | 9 ++-- docs/templates/module.qmd.jinja2 | 8 ++-- .../classification/customer_churn.qmd | 18 ++++---- .../datasets/classification/taiwan_credit.qmd | 15 ++++--- .../datasets/credit_risk/lending_club.qmd | 12 ++--- .../credit_risk/lending_club_bias.qmd | 9 ++-- .../datasets/nlp/twitter_covid_19.qmd | 3 +- docs/validmind/datasets/regression/fred.qmd | 18 +++----- .../datasets/regression/lending_club.qmd | 3 +- docs/validmind/errors.qmd | 6 +-- docs/validmind/test_suites.qmd | 15 +++---- docs/validmind/tests.qmd | 45 ++++++++++++------- .../tests/data_validation/ACFandPACFPlot.qmd | 3 +- docs/validmind/tests/data_validation/ADF.qmd | 6 +-- .../tests/data_validation/AutoAR.qmd | 3 +- .../tests/data_validation/AutoMA.qmd | 3 +- .../data_validation/BivariateScatterPlots.qmd | 3 +- .../tests/data_validation/BoxPierce.qmd | 3 +- .../tests/data_validation/ClassImbalance.qmd | 2 +- .../data_validation/DatasetDescription.qmd | 9 ++-- .../tests/data_validation/DatasetSplit.qmd | 3 +- .../data_validation/DescriptiveStatistics.qmd | 6 +-- .../tests/data_validation/DickeyFullerGLS.qmd | 6 +-- .../tests/data_validation/JarqueBera.qmd | 3 +- docs/validmind/tests/data_validation/KPSS.qmd | 6 +-- .../tests/data_validation/LJungBox.qmd | 3 +- .../PearsonCorrelationMatrix.qmd | 3 +- .../data_validation/PhillipsPerronArch.qmd | 6 +-- .../ProtectedClassesCombination.qmd | 3 +- .../ProtectedClassesDescription.qmd | 3 +- .../ProtectedClassesDisparity.qmd | 3 +- .../ProtectedClassesThresholdOptimizer.qmd | 9 ++-- .../tests/data_validation/RunsTest.qmd | 3 +- .../tests/data_validation/ScatterPlot.qmd | 3 +- .../data_validation/SeasonalDecompose.qmd | 3 +- .../tests/data_validation/ShapiroWilk.qmd | 3 +- .../tests/data_validation/SpreadPlot.qmd | 3 +- .../TabularCategoricalBarPlots.qmd | 3 +- .../TabularDateTimeHistograms.qmd | 3 +- .../TabularDescriptionTables.qmd | 12 ++--- .../TabularNumericalHistograms.qmd | 3 +- .../data_validation/TargetRateBarPlots.qmd | 3 +- .../data_validation/TimeSeriesDescription.qmd | 3 +- .../TimeSeriesDescriptiveStatistics.qmd | 3 +- .../data_validation/TimeSeriesFrequency.qmd | 3 +- .../data_validation/TimeSeriesHistogram.qmd | 3 +- .../data_validation/TimeSeriesLinePlot.qmd | 3 +- .../tests/data_validation/WOEBinPlots.qmd | 3 +- .../data_validation/ZivotAndrewsArch.qmd | 6 +-- .../tests/data_validation/nlp/CommonWords.qmd | 3 +- .../data_validation/nlp/LanguageDetection.qmd | 3 +- .../tests/data_validation/nlp/Sentiment.qmd | 3 +- .../tests/data_validation/nlp/Toxicity.qmd | 3 +- .../tests/model_validation/BertScore.qmd | 4 +- .../tests/model_validation/BleuScore.qmd | 4 +- .../model_validation/ContextualRecall.qmd | 4 +- .../tests/model_validation/FeaturesAUC.qmd | 3 +- .../tests/model_validation/MeteorScore.qmd | 4 +- .../tests/model_validation/ModelMetadata.qmd | 6 +-- .../tests/model_validation/RegardScore.qmd | 4 +- .../sklearn/HyperParametersTuning.qmd | 4 +- .../sklearn/KMeansClustersOptimization.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 6 ++- .../sklearn/OverfitDiagnosis.qmd | 5 ++- .../sklearn/PermutationFeatureImportance.qmd | 7 +-- .../sklearn/PopulationStabilityIndex.qmd | 5 ++- .../sklearn/RegressionErrorsComparison.qmd | 3 +- .../sklearn/RegressionPerformance.qmd | 3 +- .../sklearn/RegressionR2Square.qmd | 5 ++- .../sklearn/RegressionR2SquareComparison.qmd | 5 ++- .../sklearn/RobustnessDiagnosis.qmd | 7 +-- .../sklearn/SHAPGlobalImportance.qmd | 3 +- .../sklearn/TrainingTestDegradation.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 8 ++-- .../statsmodels/AutoARIMA.qmd | 3 +- .../statsmodels/Lilliefors.qmd | 3 +- .../statsmodels/RegressionCoeffs.qmd | 3 +- .../RegressionFeatureSignificance.qmd | 3 +- .../RegressionModelForecastPlot.qmd | 7 +-- .../RegressionModelSensitivityPlot.qmd | 7 +-- .../statsmodels/RegressionModelSummary.qmd | 5 ++- ...RegressionPermutationFeatureImportance.qmd | 3 +- .../statsmodels/statsutils.qmd | 4 +- .../tests/prompt_validation/Bias.qmd | 11 ++--- .../tests/prompt_validation/Clarity.qmd | 11 ++--- .../tests/prompt_validation/Conciseness.qmd | 11 ++--- .../tests/prompt_validation/Delimitation.qmd | 11 ++--- .../prompt_validation/NegativeInstruction.qmd | 11 ++--- .../tests/prompt_validation/Robustness.qmd | 5 ++- .../tests/prompt_validation/Specificity.qmd | 11 ++--- .../prompt_validation/ai_powered_test.qmd | 6 +-- docs/validmind/unit_metrics.qmd | 7 ++- 92 files changed, 270 insertions(+), 268 deletions(-) diff --git a/docs/templates/function.qmd.jinja2 b/docs/templates/function.qmd.jinja2 index 270ab66c0..c9136cf7c 100644 --- a/docs/templates/function.qmd.jinja2 +++ b/docs/templates/function.qmd.jinja2 @@ -4,12 +4,9 @@ ```python -{% if member.labels and "async" in member.labels %}async {% endif %}def {{ member_name | default(member.name) }}( -{% for param in member.parameters %} - {{ '**' if param.kind == 'variadic keyword' else '*' if param.kind == 'variadic positional' else '' }}{{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation.left.name if param.annotation.cls == "ExprSubscript" else "" }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %}, -{% endif %} -{%- endfor %} -){% if member.returns %} -> {{ types.format_module_return_type(member.returns, module, full_data) }}{% endif %}: +def {{ member.name }}{% if member.parameters|length <= 1 %}({% for param in member.parameters %}{{ param.name }}{% if param.annotation %}: {{ param.annotation['name'] if param.annotation is mapping and 'name' in param.annotation else param.annotation }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% endfor %}){% else %}( +{% for param in member.parameters %} {{ param.name }}{% if param.annotation %}: {{ param.annotation['name'] if param.annotation is mapping and 'name' in param.annotation else param.annotation }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %}, +{% endif %}{% endfor %}){% endif %}{% if member.returns %} -> {{ member.returns['name'] if member.returns is mapping and 'name' in member.returns else member.returns }}{% endif %}: ``` {% if member.docstring %} diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index 33cc1bc8f..18be8e952 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -78,11 +78,9 @@ def {{ member.name }}{% if target.parameters|length > 0 %}( ```python -{% if resolved.labels and "async" in resolved.labels %}async {% endif %}def {{ member.name }}( -{% for param in resolved.parameters %} - {{ param.name }}{% if param.annotation %}: {{ param.annotation }}{% endif %}{% if param.default %} = {{ param.default }}{% endif %}{% if not loop.last %},{% endif %} -{% endfor %} -){% if resolved.returns %} -> {{ resolved.returns }}{% endif %}: +{% if resolved.labels and "async" in resolved.labels %}async {% endif %}def {{ member.name }}{% if resolved.parameters|length <= 1 %}({% for param in resolved.parameters %}{{ param.name }}{% if param.annotation %}: {{ param.annotation['name'] }}{% endif %}{% if param.default %} = {{ param.default }}{% endif %}{% endfor %}){% else %}( +{% for param in resolved.parameters %} {{ param.name }}{% if param.annotation %}: {{ param.annotation['name'] }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %}, +{% endif %}{% endfor %}){% endif %}{% if resolved.returns %} -> {{ resolved.returns['name'] if resolved.returns is mapping and 'name' in resolved.returns else resolved.returns }}{% endif %}: ``` {% if resolved.docstring %} diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index 8f0d02d4d..afd81276b 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def simple_preprocess_booleans( - df, columns): + df, + columns): ``` Preprocess boolean columns. @@ -31,7 +32,8 @@ Preprocess boolean columns. ```python def simple_preprocess_categoricals( - df, columns): + df, + columns): ``` Preprocess categorical columns. @@ -51,7 +53,8 @@ Preprocess categorical columns. ```python def simple_preprocess_numericals( - df, columns): + df, + columns): ``` Preprocess numerical columns. @@ -70,8 +73,7 @@ Preprocess numerical columns. ```python -def get_demo_test_config( - test_suite = None): +def get_demo_test_config(test_suite = None): ``` Returns input configuration for the default documentation template assigned to this demo model @@ -96,8 +98,7 @@ We assign the following inputs depending on the input config expected by each te ```python -def load_data( - full_dataset = False): +def load_data(full_dataset = False): ``` ## preprocess[()]{.muted} @@ -105,6 +106,5 @@ def load_data( ```python -def preprocess( - df): +def preprocess(df): ``` diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index dbd2e59d0..568d11f21 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def simple_preprocess_booleans( - df, columns): + df, + columns): ``` Preprocess boolean columns. @@ -31,7 +32,8 @@ Preprocess boolean columns. ```python def simple_preprocess_categoricals( - df, columns): + df, + columns): ``` Preprocess categorical columns. @@ -51,7 +53,8 @@ Preprocess categorical columns. ```python def simple_preprocess_numericals( - df, columns): + df, + columns): ``` Preprocess numerical columns. @@ -70,8 +73,7 @@ Preprocess numerical columns. ```python -def load_data( -): +def load_data(): ``` ## preprocess[()]{.muted} @@ -79,6 +81,5 @@ def load_data( ```python -def preprocess( - df): +def preprocess(df): ``` diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index 9240f5b00..cca9711db 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def compute_scores( - probabilities): +def compute_scores(probabilities): ``` ## feature_engineering[()]{.muted} @@ -50,8 +49,7 @@ Get demo test configuration. ```python -def init_vm_objects( - scorecard): +def init_vm_objects(scorecard): ``` ## load_data[()]{.muted} @@ -71,8 +69,7 @@ Load data from either an online source or offline files, automatically dropping ```python -def load_scorecard( -): +def load_scorecard(): ``` ## load_test_config[()]{.muted} @@ -80,8 +77,7 @@ def load_scorecard( ```python -def load_test_config( - scorecard): +def load_test_config(scorecard): ``` ## preprocess[()]{.muted} diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 4424b36c0..1cef0eabc 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def compute_scores( - probabilities): +def compute_scores(probabilities): ``` ## load_data[()]{.muted} @@ -19,8 +18,7 @@ def compute_scores( ```python -def load_data( -): +def load_data(): ``` Load data from the specified CSV file. :return: DataFrame containing the loaded data. @@ -30,8 +28,7 @@ Load data from the specified CSV file. :return: DataFrame containing the loaded ```python -def preprocess( - df): +def preprocess(df): ``` ## split[()]{.muted} diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index a136726f4..b7d52732f 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -10,6 +10,5 @@ toc-expand: 4 ```python -def load_data( - full_dataset = False): +def load_data(full_dataset = False): ``` diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index 44591b624..721007077 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def load_all_data( -): +def load_all_data(): ``` ## load_data[()]{.muted} @@ -19,8 +18,7 @@ def load_all_data( ```python -def load_data( -): +def load_data(): ``` ## load_model[()]{.muted} @@ -28,8 +26,7 @@ def load_data( ```python -def load_model( - model_name): +def load_model(model_name): ``` ## load_processed_data[()]{.muted} @@ -37,8 +34,7 @@ def load_model( ```python -def load_processed_data( -): +def load_processed_data(): ``` ## load_test_dataset[()]{.muted} @@ -46,8 +42,7 @@ def load_processed_data( ```python -def load_test_dataset( - model_name): +def load_test_dataset(model_name): ``` ## load_train_dataset[()]{.muted} @@ -55,8 +50,7 @@ def load_test_dataset( ```python -def load_train_dataset( - model_path): +def load_train_dataset(model_path): ``` ## preprocess[()]{.muted} diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 8127a016c..3bbca71b2 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def load_data( -): +def load_data(): ``` ## preprocess[()]{.muted} diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index f75478b1e..de4875c84 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -592,8 +592,7 @@ When an unsupported R model is used. ```python -def raise_api_error( - error_string): +def raise_api_error(error_string): ``` Safely try to parse JSON from the response message in case the API returns a non-JSON string or if the API returns a non-standard error @@ -603,8 +602,7 @@ Safely try to parse JSON from the response message in case the API returns a non ```python -def should_raise_on_fail_fast( - error) -> bool: +def should_raise_on_fail_fast(error) -> bool: ``` Determine whether an error should be raised when fail_fast is True. diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 0d51c4e1c..b0b3e4c41 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -25,8 +25,7 @@ Entrypoint for test suites. ```python -def format_dataframe( - df: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +def format_dataframe(df: ) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ``` Format a pandas DataFrame for display purposes @@ -37,7 +36,8 @@ Format a pandas DataFrame for display purposes ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name @@ -47,8 +47,7 @@ Get a logger for the given module name ```python -def test_id_to_name( - test_id: {'cls': 'ExprName', 'name': 'str'}) -> {'cls': 'ExprName', 'name': 'str'}: +def test_id_to_name(test_id: str) -> str: ``` Convert a test ID to a human-readable name. @@ -87,8 +86,7 @@ Describes a Test Suite by ID ```python -def get_by_id( - test_suite_id: str): +def get_by_id(test_suite_id: str): ``` Returns the test suite by ID @@ -98,8 +96,7 @@ Returns the test suite by ID ```python -def list_suites( - pretty: bool = True): +def list_suites(pretty: bool = True): ``` Returns a list of all available test suites diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index cf72850e2..fd62dffc3 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -17,7 +17,9 @@ ValidMind Tests Module ```python def describe_test( - test_id: {'cls': 'ExprName', 'name': 'TestID'} = None, raw: {'cls': 'ExprName', 'name': 'bool'} = False, show: {'cls': 'ExprName', 'name': 'bool'} = True): + test_id: TestID = None, + raw: bool = False, + show: bool = True): ``` Get or show details about the test This function can be used to see test details including the test name, description, required inputs and default params. It can also be used to get a dictionary of the above information for programmatic use. @@ -32,8 +34,7 @@ Get or show details about the test This function can be used to see test details ```python -def list_tags( -): +def list_tags(): ``` List unique tags from all test classes. @@ -43,8 +44,7 @@ List unique tags from all test classes. ```python -def list_tasks( -): +def list_tasks(): ``` List unique tasks from all test classes. @@ -54,8 +54,7 @@ List unique tasks from all test classes. ```python -def list_tasks_and_tags( - as_json = False): +def list_tasks_and_tags(as_json = False): ``` List all task types and their associated tags, with one row per task type and all tags for a task type in one row. @@ -70,7 +69,11 @@ List all task types and their associated tags, with one row per task type and al ```python def list_tests( - filter = None, task = None, tags = None, pretty = True, truncate = True): + filter = None, + task = None, + tags = None, + pretty = True, + truncate = True): ``` List all tests in the tests directory. @@ -93,7 +96,9 @@ List all tests in the tests directory. ```python def load_test( - test_id: {'cls': 'ExprName', 'name': 'str'}, test_func: {'cls': 'ExprName', 'name': 'callable'} = None, reload: {'cls': 'ExprName', 'name': 'bool'} = False): + test_id: str, + test_func: callable = None, + reload: bool = False): ``` Load a test by test ID Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. The tag is optional and is used to distinguish between multiple results from the same test. @@ -109,7 +114,18 @@ Load a test by test ID Test IDs are in the format `namespace.path_to_module.Test ```python def run_test( - test_id: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'TestID'}, 'None'], 'implicit': True}} = None, name: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None, unit_metrics: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'TestID'}}, 'None'], 'implicit': True}} = None, inputs: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, 'None'], 'implicit': True}} = None, input_grid: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'Any'}}], 'implicit': True}}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}, 'None'], 'implicit': True}} = None, params: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, 'None'], 'implicit': True}} = None, param_grid: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'Any'}}], 'implicit': True}}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}, 'None'], 'implicit': True}} = None, show: {'cls': 'ExprName', 'name': 'bool'} = True, generate_description: {'cls': 'ExprName', 'name': 'bool'} = True, title: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, post_process_fn: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Callable'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, 'None'], 'implicit': True}}, 'None'], 'implicit': True}} = None, kwargs = {}) -> {'cls': 'ExprName', 'name': 'TestResult'}: + test_id: = None, + name: = None, + unit_metrics: = None, + inputs: = None, + input_grid: = None, + params: = None, + param_grid: = None, + show: bool = True, + generate_description: bool = True, + title: = None, + post_process_fn: = None, + kwargs = {}) -> TestResult: ``` Run a ValidMind or custom test This function is the main entry point for running tests. It can run simple unit metrics, ValidMind and custom tests, composite tests made up of multiple unit metrics and comparison tests made up of multiple tests. @@ -146,8 +162,7 @@ Run a ValidMind or custom test This function is the main entry point for running ```python -def tags( - tags = ()): +def tags(tags = ()): ``` Decorator for specifying tags for a test. @@ -161,8 +176,7 @@ Decorator for specifying tags for a test. ```python -def tasks( - tasks = ()): +def tasks(tasks = ()): ``` Decorator for specifying the task types that a test is designed for. @@ -176,8 +190,7 @@ Decorator for specifying the task types that a test is designed for. ```python -def test( - func_or_id): +def test(func_or_id): ``` Decorator for creating and registering custom tests This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 88985633b..0784d0c8e 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def ACFandPACFPlot( - dataset: VMDataset): +def ACFandPACFPlot(dataset: VMDataset): ``` Analyzes time series data using Autocorrelation Function (ACF) and Partial Autocorrelation Function (PACF) plots to reveal trends and correlations. diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index e28b1e504..2fac82028 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name @@ -21,8 +22,7 @@ Get a logger for the given module name ```python -def ADF( - dataset: VMDataset): +def ADF(dataset: VMDataset): ``` Assesses the stationarity of a time series dataset using the Augmented Dickey-Fuller (ADF) test. diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 47410a9c8..600c99c20 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index a2009d02d..4871494e0 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index ed6612cdb..6717e9214 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def BivariateScatterPlots( - dataset): +def BivariateScatterPlots(dataset): ``` Generates bivariate scatterplots to visually inspect relationships between pairs of numerical predictor variables in machine learning classification tasks. diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index 8187ba6aa..e215d1c80 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def BoxPierce( - dataset): +def BoxPierce(dataset): ``` Detects autocorrelation in time-series data through the Box-Pierce test to validate model performance. diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 6d4f3212e..da9afdfe6 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -14,7 +14,7 @@ Threshold based tests ```python def ClassImbalance( dataset: VMDataset, - min_percent_threshold: int = 10) -> Tuple[, , bool]: + min_percent_threshold: int = 10) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Tuple'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, {'cls': 'ExprName', 'name': 'bool'}], 'implicit': True}}: ``` Evaluates and quantifies class distribution imbalance in a dataset used by a machine learning model. diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 026ef3f1b..a19a5e0da 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name @@ -21,8 +22,7 @@ Get a logger for the given module name ```python -def DatasetDescription( - dataset: VMDataset): +def DatasetDescription(dataset: VMDataset): ``` Provides comprehensive analysis and statistical summaries of each column in a machine learning model's dataset. @@ -101,8 +101,7 @@ Returns a collection of histograms for a numerical column, each one with a diffe ```python -def infer_datatypes( - df): +def infer_datatypes(df): ``` ## [class]{.muted} UnsupportedColumnTypeError diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 238df5414..14cb5b70a 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def DatasetSplit( - datasets: List): +def DatasetSplit(datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}): ``` Evaluates and visualizes the distribution proportions among training, testing, and validation datasets of an ML model. diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 09352bfcc..9ab5ac54a 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def format_records( - df: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}: +def format_records(df: ) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}: ``` Round the values on each dataframe's column to a given number of decimal places. The returned value is converted to a dict in "records" with Pandas's to_dict() function. @@ -27,8 +26,7 @@ We do this for display purposes before sending data to ValidMind. Rules: ```python -def DescriptiveStatistics( - dataset: VMDataset): +def DescriptiveStatistics(dataset: VMDataset): ``` Performs a detailed descriptive statistical analysis of both numerical and categorical data within a model's dataset. diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 68d02aa5d..bc0137c78 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name @@ -21,8 +22,7 @@ Get a logger for the given module name ```python -def DickeyFullerGLS( - dataset: VMDataset): +def DickeyFullerGLS(dataset: VMDataset): ``` Assesses stationarity in time series data using the Dickey-Fuller GLS test to determine the order of integration. diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index 4b8a7ab73..4c8582655 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def JarqueBera( - dataset): +def JarqueBera(dataset): ``` Assesses normality of dataset features in an ML model using the Jarque-Bera test. diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index acd7def3f..0f5f05b24 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name @@ -21,8 +22,7 @@ Get a logger for the given module name ```python -def KPSS( - dataset: VMDataset): +def KPSS(dataset: VMDataset): ``` Assesses the stationarity of time-series data in a machine learning model using the KPSS unit root test. diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 000252915..25b416144 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def LJungBox( - dataset): +def LJungBox(dataset): ``` Assesses autocorrelations in dataset features by performing a Ljung-Box test on each feature. diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index 8725467f6..09cc380a0 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def PearsonCorrelationMatrix( - dataset): +def PearsonCorrelationMatrix(dataset): ``` Evaluates linear dependency between numerical variables in a dataset via a Pearson Correlation coefficient heat map. diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 2e49b6c34..8b7a56468 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name @@ -21,8 +22,7 @@ Get a logger for the given module name ```python -def PhillipsPerronArch( - dataset: VMDataset): +def PhillipsPerronArch(dataset: VMDataset): ``` Assesses the stationarity of time series data in each feature of the ML model using the Phillips-Perron test. diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 99d5f526b..592e542e3 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index 2de4a4dcf..a4732e909 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 12c9479b1..34dfbf003 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index b3b1a1ac2..8bc32d662 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name @@ -45,8 +46,7 @@ def calculate_group_metrics( ```python -def get_thresholds_by_group( - threshold_optimizer): +def get_thresholds_by_group(threshold_optimizer): ``` ## initialize_and_fit_optimizer[()]{.muted} @@ -77,8 +77,7 @@ def make_predictions( ```python -def plot_thresholds( - threshold_optimizer): +def plot_thresholds(threshold_optimizer): ``` ## ProtectedClassesThresholdOptimizer[()]{.muted} diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 10db48fa5..9504576d0 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def RunsTest( - dataset): +def RunsTest(dataset): ``` Executes Runs Test on ML model to detect non-random patterns in output data sequence. diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 8b7b3eb30..e3b037921 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def ScatterPlot( - dataset): +def ScatterPlot(dataset): ``` Assesses visual relationships, patterns, and outliers among features in a dataset through scatter plot matrices. diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 65a7bcb94..468af4d80 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 03939b01c..bce72094e 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def ShapiroWilk( - dataset): +def ShapiroWilk(dataset): ``` Evaluates feature-wise normality of training data using the Shapiro-Wilk test. diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index c579ca67d..5ebe7ae3f 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def SpreadPlot( - dataset: VMDataset): +def SpreadPlot(dataset: VMDataset): ``` Assesses potential correlations between pairs of time series variables through visualization to enhance understanding of their relationships. diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 3ed3f99d2..610f84948 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def TabularCategoricalBarPlots( - dataset: VMDataset): +def TabularCategoricalBarPlots(dataset: VMDataset): ``` Generates and visualizes bar plots for each category in categorical features to evaluate the dataset's composition. diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 204c39db7..36790dc57 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def TabularDateTimeHistograms( - dataset: VMDataset): +def TabularDateTimeHistograms(dataset: VMDataset): ``` Generates histograms to provide graphical insight into the distribution of time intervals in a model's datetime data. diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 736dd32f5..529a5e97e 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def get_categorical_columns( - dataset): +def get_categorical_columns(dataset): ``` ## get_datetime_columns[()]{.muted} @@ -19,8 +18,7 @@ def get_categorical_columns( ```python -def get_datetime_columns( - dataset): +def get_datetime_columns(dataset): ``` ## get_numerical_columns[()]{.muted} @@ -28,8 +26,7 @@ def get_datetime_columns( ```python -def get_numerical_columns( - dataset): +def get_numerical_columns(dataset): ``` ## get_summary_statistics_categorical[()]{.muted} @@ -67,8 +64,7 @@ def get_summary_statistics_numerical( ```python -def TabularDescriptionTables( - dataset): +def TabularDescriptionTables(dataset): ``` Summarizes key descriptive statistics for numerical, categorical, and datetime variables in a dataset. diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 13a1f56f1..535643001 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def TabularNumericalHistograms( - dataset: VMDataset): +def TabularNumericalHistograms(dataset: VMDataset): ``` Generates histograms for each numerical feature in a dataset to provide visual insights into data distribution and detect potential issues. diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 425adc01f..49856c4fd 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def TargetRateBarPlots( - dataset: VMDataset): +def TargetRateBarPlots(dataset: VMDataset): ``` Generates bar plots visualizing the default rates of categorical features for a classification machine learning model. diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 8eff9dc88..3d89a4b62 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def TimeSeriesDescription( - dataset): +def TimeSeriesDescription(dataset): ``` Generates a detailed analysis for the provided time series dataset, summarizing key statistics to identify trends, patterns, and data quality issues. diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 2d2d6d3c0..1a3257a96 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def TimeSeriesDescriptiveStatistics( - dataset): +def TimeSeriesDescriptiveStatistics(dataset): ``` Evaluates the descriptive statistics of a time series dataset to identify trends, patterns, and data quality issues. diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 4c6fe7e4b..dfb8d50a4 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def TimeSeriesFrequency( - dataset: VMDataset): +def TimeSeriesFrequency(dataset: VMDataset): ``` Evaluates consistency of time series data frequency and generates a frequency plot. diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index aad767b2e..817720e34 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index d68e379a2..59f87e7fb 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def TimeSeriesLinePlot( - dataset: VMDataset): +def TimeSeriesLinePlot(dataset: VMDataset): ``` Generates and analyses time-series data through line plots revealing trends, patterns, anomalies over time. diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 632533a4d..cc01a8e7f 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 3e07a9a2d..9a730907d 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name @@ -21,8 +22,7 @@ Get a logger for the given module name ```python -def ZivotAndrewsArch( - dataset: VMDataset): +def ZivotAndrewsArch(dataset: VMDataset): ``` Evaluates the order of integration and stationarity of time series data using the Zivot-Andrews unit root test. diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index a50433449..b7d4abc01 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def CommonWords( - dataset: VMDataset): +def CommonWords(dataset: VMDataset): ``` Assesses the most frequent non-stopwords in a text column for identifying prevalent language patterns. diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 7c219836a..38e23aec9 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def LanguageDetection( - dataset): +def LanguageDetection(dataset): ``` Assesses the diversity of languages in a textual dataset by detecting and visualizing the distribution of languages. diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index 751987c6f..d22db47b5 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def Sentiment( - dataset): +def Sentiment(dataset): ``` Analyzes the sentiment of text data within a dataset using the VADER sentiment analysis tool. diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index ac4a645ae..1c5b77f00 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def Toxicity( - dataset): +def Toxicity(dataset): ``` Assesses the toxicity of text data within a dataset to visualize the distribution of toxicity scores. diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 88f12da46..940186cc0 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -11,7 +11,9 @@ toc-expand: 4 ```python def validate_prediction( - y_true, y_pred, dataset_id = None): + y_true, + y_pred, + dataset_id = None): ``` Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 11f12e77a..1c461d1d9 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -11,7 +11,9 @@ toc-expand: 4 ```python def validate_prediction( - y_true, y_pred, dataset_id = None): + y_true, + y_pred, + dataset_id = None): ``` Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index a9489dbfe..56a1806ee 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -11,7 +11,9 @@ toc-expand: 4 ```python def validate_prediction( - y_true, y_pred, dataset_id = None): + y_true, + y_pred, + dataset_id = None): ``` Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 00efb2ac9..e385c921e 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index c091030f4..5445b5b16 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -11,7 +11,9 @@ toc-expand: 4 ```python def validate_prediction( - y_true, y_pred, dataset_id = None): + y_true, + y_pred, + dataset_id = None): ``` Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index bd38f9488..d1055f571 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def get_model_info( - model): +def get_model_info(model): ``` Attempts to extract all model info from a model object instance @@ -21,8 +20,7 @@ Attempts to extract all model info from a model object instance ```python -def ModelMetadata( - model): +def ModelMetadata(model): ``` Compare metadata of different models and generate a summary table with the results. **Purpose**: The purpose of this function is to compare the metadata of different models, including information about their architecture, framework, framework version, and programming language. diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 16a254137..e63040453 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -11,7 +11,9 @@ toc-expand: 4 ```python def validate_prediction( - y_true, y_pred, dataset_id = None): + y_true, + y_pred, + dataset_id = None): ``` Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 91c4afef2..e36a008e5 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -25,8 +25,8 @@ def HyperParametersTuning( model: VMModel, dataset: VMDataset, param_grid: dict, - scoring: Union = None, - thresholds: Union = None, + scoring: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'List'}, {'cls': 'ExprName', 'name': 'Dict'}], 'implicit': True}} = None, + thresholds: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'float'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}}], 'implicit': True}} = None, fit_params: dict = None): ``` diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 9fc0aa1fc..bc8992d5d 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -13,7 +13,7 @@ toc-expand: 4 def KMeansClustersOptimization( model: VMModel, dataset: VMDataset, - n_clusters: Union = None): + n_clusters: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'int'}}, 'None'], 'implicit': True}} = None): ``` Optimizes the number of clusters in K-means models using Elbow and Silhouette methods. diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 73b7fe1cb..0356f3172 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -11,7 +11,9 @@ toc-expand: 4 ```python def multiclass_roc_auc_score( - y_test, y_pred, average = 'macro'): + y_test, + y_pred, + average = 'macro'): ``` ## ModelsPerformanceComparison[()]{.muted} @@ -21,7 +23,7 @@ def multiclass_roc_auc_score( ```python def ModelsPerformanceComparison( dataset: VMDataset, - models: list): + models: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'list'}, 'slice': {'cls': 'ExprName', 'name': 'VMModel'}}): ``` Evaluates and compares the performance of multiple Machine Learning models using various metrics like accuracy, precision, recall, and F1 score. diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 723936682..2f3d268a1 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name @@ -23,7 +24,7 @@ Get a logger for the given module name ```python def OverfitDiagnosis( model: VMModel, - datasets: List, + datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, metric: str = None, cut_off_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): ``` diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index ccf3c6408..13a031f24 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name @@ -24,8 +25,8 @@ Get a logger for the given module name def PermutationFeatureImportance( model: VMModel, dataset: VMDataset, - fontsize: Union = None, - figure_height: Union = None): + fontsize: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'int'}, 'None'], 'implicit': True}} = None, + figure_height: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'int'}, 'None'], 'implicit': True}} = None): ``` Assesses the significance of each feature in a model by evaluating the impact on model performance when feature values are randomly rearranged. diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 58799c123..318c5ba86 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name @@ -36,7 +37,7 @@ Taken from: https://towardsdatascience.com/checking-model-stability-and-populati ```python def PopulationStabilityIndex( - datasets: List, + datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, num_bins: int = 10, mode: str = 'fixed'): diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index e9fd262ee..f12e7fc5a 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 2975a3150..0107dc93e 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 3b456cf8b..ca250f72f 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -11,7 +11,10 @@ toc-expand: 4 ```python def adj_r2_score( - actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: {'cls': 'ExprName', 'name': 'int'}, featurecount: {'cls': 'ExprName', 'name': 'int'}): + actual: , + predicted: , + rowcount: int, + featurecount: int): ``` Adjusted R2 Score diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index ba259f23e..da1793b33 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -11,7 +11,10 @@ toc-expand: 4 ```python def adj_r2_score( - actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: {'cls': 'ExprName', 'name': 'int'}, featurecount: {'cls': 'ExprName', 'name': 'int'}): + actual: , + predicted: , + rowcount: int, + featurecount: int): ``` Adjusted R2 Score diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 63ceaed13..d4a791917 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name @@ -22,10 +23,10 @@ Get a logger for the given module name ```python def RobustnessDiagnosis( - datasets: List, + datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, metric: str = None, - scaling_factor_std_dev_list: List = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'}, + scaling_factor_std_dev_list: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}} = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'}, performance_decay_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): ``` diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 53dda6e46..b2b18222c 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 12f53f696..48582f424 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -11,7 +11,7 @@ toc-expand: 4 ```python def TrainingTestDegradation( - datasets: List, + datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, max_threshold: float = 0.1): ``` diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 78f0f7dc2..05d904347 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -11,11 +11,11 @@ toc-expand: 4 ```python def WeakspotsDiagnosis( - datasets: List, + datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, - features_columns: Union = None, - metrics: Union = None, - thresholds: Union = None): + features_columns: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}, 'None'], 'implicit': True}} = None, + metrics: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Callable'}], 'implicit': True}}, 'None'], 'implicit': True}} = None, + thresholds: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'float'}], 'implicit': True}}, 'None'], 'implicit': True}} = None): ``` Identifies and visualizes weak spots in a machine learning model's performance across various sections of the feature space. diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 5d617a93e..5a5d5cace 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 74f82fd42..2f7669970 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def Lilliefors( - dataset: VMDataset): +def Lilliefors(dataset: VMDataset): ``` Assesses the normality of feature distributions in an ML model's training dataset using the Lilliefors test. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 42d64dd7d..7dd358407 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -10,8 +10,7 @@ toc-expand: 4 ```python -def RegressionCoeffs( - model): +def RegressionCoeffs(model): ``` Assesses the significance and uncertainty of predictor variables in a regression model through visualization of coefficients and their 95% confidence intervals. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 011a69b41..3e05913fe 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index cef3f38a4..c135c337e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name @@ -24,8 +25,8 @@ Get a logger for the given module name def RegressionModelForecastPlot( model: VMModel, dataset: VMDataset, - start_date: Union = None, - end_date: Union = None): + start_date: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None, + end_date: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None): ``` Generates plots to visually compare the forecasted outcomes of a regression model against actual observed values over a specified date range. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 7122aac05..b5231cee0 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name @@ -34,8 +35,8 @@ def integrate_diff( def RegressionModelSensitivityPlot( dataset: VMDataset, model: VMModel, - shocks: List = {'cls': 'ExprList', 'elements': ['0.1']}, - transformation: Union = None): + shocks: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}} = {'cls': 'ExprList', 'elements': ['0.1']}, + transformation: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None): ``` Assesses the sensitivity of a regression model to changes in independent variables by applying shocks and visualizing the impact. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 29a7e764d..d7bf4a0e9 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -11,7 +11,10 @@ toc-expand: 4 ```python def adj_r2_score( - actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: {'cls': 'ExprName', 'name': 'int'}, featurecount: {'cls': 'ExprName', 'name': 'int'}): + actual: , + predicted: , + rowcount: int, + featurecount: int): ``` Adjusted R2 Score diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 9fe85af97..329dba37e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -11,7 +11,8 @@ toc-expand: 4 ```python def get_logger( - name = 'validmind', log_level = None): + name = 'validmind', + log_level = None): ``` Get a logger for the given module name diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index c9c215771..291016c69 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -11,8 +11,8 @@ toc-expand: 4 ```python def adj_r2_score( - actual: , - predicted: , + actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, + predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: int, featurecount: int): ``` diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index bf5cf8f81..35c88054b 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -11,7 +11,10 @@ toc-expand: 4 ```python def call_model( - system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): + system_prompt: str, + user_prompt: str, + temperature: float = 0.0, + seed: int = 42): ``` Call LLM with the given prompts and return the response @@ -21,8 +24,7 @@ Call LLM with the given prompts and return the response ```python -def get_explanation( - response: {'cls': 'ExprName', 'name': 'str'}): +def get_explanation(response: str): ``` Get just the explanation from the response string TODO: use json response mode instead of this @@ -38,8 +40,7 @@ Explanation: " -> "" ```python -def get_score( - response: {'cls': 'ExprName', 'name': 'str'}): +def get_score(response: str): ``` Get just the score from the response string TODO: use json response mode instead of this diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 8c0d0073e..381c66ac9 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -11,7 +11,10 @@ toc-expand: 4 ```python def call_model( - system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): + system_prompt: str, + user_prompt: str, + temperature: float = 0.0, + seed: int = 42): ``` Call LLM with the given prompts and return the response @@ -21,8 +24,7 @@ Call LLM with the given prompts and return the response ```python -def get_explanation( - response: {'cls': 'ExprName', 'name': 'str'}): +def get_explanation(response: str): ``` Get just the explanation from the response string TODO: use json response mode instead of this @@ -38,8 +40,7 @@ Explanation: " -> "" ```python -def get_score( - response: {'cls': 'ExprName', 'name': 'str'}): +def get_score(response: str): ``` Get just the score from the response string TODO: use json response mode instead of this diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 43abd9b2e..12ae796da 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -11,7 +11,10 @@ toc-expand: 4 ```python def call_model( - system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): + system_prompt: str, + user_prompt: str, + temperature: float = 0.0, + seed: int = 42): ``` Call LLM with the given prompts and return the response @@ -21,8 +24,7 @@ Call LLM with the given prompts and return the response ```python -def get_explanation( - response: {'cls': 'ExprName', 'name': 'str'}): +def get_explanation(response: str): ``` Get just the explanation from the response string TODO: use json response mode instead of this @@ -38,8 +40,7 @@ Explanation: " -> "" ```python -def get_score( - response: {'cls': 'ExprName', 'name': 'str'}): +def get_score(response: str): ``` Get just the score from the response string TODO: use json response mode instead of this diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index eb95c33f5..8ac819989 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -11,7 +11,10 @@ toc-expand: 4 ```python def call_model( - system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): + system_prompt: str, + user_prompt: str, + temperature: float = 0.0, + seed: int = 42): ``` Call LLM with the given prompts and return the response @@ -21,8 +24,7 @@ Call LLM with the given prompts and return the response ```python -def get_explanation( - response: {'cls': 'ExprName', 'name': 'str'}): +def get_explanation(response: str): ``` Get just the explanation from the response string TODO: use json response mode instead of this @@ -38,8 +40,7 @@ Explanation: " -> "" ```python -def get_score( - response: {'cls': 'ExprName', 'name': 'str'}): +def get_score(response: str): ``` Get just the score from the response string TODO: use json response mode instead of this diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 33f59de4e..75b3e56ad 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -11,7 +11,10 @@ toc-expand: 4 ```python def call_model( - system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): + system_prompt: str, + user_prompt: str, + temperature: float = 0.0, + seed: int = 42): ``` Call LLM with the given prompts and return the response @@ -21,8 +24,7 @@ Call LLM with the given prompts and return the response ```python -def get_explanation( - response: {'cls': 'ExprName', 'name': 'str'}): +def get_explanation(response: str): ``` Get just the explanation from the response string TODO: use json response mode instead of this @@ -38,8 +40,7 @@ Explanation: " -> "" ```python -def get_score( - response: {'cls': 'ExprName', 'name': 'str'}): +def get_score(response: str): ``` Get just the score from the response string TODO: use json response mode instead of this diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 7b333cbbd..ab9ea5efb 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -11,7 +11,10 @@ toc-expand: 4 ```python def call_model( - system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): + system_prompt: str, + user_prompt: str, + temperature: float = 0.0, + seed: int = 42): ``` Call LLM with the given prompts and return the response diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 8cdc09929..21c7df7fd 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -11,7 +11,10 @@ toc-expand: 4 ```python def call_model( - system_prompt: {'cls': 'ExprName', 'name': 'str'}, user_prompt: {'cls': 'ExprName', 'name': 'str'}, temperature: {'cls': 'ExprName', 'name': 'float'} = 0.0, seed: {'cls': 'ExprName', 'name': 'int'} = 42): + system_prompt: str, + user_prompt: str, + temperature: float = 0.0, + seed: int = 42): ``` Call LLM with the given prompts and return the response @@ -21,8 +24,7 @@ Call LLM with the given prompts and return the response ```python -def get_explanation( - response: {'cls': 'ExprName', 'name': 'str'}): +def get_explanation(response: str): ``` Get just the explanation from the response string TODO: use json response mode instead of this @@ -38,8 +40,7 @@ Explanation: " -> "" ```python -def get_score( - response: {'cls': 'ExprName', 'name': 'str'}): +def get_score(response: str): ``` Get just the score from the response string TODO: use json response mode instead of this diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index df7167c3e..666935e73 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -24,8 +24,7 @@ Call LLM with the given prompts and return the response ```python -def get_explanation( - response: str): +def get_explanation(response: str): ``` Get just the explanation from the response string TODO: use json response mode instead of this @@ -41,8 +40,7 @@ Explanation: " -> "" ```python -def get_score( - response: str): +def get_score(response: str): ``` Get just the score from the response string TODO: use json response mode instead of this diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index b73f4019d..9b700175a 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ```python def describe_metric( metric_id: str, - **kwargs = {}): + kwargs = {}): ``` Describe a metric @@ -22,8 +22,7 @@ Describe a metric ```python -def list_metrics( - **kwargs = {}): +def list_metrics(kwargs = {}): ``` List all metrics @@ -35,7 +34,7 @@ List all metrics ```python def run_metric( metric_id: str, - **kwargs = {}): + kwargs = {}): ``` Run a metric From eb84a06d30558f01be8413510ab9b18225f4a844 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 31 Jan 2025 17:48:19 -0800 Subject: [PATCH 045/207] Likely safe save point --- docs/project_tree | 1219 ----------------- docs/templates/function.qmd.jinja2 | 16 +- docs/templates/styles.css | 32 + docs/validmind.tree | 588 -------- .../classification/customer_churn.qmd | 12 +- .../datasets/classification/taiwan_credit.qmd | 8 +- .../datasets/credit_risk/lending_club.qmd | 55 +- .../credit_risk/lending_club_bias.qmd | 18 +- docs/validmind/datasets/nlp/cnn_dailymail.qmd | 12 +- .../datasets/nlp/twitter_covid_19.qmd | 4 +- docs/validmind/datasets/regression/fred.qmd | 38 +- .../datasets/regression/lending_club.qmd | 18 +- docs/validmind/errors.qmd | 8 +- docs/validmind/test_suites.qmd | 20 +- docs/validmind/tests.qmd | 6 +- .../tests/data_validation/ACFandPACFPlot.qmd | 4 +- docs/validmind/tests/data_validation/ADF.qmd | 4 +- .../tests/data_validation/AutoAR.qmd | 6 +- .../tests/data_validation/AutoMA.qmd | 6 +- .../data_validation/AutoStationarity.qmd | 7 +- .../data_validation/BivariateScatterPlots.qmd | 4 +- .../tests/data_validation/BoxPierce.qmd | 4 +- .../ChiSquaredFeaturesTable.qmd | 6 +- .../tests/data_validation/ClassImbalance.qmd | 6 +- .../data_validation/DatasetDescription.qmd | 27 +- .../tests/data_validation/DatasetSplit.qmd | 4 +- .../data_validation/DescriptiveStatistics.qmd | 16 +- .../tests/data_validation/DickeyFullerGLS.qmd | 4 +- .../tests/data_validation/Duplicates.qmd | 6 +- .../data_validation/EngleGrangerCoint.qmd | 6 +- .../FeatureTargetCorrelationPlot.qmd | 6 +- .../tests/data_validation/HighCardinality.qmd | 8 +- .../HighPearsonCorrelation.qmd | 8 +- .../data_validation/IQROutliersBarPlot.qmd | 13 +- .../data_validation/IQROutliersTable.qmd | 12 +- .../IsolationForestOutliers.qmd | 8 +- .../tests/data_validation/JarqueBera.qmd | 4 +- docs/validmind/tests/data_validation/KPSS.qmd | 4 +- .../tests/data_validation/LJungBox.qmd | 4 +- .../LaggedCorrelationHeatmap.qmd | 6 +- .../tests/data_validation/MissingValues.qmd | 6 +- .../data_validation/MissingValuesBarPlot.qmd | 7 +- .../data_validation/MutualInformation.qmd | 7 +- .../PearsonCorrelationMatrix.qmd | 4 +- .../data_validation/PhillipsPerronArch.qmd | 4 +- .../ProtectedClassesCombination.qmd | 7 +- .../ProtectedClassesDescription.qmd | 6 +- .../ProtectedClassesDisparity.qmd | 9 +- .../ProtectedClassesThresholdOptimizer.qmd | 48 +- .../data_validation/RollingStatsPlot.qmd | 13 +- .../tests/data_validation/RunsTest.qmd | 4 +- .../tests/data_validation/ScatterPlot.qmd | 4 +- .../data_validation/ScoreBandDefaultRates.qmd | 8 +- .../data_validation/SeasonalDecompose.qmd | 6 +- .../tests/data_validation/ShapiroWilk.qmd | 4 +- .../tests/data_validation/Skewness.qmd | 6 +- .../tests/data_validation/SpreadPlot.qmd | 4 +- .../TabularCategoricalBarPlots.qmd | 4 +- .../TabularDateTimeHistograms.qmd | 4 +- .../TabularDescriptionTables.qmd | 34 +- .../TabularNumericalHistograms.qmd | 4 +- .../data_validation/TargetRateBarPlots.qmd | 4 +- .../data_validation/TimeSeriesDescription.qmd | 4 +- .../TimeSeriesDescriptiveStatistics.qmd | 4 +- .../data_validation/TimeSeriesFrequency.qmd | 4 +- .../data_validation/TimeSeriesHistogram.qmd | 6 +- .../data_validation/TimeSeriesLinePlot.qmd | 4 +- .../TimeSeriesMissingValues.qmd | 6 +- .../data_validation/TimeSeriesOutliers.qmd | 6 +- .../data_validation/TooManyZeroValues.qmd | 6 +- .../tests/data_validation/UniqueRows.qmd | 6 +- .../tests/data_validation/WOEBinPlots.qmd | 8 +- .../tests/data_validation/WOEBinTable.qmd | 6 +- .../data_validation/ZivotAndrewsArch.qmd | 4 +- .../tests/data_validation/nlp/CommonWords.qmd | 4 +- .../tests/data_validation/nlp/Hashtags.qmd | 6 +- .../data_validation/nlp/LanguageDetection.qmd | 4 +- .../tests/data_validation/nlp/Mentions.qmd | 6 +- .../nlp/PolarityAndSubjectivity.qmd | 7 +- .../data_validation/nlp/Punctuations.qmd | 6 +- .../tests/data_validation/nlp/Sentiment.qmd | 4 +- .../tests/data_validation/nlp/StopWords.qmd | 7 +- .../data_validation/nlp/TextDescription.qmd | 15 +- .../tests/data_validation/nlp/Toxicity.qmd | 4 +- .../tests/model_validation/BertScore.qmd | 7 +- .../tests/model_validation/BleuScore.qmd | 6 +- .../ClusterSizeDistribution.qmd | 6 +- .../model_validation/ContextualRecall.qmd | 6 +- .../tests/model_validation/FeaturesAUC.qmd | 7 +- .../tests/model_validation/MeteorScore.qmd | 6 +- .../tests/model_validation/ModelMetadata.qmd | 4 +- .../ModelPredictionResiduals.qmd | 10 +- .../tests/model_validation/RegardScore.qmd | 6 +- .../RegressionResidualsPlot.qmd | 7 +- .../tests/model_validation/RougeScore.qmd | 7 +- .../TimeSeriesPredictionWithCI.qmd | 7 +- .../TimeSeriesPredictionsPlot.qmd | 6 +- .../TimeSeriesR2SquareBySegments.qmd | 7 +- .../tests/model_validation/TokenDisparity.qmd | 6 +- .../tests/model_validation/ToxicityScore.qmd | 6 +- .../sklearn/AdjustedMutualInformation.qmd | 6 +- .../sklearn/AdjustedRandIndex.qmd | 6 +- .../sklearn/CalibrationCurve.qmd | 7 +- .../sklearn/ClassifierPerformance.qmd | 14 +- .../ClassifierThresholdOptimization.qmd | 16 +- .../sklearn/ClusterCosineSimilarity.qmd | 6 +- .../sklearn/ClusterPerformanceMetrics.qmd | 6 +- .../sklearn/CompletenessScore.qmd | 6 +- .../sklearn/ConfusionMatrix.qmd | 6 +- .../sklearn/FeatureImportance.qmd | 7 +- .../sklearn/FowlkesMallowsScore.qmd | 6 +- .../sklearn/HomogeneityScore.qmd | 6 +- .../sklearn/HyperParametersTuning.qmd | 17 +- .../sklearn/KMeansClustersOptimization.qmd | 7 +- .../sklearn/MinimumAccuracy.qmd | 7 +- .../sklearn/MinimumF1Score.qmd | 7 +- .../sklearn/MinimumROCAUCScore.qmd | 7 +- .../sklearn/ModelParameters.qmd | 6 +- .../sklearn/ModelsPerformanceComparison.qmd | 6 +- .../sklearn/OverfitDiagnosis.qmd | 8 +- .../sklearn/PermutationFeatureImportance.qmd | 8 +- .../sklearn/PopulationStabilityIndex.qmd | 16 +- .../sklearn/PrecisionRecallCurve.qmd | 6 +- .../model_validation/sklearn/ROCCurve.qmd | 6 +- .../sklearn/RegressionErrors.qmd | 6 +- .../sklearn/RegressionErrorsComparison.qmd | 6 +- .../sklearn/RegressionPerformance.qmd | 6 +- .../sklearn/RegressionR2Square.qmd | 6 +- .../sklearn/RegressionR2SquareComparison.qmd | 6 +- .../sklearn/RobustnessDiagnosis.qmd | 9 +- .../sklearn/SHAPGlobalImportance.qmd | 22 +- .../sklearn/ScoreProbabilityAlignment.qmd | 8 +- .../sklearn/SilhouettePlot.qmd | 6 +- .../sklearn/TrainingTestDegradation.qmd | 7 +- .../model_validation/sklearn/VMeasure.qmd | 6 +- .../sklearn/WeakspotsDiagnosis.qmd | 9 +- .../statsmodels/AutoARIMA.qmd | 6 +- .../CumulativePredictionProbabilities.qmd | 7 +- .../statsmodels/DurbinWatsonTest.qmd | 7 +- .../statsmodels/GINITable.qmd | 6 +- .../statsmodels/KolmogorovSmirnov.qmd | 7 +- .../statsmodels/Lilliefors.qmd | 4 +- .../PredictionProbabilitiesHistogram.qmd | 7 +- .../statsmodels/RegressionCoeffs.qmd | 4 +- .../RegressionFeatureSignificance.qmd | 7 +- .../RegressionModelForecastPlot.qmd | 8 +- .../RegressionModelForecastPlotLevels.qmd | 12 +- .../RegressionModelSensitivityPlot.qmd | 14 +- .../statsmodels/RegressionModelSummary.qmd | 6 +- ...RegressionPermutationFeatureImportance.qmd | 8 +- .../statsmodels/ScorecardHistogram.qmd | 7 +- .../statsmodels/statsutils.qmd | 8 +- .../tests/prompt_validation/Bias.qmd | 6 +- .../tests/prompt_validation/Clarity.qmd | 6 +- .../tests/prompt_validation/Conciseness.qmd | 6 +- .../tests/prompt_validation/Delimitation.qmd | 6 +- .../prompt_validation/NegativeInstruction.qmd | 6 +- .../tests/prompt_validation/Robustness.qmd | 7 +- .../tests/prompt_validation/Specificity.qmd | 6 +- .../prompt_validation/ai_powered_test.qmd | 16 +- docs/validmind/unit_metrics.qmd | 16 +- scripts/generate_quarto_docs.py | 58 +- 162 files changed, 291 insertions(+), 2915 deletions(-) delete mode 100644 docs/project_tree create mode 100644 docs/templates/styles.css delete mode 100644 docs/validmind.tree diff --git a/docs/project_tree b/docs/project_tree deleted file mode 100644 index f51eb40bb..000000000 --- a/docs/project_tree +++ /dev/null @@ -1,1219 +0,0 @@ -. -├── LICENSE -├── Makefile -├── README.md -├── README.pypi.md -├── docs -│   ├── _build -│   │   ├── index.html -│   │   ├── search.js -│   │   ├── validmind -│   │   │   ├── __version__.html -│   │   │   ├── datasets -│   │   │   │   ├── classification -│   │   │   │   │   ├── customer_churn.html -│   │   │   │   │   └── taiwan_credit.html -│   │   │   │   ├── classification.html -│   │   │   │   ├── credit_risk -│   │   │   │   │   ├── lending_club.html -│   │   │   │   │   └── lending_club_bias.html -│   │   │   │   ├── credit_risk.html -│   │   │   │   ├── nlp -│   │   │   │   │   ├── cnn_dailymail.html -│   │   │   │   │   └── twitter_covid_19.html -│   │   │   │   ├── nlp.html -│   │   │   │   ├── regression -│   │   │   │   │   ├── fred.html -│   │   │   │   │   └── lending_club.html -│   │   │   │   └── regression.html -│   │   │   ├── datasets.html -│   │   │   ├── errors.html -│   │   │   ├── test_suites -│   │   │   │   ├── classifier.html -│   │   │   │   ├── cluster.html -│   │   │   │   ├── embeddings.html -│   │   │   │   ├── llm.html -│   │   │   │   ├── nlp.html -│   │   │   │   ├── parameters_optimization.html -│   │   │   │   ├── regression.html -│   │   │   │   ├── statsmodels_timeseries.html -│   │   │   │   ├── summarization.html -│   │   │   │   ├── tabular_datasets.html -│   │   │   │   ├── text_data.html -│   │   │   │   └── time_series.html -│   │   │   ├── test_suites.html -│   │   │   ├── tests -│   │   │   │   ├── data_validation -│   │   │   │   │   ├── ACFandPACFPlot.html -│   │   │   │   │   ├── ADF.html -│   │   │   │   │   ├── AutoAR.html -│   │   │   │   │   ├── AutoMA.html -│   │   │   │   │   ├── AutoStationarity.html -│   │   │   │   │   ├── BivariateScatterPlots.html -│   │   │   │   │   ├── BoxPierce.html -│   │   │   │   │   ├── ChiSquaredFeaturesTable.html -│   │   │   │   │   ├── ClassImbalance.html -│   │   │   │   │   ├── DatasetDescription.html -│   │   │   │   │   ├── DatasetSplit.html -│   │   │   │   │   ├── DescriptiveStatistics.html -│   │   │   │   │   ├── DickeyFullerGLS.html -│   │   │   │   │   ├── Duplicates.html -│   │   │   │   │   ├── EngleGrangerCoint.html -│   │   │   │   │   ├── FeatureTargetCorrelationPlot.html -│   │   │   │   │   ├── HighCardinality.html -│   │   │   │   │   ├── HighPearsonCorrelation.html -│   │   │   │   │   ├── IQROutliersBarPlot.html -│   │   │   │   │   ├── IQROutliersTable.html -│   │   │   │   │   ├── IsolationForestOutliers.html -│   │   │   │   │   ├── JarqueBera.html -│   │   │   │   │   ├── KPSS.html -│   │   │   │   │   ├── LJungBox.html -│   │   │   │   │   ├── LaggedCorrelationHeatmap.html -│   │   │   │   │   ├── MissingValues.html -│   │   │   │   │   ├── MissingValuesBarPlot.html -│   │   │   │   │   ├── MutualInformation.html -│   │   │   │   │   ├── PearsonCorrelationMatrix.html -│   │   │   │   │   ├── PhillipsPerronArch.html -│   │   │   │   │   ├── ProtectedClassesCombination.html -│   │   │   │   │   ├── ProtectedClassesDescription.html -│   │   │   │   │   ├── ProtectedClassesDisparity.html -│   │   │   │   │   ├── ProtectedClassesThresholdOptimizer.html -│   │   │   │   │   ├── RollingStatsPlot.html -│   │   │   │   │   ├── RunsTest.html -│   │   │   │   │   ├── ScatterPlot.html -│   │   │   │   │   ├── ScoreBandDefaultRates.html -│   │   │   │   │   ├── SeasonalDecompose.html -│   │   │   │   │   ├── ShapiroWilk.html -│   │   │   │   │   ├── Skewness.html -│   │   │   │   │   ├── SpreadPlot.html -│   │   │   │   │   ├── TabularCategoricalBarPlots.html -│   │   │   │   │   ├── TabularDateTimeHistograms.html -│   │   │   │   │   ├── TabularDescriptionTables.html -│   │   │   │   │   ├── TabularNumericalHistograms.html -│   │   │   │   │   ├── TargetRateBarPlots.html -│   │   │   │   │   ├── TimeSeriesDescription.html -│   │   │   │   │   ├── TimeSeriesDescriptiveStatistics.html -│   │   │   │   │   ├── TimeSeriesFrequency.html -│   │   │   │   │   ├── TimeSeriesHistogram.html -│   │   │   │   │   ├── TimeSeriesLinePlot.html -│   │   │   │   │   ├── TimeSeriesMissingValues.html -│   │   │   │   │   ├── TimeSeriesOutliers.html -│   │   │   │   │   ├── TooManyZeroValues.html -│   │   │   │   │   ├── UniqueRows.html -│   │   │   │   │   ├── WOEBinPlots.html -│   │   │   │   │   ├── WOEBinTable.html -│   │   │   │   │   ├── ZivotAndrewsArch.html -│   │   │   │   │   ├── nlp -│   │   │   │   │   │   ├── CommonWords.html -│   │   │   │   │   │   ├── Hashtags.html -│   │   │   │   │   │   ├── LanguageDetection.html -│   │   │   │   │   │   ├── Mentions.html -│   │   │   │   │   │   ├── PolarityAndSubjectivity.html -│   │   │   │   │   │   ├── Punctuations.html -│   │   │   │   │   │   ├── Sentiment.html -│   │   │   │   │   │   ├── StopWords.html -│   │   │   │   │   │   ├── TextDescription.html -│   │   │   │   │   │   └── Toxicity.html -│   │   │   │   │   └── nlp.html -│   │   │   │   ├── data_validation.html -│   │   │   │   ├── model_validation -│   │   │   │   │   ├── BertScore.html -│   │   │   │   │   ├── BleuScore.html -│   │   │   │   │   ├── ClusterSizeDistribution.html -│   │   │   │   │   ├── ContextualRecall.html -│   │   │   │   │   ├── FeaturesAUC.html -│   │   │   │   │   ├── MeteorScore.html -│   │   │   │   │   ├── ModelMetadata.html -│   │   │   │   │   ├── ModelPredictionResiduals.html -│   │   │   │   │   ├── RegardScore.html -│   │   │   │   │   ├── RegressionResidualsPlot.html -│   │   │   │   │   ├── RougeScore.html -│   │   │   │   │   ├── TimeSeriesPredictionWithCI.html -│   │   │   │   │   ├── TimeSeriesPredictionsPlot.html -│   │   │   │   │   ├── TimeSeriesR2SquareBySegments.html -│   │   │   │   │   ├── TokenDisparity.html -│   │   │   │   │   ├── ToxicityScore.html -│   │   │   │   │   ├── sklearn -│   │   │   │   │   │   ├── AdjustedMutualInformation.html -│   │   │   │   │   │   ├── AdjustedRandIndex.html -│   │   │   │   │   │   ├── CalibrationCurve.html -│   │   │   │   │   │   ├── ClassifierPerformance.html -│   │   │   │   │   │   ├── ClassifierThresholdOptimization.html -│   │   │   │   │   │   ├── ClusterCosineSimilarity.html -│   │   │   │   │   │   ├── ClusterPerformanceMetrics.html -│   │   │   │   │   │   ├── CompletenessScore.html -│   │   │   │   │   │   ├── ConfusionMatrix.html -│   │   │   │   │   │   ├── FeatureImportance.html -│   │   │   │   │   │   ├── FowlkesMallowsScore.html -│   │   │   │   │   │   ├── HomogeneityScore.html -│   │   │   │   │   │   ├── HyperParametersTuning.html -│   │   │   │   │   │   ├── KMeansClustersOptimization.html -│   │   │   │   │   │   ├── MinimumAccuracy.html -│   │   │   │   │   │   ├── MinimumF1Score.html -│   │   │   │   │   │   ├── MinimumROCAUCScore.html -│   │   │   │   │   │   ├── ModelParameters.html -│   │   │   │   │   │   ├── ModelsPerformanceComparison.html -│   │   │   │   │   │   ├── OverfitDiagnosis.html -│   │   │   │   │   │   ├── PermutationFeatureImportance.html -│   │   │   │   │   │   ├── PopulationStabilityIndex.html -│   │   │   │   │   │   ├── PrecisionRecallCurve.html -│   │   │   │   │   │   ├── ROCCurve.html -│   │   │   │   │   │   ├── RegressionErrors.html -│   │   │   │   │   │   ├── RegressionErrorsComparison.html -│   │   │   │   │   │   ├── RegressionPerformance.html -│   │   │   │   │   │   ├── RegressionR2Square.html -│   │   │   │   │   │   ├── RegressionR2SquareComparison.html -│   │   │   │   │   │   ├── RobustnessDiagnosis.html -│   │   │   │   │   │   ├── SHAPGlobalImportance.html -│   │   │   │   │   │   ├── ScoreProbabilityAlignment.html -│   │   │   │   │   │   ├── SilhouettePlot.html -│   │   │   │   │   │   ├── TrainingTestDegradation.html -│   │   │   │   │   │   ├── VMeasure.html -│   │   │   │   │   │   └── WeakspotsDiagnosis.html -│   │   │   │   │   ├── sklearn.html -│   │   │   │   │   ├── statsmodels -│   │   │   │   │   │   ├── AutoARIMA.html -│   │   │   │   │   │   ├── CumulativePredictionProbabilities.html -│   │   │   │   │   │   ├── DurbinWatsonTest.html -│   │   │   │   │   │   ├── GINITable.html -│   │   │   │   │   │   ├── KolmogorovSmirnov.html -│   │   │   │   │   │   ├── Lilliefors.html -│   │   │   │   │   │   ├── PredictionProbabilitiesHistogram.html -│   │   │   │   │   │   ├── RegressionCoeffs.html -│   │   │   │   │   │   ├── RegressionFeatureSignificance.html -│   │   │   │   │   │   ├── RegressionModelForecastPlot.html -│   │   │   │   │   │   ├── RegressionModelForecastPlotLevels.html -│   │   │   │   │   │   ├── RegressionModelSensitivityPlot.html -│   │   │   │   │   │   ├── RegressionModelSummary.html -│   │   │   │   │   │   ├── RegressionPermutationFeatureImportance.html -│   │   │   │   │   │   ├── ScorecardHistogram.html -│   │   │   │   │   │   └── statsutils.html -│   │   │   │   │   └── statsmodels.html -│   │   │   │   ├── model_validation.html -│   │   │   │   ├── prompt_validation -│   │   │   │   │   ├── Bias.html -│   │   │   │   │   ├── Clarity.html -│   │   │   │   │   ├── Conciseness.html -│   │   │   │   │   ├── Delimitation.html -│   │   │   │   │   ├── NegativeInstruction.html -│   │   │   │   │   ├── Robustness.html -│   │   │   │   │   ├── Specificity.html -│   │   │   │   │   └── ai_powered_test.html -│   │   │   │   └── prompt_validation.html -│   │   │   ├── tests.html -│   │   │   ├── unit_metrics.html -│   │   │   └── vm_models.html -│   │   └── validmind.html -│   ├── _sidebar.yml -│   ├── griffe_all.log -│   ├── project_tree -│   ├── templates -│   │   ├── class.qmd.jinja2 -│   │   ├── custom.css -│   │   ├── errors.qmd.jinja2 -│   │   ├── function.qmd.jinja2 -│   │   ├── macros -│   │   │   ├── docstring.jinja2 -│   │   │   ├── navigation.jinja2 -│   │   │   └── types.jinja2 -│   │   ├── module.html.jinja2 -│   │   ├── module.qmd.jinja2 -│   │   ├── sidebar.qmd.jinja2 -│   │   └── template.qmd.jinja2_OLD -│   ├── validmind -│   ├── validmind.json -│   ├── validmind.qmd -│   └── validmind.tree -├── images -│   └── ValidMind-logo-color.svg -├── notebooks -│   ├── README.md -│   ├── code_samples -│   │   ├── capital_markets -│   │   │   ├── quickstart_option_pricing_models.ipynb -│   │   │   └── quickstart_option_pricing_models_quantlib.ipynb -│   │   ├── credit_risk -│   │   │   ├── application_scorecard_demo.ipynb -│   │   │   ├── application_scorecard_executive.ipynb -│   │   │   ├── application_scorecard_full_suite.ipynb -│   │   │   ├── application_scorecard_with_bias.ipynb -│   │   │   ├── application_scorecard_with_ml.ipynb -│   │   │   └── custom_tests -│   │   │   └── ScoreBandDiscriminationMetrics.py -│   │   ├── custom_tests -│   │   │   ├── implement_custom_tests.ipynb -│   │   │   └── integrate_external_test_providers.ipynb -│   │   ├── nlp_and_llm -│   │   │   ├── datasets -│   │   │   │   ├── bbc_text_cls.csv -│   │   │   │   ├── bbc_text_cls_reference.csv -│   │   │   │   ├── cnn_dailymail_100_with_predictions.csv -│   │   │   │   ├── cnn_dailymail_500_with_predictions.csv -│   │   │   │   ├── sentiments.csv -│   │   │   │   └── sentiments_with_predictions.csv -│   │   │   ├── foundation_models_integration_demo.ipynb -│   │   │   ├── foundation_models_summarization_demo.ipynb -│   │   │   ├── hugging_face_integration_demo.ipynb -│   │   │   ├── hugging_face_summarization_demo.ipynb -│   │   │   ├── llm_summarization_demo.ipynb -│   │   │   ├── prompt_validation_demo.ipynb -│   │   │   └── rag_documentation_demo.ipynb -│   │   ├── ongoing_monitoring -│   │   │   ├── application_scorecard_ongoing_monitoring.ipynb -│   │   │   ├── quickstart_customer_churn_ongoing_monitoring.ipynb -│   │   │   └── xgboost_model.model -│   │   ├── quickstart_customer_churn_full_suite.ipynb -│   │   ├── regression -│   │   │   └── quickstart_regression_full_suite.ipynb -│   │   └── time_series -│   │   ├── quickstart_time_series_full_suite.ipynb -│   │   └── quickstart_time_series_high_code.ipynb -│   ├── code_sharing -│   │   ├── clustering -│   │   │   └── quickstart_cluster_demo.ipynb -│   │   ├── credit_risk -│   │   │   └── assign_prediction_probabilities.ipynb -│   │   ├── datasets -│   │   │   ├── bank_customer_churn.csv -│   │   │   ├── lending_club_loan_rates.csv -│   │   │   ├── marketing_lead_conversion.csv -│   │   │   ├── probability_of_default -│   │   │   │   └── Data Dictionary.xlsx -│   │   │   ├── taiwan_credit.csv -│   │   │   └── time_series -│   │   │   ├── fred_loan_rates.csv -│   │   │   ├── fred_loan_rates_test_1.csv -│   │   │   ├── fred_loan_rates_test_2.csv -│   │   │   ├── fred_loan_rates_test_3.csv -│   │   │   ├── fred_loan_rates_test_4.csv -│   │   │   ├── fred_loan_rates_test_5.csv -│   │   │   ├── lending_club_loan_rates.csv -│   │   │   └── raw -│   │   │   └── fred -│   │   │   ├── CPIAUCSL.csv -│   │   │   ├── CSUSHPISA.csv -│   │   │   ├── DRSFRMACBS.csv -│   │   │   ├── FEDFUNDS.csv -│   │   │   ├── GDP.csv -│   │   │   ├── GDPC1.csv -│   │   │   ├── GS10.csv -│   │   │   ├── GS3.csv -│   │   │   ├── GS5.csv -│   │   │   ├── MORTGAGE30US.csv -│   │   │   └── UNRATE.csv -│   │   ├── embeddings -│   │   │   └── quickstart_embeddings_demo.ipynb -│   │   ├── external_tests -│   │   │   └── tests -│   │   │   └── MyIsolationForest.py -│   │   ├── insurance_mortality -│   │   │   ├── insurance_dataset.csv -│   │   │   ├── insurance_validation_demo.ipynb -│   │   │   ├── test_df.csv -│   │   │   ├── train_df.csv -│   │   │   └── validmind_insurance_POC.ipynb -│   │   ├── llm -│   │   │   ├── datasets -│   │   │   │   ├── bbc_text_cls.csv -│   │   │   │   ├── bbc_text_cls_reference.csv -│   │   │   │   ├── rag -│   │   │   │   │   ├── rag_evaluation_dataset_01.csv -│   │   │   │   │   ├── rag_evaluation_dataset_02.csv -│   │   │   │   │   ├── rag_evaluation_dataset_03.csv -│   │   │   │   │   ├── rag_evaluation_results.csv -│   │   │   │   │   ├── rfp_existing_questions_client_1.csv -│   │   │   │   │   ├── rfp_existing_questions_client_2.csv -│   │   │   │   │   ├── rfp_existing_questions_client_3.csv -│   │   │   │   │   ├── rfp_existing_questions_client_4.csv -│   │   │   │   │   ├── rfp_existing_questions_client_5.csv -│   │   │   │   │   ├── rfp_new_questions_client_100.csv -│   │   │   │   │   ├── vendor_contracts_001_020.csv -│   │   │   │   │   ├── vendor_contracts_021_040.csv -│   │   │   │   │   ├── vendor_contracts_041_060.csv -│   │   │   │   │   └── vendor_contracts_questions.csv -│   │   │   │   └── sentiments.csv -│   │   │   ├── llm_descriptions_context.ipynb -│   │   │   ├── rag_llamaindex.ipynb -│   │   │   ├── rag_rfp_answer_generation.ipynb -│   │   │   ├── rag_rfp_answer_generation_langchain.ipynb -│   │   │   ├── rag_rfp_question_similarity.ipynb -│   │   │   ├── rag_vendor_contracts_llamaindex.ipynb -│   │   │   └── vendor_contract_agent -│   │   │   ├── data -│   │   │   │   ├── contracts.json -│   │   │   │   └── vendors.json -│   │   │   ├── genai_vendor_contract_agent_usecase_poc.ipynb -│   │   │   ├── tool_definitions -│   │   │   │   ├── query_database.json -│   │   │   │   └── search_online.json -│   │   │   └── utils.py -│   │   ├── market_basket_analysis -│   │   │   ├── datasets -│   │   │   │   └── mba -│   │   │   │   └── Online Retail.csv -│   │   │   └── mba_poc.ipynb -│   │   ├── operational_deposit -│   │   │   ├── dataset_image.png -│   │   │   ├── datasets -│   │   │   │   └── odm_data_example -│   │   │   │   └── synthetic_data.csv -│   │   │   ├── model_image.png -│   │   │   ├── operational_deposit_poc.ipynb -│   │   │   ├── synthetic_data_generation.ipynb -│   │   │   └── tests -│   │   │   └── TimeseriesGroupbyPlot.py -│   │   ├── output_templates -│   │   │   ├── Screenshot 2024-02-15 at 2.48.03 PM.png -│   │   │   ├── Screenshot 2024-02-15 at 4.51.56 PM.png -│   │   │   └── customizing_tests_with_output_templates.ipynb -│   │   ├── post_processing_functions.ipynb -│   │   ├── r -│   │   │   ├── r_custom_tests.Rmd -│   │   │   ├── r_customer_churn_demo.Rmd -│   │   │   ├── r_customer_churn_demo_xgboost.Rmd -│   │   │   ├── r_mortality_demo.Rmd -│   │   │   ├── r_time_series_data_validation.Rmd -│   │   │   └── r_time_series_model_validation.Rmd -│   │   ├── r_demo -│   │   │   ├── prune_dt.pmml -│   │   │   ├── r-customer-churn-model.ipynb -│   │   │   ├── r-ecm-demo.ipynb -│   │   │   ├── r-ecm-model.ipynb -│   │   │   ├── r-ecm-model.rds -│   │   │   ├── r_churn_test.csv -│   │   │   ├── r_churn_train.csv -│   │   │   ├── r_log_reg_churn_model.rds -│   │   │   └── r_xgb_churn_model.json -│   │   ├── regression -│   │   │   └── regression_unit_metrics.ipynb -│   │   └── test_configuration_updates_demo.ipynb -│   ├── how_to -│   │   ├── configure_dataset_features.ipynb -│   │   ├── dataset_image.png -│   │   ├── document_multiple_results_for_the_same_test.ipynb -│   │   ├── explore_test_suites.ipynb -│   │   ├── explore_tests.ipynb -│   │   ├── filter_input_columns.ipynb -│   │   ├── load_datasets_predictions.ipynb -│   │   ├── log_metrics_over_time.ipynb -│   │   ├── model_image.png -│   │   ├── run_documentation_sections.ipynb -│   │   ├── run_documentation_tests_with_config.ipynb -│   │   ├── run_tests -│   │   │   ├── 1_run_dataset_based_tests.ipynb -│   │   │   └── 2_run_comparison_tests.ipynb -│   │   ├── run_tests_that_require_multiple_datasets.ipynb -│   │   ├── run_unit_metrics.ipynb -│   │   └── use_dataset_model_objects.ipynb -│   ├── images -│   │   ├── add_metric_over_time_block.png -│   │   ├── btc-price-custom-metric.png -│   │   ├── composite-metric-in-template-preview.png -│   │   ├── high-pearson-correlation-block.png -│   │   ├── hyperparameters-custom-metric.png -│   │   ├── image-in-custom-metric.png -│   │   ├── insert-test-driven-block-correlations.png -│   │   ├── insert-test-driven-block-custom-class-imbalance.jpg -│   │   ├── insert-test-driven-block-custom-confusion-matrix.png -│   │   ├── insert-test-driven-block-custom.png -│   │   ├── insert-test-driven-block-test-provider.png -│   │   ├── insert-test-driven-block.png -│   │   ├── log_metric_accuracy.png -│   │   ├── log_metric_auc_1.png -│   │   ├── log_metric_auc_2.png -│   │   ├── log_metric_auc_3.png -│   │   ├── log_metric_auc_4.png -│   │   ├── log_metric_f1.png -│   │   ├── log_metric_precision.png -│   │   ├── log_metric_recall.png -│   │   ├── multiple-tables-plots-custom-metric.png -│   │   ├── my_tests_directory.png -│   │   ├── parameterized-custom-metric.png -│   │   ├── pearson-correlation-matrix-test-output.png -│   │   ├── pearson-correlation-matrix.png -│   │   ├── selecting-composite-metric.png -│   │   └── selecting-high-pearson-correlation-test.png -│   ├── templates -│   │   ├── README.md -│   │   ├── __pycache__ -│   │   │   └── e2e_template.cpython-39.pyc -│   │   ├── about-validmind.ipynb -│   │   ├── e2e-notebook.ipynb -│   │   ├── e2e_template.py -│   │   ├── install-initialize-validmind.ipynb -│   │   ├── next-steps.ipynb -│   │   └── upgrade-validmind.ipynb -│   └── tutorials -│   └── intro_for_model_developers.ipynb -├── poetry.lock -├── pyproject.toml -├── r -│   ├── custom_tests.py -│   └── validmind -│   ├── DESCRIPTION -│   ├── NAMESPACE -│   ├── R -│   │   ├── custom_tests.R -│   │   └── platform.R -│   ├── README.md -│   ├── inst -│   │   └── extdata -│   │   └── child.Rmd -│   ├── man -│   │   ├── build_r_plotly.Rd -│   │   ├── display_report.Rd -│   │   ├── print_summary_tables.Rd -│   │   ├── process_result.Rd -│   │   ├── register_custom_test.Rd -│   │   ├── run_custom_test.Rd -│   │   ├── save_model.Rd -│   │   ├── summarize_metric_result.Rd -│   │   ├── summarize_result.Rd -│   │   ├── summarize_test_result.Rd -│   │   └── vm.Rd -│   └── validmind.Rproj -├── scripts -│   ├── README.md -│   ├── __init__.py -│   ├── api_tree.py -│   ├── bulk_ai_test_updates.py -│   ├── bulk_unit_tests_updates.py -│   ├── check_tests.py -│   ├── copyright.txt -│   ├── copyright_files.py -│   ├── credentials_check.py -│   ├── ensure_clean_notebooks.py -│   ├── extract_descriptions.py -│   ├── format_and_add.sh -│   ├── generate_quarto_docs.py -│   ├── generate_test_id_type.py -│   ├── run_e2e_notebooks.py -│   └── verify_copyright.py -├── tests -│   ├── __init__.py -│   ├── run_test_utils.py -│   ├── test_api_client.py -│   ├── test_client.py -│   ├── test_dataset.py -│   ├── test_framework_init.py -│   ├── test_full_suite.py -│   ├── test_full_suite_nb.py -│   ├── test_unit_tests.py -│   ├── test_validmind_tests_module.py -│   └── unit_tests -│   ├── __init__.py -│   ├── data_validation -│   │   ├── __init__.py -│   │   ├── nlp -│   │   │   ├── test_CommonWords.py -│   │   │   ├── test_LanguageDetection.py -│   │   │   ├── test_PolarityAndSubjectivity.py -│   │   │   ├── test_Punctuations.py -│   │   │   ├── test_Sentiment.py -│   │   │   └── test_Toxicity.py -│   │   ├── test_ACFandPACFPlot.py -│   │   ├── test_ADF.py -│   │   ├── test_AutoAR.py -│   │   ├── test_AutoMA.py -│   │   ├── test_AutoStationarity.py -│   │   ├── test_BivariateScatterPlots.py -│   │   ├── test_BoxPierce.py -│   │   ├── test_ChiSquaredFeaturesTable.py -│   │   ├── test_ClassImbalance.py -│   │   ├── test_DatasetDescription.py -│   │   ├── test_DatasetSplit.py -│   │   ├── test_DescriptiveStatistics.py -│   │   ├── test_DickeyFullerGLS.py -│   │   ├── test_Duplicates.py -│   │   ├── test_EngleGrangerCoint.py -│   │   ├── test_FeatureTargetCorrelationPlot.py -│   │   ├── test_HighCardinality.py -│   │   ├── test_HighPearsonCorrelation.py -│   │   ├── test_IQROutliersBarPlot.py -│   │   ├── test_IQROutliersTable.py -│   │   ├── test_IsolationForestOutliers.py -│   │   ├── test_JarqueBera.py -│   │   ├── test_KPSS.py -│   │   ├── test_LJungBox.py -│   │   ├── test_LaggedCorrelationHeatmap.py -│   │   ├── test_MissingValues.py -│   │   ├── test_MissingValuesBarPlot.py -│   │   ├── test_PearsonCorrelationMatrix.py -│   │   ├── test_PhillipsPerronArch.py -│   │   ├── test_RollingStatsPlot.py -│   │   ├── test_RunsTest.py -│   │   ├── test_ScatterPlot.py -│   │   ├── test_SeasonalDecompose.py -│   │   ├── test_ShapiroWilk.py -│   │   ├── test_Skewness.py -│   │   ├── test_SpreadPlot.py -│   │   ├── test_TabularCategoricalBarPlots.py -│   │   ├── test_TabularDateTimeHistograms.py -│   │   ├── test_TabularDescriptionTables.py -│   │   ├── test_TabularNumericalHistograms.py -│   │   ├── test_TargetRateBarPlots.py -│   │   ├── test_TimeSeriesDescription.py -│   │   ├── test_TimeSeriesDescriptiveStatistics.py -│   │   ├── test_TimeSeriesFrequency.py -│   │   ├── test_TimeSeriesHistogram.py -│   │   ├── test_TimeSeriesLinePlot.py -│   │   ├── test_TimeSeriesMissingValues.py -│   │   ├── test_TimeSeriesOutliers.py -│   │   ├── test_TooManyZeroValues.py -│   │   ├── test_UniqueRows.py -│   │   ├── test_WOEBinPlots.py -│   │   ├── test_WOEBinTable.py -│   │   └── test_ZivotAndrewsArch.py -│   ├── model_validation -│   │   ├── ragas -│   │   │   ├── test_AnswerCorrectness.py -│   │   │   ├── test_AspectCritic.py -│   │   │   ├── test_ContextEntityRecall.py -│   │   │   ├── test_ContextPrecision.py -│   │   │   ├── test_ContextPrecisionWithoutReference.py -│   │   │   ├── test_ContextRecall.py -│   │   │   ├── test_Faithfulness.py -│   │   │   ├── test_NoiseSensitivity.py -│   │   │   ├── test_ResponseRelevancy.py -│   │   │   └── test_SemanticSimilarity.py -│   │   ├── sklearn -│   │   │   ├── test_FeatureImportance.py -│   │   │   ├── test_ROCCurve.py -│   │   │   ├── test_RegressionErrors.py -│   │   │   ├── test_RegressionErrorsComparison.py -│   │   │   ├── test_RegressionR2Square.py -│   │   │   └── test_RegressionR2SquareComparison.py -│   │   ├── statsmodels -│   │   │   ├── test_CumulativePredictionProbabilities.py -│   │   │   ├── test_DurbinWatsonTest.py -│   │   │   ├── test_GINITable.py -│   │   │   ├── test_PredictionProbabilitiesHistogram.py -│   │   │   ├── test_RegressionCoeffs.py -│   │   │   └── test_ScorecardHistogram.py -│   │   ├── test_BertScore.py -│   │   ├── test_BleuScore.py -│   │   ├── test_ContextualRecall.py -│   │   ├── test_MeteorScore.py -│   │   ├── test_ModelMetadata.py -│   │   ├── test_ModelPredictionResiduals.py -│   │   ├── test_RegardScore.py -│   │   ├── test_RougeScore.py -│   │   ├── test_TimeSeriesPredictionWithCI.py -│   │   ├── test_TimeSeriesPredictionsPlot.py -│   │   ├── test_TimeSeriesR2SquareBySegments.py -│   │   ├── test_TokenDisparity.py -│   │   └── test_ToxicityScore.py -│   └── utils.py -└── validmind - ├── __init__.py - ├── __pycache__ - │   ├── __init__.cpython-39.pyc - │   ├── __version__.cpython-39.pyc - │   ├── api_client.cpython-39.pyc - │   ├── client.cpython-39.pyc - │   ├── client_config.cpython-39.pyc - │   ├── errors.cpython-39.pyc - │   ├── input_registry.cpython-39.pyc - │   ├── logging.cpython-39.pyc - │   ├── template.cpython-39.pyc - │   └── utils.cpython-39.pyc - ├── __version__.py - ├── ai - │   ├── __pycache__ - │   │   ├── test_descriptions.cpython-39.pyc - │   │   └── utils.cpython-39.pyc - │   ├── test_descriptions.py - │   └── utils.py - ├── api_client.py - ├── client.py - ├── client_config.py - ├── datasets - │   ├── __init__.py - │   ├── __pycache__ - │   │   └── __init__.cpython-39.pyc - │   ├── classification - │   │   ├── __init__.py - │   │   ├── __pycache__ - │   │   │   ├── __init__.cpython-39.pyc - │   │   │   ├── customer_churn.cpython-39.pyc - │   │   │   └── taiwan_credit.cpython-39.pyc - │   │   ├── customer_churn.py - │   │   ├── datasets - │   │   │   ├── bank_customer_churn.csv - │   │   │   └── taiwan_credit.csv - │   │   └── taiwan_credit.py - │   ├── cluster - │   │   └── digits.py - │   ├── credit_risk - │   │   ├── __init__.py - │   │   ├── __pycache__ - │   │   │   ├── __init__.cpython-39.pyc - │   │   │   ├── lending_club.cpython-39.pyc - │   │   │   └── lending_club_bias.cpython-39.pyc - │   │   ├── datasets - │   │   │   ├── lending_club_biased.csv.gz - │   │   │   └── lending_club_loan_data_2007_2014_clean.csv.gz - │   │   ├── lending_club.py - │   │   └── lending_club_bias.py - │   ├── llm - │   │   └── rag - │   │   ├── __init__.py - │   │   ├── datasets - │   │   │   ├── rfp_existing_questions_client_1.csv - │   │   │   ├── rfp_existing_questions_client_2.csv - │   │   │   ├── rfp_existing_questions_client_3.csv - │   │   │   ├── rfp_existing_questions_client_4.csv - │   │   │   └── rfp_existing_questions_client_5.csv - │   │   └── rfp.py - │   ├── nlp - │   │   ├── __init__.py - │   │   ├── __pycache__ - │   │   │   ├── __init__.cpython-39.pyc - │   │   │   ├── cnn_dailymail.cpython-39.pyc - │   │   │   └── twitter_covid_19.cpython-39.pyc - │   │   ├── cnn_dailymail.py - │   │   ├── datasets - │   │   │   ├── Covid_19.csv - │   │   │   ├── cnn_dailymail_100_with_predictions.csv - │   │   │   ├── cnn_dailymail_500_with_predictions.csv - │   │   │   └── sentiments_with_predictions.csv - │   │   └── twitter_covid_19.py - │   └── regression - │   ├── __init__.py - │   ├── __pycache__ - │   │   ├── __init__.cpython-39.pyc - │   │   ├── california_housing.cpython-39.pyc - │   │   ├── fred.cpython-39.pyc - │   │   ├── fred_timeseries.cpython-39.pyc - │   │   └── lending_club.cpython-39.pyc - │   ├── california_housing.py - │   ├── datasets - │   │   ├── fred - │   │   │   ├── CPIAUCSL.csv - │   │   │   ├── CSUSHPISA.csv - │   │   │   ├── DRSFRMACBS.csv - │   │   │   ├── FEDFUNDS.csv - │   │   │   ├── GDP.csv - │   │   │   ├── GDPC1.csv - │   │   │   ├── GS10.csv - │   │   │   ├── GS3.csv - │   │   │   ├── GS5.csv - │   │   │   ├── MORTGAGE30US.csv - │   │   │   └── UNRATE.csv - │   │   ├── fred_loan_rates.csv - │   │   ├── fred_loan_rates_test_1.csv - │   │   ├── fred_loan_rates_test_2.csv - │   │   ├── fred_loan_rates_test_3.csv - │   │   ├── fred_loan_rates_test_4.csv - │   │   ├── fred_loan_rates_test_5.csv - │   │   └── leanding_club_loan_rates.csv - │   ├── fred.py - │   ├── fred_timeseries.py - │   ├── lending_club.py - │   └── models - │   ├── fred_loan_rates_model_1.pkl - │   ├── fred_loan_rates_model_2.pkl - │   ├── fred_loan_rates_model_3.pkl - │   ├── fred_loan_rates_model_4.pkl - │   └── fred_loan_rates_model_5.pkl - ├── errors.py - ├── html_templates - │   ├── __init__.py - │   ├── __pycache__ - │   │   ├── __init__.cpython-39.pyc - │   │   └── content_blocks.cpython-39.pyc - │   └── content_blocks.py - ├── input_registry.py - ├── logging.py - ├── models - │   ├── __init__.py - │   ├── __pycache__ - │   │   ├── __init__.cpython-39.pyc - │   │   ├── foundation.cpython-39.pyc - │   │   ├── function.cpython-39.pyc - │   │   ├── huggingface.cpython-39.pyc - │   │   ├── metadata.cpython-39.pyc - │   │   ├── pipeline.cpython-39.pyc - │   │   ├── pytorch.cpython-39.pyc - │   │   ├── r_model.cpython-39.pyc - │   │   └── sklearn.cpython-39.pyc - │   ├── foundation.py - │   ├── function.py - │   ├── huggingface.py - │   ├── metadata.py - │   ├── pipeline.py - │   ├── pytorch.py - │   ├── r_model.py - │   └── sklearn.py - ├── template.py - ├── test_suites - │   ├── __init__.py - │   ├── __pycache__ - │   │   ├── __init__.cpython-39.pyc - │   │   ├── classifier.cpython-39.pyc - │   │   ├── cluster.cpython-39.pyc - │   │   ├── embeddings.cpython-39.pyc - │   │   ├── llm.cpython-39.pyc - │   │   ├── nlp.cpython-39.pyc - │   │   ├── parameters_optimization.cpython-39.pyc - │   │   ├── regression.cpython-39.pyc - │   │   ├── statsmodels_timeseries.cpython-39.pyc - │   │   ├── summarization.cpython-39.pyc - │   │   ├── tabular_datasets.cpython-39.pyc - │   │   ├── text_data.cpython-39.pyc - │   │   └── time_series.cpython-39.pyc - │   ├── classifier.py - │   ├── cluster.py - │   ├── embeddings.py - │   ├── llm.py - │   ├── nlp.py - │   ├── parameters_optimization.py - │   ├── regression.py - │   ├── statsmodels_timeseries.py - │   ├── summarization.py - │   ├── tabular_datasets.py - │   ├── text_data.py - │   └── time_series.py - ├── tests - │   ├── __init__.py - │   ├── __pycache__ - │   │   ├── __init__.cpython-39.pyc - │   │   ├── __types__.cpython-39.pyc - │   │   ├── _store.cpython-39.pyc - │   │   ├── comparison.cpython-39.pyc - │   │   ├── decorator.cpython-39.pyc - │   │   ├── load.cpython-39.pyc - │   │   ├── output.cpython-39.pyc - │   │   ├── run.cpython-39.pyc - │   │   ├── test_providers.cpython-39.pyc - │   │   └── utils.cpython-39.pyc - │   ├── __types__.py - │   ├── _store.py - │   ├── comparison.py - │   ├── data_validation - │   │   ├── ACFandPACFPlot.py - │   │   ├── ADF.py - │   │   ├── AutoAR.py - │   │   ├── AutoMA.py - │   │   ├── AutoStationarity.py - │   │   ├── BivariateScatterPlots.py - │   │   ├── BoxPierce.py - │   │   ├── ChiSquaredFeaturesTable.py - │   │   ├── ClassImbalance.py - │   │   ├── DatasetDescription.py - │   │   ├── DatasetSplit.py - │   │   ├── DescriptiveStatistics.py - │   │   ├── DickeyFullerGLS.py - │   │   ├── Duplicates.py - │   │   ├── EngleGrangerCoint.py - │   │   ├── FeatureTargetCorrelationPlot.py - │   │   ├── HighCardinality.py - │   │   ├── HighPearsonCorrelation.py - │   │   ├── IQROutliersBarPlot.py - │   │   ├── IQROutliersTable.py - │   │   ├── IsolationForestOutliers.py - │   │   ├── JarqueBera.py - │   │   ├── KPSS.py - │   │   ├── LJungBox.py - │   │   ├── LaggedCorrelationHeatmap.py - │   │   ├── MissingValues.py - │   │   ├── MissingValuesBarPlot.py - │   │   ├── MutualInformation.py - │   │   ├── PearsonCorrelationMatrix.py - │   │   ├── PhillipsPerronArch.py - │   │   ├── ProtectedClassesCombination.py - │   │   ├── ProtectedClassesDescription.py - │   │   ├── ProtectedClassesDisparity.py - │   │   ├── ProtectedClassesThresholdOptimizer.py - │   │   ├── RollingStatsPlot.py - │   │   ├── RunsTest.py - │   │   ├── ScatterPlot.py - │   │   ├── ScoreBandDefaultRates.py - │   │   ├── SeasonalDecompose.py - │   │   ├── ShapiroWilk.py - │   │   ├── Skewness.py - │   │   ├── SpreadPlot.py - │   │   ├── TabularCategoricalBarPlots.py - │   │   ├── TabularDateTimeHistograms.py - │   │   ├── TabularDescriptionTables.py - │   │   ├── TabularNumericalHistograms.py - │   │   ├── TargetRateBarPlots.py - │   │   ├── TimeSeriesDescription.py - │   │   ├── TimeSeriesDescriptiveStatistics.py - │   │   ├── TimeSeriesFrequency.py - │   │   ├── TimeSeriesHistogram.py - │   │   ├── TimeSeriesLinePlot.py - │   │   ├── TimeSeriesMissingValues.py - │   │   ├── TimeSeriesOutliers.py - │   │   ├── TooManyZeroValues.py - │   │   ├── UniqueRows.py - │   │   ├── WOEBinPlots.py - │   │   ├── WOEBinTable.py - │   │   ├── ZivotAndrewsArch.py - │   │   ├── __init__.py - │   │   ├── __pycache__ - │   │   │   ├── ACFandPACFPlot.cpython-39.pyc - │   │   │   ├── ADF.cpython-39.pyc - │   │   │   ├── AutoAR.cpython-39.pyc - │   │   │   ├── AutoMA.cpython-39.pyc - │   │   │   ├── AutoStationarity.cpython-39.pyc - │   │   │   ├── BivariateScatterPlots.cpython-39.pyc - │   │   │   ├── BoxPierce.cpython-39.pyc - │   │   │   ├── ChiSquaredFeaturesTable.cpython-39.pyc - │   │   │   ├── ClassImbalance.cpython-39.pyc - │   │   │   ├── DatasetDescription.cpython-39.pyc - │   │   │   ├── DatasetSplit.cpython-39.pyc - │   │   │   ├── DescriptiveStatistics.cpython-39.pyc - │   │   │   ├── DickeyFullerGLS.cpython-39.pyc - │   │   │   ├── Duplicates.cpython-39.pyc - │   │   │   ├── EngleGrangerCoint.cpython-39.pyc - │   │   │   ├── FeatureTargetCorrelationPlot.cpython-39.pyc - │   │   │   ├── HighCardinality.cpython-39.pyc - │   │   │   ├── HighPearsonCorrelation.cpython-39.pyc - │   │   │   ├── IQROutliersBarPlot.cpython-39.pyc - │   │   │   ├── IQROutliersTable.cpython-39.pyc - │   │   │   ├── IsolationForestOutliers.cpython-39.pyc - │   │   │   ├── JarqueBera.cpython-39.pyc - │   │   │   ├── KPSS.cpython-39.pyc - │   │   │   ├── LJungBox.cpython-39.pyc - │   │   │   ├── LaggedCorrelationHeatmap.cpython-39.pyc - │   │   │   ├── MissingValues.cpython-39.pyc - │   │   │   ├── MissingValuesBarPlot.cpython-39.pyc - │   │   │   ├── MutualInformation.cpython-39.pyc - │   │   │   ├── PearsonCorrelationMatrix.cpython-39.pyc - │   │   │   ├── PhillipsPerronArch.cpython-39.pyc - │   │   │   ├── ProtectedClassesCombination.cpython-39.pyc - │   │   │   ├── ProtectedClassesDescription.cpython-39.pyc - │   │   │   ├── ProtectedClassesDisparity.cpython-39.pyc - │   │   │   ├── ProtectedClassesThresholdOptimizer.cpython-39.pyc - │   │   │   ├── RollingStatsPlot.cpython-39.pyc - │   │   │   ├── RunsTest.cpython-39.pyc - │   │   │   ├── ScatterPlot.cpython-39.pyc - │   │   │   ├── ScoreBandDefaultRates.cpython-39.pyc - │   │   │   ├── SeasonalDecompose.cpython-39.pyc - │   │   │   ├── ShapiroWilk.cpython-39.pyc - │   │   │   ├── Skewness.cpython-39.pyc - │   │   │   ├── SpreadPlot.cpython-39.pyc - │   │   │   ├── TabularCategoricalBarPlots.cpython-39.pyc - │   │   │   ├── TabularDateTimeHistograms.cpython-39.pyc - │   │   │   ├── TabularDescriptionTables.cpython-39.pyc - │   │   │   ├── TabularNumericalHistograms.cpython-39.pyc - │   │   │   ├── TargetRateBarPlots.cpython-39.pyc - │   │   │   ├── TimeSeriesDescription.cpython-39.pyc - │   │   │   ├── TimeSeriesDescriptiveStatistics.cpython-39.pyc - │   │   │   ├── TimeSeriesFrequency.cpython-39.pyc - │   │   │   ├── TimeSeriesHistogram.cpython-39.pyc - │   │   │   ├── TimeSeriesLinePlot.cpython-39.pyc - │   │   │   ├── TimeSeriesMissingValues.cpython-39.pyc - │   │   │   ├── TimeSeriesOutliers.cpython-39.pyc - │   │   │   ├── TooManyZeroValues.cpython-39.pyc - │   │   │   ├── UniqueRows.cpython-39.pyc - │   │   │   ├── WOEBinPlots.cpython-39.pyc - │   │   │   ├── WOEBinTable.cpython-39.pyc - │   │   │   ├── ZivotAndrewsArch.cpython-39.pyc - │   │   │   └── __init__.cpython-39.pyc - │   │   └── nlp - │   │   ├── CommonWords.py - │   │   ├── Hashtags.py - │   │   ├── LanguageDetection.py - │   │   ├── Mentions.py - │   │   ├── PolarityAndSubjectivity.py - │   │   ├── Punctuations.py - │   │   ├── Sentiment.py - │   │   ├── StopWords.py - │   │   ├── TextDescription.py - │   │   ├── Toxicity.py - │   │   ├── __init__.py - │   │   └── __pycache__ - │   │   ├── CommonWords.cpython-39.pyc - │   │   ├── Hashtags.cpython-39.pyc - │   │   ├── LanguageDetection.cpython-39.pyc - │   │   ├── Mentions.cpython-39.pyc - │   │   ├── PolarityAndSubjectivity.cpython-39.pyc - │   │   ├── Punctuations.cpython-39.pyc - │   │   ├── Sentiment.cpython-39.pyc - │   │   ├── StopWords.cpython-39.pyc - │   │   ├── TextDescription.cpython-39.pyc - │   │   ├── Toxicity.cpython-39.pyc - │   │   └── __init__.cpython-39.pyc - │   ├── decorator.py - │   ├── load.py - │   ├── model_validation - │   │   ├── BertScore.py - │   │   ├── BleuScore.py - │   │   ├── ClusterSizeDistribution.py - │   │   ├── ContextualRecall.py - │   │   ├── FeaturesAUC.py - │   │   ├── MeteorScore.py - │   │   ├── ModelMetadata.py - │   │   ├── ModelPredictionResiduals.py - │   │   ├── RegardScore.py - │   │   ├── RegressionResidualsPlot.py - │   │   ├── RougeScore.py - │   │   ├── TimeSeriesPredictionWithCI.py - │   │   ├── TimeSeriesPredictionsPlot.py - │   │   ├── TimeSeriesR2SquareBySegments.py - │   │   ├── TokenDisparity.py - │   │   ├── ToxicityScore.py - │   │   ├── __init__.py - │   │   ├── __pycache__ - │   │   │   ├── BertScore.cpython-39.pyc - │   │   │   ├── BleuScore.cpython-39.pyc - │   │   │   ├── ClusterSizeDistribution.cpython-39.pyc - │   │   │   ├── ContextualRecall.cpython-39.pyc - │   │   │   ├── FeaturesAUC.cpython-39.pyc - │   │   │   ├── MeteorScore.cpython-39.pyc - │   │   │   ├── ModelMetadata.cpython-39.pyc - │   │   │   ├── ModelPredictionResiduals.cpython-39.pyc - │   │   │   ├── RegardScore.cpython-39.pyc - │   │   │   ├── RegressionResidualsPlot.cpython-39.pyc - │   │   │   ├── RougeScore.cpython-39.pyc - │   │   │   ├── TimeSeriesPredictionWithCI.cpython-39.pyc - │   │   │   ├── TimeSeriesPredictionsPlot.cpython-39.pyc - │   │   │   ├── TimeSeriesR2SquareBySegments.cpython-39.pyc - │   │   │   ├── TokenDisparity.cpython-39.pyc - │   │   │   ├── ToxicityScore.cpython-39.pyc - │   │   │   └── __init__.cpython-39.pyc - │   │   ├── embeddings - │   │   │   ├── ClusterDistribution.py - │   │   │   ├── CosineSimilarityComparison.py - │   │   │   ├── CosineSimilarityDistribution.py - │   │   │   ├── CosineSimilarityHeatmap.py - │   │   │   ├── DescriptiveAnalytics.py - │   │   │   ├── EmbeddingsVisualization2D.py - │   │   │   ├── EuclideanDistanceComparison.py - │   │   │   ├── EuclideanDistanceHeatmap.py - │   │   │   ├── PCAComponentsPairwisePlots.py - │   │   │   ├── StabilityAnalysisKeyword.py - │   │   │   ├── StabilityAnalysisRandomNoise.py - │   │   │   ├── StabilityAnalysisSynonyms.py - │   │   │   ├── StabilityAnalysisTranslation.py - │   │   │   ├── TSNEComponentsPairwisePlots.py - │   │   │   └── utils.py - │   │   ├── ragas - │   │   │   ├── AnswerCorrectness.py - │   │   │   ├── AspectCritic.py - │   │   │   ├── ContextEntityRecall.py - │   │   │   ├── ContextPrecision.py - │   │   │   ├── ContextPrecisionWithoutReference.py - │   │   │   ├── ContextRecall.py - │   │   │   ├── Faithfulness.py - │   │   │   ├── NoiseSensitivity.py - │   │   │   ├── ResponseRelevancy.py - │   │   │   ├── SemanticSimilarity.py - │   │   │   └── utils.py - │   │   ├── sklearn - │   │   │   ├── AdjustedMutualInformation.py - │   │   │   ├── AdjustedRandIndex.py - │   │   │   ├── CalibrationCurve.py - │   │   │   ├── ClassifierPerformance.py - │   │   │   ├── ClassifierThresholdOptimization.py - │   │   │   ├── ClusterCosineSimilarity.py - │   │   │   ├── ClusterPerformanceMetrics.py - │   │   │   ├── CompletenessScore.py - │   │   │   ├── ConfusionMatrix.py - │   │   │   ├── FeatureImportance.py - │   │   │   ├── FowlkesMallowsScore.py - │   │   │   ├── HomogeneityScore.py - │   │   │   ├── HyperParametersTuning.py - │   │   │   ├── KMeansClustersOptimization.py - │   │   │   ├── MinimumAccuracy.py - │   │   │   ├── MinimumF1Score.py - │   │   │   ├── MinimumROCAUCScore.py - │   │   │   ├── ModelParameters.py - │   │   │   ├── ModelsPerformanceComparison.py - │   │   │   ├── OverfitDiagnosis.py - │   │   │   ├── PermutationFeatureImportance.py - │   │   │   ├── PopulationStabilityIndex.py - │   │   │   ├── PrecisionRecallCurve.py - │   │   │   ├── ROCCurve.py - │   │   │   ├── RegressionErrors.py - │   │   │   ├── RegressionErrorsComparison.py - │   │   │   ├── RegressionPerformance.py - │   │   │   ├── RegressionR2Square.py - │   │   │   ├── RegressionR2SquareComparison.py - │   │   │   ├── RobustnessDiagnosis.py - │   │   │   ├── SHAPGlobalImportance.py - │   │   │   ├── ScoreProbabilityAlignment.py - │   │   │   ├── SilhouettePlot.py - │   │   │   ├── TrainingTestDegradation.py - │   │   │   ├── VMeasure.py - │   │   │   ├── WeakspotsDiagnosis.py - │   │   │   ├── __init__.py - │   │   │   └── __pycache__ - │   │   │   ├── AdjustedMutualInformation.cpython-39.pyc - │   │   │   ├── AdjustedRandIndex.cpython-39.pyc - │   │   │   ├── CalibrationCurve.cpython-39.pyc - │   │   │   ├── ClassifierPerformance.cpython-39.pyc - │   │   │   ├── ClassifierThresholdOptimization.cpython-39.pyc - │   │   │   ├── ClusterCosineSimilarity.cpython-39.pyc - │   │   │   ├── ClusterPerformanceMetrics.cpython-39.pyc - │   │   │   ├── CompletenessScore.cpython-39.pyc - │   │   │   ├── ConfusionMatrix.cpython-39.pyc - │   │   │   ├── FeatureImportance.cpython-39.pyc - │   │   │   ├── FowlkesMallowsScore.cpython-39.pyc - │   │   │   ├── HomogeneityScore.cpython-39.pyc - │   │   │   ├── HyperParametersTuning.cpython-39.pyc - │   │   │   ├── KMeansClustersOptimization.cpython-39.pyc - │   │   │   ├── MinimumAccuracy.cpython-39.pyc - │   │   │   ├── MinimumF1Score.cpython-39.pyc - │   │   │   ├── MinimumROCAUCScore.cpython-39.pyc - │   │   │   ├── ModelParameters.cpython-39.pyc - │   │   │   ├── ModelsPerformanceComparison.cpython-39.pyc - │   │   │   ├── OverfitDiagnosis.cpython-39.pyc - │   │   │   ├── PermutationFeatureImportance.cpython-39.pyc - │   │   │   ├── PopulationStabilityIndex.cpython-39.pyc - │   │   │   ├── PrecisionRecallCurve.cpython-39.pyc - │   │   │   ├── ROCCurve.cpython-39.pyc - │   │   │   ├── RegressionErrors.cpython-39.pyc - │   │   │   ├── RegressionErrorsComparison.cpython-39.pyc - │   │   │   ├── RegressionPerformance.cpython-39.pyc - │   │   │   ├── RegressionR2Square.cpython-39.pyc - │   │   │   ├── RegressionR2SquareComparison.cpython-39.pyc - │   │   │   ├── RobustnessDiagnosis.cpython-39.pyc - │   │   │   ├── SHAPGlobalImportance.cpython-39.pyc - │   │   │   ├── ScoreProbabilityAlignment.cpython-39.pyc - │   │   │   ├── SilhouettePlot.cpython-39.pyc - │   │   │   ├── TrainingTestDegradation.cpython-39.pyc - │   │   │   ├── VMeasure.cpython-39.pyc - │   │   │   ├── WeakspotsDiagnosis.cpython-39.pyc - │   │   │   └── __init__.cpython-39.pyc - │   │   └── statsmodels - │   │   ├── AutoARIMA.py - │   │   ├── CumulativePredictionProbabilities.py - │   │   ├── DurbinWatsonTest.py - │   │   ├── GINITable.py - │   │   ├── KolmogorovSmirnov.py - │   │   ├── Lilliefors.py - │   │   ├── PredictionProbabilitiesHistogram.py - │   │   ├── RegressionCoeffs.py - │   │   ├── RegressionFeatureSignificance.py - │   │   ├── RegressionModelForecastPlot.py - │   │   ├── RegressionModelForecastPlotLevels.py - │   │   ├── RegressionModelSensitivityPlot.py - │   │   ├── RegressionModelSummary.py - │   │   ├── RegressionPermutationFeatureImportance.py - │   │   ├── ScorecardHistogram.py - │   │   ├── __init__.py - │   │   ├── __pycache__ - │   │   │   ├── AutoARIMA.cpython-39.pyc - │   │   │   ├── CumulativePredictionProbabilities.cpython-39.pyc - │   │   │   ├── DurbinWatsonTest.cpython-39.pyc - │   │   │   ├── GINITable.cpython-39.pyc - │   │   │   ├── KolmogorovSmirnov.cpython-39.pyc - │   │   │   ├── Lilliefors.cpython-39.pyc - │   │   │   ├── PredictionProbabilitiesHistogram.cpython-39.pyc - │   │   │   ├── RegressionCoeffs.cpython-39.pyc - │   │   │   ├── RegressionFeatureSignificance.cpython-39.pyc - │   │   │   ├── RegressionModelForecastPlot.cpython-39.pyc - │   │   │   ├── RegressionModelForecastPlotLevels.cpython-39.pyc - │   │   │   ├── RegressionModelSensitivityPlot.cpython-39.pyc - │   │   │   ├── RegressionModelSummary.cpython-39.pyc - │   │   │   ├── RegressionPermutationFeatureImportance.cpython-39.pyc - │   │   │   ├── ScorecardHistogram.cpython-39.pyc - │   │   │   ├── __init__.cpython-39.pyc - │   │   │   └── statsutils.cpython-39.pyc - │   │   └── statsutils.py - │   ├── ongoing_monitoring - │   │   ├── CalibrationCurveDrift.py - │   │   ├── ClassDiscriminationDrift.py - │   │   ├── ClassImbalanceDrift.py - │   │   ├── ClassificationAccuracyDrift.py - │   │   ├── ConfusionMatrixDrift.py - │   │   ├── CumulativePredictionProbabilitiesDrift.py - │   │   ├── FeatureDrift.py - │   │   ├── PredictionAcrossEachFeature.py - │   │   ├── PredictionCorrelation.py - │   │   ├── PredictionProbabilitiesHistogramDrift.py - │   │   ├── PredictionQuantilesAcrossFeatures.py - │   │   ├── ROCCurveDrift.py - │   │   ├── ScoreBandsDrift.py - │   │   ├── ScorecardHistogramDrift.py - │   │   └── TargetPredictionDistributionPlot.py - │   ├── output.py - │   ├── prompt_validation - │   │   ├── Bias.py - │   │   ├── Clarity.py - │   │   ├── Conciseness.py - │   │   ├── Delimitation.py - │   │   ├── NegativeInstruction.py - │   │   ├── Robustness.py - │   │   ├── Specificity.py - │   │   ├── __init__.py - │   │   ├── __pycache__ - │   │   │   ├── Bias.cpython-39.pyc - │   │   │   ├── Clarity.cpython-39.pyc - │   │   │   ├── Conciseness.cpython-39.pyc - │   │   │   ├── Delimitation.cpython-39.pyc - │   │   │   ├── NegativeInstruction.cpython-39.pyc - │   │   │   ├── Robustness.cpython-39.pyc - │   │   │   ├── Specificity.cpython-39.pyc - │   │   │   ├── __init__.cpython-39.pyc - │   │   │   └── ai_powered_test.cpython-39.pyc - │   │   └── ai_powered_test.py - │   ├── run.py - │   ├── test_providers.py - │   └── utils.py - ├── unit_metrics - │   ├── __init__.py - │   ├── __pycache__ - │   │   └── __init__.cpython-39.pyc - │   ├── classification - │   │   ├── Accuracy.py - │   │   ├── F1.py - │   │   ├── Precision.py - │   │   ├── ROC_AUC.py - │   │   └── Recall.py - │   └── regression - │   ├── AdjustedRSquaredScore.py - │   ├── GiniCoefficient.py - │   ├── HuberLoss.py - │   ├── KolmogorovSmirnovStatistic.py - │   ├── MeanAbsoluteError.py - │   ├── MeanAbsolutePercentageError.py - │   ├── MeanBiasDeviation.py - │   ├── MeanSquaredError.py - │   ├── QuantileLoss.py - │   ├── RSquaredScore.py - │   └── RootMeanSquaredError.py - ├── utils.py - └── vm_models - ├── __init__.py - ├── __pycache__ - │   ├── __init__.cpython-39.pyc - │   ├── figure.cpython-39.pyc - │   ├── input.cpython-39.pyc - │   └── model.cpython-39.pyc - ├── dataset - │   ├── __init__.py - │   ├── __pycache__ - │   │   ├── __init__.cpython-39.pyc - │   │   ├── dataset.cpython-39.pyc - │   │   └── utils.cpython-39.pyc - │   ├── dataset.py - │   └── utils.py - ├── figure.py - ├── input.py - ├── model.py - ├── result - │   ├── __init__.py - │   ├── __pycache__ - │   │   ├── __init__.cpython-39.pyc - │   │   ├── result.cpython-39.pyc - │   │   └── utils.cpython-39.pyc - │   ├── result.jinja - │   ├── result.py - │   └── utils.py - └── test_suite - ├── __init__.py - ├── __pycache__ - │   ├── runner.cpython-39.pyc - │   ├── summary.cpython-39.pyc - │   ├── test.cpython-39.pyc - │   └── test_suite.cpython-39.pyc - ├── runner.py - ├── summary.py - ├── test.py - └── test_suite.py - -141 directories, 1076 files diff --git a/docs/templates/function.qmd.jinja2 b/docs/templates/function.qmd.jinja2 index c9136cf7c..01f011648 100644 --- a/docs/templates/function.qmd.jinja2 +++ b/docs/templates/function.qmd.jinja2 @@ -3,13 +3,17 @@ ## {{ member_name | default(member.name) }}[()]{.muted} -```python -def {{ member.name }}{% if member.parameters|length <= 1 %}({% for param in member.parameters %}{{ param.name }}{% if param.annotation %}: {{ param.annotation['name'] if param.annotation is mapping and 'name' in param.annotation else param.annotation }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% endfor %}){% else %}( -{% for param in member.parameters %} {{ param.name }}{% if param.annotation %}: {{ param.annotation['name'] if param.annotation is mapping and 'name' in param.annotation else param.annotation }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %}, -{% endif %}{% endfor %}){% endif %}{% if member.returns %} -> {{ member.returns['name'] if member.returns is mapping and 'name' in member.returns else member.returns }}{% endif %}: -``` +::: {.signature} + +def {{ member.name }}{% if member.parameters|length <= 1 %}({{ member.parameters[0].name if member.parameters }}{% if member.parameters and member.parameters[0].annotation %}: {{ member.parameters[0].annotation['name'] if member.parameters[0].annotation is mapping and 'name' in member.parameters[0].annotation else member.parameters[0].annotation }}{% endif %}{% if member.parameters and member.parameters[0].default is not none %} = {{ member.parameters[0].default }}{% endif %}){% else %}( +{%- for param in member.parameters %} + {{ param.name }}{% if param.annotation %}: {{ param.annotation['name'] if param.annotation is mapping and 'name' in param.annotation else param.annotation }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %},{% endif -%} +{% endfor %} +){% endif %}{% if member.returns %} -> {{ member.returns['name'] if member.returns is mapping and 'name' in member.returns else member.returns }}{% endif %}: + +::: {% if member.docstring %} {{ doc.format_docstring(member.docstring) }} {% endif %} -{% endif %} \ No newline at end of file +{% endif -%} \ No newline at end of file diff --git a/docs/templates/styles.css b/docs/templates/styles.css new file mode 100644 index 000000000..56cad028b --- /dev/null +++ b/docs/templates/styles.css @@ -0,0 +1,32 @@ +.code-block { + font-family: 'JetBrains Mono', 'Fira Code', Menlo, Monaco, 'Courier New', monospace; + background-color: #f8f8f8; + border: 1px solid #ddd; + border-radius: 4px; + padding: 1em; + margin: 1em 0; + white-space: pre; + overflow-x: auto; + font-size: 0.9em; + line-height: 1.5; +} + +.code-block .kw { + color: #0000FF; /* Python keyword color */ +} + +.code-block .name { + color: #795E26; /* Function name color */ +} + +.code-block .n { + color: #0550AE; /* Parameter name color */ +} + +.code-block .ann { + color: #267F99; /* Type annotation color */ +} + +.code-block .default { + color: #098658; /* Default value color */ +} \ No newline at end of file diff --git a/docs/validmind.tree b/docs/validmind.tree deleted file mode 100644 index d12874a88..000000000 --- a/docs/validmind.tree +++ /dev/null @@ -1,588 +0,0 @@ -validmind (* = docstring) -├── RawData (alias) -> validmind.vm_models.result.RawData* -├── get_test_suite (alias) -> validmind.client.get_test_suite* -├── init (alias) -> validmind.api_client.init* -├── init_dataset (alias) -> validmind.client.init_dataset* -├── init_model (alias) -> validmind.client.init_model* -├── init_r_model (alias) -> validmind.client.init_r_model* -├── log_metric (alias) -> validmind.api_client.log_metric* -├── preview_template (alias) -> validmind.client.preview_template* -├── print_env (alias) -> validmind.tests.run.print_env -├── reload (alias) -> validmind.api_client.reload* -├── run_documentation_tests (alias) -> validmind.client.run_documentation_tests* -├── run_test_suite (alias) -> validmind.client.run_test_suite* -├── tags (alias) -> validmind.tests.decorator.tags* -├── tasks (alias) -> validmind.tests.decorator.tasks* -├── test (alias) -> validmind.tests.decorator.test* -├── datasets (module)* -│ ├── classification (module)* -│ │ ├── customer_churn (module) -│ │ │ ├── get_demo_test_config (function)* -│ │ │ ├── load_data (function) -│ │ │ └── preprocess (function) -│ │ └── taiwan_credit (module) -│ │ ├── load_data (function) -│ │ └── preprocess (function) -│ ├── credit_risk (module)* -│ │ ├── lending_club (module) -│ │ │ ├── compute_scores (function) -│ │ │ ├── feature_engineering (function) -│ │ │ ├── get_demo_test_config (function)* -│ │ │ ├── init_vm_objects (function) -│ │ │ ├── load_data (function)* -│ │ │ ├── load_scorecard (function) -│ │ │ ├── load_test_config (function) -│ │ │ ├── preprocess (function) -│ │ │ ├── split (function)* -│ │ │ └── woe_encoding (function) -│ │ └── lending_club_bias (module) -│ │ ├── compute_scores (function) -│ │ ├── load_data (function)* -│ │ ├── preprocess (function) -│ │ └── split (function) -│ ├── nlp (module)* -│ │ ├── cnn_dailymail (module) -│ │ │ ├── display_nice (function)* -│ │ │ └── load_data (function)* -│ │ └── twitter_covid_19 (module) -│ │ └── load_data (function) -│ └── regression (module)* -│ ├── california_housing (module) -│ │ ├── load_data (function) -│ │ └── preprocess (function) -│ ├── fred (module) -│ │ ├── load_all_data (function) -│ │ ├── load_data (function) -│ │ ├── load_model (function) -│ │ ├── load_processed_data (function) -│ │ ├── load_test_dataset (function) -│ │ ├── load_train_dataset (function) -│ │ ├── preprocess (function)* -│ │ └── transform (function) -│ ├── fred_timeseries (module) -│ │ ├── align_date_range (function) -│ │ ├── convert_to_levels (function)* -│ │ ├── get_common_date_range (function) -│ │ ├── get_demo_test_config (function) -│ │ └── load_data (function) -│ └── lending_club (module) -│ ├── load_data (function) -│ ├── preprocess (function)* -│ └── transform (function) -├── errors (module)* -│ ├── raise_api_error (function)* -│ ├── should_raise_on_fail_fast (function)* -│ ├── APIRequestError (class)* -│ ├── BaseError (class) -│ │ ├── __init__ (function) -│ │ └── description (function) -│ ├── GetTestSuiteError (class)* -│ ├── InitializeTestSuiteError (class)* -│ ├── InvalidAPICredentialsError (class) -│ │ └── description (function) -│ ├── InvalidContentIdPrefixError (class)* -│ ├── InvalidInputError (class)* -│ ├── InvalidMetricResultsError (class)* -│ ├── InvalidProjectError (class) -│ │ └── description (function) -│ ├── InvalidRequestBodyError (class)* -│ ├── InvalidTestParametersError (class)* -│ ├── InvalidTestResultsError (class)* -│ ├── InvalidTextObjectError (class)* -│ ├── InvalidValueFormatterError (class)* -│ ├── InvalidXGBoostTrainedModelError (class)* -│ ├── LoadTestError (class)* -│ │ └── __init__ (function) -│ ├── MismatchingClassLabelsError (class)* -│ ├── MissingAPICredentialsError (class) -│ │ └── description (function) -│ ├── MissingCacheResultsArgumentsError (class)* -│ ├── MissingClassLabelError (class)* -│ ├── MissingDependencyError (class)* -│ │ └── __init__ (function)* -│ ├── MissingDocumentationTemplate (class)* -│ ├── MissingModelIdError (class) -│ │ └── description (function) -│ ├── MissingOrInvalidModelPredictFnError (class)* -│ ├── MissingRExtrasError (class)* -│ │ └── description (function) -│ ├── MissingRequiredTestInputError (class)* -│ ├── MissingTextContentIdError (class)* -│ ├── MissingTextContentsError (class)* -│ ├── SkipTestError (class)* -│ ├── TestInputInvalidDatasetError (class)* -│ ├── UnsupportedColumnTypeError (class)* -│ ├── UnsupportedDatasetError (class)* -│ ├── UnsupportedFigureError (class)* -│ ├── UnsupportedModelError (class)* -│ ├── UnsupportedModelForSHAPError (class)* -│ └── UnsupportedRModelError (class)* -├── test_suites (module)* -│ ├── describe_suite (function)* -│ ├── get_by_id (function)* -│ ├── list_suites (function)* -│ ├── register_test_suite (function)* -│ ├── classifier (module)* -│ │ ├── ClassifierDiagnosis (class)* -│ │ ├── ClassifierFullSuite (class)* -│ │ ├── ClassifierMetrics (class)* -│ │ ├── ClassifierModelValidation (class)* -│ │ └── ClassifierPerformance (class)* -│ ├── cluster (module)* -│ │ ├── ClusterFullSuite (class)* -│ │ ├── ClusterMetrics (class)* -│ │ └── ClusterPerformance (class)* -│ ├── embeddings (module)* -│ │ ├── EmbeddingsFullSuite (class)* -│ │ ├── EmbeddingsMetrics (class)* -│ │ └── EmbeddingsPerformance (class)* -│ ├── llm (module)* -│ │ ├── LLMClassifierFullSuite (class)* -│ │ └── PromptValidation (class)* -│ ├── nlp (module)* -│ │ └── NLPClassifierFullSuite (class)* -│ ├── parameters_optimization (module)* -│ │ └── KmeansParametersOptimization (class)* -│ ├── regression (module) -│ │ ├── RegressionFullSuite (class)* -│ │ ├── RegressionMetrics (class)* -│ │ └── RegressionPerformance (class)* -│ ├── statsmodels_timeseries (module)* -│ │ ├── RegressionModelDescription (class)* -│ │ └── RegressionModelsEvaluation (class)* -│ ├── summarization (module)* -│ │ └── SummarizationMetrics (class)* -│ ├── tabular_datasets (module)* -│ │ ├── TabularDataQuality (class)* -│ │ ├── TabularDataset (class)* -│ │ └── TabularDatasetDescription (class)* -│ ├── text_data (module)* -│ │ └── TextDataQuality (class)* -│ └── time_series (module)* -│ ├── TimeSeriesDataQuality (class)* -│ ├── TimeSeriesDataset (class)* -│ ├── TimeSeriesModelValidation (class)* -│ ├── TimeSeriesMultivariate (class)* -│ └── TimeSeriesUnivariate (class)* -├── tests (module)* -│ ├── register_test_provider (function)* -│ ├── comparison (module) -│ │ ├── combine_results (function)* -│ │ └── get_comparison_test_configs (function)* -│ ├── decorator (module)* -│ │ ├── tags (function)* -│ │ ├── tasks (function)* -│ │ └── test (function)* -│ ├── load (module)* -│ │ ├── describe_test (function)* -│ │ ├── list_tags (function)* -│ │ ├── list_tasks (function)* -│ │ ├── list_tasks_and_tags (function)* -│ │ ├── list_tests (function)* -│ │ └── load_test (function)* -│ ├── output (module) -│ │ ├── process_output (function)* -│ │ ├── BooleanOutputHandler (class) -│ │ │ ├── can_handle (function) -│ │ │ └── process (function) -│ │ ├── FigureOutputHandler (class) -│ │ │ ├── can_handle (function) -│ │ │ └── process (function) -│ │ ├── MetricOutputHandler (class) -│ │ │ ├── can_handle (function) -│ │ │ └── process (function) -│ │ ├── OutputHandler (class)* -│ │ │ ├── can_handle (function)* -│ │ │ └── process (function)* -│ │ ├── RawDataOutputHandler (class) -│ │ │ ├── can_handle (function) -│ │ │ └── process (function) -│ │ └── TableOutputHandler (class) -│ │ ├── can_handle (function) -│ │ └── process (function) -│ ├── run (module) -│ │ ├── build_test_result (function)* -│ │ ├── print_env (function) -│ │ └── run_test (function)* -│ ├── test_providers (module) -│ │ ├── LocalTestProvider (class)* -│ │ │ ├── __init__ (function)* -│ │ │ ├── list_tests (function)* -│ │ │ └── load_test (function)* -│ │ ├── TestProvider (class)* -│ │ │ ├── list_tests (function)* -│ │ │ └── load_test (function)* -│ │ └── ValidMindTestProvider (class)* -│ │ ├── __init__ (function) -│ │ ├── list_tests (function)* -│ │ └── load_test (function)* -│ ├── data_validation (module) -│ │ ├── ACFandPACFPlot (module) -│ │ │ └── ACFandPACFPlot (function)* -│ │ ├── ADF (module) -│ │ │ └── ADF (function)* -│ │ ├── AutoAR (module) -│ │ │ └── AutoAR (function)* -│ │ ├── AutoMA (module) -│ │ │ └── AutoMA (function)* -│ │ ├── AutoStationarity (module) -│ │ │ └── AutoStationarity (function)* -│ │ ├── BivariateScatterPlots (module) -│ │ │ └── BivariateScatterPlots (function)* -│ │ ├── BoxPierce (module) -│ │ │ └── BoxPierce (function)* -│ │ ├── ChiSquaredFeaturesTable (module) -│ │ │ └── ChiSquaredFeaturesTable (function)* -│ │ ├── ClassImbalance (module)* -│ │ │ └── ClassImbalance (function)* -│ │ ├── DatasetDescription (module) -│ │ │ ├── DatasetDescription (function)* -│ │ │ ├── describe_column (function)* -│ │ │ ├── get_column_histograms (function)* -│ │ │ ├── get_numerical_histograms (function)* -│ │ │ └── infer_datatypes (function) -│ │ ├── DatasetSplit (module) -│ │ │ └── DatasetSplit (function)* -│ │ ├── DescriptiveStatistics (module) -│ │ │ ├── DescriptiveStatistics (function)* -│ │ │ ├── get_summary_statistics_categorical (function) -│ │ │ └── get_summary_statistics_numerical (function) -│ │ ├── DickeyFullerGLS (module) -│ │ │ └── DickeyFullerGLS (function)* -│ │ ├── Duplicates (module) -│ │ │ └── Duplicates (function)* -│ │ ├── EngleGrangerCoint (module) -│ │ │ └── EngleGrangerCoint (function)* -│ │ ├── FeatureTargetCorrelationPlot (module) -│ │ │ └── FeatureTargetCorrelationPlot (function)* -│ │ ├── HighCardinality (module) -│ │ │ └── HighCardinality (function)* -│ │ ├── HighPearsonCorrelation (module) -│ │ │ └── HighPearsonCorrelation (function)* -│ │ ├── IQROutliersBarPlot (module) -│ │ │ ├── IQROutliersBarPlot (function)* -│ │ │ └── compute_outliers (function) -│ │ ├── IQROutliersTable (module) -│ │ │ ├── IQROutliersTable (function)* -│ │ │ └── compute_outliers (function) -│ │ ├── IsolationForestOutliers (module) -│ │ │ └── IsolationForestOutliers (function)* -│ │ ├── JarqueBera (module) -│ │ │ └── JarqueBera (function)* -│ │ ├── KPSS (module) -│ │ │ └── KPSS (function)* -│ │ ├── LJungBox (module) -│ │ │ └── LJungBox (function)* -│ │ ├── LaggedCorrelationHeatmap (module) -│ │ │ └── LaggedCorrelationHeatmap (function)* -│ │ ├── MissingValues (module) -│ │ │ └── MissingValues (function)* -│ │ ├── MissingValuesBarPlot (module) -│ │ │ └── MissingValuesBarPlot (function)* -│ │ ├── MutualInformation (module) -│ │ │ └── MutualInformation (function)* -│ │ ├── PearsonCorrelationMatrix (module) -│ │ │ └── PearsonCorrelationMatrix (function)* -│ │ ├── PhillipsPerronArch (module) -│ │ │ └── PhillipsPerronArch (function)* -│ │ ├── ProtectedClassesCombination (module) -│ │ │ └── ProtectedClassesCombination (function)* -│ │ ├── ProtectedClassesDescription (module) -│ │ │ └── ProtectedClassesDescription (function)* -│ │ ├── ProtectedClassesDisparity (module) -│ │ │ └── ProtectedClassesDisparity (function)* -│ │ ├── ProtectedClassesThresholdOptimizer (module) -│ │ │ ├── ProtectedClassesThresholdOptimizer (function)* -│ │ │ ├── calculate_fairness_metrics (function) -│ │ │ ├── calculate_group_metrics (function) -│ │ │ ├── get_thresholds_by_group (function) -│ │ │ ├── initialize_and_fit_optimizer (function) -│ │ │ ├── make_predictions (function) -│ │ │ └── plot_thresholds (function) -│ │ ├── RollingStatsPlot (module) -│ │ │ ├── RollingStatsPlot (function)* -│ │ │ └── plot_rolling_statistics (function) -│ │ ├── RunsTest (module) -│ │ │ └── RunsTest (function)* -│ │ ├── ScatterPlot (module) -│ │ │ └── ScatterPlot (function)* -│ │ ├── ScoreBandDefaultRates (module) -│ │ │ └── ScoreBandDefaultRates (function)* -│ │ ├── SeasonalDecompose (module) -│ │ │ └── SeasonalDecompose (function)* -│ │ ├── ShapiroWilk (module) -│ │ │ └── ShapiroWilk (function)* -│ │ ├── Skewness (module) -│ │ │ └── Skewness (function)* -│ │ ├── SpreadPlot (module) -│ │ │ └── SpreadPlot (function)* -│ │ ├── TabularCategoricalBarPlots (module) -│ │ │ └── TabularCategoricalBarPlots (function)* -│ │ ├── TabularDateTimeHistograms (module) -│ │ │ └── TabularDateTimeHistograms (function)* -│ │ ├── TabularDescriptionTables (module) -│ │ │ ├── TabularDescriptionTables (function)* -│ │ │ ├── get_categorical_columns (function) -│ │ │ ├── get_datetime_columns (function) -│ │ │ ├── get_numerical_columns (function) -│ │ │ ├── get_summary_statistics_categorical (function) -│ │ │ ├── get_summary_statistics_datetime (function) -│ │ │ └── get_summary_statistics_numerical (function) -│ │ ├── TabularNumericalHistograms (module) -│ │ │ └── TabularNumericalHistograms (function)* -│ │ ├── TargetRateBarPlots (module) -│ │ │ └── TargetRateBarPlots (function)* -│ │ ├── TimeSeriesDescription (module) -│ │ │ └── TimeSeriesDescription (function)* -│ │ ├── TimeSeriesDescriptiveStatistics (module) -│ │ │ └── TimeSeriesDescriptiveStatistics (function)* -│ │ ├── TimeSeriesFrequency (module) -│ │ │ └── TimeSeriesFrequency (function)* -│ │ ├── TimeSeriesHistogram (module) -│ │ │ └── TimeSeriesHistogram (function)* -│ │ ├── TimeSeriesLinePlot (module) -│ │ │ └── TimeSeriesLinePlot (function)* -│ │ ├── TimeSeriesMissingValues (module) -│ │ │ └── TimeSeriesMissingValues (function)* -│ │ ├── TimeSeriesOutliers (module) -│ │ │ └── TimeSeriesOutliers (function)* -│ │ ├── TooManyZeroValues (module) -│ │ │ └── TooManyZeroValues (function)* -│ │ ├── UniqueRows (module) -│ │ │ └── UniqueRows (function)* -│ │ ├── WOEBinPlots (module) -│ │ │ └── WOEBinPlots (function)* -│ │ ├── WOEBinTable (module) -│ │ │ └── WOEBinTable (function)* -│ │ ├── ZivotAndrewsArch (module) -│ │ │ └── ZivotAndrewsArch (function)* -│ │ └── nlp (module) -│ │ ├── CommonWords (module) -│ │ │ └── CommonWords (function)* -│ │ ├── Hashtags (module) -│ │ │ └── Hashtags (function)* -│ │ ├── LanguageDetection (module) -│ │ │ └── LanguageDetection (function)* -│ │ ├── Mentions (module) -│ │ │ └── Mentions (function)* -│ │ ├── PolarityAndSubjectivity (module) -│ │ │ └── PolarityAndSubjectivity (function)* -│ │ ├── Punctuations (module)* -│ │ │ └── Punctuations (function)* -│ │ ├── Sentiment (module) -│ │ │ └── Sentiment (function)* -│ │ ├── StopWords (module)* -│ │ │ └── StopWords (function)* -│ │ ├── TextDescription (module) -│ │ │ ├── TextDescription (function)* -│ │ │ └── create_metrics_df (function) -│ │ └── Toxicity (module) -│ │ └── Toxicity (function)* -│ ├── model_validation (module) -│ │ ├── BertScore (module) -│ │ │ └── BertScore (function)* -│ │ ├── BleuScore (module) -│ │ │ └── BleuScore (function)* -│ │ ├── ClusterSizeDistribution (module) -│ │ │ └── ClusterSizeDistribution (function)* -│ │ ├── ContextualRecall (module) -│ │ │ └── ContextualRecall (function)* -│ │ ├── FeaturesAUC (module) -│ │ │ └── FeaturesAUC (function)* -│ │ ├── MeteorScore (module) -│ │ │ └── MeteorScore (function)* -│ │ ├── ModelMetadata (module) -│ │ │ └── ModelMetadata (function)* -│ │ ├── ModelPredictionResiduals (module) -│ │ │ └── ModelPredictionResiduals (function)* -│ │ ├── RegardScore (module) -│ │ │ └── RegardScore (function)* -│ │ ├── RegressionResidualsPlot (module) -│ │ │ └── RegressionResidualsPlot (function)* -│ │ ├── RougeScore (module) -│ │ │ └── RougeScore (function)* -│ │ ├── TimeSeriesPredictionWithCI (module) -│ │ │ └── TimeSeriesPredictionWithCI (function)* -│ │ ├── TimeSeriesPredictionsPlot (module) -│ │ │ └── TimeSeriesPredictionsPlot (function)* -│ │ ├── TimeSeriesR2SquareBySegments (module) -│ │ │ └── TimeSeriesR2SquareBySegments (function)* -│ │ ├── TokenDisparity (module) -│ │ │ └── TokenDisparity (function)* -│ │ ├── ToxicityScore (module) -│ │ │ └── ToxicityScore (function)* -│ │ ├── sklearn (module) -│ │ │ ├── AdjustedMutualInformation (module) -│ │ │ │ └── AdjustedMutualInformation (function)* -│ │ │ ├── AdjustedRandIndex (module) -│ │ │ │ └── AdjustedRandIndex (function)* -│ │ │ ├── CalibrationCurve (module) -│ │ │ │ └── CalibrationCurve (function)* -│ │ │ ├── ClassifierPerformance (module) -│ │ │ │ ├── ClassifierPerformance (function)* -│ │ │ │ └── multiclass_roc_auc_score (function) -│ │ │ ├── ClassifierThresholdOptimization (module) -│ │ │ │ ├── ClassifierThresholdOptimization (function)* -│ │ │ │ └── find_optimal_threshold (function)* -│ │ │ ├── ClusterCosineSimilarity (module) -│ │ │ │ └── ClusterCosineSimilarity (function)* -│ │ │ ├── ClusterPerformanceMetrics (module) -│ │ │ │ └── ClusterPerformanceMetrics (function)* -│ │ │ ├── CompletenessScore (module) -│ │ │ │ └── CompletenessScore (function)* -│ │ │ ├── ConfusionMatrix (module) -│ │ │ │ └── ConfusionMatrix (function)* -│ │ │ ├── FeatureImportance (module) -│ │ │ │ └── FeatureImportance (function)* -│ │ │ ├── FowlkesMallowsScore (module) -│ │ │ │ └── FowlkesMallowsScore (function)* -│ │ │ ├── HomogeneityScore (module) -│ │ │ │ └── HomogeneityScore (function)* -│ │ │ ├── HyperParametersTuning (module) -│ │ │ │ ├── HyperParametersTuning (function)* -│ │ │ │ └── custom_recall (function) -│ │ │ ├── KMeansClustersOptimization (module) -│ │ │ │ └── KMeansClustersOptimization (function)* -│ │ │ ├── MinimumAccuracy (module) -│ │ │ │ └── MinimumAccuracy (function)* -│ │ │ ├── MinimumF1Score (module) -│ │ │ │ └── MinimumF1Score (function)* -│ │ │ ├── MinimumROCAUCScore (module) -│ │ │ │ └── MinimumROCAUCScore (function)* -│ │ │ ├── ModelParameters (module) -│ │ │ │ └── ModelParameters (function)* -│ │ │ ├── ModelsPerformanceComparison (module) -│ │ │ │ └── ModelsPerformanceComparison (function)* -│ │ │ ├── OverfitDiagnosis (module) -│ │ │ │ └── OverfitDiagnosis (function)* -│ │ │ ├── PermutationFeatureImportance (module) -│ │ │ │ └── PermutationFeatureImportance (function)* -│ │ │ ├── PopulationStabilityIndex (module) -│ │ │ │ ├── PopulationStabilityIndex (function)* -│ │ │ │ └── calculate_psi (function)* -│ │ │ ├── PrecisionRecallCurve (module) -│ │ │ │ └── PrecisionRecallCurve (function)* -│ │ │ ├── ROCCurve (module) -│ │ │ │ └── ROCCurve (function)* -│ │ │ ├── RegressionErrors (module) -│ │ │ │ └── RegressionErrors (function)* -│ │ │ ├── RegressionErrorsComparison (module) -│ │ │ │ └── RegressionErrorsComparison (function)* -│ │ │ ├── RegressionPerformance (module) -│ │ │ │ └── RegressionPerformance (function)* -│ │ │ ├── RegressionR2Square (module) -│ │ │ │ └── RegressionR2Square (function)* -│ │ │ ├── RegressionR2SquareComparison (module) -│ │ │ │ └── RegressionR2SquareComparison (function)* -│ │ │ ├── RobustnessDiagnosis (module) -│ │ │ │ └── RobustnessDiagnosis (function)* -│ │ │ ├── SHAPGlobalImportance (module) -│ │ │ │ ├── SHAPGlobalImportance (function)* -│ │ │ │ ├── generate_shap_plot (function)* -│ │ │ │ └── select_shap_values (function)* -│ │ │ ├── ScoreProbabilityAlignment (module) -│ │ │ │ └── ScoreProbabilityAlignment (function)* -│ │ │ ├── SilhouettePlot (module) -│ │ │ │ └── SilhouettePlot (function)* -│ │ │ ├── TrainingTestDegradation (module) -│ │ │ │ └── TrainingTestDegradation (function)* -│ │ │ ├── VMeasure (module) -│ │ │ │ └── VMeasure (function)* -│ │ │ └── WeakspotsDiagnosis (module) -│ │ │ └── WeakspotsDiagnosis (function)* -│ │ └── statsmodels (module) -│ │ ├── AutoARIMA (module) -│ │ │ └── AutoARIMA (function)* -│ │ ├── CumulativePredictionProbabilities (module) -│ │ │ └── CumulativePredictionProbabilities (function)* -│ │ ├── DurbinWatsonTest (module) -│ │ │ └── DurbinWatsonTest (function)* -│ │ ├── GINITable (module) -│ │ │ └── GINITable (function)* -│ │ ├── KolmogorovSmirnov (module) -│ │ │ └── KolmogorovSmirnov (function)* -│ │ ├── Lilliefors (module) -│ │ │ └── Lilliefors (function)* -│ │ ├── PredictionProbabilitiesHistogram (module) -│ │ │ └── PredictionProbabilitiesHistogram (function)* -│ │ ├── RegressionCoeffs (module) -│ │ │ └── RegressionCoeffs (function)* -│ │ ├── RegressionFeatureSignificance (module) -│ │ │ └── RegressionFeatureSignificance (function)* -│ │ ├── RegressionModelForecastPlot (module) -│ │ │ └── RegressionModelForecastPlot (function)* -│ │ ├── RegressionModelForecastPlotLevels (module) -│ │ │ ├── RegressionModelForecastPlotLevels (function)* -│ │ │ └── integrate_diff (function) -│ │ ├── RegressionModelSensitivityPlot (module) -│ │ │ ├── RegressionModelSensitivityPlot (function)* -│ │ │ └── integrate_diff (function) -│ │ ├── RegressionModelSummary (module) -│ │ │ └── RegressionModelSummary (function)* -│ │ ├── RegressionPermutationFeatureImportance (module) -│ │ │ └── RegressionPermutationFeatureImportance (function)* -│ │ ├── ScorecardHistogram (module) -│ │ │ └── ScorecardHistogram (function)* -│ │ └── statsutils (module) -│ │ └── adj_r2_score (function)* -│ └── prompt_validation (module) -│ ├── Bias (module) -│ │ └── Bias (function)* -│ ├── Clarity (module) -│ │ └── Clarity (function)* -│ ├── Conciseness (module) -│ │ └── Conciseness (function)* -│ ├── Delimitation (module) -│ │ └── Delimitation (function)* -│ ├── NegativeInstruction (module) -│ │ └── NegativeInstruction (function)* -│ ├── Robustness (module) -│ │ └── Robustness (function)* -│ ├── Specificity (module) -│ │ └── Specificity (function)* -│ └── ai_powered_test (module) -│ ├── call_model (function)* -│ ├── get_explanation (function)* -│ └── get_score (function)* -├── unit_metrics (module) -│ ├── describe_metric (function)* -│ ├── list_metrics (function)* -│ └── run_metric (function)* -└── vm_models (module)* - └── vm_models (module)* - ├── VMInput (alias) -> validmind.vm_models.input.VMInput - │ └── with_options (function)* - ├── VMDataset (alias) -> validmind.vm_models.dataset.dataset.VMDataset - │ ├── add_extra_column (function)* - │ ├── assign_predictions (function)* - │ ├── prediction_column (function)* - │ ├── probability_column (function)* - │ ├── target_classes (function)* - │ ├── with_options (function)* - │ ├── x_df (function)* - │ ├── y_df (function)* - │ ├── y_pred (function)* - │ ├── y_pred_df (function)* - │ ├── y_prob (function)* - │ └── y_prob_df (function)* - ├── VMModel (alias) -> validmind.vm_models.model.VMModel - │ ├── predict (function)* - │ ├── predict_proba (function)* - │ └── serialize (function)* - ├── Figure (alias) -> validmind.vm_models.figure.Figure - │ ├── serialize (function)* - │ ├── serialize_files (function)* - │ └── to_widget (function)* - ├── ModelAttributes (alias) -> validmind.vm_models.model.ModelAttributes - │ └── from_dict (function)* - ├── R_MODEL_TYPES (alias) -> validmind.vm_models.model.R_MODEL_TYPES - ├── ResultTable (alias) -> validmind.vm_models.result.ResultTable - ├── TestResult (alias) -> validmind.vm_models.result.TestResult - ├── TestSuite (alias) -> validmind.vm_models.test_suite.test_suite.TestSuite - │ ├── get_default_config (function)* - │ ├── get_tests (function)* - │ └── num_tests (function)* - └── TestSuiteRunner (alias) -> validmind.vm_models.test_suite.runner.TestSuiteRunner - ├── log_results (function)* - ├── run (function)* - └── summarize (function) diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index afd81276b..9da8b28a3 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -72,9 +72,7 @@ Preprocess numerical columns. -```python -def get_demo_test_config(test_suite = None): -``` +::: {.signature} def get_demo_test_config(test_suite = None): ::: Returns input configuration for the default documentation template assigned to this demo model @@ -97,14 +95,10 @@ We assign the following inputs depending on the input config expected by each te -```python -def load_data(full_dataset = False): -``` +::: {.signature} def load_data(full_dataset = False): ::: ## preprocess[()]{.muted} -```python -def preprocess(df): -``` +::: {.signature} def preprocess(df): ::: diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index 568d11f21..09f52db5f 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -72,14 +72,10 @@ Preprocess numerical columns. -```python -def load_data(): -``` +::: {.signature} def load_data(): ::: ## preprocess[()]{.muted} -```python -def preprocess(df): -``` +::: {.signature} def preprocess(df): ::: diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index cca9711db..6a9d3357f 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -9,29 +9,19 @@ toc-expand: 4 -```python -def compute_scores(probabilities): -``` +::: {.signature} def compute_scores(probabilities): ::: ## feature_engineering[()]{.muted} -```python -def feature_engineering( - df, - verbose = True): -``` +::: {.signature} def feature_engineering( df, verbose = True): ::: ## get_demo_test_config[()]{.muted} -```python -def get_demo_test_config( - x_test = None, - y_test = None): -``` +::: {.signature} def get_demo_test_config( x_test = None, y_test = None): ::: Get demo test configuration. @@ -48,19 +38,13 @@ Get demo test configuration. -```python -def init_vm_objects(scorecard): -``` +::: {.signature} def init_vm_objects(scorecard): ::: ## load_data[()]{.muted} -```python -def load_data( - source = 'online', - verbose = True): -``` +::: {.signature} def load_data( source = 'online', verbose = True): ::: Load data from either an online source or offline files, automatically dropping specified columns for offline data. :param source: 'online' for online data, 'offline' for offline files. Defaults to 'online'. :return: DataFrame containing the loaded data. @@ -68,40 +52,25 @@ Load data from either an online source or offline files, automatically dropping -```python -def load_scorecard(): -``` +::: {.signature} def load_scorecard(): ::: ## load_test_config[()]{.muted} -```python -def load_test_config(scorecard): -``` +::: {.signature} def load_test_config(scorecard): ::: ## preprocess[()]{.muted} -```python -def preprocess( - df, - verbose = True): -``` +::: {.signature} def preprocess( df, verbose = True): ::: ## split[()]{.muted} -```python -def split( - df, - validation_size = None, - test_size = 0.2, - add_constant = False, - verbose = True): -``` +::: {.signature} def split( df, validation_size = None, test_size = 0.2, add_constant = False, verbose = True): ::: Split dataset into train, validation (optional), and test sets. @@ -120,8 +89,4 @@ Split dataset into train, validation (optional), and test sets. -```python -def woe_encoding( - df, - verbose = True): -``` +::: {.signature} def woe_encoding( df, verbose = True): ::: diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 1cef0eabc..3b4056d5e 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -9,17 +9,13 @@ toc-expand: 4 -```python -def compute_scores(probabilities): -``` +::: {.signature} def compute_scores(probabilities): ::: ## load_data[()]{.muted} -```python -def load_data(): -``` +::: {.signature} def load_data(): ::: Load data from the specified CSV file. :return: DataFrame containing the loaded data. @@ -27,16 +23,10 @@ Load data from the specified CSV file. :return: DataFrame containing the loaded -```python -def preprocess(df): -``` +::: {.signature} def preprocess(df): ::: ## split[()]{.muted} -```python -def split( - df, - test_size = 0.3): -``` +::: {.signature} def split( df, test_size = 0.3): ::: diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index f0e93d97d..7565ab928 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def display_nice( - df, - num_rows = None): -``` +::: {.signature} def display_nice( df, num_rows = None): ::: Primary function to format and display a DataFrame. @@ -21,10 +17,6 @@ Primary function to format and display a DataFrame. -```python -def load_data( - source = 'online', - dataset_size = None): -``` +::: {.signature} def load_data( source = 'online', dataset_size = None): ::: Load data from either online source or offline files. :param source: 'online' for online data, 'offline' for offline data. Defaults to 'online'. :param dataset_size: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. :return: DataFrame containing the loaded data. diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index b7d52732f..004e6aea2 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -9,6 +9,4 @@ toc-expand: 4 -```python -def load_data(full_dataset = False): -``` +::: {.signature} def load_data(full_dataset = False): ::: diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index 721007077..584c9869c 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -9,61 +9,43 @@ toc-expand: 4 -```python -def load_all_data(): -``` +::: {.signature} def load_all_data(): ::: ## load_data[()]{.muted} -```python -def load_data(): -``` +::: {.signature} def load_data(): ::: ## load_model[()]{.muted} -```python -def load_model(model_name): -``` +::: {.signature} def load_model(model_name): ::: ## load_processed_data[()]{.muted} -```python -def load_processed_data(): -``` +::: {.signature} def load_processed_data(): ::: ## load_test_dataset[()]{.muted} -```python -def load_test_dataset(model_name): -``` +::: {.signature} def load_test_dataset(model_name): ::: ## load_train_dataset[()]{.muted} -```python -def load_train_dataset(model_path): -``` +::: {.signature} def load_train_dataset(model_path): ::: ## preprocess[()]{.muted} -```python -def preprocess( - df, - split_option = 'train_test_val', - train_size = 0.6, - test_size = 0.2): -``` +::: {.signature} def preprocess( df, split_option = 'train_test_val', train_size = 0.6, test_size = 0.2): ::: Split a time series DataFrame into train, validation, and test sets. @@ -82,8 +64,4 @@ Split a time series DataFrame into train, validation, and test sets. -```python -def transform( - df, - transform_func = 'diff'): -``` +::: {.signature} def transform( df, transform_func = 'diff'): ::: diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 3bbca71b2..767e9b9f5 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -9,21 +9,13 @@ toc-expand: 4 -```python -def load_data(): -``` +::: {.signature} def load_data(): ::: ## preprocess[()]{.muted} -```python -def preprocess( - df, - split_option = 'train_test_val', - train_size = 0.6, - test_size = 0.2): -``` +::: {.signature} def preprocess( df, split_option = 'train_test_val', train_size = 0.6, test_size = 0.2): ::: Split a time series DataFrame into train, validation, and test sets. @@ -42,8 +34,4 @@ Split a time series DataFrame into train, validation, and test sets. -```python -def transform( - df, - transform_func = 'diff'): -``` +::: {.signature} def transform( df, transform_func = 'diff'): ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index de4875c84..c7f48219c 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -591,9 +591,7 @@ When an unsupported R model is used. -```python -def raise_api_error(error_string): -``` +::: {.signature} def raise_api_error(error_string): ::: Safely try to parse JSON from the response message in case the API returns a non-JSON string or if the API returns a non-standard error @@ -601,8 +599,6 @@ Safely try to parse JSON from the response message in case the API returns a non -```python -def should_raise_on_fail_fast(error) -> bool: -``` +::: {.signature} def should_raise_on_fail_fast(error) -> bool: ::: Determine whether an error should be raised when fail_fast is True. diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index b0b3e4c41..37ebfd1c6 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -64,11 +64,7 @@ Convert a test ID to a human-readable name. -```python -def describe_suite( - test_suite_id: str, - verbose = False): -``` +::: {.signature} def describe_suite( test_suite_id: str, verbose = False): ::: Describes a Test Suite by ID @@ -85,9 +81,7 @@ Describes a Test Suite by ID -```python -def get_by_id(test_suite_id: str): -``` +::: {.signature} def get_by_id(test_suite_id: str): ::: Returns the test suite by ID @@ -95,9 +89,7 @@ Returns the test suite by ID -```python -def list_suites(pretty: bool = True): -``` +::: {.signature} def list_suites(pretty: bool = True): ::: Returns a list of all available test suites @@ -105,11 +97,7 @@ Returns a list of all available test suites -```python -def register_test_suite( - suite_id: str, - suite: TestSuite): -``` +::: {.signature} def register_test_suite( suite_id: str, suite: TestSuite): ::: Registers a custom test suite diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index fd62dffc3..72ee50eba 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -222,11 +222,7 @@ The function may also include a docstring. This docstring will be used and logge -```python -def register_test_provider( - namespace: str, - test_provider: TestProvider) -> None: -``` +::: {.signature} def register_test_provider( namespace: str, test_provider: TestProvider) -> None: ::: Register an external test provider diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 0784d0c8e..b44958a22 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def ACFandPACFPlot(dataset: VMDataset): -``` +::: {.signature} def ACFandPACFPlot(dataset: VMDataset): ::: Analyzes time series data using Autocorrelation Function (ACF) and Partial Autocorrelation Function (PACF) plots to reveal trends and correlations. diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 2fac82028..95c1b076a 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -21,9 +21,7 @@ Get a logger for the given module name -```python -def ADF(dataset: VMDataset): -``` +::: {.signature} def ADF(dataset: VMDataset): ::: Assesses the stationarity of a time series dataset using the Augmented Dickey-Fuller (ADF) test. diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 600c99c20..27f181086 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -21,11 +21,7 @@ Get a logger for the given module name -```python -def AutoAR( - dataset: VMDataset, - max_ar_order: int = 3): -``` +::: {.signature} def AutoAR( dataset: VMDataset, max_ar_order: int = 3): ::: Automatically identifies the optimal Autoregressive (AR) order for a time series using BIC and AIC criteria. diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index 4871494e0..22d8575c8 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -21,11 +21,7 @@ Get a logger for the given module name -```python -def AutoMA( - dataset: VMDataset, - max_ma_order: int = 3): -``` +::: {.signature} def AutoMA( dataset: VMDataset, max_ma_order: int = 3): ::: Automatically selects the optimal Moving Average (MA) order for each variable in a time series dataset based on minimal BIC and AIC values. diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index a70e7ed7f..5e41588fd 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def AutoStationarity( - dataset: VMDataset, - max_order: int = 5, - threshold: float = 0.05): -``` +::: {.signature} def AutoStationarity( dataset: VMDataset, max_order: int = 5, threshold: float = 0.05): ::: Automates Augmented Dickey-Fuller test to assess stationarity across multiple time series in a DataFrame. diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 6717e9214..7a04434a1 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def BivariateScatterPlots(dataset): -``` +::: {.signature} def BivariateScatterPlots(dataset): ::: Generates bivariate scatterplots to visually inspect relationships between pairs of numerical predictor variables in machine learning classification tasks. diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index e215d1c80..502632df2 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def BoxPierce(dataset): -``` +::: {.signature} def BoxPierce(dataset): ::: Detects autocorrelation in time-series data through the Box-Pierce test to validate model performance. diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 363f7d80c..04f074cbc 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def ChiSquaredFeaturesTable( - dataset, - p_threshold = 0.05): -``` +::: {.signature} def ChiSquaredFeaturesTable( dataset, p_threshold = 0.05): ::: Assesses the statistical association between categorical features and a target variable using the Chi-Squared test. diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index da9afdfe6..b2be8eac3 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -11,11 +11,7 @@ Threshold based tests -```python -def ClassImbalance( - dataset: VMDataset, - min_percent_threshold: int = 10) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Tuple'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, {'cls': 'ExprName', 'name': 'bool'}], 'implicit': True}}: -``` +::: {.signature} def ClassImbalance( dataset: VMDataset, min_percent_threshold: int = 10) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Tuple'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, {'cls': 'ExprName', 'name': 'bool'}\], 'implicit': True}}: ::: Evaluates and quantifies class distribution imbalance in a dataset used by a machine learning model. diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index a19a5e0da..d2de51875 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -21,9 +21,7 @@ Get a logger for the given module name -```python -def DatasetDescription(dataset: VMDataset): -``` +::: {.signature} def DatasetDescription(dataset: VMDataset): ::: Provides comprehensive analysis and statistical summaries of each column in a machine learning model's dataset. @@ -61,11 +59,7 @@ The DatasetDescription class accomplishes the purpose as follows: firstly, the t -```python -def describe_column( - df, - column): -``` +::: {.signature} def describe_column( df, column): ::: Gets descriptive statistics for a single column in a Pandas DataFrame. @@ -73,12 +67,7 @@ Gets descriptive statistics for a single column in a Pandas DataFrame. -```python -def get_column_histograms( - df, - column, - type_): -``` +::: {.signature} def get_column_histograms( df, column, type\_): ::: Returns a collection of histograms for a numerical or categorical column. We store different combinations of bin sizes to allow analyzing the data better @@ -88,11 +77,7 @@ Will be used in favor of \_get_histogram in the future -```python -def get_numerical_histograms( - df, - column): -``` +::: {.signature} def get_numerical_histograms( df, column): ::: Returns a collection of histograms for a numerical column, each one with a different bin size @@ -100,9 +85,7 @@ Returns a collection of histograms for a numerical column, each one with a diffe -```python -def infer_datatypes(df): -``` +::: {.signature} def infer_datatypes(df): ::: ## [class]{.muted} UnsupportedColumnTypeError diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 14cb5b70a..822729ea7 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def DatasetSplit(datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}): -``` +::: {.signature} def DatasetSplit(datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}): ::: Evaluates and visualizes the distribution proportions among training, testing, and validation datasets of an ML model. diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 9ab5ac54a..16f714393 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -25,9 +25,7 @@ We do this for display purposes before sending data to ValidMind. Rules: -```python -def DescriptiveStatistics(dataset: VMDataset): -``` +::: {.signature} def DescriptiveStatistics(dataset: VMDataset): ::: Performs a detailed descriptive statistical analysis of both numerical and categorical data within a model's dataset. @@ -61,21 +59,13 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des -```python -def get_summary_statistics_categorical( - df, - categorical_fields): -``` +::: {.signature} def get_summary_statistics_categorical( df, categorical_fields): ::: ## get_summary_statistics_numerical[()]{.muted} -```python -def get_summary_statistics_numerical( - df, - numerical_fields): -``` +::: {.signature} def get_summary_statistics_numerical( df, numerical_fields): ::: ## [class]{.muted} SkipTestError diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index bc0137c78..0c0c257e9 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -21,9 +21,7 @@ Get a logger for the given module name -```python -def DickeyFullerGLS(dataset: VMDataset): -``` +::: {.signature} def DickeyFullerGLS(dataset: VMDataset): ::: Assesses stationarity in time series data using the Dickey-Fuller GLS test to determine the order of integration. diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 16aeb550a..3651ca47b 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def Duplicates( - dataset, - min_threshold = 1): -``` +::: {.signature} def Duplicates( dataset, min_threshold = 1): ::: Tests dataset for duplicate entries, ensuring model reliability via data quality verification. diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index b2df9103a..056892f44 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def EngleGrangerCoint( - dataset: VMDataset, - threshold: float = 0.05): -``` +::: {.signature} def EngleGrangerCoint( dataset: VMDataset, threshold: float = 0.05): ::: Assesses the degree of co-movement between pairs of time series data using the Engle-Granger cointegration test. diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 2936c3d09..0113218ad 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def FeatureTargetCorrelationPlot( - dataset, - fig_height = 600): -``` +::: {.signature} def FeatureTargetCorrelationPlot( dataset, fig_height = 600): ::: Visualizes the correlation between input features and the model's target output in a color-coded horizontal bar plot. diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index a23e30029..a7309ec78 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -9,13 +9,7 @@ toc-expand: 4 -```python -def HighCardinality( - dataset: VMDataset, - num_threshold: int = 100, - percent_threshold: float = 0.1, - threshold_type: str = 'percent'): -``` +::: {.signature} def HighCardinality( dataset: VMDataset, num_threshold: int = 100, percent_threshold: float = 0.1, threshold_type: str = 'percent'): ::: Assesses the number of unique values in categorical columns to detect high cardinality and potential overfitting. diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 5630cd01c..9c6475d44 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -9,13 +9,7 @@ toc-expand: 4 -```python -def HighPearsonCorrelation( - dataset: VMDataset, - max_threshold: float = 0.3, - top_n_correlations: int = 10, - feature_columns: list = None): -``` +::: {.signature} def HighPearsonCorrelation( dataset: VMDataset, max_threshold: float = 0.3, top_n_correlations: int = 10, feature_columns: list = None): ::: Identifies highly correlated feature pairs in a dataset suggesting feature redundancy or multicollinearity. diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 2d127209d..546e0f22a 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -9,22 +9,13 @@ toc-expand: 4 -```python -def compute_outliers( - series, - threshold): -``` +::: {.signature} def compute_outliers( series, threshold): ::: ## IQROutliersBarPlot[()]{.muted} -```python -def IQROutliersBarPlot( - dataset: VMDataset, - threshold: float = 1.5, - fig_width: int = 800): -``` +::: {.signature} def IQROutliersBarPlot( dataset: VMDataset, threshold: float = 1.5, fig_width: int = 800): ::: Visualizes outlier distribution across percentiles in numerical data using the Interquartile Range (IQR) method. diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index c928217d5..f705caa58 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -9,21 +9,13 @@ toc-expand: 4 -```python -def compute_outliers( - series, - threshold = 1.5): -``` +::: {.signature} def compute_outliers( series, threshold = 1.5): ::: ## IQROutliersTable[()]{.muted} -```python -def IQROutliersTable( - dataset: VMDataset, - threshold: float = 1.5): -``` +::: {.signature} def IQROutliersTable( dataset: VMDataset, threshold: float = 1.5): ::: Determines and summarizes outliers in numerical features using the Interquartile Range method. diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index f52d3ac53..ff83b1818 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -9,13 +9,7 @@ toc-expand: 4 -```python -def IsolationForestOutliers( - dataset: VMDataset, - random_state: int = 0, - contamination: float = 0.1, - feature_columns: list = None): -``` +::: {.signature} def IsolationForestOutliers( dataset: VMDataset, random_state: int = 0, contamination: float = 0.1, feature_columns: list = None): ::: Detects outliers in a dataset using the Isolation Forest algorithm and visualizes results through scatter plots. diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index 4c8582655..906cbd730 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def JarqueBera(dataset): -``` +::: {.signature} def JarqueBera(dataset): ::: Assesses normality of dataset features in an ML model using the Jarque-Bera test. diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 0f5f05b24..85d7e7514 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -21,9 +21,7 @@ Get a logger for the given module name -```python -def KPSS(dataset: VMDataset): -``` +::: {.signature} def KPSS(dataset: VMDataset): ::: Assesses the stationarity of time-series data in a machine learning model using the KPSS unit root test. diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 25b416144..b5b5ae0ac 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def LJungBox(dataset): -``` +::: {.signature} def LJungBox(dataset): ::: Assesses autocorrelations in dataset features by performing a Ljung-Box test on each feature. diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index ae4341ebd..f10488488 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def LaggedCorrelationHeatmap( - dataset: VMDataset, - num_lags: int = 10): -``` +::: {.signature} def LaggedCorrelationHeatmap( dataset: VMDataset, num_lags: int = 10): ::: Assesses and visualizes correlation between target variable and lagged independent variables in a time-series dataset. diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 578f26fff..534970af6 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def MissingValues( - dataset: VMDataset, - min_threshold: int = 1): -``` +::: {.signature} def MissingValues( dataset: VMDataset, min_threshold: int = 1): ::: Evaluates dataset quality by ensuring missing value ratio across all features does not exceed a set threshold. diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index ba5b3b0ff..dcb281157 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def MissingValuesBarPlot( - dataset: VMDataset, - threshold: int = 80, - fig_height: int = 600): -``` +::: {.signature} def MissingValuesBarPlot( dataset: VMDataset, threshold: int = 80, fig_height: int = 600): ::: Assesses the percentage and distribution of missing values in the dataset via a bar plot, with emphasis on identifying high-risk columns based on a user-defined threshold. diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 02cf422ea..ff83cf567 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def MutualInformation( - dataset: VMDataset, - min_threshold: float = 0.01, - task: str = 'classification'): -``` +::: {.signature} def MutualInformation( dataset: VMDataset, min_threshold: float = 0.01, task: str = 'classification'): ::: Calculates mutual information scores between features and target variable to evaluate feature relevance. diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index 09cc380a0..6fc31c281 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def PearsonCorrelationMatrix(dataset): -``` +::: {.signature} def PearsonCorrelationMatrix(dataset): ::: Evaluates linear dependency between numerical variables in a dataset via a Pearson Correlation coefficient heat map. diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 8b7a56468..f98d24297 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -21,9 +21,7 @@ Get a logger for the given module name -```python -def PhillipsPerronArch(dataset: VMDataset): -``` +::: {.signature} def PhillipsPerronArch(dataset: VMDataset): ::: Assesses the stationarity of time series data in each feature of the ML model using the Phillips-Perron test. diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 592e542e3..7f2d13e04 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -21,12 +21,7 @@ Get a logger for the given module name -```python -def ProtectedClassesCombination( - dataset, - model, - protected_classes = None): -``` +::: {.signature} def ProtectedClassesCombination( dataset, model, protected_classes = None): ::: Visualizes combinations of protected classes and their corresponding error metric differences. diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index a4732e909..07db022d1 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -21,11 +21,7 @@ Get a logger for the given module name -```python -def ProtectedClassesDescription( - dataset, - protected_classes = None): -``` +::: {.signature} def ProtectedClassesDescription( dataset, protected_classes = None): ::: Visualizes the distribution of protected classes in the dataset relative to the target variable and provides descriptive statistics. diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 34dfbf003..b1bb9481e 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -21,14 +21,7 @@ Get a logger for the given module name -```python -def ProtectedClassesDisparity( - dataset, - model, - protected_classes = None, - disparity_tolerance = 1.25, - metrics = {'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}): -``` +::: {.signature} def ProtectedClassesDisparity( dataset, model, protected_classes = None, disparity_tolerance = 1.25, metrics = {'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}): ::: Investigates disparities in model performance across different protected class segments. diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 8bc32d662..5a8206f59 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -21,77 +21,43 @@ Get a logger for the given module name -```python -def calculate_fairness_metrics( - test_df, - target, - y_pred_opt, - protected_classes): -``` +::: {.signature} def calculate_fairness_metrics( test_df, target, y_pred_opt, protected_classes): ::: ## calculate_group_metrics[()]{.muted} -```python -def calculate_group_metrics( - test_df, - target, - y_pred_opt, - protected_classes): -``` +::: {.signature} def calculate_group_metrics( test_df, target, y_pred_opt, protected_classes): ::: ## get_thresholds_by_group[()]{.muted} -```python -def get_thresholds_by_group(threshold_optimizer): -``` +::: {.signature} def get_thresholds_by_group(threshold_optimizer): ::: ## initialize_and_fit_optimizer[()]{.muted} -```python -def initialize_and_fit_optimizer( - pipeline, - X_train, - y_train, - protected_classes_df): -``` +::: {.signature} def initialize_and_fit_optimizer( pipeline, X_train, y_train, protected_classes_df): ::: ## make_predictions[()]{.muted} -```python -def make_predictions( - threshold_optimizer, - test_df, - protected_classes): -``` +::: {.signature} def make_predictions( threshold_optimizer, test_df, protected_classes): ::: ## plot_thresholds[()]{.muted} -```python -def plot_thresholds(threshold_optimizer): -``` +::: {.signature} def plot_thresholds(threshold_optimizer): ::: ## ProtectedClassesThresholdOptimizer[()]{.muted} -```python -def ProtectedClassesThresholdOptimizer( - dataset, - pipeline = None, - protected_classes = None, - X_train = None, - y_train = None): -``` +::: {.signature} def ProtectedClassesThresholdOptimizer( dataset, pipeline = None, protected_classes = None, X_train = None, y_train = None): ::: Obtains a classifier by applying group-specific thresholds to the provided estimator. diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 51deea587..42fe9e4c0 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -9,22 +9,13 @@ toc-expand: 4 -```python -def plot_rolling_statistics( - df, - col, - window_size): -``` +::: {.signature} def plot_rolling_statistics( df, col, window_size): ::: ## RollingStatsPlot[()]{.muted} -```python -def RollingStatsPlot( - dataset: VMDataset, - window_size: int = 12): -``` +::: {.signature} def RollingStatsPlot( dataset: VMDataset, window_size: int = 12): ::: Evaluates the stationarity of time series data by plotting its rolling mean and standard deviation over a specified window. diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 9504576d0..a65482050 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def RunsTest(dataset): -``` +::: {.signature} def RunsTest(dataset): ::: Executes Runs Test on ML model to detect non-random patterns in output data sequence. diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index e3b037921..d561f776c 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def ScatterPlot(dataset): -``` +::: {.signature} def ScatterPlot(dataset): ::: Assesses visual relationships, patterns, and outliers among features in a dataset through scatter plot matrices. diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 502c3df5c..9af5c3da4 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -9,13 +9,7 @@ toc-expand: 4 -```python -def ScoreBandDefaultRates( - dataset: VMDataset, - model: VMModel, - score_column: str = 'score', - score_bands: list = None): -``` +::: {.signature} def ScoreBandDefaultRates( dataset: VMDataset, model: VMModel, score_column: str = 'score', score_bands: list = None): ::: Analyzes default rates and population distribution across credit score bands. diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 468af4d80..dc1b93c6f 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -21,11 +21,7 @@ Get a logger for the given module name -```python -def SeasonalDecompose( - dataset: VMDataset, - seasonal_model: str = 'additive'): -``` +::: {.signature} def SeasonalDecompose( dataset: VMDataset, seasonal_model: str = 'additive'): ::: Assesses patterns and seasonality in a time series dataset by decomposing its features into foundational components. diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index bce72094e..894492daf 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def ShapiroWilk(dataset): -``` +::: {.signature} def ShapiroWilk(dataset): ::: Evaluates feature-wise normality of training data using the Shapiro-Wilk test. diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index cc51e3c51..5a1381b88 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def Skewness( - dataset, - max_threshold = 1): -``` +::: {.signature} def Skewness( dataset, max_threshold = 1): ::: Evaluates the skewness of numerical data in a dataset to check against a defined threshold, aiming to ensure data quality and optimize model performance. diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 5ebe7ae3f..bd76d532c 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def SpreadPlot(dataset: VMDataset): -``` +::: {.signature} def SpreadPlot(dataset: VMDataset): ::: Assesses potential correlations between pairs of time series variables through visualization to enhance understanding of their relationships. diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 610f84948..f834afafd 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def TabularCategoricalBarPlots(dataset: VMDataset): -``` +::: {.signature} def TabularCategoricalBarPlots(dataset: VMDataset): ::: Generates and visualizes bar plots for each category in categorical features to evaluate the dataset's composition. diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 36790dc57..7206818d7 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def TabularDateTimeHistograms(dataset: VMDataset): -``` +::: {.signature} def TabularDateTimeHistograms(dataset: VMDataset): ::: Generates histograms to provide graphical insight into the distribution of time intervals in a model's datetime data. diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 529a5e97e..5cbadc8a2 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -9,63 +9,43 @@ toc-expand: 4 -```python -def get_categorical_columns(dataset): -``` +::: {.signature} def get_categorical_columns(dataset): ::: ## get_datetime_columns[()]{.muted} -```python -def get_datetime_columns(dataset): -``` +::: {.signature} def get_datetime_columns(dataset): ::: ## get_numerical_columns[()]{.muted} -```python -def get_numerical_columns(dataset): -``` +::: {.signature} def get_numerical_columns(dataset): ::: ## get_summary_statistics_categorical[()]{.muted} -```python -def get_summary_statistics_categorical( - dataset, - categorical_fields): -``` +::: {.signature} def get_summary_statistics_categorical( dataset, categorical_fields): ::: ## get_summary_statistics_datetime[()]{.muted} -```python -def get_summary_statistics_datetime( - dataset, - datetime_fields): -``` +::: {.signature} def get_summary_statistics_datetime( dataset, datetime_fields): ::: ## get_summary_statistics_numerical[()]{.muted} -```python -def get_summary_statistics_numerical( - dataset, - numerical_fields): -``` +::: {.signature} def get_summary_statistics_numerical( dataset, numerical_fields): ::: ## TabularDescriptionTables[()]{.muted} -```python -def TabularDescriptionTables(dataset): -``` +::: {.signature} def TabularDescriptionTables(dataset): ::: Summarizes key descriptive statistics for numerical, categorical, and datetime variables in a dataset. diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 535643001..45d1ab1a3 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def TabularNumericalHistograms(dataset: VMDataset): -``` +::: {.signature} def TabularNumericalHistograms(dataset: VMDataset): ::: Generates histograms for each numerical feature in a dataset to provide visual insights into data distribution and detect potential issues. diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 49856c4fd..1c52e7b35 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def TargetRateBarPlots(dataset: VMDataset): -``` +::: {.signature} def TargetRateBarPlots(dataset: VMDataset): ::: Generates bar plots visualizing the default rates of categorical features for a classification machine learning model. diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 3d89a4b62..4228df314 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def TimeSeriesDescription(dataset): -``` +::: {.signature} def TimeSeriesDescription(dataset): ::: Generates a detailed analysis for the provided time series dataset, summarizing key statistics to identify trends, patterns, and data quality issues. diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 1a3257a96..c1fc502f8 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def TimeSeriesDescriptiveStatistics(dataset): -``` +::: {.signature} def TimeSeriesDescriptiveStatistics(dataset): ::: Evaluates the descriptive statistics of a time series dataset to identify trends, patterns, and data quality issues. diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index dfb8d50a4..5f06bbfa6 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def TimeSeriesFrequency(dataset: VMDataset): -``` +::: {.signature} def TimeSeriesFrequency(dataset: VMDataset): ::: Evaluates consistency of time series data frequency and generates a frequency plot. diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 817720e34..4d65cb56e 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -21,11 +21,7 @@ Get a logger for the given module name -```python -def TimeSeriesHistogram( - dataset, - nbins = 30): -``` +::: {.signature} def TimeSeriesHistogram( dataset, nbins = 30): ::: Visualizes distribution of time-series data using histograms and Kernel Density Estimation (KDE) lines. diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 59f87e7fb..8a95a4075 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def TimeSeriesLinePlot(dataset: VMDataset): -``` +::: {.signature} def TimeSeriesLinePlot(dataset: VMDataset): ::: Generates and analyses time-series data through line plots revealing trends, patterns, anomalies over time. diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 429f76ebe..65e95bf45 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def TimeSeriesMissingValues( - dataset: VMDataset, - min_threshold: int = 1): -``` +::: {.signature} def TimeSeriesMissingValues( dataset: VMDataset, min_threshold: int = 1): ::: Validates time-series data quality by confirming the count of missing values is below a certain threshold. diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index d5dc7dd7a..d9d877ef9 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def TimeSeriesOutliers( - dataset: VMDataset, - zscore_threshold: int = 3): -``` +::: {.signature} def TimeSeriesOutliers( dataset: VMDataset, zscore_threshold: int = 3): ::: Identifies and visualizes outliers in time-series data using the z-score method. diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index b202d3228..13741b88d 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def TooManyZeroValues( - dataset: VMDataset, - max_percent_threshold: float = 0.03): -``` +::: {.signature} def TooManyZeroValues( dataset: VMDataset, max_percent_threshold: float = 0.03): ::: Identifies numerical columns in a dataset that contain an excessive number of zero values, defined by a threshold percentage. diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 4e170e980..7d14982ec 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def UniqueRows( - dataset: VMDataset, - min_percent_threshold: float = 1): -``` +::: {.signature} def UniqueRows( dataset: VMDataset, min_percent_threshold: float = 1): ::: Verifies the diversity of the dataset by ensuring that the count of unique rows exceeds a prescribed threshold. diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index cc01a8e7f..39235a676 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -21,13 +21,7 @@ Get a logger for the given module name -```python -def WOEBinPlots( - dataset: VMDataset, - breaks_adj: list = None, - fig_height: int = 600, - fig_width: int = 500): -``` +::: {.signature} def WOEBinPlots( dataset: VMDataset, breaks_adj: list = None, fig_height: int = 600, fig_width: int = 500): ::: Generates visualizations of Weight of Evidence (WoE) and Information Value (IV) for understanding predictive power of categorical variables in a data set. diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index f4e0601f8..07a4fce68 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def WOEBinTable( - dataset: VMDataset, - breaks_adj: list = None): -``` +::: {.signature} def WOEBinTable( dataset: VMDataset, breaks_adj: list = None): ::: Assesses the Weight of Evidence (WoE) and Information Value (IV) of each feature to evaluate its predictive power in a binary classification model. diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 9a730907d..3fcd2b41c 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -21,9 +21,7 @@ Get a logger for the given module name -```python -def ZivotAndrewsArch(dataset: VMDataset): -``` +::: {.signature} def ZivotAndrewsArch(dataset: VMDataset): ::: Evaluates the order of integration and stationarity of time series data using the Zivot-Andrews unit root test. diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index b7d4abc01..62c291592 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def CommonWords(dataset: VMDataset): -``` +::: {.signature} def CommonWords(dataset: VMDataset): ::: Assesses the most frequent non-stopwords in a text column for identifying prevalent language patterns. diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index e2787eb41..5431b741e 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def Hashtags( - dataset: VMDataset, - top_hashtags: int = 25): -``` +::: {.signature} def Hashtags( dataset: VMDataset, top_hashtags: int = 25): ::: Assesses hashtag frequency in a text column, highlighting usage trends and potential dataset bias or spam. diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 38e23aec9..054329fd1 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def LanguageDetection(dataset): -``` +::: {.signature} def LanguageDetection(dataset): ::: Assesses the diversity of languages in a textual dataset by detecting and visualizing the distribution of languages. diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 448038fac..ac736ac6b 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def Mentions( - dataset: VMDataset, - top_mentions: int = 25): -``` +::: {.signature} def Mentions( dataset: VMDataset, top_mentions: int = 25): ::: Calculates and visualizes frequencies of '@' prefixed mentions in a text-based dataset for NLP model analysis. diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index db69c4b6e..8ec042ba7 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def PolarityAndSubjectivity( - dataset, - threshold_subjectivity = 0.5, - threshold_polarity = 0): -``` +::: {.signature} def PolarityAndSubjectivity( dataset, threshold_subjectivity = 0.5, threshold_polarity = 0): ::: Analyzes the polarity and subjectivity of text data within a given dataset to visualize the sentiment distribution. diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index ed775e6c0..35ed6df4d 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -11,11 +11,7 @@ Metrics functions for any Pandas-compatible datasets -```python -def Punctuations( - dataset, - count_mode = 'token'): -``` +::: {.signature} def Punctuations( dataset, count_mode = 'token'): ::: Analyzes and visualizes the frequency distribution of punctuation usage in a given text dataset. diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index d22db47b5..f7bba11c0 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def Sentiment(dataset): -``` +::: {.signature} def Sentiment(dataset): ::: Analyzes the sentiment of text data within a dataset using the VADER sentiment analysis tool. diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index b42cbfa2f..c92dcbef4 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -11,12 +11,7 @@ Threshold based tests -```python -def StopWords( - dataset: VMDataset, - min_percent_threshold: float = 0.5, - num_words: int = 25): -``` +::: {.signature} def StopWords( dataset: VMDataset, min_percent_threshold: float = 0.5, num_words: int = 25): ::: Evaluates and visualizes the frequency of English stop words in a text dataset against a defined threshold. diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index c95632d49..22638ecb1 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -9,24 +9,13 @@ toc-expand: 4 -```python -def create_metrics_df( - df, - text_column, - unwanted_tokens, - lang): -``` +::: {.signature} def create_metrics_df( df, text_column, unwanted_tokens, lang): ::: ## TextDescription[()]{.muted} -```python -def TextDescription( - dataset: VMDataset, - unwanted_tokens: set = {'cls': 'ExprSet', 'elements': ["'s'", '"s\'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"\'s"', "' '", '"\'\'"', "'dollar'", "'us'", "'``'"]}, - lang: str = 'english'): -``` +::: {.signature} def TextDescription( dataset: VMDataset, unwanted_tokens: set = {'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]}, lang: str = 'english'): ::: Conducts comprehensive textual analysis on a dataset using NLTK to evaluate various parameters and generate visualizations. diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index 1c5b77f00..18f4c3b90 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def Toxicity(dataset): -``` +::: {.signature} def Toxicity(dataset): ::: Assesses the toxicity of text data within a dataset to visualize the distribution of toxicity scores. diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 940186cc0..795ce1775 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -32,12 +32,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val -```python -def BertScore( - dataset, - model, - evaluation_model = 'distilbert-base-uncased'): -``` +::: {.signature} def BertScore( dataset, model, evaluation_model = 'distilbert-base-uncased'): ::: Assesses the quality of machine-generated text using BERTScore metrics and visualizes results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics. diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 1c461d1d9..8d622b118 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -32,11 +32,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val -```python -def BleuScore( - dataset, - model): -``` +::: {.signature} def BleuScore( dataset, model): ::: Evaluates the quality of machine-generated text using BLEU metrics and visualizes the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for BLEU scores. diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 67e137679..dbe734fe3 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def ClusterSizeDistribution( - dataset: VMDataset, - model: VMModel): -``` +::: {.signature} def ClusterSizeDistribution( dataset: VMDataset, model: VMModel): ::: Assesses the performance of clustering models by comparing the distribution of cluster sizes in model predictions with the actual data. diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 56a1806ee..9559d73c3 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -32,11 +32,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val -```python -def ContextualRecall( - dataset, - model): -``` +::: {.signature} def ContextualRecall( dataset, model): ::: Evaluates a Natural Language Generation model's ability to generate contextually relevant and factually correct text, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for contextual recall scores. diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index e385c921e..7af6f453a 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -21,12 +21,7 @@ Get a logger for the given module name -```python -def FeaturesAUC( - dataset: VMDataset, - fontsize: int = 12, - figure_height: int = 500): -``` +::: {.signature} def FeaturesAUC( dataset: VMDataset, fontsize: int = 12, figure_height: int = 500): ::: Evaluates the discriminatory power of each individual feature within a binary classification model by calculating the Area Under the Curve (AUC) for each feature separately. diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 5445b5b16..53288704c 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -32,11 +32,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val -```python -def MeteorScore( - dataset, - model): -``` +::: {.signature} def MeteorScore( dataset, model): ::: Assesses the quality of machine-generated translations by comparing them to human-produced references using the METEOR score, which evaluates precision, recall, and word order. diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index d1055f571..7564a4fcf 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -19,9 +19,7 @@ Attempts to extract all model info from a model object instance -```python -def ModelMetadata(model): -``` +::: {.signature} def ModelMetadata(model): ::: Compare metadata of different models and generate a summary table with the results. **Purpose**: The purpose of this function is to compare the metadata of different models, including information about their architecture, framework, framework version, and programming language. diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index 7eb01bb05..dc5fb3d0e 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -9,15 +9,7 @@ toc-expand: 4 -```python -def ModelPredictionResiduals( - dataset, - model, - nbins = 100, - p_value_threshold = 0.05, - start_date = None, - end_date = None): -``` +::: {.signature} def ModelPredictionResiduals( dataset, model, nbins = 100, p_value_threshold = 0.05, start_date = None, end_date = None): ::: Assesses normality and behavior of residuals in regression models through visualization and statistical tests. diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index e63040453..394a9f854 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -32,11 +32,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val -```python -def RegardScore( - dataset, - model): -``` +::: {.signature} def RegardScore( dataset, model): ::: Assesses the sentiment and potential biases in text generated by NLP models by computing and visualizing regard scores. diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 7ba48cf62..914376c5e 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def RegressionResidualsPlot( - model: VMModel, - dataset: VMDataset, - bin_size: float = 0.1): -``` +::: {.signature} def RegressionResidualsPlot( model: VMModel, dataset: VMDataset, bin_size: float = 0.1): ::: Evaluates regression model performance using residual distribution and actual vs. predicted plots. diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 71deeef36..9eb223f6e 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def RougeScore( - dataset, - model, - metric = 'rouge-1'): -``` +::: {.signature} def RougeScore( dataset, model, metric = 'rouge-1'): ::: Assesses the quality of machine-generated text using ROUGE metrics and visualizes the results to provide comprehensive performance insights. diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index a20cc6597..5b6ec06e3 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def TimeSeriesPredictionWithCI( - dataset, - model, - confidence = 0.95): -``` +::: {.signature} def TimeSeriesPredictionWithCI( dataset, model, confidence = 0.95): ::: Assesses predictive accuracy and uncertainty in time series models, highlighting breaches beyond confidence intervals. diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index 8ea071139..bda6a823a 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def TimeSeriesPredictionsPlot( - dataset, - model): -``` +::: {.signature} def TimeSeriesPredictionsPlot( dataset, model): ::: Plot actual vs predicted values for time series data and generate a visual comparison for the model. diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index ccfd8ea2e..187108e0e 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def TimeSeriesR2SquareBySegments( - dataset, - model, - segments = None): -``` +::: {.signature} def TimeSeriesR2SquareBySegments( dataset, model, segments = None): ::: Evaluates the R-Squared values of regression models over specified time segments in time series data to assess segment-wise model performance. diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index 670a9b938..4b8f5e546 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def TokenDisparity( - dataset, - model): -``` +::: {.signature} def TokenDisparity( dataset, model): ::: Evaluates the token disparity between reference and generated texts, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for token counts. diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index 7a39812f0..bd4c49e86 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def ToxicityScore( - dataset, - model): -``` +::: {.signature} def ToxicityScore( dataset, model): ::: Assesses the toxicity levels of texts generated by NLP models to identify and mitigate harmful or offensive content. diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 7efc72467..106c9a4dd 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def AdjustedMutualInformation( - model: VMModel, - dataset: VMDataset): -``` +::: {.signature} def AdjustedMutualInformation( model: VMModel, dataset: VMDataset): ::: Evaluates clustering model performance by measuring mutual information between true and predicted labels, adjusting for chance. diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 87a07ece1..3cadff611 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def AdjustedRandIndex( - model: VMModel, - dataset: VMDataset): -``` +::: {.signature} def AdjustedRandIndex( model: VMModel, dataset: VMDataset): ::: Measures the similarity between two data clusters using the Adjusted Rand Index (ARI) metric in clustering machine learning models. diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 8cb83b252..ee7578741 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def CalibrationCurve( - model: VMModel, - dataset: VMDataset, - n_bins: int = 10): -``` +::: {.signature} def CalibrationCurve( model: VMModel, dataset: VMDataset, n_bins: int = 10): ::: Evaluates the calibration of probability estimates by comparing predicted probabilities against observed frequencies. diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index a0fd45845..f257ec282 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def ClassifierPerformance( - dataset: VMDataset, - model: VMModel, - average: str = 'macro'): -``` +::: {.signature} def ClassifierPerformance( dataset: VMDataset, model: VMModel, average: str = 'macro'): ::: Evaluates performance of binary or multiclass classification models using precision, recall, F1-Score, accuracy, and ROC AUC scores. @@ -48,9 +43,4 @@ The test produces a report that includes precision, recall, F1-Score, and accura -```python -def multiclass_roc_auc_score( - y_test, - y_pred, - average = 'macro'): -``` +::: {.signature} def multiclass_roc_auc_score( y_test, y_pred, average = 'macro'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 7cca622a9..5facc4e47 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -9,13 +9,7 @@ toc-expand: 4 -```python -def ClassifierThresholdOptimization( - dataset: VMDataset, - model: VMModel, - methods = None, - target_recall = None): -``` +::: {.signature} def ClassifierThresholdOptimization( dataset: VMDataset, model: VMModel, methods = None, target_recall = None): ::: Analyzes and visualizes different threshold optimization methods for binary classification models. @@ -83,13 +77,7 @@ The test implements multiple threshold optimization methods: -```python -def find_optimal_threshold( - y_true, - y_prob, - method = 'youden', - target_recall = None): -``` +::: {.signature} def find_optimal_threshold( y_true, y_prob, method = 'youden', target_recall = None): ::: Find the optimal classification threshold using various methods. diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 9d21f1c5a..0321f9dd8 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def ClusterCosineSimilarity( - model: VMModel, - dataset: VMDataset): -``` +::: {.signature} def ClusterCosineSimilarity( model: VMModel, dataset: VMDataset): ::: Measures the intra-cluster similarity of a clustering model using cosine similarity. diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index f8ab27f97..342c785e3 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def ClusterPerformanceMetrics( - model: VMModel, - dataset: VMDataset): -``` +::: {.signature} def ClusterPerformanceMetrics( model: VMModel, dataset: VMDataset): ::: Evaluates the performance of clustering machine learning models using multiple established metrics. diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index c1eff609e..b121ca235 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def CompletenessScore( - model: VMModel, - dataset: VMDataset): -``` +::: {.signature} def CompletenessScore( model: VMModel, dataset: VMDataset): ::: Evaluates a clustering model's capacity to categorize instances from a single class into the same cluster. diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index bc8d18ad7..ea07a1f68 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def ConfusionMatrix( - dataset: VMDataset, - model: VMModel): -``` +::: {.signature} def ConfusionMatrix( dataset: VMDataset, model: VMModel): ::: Evaluates and visually represents the classification ML model's predictive performance using a Confusion Matrix heatmap. diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index c8f893c0a..e6414d70a 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def FeatureImportance( - dataset: VMDataset, - model: VMModel, - num_features: int = 3): -``` +::: {.signature} def FeatureImportance( dataset: VMDataset, model: VMModel, num_features: int = 3): ::: Compute feature importance scores for a given model and generate a summary table with the top important features. diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index f4f8b3d90..8229056d6 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def FowlkesMallowsScore( - dataset: VMDataset, - model: VMModel): -``` +::: {.signature} def FowlkesMallowsScore( dataset: VMDataset, model: VMModel): ::: Evaluates the similarity between predicted and actual cluster assignments in a model using the Fowlkes-Mallows score. diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 3dcd8bed5..a21c8d6fd 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def HomogeneityScore( - dataset: VMDataset, - model: VMModel): -``` +::: {.signature} def HomogeneityScore( dataset: VMDataset, model: VMModel): ::: Assesses clustering homogeneity by comparing true and predicted labels, scoring from 0 (heterogeneous) to 1 (homogeneous). diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index e36a008e5..c06271012 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -9,26 +9,13 @@ toc-expand: 4 -```python -def custom_recall( - y_true, - y_pred_proba, - threshold = 0.5): -``` +::: {.signature} def custom_recall( y_true, y_pred_proba, threshold = 0.5): ::: ## HyperParametersTuning[()]{.muted} -```python -def HyperParametersTuning( - model: VMModel, - dataset: VMDataset, - param_grid: dict, - scoring: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'List'}, {'cls': 'ExprName', 'name': 'Dict'}], 'implicit': True}} = None, - thresholds: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'float'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}}], 'implicit': True}} = None, - fit_params: dict = None): -``` +::: {.signature} def HyperParametersTuning( model: VMModel, dataset: VMDataset, param_grid: dict, scoring: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'List'}, {'cls': 'ExprName', 'name': 'Dict'}], 'implicit': True}} = None, thresholds: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'float'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}}], 'implicit': True}} = None, fit_params: dict = None): ::: Performs exhaustive grid search over specified parameter ranges to find optimal model configurations across different metrics and decision thresholds. diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index bc8992d5d..51269ffe3 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def KMeansClustersOptimization( - model: VMModel, - dataset: VMDataset, - n_clusters: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'int'}}, 'None'], 'implicit': True}} = None): -``` +::: {.signature} def KMeansClustersOptimization( model: VMModel, dataset: VMDataset, n_clusters: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'int'}}, 'None'], 'implicit': True}} = None): ::: Optimizes the number of clusters in K-means models using Elbow and Silhouette methods. diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 79d40678e..0a7712c58 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def MinimumAccuracy( - dataset: VMDataset, - model: VMModel, - min_threshold: float = 0.7): -``` +::: {.signature} def MinimumAccuracy( dataset: VMDataset, model: VMModel, min_threshold: float = 0.7): ::: Checks if the model's prediction accuracy meets or surpasses a specified threshold. diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 1c36fd7e4..8a3328f57 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def MinimumF1Score( - dataset: VMDataset, - model: VMModel, - min_threshold: float = 0.5): -``` +::: {.signature} def MinimumF1Score( dataset: VMDataset, model: VMModel, min_threshold: float = 0.5): ::: Assesses if the model's F1 score on the validation set meets a predefined minimum threshold, ensuring balanced performance between precision and recall. diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 0464d0472..78a1d886c 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def MinimumROCAUCScore( - dataset: VMDataset, - model: VMModel, - min_threshold: float = 0.5): -``` +::: {.signature} def MinimumROCAUCScore( dataset: VMDataset, model: VMModel, min_threshold: float = 0.5): ::: Validates model by checking if the ROC AUC score meets or surpasses a specified threshold. diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 265130e64..d24e2914b 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def ModelParameters( - model, - model_params = None): -``` +::: {.signature} def ModelParameters( model, model_params = None): ::: Extracts and displays model parameters in a structured format for transparency and reproducibility. diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 0356f3172..9ba004b47 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -20,11 +20,7 @@ def multiclass_roc_auc_score( -```python -def ModelsPerformanceComparison( - dataset: VMDataset, - models: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'list'}, 'slice': {'cls': 'ExprName', 'name': 'VMModel'}}): -``` +::: {.signature} def ModelsPerformanceComparison( dataset: VMDataset, models: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'list'}, 'slice': {'cls': 'ExprName', 'name': 'VMModel'}}): ::: Evaluates and compares the performance of multiple Machine Learning models using various metrics like accuracy, precision, recall, and F1 score. diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 2f3d268a1..05d475cba 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -21,13 +21,7 @@ Get a logger for the given module name -```python -def OverfitDiagnosis( - model: VMModel, - datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, - metric: str = None, - cut_off_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): -``` +::: {.signature} def OverfitDiagnosis( model: VMModel, datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, metric: str = None, cut_off_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): ::: Assesses potential overfitting in a model's predictions, identifying regions where performance between training and testing sets deviates significantly. diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 13a031f24..bff2749f8 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -21,13 +21,7 @@ Get a logger for the given module name -```python -def PermutationFeatureImportance( - model: VMModel, - dataset: VMDataset, - fontsize: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'int'}, 'None'], 'implicit': True}} = None, - figure_height: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'int'}, 'None'], 'implicit': True}} = None): -``` +::: {.signature} def PermutationFeatureImportance( model: VMModel, dataset: VMDataset, fontsize: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'int'}, 'None'], 'implicit': True}} = None, figure_height: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'int'}, 'None'], 'implicit': True}} = None): ::: Assesses the significance of each feature in a model by evaluating the impact on model performance when feature values are randomly rearranged. diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 318c5ba86..22c554c9b 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -21,13 +21,7 @@ Get a logger for the given module name -```python -def calculate_psi( - score_initial, - score_new, - num_bins = 10, - mode = 'fixed'): -``` +::: {.signature} def calculate_psi( score_initial, score_new, num_bins = 10, mode = 'fixed'): ::: Taken from: https://towardsdatascience.com/checking-model-stability-and-population-shift-with-psi-and-csi-6d12af008783 @@ -35,13 +29,7 @@ Taken from: https://towardsdatascience.com/checking-model-stability-and-populati -```python -def PopulationStabilityIndex( - datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, - model: VMModel, - num_bins: int = 10, - mode: str = 'fixed'): -``` +::: {.signature} def PopulationStabilityIndex( datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, num_bins: int = 10, mode: str = 'fixed'): ::: Assesses the Population Stability Index (PSI) to quantify the stability of an ML model's predictions across different datasets. diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index a443ad57f..0882f7cca 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def PrecisionRecallCurve( - model: VMModel, - dataset: VMDataset): -``` +::: {.signature} def PrecisionRecallCurve( model: VMModel, dataset: VMDataset): ::: Evaluates the precision-recall trade-off for binary classification models and visualizes the Precision-Recall curve. diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 3a9b5862a..33b2f3575 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def ROCCurve( - model: VMModel, - dataset: VMDataset): -``` +::: {.signature} def ROCCurve( model: VMModel, dataset: VMDataset): ::: Evaluates binary classification model performance by generating and plotting the Receiver Operating Characteristic (ROC) curve and calculating the Area Under Curve (AUC) score. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index eb7573403..d96a87357 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def RegressionErrors( - model, - dataset): -``` +::: {.signature} def RegressionErrors( model, dataset): ::: Assesses the performance and error distribution of a regression model using various error metrics. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index f12e7fc5a..967725b10 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -21,11 +21,7 @@ Get a logger for the given module name -```python -def RegressionErrorsComparison( - datasets, - models): -``` +::: {.signature} def RegressionErrorsComparison( datasets, models): ::: Assesses multiple regression error metrics to compare model performance across different datasets, emphasizing systematic overestimation or underestimation and large percentage errors. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 0107dc93e..1b37c9674 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -21,11 +21,7 @@ Get a logger for the given module name -```python -def RegressionPerformance( - model: VMModel, - dataset: VMDataset): -``` +::: {.signature} def RegressionPerformance( model: VMModel, dataset: VMDataset): ::: Evaluates the performance of a regression model using five different metrics: MAE, MSE, RMSE, MAPE, and MBD. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index ca250f72f..afe853aed 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -23,11 +23,7 @@ Adjusted R2 Score -```python -def RegressionR2Square( - dataset, - model): -``` +::: {.signature} def RegressionR2Square( dataset, model): ::: Assesses the overall goodness-of-fit of a regression model by evaluating R-squared (R2) and Adjusted R-squared (Adj R2) scores to determine the model's explanatory power over the dependent variable. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index da1793b33..75504655f 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -23,11 +23,7 @@ Adjusted R2 Score -```python -def RegressionR2SquareComparison( - datasets, - models): -``` +::: {.signature} def RegressionR2SquareComparison( datasets, models): ::: Compares R-Squared and Adjusted R-Squared values for different regression models across multiple datasets to assess model performance and relevance of features. diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index d4a791917..a326e6151 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -21,14 +21,7 @@ Get a logger for the given module name -```python -def RobustnessDiagnosis( - datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, - model: VMModel, - metric: str = None, - scaling_factor_std_dev_list: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}} = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'}, - performance_decay_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): -``` +::: {.signature} def RobustnessDiagnosis( datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, metric: str = None, scaling_factor_std_dev_list: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}} = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'}, performance_decay_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): ::: Assesses the robustness of a machine learning model by evaluating performance decay under noisy conditions. diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index b2b18222c..40aedc48a 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -21,12 +21,7 @@ Get a logger for the given module name -```python -def generate_shap_plot( - type_, - shap_values, - x_test): -``` +::: {.signature} def generate_shap_plot( type\_, shap_values, x_test): ::: Plots two types of SHAP global importance (SHAP). @@ -44,11 +39,7 @@ Plots two types of SHAP global importance (SHAP). -```python -def select_shap_values( - shap_values, - class_of_interest): -``` +::: {.signature} def select_shap_values( shap_values, class_of_interest): ::: Selects SHAP values for binary or multiclass classification. For regression models, returns the SHAP values directly as there are no classes. @@ -69,14 +60,7 @@ Selects SHAP values for binary or multiclass classification. For regression mode -```python -def SHAPGlobalImportance( - model: VMModel, - dataset: VMDataset, - kernel_explainer_samples: int = 10, - tree_or_linear_explainer_samples: int = 200, - class_of_interest: int = None): -``` +::: {.signature} def SHAPGlobalImportance( model: VMModel, dataset: VMDataset, kernel_explainer_samples: int = 10, tree_or_linear_explainer_samples: int = 200, class_of_interest: int = None): ::: Evaluates and visualizes global feature importance using SHAP values for model explanation and risk identification. diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index f1e74f9c5..ee7cc99e5 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -9,13 +9,7 @@ toc-expand: 4 -```python -def ScoreProbabilityAlignment( - model: VMModel, - dataset: VMDataset, - score_column: str = 'score', - n_bins: int = 10): -``` +::: {.signature} def ScoreProbabilityAlignment( model: VMModel, dataset: VMDataset, score_column: str = 'score', n_bins: int = 10): ::: Analyzes the alignment between credit scores and predicted probabilities. diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index a82f66688..48429ca33 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def SilhouettePlot( - model: VMModel, - dataset: VMDataset): -``` +::: {.signature} def SilhouettePlot( model: VMModel, dataset: VMDataset): ::: Calculates and visualizes Silhouette Score, assessing the degree of data point suitability to its cluster in ML models. diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 48582f424..52321c9e7 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def TrainingTestDegradation( - datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, - model: VMModel, - max_threshold: float = 0.1): -``` +::: {.signature} def TrainingTestDegradation( datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, max_threshold: float = 0.1): ::: Tests if model performance degradation between training and test datasets exceeds a predefined threshold. diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index a18d8e66c..2a8298629 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def VMeasure( - dataset: VMDataset, - model: VMModel): -``` +::: {.signature} def VMeasure( dataset: VMDataset, model: VMModel): ::: Evaluates homogeneity and completeness of a clustering model using the V Measure Score. diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 05d904347..0d2f41f60 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -9,14 +9,7 @@ toc-expand: 4 -```python -def WeakspotsDiagnosis( - datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, - model: VMModel, - features_columns: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}, 'None'], 'implicit': True}} = None, - metrics: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Callable'}], 'implicit': True}}, 'None'], 'implicit': True}} = None, - thresholds: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'float'}], 'implicit': True}}, 'None'], 'implicit': True}} = None): -``` +::: {.signature} def WeakspotsDiagnosis( datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, features_columns: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}, 'None'], 'implicit': True}} = None, metrics: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Callable'}], 'implicit': True}}, 'None'\], 'implicit': True}} = None, thresholds: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'float'}], 'implicit': True}}, 'None'\], 'implicit': True}} = None): ::: Identifies and visualizes weak spots in a machine learning model's performance across various sections of the feature space. diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 5a5d5cace..2963dad5e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -21,11 +21,7 @@ Get a logger for the given module name -```python -def AutoARIMA( - model: VMModel, - dataset: VMDataset): -``` +::: {.signature} def AutoARIMA( model: VMModel, dataset: VMDataset): ::: Evaluates ARIMA models for time-series forecasting, ranking them using Bayesian and Akaike Information Criteria. diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 9ecf30654..d14d2e568 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def CumulativePredictionProbabilities( - dataset, - model, - title = 'Cumulative Probabilities'): -``` +::: {.signature} def CumulativePredictionProbabilities( dataset, model, title = 'Cumulative Probabilities'): ::: Visualizes cumulative probabilities of positive and negative classes for both training and testing in classification models. diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 6b4fe48a5..f6eb64d5d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def DurbinWatsonTest( - dataset, - model, - threshold = {'cls': 'ExprList', 'elements': ['1.5', '2.5']}): -``` +::: {.signature} def DurbinWatsonTest( dataset, model, threshold = {'cls': 'ExprList', 'elements': ['1.5', '2.5']}): ::: Assesses autocorrelation in time series data features using the Durbin-Watson statistic. diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index 9d909bbb3..223444596 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def GINITable( - dataset, - model): -``` +::: {.signature} def GINITable( dataset, model): ::: Evaluates classification model performance using AUC, GINI, and KS metrics for training and test datasets. diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index a1b9aa9cc..0d5bb93fe 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def KolmogorovSmirnov( - model: VMModel, - dataset: VMDataset, - dist: str = 'norm'): -``` +::: {.signature} def KolmogorovSmirnov( model: VMModel, dataset: VMDataset, dist: str = 'norm'): ::: Assesses whether each feature in the dataset aligns with a normal distribution using the Kolmogorov-Smirnov test. diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 2f7669970..008a496cd 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def Lilliefors(dataset: VMDataset): -``` +::: {.signature} def Lilliefors(dataset: VMDataset): ::: Assesses the normality of feature distributions in an ML model's training dataset using the Lilliefors test. diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index 772c20034..c632c73e7 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def PredictionProbabilitiesHistogram( - dataset, - model, - title = 'Histogram of Predictive Probabilities'): -``` +::: {.signature} def PredictionProbabilitiesHistogram( dataset, model, title = 'Histogram of Predictive Probabilities'): ::: Assesses the predictive probability distribution for binary classification to evaluate model performance and potential overfitting or bias. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 7dd358407..2989b33cd 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -9,9 +9,7 @@ toc-expand: 4 -```python -def RegressionCoeffs(model): -``` +::: {.signature} def RegressionCoeffs(model): ::: Assesses the significance and uncertainty of predictor variables in a regression model through visualization of coefficients and their 95% confidence intervals. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 3e05913fe..120415df8 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -21,12 +21,7 @@ Get a logger for the given module name -```python -def RegressionFeatureSignificance( - model: VMModel, - fontsize: int = 10, - p_threshold: float = 0.05): -``` +::: {.signature} def RegressionFeatureSignificance( model: VMModel, fontsize: int = 10, p_threshold: float = 0.05): ::: Assesses and visualizes the statistical significance of features in a regression model. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index c135c337e..434c0f9f5 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -21,13 +21,7 @@ Get a logger for the given module name -```python -def RegressionModelForecastPlot( - model: VMModel, - dataset: VMDataset, - start_date: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None, - end_date: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None): -``` +::: {.signature} def RegressionModelForecastPlot( model: VMModel, dataset: VMDataset, start_date: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None, end_date: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None): ::: Generates plots to visually compare the forecasted outcomes of a regression model against actual observed values over a specified date range. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index c5de2a0fa..a55bfc45c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -9,21 +9,13 @@ toc-expand: 4 -```python -def integrate_diff( - series_diff, - start_value): -``` +::: {.signature} def integrate_diff( series_diff, start_value): ::: ## RegressionModelForecastPlotLevels[()]{.muted} -```python -def RegressionModelForecastPlotLevels( - model: VMModel, - dataset: VMDataset): -``` +::: {.signature} def RegressionModelForecastPlotLevels( model: VMModel, dataset: VMDataset): ::: Assesses the alignment between forecasted and observed values in regression models through visual plots diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index b5231cee0..14476dfae 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -21,23 +21,13 @@ Get a logger for the given module name -```python -def integrate_diff( - series_diff, - start_value): -``` +::: {.signature} def integrate_diff( series_diff, start_value): ::: ## RegressionModelSensitivityPlot[()]{.muted} -```python -def RegressionModelSensitivityPlot( - dataset: VMDataset, - model: VMModel, - shocks: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}} = {'cls': 'ExprList', 'elements': ['0.1']}, - transformation: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None): -``` +::: {.signature} def RegressionModelSensitivityPlot( dataset: VMDataset, model: VMModel, shocks: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}} = {'cls': 'ExprList', 'elements': ['0.1']}, transformation: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None): ::: Assesses the sensitivity of a regression model to changes in independent variables by applying shocks and visualizing the impact. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index d7bf4a0e9..466cfaaf1 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -23,11 +23,7 @@ Adjusted R2 Score -```python -def RegressionModelSummary( - dataset: VMDataset, - model: VMModel): -``` +::: {.signature} def RegressionModelSummary( dataset: VMDataset, model: VMModel): ::: Evaluates regression model performance using metrics including R-Squared, Adjusted R-Squared, MSE, and RMSE. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 329dba37e..779236981 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -21,13 +21,7 @@ Get a logger for the given module name -```python -def RegressionPermutationFeatureImportance( - dataset: VMDataset, - model: VMModel, - fontsize: int = 12, - figure_height: int = 500): -``` +::: {.signature} def RegressionPermutationFeatureImportance( dataset: VMDataset, model: VMModel, fontsize: int = 12, figure_height: int = 500): ::: Assesses the significance of each feature in a model by evaluating the impact on model performance when feature values are randomly rearranged. diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index 271e44b69..f5a3f11d9 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -9,12 +9,7 @@ toc-expand: 4 -```python -def ScorecardHistogram( - dataset, - title = 'Histogram of Scores', - score_column = 'score'): -``` +::: {.signature} def ScorecardHistogram( dataset, title = 'Histogram of Scores', score_column = 'score'): ::: The Scorecard Histogram test evaluates the distribution of credit scores between default and non-default instances, providing critical insights into the performance and generalizability of credit-risk models. diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 291016c69..7b66f68f9 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -9,12 +9,6 @@ toc-expand: 4 -```python -def adj_r2_score( - actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, - predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, - rowcount: int, - featurecount: int): -``` +::: {.signature} def adj_r2_score( actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: int, featurecount: int): ::: Adjusted R2 Score diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 35c88054b..f272f56bc 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -55,11 +55,7 @@ Explanation: " -> 8 -```python -def Bias( - model, - min_threshold = 7): -``` +::: {.signature} def Bias( model, min_threshold = 7): ::: Assesses potential bias in a Large Language Model by analyzing the distribution and order of exemplars in the prompt. diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 381c66ac9..6b079cb77 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -55,11 +55,7 @@ Explanation: " -> 8 -```python -def Clarity( - model, - min_threshold = 7): -``` +::: {.signature} def Clarity( model, min_threshold = 7): ::: Evaluates and scores the clarity of prompts in a Large Language Model based on specified guidelines. diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 12ae796da..7b17bc0a8 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -55,11 +55,7 @@ Explanation: " -> 8 -```python -def Conciseness( - model, - min_threshold = 7): -``` +::: {.signature} def Conciseness( model, min_threshold = 7): ::: Analyzes and grades the conciseness of prompts provided to a Large Language Model. diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 8ac819989..5e9e3f781 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -55,11 +55,7 @@ Explanation: " -> 8 -```python -def Delimitation( - model, - min_threshold = 7): -``` +::: {.signature} def Delimitation( model, min_threshold = 7): ::: Evaluates the proper use of delimiters in prompts provided to Large Language Models. diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 75b3e56ad..550143957 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -55,11 +55,7 @@ Explanation: " -> 8 -```python -def NegativeInstruction( - model, - min_threshold = 7): -``` +::: {.signature} def NegativeInstruction( model, min_threshold = 7): ::: Evaluates and grades the use of affirmative, proactive language over negative instructions in LLM prompts. diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index ab9ea5efb..be70406e1 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -23,12 +23,7 @@ Call LLM with the given prompts and return the response -```python -def Robustness( - model, - dataset, - num_tests = 10): -``` +::: {.signature} def Robustness( model, dataset, num_tests = 10): ::: Assesses the robustness of prompts provided to a Large Language Model under varying conditions and contexts. This test specifically measures the model's ability to generate correct classifications with the given prompt even when the inputs are edge cases or otherwise difficult to classify. diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 21c7df7fd..b99904dda 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -55,11 +55,7 @@ Explanation: " -> 8 -```python -def Specificity( - model, - min_threshold = 7): -``` +::: {.signature} def Specificity( model, min_threshold = 7): ::: Evaluates and scores the specificity of prompts provided to a Large Language Model (LLM), based on clarity, detail, and relevance. diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index 666935e73..edb9477b1 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -9,13 +9,7 @@ toc-expand: 4 -```python -def call_model( - system_prompt: str, - user_prompt: str, - temperature: float = 0.0, - seed: int = 42): -``` +::: {.signature} def call_model( system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): ::: Call LLM with the given prompts and return the response @@ -23,9 +17,7 @@ Call LLM with the given prompts and return the response -```python -def get_explanation(response: str): -``` +::: {.signature} def get_explanation(response: str): ::: Get just the explanation from the response string TODO: use json response mode instead of this @@ -39,9 +31,7 @@ Explanation: " -> "" -```python -def get_score(response: str): -``` +::: {.signature} def get_score(response: str): ::: Get just the score from the response string TODO: use json response mode instead of this diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 9b700175a..37a59ccf0 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -9,11 +9,7 @@ toc-expand: 4 -```python -def describe_metric( - metric_id: str, - kwargs = {}): -``` +::: {.signature} def describe_metric( metric_id: str, kwargs = {}): ::: Describe a metric @@ -21,9 +17,7 @@ Describe a metric -```python -def list_metrics(kwargs = {}): -``` +::: {.signature} def list_metrics(kwargs = {}): ::: List all metrics @@ -31,10 +25,6 @@ List all metrics -```python -def run_metric( - metric_id: str, - kwargs = {}): -``` +::: {.signature} def run_metric( metric_id: str, kwargs = {}): ::: Run a metric diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index cae8e303c..17ef67af0 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -157,14 +157,14 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: qmd_path = written_qmd_files.get(qmd_filename) if qmd_path and os.path.exists(qmd_path): - print(f"\nParsing headings from: {qmd_path}") + # print(f"\nParsing headings from: {qmd_path}") with open(qmd_path, 'r') as f: content = f.read() - print("\nRaw content:") - for line in content.split('\n'): - if line.startswith('#'): - print(f"Found heading line: {line}") + # print("\nRaw content:") + # for line in content.split('\n'): + # if line.startswith('#'): + # print(f"Found heading line: {line}") # Track current class for nesting methods current_class = None @@ -174,7 +174,7 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: for line in content.split('\n'): if line.startswith('## '): heading = line[3:].strip() - print(f"Found L2 heading: {heading}") + # print(f"Found L2 heading: {heading}") anchor = clean_anchor_text(heading) item = { 'text': heading, @@ -187,7 +187,7 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: elif line.startswith('### '): if current_section: heading = line[4:].strip() - print(f" Found L3 heading under {current_section['text']}: {heading}") + # print(f" Found L3 heading under {current_section['text']}: {heading}") anchor = clean_anchor_text(heading) item = { 'text': heading, @@ -196,20 +196,20 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: if 'class' in heading or 'class' in heading: item['contents'] = [] current_class = item - print(f" Set current_class to: {heading}") + # print(f" Set current_class to: {heading}") current_section['contents'].append(item) - print(f" Current section contents: {current_section['contents']}") + # print(f" Current section contents: {current_section['contents']}") elif line.startswith('#### '): if current_class: heading = line[5:].strip() - print(f" Found L4 heading under class {current_class['text']}: {heading}") + # print(f" Found L4 heading under class {current_class['text']}: {heading}") anchor = clean_anchor_text(heading) method_item = { 'text': heading, 'file': f"reference/validmind.qmd#{anchor}" } current_class['contents'].append(method_item) - print(f" Added method to class. Class contents now: {current_class['contents']}") + # print(f" Added method to class. Class contents now: {current_class['contents']}") # Clean up empty contents lists at the end for item in module_items: @@ -220,27 +220,27 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: if child.get('contents') and not child['contents']: del child['contents'] - print("\nFinal structure:") - for item in module_items: - print(f"Section: {item['text']}") - if 'contents' in item: - for child in item['contents']: - print(f" Child: {child['text']}") - if 'contents' in child: - for method in child['contents']: - print(f" Method: {method['text']}") + # print("\nFinal structure:") + # for item in module_items: + # print(f"Section: {item['text']}") + # if 'contents' in item: + # for child in item['contents']: + # print(f" Child: {child['text']}") + # if 'contents' in child: + # for method in child['contents']: + # print(f" Method: {method['text']}") if module_items: result['root'] = module_items - print("\nCollected items:") - for item in module_items: - print(f" {item['text']} -> {item['file']}") - if item.get('contents'): - for child in item['contents']: - print(f" - {child['text']} -> {child['file']}") - if child.get('contents'): # Add this to show class methods - for method in child['contents']: - print(f" * {method['text']} -> {method['file']}") + # print("\nCollected items:") + # for item in module_items: + # print(f" {item['text']} -> {item['file']}") + # if item.get('contents'): + # for child in item['contents']: + # print(f" - {child['text']} -> {child['file']}") + # if child.get('contents'): # Add this to show class methods + # for method in child['contents']: + # print(f" * {method['text']} -> {method['file']}") # Recursively collect from submodules for member in sort_members(module['members'], module.get('name') == 'errors'): From db05cca629c30425b08e8da389f1ad50d74f8250 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 31 Jan 2025 18:50:38 -0800 Subject: [PATCH 046/207] Halfway through switching to better signatures --- docs/templates/class.qmd.jinja2 | 8 +- docs/templates/function.qmd.jinja2 | 15 +- docs/templates/macros/signatures.jinja2 | 14 + docs/templates/module.qmd.jinja2 | 26 +- docs/templates/styles.css | 67 ++-- docs/validmind.qmd | 271 ++++++++------- .../classification/customer_churn.qmd | 69 ++-- .../datasets/classification/taiwan_credit.qmd | 61 ++-- .../datasets/credit_risk/lending_club.qmd | 86 ++++- .../credit_risk/lending_club_bias.qmd | 33 +- docs/validmind/datasets/nlp/cnn_dailymail.qmd | 18 +- .../datasets/nlp/twitter_covid_19.qmd | 8 +- docs/validmind/datasets/regression/fred.qmd | 66 +++- .../datasets/regression/lending_club.qmd | 26 +- docs/validmind/errors.qmd | 94 +++-- docs/validmind/test_suites.qmd | 73 +++- docs/validmind/tests.qmd | 206 ++++++----- .../tests/data_validation/ACFandPACFPlot.qmd | 8 +- docs/validmind/tests/data_validation/ADF.qmd | 23 +- .../tests/data_validation/AutoAR.qmd | 24 +- .../tests/data_validation/AutoMA.qmd | 24 +- .../data_validation/AutoStationarity.qmd | 9 +- .../data_validation/BivariateScatterPlots.qmd | 8 +- .../tests/data_validation/BoxPierce.qmd | 8 +- .../ChiSquaredFeaturesTable.qmd | 9 +- .../tests/data_validation/ClassImbalance.qmd | 9 +- .../data_validation/DatasetDescription.qmd | 58 +++- .../tests/data_validation/DatasetSplit.qmd | 8 +- .../data_validation/DescriptiveStatistics.qmd | 38 +- .../tests/data_validation/DickeyFullerGLS.qmd | 23 +- .../tests/data_validation/Duplicates.qmd | 9 +- .../data_validation/EngleGrangerCoint.qmd | 9 +- .../FeatureTargetCorrelationPlot.qmd | 9 +- .../tests/data_validation/HighCardinality.qmd | 9 +- .../HighPearsonCorrelation.qmd | 9 +- .../data_validation/IQROutliersBarPlot.qmd | 18 +- .../data_validation/IQROutliersTable.qmd | 18 +- .../IsolationForestOutliers.qmd | 9 +- .../tests/data_validation/JarqueBera.qmd | 8 +- docs/validmind/tests/data_validation/KPSS.qmd | 23 +- .../tests/data_validation/LJungBox.qmd | 8 +- .../LaggedCorrelationHeatmap.qmd | 9 +- .../tests/data_validation/MissingValues.qmd | 9 +- .../data_validation/MissingValuesBarPlot.qmd | 9 +- .../data_validation/MutualInformation.qmd | 9 +- .../PearsonCorrelationMatrix.qmd | 8 +- .../data_validation/PhillipsPerronArch.qmd | 23 +- .../ProtectedClassesCombination.qmd | 24 +- .../ProtectedClassesDescription.qmd | 24 +- .../ProtectedClassesDisparity.qmd | 24 +- .../ProtectedClassesThresholdOptimizer.qmd | 76 +++- .../data_validation/RollingStatsPlot.qmd | 18 +- .../tests/data_validation/RunsTest.qmd | 8 +- .../tests/data_validation/ScatterPlot.qmd | 8 +- .../data_validation/ScoreBandDefaultRates.qmd | 9 +- .../data_validation/SeasonalDecompose.qmd | 24 +- .../tests/data_validation/ShapiroWilk.qmd | 8 +- .../tests/data_validation/Skewness.qmd | 9 +- .../tests/data_validation/SpreadPlot.qmd | 8 +- .../TabularCategoricalBarPlots.qmd | 8 +- .../TabularDateTimeHistograms.qmd | 8 +- .../TabularDescriptionTables.qmd | 59 +++- .../TabularNumericalHistograms.qmd | 8 +- .../data_validation/TargetRateBarPlots.qmd | 8 +- .../data_validation/TimeSeriesDescription.qmd | 8 +- .../TimeSeriesDescriptiveStatistics.qmd | 8 +- .../data_validation/TimeSeriesFrequency.qmd | 8 +- .../data_validation/TimeSeriesHistogram.qmd | 24 +- .../data_validation/TimeSeriesLinePlot.qmd | 8 +- .../TimeSeriesMissingValues.qmd | 9 +- .../data_validation/TimeSeriesOutliers.qmd | 9 +- .../data_validation/TooManyZeroValues.qmd | 9 +- .../tests/data_validation/UniqueRows.qmd | 9 +- .../tests/data_validation/WOEBinPlots.qmd | 24 +- .../tests/data_validation/WOEBinTable.qmd | 9 +- .../data_validation/ZivotAndrewsArch.qmd | 23 +- .../tests/data_validation/nlp/CommonWords.qmd | 8 +- .../tests/data_validation/nlp/Hashtags.qmd | 9 +- .../data_validation/nlp/LanguageDetection.qmd | 8 +- .../tests/data_validation/nlp/Mentions.qmd | 9 +- .../nlp/PolarityAndSubjectivity.qmd | 9 +- .../data_validation/nlp/Punctuations.qmd | 9 +- .../tests/data_validation/nlp/Sentiment.qmd | 8 +- .../tests/data_validation/nlp/StopWords.qmd | 9 +- .../data_validation/nlp/TextDescription.qmd | 18 +- .../tests/data_validation/nlp/Toxicity.qmd | 8 +- .../tests/model_validation/BertScore.qmd | 25 +- .../tests/model_validation/BleuScore.qmd | 25 +- .../ClusterSizeDistribution.qmd | 9 +- .../model_validation/ContextualRecall.qmd | 25 +- .../tests/model_validation/FeaturesAUC.qmd | 24 +- .../tests/model_validation/MeteorScore.qmd | 25 +- .../tests/model_validation/ModelMetadata.qmd | 20 +- .../ModelPredictionResiduals.qmd | 9 +- .../tests/model_validation/RegardScore.qmd | 25 +- .../RegressionResidualsPlot.qmd | 9 +- .../tests/model_validation/RougeScore.qmd | 9 +- .../TimeSeriesPredictionWithCI.qmd | 9 +- .../TimeSeriesPredictionsPlot.qmd | 9 +- .../TimeSeriesR2SquareBySegments.qmd | 9 +- .../tests/model_validation/TokenDisparity.qmd | 9 +- .../tests/model_validation/ToxicityScore.qmd | 9 +- .../sklearn/AdjustedMutualInformation.qmd | 9 +- .../sklearn/AdjustedRandIndex.qmd | 9 +- .../sklearn/CalibrationCurve.qmd | 9 +- .../sklearn/ClassifierPerformance.qmd | 18 +- .../ClassifierThresholdOptimization.qmd | 18 +- .../sklearn/ClusterCosineSimilarity.qmd | 9 +- .../sklearn/ClusterPerformanceMetrics.qmd | 9 +- .../sklearn/CompletenessScore.qmd | 9 +- .../sklearn/ConfusionMatrix.qmd | 9 +- .../sklearn/FeatureImportance.qmd | 9 +- .../sklearn/FowlkesMallowsScore.qmd | 9 +- .../sklearn/HomogeneityScore.qmd | 9 +- .../sklearn/HyperParametersTuning.qmd | 18 +- .../sklearn/KMeansClustersOptimization.qmd | 9 +- .../sklearn/MinimumAccuracy.qmd | 9 +- .../sklearn/MinimumF1Score.qmd | 9 +- .../sklearn/MinimumROCAUCScore.qmd | 9 +- .../sklearn/ModelParameters.qmd | 9 +- .../sklearn/ModelsPerformanceComparison.qmd | 25 +- .../sklearn/OverfitDiagnosis.qmd | 24 +- .../sklearn/PermutationFeatureImportance.qmd | 24 +- .../sklearn/PopulationStabilityIndex.qmd | 33 +- .../sklearn/PrecisionRecallCurve.qmd | 9 +- .../model_validation/sklearn/ROCCurve.qmd | 9 +- .../sklearn/RegressionErrors.qmd | 9 +- .../sklearn/RegressionErrorsComparison.qmd | 24 +- .../sklearn/RegressionPerformance.qmd | 24 +- .../sklearn/RegressionR2Square.qmd | 26 +- .../sklearn/RegressionR2SquareComparison.qmd | 26 +- .../sklearn/RobustnessDiagnosis.qmd | 24 +- .../sklearn/SHAPGlobalImportance.qmd | 42 ++- .../sklearn/ScoreProbabilityAlignment.qmd | 9 +- .../sklearn/SilhouettePlot.qmd | 9 +- .../sklearn/TrainingTestDegradation.qmd | 9 +- .../model_validation/sklearn/VMeasure.qmd | 9 +- .../sklearn/WeakspotsDiagnosis.qmd | 9 +- .../statsmodels/AutoARIMA.qmd | 24 +- .../CumulativePredictionProbabilities.qmd | 9 +- .../statsmodels/DurbinWatsonTest.qmd | 9 +- .../statsmodels/GINITable.qmd | 9 +- .../statsmodels/KolmogorovSmirnov.qmd | 9 +- .../statsmodels/Lilliefors.qmd | 8 +- .../PredictionProbabilitiesHistogram.qmd | 9 +- .../statsmodels/RegressionCoeffs.qmd | 8 +- .../RegressionFeatureSignificance.qmd | 24 +- .../RegressionModelForecastPlot.qmd | 24 +- .../RegressionModelForecastPlotLevels.qmd | 18 +- .../RegressionModelSensitivityPlot.qmd | 33 +- .../statsmodels/RegressionModelSummary.qmd | 26 +- ...RegressionPermutationFeatureImportance.qmd | 24 +- .../statsmodels/ScorecardHistogram.qmd | 9 +- .../statsmodels/statsutils.qmd | 9 +- .../tests/prompt_validation/Bias.qmd | 50 ++- .../tests/prompt_validation/Clarity.qmd | 50 ++- .../tests/prompt_validation/Conciseness.qmd | 50 ++- .../tests/prompt_validation/Delimitation.qmd | 50 ++- .../prompt_validation/NegativeInstruction.qmd | 50 ++- .../tests/prompt_validation/Robustness.qmd | 26 +- .../tests/prompt_validation/Specificity.qmd | 50 ++- .../prompt_validation/ai_powered_test.qmd | 25 +- docs/validmind/unit_metrics.qmd | 26 +- docs/validmind/vm_models.qmd | 327 ++++++++++++------ 164 files changed, 2888 insertions(+), 1011 deletions(-) create mode 100644 docs/templates/macros/signatures.jinja2 diff --git a/docs/templates/class.qmd.jinja2 b/docs/templates/class.qmd.jinja2 index 932e1a4d7..d2659b62d 100644 --- a/docs/templates/class.qmd.jinja2 +++ b/docs/templates/class.qmd.jinja2 @@ -1,3 +1,6 @@ +{% import "macros/docstring.jinja2" as doc %} +{% import "macros/signatures.jinja2" as signatures %} + ## [class]{.muted} {{ resolved.name }} @@ -33,10 +36,7 @@ class {{ resolved.name }}({% for base in resolved.bases %}{{ base.name }}{% if n {% if member.kind in ['method', 'function'] and not member.name.startswith('_') %} ### [{{ member.name }}[()]{.muted}](#{{ member.name }}) - -```python -{{ member.name }}({{ member.parameters | map(attribute='name') | join(', ') }}) -``` +{{ signatures.render_function_signature(member) }} {% if member.docstring %} {{ doc.format_docstring(member.docstring) }} diff --git a/docs/templates/function.qmd.jinja2 b/docs/templates/function.qmd.jinja2 index 01f011648..354bf2803 100644 --- a/docs/templates/function.qmd.jinja2 +++ b/docs/templates/function.qmd.jinja2 @@ -1,19 +1,12 @@ +{% from "macros/signatures.jinja2" import render_function_signature %} + {% if member.kind == "function" %} ## {{ member_name | default(member.name) }}[()]{.muted} - -::: {.signature} - -def {{ member.name }}{% if member.parameters|length <= 1 %}({{ member.parameters[0].name if member.parameters }}{% if member.parameters and member.parameters[0].annotation %}: {{ member.parameters[0].annotation['name'] if member.parameters[0].annotation is mapping and 'name' in member.parameters[0].annotation else member.parameters[0].annotation }}{% endif %}{% if member.parameters and member.parameters[0].default is not none %} = {{ member.parameters[0].default }}{% endif %}){% else %}( -{%- for param in member.parameters %} - {{ param.name }}{% if param.annotation %}: {{ param.annotation['name'] if param.annotation is mapping and 'name' in param.annotation else param.annotation }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %},{% endif -%} -{% endfor %} -){% endif %}{% if member.returns %} -> {{ member.returns['name'] if member.returns is mapping and 'name' in member.returns else member.returns }}{% endif %}: - -::: +{{ render_function_signature(member) }} {% if member.docstring %} {{ doc.format_docstring(member.docstring) }} {% endif %} -{% endif -%} \ No newline at end of file +{% endif %} \ No newline at end of file diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 new file mode 100644 index 000000000..ffa3b61c3 --- /dev/null +++ b/docs/templates/macros/signatures.jinja2 @@ -0,0 +1,14 @@ +{% macro render_function_signature(member) %} + +::: {.signature} + + +def {{ member.name }}{% if member.parameters|length <= 1 %}({{ member.parameters[0].name if member.parameters }}{% if member.parameters and member.parameters[0].annotation %}: {{ member.parameters[0].annotation['name'] if member.parameters[0].annotation is mapping and 'name' in member.parameters[0].annotation else member.parameters[0].annotation }}{% endif %}{% if member.parameters and member.parameters[0].default is not none %} = {{ member.parameters[0].default }}{% endif %}){% else %}( +{% for param in member.parameters %} + {{ param.name }}{% if param.annotation %}: {{ param.annotation['name'] if param.annotation is mapping and 'name' in param.annotation else param.annotation }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %},{% endif %} +{% endfor %} +){% endif %}{% if member.returns %} -> {{ member.returns['name'] if member.returns is mapping and 'name' in member.returns else member.returns }}{% endif %}: + + +::: +{% endmacro %} \ No newline at end of file diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index 18be8e952..2d12e4184 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -1,6 +1,7 @@ {% import "macros/docstring.jinja2" as doc %} {% import "macros/types.jinja2" as types %} {% import "macros/navigation.jinja2" as nav %} +{% import "macros/signatures.jinja2" as signatures %} --- title: "{% if module.name == "validmind" %}ValidMind Library{% else %}[validmind](/reference/validmind.html).{{ module.name }}{% endif +%}" {% if module.name == "validmind" %} @@ -36,13 +37,7 @@ toc-expand: 4 ### {{ member.name }}() {% if target.kind == "function" %} - -```python -{% if target.labels and "async" in target.labels %}async {% endif %} -def {{ member.name }}{% if target.parameters|length > 0 %}( -{% for param in target.parameters %} {{ '**' if param.kind == 'variadic keyword' else '*' if param.kind == 'variadic positional' else '' }}{{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation.left.name if param.annotation.cls == "ExprSubscript" else "" }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %}, -{% endif %}{% endfor %}){% else %}(){% endif %}{% if target.returns %} -> {{ types.format_module_return_type(target.returns, module, full_data) }}{% endif %}: -``` +{{ signatures.render_function_signature(target) }} {% endif %} {{ doc.format_docstring(target.docstring) }} @@ -76,12 +71,7 @@ def {{ member.name }}{% if target.parameters|length > 0 %}( {% if resolved.kind == "function" %} ## {{ member.name }}() - -```python -{% if resolved.labels and "async" in resolved.labels %}async {% endif %}def {{ member.name }}{% if resolved.parameters|length <= 1 %}({% for param in resolved.parameters %}{{ param.name }}{% if param.annotation %}: {{ param.annotation['name'] }}{% endif %}{% if param.default %} = {{ param.default }}{% endif %}{% endfor %}){% else %}( -{% for param in resolved.parameters %} {{ param.name }}{% if param.annotation %}: {{ param.annotation['name'] }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %}, -{% endif %}{% endfor %}){% endif %}{% if resolved.returns %} -> {{ resolved.returns['name'] if resolved.returns is mapping and 'name' in resolved.returns else resolved.returns }}{% endif %}: -``` +{{ signatures.render_function_signature(resolved) }} {% if resolved.docstring %} {{ doc.format_docstring(resolved.docstring) }} @@ -130,15 +120,7 @@ class {{ member.name }}(): #### {{ member.name if method_name == '__init__' else method_name }}() - -```python -def {{ method_name }}( -{%- for param in method.parameters %} - {{ param.name }}{% if param.annotation %}: {{ param.annotation.name if param.annotation.cls == "ExprName" else param.annotation }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %}, -{% endif %} -{%- endfor %} -):{% if method.returns %} -> {{ method.returns }}{% endif +%} -``` +{{ signatures.render_function_signature(method) }} {% if method.docstring %} {{ doc.format_docstring(method.docstring) }} diff --git a/docs/templates/styles.css b/docs/templates/styles.css index 56cad028b..5ac105c62 100644 --- a/docs/templates/styles.css +++ b/docs/templates/styles.css @@ -1,32 +1,47 @@ -.code-block { + +.muted { + color: #747678; + } + + .signature { font-family: 'JetBrains Mono', 'Fira Code', Menlo, Monaco, 'Courier New', monospace; - background-color: #f8f8f8; - border: 1px solid #ddd; - border-radius: 4px; - padding: 1em; + background-color: #083E4420; + padding: 15px; + border-radius: 5px; margin: 1em 0; white-space: pre; overflow-x: auto; font-size: 0.9em; line-height: 1.5; -} - -.code-block .kw { - color: #0000FF; /* Python keyword color */ -} - -.code-block .name { - color: #795E26; /* Function name color */ -} - -.code-block .n { - color: #0550AE; /* Parameter name color */ -} - -.code-block .ann { - color: #267F99; /* Type annotation color */ -} - -.code-block .default { - color: #098658; /* Default value color */ -} \ No newline at end of file + width: 100%; + max-width: 100%; + box-sizing: border-box; + display: block; + position: relative; + left: 0; + right: 0; + margin-left: 0; + margin-right: 0; + } + + .signature .kw { + color: #0000FF; + font-weight: bold; + } + + .signature .name { + color: #de257e; + font-weight: bold; + } + + .signature .n { + color: #0550AE; + } + + .signature .ann { + color: #267F99; + } + + .signature .default { + color: #098658; + } \ No newline at end of file diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 3fc3d784e..b348e2d6c 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -44,15 +44,16 @@ After you have pasted the code snippet into your development source code and exe ### get_test_suite() - + -```python -def get_test_suite( - test_suite_id: str = None, - section: str = None, - *args = (), - **kwargs = {}) -> TestSuite: -``` +::: {.signature} + + +def get_test_suite( + test_suite_id: str = None, section: str = None, args = (), kwargs = {}) -> TestSuite: + + +::: Gets a TestSuite object for the current project or a specific test suite This function provides an interface to retrieve the TestSuite instance for the current project or a specific TestSuite instance identified by test_suite_id. The project Test Suite will contain sections for every section in the project's documentation template and these Test Suite Sections will contain all the tests associated with that template section. @@ -65,18 +66,16 @@ Gets a TestSuite object for the current project or a specific test suite This fu ### init() - + -```python -def init( - project: Optional = None, - api_key: Optional = None, - api_secret: Optional = None, - api_host: Optional = None, - model: Optional = None, - monitoring: bool = False, - generate_descriptions: Optional = None): -``` +::: {.signature} + + +def init( + project: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, api_key: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, api_secret: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, api_host: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, model: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, monitoring: bool = False, generate_descriptions: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'bool'}} = None): + + +::: Initializes the API client instances and calls the /ping endpoint to ensure the provided credentials are valid and we can connect to the ValidMind API. @@ -98,25 +97,16 @@ If the API key and secret are not provided, the client will attempt to retrieve ### init_dataset() - + -```python -def init_dataset( - dataset, - model = None, - index = None, - index_name: str = None, - date_time_index: bool = False, - columns: list = None, - text_column: str = None, - target_column: str = None, - feature_columns: list = None, - extra_columns: dict = None, - class_labels: dict = None, - type: str = None, - input_id: str = None, - __log = True) -> VMDataset: -``` +::: {.signature} + + +def init_dataset( + dataset, model = None, index = None, index_name: str = None, date_time_index: bool = False, columns: list = None, text_column: str = None, target_column: str = None, feature_columns: list = None, extra_columns: dict = None, class_labels: dict = None, type: str = None, input_id: str = None, __log = True) -> VMDataset: + + +::: Initializes a VM Dataset, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are reading a valid dataset type. @@ -135,17 +125,16 @@ Returns: vm.vm.Dataset: A VM Dataset instance ### init_model() - + -```python -def init_model( - model: object = None, - input_id: str = 'model', - attributes: dict = None, - predict_fn: callable = None, - __log = True, - **kwargs = {}) -> VMModel: -``` +::: {.signature} + + +def init_model( + model: object = None, input_id: str = 'model', attributes: dict = None, predict_fn: callable = None, __log = True, kwargs = {}) -> VMModel: + + +::: Initializes a VM Model, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are creating a model supported libraries. @@ -167,13 +156,16 @@ Initializes a VM Model, which can then be passed to other functions that can per ### init_r_model() - + -```python -def init_r_model( - model_path: str, - input_id: str = 'model') -> VMModel: -``` +::: {.signature} + + +def init_r_model( + model_path: str, input_id: str = 'model') -> VMModel: + + +::: Initializes a VM Model for an R model R models must be saved to disk and the filetype depends on the model type... Currently we support the following model types: @@ -195,17 +187,16 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ### log_metric() - + -```python -def log_metric( - key: str, - value: float, - inputs: Optional = None, - params: Optional = None, - recorded_at: Optional = None, - thresholds: Optional = None): -``` +::: {.signature} + + +def log_metric( + key: str, value: float, inputs: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}} = None, params: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}} = None, recorded_at: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, thresholds: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}} = None): + + +::: Logs a unit metric Unit metrics are key-value pairs where the key is the metric name and the value is a scalar (int or float). These key-value pairs are associated with the currently selected model (inventory model in the ValidMind Platform) and keys can be logged to over time to create a history of the metric. On the ValidMind Platform, these metrics will be used to create plots/visualizations for documentation and dashboards etc. @@ -220,11 +211,15 @@ Logs a unit metric Unit metrics are key-value pairs where the key is the metric ### preview_template() - + -```python -def preview_template(): -``` +::: {.signature} + + +def preview_template(): + + +::: Preview the documentation template for the current project This function will display the documentation template for the current project. If the project has not been initialized, then an error will be raised. @@ -234,37 +229,44 @@ Preview the documentation template for the current project This function will di ### print_env() - + -```python -def print_env(): -``` +::: {.signature} + + +def print_env(): + + +::: Prints a log of the running environment for debugging. Output includes: ValidMind Library version, operating system details, installed dependencies, and the ISO 8601 timestamp at log creation. ### reload() - + -```python -def reload(): -``` +::: {.signature} + + +def reload(): + + +::: Reconnect to the ValidMind API and reload the project configuration ### run_documentation_tests() - + -```python -def run_documentation_tests( - section = None, - send = True, - fail_fast = False, - inputs = None, - config = None, - **kwargs = {}): -``` +::: {.signature} + + +def run_documentation_tests( + section = None, send = True, fail_fast = False, inputs = None, config = None, kwargs = {}): + + +::: Collect and run all the tests associated with a template This function will analyze the current project's documentation template and collect all the tests associated with it into a test suite. It will then run the test suite, log the results to the ValidMind API, and display them to the user. @@ -287,17 +289,16 @@ Collect and run all the tests associated with a template This function will anal ### run_test_suite() - + -```python -def run_test_suite( - test_suite_id, - send = True, - fail_fast = False, - config = None, - inputs = None, - **kwargs = {}): -``` +::: {.signature} + + +def run_test_suite( + test_suite_id, send = True, fail_fast = False, config = None, inputs = None, kwargs = {}): + + +::: High Level function for running a test suite This function provides a high level interface for running a test suite. A test suite is a collection of tests. This function will automatically find the correct test suite class based on the test_suite_id, initialize each of the tests, and run them. @@ -320,12 +321,15 @@ High Level function for running a test suite This function provides a high level ### tags() - + -```python -def tags( - *tags = ()): -``` +::: {.signature} + + +def tags(tags = ()): + + +::: Decorator for specifying tags for a test. @@ -335,12 +339,15 @@ Decorator for specifying tags for a test. ### tasks() - + -```python -def tasks( - *tasks = ()): -``` +::: {.signature} + + +def tasks(tasks = ()): + + +::: Decorator for specifying the task types that a test is designed for. @@ -350,12 +357,15 @@ Decorator for specifying the task types that a test is designed for. ### test() - + -```python -def test( - func_or_id): -``` +::: {.signature} + + +def test(func_or_id): + + +::: Decorator for creating and registering custom tests This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. @@ -394,13 +404,16 @@ Holds raw data for a test result #### RawData() - + -```python -def __init__( self, - log: bool = False, - kwargs = {}): -``` +::: {.signature} + + +def __init__( + self, log: bool = False, kwargs = {}): + + +::: Create a new RawData object @@ -411,19 +424,27 @@ Create a new RawData object #### inspect() - + -```python -def inspect( self, - show: bool = True): -``` +::: {.signature} + + +def inspect( + self, show: bool = True): + + +::: Inspect the raw data #### serialize() - + -```python -def serialize( self): -``` +::: {.signature} + + +def serialize(self): + + +::: diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index 9da8b28a3..39603c81d 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## simple_preprocess_booleans() - + + +::: {.signature} -```python -def simple_preprocess_booleans( - df, - columns): -``` + +def simple_preprocess_booleans( + df, columns): + + +::: Preprocess boolean columns. @@ -28,13 +31,16 @@ Preprocess boolean columns. ## simple_preprocess_categoricals() - + + +::: {.signature} + + +def simple_preprocess_categoricals( + df, columns): + -```python -def simple_preprocess_categoricals( - df, - columns): -``` +::: Preprocess categorical columns. @@ -49,13 +55,16 @@ Preprocess categorical columns. ## simple_preprocess_numericals() - + + +::: {.signature} -```python -def simple_preprocess_numericals( - df, - columns): -``` + +def simple_preprocess_numericals( + df, columns): + + +::: Preprocess numerical columns. @@ -72,7 +81,13 @@ Preprocess numerical columns. -::: {.signature} def get_demo_test_config(test_suite = None): ::: +::: {.signature} + + +def get_demo_test_config(test_suite = None): + + +::: Returns input configuration for the default documentation template assigned to this demo model @@ -95,10 +110,22 @@ We assign the following inputs depending on the input config expected by each te -::: {.signature} def load_data(full_dataset = False): ::: +::: {.signature} + + +def load_data(full_dataset = False): + + +::: ## preprocess[()]{.muted} -::: {.signature} def preprocess(df): ::: +::: {.signature} + + +def preprocess(df): + + +::: diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index 09f52db5f..8bd1720c7 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## simple_preprocess_booleans() - + + +::: {.signature} -```python -def simple_preprocess_booleans( - df, - columns): -``` + +def simple_preprocess_booleans( + df, columns): + + +::: Preprocess boolean columns. @@ -28,13 +31,16 @@ Preprocess boolean columns. ## simple_preprocess_categoricals() - + -```python -def simple_preprocess_categoricals( - df, - columns): -``` +::: {.signature} + + +def simple_preprocess_categoricals( + df, columns): + + +::: Preprocess categorical columns. @@ -49,13 +55,16 @@ Preprocess categorical columns. ## simple_preprocess_numericals() - + -```python -def simple_preprocess_numericals( - df, - columns): -``` +::: {.signature} + + +def simple_preprocess_numericals( + df, columns): + + +::: Preprocess numerical columns. @@ -72,10 +81,22 @@ Preprocess numerical columns. -::: {.signature} def load_data(): ::: +::: {.signature} + + +def load_data(): + + +::: ## preprocess[()]{.muted} -::: {.signature} def preprocess(df): ::: +::: {.signature} + + +def preprocess(df): + + +::: diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index 6a9d3357f..56536ceca 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -9,19 +9,39 @@ toc-expand: 4 -::: {.signature} def compute_scores(probabilities): ::: +::: {.signature} + + +def compute_scores(probabilities): + + +::: ## feature_engineering[()]{.muted} -::: {.signature} def feature_engineering( df, verbose = True): ::: +::: {.signature} + + +def feature_engineering( + df, verbose = True): + + +::: ## get_demo_test_config[()]{.muted} -::: {.signature} def get_demo_test_config( x_test = None, y_test = None): ::: +::: {.signature} + + +def get_demo_test_config( + x_test = None, y_test = None): + + +::: Get demo test configuration. @@ -38,13 +58,26 @@ Get demo test configuration. -::: {.signature} def init_vm_objects(scorecard): ::: +::: {.signature} + + +def init_vm_objects(scorecard): + + +::: ## load_data[()]{.muted} -::: {.signature} def load_data( source = 'online', verbose = True): ::: +::: {.signature} + + +def load_data( + source = 'online', verbose = True): + + +::: Load data from either an online source or offline files, automatically dropping specified columns for offline data. :param source: 'online' for online data, 'offline' for offline files. Defaults to 'online'. :return: DataFrame containing the loaded data. @@ -52,25 +85,51 @@ Load data from either an online source or offline files, automatically dropping -::: {.signature} def load_scorecard(): ::: +::: {.signature} + + +def load_scorecard(): + + +::: ## load_test_config[()]{.muted} -::: {.signature} def load_test_config(scorecard): ::: +::: {.signature} + + +def load_test_config(scorecard): + + +::: ## preprocess[()]{.muted} -::: {.signature} def preprocess( df, verbose = True): ::: +::: {.signature} + + +def preprocess( + df, verbose = True): + + +::: ## split[()]{.muted} -::: {.signature} def split( df, validation_size = None, test_size = 0.2, add_constant = False, verbose = True): ::: +::: {.signature} + + +def split( + df, validation_size = None, test_size = 0.2, add_constant = False, verbose = True): + + +::: Split dataset into train, validation (optional), and test sets. @@ -89,4 +148,11 @@ Split dataset into train, validation (optional), and test sets. -::: {.signature} def woe_encoding( df, verbose = True): ::: +::: {.signature} + + +def woe_encoding( + df, verbose = True): + + +::: diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 3b4056d5e..079362d83 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -9,13 +9,25 @@ toc-expand: 4 -::: {.signature} def compute_scores(probabilities): ::: +::: {.signature} + + +def compute_scores(probabilities): + + +::: ## load_data[()]{.muted} -::: {.signature} def load_data(): ::: +::: {.signature} + + +def load_data(): + + +::: Load data from the specified CSV file. :return: DataFrame containing the loaded data. @@ -23,10 +35,23 @@ Load data from the specified CSV file. :return: DataFrame containing the loaded -::: {.signature} def preprocess(df): ::: +::: {.signature} + + +def preprocess(df): + + +::: ## split[()]{.muted} -::: {.signature} def split( df, test_size = 0.3): ::: +::: {.signature} + + +def split( + df, test_size = 0.3): + + +::: diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index 7565ab928..aa5a07e41 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def display_nice( df, num_rows = None): ::: +::: {.signature} + + +def display_nice( + df, num_rows = None): + + +::: Primary function to format and display a DataFrame. @@ -17,6 +24,13 @@ Primary function to format and display a DataFrame. -::: {.signature} def load_data( source = 'online', dataset_size = None): ::: +::: {.signature} + + +def load_data( + source = 'online', dataset_size = None): + + +::: Load data from either online source or offline files. :param source: 'online' for online data, 'offline' for offline data. Defaults to 'online'. :param dataset_size: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. :return: DataFrame containing the loaded data. diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index 004e6aea2..e1faef0b2 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -9,4 +9,10 @@ toc-expand: 4 -::: {.signature} def load_data(full_dataset = False): ::: +::: {.signature} + + +def load_data(full_dataset = False): + + +::: diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index 584c9869c..48e794732 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -9,43 +9,86 @@ toc-expand: 4 -::: {.signature} def load_all_data(): ::: +::: {.signature} + + +def load_all_data(): + + +::: ## load_data[()]{.muted} -::: {.signature} def load_data(): ::: +::: {.signature} + + +def load_data(): + + +::: ## load_model[()]{.muted} -::: {.signature} def load_model(model_name): ::: +::: {.signature} + + +def load_model(model_name): + + +::: ## load_processed_data[()]{.muted} -::: {.signature} def load_processed_data(): ::: +::: {.signature} + + +def load_processed_data(): + + +::: ## load_test_dataset[()]{.muted} -::: {.signature} def load_test_dataset(model_name): ::: +::: {.signature} + + +def load_test_dataset(model_name): + + +::: ## load_train_dataset[()]{.muted} -::: {.signature} def load_train_dataset(model_path): ::: +::: {.signature} + + +def load_train_dataset(model_path): + + +::: ## preprocess[()]{.muted} -::: {.signature} def preprocess( df, split_option = 'train_test_val', train_size = 0.6, test_size = 0.2): ::: +::: {.signature} + + +def preprocess( + df, split_option = 'train_test_val', train_size = 0.6, test_size = 0.2): + + +::: Split a time series DataFrame into train, validation, and test sets. @@ -64,4 +107,11 @@ Split a time series DataFrame into train, validation, and test sets. -::: {.signature} def transform( df, transform_func = 'diff'): ::: +::: {.signature} + + +def transform( + df, transform_func = 'diff'): + + +::: diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 767e9b9f5..0eebaf477 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -9,13 +9,26 @@ toc-expand: 4 -::: {.signature} def load_data(): ::: +::: {.signature} + + +def load_data(): + + +::: ## preprocess[()]{.muted} -::: {.signature} def preprocess( df, split_option = 'train_test_val', train_size = 0.6, test_size = 0.2): ::: +::: {.signature} + + +def preprocess( + df, split_option = 'train_test_val', train_size = 0.6, test_size = 0.2): + + +::: Split a time series DataFrame into train, validation, and test sets. @@ -34,4 +47,11 @@ Split a time series DataFrame into train, validation, and test sets. -::: {.signature} def transform( df, transform_func = 'diff'): ::: +::: {.signature} + + +def transform( + df, transform_func = 'diff'): + + +::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index c7f48219c..e1040e5e6 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -39,11 +39,16 @@ class BaseError(Exception): ### [description[()]{.muted}](#description) - + -```python -description(self, args, kwargs) -``` +::: {.signature} + + +def description( + self, args = (), kwargs = {}): + + +::: ## [class]{.muted} GetTestSuiteError @@ -90,11 +95,16 @@ class InvalidAPICredentialsError(APIRequestError): ### [description[()]{.muted}](#description) - + -```python -description(self, args, kwargs) -``` +::: {.signature} + + +def description( + self, args = (), kwargs = {}): + + +::: ## [class]{.muted} InvalidContentIdPrefixError @@ -156,11 +166,16 @@ class InvalidProjectError(APIRequestError): ### [description[()]{.muted}](#description) - + -```python -description(self, args, kwargs) -``` +::: {.signature} + + +def description( + self, args = (), kwargs = {}): + + +::: ## [class]{.muted} InvalidRequestBodyError @@ -297,11 +312,16 @@ class MissingAPICredentialsError(BaseError): ### [description[()]{.muted}](#description) - + -```python -description(self, args, kwargs) -``` +::: {.signature} + + +def description( + self, args = (), kwargs = {}): + + +::: ## [class]{.muted} MissingCacheResultsArgumentsError @@ -378,11 +398,16 @@ class MissingModelIdError(BaseError): ### [description[()]{.muted}](#description) - + -```python -description(self, args, kwargs) -``` +::: {.signature} + + +def description( + self, args = (), kwargs = {}): + + +::: ## [class]{.muted} MissingOrInvalidModelPredictFnError @@ -431,11 +456,16 @@ When the R extras have not been installed. ### [description[()]{.muted}](#description) - + -```python -description(self, args, kwargs) -``` +::: {.signature} + + +def description( + self, args = (), kwargs = {}): + + +::: ## [class]{.muted} MissingTextContentIdError @@ -591,7 +621,13 @@ When an unsupported R model is used. -::: {.signature} def raise_api_error(error_string): ::: +::: {.signature} + + +def raise_api_error(error_string): + + +::: Safely try to parse JSON from the response message in case the API returns a non-JSON string or if the API returns a non-standard error @@ -599,6 +635,12 @@ Safely try to parse JSON from the response message in case the API returns a non -::: {.signature} def should_raise_on_fail_fast(error) -> bool: ::: +::: {.signature} + + +def should_raise_on_fail_fast(error) -> bool: + + +::: Determine whether an error should be raised when fail_fast is True. diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 37ebfd1c6..ad1ab77a7 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -22,33 +22,44 @@ Entrypoint for test suites. ## format_dataframe() - + -```python -def format_dataframe(df: ) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: -``` +::: {.signature} + + +def format_dataframe(df: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: + + +::: Format a pandas DataFrame for display purposes ## get_logger() - + + +::: {.signature} -```python -def get_logger( - name = 'validmind', - log_level = None): -``` + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name ## test_id_to_name() - + -```python -def test_id_to_name(test_id: str) -> str: -``` +::: {.signature} + + +def test_id_to_name(test_id: str) -> str: + + +::: Convert a test ID to a human-readable name. @@ -64,7 +75,14 @@ Convert a test ID to a human-readable name. -::: {.signature} def describe_suite( test_suite_id: str, verbose = False): ::: +::: {.signature} + + +def describe_suite( + test_suite_id: str, verbose = False): + + +::: Describes a Test Suite by ID @@ -81,7 +99,13 @@ Describes a Test Suite by ID -::: {.signature} def get_by_id(test_suite_id: str): ::: +::: {.signature} + + +def get_by_id(test_suite_id: str): + + +::: Returns the test suite by ID @@ -89,7 +113,13 @@ Returns the test suite by ID -::: {.signature} def list_suites(pretty: bool = True): ::: +::: {.signature} + + +def list_suites(pretty: bool = True): + + +::: Returns a list of all available test suites @@ -97,7 +127,14 @@ Returns a list of all available test suites -::: {.signature} def register_test_suite( suite_id: str, suite: TestSuite): ::: +::: {.signature} + + +def register_test_suite( + suite_id: str, suite: TestSuite): + + +::: Registers a custom test suite diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 72ee50eba..8c4deb398 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -13,14 +13,16 @@ ValidMind Tests Module ## describe_test() - + -```python -def describe_test( - test_id: TestID = None, - raw: bool = False, - show: bool = True): -``` +::: {.signature} + + +def describe_test( + test_id: TestID = None, raw: bool = False, show: bool = True): + + +::: Get or show details about the test This function can be used to see test details including the test name, description, required inputs and default params. It can also be used to get a dictionary of the above information for programmatic use. @@ -31,31 +33,43 @@ Get or show details about the test This function can be used to see test details ## list_tags() - + -```python -def list_tags(): -``` +::: {.signature} + + +def list_tags(): + + +::: List unique tags from all test classes. ## list_tasks() - + -```python -def list_tasks(): -``` +::: {.signature} + + +def list_tasks(): + + +::: List unique tasks from all test classes. ## list_tasks_and_tags() - + -```python -def list_tasks_and_tags(as_json = False): -``` +::: {.signature} + + +def list_tasks_and_tags(as_json = False): + + +::: List all task types and their associated tags, with one row per task type and all tags for a task type in one row. @@ -65,16 +79,16 @@ List all task types and their associated tags, with one row per task type and al ## list_tests() - + -```python -def list_tests( - filter = None, - task = None, - tags = None, - pretty = True, - truncate = True): -``` +::: {.signature} + + +def list_tests( + filter = None, task = None, tags = None, pretty = True, truncate = True): + + +::: List all tests in the tests directory. @@ -92,14 +106,16 @@ List all tests in the tests directory. ## load_test() - + -```python -def load_test( - test_id: str, - test_func: callable = None, - reload: bool = False): -``` +::: {.signature} + + +def load_test( + test_id: str, test_func: callable = None, reload: bool = False): + + +::: Load a test by test ID Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. The tag is optional and is used to distinguish between multiple results from the same test. @@ -110,23 +126,16 @@ Load a test by test ID Test IDs are in the format `namespace.path_to_module.Test ## run_test() - + -```python -def run_test( - test_id: = None, - name: = None, - unit_metrics: = None, - inputs: = None, - input_grid: = None, - params: = None, - param_grid: = None, - show: bool = True, - generate_description: bool = True, - title: = None, - post_process_fn: = None, - kwargs = {}) -> TestResult: -``` +::: {.signature} + + +def run_test( + test_id: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'TestID'}, 'None'], 'implicit': True}} = None, name: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None, unit_metrics: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'TestID'}}, 'None'], 'implicit': True}} = None, inputs: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, 'None'], 'implicit': True}} = None, input_grid: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'Any'}}], 'implicit': True}}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}, 'None'], 'implicit': True}} = None, params: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, 'None'], 'implicit': True}} = None, param_grid: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'Any'}}], 'implicit': True}}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}, 'None'], 'implicit': True}} = None, show: bool = True, generate_description: bool = True, title: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, post_process_fn: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Callable'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, 'None'], 'implicit': True}}, 'None'], 'implicit': True}} = None, kwargs = {}) -> TestResult: + + +::: Run a ValidMind or custom test This function is the main entry point for running tests. It can run simple unit metrics, ValidMind and custom tests, composite tests made up of multiple unit metrics and comparison tests made up of multiple tests. @@ -159,11 +168,15 @@ Run a ValidMind or custom test This function is the main entry point for running ## tags() - + + +::: {.signature} -```python -def tags(tags = ()): -``` + +def tags(tags = ()): + + +::: Decorator for specifying tags for a test. @@ -173,11 +186,15 @@ Decorator for specifying tags for a test. ## tasks() - + -```python -def tasks(tasks = ()): -``` +::: {.signature} + + +def tasks(tasks = ()): + + +::: Decorator for specifying the task types that a test is designed for. @@ -187,11 +204,15 @@ Decorator for specifying the task types that a test is designed for. ## test() - + -```python -def test(func_or_id): -``` +::: {.signature} + + +def test(func_or_id): + + +::: Decorator for creating and registering custom tests This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. @@ -222,7 +243,14 @@ The function may also include a docstring. This docstring will be used and logge -::: {.signature} def register_test_provider( namespace: str, test_provider: TestProvider) -> None: ::: +::: {.signature} + + +def register_test_provider( + namespace: str, test_provider: TestProvider) -> None: + + +::: Register an external test provider @@ -283,11 +311,15 @@ test = test_provider.load_test("my_namespace.my_test_class") ### [list_tests[()]{.muted}](#list_tests) - + -```python -list_tests(self) -``` +::: {.signature} + + +def list_tests(self): + + +::: List all tests in the given namespace @@ -297,11 +329,16 @@ List all tests in the given namespace ### [load_test[()]{.muted}](#load_test) - + -```python -load_test(self, test_id) -``` +::: {.signature} + + +def load_test( + self, test_id: str): + + +::: Load the test identified by the given test_id. Args: test_id (str): The identifier of the test. This corresponds to the relative path of the python file from the root folder, with slashes replaced by dots @@ -323,11 +360,15 @@ Protocol for user-defined test providers ### [list_tests[()]{.muted}](#list_tests) - + + +::: {.signature} -```python -list_tests(self) -``` + +def list_tests(self) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}: + + +::: List all tests in the given namespace @@ -337,11 +378,16 @@ List all tests in the given namespace ### [load_test[()]{.muted}](#load_test) - + -```python -load_test(self, test_id) -``` +::: {.signature} + + +def load_test( + self, test_id: str) -> callable: + + +::: Load the test function identified by the given test_id diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index b44958a22..6996a14eb 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def ACFandPACFPlot(dataset: VMDataset): ::: +::: {.signature} + + +def ACFandPACFPlot(dataset: VMDataset): + + +::: Analyzes time series data using Autocorrelation Function (ACF) and Partial Autocorrelation Function (PACF) plots to reveal trends and correlations. diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 95c1b076a..24db20980 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + + +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: Get a logger for the given module name @@ -21,7 +24,13 @@ Get a logger for the given module name -::: {.signature} def ADF(dataset: VMDataset): ::: +::: {.signature} + + +def ADF(dataset: VMDataset): + + +::: Assesses the stationarity of a time series dataset using the Augmented Dickey-Fuller (ADF) test. diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 27f181086..f7bb6f0ac 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + + +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def AutoAR( dataset: VMDataset, max_ar_order: int = 3): ::: +::: {.signature} + + +def AutoAR( + dataset: VMDataset, max_ar_order: int = 3): + + +::: Automatically identifies the optimal Autoregressive (AR) order for a time series using BIC and AIC criteria. diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index 22d8575c8..a65c91a48 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + + +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def AutoMA( dataset: VMDataset, max_ma_order: int = 3): ::: +::: {.signature} + + +def AutoMA( + dataset: VMDataset, max_ma_order: int = 3): + + +::: Automatically selects the optimal Moving Average (MA) order for each variable in a time series dataset based on minimal BIC and AIC values. diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 5e41588fd..077a39366 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def AutoStationarity( dataset: VMDataset, max_order: int = 5, threshold: float = 0.05): ::: +::: {.signature} + + +def AutoStationarity( + dataset: VMDataset, max_order: int = 5, threshold: float = 0.05): + + +::: Automates Augmented Dickey-Fuller test to assess stationarity across multiple time series in a DataFrame. diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 7a04434a1..410e98dda 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def BivariateScatterPlots(dataset): ::: +::: {.signature} + + +def BivariateScatterPlots(dataset): + + +::: Generates bivariate scatterplots to visually inspect relationships between pairs of numerical predictor variables in machine learning classification tasks. diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index 502632df2..e8ed574fc 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def BoxPierce(dataset): ::: +::: {.signature} + + +def BoxPierce(dataset): + + +::: Detects autocorrelation in time-series data through the Box-Pierce test to validate model performance. diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 04f074cbc..905dd9387 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def ChiSquaredFeaturesTable( dataset, p_threshold = 0.05): ::: +::: {.signature} + + +def ChiSquaredFeaturesTable( + dataset, p_threshold = 0.05): + + +::: Assesses the statistical association between categorical features and a target variable using the Chi-Squared test. diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index b2be8eac3..83fc43fa6 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -11,7 +11,14 @@ Threshold based tests -::: {.signature} def ClassImbalance( dataset: VMDataset, min_percent_threshold: int = 10) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Tuple'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, {'cls': 'ExprName', 'name': 'bool'}\], 'implicit': True}}: ::: +::: {.signature} + + +def ClassImbalance( + dataset: VMDataset, min_percent_threshold: int = 10) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Tuple'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, {'cls': 'ExprName', 'name': 'bool'}], 'implicit': True}}: + + +::: Evaluates and quantifies class distribution imbalance in a dataset used by a machine learning model. diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index d2de51875..0bb1ce532 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,7 +24,13 @@ Get a logger for the given module name -::: {.signature} def DatasetDescription(dataset: VMDataset): ::: +::: {.signature} + + +def DatasetDescription(dataset: VMDataset): + + +::: Provides comprehensive analysis and statistical summaries of each column in a machine learning model's dataset. @@ -59,7 +68,14 @@ The DatasetDescription class accomplishes the purpose as follows: firstly, the t -::: {.signature} def describe_column( df, column): ::: +::: {.signature} + + +def describe_column( + df, column): + + +::: Gets descriptive statistics for a single column in a Pandas DataFrame. @@ -67,7 +83,14 @@ Gets descriptive statistics for a single column in a Pandas DataFrame. -::: {.signature} def get_column_histograms( df, column, type\_): ::: +::: {.signature} + + +def get_column_histograms( + df, column, type_): + + +::: Returns a collection of histograms for a numerical or categorical column. We store different combinations of bin sizes to allow analyzing the data better @@ -77,7 +100,14 @@ Will be used in favor of \_get_histogram in the future -::: {.signature} def get_numerical_histograms( df, column): ::: +::: {.signature} + + +def get_numerical_histograms( + df, column): + + +::: Returns a collection of histograms for a numerical column, each one with a different bin size @@ -85,7 +115,13 @@ Returns a collection of histograms for a numerical column, each one with a diffe -::: {.signature} def infer_datatypes(df): ::: +::: {.signature} + + +def infer_datatypes(df): + + +::: ## [class]{.muted} UnsupportedColumnTypeError diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 822729ea7..09d090647 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def DatasetSplit(datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}): ::: +::: {.signature} + + +def DatasetSplit(datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}): + + +::: Evaluates and visualizes the distribution proportions among training, testing, and validation datasets of an ML model. diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 16f714393..f194b15fa 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -7,11 +7,15 @@ toc-expand: 4 ## format_records() - + -```python -def format_records(df: ) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}: -``` +::: {.signature} + + +def format_records(df: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}: + + +::: Round the values on each dataframe's column to a given number of decimal places. The returned value is converted to a dict in "records" with Pandas's to_dict() function. @@ -25,7 +29,13 @@ We do this for display purposes before sending data to ValidMind. Rules: -::: {.signature} def DescriptiveStatistics(dataset: VMDataset): ::: +::: {.signature} + + +def DescriptiveStatistics(dataset: VMDataset): + + +::: Performs a detailed descriptive statistical analysis of both numerical and categorical data within a model's dataset. @@ -59,13 +69,27 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des -::: {.signature} def get_summary_statistics_categorical( df, categorical_fields): ::: +::: {.signature} + + +def get_summary_statistics_categorical( + df, categorical_fields): + + +::: ## get_summary_statistics_numerical[()]{.muted} -::: {.signature} def get_summary_statistics_numerical( df, numerical_fields): ::: +::: {.signature} + + +def get_summary_statistics_numerical( + df, numerical_fields): + + +::: ## [class]{.muted} SkipTestError diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 0c0c257e9..a40d7fbd7 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,7 +24,13 @@ Get a logger for the given module name -::: {.signature} def DickeyFullerGLS(dataset: VMDataset): ::: +::: {.signature} + + +def DickeyFullerGLS(dataset: VMDataset): + + +::: Assesses stationarity in time series data using the Dickey-Fuller GLS test to determine the order of integration. diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 3651ca47b..4a14a45be 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def Duplicates( dataset, min_threshold = 1): ::: +::: {.signature} + + +def Duplicates( + dataset, min_threshold = 1): + + +::: Tests dataset for duplicate entries, ensuring model reliability via data quality verification. diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 056892f44..54514b6b6 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def EngleGrangerCoint( dataset: VMDataset, threshold: float = 0.05): ::: +::: {.signature} + + +def EngleGrangerCoint( + dataset: VMDataset, threshold: float = 0.05): + + +::: Assesses the degree of co-movement between pairs of time series data using the Engle-Granger cointegration test. diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 0113218ad..6a631e662 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def FeatureTargetCorrelationPlot( dataset, fig_height = 600): ::: +::: {.signature} + + +def FeatureTargetCorrelationPlot( + dataset, fig_height = 600): + + +::: Visualizes the correlation between input features and the model's target output in a color-coded horizontal bar plot. diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index a7309ec78..39b8bffa8 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def HighCardinality( dataset: VMDataset, num_threshold: int = 100, percent_threshold: float = 0.1, threshold_type: str = 'percent'): ::: +::: {.signature} + + +def HighCardinality( + dataset: VMDataset, num_threshold: int = 100, percent_threshold: float = 0.1, threshold_type: str = 'percent'): + + +::: Assesses the number of unique values in categorical columns to detect high cardinality and potential overfitting. diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 9c6475d44..6a4d95625 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def HighPearsonCorrelation( dataset: VMDataset, max_threshold: float = 0.3, top_n_correlations: int = 10, feature_columns: list = None): ::: +::: {.signature} + + +def HighPearsonCorrelation( + dataset: VMDataset, max_threshold: float = 0.3, top_n_correlations: int = 10, feature_columns: list = None): + + +::: Identifies highly correlated feature pairs in a dataset suggesting feature redundancy or multicollinearity. diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 546e0f22a..41098f0a3 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -9,13 +9,27 @@ toc-expand: 4 -::: {.signature} def compute_outliers( series, threshold): ::: +::: {.signature} + + +def compute_outliers( + series, threshold): + + +::: ## IQROutliersBarPlot[()]{.muted} -::: {.signature} def IQROutliersBarPlot( dataset: VMDataset, threshold: float = 1.5, fig_width: int = 800): ::: +::: {.signature} + + +def IQROutliersBarPlot( + dataset: VMDataset, threshold: float = 1.5, fig_width: int = 800): + + +::: Visualizes outlier distribution across percentiles in numerical data using the Interquartile Range (IQR) method. diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index f705caa58..685c756b9 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -9,13 +9,27 @@ toc-expand: 4 -::: {.signature} def compute_outliers( series, threshold = 1.5): ::: +::: {.signature} + + +def compute_outliers( + series, threshold = 1.5): + + +::: ## IQROutliersTable[()]{.muted} -::: {.signature} def IQROutliersTable( dataset: VMDataset, threshold: float = 1.5): ::: +::: {.signature} + + +def IQROutliersTable( + dataset: VMDataset, threshold: float = 1.5): + + +::: Determines and summarizes outliers in numerical features using the Interquartile Range method. diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index ff83b1818..aa1fb52a6 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def IsolationForestOutliers( dataset: VMDataset, random_state: int = 0, contamination: float = 0.1, feature_columns: list = None): ::: +::: {.signature} + + +def IsolationForestOutliers( + dataset: VMDataset, random_state: int = 0, contamination: float = 0.1, feature_columns: list = None): + + +::: Detects outliers in a dataset using the Isolation Forest algorithm and visualizes results through scatter plots. diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index 906cbd730..b1fd670d1 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def JarqueBera(dataset): ::: +::: {.signature} + + +def JarqueBera(dataset): + + +::: Assesses normality of dataset features in an ML model using the Jarque-Bera test. diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 85d7e7514..328bf0996 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,7 +24,13 @@ Get a logger for the given module name -::: {.signature} def KPSS(dataset: VMDataset): ::: +::: {.signature} + + +def KPSS(dataset: VMDataset): + + +::: Assesses the stationarity of time-series data in a machine learning model using the KPSS unit root test. diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index b5b5ae0ac..6e5e7afb9 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def LJungBox(dataset): ::: +::: {.signature} + + +def LJungBox(dataset): + + +::: Assesses autocorrelations in dataset features by performing a Ljung-Box test on each feature. diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index f10488488..d5b1f418e 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def LaggedCorrelationHeatmap( dataset: VMDataset, num_lags: int = 10): ::: +::: {.signature} + + +def LaggedCorrelationHeatmap( + dataset: VMDataset, num_lags: int = 10): + + +::: Assesses and visualizes correlation between target variable and lagged independent variables in a time-series dataset. diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 534970af6..3187af97b 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def MissingValues( dataset: VMDataset, min_threshold: int = 1): ::: +::: {.signature} + + +def MissingValues( + dataset: VMDataset, min_threshold: int = 1): + + +::: Evaluates dataset quality by ensuring missing value ratio across all features does not exceed a set threshold. diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index dcb281157..f97590c97 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def MissingValuesBarPlot( dataset: VMDataset, threshold: int = 80, fig_height: int = 600): ::: +::: {.signature} + + +def MissingValuesBarPlot( + dataset: VMDataset, threshold: int = 80, fig_height: int = 600): + + +::: Assesses the percentage and distribution of missing values in the dataset via a bar plot, with emphasis on identifying high-risk columns based on a user-defined threshold. diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index ff83cf567..7cd67e522 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def MutualInformation( dataset: VMDataset, min_threshold: float = 0.01, task: str = 'classification'): ::: +::: {.signature} + + +def MutualInformation( + dataset: VMDataset, min_threshold: float = 0.01, task: str = 'classification'): + + +::: Calculates mutual information scores between features and target variable to evaluate feature relevance. diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index 6fc31c281..5575aa99c 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def PearsonCorrelationMatrix(dataset): ::: +::: {.signature} + + +def PearsonCorrelationMatrix(dataset): + + +::: Evaluates linear dependency between numerical variables in a dataset via a Pearson Correlation coefficient heat map. diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index f98d24297..4be26affa 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,7 +24,13 @@ Get a logger for the given module name -::: {.signature} def PhillipsPerronArch(dataset: VMDataset): ::: +::: {.signature} + + +def PhillipsPerronArch(dataset: VMDataset): + + +::: Assesses the stationarity of time series data in each feature of the ML model using the Phillips-Perron test. diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 7f2d13e04..86b150d0c 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def ProtectedClassesCombination( dataset, model, protected_classes = None): ::: +::: {.signature} + + +def ProtectedClassesCombination( + dataset, model, protected_classes = None): + + +::: Visualizes combinations of protected classes and their corresponding error metric differences. diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index 07db022d1..c16cb3462 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + + +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def ProtectedClassesDescription( dataset, protected_classes = None): ::: +::: {.signature} + + +def ProtectedClassesDescription( + dataset, protected_classes = None): + + +::: Visualizes the distribution of protected classes in the dataset relative to the target variable and provides descriptive statistics. diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index b1bb9481e..93afbeef8 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def ProtectedClassesDisparity( dataset, model, protected_classes = None, disparity_tolerance = 1.25, metrics = {'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}): ::: +::: {.signature} + + +def ProtectedClassesDisparity( + dataset, model, protected_classes = None, disparity_tolerance = 1.25, metrics = {'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}): + + +::: Investigates disparities in model performance across different protected class segments. diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 5a8206f59..ae3a7b87b 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,43 +24,90 @@ Get a logger for the given module name -::: {.signature} def calculate_fairness_metrics( test_df, target, y_pred_opt, protected_classes): ::: +::: {.signature} + + +def calculate_fairness_metrics( + test_df, target, y_pred_opt, protected_classes): + + +::: ## calculate_group_metrics[()]{.muted} -::: {.signature} def calculate_group_metrics( test_df, target, y_pred_opt, protected_classes): ::: +::: {.signature} + + +def calculate_group_metrics( + test_df, target, y_pred_opt, protected_classes): + + +::: ## get_thresholds_by_group[()]{.muted} -::: {.signature} def get_thresholds_by_group(threshold_optimizer): ::: +::: {.signature} + + +def get_thresholds_by_group(threshold_optimizer): + + +::: ## initialize_and_fit_optimizer[()]{.muted} -::: {.signature} def initialize_and_fit_optimizer( pipeline, X_train, y_train, protected_classes_df): ::: +::: {.signature} + + +def initialize_and_fit_optimizer( + pipeline, X_train, y_train, protected_classes_df): + + +::: ## make_predictions[()]{.muted} -::: {.signature} def make_predictions( threshold_optimizer, test_df, protected_classes): ::: +::: {.signature} + + +def make_predictions( + threshold_optimizer, test_df, protected_classes): + + +::: ## plot_thresholds[()]{.muted} -::: {.signature} def plot_thresholds(threshold_optimizer): ::: +::: {.signature} + + +def plot_thresholds(threshold_optimizer): + + +::: ## ProtectedClassesThresholdOptimizer[()]{.muted} -::: {.signature} def ProtectedClassesThresholdOptimizer( dataset, pipeline = None, protected_classes = None, X_train = None, y_train = None): ::: +::: {.signature} + + +def ProtectedClassesThresholdOptimizer( + dataset, pipeline = None, protected_classes = None, X_train = None, y_train = None): + + +::: Obtains a classifier by applying group-specific thresholds to the provided estimator. diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 42fe9e4c0..626c13d6f 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -9,13 +9,27 @@ toc-expand: 4 -::: {.signature} def plot_rolling_statistics( df, col, window_size): ::: +::: {.signature} + + +def plot_rolling_statistics( + df, col, window_size): + + +::: ## RollingStatsPlot[()]{.muted} -::: {.signature} def RollingStatsPlot( dataset: VMDataset, window_size: int = 12): ::: +::: {.signature} + + +def RollingStatsPlot( + dataset: VMDataset, window_size: int = 12): + + +::: Evaluates the stationarity of time series data by plotting its rolling mean and standard deviation over a specified window. diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index a65482050..00b24d860 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def RunsTest(dataset): ::: +::: {.signature} + + +def RunsTest(dataset): + + +::: Executes Runs Test on ML model to detect non-random patterns in output data sequence. diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index d561f776c..fdfed32f9 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def ScatterPlot(dataset): ::: +::: {.signature} + + +def ScatterPlot(dataset): + + +::: Assesses visual relationships, patterns, and outliers among features in a dataset through scatter plot matrices. diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 9af5c3da4..057b19fbc 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def ScoreBandDefaultRates( dataset: VMDataset, model: VMModel, score_column: str = 'score', score_bands: list = None): ::: +::: {.signature} + + +def ScoreBandDefaultRates( + dataset: VMDataset, model: VMModel, score_column: str = 'score', score_bands: list = None): + + +::: Analyzes default rates and population distribution across credit score bands. diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index dc1b93c6f..d53ce5fa9 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def SeasonalDecompose( dataset: VMDataset, seasonal_model: str = 'additive'): ::: +::: {.signature} + + +def SeasonalDecompose( + dataset: VMDataset, seasonal_model: str = 'additive'): + + +::: Assesses patterns and seasonality in a time series dataset by decomposing its features into foundational components. diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 894492daf..7c812b29f 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def ShapiroWilk(dataset): ::: +::: {.signature} + + +def ShapiroWilk(dataset): + + +::: Evaluates feature-wise normality of training data using the Shapiro-Wilk test. diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index 5a1381b88..4e82aa946 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def Skewness( dataset, max_threshold = 1): ::: +::: {.signature} + + +def Skewness( + dataset, max_threshold = 1): + + +::: Evaluates the skewness of numerical data in a dataset to check against a defined threshold, aiming to ensure data quality and optimize model performance. diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index bd76d532c..5edfac61e 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def SpreadPlot(dataset: VMDataset): ::: +::: {.signature} + + +def SpreadPlot(dataset: VMDataset): + + +::: Assesses potential correlations between pairs of time series variables through visualization to enhance understanding of their relationships. diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index f834afafd..3e5a5ff21 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def TabularCategoricalBarPlots(dataset: VMDataset): ::: +::: {.signature} + + +def TabularCategoricalBarPlots(dataset: VMDataset): + + +::: Generates and visualizes bar plots for each category in categorical features to evaluate the dataset's composition. diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 7206818d7..254272299 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def TabularDateTimeHistograms(dataset: VMDataset): ::: +::: {.signature} + + +def TabularDateTimeHistograms(dataset: VMDataset): + + +::: Generates histograms to provide graphical insight into the distribution of time intervals in a model's datetime data. diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 5cbadc8a2..dead0a409 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -9,43 +9,88 @@ toc-expand: 4 -::: {.signature} def get_categorical_columns(dataset): ::: +::: {.signature} + + +def get_categorical_columns(dataset): + + +::: ## get_datetime_columns[()]{.muted} -::: {.signature} def get_datetime_columns(dataset): ::: +::: {.signature} + + +def get_datetime_columns(dataset): + + +::: ## get_numerical_columns[()]{.muted} -::: {.signature} def get_numerical_columns(dataset): ::: +::: {.signature} + + +def get_numerical_columns(dataset): + + +::: ## get_summary_statistics_categorical[()]{.muted} -::: {.signature} def get_summary_statistics_categorical( dataset, categorical_fields): ::: +::: {.signature} + + +def get_summary_statistics_categorical( + dataset, categorical_fields): + + +::: ## get_summary_statistics_datetime[()]{.muted} -::: {.signature} def get_summary_statistics_datetime( dataset, datetime_fields): ::: +::: {.signature} + + +def get_summary_statistics_datetime( + dataset, datetime_fields): + + +::: ## get_summary_statistics_numerical[()]{.muted} -::: {.signature} def get_summary_statistics_numerical( dataset, numerical_fields): ::: +::: {.signature} + + +def get_summary_statistics_numerical( + dataset, numerical_fields): + + +::: ## TabularDescriptionTables[()]{.muted} -::: {.signature} def TabularDescriptionTables(dataset): ::: +::: {.signature} + + +def TabularDescriptionTables(dataset): + + +::: Summarizes key descriptive statistics for numerical, categorical, and datetime variables in a dataset. diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 45d1ab1a3..aadec5853 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def TabularNumericalHistograms(dataset: VMDataset): ::: +::: {.signature} + + +def TabularNumericalHistograms(dataset: VMDataset): + + +::: Generates histograms for each numerical feature in a dataset to provide visual insights into data distribution and detect potential issues. diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 1c52e7b35..f9862ceaa 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def TargetRateBarPlots(dataset: VMDataset): ::: +::: {.signature} + + +def TargetRateBarPlots(dataset: VMDataset): + + +::: Generates bar plots visualizing the default rates of categorical features for a classification machine learning model. diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 4228df314..6f271545c 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def TimeSeriesDescription(dataset): ::: +::: {.signature} + + +def TimeSeriesDescription(dataset): + + +::: Generates a detailed analysis for the provided time series dataset, summarizing key statistics to identify trends, patterns, and data quality issues. diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index c1fc502f8..46cf9e2f1 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def TimeSeriesDescriptiveStatistics(dataset): ::: +::: {.signature} + + +def TimeSeriesDescriptiveStatistics(dataset): + + +::: Evaluates the descriptive statistics of a time series dataset to identify trends, patterns, and data quality issues. diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 5f06bbfa6..127aef744 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def TimeSeriesFrequency(dataset: VMDataset): ::: +::: {.signature} + + +def TimeSeriesFrequency(dataset: VMDataset): + + +::: Evaluates consistency of time series data frequency and generates a frequency plot. diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 4d65cb56e..36794a89b 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + + +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def TimeSeriesHistogram( dataset, nbins = 30): ::: +::: {.signature} + + +def TimeSeriesHistogram( + dataset, nbins = 30): + + +::: Visualizes distribution of time-series data using histograms and Kernel Density Estimation (KDE) lines. diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 8a95a4075..217b42274 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def TimeSeriesLinePlot(dataset: VMDataset): ::: +::: {.signature} + + +def TimeSeriesLinePlot(dataset: VMDataset): + + +::: Generates and analyses time-series data through line plots revealing trends, patterns, anomalies over time. diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 65e95bf45..a54da3c92 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def TimeSeriesMissingValues( dataset: VMDataset, min_threshold: int = 1): ::: +::: {.signature} + + +def TimeSeriesMissingValues( + dataset: VMDataset, min_threshold: int = 1): + + +::: Validates time-series data quality by confirming the count of missing values is below a certain threshold. diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index d9d877ef9..7ddc35ffe 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def TimeSeriesOutliers( dataset: VMDataset, zscore_threshold: int = 3): ::: +::: {.signature} + + +def TimeSeriesOutliers( + dataset: VMDataset, zscore_threshold: int = 3): + + +::: Identifies and visualizes outliers in time-series data using the z-score method. diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 13741b88d..e1464391e 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def TooManyZeroValues( dataset: VMDataset, max_percent_threshold: float = 0.03): ::: +::: {.signature} + + +def TooManyZeroValues( + dataset: VMDataset, max_percent_threshold: float = 0.03): + + +::: Identifies numerical columns in a dataset that contain an excessive number of zero values, defined by a threshold percentage. diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 7d14982ec..bccd1f10c 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def UniqueRows( dataset: VMDataset, min_percent_threshold: float = 1): ::: +::: {.signature} + + +def UniqueRows( + dataset: VMDataset, min_percent_threshold: float = 1): + + +::: Verifies the diversity of the dataset by ensuring that the count of unique rows exceeds a prescribed threshold. diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 39235a676..bf44eea79 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def WOEBinPlots( dataset: VMDataset, breaks_adj: list = None, fig_height: int = 600, fig_width: int = 500): ::: +::: {.signature} + + +def WOEBinPlots( + dataset: VMDataset, breaks_adj: list = None, fig_height: int = 600, fig_width: int = 500): + + +::: Generates visualizations of Weight of Evidence (WoE) and Information Value (IV) for understanding predictive power of categorical variables in a data set. diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 07a4fce68..069bd1cac 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def WOEBinTable( dataset: VMDataset, breaks_adj: list = None): ::: +::: {.signature} + + +def WOEBinTable( + dataset: VMDataset, breaks_adj: list = None): + + +::: Assesses the Weight of Evidence (WoE) and Information Value (IV) of each feature to evaluate its predictive power in a binary classification model. diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 3fcd2b41c..127f1fd58 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,7 +24,13 @@ Get a logger for the given module name -::: {.signature} def ZivotAndrewsArch(dataset: VMDataset): ::: +::: {.signature} + + +def ZivotAndrewsArch(dataset: VMDataset): + + +::: Evaluates the order of integration and stationarity of time series data using the Zivot-Andrews unit root test. diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index 62c291592..c6761d3f6 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def CommonWords(dataset: VMDataset): ::: +::: {.signature} + + +def CommonWords(dataset: VMDataset): + + +::: Assesses the most frequent non-stopwords in a text column for identifying prevalent language patterns. diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 5431b741e..d2ad55d95 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def Hashtags( dataset: VMDataset, top_hashtags: int = 25): ::: +::: {.signature} + + +def Hashtags( + dataset: VMDataset, top_hashtags: int = 25): + + +::: Assesses hashtag frequency in a text column, highlighting usage trends and potential dataset bias or spam. diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 054329fd1..f6a7ec548 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def LanguageDetection(dataset): ::: +::: {.signature} + + +def LanguageDetection(dataset): + + +::: Assesses the diversity of languages in a textual dataset by detecting and visualizing the distribution of languages. diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index ac736ac6b..d32134148 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def Mentions( dataset: VMDataset, top_mentions: int = 25): ::: +::: {.signature} + + +def Mentions( + dataset: VMDataset, top_mentions: int = 25): + + +::: Calculates and visualizes frequencies of '@' prefixed mentions in a text-based dataset for NLP model analysis. diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index 8ec042ba7..96c6a7f8c 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def PolarityAndSubjectivity( dataset, threshold_subjectivity = 0.5, threshold_polarity = 0): ::: +::: {.signature} + + +def PolarityAndSubjectivity( + dataset, threshold_subjectivity = 0.5, threshold_polarity = 0): + + +::: Analyzes the polarity and subjectivity of text data within a given dataset to visualize the sentiment distribution. diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index 35ed6df4d..5082b178c 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -11,7 +11,14 @@ Metrics functions for any Pandas-compatible datasets -::: {.signature} def Punctuations( dataset, count_mode = 'token'): ::: +::: {.signature} + + +def Punctuations( + dataset, count_mode = 'token'): + + +::: Analyzes and visualizes the frequency distribution of punctuation usage in a given text dataset. diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index f7bba11c0..736165ebc 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def Sentiment(dataset): ::: +::: {.signature} + + +def Sentiment(dataset): + + +::: Analyzes the sentiment of text data within a dataset using the VADER sentiment analysis tool. diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index c92dcbef4..1d321cb8b 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -11,7 +11,14 @@ Threshold based tests -::: {.signature} def StopWords( dataset: VMDataset, min_percent_threshold: float = 0.5, num_words: int = 25): ::: +::: {.signature} + + +def StopWords( + dataset: VMDataset, min_percent_threshold: float = 0.5, num_words: int = 25): + + +::: Evaluates and visualizes the frequency of English stop words in a text dataset against a defined threshold. diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 22638ecb1..59c5f8fa3 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -9,13 +9,27 @@ toc-expand: 4 -::: {.signature} def create_metrics_df( df, text_column, unwanted_tokens, lang): ::: +::: {.signature} + + +def create_metrics_df( + df, text_column, unwanted_tokens, lang): + + +::: ## TextDescription[()]{.muted} -::: {.signature} def TextDescription( dataset: VMDataset, unwanted_tokens: set = {'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]}, lang: str = 'english'): ::: +::: {.signature} + + +def TextDescription( + dataset: VMDataset, unwanted_tokens: set = {'cls': 'ExprSet', 'elements': ["'s'", '"s\'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"\'s"', "' '", '"\'\'"', "'dollar'", "'us'", "'``'"]}, lang: str = 'english'): + + +::: Conducts comprehensive textual analysis on a dataset using NLTK to evaluate various parameters and generate visualizations. diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index 18f4c3b90..6515368c5 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def Toxicity(dataset): ::: +::: {.signature} + + +def Toxicity(dataset): + + +::: Assesses the toxicity of text data within a dataset to visualize the distribution of toxicity scores. diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 795ce1775..fa5669bd3 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -7,14 +7,16 @@ toc-expand: 4 ## validate_prediction() - + + +::: {.signature} + + +def validate_prediction( + y_true, y_pred, dataset_id = None): + -```python -def validate_prediction( - y_true, - y_pred, - dataset_id = None): -``` +::: Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. @@ -32,7 +34,14 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val -::: {.signature} def BertScore( dataset, model, evaluation_model = 'distilbert-base-uncased'): ::: +::: {.signature} + + +def BertScore( + dataset, model, evaluation_model = 'distilbert-base-uncased'): + + +::: Assesses the quality of machine-generated text using BERTScore metrics and visualizes results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics. diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 8d622b118..4a4420703 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -7,14 +7,16 @@ toc-expand: 4 ## validate_prediction() - + + +::: {.signature} + + +def validate_prediction( + y_true, y_pred, dataset_id = None): + -```python -def validate_prediction( - y_true, - y_pred, - dataset_id = None): -``` +::: Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. @@ -32,7 +34,14 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val -::: {.signature} def BleuScore( dataset, model): ::: +::: {.signature} + + +def BleuScore( + dataset, model): + + +::: Evaluates the quality of machine-generated text using BLEU metrics and visualizes the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for BLEU scores. diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index dbe734fe3..ae7cd0d10 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def ClusterSizeDistribution( dataset: VMDataset, model: VMModel): ::: +::: {.signature} + + +def ClusterSizeDistribution( + dataset: VMDataset, model: VMModel): + + +::: Assesses the performance of clustering models by comparing the distribution of cluster sizes in model predictions with the actual data. diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 9559d73c3..08f77721a 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -7,14 +7,16 @@ toc-expand: 4 ## validate_prediction() - + + +::: {.signature} + + +def validate_prediction( + y_true, y_pred, dataset_id = None): + -```python -def validate_prediction( - y_true, - y_pred, - dataset_id = None): -``` +::: Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. @@ -32,7 +34,14 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val -::: {.signature} def ContextualRecall( dataset, model): ::: +::: {.signature} + + +def ContextualRecall( + dataset, model): + + +::: Evaluates a Natural Language Generation model's ability to generate contextually relevant and factually correct text, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for contextual recall scores. diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 7af6f453a..87dd279ff 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def FeaturesAUC( dataset: VMDataset, fontsize: int = 12, figure_height: int = 500): ::: +::: {.signature} + + +def FeaturesAUC( + dataset: VMDataset, fontsize: int = 12, figure_height: int = 500): + + +::: Evaluates the discriminatory power of each individual feature within a binary classification model by calculating the Area Under the Curve (AUC) for each feature separately. diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 53288704c..22707dcfe 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -7,14 +7,16 @@ toc-expand: 4 ## validate_prediction() - + + +::: {.signature} + + +def validate_prediction( + y_true, y_pred, dataset_id = None): + -```python -def validate_prediction( - y_true, - y_pred, - dataset_id = None): -``` +::: Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. @@ -32,7 +34,14 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val -::: {.signature} def MeteorScore( dataset, model): ::: +::: {.signature} + + +def MeteorScore( + dataset, model): + + +::: Assesses the quality of machine-generated translations by comparing them to human-produced references using the METEOR score, which evaluates precision, recall, and word order. diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index 7564a4fcf..7c69c386e 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -7,11 +7,15 @@ toc-expand: 4 ## get_model_info() - + + +::: {.signature} + + +def get_model_info(model): + -```python -def get_model_info(model): -``` +::: Attempts to extract all model info from a model object instance @@ -19,7 +23,13 @@ Attempts to extract all model info from a model object instance -::: {.signature} def ModelMetadata(model): ::: +::: {.signature} + + +def ModelMetadata(model): + + +::: Compare metadata of different models and generate a summary table with the results. **Purpose**: The purpose of this function is to compare the metadata of different models, including information about their architecture, framework, framework version, and programming language. diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index dc5fb3d0e..9e70f47d0 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def ModelPredictionResiduals( dataset, model, nbins = 100, p_value_threshold = 0.05, start_date = None, end_date = None): ::: +::: {.signature} + + +def ModelPredictionResiduals( + dataset, model, nbins = 100, p_value_threshold = 0.05, start_date = None, end_date = None): + + +::: Assesses normality and behavior of residuals in regression models through visualization and statistical tests. diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 394a9f854..78af431cd 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -7,14 +7,16 @@ toc-expand: 4 ## validate_prediction() - + + +::: {.signature} + + +def validate_prediction( + y_true, y_pred, dataset_id = None): + -```python -def validate_prediction( - y_true, - y_pred, - dataset_id = None): -``` +::: Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. @@ -32,7 +34,14 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val -::: {.signature} def RegardScore( dataset, model): ::: +::: {.signature} + + +def RegardScore( + dataset, model): + + +::: Assesses the sentiment and potential biases in text generated by NLP models by computing and visualizing regard scores. diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 914376c5e..91bd9843d 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def RegressionResidualsPlot( model: VMModel, dataset: VMDataset, bin_size: float = 0.1): ::: +::: {.signature} + + +def RegressionResidualsPlot( + model: VMModel, dataset: VMDataset, bin_size: float = 0.1): + + +::: Evaluates regression model performance using residual distribution and actual vs. predicted plots. diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 9eb223f6e..df601ff5e 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def RougeScore( dataset, model, metric = 'rouge-1'): ::: +::: {.signature} + + +def RougeScore( + dataset, model, metric = 'rouge-1'): + + +::: Assesses the quality of machine-generated text using ROUGE metrics and visualizes the results to provide comprehensive performance insights. diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index 5b6ec06e3..ef99c8de1 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def TimeSeriesPredictionWithCI( dataset, model, confidence = 0.95): ::: +::: {.signature} + + +def TimeSeriesPredictionWithCI( + dataset, model, confidence = 0.95): + + +::: Assesses predictive accuracy and uncertainty in time series models, highlighting breaches beyond confidence intervals. diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index bda6a823a..eec003026 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def TimeSeriesPredictionsPlot( dataset, model): ::: +::: {.signature} + + +def TimeSeriesPredictionsPlot( + dataset, model): + + +::: Plot actual vs predicted values for time series data and generate a visual comparison for the model. diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 187108e0e..11d28b25d 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def TimeSeriesR2SquareBySegments( dataset, model, segments = None): ::: +::: {.signature} + + +def TimeSeriesR2SquareBySegments( + dataset, model, segments = None): + + +::: Evaluates the R-Squared values of regression models over specified time segments in time series data to assess segment-wise model performance. diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index 4b8f5e546..805a6d615 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def TokenDisparity( dataset, model): ::: +::: {.signature} + + +def TokenDisparity( + dataset, model): + + +::: Evaluates the token disparity between reference and generated texts, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for token counts. diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index bd4c49e86..b164f7f8c 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def ToxicityScore( dataset, model): ::: +::: {.signature} + + +def ToxicityScore( + dataset, model): + + +::: Assesses the toxicity levels of texts generated by NLP models to identify and mitigate harmful or offensive content. diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 106c9a4dd..0824ffff7 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def AdjustedMutualInformation( model: VMModel, dataset: VMDataset): ::: +::: {.signature} + + +def AdjustedMutualInformation( + model: VMModel, dataset: VMDataset): + + +::: Evaluates clustering model performance by measuring mutual information between true and predicted labels, adjusting for chance. diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 3cadff611..80af48576 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def AdjustedRandIndex( model: VMModel, dataset: VMDataset): ::: +::: {.signature} + + +def AdjustedRandIndex( + model: VMModel, dataset: VMDataset): + + +::: Measures the similarity between two data clusters using the Adjusted Rand Index (ARI) metric in clustering machine learning models. diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index ee7578741..a7e870499 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def CalibrationCurve( model: VMModel, dataset: VMDataset, n_bins: int = 10): ::: +::: {.signature} + + +def CalibrationCurve( + model: VMModel, dataset: VMDataset, n_bins: int = 10): + + +::: Evaluates the calibration of probability estimates by comparing predicted probabilities against observed frequencies. diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index f257ec282..1f048fc41 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def ClassifierPerformance( dataset: VMDataset, model: VMModel, average: str = 'macro'): ::: +::: {.signature} + + +def ClassifierPerformance( + dataset: VMDataset, model: VMModel, average: str = 'macro'): + + +::: Evaluates performance of binary or multiclass classification models using precision, recall, F1-Score, accuracy, and ROC AUC scores. @@ -43,4 +50,11 @@ The test produces a report that includes precision, recall, F1-Score, and accura -::: {.signature} def multiclass_roc_auc_score( y_test, y_pred, average = 'macro'): ::: +::: {.signature} + + +def multiclass_roc_auc_score( + y_test, y_pred, average = 'macro'): + + +::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 5facc4e47..7595f08d8 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def ClassifierThresholdOptimization( dataset: VMDataset, model: VMModel, methods = None, target_recall = None): ::: +::: {.signature} + + +def ClassifierThresholdOptimization( + dataset: VMDataset, model: VMModel, methods = None, target_recall = None): + + +::: Analyzes and visualizes different threshold optimization methods for binary classification models. @@ -77,7 +84,14 @@ The test implements multiple threshold optimization methods: -::: {.signature} def find_optimal_threshold( y_true, y_prob, method = 'youden', target_recall = None): ::: +::: {.signature} + + +def find_optimal_threshold( + y_true, y_prob, method = 'youden', target_recall = None): + + +::: Find the optimal classification threshold using various methods. diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 0321f9dd8..39a6970aa 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def ClusterCosineSimilarity( model: VMModel, dataset: VMDataset): ::: +::: {.signature} + + +def ClusterCosineSimilarity( + model: VMModel, dataset: VMDataset): + + +::: Measures the intra-cluster similarity of a clustering model using cosine similarity. diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 342c785e3..a040af919 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def ClusterPerformanceMetrics( model: VMModel, dataset: VMDataset): ::: +::: {.signature} + + +def ClusterPerformanceMetrics( + model: VMModel, dataset: VMDataset): + + +::: Evaluates the performance of clustering machine learning models using multiple established metrics. diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index b121ca235..2612b2b5f 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def CompletenessScore( model: VMModel, dataset: VMDataset): ::: +::: {.signature} + + +def CompletenessScore( + model: VMModel, dataset: VMDataset): + + +::: Evaluates a clustering model's capacity to categorize instances from a single class into the same cluster. diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index ea07a1f68..439417bdc 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def ConfusionMatrix( dataset: VMDataset, model: VMModel): ::: +::: {.signature} + + +def ConfusionMatrix( + dataset: VMDataset, model: VMModel): + + +::: Evaluates and visually represents the classification ML model's predictive performance using a Confusion Matrix heatmap. diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index e6414d70a..b0c7824a2 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def FeatureImportance( dataset: VMDataset, model: VMModel, num_features: int = 3): ::: +::: {.signature} + + +def FeatureImportance( + dataset: VMDataset, model: VMModel, num_features: int = 3): + + +::: Compute feature importance scores for a given model and generate a summary table with the top important features. diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 8229056d6..d6d0e4fa1 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def FowlkesMallowsScore( dataset: VMDataset, model: VMModel): ::: +::: {.signature} + + +def FowlkesMallowsScore( + dataset: VMDataset, model: VMModel): + + +::: Evaluates the similarity between predicted and actual cluster assignments in a model using the Fowlkes-Mallows score. diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index a21c8d6fd..89a438182 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def HomogeneityScore( dataset: VMDataset, model: VMModel): ::: +::: {.signature} + + +def HomogeneityScore( + dataset: VMDataset, model: VMModel): + + +::: Assesses clustering homogeneity by comparing true and predicted labels, scoring from 0 (heterogeneous) to 1 (homogeneous). diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index c06271012..2c85aa48f 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -9,13 +9,27 @@ toc-expand: 4 -::: {.signature} def custom_recall( y_true, y_pred_proba, threshold = 0.5): ::: +::: {.signature} + + +def custom_recall( + y_true, y_pred_proba, threshold = 0.5): + + +::: ## HyperParametersTuning[()]{.muted} -::: {.signature} def HyperParametersTuning( model: VMModel, dataset: VMDataset, param_grid: dict, scoring: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'List'}, {'cls': 'ExprName', 'name': 'Dict'}], 'implicit': True}} = None, thresholds: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'float'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}}], 'implicit': True}} = None, fit_params: dict = None): ::: +::: {.signature} + + +def HyperParametersTuning( + model: VMModel, dataset: VMDataset, param_grid: dict, scoring: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'List'}, {'cls': 'ExprName', 'name': 'Dict'}], 'implicit': True}} = None, thresholds: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'float'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}}], 'implicit': True}} = None, fit_params: dict = None): + + +::: Performs exhaustive grid search over specified parameter ranges to find optimal model configurations across different metrics and decision thresholds. diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 51269ffe3..c1164873a 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def KMeansClustersOptimization( model: VMModel, dataset: VMDataset, n_clusters: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'int'}}, 'None'], 'implicit': True}} = None): ::: +::: {.signature} + + +def KMeansClustersOptimization( + model: VMModel, dataset: VMDataset, n_clusters: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'int'}}, 'None'], 'implicit': True}} = None): + + +::: Optimizes the number of clusters in K-means models using Elbow and Silhouette methods. diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 0a7712c58..255094a50 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def MinimumAccuracy( dataset: VMDataset, model: VMModel, min_threshold: float = 0.7): ::: +::: {.signature} + + +def MinimumAccuracy( + dataset: VMDataset, model: VMModel, min_threshold: float = 0.7): + + +::: Checks if the model's prediction accuracy meets or surpasses a specified threshold. diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 8a3328f57..cdd563c36 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def MinimumF1Score( dataset: VMDataset, model: VMModel, min_threshold: float = 0.5): ::: +::: {.signature} + + +def MinimumF1Score( + dataset: VMDataset, model: VMModel, min_threshold: float = 0.5): + + +::: Assesses if the model's F1 score on the validation set meets a predefined minimum threshold, ensuring balanced performance between precision and recall. diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 78a1d886c..070286c4a 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def MinimumROCAUCScore( dataset: VMDataset, model: VMModel, min_threshold: float = 0.5): ::: +::: {.signature} + + +def MinimumROCAUCScore( + dataset: VMDataset, model: VMModel, min_threshold: float = 0.5): + + +::: Validates model by checking if the ROC AUC score meets or surpasses a specified threshold. diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index d24e2914b..32747fe82 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def ModelParameters( model, model_params = None): ::: +::: {.signature} + + +def ModelParameters( + model, model_params = None): + + +::: Extracts and displays model parameters in a structured format for transparency and reproducibility. diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 9ba004b47..ac899ce69 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -7,20 +7,29 @@ toc-expand: 4 ## multiclass_roc_auc_score() - + + +::: {.signature} + + +def multiclass_roc_auc_score( + y_test, y_pred, average = 'macro'): + -```python -def multiclass_roc_auc_score( - y_test, - y_pred, - average = 'macro'): -``` +::: ## ModelsPerformanceComparison[()]{.muted} -::: {.signature} def ModelsPerformanceComparison( dataset: VMDataset, models: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'list'}, 'slice': {'cls': 'ExprName', 'name': 'VMModel'}}): ::: +::: {.signature} + + +def ModelsPerformanceComparison( + dataset: VMDataset, models: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'list'}, 'slice': {'cls': 'ExprName', 'name': 'VMModel'}}): + + +::: Evaluates and compares the performance of multiple Machine Learning models using various metrics like accuracy, precision, recall, and F1 score. diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 05d475cba..e0a979c51 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + + +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def OverfitDiagnosis( model: VMModel, datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, metric: str = None, cut_off_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): ::: +::: {.signature} + + +def OverfitDiagnosis( + model: VMModel, datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, metric: str = None, cut_off_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): + + +::: Assesses potential overfitting in a model's predictions, identifying regions where performance between training and testing sets deviates significantly. diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index bff2749f8..a49106f81 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def PermutationFeatureImportance( model: VMModel, dataset: VMDataset, fontsize: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'int'}, 'None'], 'implicit': True}} = None, figure_height: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'int'}, 'None'], 'implicit': True}} = None): ::: +::: {.signature} + + +def PermutationFeatureImportance( + model: VMModel, dataset: VMDataset, fontsize: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'int'}, 'None'], 'implicit': True}} = None, figure_height: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'int'}, 'None'], 'implicit': True}} = None): + + +::: Assesses the significance of each feature in a model by evaluating the impact on model performance when feature values are randomly rearranged. diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 22c554c9b..07506c250 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def calculate_psi( score_initial, score_new, num_bins = 10, mode = 'fixed'): ::: +::: {.signature} + + +def calculate_psi( + score_initial, score_new, num_bins = 10, mode = 'fixed'): + + +::: Taken from: https://towardsdatascience.com/checking-model-stability-and-population-shift-with-psi-and-csi-6d12af008783 @@ -29,7 +39,14 @@ Taken from: https://towardsdatascience.com/checking-model-stability-and-populati -::: {.signature} def PopulationStabilityIndex( datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, num_bins: int = 10, mode: str = 'fixed'): ::: +::: {.signature} + + +def PopulationStabilityIndex( + datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, num_bins: int = 10, mode: str = 'fixed'): + + +::: Assesses the Population Stability Index (PSI) to quantify the stability of an ML model's predictions across different datasets. diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 0882f7cca..d2911acd7 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def PrecisionRecallCurve( model: VMModel, dataset: VMDataset): ::: +::: {.signature} + + +def PrecisionRecallCurve( + model: VMModel, dataset: VMDataset): + + +::: Evaluates the precision-recall trade-off for binary classification models and visualizes the Precision-Recall curve. diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 33b2f3575..42b103b4e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def ROCCurve( model: VMModel, dataset: VMDataset): ::: +::: {.signature} + + +def ROCCurve( + model: VMModel, dataset: VMDataset): + + +::: Evaluates binary classification model performance by generating and plotting the Receiver Operating Characteristic (ROC) curve and calculating the Area Under Curve (AUC) score. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index d96a87357..9347cb3ad 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def RegressionErrors( model, dataset): ::: +::: {.signature} + + +def RegressionErrors( + model, dataset): + + +::: Assesses the performance and error distribution of a regression model using various error metrics. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 967725b10..11338d8aa 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + + +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def RegressionErrorsComparison( datasets, models): ::: +::: {.signature} + + +def RegressionErrorsComparison( + datasets, models): + + +::: Assesses multiple regression error metrics to compare model performance across different datasets, emphasizing systematic overestimation or underestimation and large percentage errors. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 1b37c9674..008ac5297 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + + +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def RegressionPerformance( model: VMModel, dataset: VMDataset): ::: +::: {.signature} + + +def RegressionPerformance( + model: VMModel, dataset: VMDataset): + + +::: Evaluates the performance of a regression model using five different metrics: MAE, MSE, RMSE, MAPE, and MBD. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index afe853aed..cdb684685 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -7,15 +7,16 @@ toc-expand: 4 ## adj_r2_score() - + + +::: {.signature} + + +def adj_r2_score( + actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: int, featurecount: int): + -```python -def adj_r2_score( - actual: , - predicted: , - rowcount: int, - featurecount: int): -``` +::: Adjusted R2 Score @@ -23,7 +24,14 @@ Adjusted R2 Score -::: {.signature} def RegressionR2Square( dataset, model): ::: +::: {.signature} + + +def RegressionR2Square( + dataset, model): + + +::: Assesses the overall goodness-of-fit of a regression model by evaluating R-squared (R2) and Adjusted R-squared (Adj R2) scores to determine the model's explanatory power over the dependent variable. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 75504655f..16aeb921a 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -7,15 +7,16 @@ toc-expand: 4 ## adj_r2_score() - + + +::: {.signature} + + +def adj_r2_score( + actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: int, featurecount: int): + -```python -def adj_r2_score( - actual: , - predicted: , - rowcount: int, - featurecount: int): -``` +::: Adjusted R2 Score @@ -23,7 +24,14 @@ Adjusted R2 Score -::: {.signature} def RegressionR2SquareComparison( datasets, models): ::: +::: {.signature} + + +def RegressionR2SquareComparison( + datasets, models): + + +::: Compares R-Squared and Adjusted R-Squared values for different regression models across multiple datasets to assess model performance and relevance of features. diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index a326e6151..fc6f02b25 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def RobustnessDiagnosis( datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, metric: str = None, scaling_factor_std_dev_list: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}} = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'}, performance_decay_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): ::: +::: {.signature} + + +def RobustnessDiagnosis( + datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, metric: str = None, scaling_factor_std_dev_list: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}} = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'}, performance_decay_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): + + +::: Assesses the robustness of a machine learning model by evaluating performance decay under noisy conditions. diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 40aedc48a..44daff6c9 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def generate_shap_plot( type\_, shap_values, x_test): ::: +::: {.signature} + + +def generate_shap_plot( + type_, shap_values, x_test): + + +::: Plots two types of SHAP global importance (SHAP). @@ -39,7 +49,14 @@ Plots two types of SHAP global importance (SHAP). -::: {.signature} def select_shap_values( shap_values, class_of_interest): ::: +::: {.signature} + + +def select_shap_values( + shap_values, class_of_interest): + + +::: Selects SHAP values for binary or multiclass classification. For regression models, returns the SHAP values directly as there are no classes. @@ -60,7 +77,14 @@ Selects SHAP values for binary or multiclass classification. For regression mode -::: {.signature} def SHAPGlobalImportance( model: VMModel, dataset: VMDataset, kernel_explainer_samples: int = 10, tree_or_linear_explainer_samples: int = 200, class_of_interest: int = None): ::: +::: {.signature} + + +def SHAPGlobalImportance( + model: VMModel, dataset: VMDataset, kernel_explainer_samples: int = 10, tree_or_linear_explainer_samples: int = 200, class_of_interest: int = None): + + +::: Evaluates and visualizes global feature importance using SHAP values for model explanation and risk identification. diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index ee7cc99e5..3593bea0a 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def ScoreProbabilityAlignment( model: VMModel, dataset: VMDataset, score_column: str = 'score', n_bins: int = 10): ::: +::: {.signature} + + +def ScoreProbabilityAlignment( + model: VMModel, dataset: VMDataset, score_column: str = 'score', n_bins: int = 10): + + +::: Analyzes the alignment between credit scores and predicted probabilities. diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 48429ca33..be46ec366 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def SilhouettePlot( model: VMModel, dataset: VMDataset): ::: +::: {.signature} + + +def SilhouettePlot( + model: VMModel, dataset: VMDataset): + + +::: Calculates and visualizes Silhouette Score, assessing the degree of data point suitability to its cluster in ML models. diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 52321c9e7..e2dd75864 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def TrainingTestDegradation( datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, max_threshold: float = 0.1): ::: +::: {.signature} + + +def TrainingTestDegradation( + datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, max_threshold: float = 0.1): + + +::: Tests if model performance degradation between training and test datasets exceeds a predefined threshold. diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 2a8298629..3ac50e22c 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def VMeasure( dataset: VMDataset, model: VMModel): ::: +::: {.signature} + + +def VMeasure( + dataset: VMDataset, model: VMModel): + + +::: Evaluates homogeneity and completeness of a clustering model using the V Measure Score. diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 0d2f41f60..149e8edd1 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def WeakspotsDiagnosis( datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, features_columns: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}, 'None'], 'implicit': True}} = None, metrics: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Callable'}], 'implicit': True}}, 'None'\], 'implicit': True}} = None, thresholds: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'float'}], 'implicit': True}}, 'None'\], 'implicit': True}} = None): ::: +::: {.signature} + + +def WeakspotsDiagnosis( + datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, features_columns: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}, 'None'], 'implicit': True}} = None, metrics: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Callable'}], 'implicit': True}}, 'None'], 'implicit': True}} = None, thresholds: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'float'}], 'implicit': True}}, 'None'], 'implicit': True}} = None): + + +::: Identifies and visualizes weak spots in a machine learning model's performance across various sections of the feature space. diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 2963dad5e..19c2a8114 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + + +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def AutoARIMA( model: VMModel, dataset: VMDataset): ::: +::: {.signature} + + +def AutoARIMA( + model: VMModel, dataset: VMDataset): + + +::: Evaluates ARIMA models for time-series forecasting, ranking them using Bayesian and Akaike Information Criteria. diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index d14d2e568..32363108f 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def CumulativePredictionProbabilities( dataset, model, title = 'Cumulative Probabilities'): ::: +::: {.signature} + + +def CumulativePredictionProbabilities( + dataset, model, title = 'Cumulative Probabilities'): + + +::: Visualizes cumulative probabilities of positive and negative classes for both training and testing in classification models. diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index f6eb64d5d..2e8676783 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def DurbinWatsonTest( dataset, model, threshold = {'cls': 'ExprList', 'elements': ['1.5', '2.5']}): ::: +::: {.signature} + + +def DurbinWatsonTest( + dataset, model, threshold = {'cls': 'ExprList', 'elements': ['1.5', '2.5']}): + + +::: Assesses autocorrelation in time series data features using the Durbin-Watson statistic. diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index 223444596..9ea0e580e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def GINITable( dataset, model): ::: +::: {.signature} + + +def GINITable( + dataset, model): + + +::: Evaluates classification model performance using AUC, GINI, and KS metrics for training and test datasets. diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 0d5bb93fe..e6cee4b08 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def KolmogorovSmirnov( model: VMModel, dataset: VMDataset, dist: str = 'norm'): ::: +::: {.signature} + + +def KolmogorovSmirnov( + model: VMModel, dataset: VMDataset, dist: str = 'norm'): + + +::: Assesses whether each feature in the dataset aligns with a normal distribution using the Kolmogorov-Smirnov test. diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 008a496cd..0def345b9 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def Lilliefors(dataset: VMDataset): ::: +::: {.signature} + + +def Lilliefors(dataset: VMDataset): + + +::: Assesses the normality of feature distributions in an ML model's training dataset using the Lilliefors test. diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index c632c73e7..0657f1a01 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def PredictionProbabilitiesHistogram( dataset, model, title = 'Histogram of Predictive Probabilities'): ::: +::: {.signature} + + +def PredictionProbabilitiesHistogram( + dataset, model, title = 'Histogram of Predictive Probabilities'): + + +::: Assesses the predictive probability distribution for binary classification to evaluate model performance and potential overfitting or bias. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 2989b33cd..f90901316 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -9,7 +9,13 @@ toc-expand: 4 -::: {.signature} def RegressionCoeffs(model): ::: +::: {.signature} + + +def RegressionCoeffs(model): + + +::: Assesses the significance and uncertainty of predictor variables in a regression model through visualization of coefficients and their 95% confidence intervals. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 120415df8..9ac9dd9ee 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def RegressionFeatureSignificance( model: VMModel, fontsize: int = 10, p_threshold: float = 0.05): ::: +::: {.signature} + + +def RegressionFeatureSignificance( + model: VMModel, fontsize: int = 10, p_threshold: float = 0.05): + + +::: Assesses and visualizes the statistical significance of features in a regression model. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 434c0f9f5..5c3b92a70 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + + +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def RegressionModelForecastPlot( model: VMModel, dataset: VMDataset, start_date: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None, end_date: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None): ::: +::: {.signature} + + +def RegressionModelForecastPlot( + model: VMModel, dataset: VMDataset, start_date: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None, end_date: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None): + + +::: Generates plots to visually compare the forecasted outcomes of a regression model against actual observed values over a specified date range. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index a55bfc45c..7672c9825 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -9,13 +9,27 @@ toc-expand: 4 -::: {.signature} def integrate_diff( series_diff, start_value): ::: +::: {.signature} + + +def integrate_diff( + series_diff, start_value): + + +::: ## RegressionModelForecastPlotLevels[()]{.muted} -::: {.signature} def RegressionModelForecastPlotLevels( model: VMModel, dataset: VMDataset): ::: +::: {.signature} + + +def RegressionModelForecastPlotLevels( + model: VMModel, dataset: VMDataset): + + +::: Assesses the alignment between forecasted and observed values in regression models through visual plots diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 14476dfae..580d25b66 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + + +::: {.signature} -```python -def get_logger( - name = 'validmind', - log_level = None): -``` + +def get_logger( + name = 'validmind', log_level = None): + + +::: Get a logger for the given module name @@ -21,13 +24,27 @@ Get a logger for the given module name -::: {.signature} def integrate_diff( series_diff, start_value): ::: +::: {.signature} + + +def integrate_diff( + series_diff, start_value): + + +::: ## RegressionModelSensitivityPlot[()]{.muted} -::: {.signature} def RegressionModelSensitivityPlot( dataset: VMDataset, model: VMModel, shocks: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}} = {'cls': 'ExprList', 'elements': ['0.1']}, transformation: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None): ::: +::: {.signature} + + +def RegressionModelSensitivityPlot( + dataset: VMDataset, model: VMModel, shocks: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}} = {'cls': 'ExprList', 'elements': ['0.1']}, transformation: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None): + + +::: Assesses the sensitivity of a regression model to changes in independent variables by applying shocks and visualizing the impact. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 466cfaaf1..a5de4b8cb 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -7,15 +7,16 @@ toc-expand: 4 ## adj_r2_score() - + + +::: {.signature} + + +def adj_r2_score( + actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: int, featurecount: int): + -```python -def adj_r2_score( - actual: , - predicted: , - rowcount: int, - featurecount: int): -``` +::: Adjusted R2 Score @@ -23,7 +24,14 @@ Adjusted R2 Score -::: {.signature} def RegressionModelSummary( dataset: VMDataset, model: VMModel): ::: +::: {.signature} + + +def RegressionModelSummary( + dataset: VMDataset, model: VMModel): + + +::: Evaluates regression model performance using metrics including R-Squared, Adjusted R-Squared, MSE, and RMSE. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 779236981..1caac1f0c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -7,13 +7,16 @@ toc-expand: 4 ## get_logger() - + + +::: {.signature} + + +def get_logger( + name = 'validmind', log_level = None): + -```python -def get_logger( - name = 'validmind', - log_level = None): -``` +::: Get a logger for the given module name @@ -21,7 +24,14 @@ Get a logger for the given module name -::: {.signature} def RegressionPermutationFeatureImportance( dataset: VMDataset, model: VMModel, fontsize: int = 12, figure_height: int = 500): ::: +::: {.signature} + + +def RegressionPermutationFeatureImportance( + dataset: VMDataset, model: VMModel, fontsize: int = 12, figure_height: int = 500): + + +::: Assesses the significance of each feature in a model by evaluating the impact on model performance when feature values are randomly rearranged. diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index f5a3f11d9..c70a40691 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def ScorecardHistogram( dataset, title = 'Histogram of Scores', score_column = 'score'): ::: +::: {.signature} + + +def ScorecardHistogram( + dataset, title = 'Histogram of Scores', score_column = 'score'): + + +::: The Scorecard Histogram test evaluates the distribution of credit scores between default and non-default instances, providing critical insights into the performance and generalizability of credit-risk models. diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 7b66f68f9..cd8a3bdb8 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -9,6 +9,13 @@ toc-expand: 4 -::: {.signature} def adj_r2_score( actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: int, featurecount: int): ::: +::: {.signature} + + +def adj_r2_score( + actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: int, featurecount: int): + + +::: Adjusted R2 Score diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index f272f56bc..be04fd45d 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -7,25 +7,30 @@ toc-expand: 4 ## call_model() - + -```python -def call_model( - system_prompt: str, - user_prompt: str, - temperature: float = 0.0, - seed: int = 42): -``` +::: {.signature} + + +def call_model( + system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): + + +::: Call LLM with the given prompts and return the response ## get_explanation() - + -```python -def get_explanation(response: str): -``` +::: {.signature} + + +def get_explanation(response: str): + + +::: Get just the explanation from the response string TODO: use json response mode instead of this @@ -37,11 +42,15 @@ Explanation: " -> "" ## get_score() - + -```python -def get_score(response: str): -``` +::: {.signature} + + +def get_score(response: str): + + +::: Get just the score from the response string TODO: use json response mode instead of this @@ -55,7 +64,14 @@ Explanation: " -> 8 -::: {.signature} def Bias( model, min_threshold = 7): ::: +::: {.signature} + + +def Bias( + model, min_threshold = 7): + + +::: Assesses potential bias in a Large Language Model by analyzing the distribution and order of exemplars in the prompt. diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 6b079cb77..f9d5adb15 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -7,25 +7,30 @@ toc-expand: 4 ## call_model() - + -```python -def call_model( - system_prompt: str, - user_prompt: str, - temperature: float = 0.0, - seed: int = 42): -``` +::: {.signature} + + +def call_model( + system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): + + +::: Call LLM with the given prompts and return the response ## get_explanation() - + -```python -def get_explanation(response: str): -``` +::: {.signature} + + +def get_explanation(response: str): + + +::: Get just the explanation from the response string TODO: use json response mode instead of this @@ -37,11 +42,15 @@ Explanation: " -> "" ## get_score() - + -```python -def get_score(response: str): -``` +::: {.signature} + + +def get_score(response: str): + + +::: Get just the score from the response string TODO: use json response mode instead of this @@ -55,7 +64,14 @@ Explanation: " -> 8 -::: {.signature} def Clarity( model, min_threshold = 7): ::: +::: {.signature} + + +def Clarity( + model, min_threshold = 7): + + +::: Evaluates and scores the clarity of prompts in a Large Language Model based on specified guidelines. diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 7b17bc0a8..aac462b1a 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -7,25 +7,30 @@ toc-expand: 4 ## call_model() - + -```python -def call_model( - system_prompt: str, - user_prompt: str, - temperature: float = 0.0, - seed: int = 42): -``` +::: {.signature} + + +def call_model( + system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): + + +::: Call LLM with the given prompts and return the response ## get_explanation() - + -```python -def get_explanation(response: str): -``` +::: {.signature} + + +def get_explanation(response: str): + + +::: Get just the explanation from the response string TODO: use json response mode instead of this @@ -37,11 +42,15 @@ Explanation: " -> "" ## get_score() - + -```python -def get_score(response: str): -``` +::: {.signature} + + +def get_score(response: str): + + +::: Get just the score from the response string TODO: use json response mode instead of this @@ -55,7 +64,14 @@ Explanation: " -> 8 -::: {.signature} def Conciseness( model, min_threshold = 7): ::: +::: {.signature} + + +def Conciseness( + model, min_threshold = 7): + + +::: Analyzes and grades the conciseness of prompts provided to a Large Language Model. diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 5e9e3f781..dadcab89f 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -7,25 +7,30 @@ toc-expand: 4 ## call_model() - + -```python -def call_model( - system_prompt: str, - user_prompt: str, - temperature: float = 0.0, - seed: int = 42): -``` +::: {.signature} + + +def call_model( + system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): + + +::: Call LLM with the given prompts and return the response ## get_explanation() - + -```python -def get_explanation(response: str): -``` +::: {.signature} + + +def get_explanation(response: str): + + +::: Get just the explanation from the response string TODO: use json response mode instead of this @@ -37,11 +42,15 @@ Explanation: " -> "" ## get_score() - + -```python -def get_score(response: str): -``` +::: {.signature} + + +def get_score(response: str): + + +::: Get just the score from the response string TODO: use json response mode instead of this @@ -55,7 +64,14 @@ Explanation: " -> 8 -::: {.signature} def Delimitation( model, min_threshold = 7): ::: +::: {.signature} + + +def Delimitation( + model, min_threshold = 7): + + +::: Evaluates the proper use of delimiters in prompts provided to Large Language Models. diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 550143957..206a2b6f0 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -7,25 +7,30 @@ toc-expand: 4 ## call_model() - + -```python -def call_model( - system_prompt: str, - user_prompt: str, - temperature: float = 0.0, - seed: int = 42): -``` +::: {.signature} + + +def call_model( + system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): + + +::: Call LLM with the given prompts and return the response ## get_explanation() - + -```python -def get_explanation(response: str): -``` +::: {.signature} + + +def get_explanation(response: str): + + +::: Get just the explanation from the response string TODO: use json response mode instead of this @@ -37,11 +42,15 @@ Explanation: " -> "" ## get_score() - + -```python -def get_score(response: str): -``` +::: {.signature} + + +def get_score(response: str): + + +::: Get just the score from the response string TODO: use json response mode instead of this @@ -55,7 +64,14 @@ Explanation: " -> 8 -::: {.signature} def NegativeInstruction( model, min_threshold = 7): ::: +::: {.signature} + + +def NegativeInstruction( + model, min_threshold = 7): + + +::: Evaluates and grades the use of affirmative, proactive language over negative instructions in LLM prompts. diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index be70406e1..4c267812a 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -7,15 +7,16 @@ toc-expand: 4 ## call_model() - + -```python -def call_model( - system_prompt: str, - user_prompt: str, - temperature: float = 0.0, - seed: int = 42): -``` +::: {.signature} + + +def call_model( + system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): + + +::: Call LLM with the given prompts and return the response @@ -23,7 +24,14 @@ Call LLM with the given prompts and return the response -::: {.signature} def Robustness( model, dataset, num_tests = 10): ::: +::: {.signature} + + +def Robustness( + model, dataset, num_tests = 10): + + +::: Assesses the robustness of prompts provided to a Large Language Model under varying conditions and contexts. This test specifically measures the model's ability to generate correct classifications with the given prompt even when the inputs are edge cases or otherwise difficult to classify. diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index b99904dda..ffb45a313 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -7,25 +7,30 @@ toc-expand: 4 ## call_model() - + -```python -def call_model( - system_prompt: str, - user_prompt: str, - temperature: float = 0.0, - seed: int = 42): -``` +::: {.signature} + + +def call_model( + system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): + + +::: Call LLM with the given prompts and return the response ## get_explanation() - + -```python -def get_explanation(response: str): -``` +::: {.signature} + + +def get_explanation(response: str): + + +::: Get just the explanation from the response string TODO: use json response mode instead of this @@ -37,11 +42,15 @@ Explanation: " -> "" ## get_score() - + -```python -def get_score(response: str): -``` +::: {.signature} + + +def get_score(response: str): + + +::: Get just the score from the response string TODO: use json response mode instead of this @@ -55,7 +64,14 @@ Explanation: " -> 8 -::: {.signature} def Specificity( model, min_threshold = 7): ::: +::: {.signature} + + +def Specificity( + model, min_threshold = 7): + + +::: Evaluates and scores the specificity of prompts provided to a Large Language Model (LLM), based on clarity, detail, and relevance. diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index edb9477b1..edf83f804 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def call_model( system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): ::: +::: {.signature} + + +def call_model( + system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): + + +::: Call LLM with the given prompts and return the response @@ -17,7 +24,13 @@ Call LLM with the given prompts and return the response -::: {.signature} def get_explanation(response: str): ::: +::: {.signature} + + +def get_explanation(response: str): + + +::: Get just the explanation from the response string TODO: use json response mode instead of this @@ -31,7 +44,13 @@ Explanation: " -> "" -::: {.signature} def get_score(response: str): ::: +::: {.signature} + + +def get_score(response: str): + + +::: Get just the score from the response string TODO: use json response mode instead of this diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 37a59ccf0..2c93eed90 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -9,7 +9,14 @@ toc-expand: 4 -::: {.signature} def describe_metric( metric_id: str, kwargs = {}): ::: +::: {.signature} + + +def describe_metric( + metric_id: str, kwargs = {}): + + +::: Describe a metric @@ -17,7 +24,13 @@ Describe a metric -::: {.signature} def list_metrics(kwargs = {}): ::: +::: {.signature} + + +def list_metrics(kwargs = {}): + + +::: List all metrics @@ -25,6 +38,13 @@ List all metrics -::: {.signature} def run_metric( metric_id: str, kwargs = {}): ::: +::: {.signature} + + +def run_metric( + metric_id: str, kwargs = {}): + + +::: Run a metric diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 4ec6b2b4f..07137695d 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -19,31 +19,43 @@ Figure objects track the schema supported by the ValidMind API ### [serialize[()]{.muted}](#serialize) - + -```python -serialize(self) -``` +::: {.signature} + + +def serialize(self): + + +::: Serializes the Figure to a dictionary so it can be sent to the API ### [serialize_files[()]{.muted}](#serialize_files) - + -```python -serialize_files(self) -``` +::: {.signature} + + +def serialize_files(self): + + +::: Creates a `requests`-compatible files object to be sent to the API ### [to_widget[()]{.muted}](#to_widget) - + -```python -to_widget(self) -``` +::: {.signature} + + +def to_widget(self): + + +::: Returns the ipywidget compatible representation of the figure. Ideally we would render images as-is, but Plotly FigureWidgets don't work well on Google Colab when they are combined with ipywidgets. @@ -59,11 +71,16 @@ Model attributes definition ### [from_dict[()]{.muted}](#from_dict) - + -```python -from_dict(cls, data) -``` +::: {.signature} + + +def from_dict( + cls, data): + + +::: Creates a ModelAttributes instance from a dictionary @@ -81,11 +98,15 @@ Tests can be a flat list of strings or may be nested into sections by using a di ### [get_default_config[()]{.muted}](#get_default_config) - + -```python -get_default_config(self) -``` +::: {.signature} + + +def get_default_config(self) -> dict: + + +::: Returns the default configuration for the test suite Each test in a test suite can accept parameters and those parameters can have default values. Both the parameters and their defaults are set in the test class and a config object can be passed to the test suite's run method to override the defaults. This function returns a dictionary containing the parameters and their default values for every test to allow users to view and set values @@ -95,21 +116,29 @@ Returns the default configuration for the test suite Each test in a test suite c ### [get_tests[()]{.muted}](#get_tests) - + -```python -get_tests(self) -``` +::: {.signature} + + +def get_tests(self) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}: + + +::: Get all test suite test objects from all sections ### [num_tests[()]{.muted}](#num_tests) - + -```python -num_tests(self) -``` +::: {.signature} + + +def num_tests(self) -> int: + + +::: Returns the total number of tests in the test suite @@ -125,21 +154,30 @@ Runs a test suite ### [log_results[()]{.muted}](#log_results) - + -```python -log_results(self) -``` +::: {.signature} + + +def log_results(self): + + +::: Logs the results of the test suite to ValidMind This method will be called after the test suite has been run and all results have been collected. This method will log the results to ValidMind. ### [run[()]{.muted}](#run) - + -```python -run(self, send, fail_fast) -``` +::: {.signature} + + +def run( + self, send: bool = True, fail_fast: bool = False): + + +::: Runs the test suite, renders the summary and sends the results to ValidMind @@ -150,11 +188,16 @@ Runs the test suite, renders the summary and sends the results to ValidMind ### [summarize[()]{.muted}](#summarize) - + -```python -summarize(self, show_link) -``` +::: {.signature} + + +def summarize( + self, show_link: bool = True): + + +::: ## [class]{.muted} VMDataset @@ -187,11 +230,16 @@ This way we can support multiple dataset types but under the hood we only need t ### [add_extra_column[()]{.muted}](#add_extra_column) - + -```python -add_extra_column(self, column_name, column_values) -``` +::: {.signature} + + +def add_extra_column( + self, column_name, column_values = None): + + +::: Adds an extra column to the dataset without modifying the dataset `features` and `target` columns. @@ -202,11 +250,16 @@ Adds an extra column to the dataset without modifying the dataset `features` and ### [assign_predictions[()]{.muted}](#assign_predictions) - + -```python -assign_predictions(self, model, prediction_column, prediction_values, probability_column, probability_values, prediction_probabilities, kwargs) -``` +::: {.signature} + + +def assign_predictions( + self, model: VMModel, prediction_column: str = None, prediction_values: list = None, probability_column: str = None, probability_values: list = None, prediction_probabilities: list = None, kwargs = {}): + + +::: Assign predictions and probabilities to the dataset. @@ -222,41 +275,60 @@ Assign predictions and probabilities to the dataset. ### [prediction_column[()]{.muted}](#prediction_column) - + -```python -prediction_column(self, model, column_name) -``` +::: {.signature} + + +def prediction_column( + self, model: VMModel, column_name: str = None) -> str: + + +::: Get or set the prediction column for a model. ### [probability_column[()]{.muted}](#probability_column) - + -```python -probability_column(self, model, column_name) -``` +::: {.signature} + + +def probability_column( + self, model: VMModel, column_name: str = None) -> str: + + +::: Get or set the probability column for a model. ### [target_classes[()]{.muted}](#target_classes) - + -```python -target_classes(self) -``` +::: {.signature} + + +def target_classes(self): + + +::: Returns the target class labels or unique values of the target column. ### [with_options[()]{.muted}](#with_options) - + -```python -with_options(self, kwargs) -``` +::: {.signature} + + +def with_options( + self, kwargs = {}) -> VMDataset: + + +::: Support options provided when passing an input to run_test or run_test_suite @@ -271,31 +343,44 @@ Support options provided when passing an input to run_test or run_test_suite ### [x_df[()]{.muted}](#x_df) - + -```python -x_df(self) -``` +::: {.signature} + + +def x_df(self): + + +::: Returns a dataframe containing only the feature columns ### [y_df[()]{.muted}](#y_df) - + -```python -y_df(self) -``` +::: {.signature} + + +def y_df(self) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: + + +::: Returns a dataframe containing the target column ### [y_pred[()]{.muted}](#y_pred) - + -```python -y_pred(self, model) -``` +::: {.signature} + + +def y_pred( + self, model) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: + + +::: Returns the predictions for a given model. Attempts to stack complex prediction types (e.g., embeddings) into a single, multi-dimensional array. @@ -309,21 +394,31 @@ Returns the predictions for a given model. Attempts to stack complex prediction ### [y_pred_df[()]{.muted}](#y_pred_df) - + -```python -y_pred_df(self, model) -``` +::: {.signature} + + +def y_pred_df( + self, model) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: + + +::: Returns a dataframe containing the predictions for a given model ### [y_prob[()]{.muted}](#y_prob) - + -```python -y_prob(self, model) -``` +::: {.signature} + + +def y_prob( + self, model) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: + + +::: Returns the probabilities for a given model. @@ -337,11 +432,16 @@ Returns the probabilities for a given model. ### [y_prob_df[()]{.muted}](#y_prob_df) - + -```python -y_prob_df(self, model) -``` +::: {.signature} + + +def y_prob_df( + self, model) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: + + +::: Returns a dataframe containing the probabilities for a given model @@ -359,11 +459,16 @@ Base class for ValidMind Input types ### [with_options[()]{.muted}](#with_options) - + -```python -with_options(self, kwargs) -``` +::: {.signature} + + +def with_options( + self, kwargs = {}) -> VMInput: + + +::: Allows for setting options on the input object that are passed by the user when using the input to run a test or set of tests @@ -398,30 +503,44 @@ An base class that wraps a trained model instance and its associated data. ### [predict[()]{.muted}](#predict) - + -```python -predict(self, args, kwargs) -``` +::: {.signature} + + +def predict( + self, args = (), kwargs = {}): + + +::: Predict method for the model. This is a wrapper around the model's ### [predict_proba[()]{.muted}](#predict_proba) - + -```python -predict_proba(self, args, kwargs) -``` +::: {.signature} + + +def predict_proba( + self, args = (), kwargs = {}): + + +::: Predict probabilties - must be implemented by subclass if needed ### [serialize[()]{.muted}](#serialize) - + -```python -serialize(self) -``` +::: {.signature} + + +def serialize(self): + + +::: Serializes the model to a dictionary so it can be sent to the API From fbe9941a4af82f2f706309fb016169264b486598 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 31 Jan 2025 18:51:31 -0800 Subject: [PATCH 047/207] Halfway through switching to better signatures --- docs/templates/class.qmd.jinja2 | 2 +- docs/templates/function.qmd.jinja2 | 4 ++-- docs/templates/macros/signatures.jinja2 | 2 +- docs/templates/module.qmd.jinja2 | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/templates/class.qmd.jinja2 b/docs/templates/class.qmd.jinja2 index d2659b62d..f209a2d60 100644 --- a/docs/templates/class.qmd.jinja2 +++ b/docs/templates/class.qmd.jinja2 @@ -36,7 +36,7 @@ class {{ resolved.name }}({% for base in resolved.bases %}{{ base.name }}{% if n {% if member.kind in ['method', 'function'] and not member.name.startswith('_') %} ### [{{ member.name }}[()]{.muted}](#{{ member.name }}) -{{ signatures.render_function_signature(member) }} +{{ signatures.render_signature(member) }} {% if member.docstring %} {{ doc.format_docstring(member.docstring) }} diff --git a/docs/templates/function.qmd.jinja2 b/docs/templates/function.qmd.jinja2 index 354bf2803..77399c4cc 100644 --- a/docs/templates/function.qmd.jinja2 +++ b/docs/templates/function.qmd.jinja2 @@ -1,10 +1,10 @@ -{% from "macros/signatures.jinja2" import render_function_signature %} +{% from "macros/signatures.jinja2" import render_signature %} {% if member.kind == "function" %} ## {{ member_name | default(member.name) }}[()]{.muted} -{{ render_function_signature(member) }} +{{ render_signature(member) }} {% if member.docstring %} {{ doc.format_docstring(member.docstring) }} diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index ffa3b61c3..57e2783aa 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -1,4 +1,4 @@ -{% macro render_function_signature(member) %} +{% macro render_signature(member) %} ::: {.signature} diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index 2d12e4184..c65697604 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -37,7 +37,7 @@ toc-expand: 4 ### {{ member.name }}() {% if target.kind == "function" %} -{{ signatures.render_function_signature(target) }} +{{ signatures.render_signature(target) }} {% endif %} {{ doc.format_docstring(target.docstring) }} @@ -71,7 +71,7 @@ toc-expand: 4 {% if resolved.kind == "function" %} ## {{ member.name }}() -{{ signatures.render_function_signature(resolved) }} +{{ signatures.render_signature(resolved) }} {% if resolved.docstring %} {{ doc.format_docstring(resolved.docstring) }} @@ -120,7 +120,7 @@ class {{ member.name }}(): #### {{ member.name if method_name == '__init__' else method_name }}() -{{ signatures.render_function_signature(method) }} +{{ signatures.render_signature(method) }} {% if method.docstring %} {{ doc.format_docstring(method.docstring) }} From 8a0cca56bb211a2e27c5ff03b6e169bfb6781e91 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 2 Feb 2025 13:53:09 -0800 Subject: [PATCH 048/207] Continue to improve snignature blocks and remove duplication --- docs/_sidebar.yml | 1 + docs/templates/class.qmd.jinja2 | 6 +- docs/templates/errors.qmd.jinja2 | 6 +- docs/templates/function.qmd.jinja2 | 1 + docs/templates/macros/docstring.jinja2 | 1 + docs/templates/macros/navigation.jinja2 | 3 + docs/templates/macros/signatures.jinja2 | 46 +- docs/templates/macros/types.jinja2 | 3 + docs/templates/module.qmd.jinja2 | 17 +- docs/templates/sidebar.qmd.jinja2 | 1 + docs/validmind.qmd | 169 +++--- docs/validmind/datasets.qmd | 3 + docs/validmind/datasets/classification.qmd | 3 + .../classification/customer_churn.qmd | 54 +- .../datasets/classification/taiwan_credit.qmd | 44 +- docs/validmind/datasets/credit_risk.qmd | 3 + .../datasets/credit_risk/lending_club.qmd | 93 +-- .../credit_risk/lending_club_bias.qmd | 36 +- docs/validmind/datasets/nlp.qmd | 3 + docs/validmind/datasets/nlp/cnn_dailymail.qmd | 23 +- .../datasets/nlp/twitter_covid_19.qmd | 9 +- docs/validmind/datasets/regression.qmd | 3 + docs/validmind/datasets/regression/fred.qmd | 69 +-- .../datasets/regression/lending_club.qmd | 29 +- docs/validmind/errors.qmd | 559 ++++++++++++------ docs/validmind/test_suites.qmd | 490 ++++++++++----- docs/validmind/test_suites/classifier.qmd | 101 +++- docs/validmind/test_suites/cluster.qmd | 59 +- docs/validmind/test_suites/embeddings.qmd | 45 +- docs/validmind/test_suites/llm.qmd | 87 ++- docs/validmind/test_suites/nlp.qmd | 73 ++- .../test_suites/parameters_optimization.qmd | 17 +- docs/validmind/test_suites/regression.qmd | 71 ++- .../test_suites/statsmodels_timeseries.qmd | 31 +- docs/validmind/test_suites/summarization.qmd | 17 +- .../test_suites/tabular_datasets.qmd | 45 +- docs/validmind/test_suites/text_data.qmd | 17 +- docs/validmind/test_suites/time_series.qmd | 101 +++- docs/validmind/tests.qmd | 174 +++--- docs/validmind/tests/data_validation.qmd | 1 + .../tests/data_validation/ACFandPACFPlot.qmd | 11 +- docs/validmind/tests/data_validation/ADF.qmd | 20 +- .../tests/data_validation/AutoAR.qmd | 21 +- .../tests/data_validation/AutoMA.qmd | 21 +- .../data_validation/AutoStationarity.qmd | 12 +- .../data_validation/BivariateScatterPlots.qmd | 11 +- .../tests/data_validation/BoxPierce.qmd | 11 +- .../ChiSquaredFeaturesTable.qmd | 26 +- .../tests/data_validation/ClassImbalance.qmd | 28 +- .../data_validation/DatasetDescription.qmd | 75 ++- .../tests/data_validation/DatasetSplit.qmd | 11 +- .../data_validation/DescriptiveStatistics.qmd | 51 +- .../tests/data_validation/DickeyFullerGLS.qmd | 34 +- .../tests/data_validation/Duplicates.qmd | 12 +- .../data_validation/EngleGrangerCoint.qmd | 26 +- .../FeatureTargetCorrelationPlot.qmd | 12 +- .../tests/data_validation/HighCardinality.qmd | 12 +- .../HighPearsonCorrelation.qmd | 12 +- .../data_validation/IQROutliersBarPlot.qmd | 21 +- .../data_validation/IQROutliersTable.qmd | 21 +- .../IsolationForestOutliers.qmd | 12 +- .../tests/data_validation/JarqueBera.qmd | 11 +- docs/validmind/tests/data_validation/KPSS.qmd | 34 +- .../tests/data_validation/LJungBox.qmd | 11 +- .../LaggedCorrelationHeatmap.qmd | 12 +- .../tests/data_validation/MissingValues.qmd | 12 +- .../data_validation/MissingValuesBarPlot.qmd | 12 +- .../data_validation/MutualInformation.qmd | 12 +- .../PearsonCorrelationMatrix.qmd | 11 +- .../data_validation/PhillipsPerronArch.qmd | 34 +- .../ProtectedClassesCombination.qmd | 35 +- .../ProtectedClassesDescription.qmd | 21 +- .../ProtectedClassesDisparity.qmd | 35 +- .../ProtectedClassesThresholdOptimizer.qmd | 87 +-- .../data_validation/RollingStatsPlot.qmd | 35 +- .../tests/data_validation/RunsTest.qmd | 11 +- .../tests/data_validation/ScatterPlot.qmd | 11 +- .../data_validation/ScoreBandDefaultRates.qmd | 12 +- .../data_validation/SeasonalDecompose.qmd | 35 +- .../tests/data_validation/ShapiroWilk.qmd | 11 +- .../tests/data_validation/Skewness.qmd | 12 +- .../tests/data_validation/SpreadPlot.qmd | 25 +- .../TabularCategoricalBarPlots.qmd | 25 +- .../TabularDateTimeHistograms.qmd | 25 +- .../TabularDescriptionTables.qmd | 62 +- .../TabularNumericalHistograms.qmd | 11 +- .../data_validation/TargetRateBarPlots.qmd | 25 +- .../data_validation/TimeSeriesDescription.qmd | 11 +- .../TimeSeriesDescriptiveStatistics.qmd | 11 +- .../data_validation/TimeSeriesFrequency.qmd | 25 +- .../data_validation/TimeSeriesHistogram.qmd | 21 +- .../data_validation/TimeSeriesLinePlot.qmd | 25 +- .../TimeSeriesMissingValues.qmd | 26 +- .../data_validation/TimeSeriesOutliers.qmd | 26 +- .../data_validation/TooManyZeroValues.qmd | 12 +- .../tests/data_validation/UniqueRows.qmd | 12 +- .../tests/data_validation/WOEBinPlots.qmd | 35 +- .../tests/data_validation/WOEBinTable.qmd | 26 +- .../data_validation/ZivotAndrewsArch.qmd | 34 +- docs/validmind/tests/data_validation/nlp.qmd | 1 + .../tests/data_validation/nlp/CommonWords.qmd | 11 +- .../tests/data_validation/nlp/Hashtags.qmd | 26 +- .../data_validation/nlp/LanguageDetection.qmd | 11 +- .../tests/data_validation/nlp/Mentions.qmd | 26 +- .../nlp/PolarityAndSubjectivity.qmd | 12 +- .../data_validation/nlp/Punctuations.qmd | 14 +- .../tests/data_validation/nlp/Sentiment.qmd | 11 +- .../tests/data_validation/nlp/StopWords.qmd | 14 +- .../data_validation/nlp/TextDescription.qmd | 21 +- .../tests/data_validation/nlp/Toxicity.qmd | 11 +- docs/validmind/tests/model_validation.qmd | 1 + .../tests/model_validation/BertScore.qmd | 21 +- .../tests/model_validation/BleuScore.qmd | 21 +- .../ClusterSizeDistribution.qmd | 12 +- .../model_validation/ContextualRecall.qmd | 21 +- .../tests/model_validation/FeaturesAUC.qmd | 35 +- .../tests/model_validation/MeteorScore.qmd | 21 +- .../tests/model_validation/ModelMetadata.qmd | 19 +- .../ModelPredictionResiduals.qmd | 12 +- .../tests/model_validation/RegardScore.qmd | 21 +- .../RegressionResidualsPlot.qmd | 12 +- .../tests/model_validation/RougeScore.qmd | 12 +- .../TimeSeriesPredictionWithCI.qmd | 12 +- .../TimeSeriesPredictionsPlot.qmd | 12 +- .../TimeSeriesR2SquareBySegments.qmd | 12 +- .../tests/model_validation/TokenDisparity.qmd | 12 +- .../tests/model_validation/ToxicityScore.qmd | 12 +- .../tests/model_validation/sklearn.qmd | 1 + .../sklearn/AdjustedMutualInformation.qmd | 12 +- .../sklearn/AdjustedRandIndex.qmd | 12 +- .../sklearn/CalibrationCurve.qmd | 12 +- .../sklearn/ClassifierPerformance.qmd | 21 +- .../ClassifierThresholdOptimization.qmd | 23 +- .../sklearn/ClusterCosineSimilarity.qmd | 26 +- .../sklearn/ClusterPerformanceMetrics.qmd | 12 +- .../sklearn/CompletenessScore.qmd | 12 +- .../sklearn/ConfusionMatrix.qmd | 12 +- .../sklearn/FeatureImportance.qmd | 12 +- .../sklearn/FowlkesMallowsScore.qmd | 12 +- .../sklearn/HomogeneityScore.qmd | 12 +- .../sklearn/HyperParametersTuning.qmd | 21 +- .../sklearn/KMeansClustersOptimization.qmd | 26 +- .../sklearn/MinimumAccuracy.qmd | 12 +- .../sklearn/MinimumF1Score.qmd | 12 +- .../sklearn/MinimumROCAUCScore.qmd | 12 +- .../sklearn/ModelParameters.qmd | 12 +- .../sklearn/ModelsPerformanceComparison.qmd | 19 +- .../sklearn/OverfitDiagnosis.qmd | 21 +- .../sklearn/PermutationFeatureImportance.qmd | 35 +- .../sklearn/PopulationStabilityIndex.qmd | 46 +- .../sklearn/PrecisionRecallCurve.qmd | 26 +- .../model_validation/sklearn/ROCCurve.qmd | 26 +- .../sklearn/RegressionErrors.qmd | 12 +- .../sklearn/RegressionErrorsComparison.qmd | 21 +- .../sklearn/RegressionPerformance.qmd | 21 +- .../sklearn/RegressionR2Square.qmd | 21 +- .../sklearn/RegressionR2SquareComparison.qmd | 21 +- .../sklearn/RobustnessDiagnosis.qmd | 35 +- .../sklearn/SHAPGlobalImportance.qmd | 57 +- .../sklearn/ScoreProbabilityAlignment.qmd | 12 +- .../sklearn/SilhouettePlot.qmd | 12 +- .../sklearn/TrainingTestDegradation.qmd | 12 +- .../model_validation/sklearn/VMeasure.qmd | 12 +- .../sklearn/WeakspotsDiagnosis.qmd | 12 +- .../tests/model_validation/statsmodels.qmd | 1 + .../statsmodels/AutoARIMA.qmd | 21 +- .../CumulativePredictionProbabilities.qmd | 12 +- .../statsmodels/DurbinWatsonTest.qmd | 12 +- .../statsmodels/GINITable.qmd | 12 +- .../statsmodels/KolmogorovSmirnov.qmd | 26 +- .../statsmodels/Lilliefors.qmd | 11 +- .../PredictionProbabilitiesHistogram.qmd | 12 +- .../statsmodels/RegressionCoeffs.qmd | 25 +- .../RegressionFeatureSignificance.qmd | 35 +- .../RegressionModelForecastPlot.qmd | 21 +- .../RegressionModelForecastPlotLevels.qmd | 21 +- .../RegressionModelSensitivityPlot.qmd | 30 +- .../statsmodels/RegressionModelSummary.qmd | 21 +- ...RegressionPermutationFeatureImportance.qmd | 21 +- .../statsmodels/ScorecardHistogram.qmd | 12 +- .../statsmodels/statsutils.qmd | 12 +- docs/validmind/tests/prompt_validation.qmd | 1 + .../tests/prompt_validation/Bias.qmd | 51 +- .../tests/prompt_validation/Clarity.qmd | 51 +- .../tests/prompt_validation/Conciseness.qmd | 51 +- .../tests/prompt_validation/Delimitation.qmd | 51 +- .../prompt_validation/NegativeInstruction.qmd | 51 +- .../tests/prompt_validation/Robustness.qmd | 49 +- .../tests/prompt_validation/Specificity.qmd | 51 +- .../prompt_validation/ai_powered_test.qmd | 32 +- docs/validmind/unit_metrics.qmd | 33 +- docs/validmind/vm_models.qmd | 322 +++++----- 192 files changed, 3695 insertions(+), 2339 deletions(-) diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml index 00ea4a439..35f1000af 100644 --- a/docs/_sidebar.yml +++ b/docs/_sidebar.yml @@ -1,3 +1,4 @@ +# sidebar.qmd.jinja2 website: sidebar: - id: validmind-reference diff --git a/docs/templates/class.qmd.jinja2 b/docs/templates/class.qmd.jinja2 index f209a2d60..f86aca76d 100644 --- a/docs/templates/class.qmd.jinja2 +++ b/docs/templates/class.qmd.jinja2 @@ -1,12 +1,10 @@ {% import "macros/docstring.jinja2" as doc %} {% import "macros/signatures.jinja2" as signatures %} + ## [class]{.muted} {{ resolved.name }} - -```python -class {{ resolved.name }}({% for base in resolved.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): -``` +{{ signatures.render_signature(resolved) }} {% if resolved.docstring %} {{ doc.format_docstring(resolved.docstring) }} diff --git a/docs/templates/errors.qmd.jinja2 b/docs/templates/errors.qmd.jinja2 index 47dfb39bd..fe5a08e5d 100644 --- a/docs/templates/errors.qmd.jinja2 +++ b/docs/templates/errors.qmd.jinja2 @@ -2,8 +2,9 @@ {% import "macros/types.jinja2" as types %} --- title: errors -toc-depth: 3 -toc-expand: 3 +toc-depth: 4 +toc-expand: 4 +# errors.qmd.jinja2 --- {% if module.docstring %} @@ -16,7 +17,6 @@ toc-expand: 3 {% if member.kind == 'class' and member.name in ['BaseError', 'APIRequestError'] %} ### [class]{.muted} {{ member.name }} - ```python class {{ member.name }}({% for base in member.bases %}{{ base.name }}{% if not loop.last %}, {% endif %}{% endfor %}): ``` diff --git a/docs/templates/function.qmd.jinja2 b/docs/templates/function.qmd.jinja2 index 77399c4cc..e04099538 100644 --- a/docs/templates/function.qmd.jinja2 +++ b/docs/templates/function.qmd.jinja2 @@ -1,3 +1,4 @@ + {% from "macros/signatures.jinja2" import render_signature %} {% if member.kind == "function" %} diff --git a/docs/templates/macros/docstring.jinja2 b/docs/templates/macros/docstring.jinja2 index c8ea6dcea..11fab75a7 100644 --- a/docs/templates/macros/docstring.jinja2 +++ b/docs/templates/macros/docstring.jinja2 @@ -1,4 +1,5 @@ {% macro format_docstring(docstring) %} + {% if docstring is mapping %} {%- if docstring.parsed is defined and docstring.parsed is not none -%} {# Try to use docstring-parser output #} diff --git a/docs/templates/macros/navigation.jinja2 b/docs/templates/macros/navigation.jinja2 index c852b6993..d333bd5f7 100644 --- a/docs/templates/macros/navigation.jinja2 +++ b/docs/templates/macros/navigation.jinja2 @@ -1,4 +1,5 @@ {% macro breadcrumbs(module) %} + {# {% set parts = module.path.split('.') %} [API Reference](../index.qmd) {% for part in parts %} @@ -7,6 +8,7 @@ {% endmacro %} {% macro module_tree(module) %} + {% if module.members %} ``` {{ print_tree(module) }} @@ -15,6 +17,7 @@ {% endmacro %} {% macro print_tree(node, prefix='', is_last=True) %} + {{ prefix }}{{ '└── ' if is_last else '├── ' }}{{ node.name }} {% if node.members %} {% for member in node.members | sort_members %} diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index 57e2783aa..8c1a8c7a2 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -1,14 +1,42 @@ -{% macro render_signature(member) %} - +{%- macro render_signature(member) -%} + ::: {.signature} - -def {{ member.name }}{% if member.parameters|length <= 1 %}({{ member.parameters[0].name if member.parameters }}{% if member.parameters and member.parameters[0].annotation %}: {{ member.parameters[0].annotation['name'] if member.parameters[0].annotation is mapping and 'name' in member.parameters[0].annotation else member.parameters[0].annotation }}{% endif %}{% if member.parameters and member.parameters[0].default is not none %} = {{ member.parameters[0].default }}{% endif %}){% else %}( -{% for param in member.parameters %} - {{ param.name }}{% if param.annotation %}: {{ param.annotation['name'] if param.annotation is mapping and 'name' in param.annotation else param.annotation }}{% endif %}{% if param.default is not none %} = {{ param.default }}{% endif %}{% if not loop.last %},{% endif %} -{% endfor %} -){% endif %}{% if member.returns %} -> {{ member.returns['name'] if member.returns is mapping and 'name' in member.returns else member.returns }}{% endif %}: + + {%- if member.kind == "class" or member.kind == "alias" -%}class + {%- elif member.kind == "function" or member.kind == "method" -%}def + {%- else -%}{{ member.kind }} + {%- endif -%} +{{ member.name }}{%- if member.parameters -%}( + {%- if member.parameters|length == 1 -%} + {{ member.parameters[0].name }} + {%- if member.parameters[0].annotation -%} + :{{ member.parameters[0].annotation['name'] if member.parameters[0].annotation is mapping and 'name' in member.parameters[0].annotation else member.parameters[0].annotation }} + {%- endif -%} + {%- if member.parameters[0].default is not none -%} + ={{ member.parameters[0].default }} + {%- endif -%} + + {%- else -%} + {%- for param in member.parameters -%} + {{ param.name }} + {%- if param.annotation -%} + :{{ param.annotation['name'] if param.annotation is mapping and 'name' in param.annotation else param.annotation }} + {%- endif -%} + {%- if param.default is not none -%} + = {{ param.default }} + {%- endif -%} + {%- if not loop.last -%},{%- endif -%} + + {%- endfor -%} + {%- endif -%} +){%- else -%}(){%- endif -%}{%- if member.returns -%} + + {%- set return_name = member.returns['name'] if member.returns is mapping and 'name' in member.returns else member.returns -%} +
{{ return_name }}: + +{%- endif -%} ::: -{% endmacro %} \ No newline at end of file +{%- endmacro -%} \ No newline at end of file diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index e44ea73f2..16abdd11c 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -1,4 +1,5 @@ {% macro format_type(type) %} + {% if type is mapping %} {% if type.kind == 'union' %} {{ type.types | map('format_type') | join(' | ') }} @@ -13,6 +14,7 @@ {% endmacro %} {%- macro format_return_type(returns) -%} + {%- if returns.cls == "ExprName" -%} {%- if returns.name in validmind.members.client.members and validmind.members.client.members[returns.name].kind == "alias" -%} {{ validmind.members.client.members[returns.name].target_path }} @@ -33,6 +35,7 @@ {%- endmacro %} {%- macro format_module_return_type(returns, module, full_data) -%} + {%- if returns.cls == "ExprName" -%} {%- if returns.name in module.members and module.members[returns.name].kind == "alias" -%} {{ module.members[returns.name].target_path }} diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index c65697604..10691d5a2 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -11,6 +11,7 @@ aliases: sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- {% if module.docstring %} @@ -24,9 +25,11 @@ toc-expand: 4 ### __version__ -```python -{{ module.members.__version__.value | replace("'", "") if module.members.__version__.value else module.members.__version__.members.__version__.value | replace("'", "") }} -``` +::: {.signature} + +{{ module.members.__version__.value | replace("'", "") if module.members.__version__.value else module.members.__version__.members.__version__.value | replace("'", "") }} + +::: {% endif %} {# Process root-level aliases #} @@ -105,10 +108,10 @@ toc-expand: 4 ### class {{ member.name }} - -```python -class {{ member.name }}(): -``` + + +{{ signatures.render_signature(target) }} + {% if target.docstring %} {{ doc.format_docstring(target.docstring) }} diff --git a/docs/templates/sidebar.qmd.jinja2 b/docs/templates/sidebar.qmd.jinja2 index 7212f8b80..aa10b3462 100644 --- a/docs/templates/sidebar.qmd.jinja2 +++ b/docs/templates/sidebar.qmd.jinja2 @@ -1,3 +1,4 @@ +# sidebar.qmd.jinja2 website: sidebar: - id: validmind-reference diff --git a/docs/validmind.qmd b/docs/validmind.qmd index b348e2d6c..eb01fc40a 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -5,8 +5,11 @@ aliases: sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + The ValidMind Library is a suite of developer tools and methods designed to automate the documentation and validation of your models. Designed to be model agnostic, the ValidMind Library provides all the standard functionality without requiring you to rewrite any functions as long as your model is built in Python. With a rich array of documentation tools and test suites, from documenting descriptions of your datasets to testing your models for weak spots and overfit areas, the ValidMind Library helps you automate model documentation by feeding the ValidMind Platform with documentation artifacts and test results. @@ -38,23 +41,24 @@ After you have pasted the code snippet into your development source code and exe -```python -2.8.4 -``` +::: {.signature} + +2.8.4 + +::: ### get_test_suite() - + ::: {.signature} - -def get_test_suite( - test_suite_id: str = None, section: str = None, args = (), kwargs = {}) -> TestSuite: - +def get_test_suite(test_suite_id:str = None,section:str = None,args = (),kwargs = {})TestSuite: ::: + + Gets a TestSuite object for the current project or a specific test suite This function provides an interface to retrieve the TestSuite instance for the current project or a specific TestSuite instance identified by test_suite_id. The project Test Suite will contain sections for every section in the project's documentation template and these Test Suite Sections will contain all the tests associated with that template section. **Parameters** @@ -66,17 +70,16 @@ Gets a TestSuite object for the current project or a specific test suite This fu ### init() - + ::: {.signature} - -def init( - project: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, api_key: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, api_secret: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, api_host: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, model: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, monitoring: bool = False, generate_descriptions: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'bool'}} = None): - +def init(project:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None,api_key:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None,api_secret:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None,api_host:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None,model:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None,monitoring:bool = False,generate_descriptions:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'bool'}} = None) ::: + + Initializes the API client instances and calls the /ping endpoint to ensure the provided credentials are valid and we can connect to the ValidMind API. If the API key and secret are not provided, the client will attempt to retrieve them from the environment variables `VM_API_KEY` and `VM_API_SECRET`. @@ -97,17 +100,16 @@ If the API key and secret are not provided, the client will attempt to retrieve ### init_dataset() - + ::: {.signature} - -def init_dataset( - dataset, model = None, index = None, index_name: str = None, date_time_index: bool = False, columns: list = None, text_column: str = None, target_column: str = None, feature_columns: list = None, extra_columns: dict = None, class_labels: dict = None, type: str = None, input_id: str = None, __log = True) -> VMDataset: - +def init_dataset(dataset,model = None,index = None,index_name:str = None,date_time_index:bool = False,columns:list = None,text_column:str = None,target_column:str = None,feature_columns:list = None,extra_columns:dict = None,class_labels:dict = None,type:str = None,input_id:str = None,\_\_log = True)VMDataset: ::: + + Initializes a VM Dataset, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are reading a valid dataset type. The following dataset types are supported: @@ -125,17 +127,16 @@ Returns: vm.vm.Dataset: A VM Dataset instance ### init_model() - + ::: {.signature} - -def init_model( - model: object = None, input_id: str = 'model', attributes: dict = None, predict_fn: callable = None, __log = True, kwargs = {}) -> VMModel: - +def init_model(model:object = None,input_id:str = 'model',attributes:dict = None,predict_fn:callable = None,\_\_log = True,kwargs = {})VMModel: ::: + + Initializes a VM Model, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are creating a model supported libraries. **Parameters** @@ -156,17 +157,16 @@ Initializes a VM Model, which can then be passed to other functions that can per ### init_r_model() - + ::: {.signature} - -def init_r_model( - model_path: str, input_id: str = 'model') -> VMModel: - +def init_r_model(model_path:str,input_id:str = 'model')VMModel: ::: + + Initializes a VM Model for an R model R models must be saved to disk and the filetype depends on the model type... Currently we support the following model types: - LogisticRegression `glm` model in R: saved as an RDS file with `saveRDS` @@ -187,17 +187,16 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ### log_metric() - + ::: {.signature} - -def log_metric( - key: str, value: float, inputs: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}} = None, params: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}} = None, recorded_at: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, thresholds: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}} = None): - +def log_metric(key:str,value:float,inputs:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}} = None,params:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}} = None,recorded_at:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None,thresholds:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}} = None) ::: + + Logs a unit metric Unit metrics are key-value pairs where the key is the metric name and the value is a scalar (int or float). These key-value pairs are associated with the currently selected model (inventory model in the ValidMind Platform) and keys can be logged to over time to create a history of the metric. On the ValidMind Platform, these metrics will be used to create plots/visualizations for documentation and dashboards etc. **Parameters** @@ -211,16 +210,16 @@ Logs a unit metric Unit metrics are key-value pairs where the key is the metric ### preview_template() - + ::: {.signature} - -def preview_template(): - +def preview_template() ::: + + Preview the documentation template for the current project This function will display the documentation template for the current project. If the project has not been initialized, then an error will be raised. **Raises** @@ -229,45 +228,44 @@ Preview the documentation template for the current project This function will di ### print_env() - + ::: {.signature} - -def print_env(): - +def print_env() ::: + + Prints a log of the running environment for debugging. Output includes: ValidMind Library version, operating system details, installed dependencies, and the ISO 8601 timestamp at log creation. ### reload() - + ::: {.signature} - -def reload(): - +def reload() ::: + + Reconnect to the ValidMind API and reload the project configuration ### run_documentation_tests() - + ::: {.signature} - -def run_documentation_tests( - section = None, send = True, fail_fast = False, inputs = None, config = None, kwargs = {}): - +def run_documentation_tests(section = None,send = True,fail_fast = False,inputs = None,config = None,kwargs = {}) ::: + + Collect and run all the tests associated with a template This function will analyze the current project's documentation template and collect all the tests associated with it into a test suite. It will then run the test suite, log the results to the ValidMind API, and display them to the user. **Parameters** @@ -289,17 +287,16 @@ Collect and run all the tests associated with a template This function will anal ### run_test_suite() - + ::: {.signature} - -def run_test_suite( - test_suite_id, send = True, fail_fast = False, config = None, inputs = None, kwargs = {}): - +def run_test_suite(test_suite_id,send = True,fail_fast = False,config = None,inputs = None,kwargs = {}) ::: + + High Level function for running a test suite This function provides a high level interface for running a test suite. A test suite is a collection of tests. This function will automatically find the correct test suite class based on the test_suite_id, initialize each of the tests, and run them. **Parameters** @@ -321,16 +318,16 @@ High Level function for running a test suite This function provides a high level ### tags() - + ::: {.signature} - -def tags(tags = ()): - +def tags(tags=()) ::: + + Decorator for specifying tags for a test. **Parameters** @@ -339,16 +336,16 @@ Decorator for specifying tags for a test. ### tasks() - + ::: {.signature} - -def tasks(tasks = ()): - +def tasks(tasks=()) ::: + + Decorator for specifying the task types that a test is designed for. **Parameters** @@ -357,16 +354,16 @@ Decorator for specifying the task types that a test is designed for. ### test() - + ::: {.signature} - -def test(func_or_id): - +def test(func_or_id) ::: + + Decorator for creating and registering custom tests This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. The function can take two different types of arguments: @@ -394,27 +391,32 @@ The function may also include a docstring. This docstring will be used and logge ### class RawData - + -```python -class RawData(): -``` + + +::: {.signature} + +class RawData() + +::: + + Holds raw data for a test result #### RawData() - + ::: {.signature} - -def __init__( - self, log: bool = False, kwargs = {}): - +def __init__(self,log:bool = False,kwargs = {}) ::: + + Create a new RawData object **Parameters** @@ -424,27 +426,24 @@ Create a new RawData object #### inspect() - + ::: {.signature} - -def inspect( - self, show: bool = True): - +def inspect(self,show:bool = True) ::: + + Inspect the raw data #### serialize() - + ::: {.signature} - -def serialize(self): - +def serialize(self) ::: diff --git a/docs/validmind/datasets.qmd b/docs/validmind/datasets.qmd index ed9673a26..f84f71ef9 100644 --- a/docs/validmind/datasets.qmd +++ b/docs/validmind/datasets.qmd @@ -3,8 +3,11 @@ title: "[validmind](/reference/validmind.html).datasets" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Example datasets that can be used with the ValidMind Library. - [classification](datasets/classification.qmd) diff --git a/docs/validmind/datasets/classification.qmd b/docs/validmind/datasets/classification.qmd index 81f67f971..67899abfe 100644 --- a/docs/validmind/datasets/classification.qmd +++ b/docs/validmind/datasets/classification.qmd @@ -3,8 +3,11 @@ title: "[validmind](/reference/validmind.html).classification" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Entrypoint for classification datasets. - [customer_churn](classification/customer_churn.qmd) diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index 39603c81d..e5b33b1e4 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -3,21 +3,21 @@ title: "[validmind](/reference/validmind.html).customer_churn" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## simple_preprocess_booleans() - + ::: {.signature} - -def simple_preprocess_booleans( - df, columns): - +def simple_preprocess_booleans(df,columns) ::: + + Preprocess boolean columns. **Parameters** @@ -31,17 +31,16 @@ Preprocess boolean columns. ## simple_preprocess_categoricals() - + ::: {.signature} - -def simple_preprocess_categoricals( - df, columns): - +def simple_preprocess_categoricals(df,columns) ::: + + Preprocess categorical columns. **Parameters** @@ -55,17 +54,16 @@ Preprocess categorical columns. ## simple_preprocess_numericals() - + ::: {.signature} - -def simple_preprocess_numericals( - df, columns): - +def simple_preprocess_numericals(df,columns) ::: + + Preprocess numerical columns. **Parameters** @@ -77,18 +75,20 @@ Preprocess numerical columns. - Preprocessed dataframe. + + ## get_demo_test_config[()]{.muted} - + ::: {.signature} - -def get_demo_test_config(test_suite = None): - +def get_demo_test_config(test_suite=None) ::: + + Returns input configuration for the default documentation template assigned to this demo model The default documentation template uses the following inputs: @@ -106,26 +106,26 @@ We assign the following inputs depending on the input config expected by each te - When a test expects "model" and "dataset" we use the model and test_dataset - The only exception is ClassifierPerformance since that runs twice: once with the train_dataset (in sample) and once with the test_dataset (out of sample) + + ## load_data[()]{.muted} - + ::: {.signature} - -def load_data(full_dataset = False): - +def load_data(full_dataset=False) ::: + + ## preprocess[()]{.muted} - + ::: {.signature} - -def preprocess(df): - +def preprocess(df) ::: diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index 8bd1720c7..f44c7c972 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -3,21 +3,21 @@ title: "[validmind](/reference/validmind.html).taiwan_credit" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## simple_preprocess_booleans() - + ::: {.signature} - -def simple_preprocess_booleans( - df, columns): - +def simple_preprocess_booleans(df,columns) ::: + + Preprocess boolean columns. **Parameters** @@ -31,17 +31,16 @@ Preprocess boolean columns. ## simple_preprocess_categoricals() - + ::: {.signature} - -def simple_preprocess_categoricals( - df, columns): - +def simple_preprocess_categoricals(df,columns) ::: + + Preprocess categorical columns. **Parameters** @@ -55,17 +54,16 @@ Preprocess categorical columns. ## simple_preprocess_numericals() - + ::: {.signature} - -def simple_preprocess_numericals( - df, columns): - +def simple_preprocess_numericals(df,columns) ::: + + Preprocess numerical columns. **Parameters** @@ -77,26 +75,26 @@ Preprocess numerical columns. - Preprocessed dataframe. + + ## load_data[()]{.muted} - + ::: {.signature} - -def load_data(): - +def load_data() ::: + + ## preprocess[()]{.muted} - + ::: {.signature} - -def preprocess(df): - +def preprocess(df) ::: diff --git a/docs/validmind/datasets/credit_risk.qmd b/docs/validmind/datasets/credit_risk.qmd index fe09d89fd..1e4d758d5 100644 --- a/docs/validmind/datasets/credit_risk.qmd +++ b/docs/validmind/datasets/credit_risk.qmd @@ -3,8 +3,11 @@ title: "[validmind](/reference/validmind.html).credit_risk" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Entrypoint for credit risk datasets. - [lending_club](credit_risk/lending_club.qmd) diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index 56536ceca..3ffb83444 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -3,46 +3,47 @@ title: "[validmind](/reference/validmind.html).lending_club" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## compute_scores[()]{.muted} - + ::: {.signature} - -def compute_scores(probabilities): - +def compute_scores(probabilities) ::: + + ## feature_engineering[()]{.muted} - + ::: {.signature} - -def feature_engineering( - df, verbose = True): - +def feature_engineering(df,verbose = True) ::: + + ## get_demo_test_config[()]{.muted} - + ::: {.signature} - -def get_demo_test_config( - x_test = None, y_test = None): - +def get_demo_test_config(x_test = None,y_test = None) ::: + + Get demo test configuration. **Parameters** @@ -54,83 +55,84 @@ Get demo test configuration. - Test configuration dictionary + + ## init_vm_objects[()]{.muted} - + ::: {.signature} - -def init_vm_objects(scorecard): - +def init_vm_objects(scorecard) ::: + + ## load_data[()]{.muted} - + ::: {.signature} - -def load_data( - source = 'online', verbose = True): - +def load_data(source = 'online',verbose = True) ::: + + Load data from either an online source or offline files, automatically dropping specified columns for offline data. :param source: 'online' for online data, 'offline' for offline files. Defaults to 'online'. :return: DataFrame containing the loaded data. + + ## load_scorecard[()]{.muted} - + ::: {.signature} - -def load_scorecard(): - +def load_scorecard() ::: + + ## load_test_config[()]{.muted} - + ::: {.signature} - -def load_test_config(scorecard): - +def load_test_config(scorecard) ::: + + ## preprocess[()]{.muted} - + ::: {.signature} - -def preprocess( - df, verbose = True): - +def preprocess(df,verbose = True) ::: + + ## split[()]{.muted} - + ::: {.signature} - -def split( - df, validation_size = None, test_size = 0.2, add_constant = False, verbose = True): - +def split(df,validation_size = None,test_size = 0.2,add_constant = False,verbose = True) ::: + + Split dataset into train, validation (optional), and test sets. **Parameters** @@ -144,15 +146,14 @@ Split dataset into train, validation (optional), and test sets. - If validation_size is None: train_df, test_df If validation_size is float: train_df, validation_df, test_df + + ## woe_encoding[()]{.muted} - + ::: {.signature} - -def woe_encoding( - df, verbose = True): - +def woe_encoding(df,verbose = True) ::: diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 079362d83..2d5762277 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -3,55 +3,57 @@ title: "[validmind](/reference/validmind.html).lending_club_bias" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## compute_scores[()]{.muted} - + ::: {.signature} - -def compute_scores(probabilities): - +def compute_scores(probabilities) ::: + + ## load_data[()]{.muted} - + ::: {.signature} - -def load_data(): - +def load_data() ::: + + Load data from the specified CSV file. :return: DataFrame containing the loaded data. + + ## preprocess[()]{.muted} - + ::: {.signature} - -def preprocess(df): - +def preprocess(df) ::: + + ## split[()]{.muted} - + ::: {.signature} - -def split( - df, test_size = 0.3): - +def split(df,test_size = 0.3) ::: diff --git a/docs/validmind/datasets/nlp.qmd b/docs/validmind/datasets/nlp.qmd index bfbeb61d0..f6a5b00a5 100644 --- a/docs/validmind/datasets/nlp.qmd +++ b/docs/validmind/datasets/nlp.qmd @@ -3,8 +3,11 @@ title: "[validmind](/reference/validmind.html).nlp" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Example datasets that can be used with the ValidMind Library. - [cnn_dailymail](nlp/cnn_dailymail.qmd) diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index aa5a07e41..382996b32 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -3,34 +3,37 @@ title: "[validmind](/reference/validmind.html).cnn_dailymail" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## display_nice[()]{.muted} - + ::: {.signature} - -def display_nice( - df, num_rows = None): - +def display_nice(df,num_rows = None) ::: + + Primary function to format and display a DataFrame. + + ## load_data[()]{.muted} - + ::: {.signature} - -def load_data( - source = 'online', dataset_size = None): - +def load_data(source = 'online',dataset_size = None) ::: + + Load data from either online source or offline files. :param source: 'online' for online data, 'offline' for offline data. Defaults to 'online'. :param dataset_size: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. :return: DataFrame containing the loaded data. diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index e1faef0b2..8276fb55b 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -3,16 +3,17 @@ title: "[validmind](/reference/validmind.html).twitter_covid_19" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## load_data[()]{.muted} - + ::: {.signature} - -def load_data(full_dataset = False): - +def load_data(full_dataset=False) ::: diff --git a/docs/validmind/datasets/regression.qmd b/docs/validmind/datasets/regression.qmd index 88dfcf2fa..db10919c5 100644 --- a/docs/validmind/datasets/regression.qmd +++ b/docs/validmind/datasets/regression.qmd @@ -3,8 +3,11 @@ title: "[validmind](/reference/validmind.html).regression" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Entrypoint for regression datasets - [fred](regression/fred.qmd) diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index 48e794732..b0d36f2d7 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -3,93 +3,95 @@ title: "[validmind](/reference/validmind.html).fred" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## load_all_data[()]{.muted} - + ::: {.signature} - -def load_all_data(): - +def load_all_data() ::: + + ## load_data[()]{.muted} - + ::: {.signature} - -def load_data(): - +def load_data() ::: + + ## load_model[()]{.muted} - + ::: {.signature} - -def load_model(model_name): - +def load_model(model_name) ::: + + ## load_processed_data[()]{.muted} - + ::: {.signature} - -def load_processed_data(): - +def load_processed_data() ::: + + ## load_test_dataset[()]{.muted} - + ::: {.signature} - -def load_test_dataset(model_name): - +def load_test_dataset(model_name) ::: + + ## load_train_dataset[()]{.muted} - + ::: {.signature} - -def load_train_dataset(model_path): - +def load_train_dataset(model_path) ::: + + ## preprocess[()]{.muted} - + ::: {.signature} - -def preprocess( - df, split_option = 'train_test_val', train_size = 0.6, test_size = 0.2): - +def preprocess(df,split_option = 'train_test_val',train_size = 0.6,test_size = 0.2) ::: + + Split a time series DataFrame into train, validation, and test sets. **Parameters** @@ -103,15 +105,14 @@ Split a time series DataFrame into train, validation, and test sets. - train_df (pandas.DataFrame): The training set. validation_df (pandas.DataFrame): The validation set (only returned if split_option is 'train_test_val'). test_df (pandas.DataFrame): The test set. + + ## transform[()]{.muted} - + ::: {.signature} - -def transform( - df, transform_func = 'diff'): - +def transform(df,transform_func = 'diff') ::: diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 0eebaf477..f1801acf0 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -3,33 +3,35 @@ title: "[validmind](/reference/validmind.html).lending_club" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## load_data[()]{.muted} - + ::: {.signature} - -def load_data(): - +def load_data() ::: + + ## preprocess[()]{.muted} - + ::: {.signature} - -def preprocess( - df, split_option = 'train_test_val', train_size = 0.6, test_size = 0.2): - +def preprocess(df,split_option = 'train_test_val',train_size = 0.6,test_size = 0.2) ::: + + Split a time series DataFrame into train, validation, and test sets. **Parameters** @@ -43,15 +45,14 @@ Split a time series DataFrame into train, validation, and test sets. - train_df (pandas.DataFrame): The training set. validation_df (pandas.DataFrame): The validation set (only returned if split_option is 'train_test_val'). test_df (pandas.DataFrame): The test set. + + ## transform[()]{.muted} - + ::: {.signature} - -def transform( - df, transform_func = 'diff'): - +def transform(df,transform_func = 'diff') ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index e1040e5e6..b5445fd4a 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -3,20 +3,29 @@ title: "[validmind](/reference/validmind.html).errors" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + This module contains all the custom errors that are used in the ValidMind Library. The following base errors are defined for others: - BaseError - APIRequestError + + ## [class]{.muted} APIRequestError - + + +::: {.signature} + +class APIRequestError() + +::: -```python -class APIRequestError(BaseError): -``` + Generic error for API request errors that are not known. @@ -25,13 +34,17 @@ Generic error for API request errors that are not known. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} BaseError - + + +::: {.signature} -```python -class BaseError(Exception): -``` +class BaseError() + +::: **Inherited members** @@ -39,24 +52,27 @@ class BaseError(Exception): ### [description[()]{.muted}](#description) - + ::: {.signature} - -def description( - self, args = (), kwargs = {}): - +def description(self,args = (),kwargs = {}) ::: + + ## [class]{.muted} GetTestSuiteError - + -```python -class GetTestSuiteError(BaseError): -``` +::: {.signature} + +class GetTestSuiteError() + +::: + + When the test suite could not be found. @@ -65,13 +81,19 @@ When the test suite could not be found. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} InitializeTestSuiteError - + + +::: {.signature} -```python -class InitializeTestSuiteError(BaseError): -``` +class InitializeTestSuiteError() + +::: + + When the test suite was found but could not be initialized. @@ -80,13 +102,17 @@ When the test suite was found but could not be initialized. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} InvalidAPICredentialsError - + + +::: {.signature} + +class InvalidAPICredentialsError() -```python -class InvalidAPICredentialsError(APIRequestError): -``` +::: **Inherited members** @@ -95,24 +121,27 @@ class InvalidAPICredentialsError(APIRequestError): ### [description[()]{.muted}](#description) - + ::: {.signature} - -def description( - self, args = (), kwargs = {}): - +def description(self,args = (),kwargs = {}) ::: + + ## [class]{.muted} InvalidContentIdPrefixError - + + +::: {.signature} + +class InvalidContentIdPrefixError() + +::: -```python -class InvalidContentIdPrefixError(APIRequestError): -``` + When an invalid text content_id is sent to the API. @@ -121,13 +150,19 @@ When an invalid text content_id is sent to the API. - **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} InvalidInputError - + + +::: {.signature} + +class InvalidInputError() + +::: -```python -class InvalidInputError(BaseError): -``` + When an invalid input object. @@ -136,13 +171,19 @@ When an invalid input object. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} InvalidMetricResultsError - + + +::: {.signature} -```python -class InvalidMetricResultsError(APIRequestError): -``` +class InvalidMetricResultsError() + +::: + + When an invalid metric results object is sent to the API. @@ -151,13 +192,17 @@ When an invalid metric results object is sent to the API. - **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} InvalidProjectError - + -```python -class InvalidProjectError(APIRequestError): -``` +::: {.signature} + +class InvalidProjectError() + +::: **Inherited members** @@ -166,24 +211,27 @@ class InvalidProjectError(APIRequestError): ### [description[()]{.muted}](#description) - + ::: {.signature} - -def description( - self, args = (), kwargs = {}): - +def description(self,args = (),kwargs = {}) ::: + + ## [class]{.muted} InvalidRequestBodyError - + + +::: {.signature} + +class InvalidRequestBodyError() + +::: -```python -class InvalidRequestBodyError(APIRequestError): -``` + When a POST/PUT request is made with an invalid request body. @@ -192,13 +240,19 @@ When a POST/PUT request is made with an invalid request body. - **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} InvalidTestParametersError - + + +::: {.signature} + +class InvalidTestParametersError() + +::: -```python -class InvalidTestParametersError(BaseError): -``` + When an invalid parameters for the test. @@ -207,13 +261,19 @@ When an invalid parameters for the test. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} InvalidTestResultsError - + -```python -class InvalidTestResultsError(APIRequestError): -``` +::: {.signature} + +class InvalidTestResultsError() + +::: + + When an invalid test results object is sent to the API. @@ -222,13 +282,19 @@ When an invalid test results object is sent to the API. - **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} InvalidTextObjectError - + -```python -class InvalidTextObjectError(APIRequestError): -``` +::: {.signature} + +class InvalidTextObjectError() + +::: + + When an invalid Metadat (Text) object is sent to the API. @@ -237,13 +303,19 @@ When an invalid Metadat (Text) object is sent to the API. - **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} InvalidValueFormatterError - + + +::: {.signature} + +class InvalidValueFormatterError() + +::: -```python -class InvalidValueFormatterError(BaseError): -``` + When an invalid value formatter is provided when serializing results. @@ -252,13 +324,19 @@ When an invalid value formatter is provided when serializing results. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} InvalidXGBoostTrainedModelError - + + +::: {.signature} + +class InvalidXGBoostTrainedModelError() + +::: -```python -class InvalidXGBoostTrainedModelError(BaseError): -``` + When an invalid XGBoost trained model is used when calling init_r_model. @@ -267,13 +345,19 @@ When an invalid XGBoost trained model is used when calling init_r_model. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} LoadTestError - + + +::: {.signature} -```python -class LoadTestError(BaseError): -``` +class LoadTestError() + +::: + + Exception raised when an error occurs while loading a test @@ -282,13 +366,19 @@ Exception raised when an error occurs while loading a test - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} MismatchingClassLabelsError - + -```python -class MismatchingClassLabelsError(BaseError): -``` +::: {.signature} + +class MismatchingClassLabelsError() + +::: + + When the class labels found in the dataset don't match the provided target labels. @@ -297,13 +387,17 @@ When the class labels found in the dataset don't match the provided target label - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} MissingAPICredentialsError - + -```python -class MissingAPICredentialsError(BaseError): -``` +::: {.signature} + +class MissingAPICredentialsError() + +::: **Inherited members** @@ -312,24 +406,27 @@ class MissingAPICredentialsError(BaseError): ### [description[()]{.muted}](#description) - + ::: {.signature} - -def description( - self, args = (), kwargs = {}): - +def description(self,args = (),kwargs = {}) ::: + + ## [class]{.muted} MissingCacheResultsArgumentsError - + + +::: {.signature} + +class MissingCacheResultsArgumentsError() + +::: -```python -class MissingCacheResultsArgumentsError(BaseError): -``` + When the cache_results function is missing arguments. @@ -338,13 +435,19 @@ When the cache_results function is missing arguments. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} MissingClassLabelError - + + +::: {.signature} + +class MissingClassLabelError() -```python -class MissingClassLabelError(BaseError): -``` +::: + + When the one or more class labels are missing from provided dataset targets. @@ -353,13 +456,19 @@ When the one or more class labels are missing from provided dataset targets. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} MissingDependencyError - + -```python -class MissingDependencyError(BaseError): -``` +::: {.signature} + +class MissingDependencyError() + +::: + + When a required dependency is missing. @@ -368,13 +477,19 @@ When a required dependency is missing. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} MissingDocumentationTemplate - + + +::: {.signature} + +class MissingDocumentationTemplate() + +::: -```python -class MissingDocumentationTemplate(BaseError): -``` + When the client config is missing the documentation template. @@ -383,13 +498,17 @@ When the client config is missing the documentation template. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} MissingModelIdError - + + +::: {.signature} + +class MissingModelIdError() -```python -class MissingModelIdError(BaseError): -``` +::: **Inherited members** @@ -398,24 +517,27 @@ class MissingModelIdError(BaseError): ### [description[()]{.muted}](#description) - + ::: {.signature} - -def description( - self, args = (), kwargs = {}): - +def description(self,args = (),kwargs = {}) ::: + + ## [class]{.muted} MissingOrInvalidModelPredictFnError - + -```python -class MissingOrInvalidModelPredictFnError(BaseError): -``` +::: {.signature} + +class MissingOrInvalidModelPredictFnError() + +::: + + When the pytorch model is missing a predict function or its predict method does not have the expected arguments. @@ -424,13 +546,19 @@ When the pytorch model is missing a predict function or its predict method does - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} MissingRequiredTestInputError - + + +::: {.signature} + +class MissingRequiredTestInputError() + +::: -```python -class MissingRequiredTestInputError(BaseError): -``` + When a required test context variable is missing. @@ -439,13 +567,19 @@ When a required test context variable is missing. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} MissingRExtrasError - + + +::: {.signature} -```python -class MissingRExtrasError(BaseError): -``` +class MissingRExtrasError() + +::: + + When the R extras have not been installed. @@ -456,24 +590,27 @@ When the R extras have not been installed. ### [description[()]{.muted}](#description) - + ::: {.signature} - -def description( - self, args = (), kwargs = {}): - +def description(self,args = (),kwargs = {}) ::: + + ## [class]{.muted} MissingTextContentIdError - + -```python -class MissingTextContentIdError(APIRequestError): -``` +::: {.signature} + +class MissingTextContentIdError() + +::: + + When a Text object is sent to the API without a content_id. @@ -482,13 +619,19 @@ When a Text object is sent to the API without a content_id. - **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} MissingTextContentsError - + + +::: {.signature} + +class MissingTextContentsError() -```python -class MissingTextContentsError(APIRequestError): -``` +::: + + When a Text object is sent to the API without a "text" attribute. @@ -497,13 +640,19 @@ When a Text object is sent to the API without a "text" attribute. - **From APIRequestError**: [class APIRequestError[()]{.muted}](#class-apirequesterror) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. @@ -512,13 +661,19 @@ Useful error to throw when a test cannot be executed. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} TestInputInvalidDatasetError - + + +::: {.signature} + +class TestInputInvalidDatasetError() + +::: -```python -class TestInputInvalidDatasetError(BaseError): -``` + When an invalid dataset is used in a test context. @@ -527,13 +682,19 @@ When an invalid dataset is used in a test context. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} UnsupportedColumnTypeError - + + +::: {.signature} -```python -class UnsupportedColumnTypeError(BaseError): -``` +class UnsupportedColumnTypeError() + +::: + + When an unsupported column type is found on a dataset. @@ -542,13 +703,19 @@ When an unsupported column type is found on a dataset. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} UnsupportedDatasetError - + -```python -class UnsupportedDatasetError(BaseError): -``` +::: {.signature} + +class UnsupportedDatasetError() + +::: + + When an unsupported dataset is used. @@ -557,13 +724,19 @@ When an unsupported dataset is used. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} UnsupportedFigureError - + -```python -class UnsupportedFigureError(BaseError): -``` +::: {.signature} + +class UnsupportedFigureError() + +::: + + When an unsupported figure object is constructed. @@ -572,13 +745,19 @@ When an unsupported figure object is constructed. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} UnsupportedModelError - + + +::: {.signature} + +class UnsupportedModelError() + +::: -```python -class UnsupportedModelError(BaseError): -``` + When an unsupported model is used. @@ -587,13 +766,19 @@ When an unsupported model is used. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} UnsupportedModelForSHAPError - + + +::: {.signature} -```python -class UnsupportedModelForSHAPError(BaseError): -``` +class UnsupportedModelForSHAPError() + +::: + + When an unsupported model is used for SHAP importance. @@ -602,13 +787,19 @@ When an unsupported model is used for SHAP importance. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} UnsupportedRModelError - + -```python -class UnsupportedRModelError(BaseError): -``` +::: {.signature} + +class UnsupportedRModelError() + +::: + + When an unsupported R model is used. @@ -617,30 +808,34 @@ When an unsupported R model is used. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## raise_api_error[()]{.muted} - + ::: {.signature} - -def raise_api_error(error_string): - +def raise_api_error(error_string) ::: + + Safely try to parse JSON from the response message in case the API returns a non-JSON string or if the API returns a non-standard error + + ## should_raise_on_fail_fast[()]{.muted} - + ::: {.signature} - -def should_raise_on_fail_fast(error) -> bool: - +def should_raise_on_fail_fast(error)bool: ::: + + Determine whether an error should be raised when fail_fast is True. diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index ad1ab77a7..df1b7c5e8 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -3,8 +3,11 @@ title: "[validmind](/reference/validmind.html).test_suites" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Entrypoint for test suites. - [classifier](test_suites/classifier.qmd) @@ -22,45 +25,44 @@ Entrypoint for test suites. ## format_dataframe() - + ::: {.signature} - -def format_dataframe(df: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: - +def format_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: + + Format a pandas DataFrame for display purposes ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name ## test_id_to_name() - + ::: {.signature} - -def test_id_to_name(test_id: str) -> str: - +def test_id_to_name(test_id:str)str: ::: + + Convert a test ID to a human-readable name. **Parameters** @@ -71,19 +73,20 @@ Convert a test ID to a human-readable name. - A human-readable name derived from the test ID. + + ## describe_suite[()]{.muted} - + ::: {.signature} - -def describe_suite( - test_suite_id: str, verbose = False): - +def describe_suite(test_suite_id:str,verbose = False) ::: + + Describes a Test Suite by ID **Parameters** @@ -95,404 +98,589 @@ Describes a Test Suite by ID - A formatted table with the Test Suite description + + ## get_by_id[()]{.muted} - + ::: {.signature} - -def get_by_id(test_suite_id: str): - +def get_by_id(test_suite_id:str) ::: + + Returns the test suite by ID + + ## list_suites[()]{.muted} - + ::: {.signature} - -def list_suites(pretty: bool = True): - +def list_suites(pretty:bool=True) ::: + + Returns a list of all available test suites + + ## register_test_suite[()]{.muted} - + ::: {.signature} - -def register_test_suite( - suite_id: str, suite: TestSuite): - +def register_test_suite(suite_id:str,suite:TestSuite) ::: + + Registers a custom test suite + + ## [class]{.muted} ClassifierDiagnosis - + + +::: {.signature} + +class ClassifierDiagnosis() + +::: -```python -class ClassifierDiagnosis(TestSuite): -``` + Test suite for sklearn classifier model diagnosis tests **Inherited members** + + ## [class]{.muted} ClassifierFullSuite - + + +::: {.signature} + +class ClassifierFullSuite() + +::: -```python -class ClassifierFullSuite(TestSuite): -``` + Full test suite for binary classification models. **Inherited members** + + ## [class]{.muted} ClassifierMetrics - + + +::: {.signature} + +class ClassifierMetrics() + +::: -```python -class ClassifierMetrics(TestSuite): -``` + Test suite for sklearn classifier metrics **Inherited members** + + ## [class]{.muted} ClassifierModelValidation - + + +::: {.signature} + +class ClassifierModelValidation() + +::: -```python -class ClassifierModelValidation(TestSuite): -``` + Test suite for binary classification models. **Inherited members** + + ## [class]{.muted} ClassifierPerformance - + + +::: {.signature} + +class ClassifierPerformance() + +::: -```python -class ClassifierPerformance(TestSuite): -``` + Test suite for sklearn classifier models **Inherited members** + + ## [class]{.muted} ClusterFullSuite - + + +::: {.signature} + +class ClusterFullSuite() + +::: -```python -class ClusterFullSuite(TestSuite): -``` + Full test suite for clustering models. **Inherited members** + + ## [class]{.muted} ClusterMetrics - + + +::: {.signature} + +class ClusterMetrics() + +::: -```python -class ClusterMetrics(TestSuite): -``` + Test suite for sklearn clustering metrics **Inherited members** + + ## [class]{.muted} ClusterPerformance - + + +::: {.signature} + +class ClusterPerformance() + +::: -```python -class ClusterPerformance(TestSuite): -``` + Test suite for sklearn cluster performance **Inherited members** + + ## [class]{.muted} EmbeddingsFullSuite - + + +::: {.signature} + +class EmbeddingsFullSuite() + +::: -```python -class EmbeddingsFullSuite(TestSuite): -``` + Full test suite for embeddings models. **Inherited members** + + ## [class]{.muted} EmbeddingsMetrics - + + +::: {.signature} + +class EmbeddingsMetrics() + +::: -```python -class EmbeddingsMetrics(TestSuite): -``` + Test suite for embeddings metrics **Inherited members** + + ## [class]{.muted} EmbeddingsPerformance - + + +::: {.signature} + +class EmbeddingsPerformance() + +::: -```python -class EmbeddingsPerformance(TestSuite): -``` + Test suite for embeddings model performance **Inherited members** + + ## [class]{.muted} KmeansParametersOptimization - + + +::: {.signature} + +class KmeansParametersOptimization() + +::: -```python -class KmeansParametersOptimization(TestSuite): -``` + Test suite for sklearn hyperparameters optimization **Inherited members** + + ## [class]{.muted} LLMClassifierFullSuite - + + +::: {.signature} + +class LLMClassifierFullSuite() + +::: -```python -class LLMClassifierFullSuite(TestSuite): -``` + Full test suite for LLM classification models. **Inherited members** + + ## [class]{.muted} NLPClassifierFullSuite - + + +::: {.signature} + +class NLPClassifierFullSuite() + +::: -```python -class NLPClassifierFullSuite(TestSuite): -``` + Full test suite for NLP classification models. **Inherited members** + + ## [class]{.muted} PromptValidation - + + +::: {.signature} + +class PromptValidation() + +::: -```python -class PromptValidation(TestSuite): -``` + Test suite for prompt validation **Inherited members** + + ## [class]{.muted} RegressionFullSuite - + + +::: {.signature} + +class RegressionFullSuite() + +::: -```python -class RegressionFullSuite(TestSuite): -``` + Full test suite for regression models. **Inherited members** + + ## [class]{.muted} RegressionMetrics - + + +::: {.signature} + +class RegressionMetrics() + +::: -```python -class RegressionMetrics(TestSuite): -``` + Test suite for performance metrics of regression metrics **Inherited members** + + ## [class]{.muted} RegressionModelDescription - + + +::: {.signature} + +class RegressionModelDescription() + +::: -```python -class RegressionModelDescription(TestSuite): -``` + Test suite for performance metric of regression model of statsmodels library **Inherited members** + + ## [class]{.muted} RegressionModelsEvaluation - + + +::: {.signature} + +class RegressionModelsEvaluation() + +::: -```python -class RegressionModelsEvaluation(TestSuite): -``` + Test suite for metrics comparison of regression model of statsmodels library **Inherited members** + + ## [class]{.muted} RegressionPerformance - + + +::: {.signature} + +class RegressionPerformance() + +::: -```python -class RegressionPerformance(TestSuite): -``` + Test suite for regression model performance **Inherited members** + + ## [class]{.muted} SummarizationMetrics - + + +::: {.signature} + +class SummarizationMetrics() + +::: -```python -class SummarizationMetrics(TestSuite): -``` + Test suite for Summarization metrics **Inherited members** + + ## [class]{.muted} TabularDataQuality - + + +::: {.signature} + +class TabularDataQuality() + +::: -```python -class TabularDataQuality(TestSuite): -``` + Test suite for data quality on tabular datasets **Inherited members** + + ## [class]{.muted} TabularDataset - + + +::: {.signature} + +class TabularDataset() + +::: -```python -class TabularDataset(TestSuite): -``` + Test suite for tabular datasets. **Inherited members** + + ## [class]{.muted} TabularDatasetDescription - + + +::: {.signature} + +class TabularDatasetDescription() + +::: -```python -class TabularDatasetDescription(TestSuite): -``` + Test suite to extract metadata and descriptive statistics from a tabular dataset **Inherited members** + + ## [class]{.muted} TextDataQuality - + + +::: {.signature} + +class TextDataQuality() + +::: -```python -class TextDataQuality(TestSuite): -``` + Test suite for data quality on text data **Inherited members** + + ## [class]{.muted} TimeSeriesDataQuality - + + +::: {.signature} + +class TimeSeriesDataQuality() + +::: -```python -class TimeSeriesDataQuality(TestSuite): -``` + Test suite for data quality on time series datasets **Inherited members** + + ## [class]{.muted} TimeSeriesDataset - + + +::: {.signature} + +class TimeSeriesDataset() + +::: -```python -class TimeSeriesDataset(TestSuite): -``` + Test suite for time series datasets. **Inherited members** + + ## [class]{.muted} TimeSeriesModelValidation - + + +::: {.signature} + +class TimeSeriesModelValidation() + +::: -```python -class TimeSeriesModelValidation(TestSuite): -``` + Test suite for time series model validation. **Inherited members** + + ## [class]{.muted} TimeSeriesMultivariate - + + +::: {.signature} + +class TimeSeriesMultivariate() + +::: -```python -class TimeSeriesMultivariate(TestSuite): -``` + This test suite provides a preliminary understanding of the features and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. **Inherited members** + + ## [class]{.muted} TimeSeriesUnivariate - + + +::: {.signature} + +class TimeSeriesUnivariate() + +::: -```python -class TimeSeriesUnivariate(TestSuite): -``` + This test suite provides a preliminary understanding of the target variable(s) used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index d2c1340e2..0b7f44066 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -3,89 +3,134 @@ title: "[validmind](/reference/validmind.html).classifier" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Test suites for sklearn-compatible classifier models Ideal setup is to have the API client to read a custom test suite from the project's configuration + + ## [class]{.muted} ClassifierDiagnosis - + + +::: {.signature} + +class ClassifierDiagnosis() -```python -class ClassifierDiagnosis(TestSuite): -``` +::: + + Test suite for sklearn classifier model diagnosis tests **Inherited members** + + ## [class]{.muted} ClassifierFullSuite - + + +::: {.signature} + +class ClassifierFullSuite() -```python -class ClassifierFullSuite(TestSuite): -``` +::: + + Full test suite for binary classification models. **Inherited members** + + ## [class]{.muted} ClassifierMetrics - + + +::: {.signature} + +class ClassifierMetrics() -```python -class ClassifierMetrics(TestSuite): -``` +::: + + Test suite for sklearn classifier metrics **Inherited members** + + ## [class]{.muted} ClassifierModelValidation - + + +::: {.signature} -```python -class ClassifierModelValidation(TestSuite): -``` +class ClassifierModelValidation() + +::: + + Test suite for binary classification models. **Inherited members** + + ## [class]{.muted} ClassifierPerformance - + + +::: {.signature} -```python -class ClassifierPerformance(TestSuite): -``` +class ClassifierPerformance() + +::: + + Test suite for sklearn classifier models **Inherited members** + + ## [class]{.muted} TabularDataQuality - + -```python -class TabularDataQuality(TestSuite): -``` +::: {.signature} + +class TabularDataQuality() + +::: + + Test suite for data quality on tabular datasets **Inherited members** + + ## [class]{.muted} TabularDatasetDescription - + + +::: {.signature} + +class TabularDatasetDescription() + +::: -```python -class TabularDatasetDescription(TestSuite): -``` + Test suite to extract metadata and descriptive statistics from a tabular dataset diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index 146c3eaed..3bc32b5a6 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -3,53 +3,80 @@ title: "[validmind](/reference/validmind.html).cluster" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Test suites for sklearn-compatible clustering models Ideal setup is to have the API client to read a custom test suite from the project's configuration + + ## [class]{.muted} ClusterFullSuite - + + +::: {.signature} + +class ClusterFullSuite() + +::: -```python -class ClusterFullSuite(TestSuite): -``` + Full test suite for clustering models. **Inherited members** + + ## [class]{.muted} ClusterMetrics - + + +::: {.signature} + +class ClusterMetrics() + +::: -```python -class ClusterMetrics(TestSuite): -``` + Test suite for sklearn clustering metrics **Inherited members** + + ## [class]{.muted} ClusterPerformance - + + +::: {.signature} + +class ClusterPerformance() + +::: -```python -class ClusterPerformance(TestSuite): -``` + Test suite for sklearn cluster performance **Inherited members** + + ## [class]{.muted} KmeansParametersOptimization - + + +::: {.signature} + +class KmeansParametersOptimization() + +::: -```python -class KmeansParametersOptimization(TestSuite): -``` + Test suite for sklearn hyperparameters optimization diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index 182018f42..57fa800eb 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -3,41 +3,62 @@ title: "[validmind](/reference/validmind.html).embeddings" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Test suites for embeddings models Ideal setup is to have the API client to read a custom test suite from the project's configuration + + ## [class]{.muted} EmbeddingsFullSuite - + + +::: {.signature} + +class EmbeddingsFullSuite() -```python -class EmbeddingsFullSuite(TestSuite): -``` +::: + + Full test suite for embeddings models. **Inherited members** + + ## [class]{.muted} EmbeddingsMetrics - + + +::: {.signature} -```python -class EmbeddingsMetrics(TestSuite): -``` +class EmbeddingsMetrics() + +::: + + Test suite for embeddings metrics **Inherited members** + + ## [class]{.muted} EmbeddingsPerformance - + + +::: {.signature} + +class EmbeddingsPerformance() + +::: -```python -class EmbeddingsPerformance(TestSuite): -``` + Test suite for embeddings model performance diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index 752e338ba..a94157864 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -3,77 +3,116 @@ title: "[validmind](/reference/validmind.html).llm" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Test suites for LLMs + + ## [class]{.muted} LLMClassifierFullSuite - + + +::: {.signature} + +class LLMClassifierFullSuite() -```python -class LLMClassifierFullSuite(TestSuite): -``` +::: + + Full test suite for LLM classification models. **Inherited members** + + ## [class]{.muted} PromptValidation - + + +::: {.signature} -```python -class PromptValidation(TestSuite): -``` +class PromptValidation() + +::: + + Test suite for prompt validation **Inherited members** + + ## [class]{.muted} ClassifierDiagnosis - + + +::: {.signature} + +class ClassifierDiagnosis() + +::: -```python -class ClassifierDiagnosis(TestSuite): -``` + Test suite for sklearn classifier model diagnosis tests **Inherited members** + + ## [class]{.muted} ClassifierMetrics - + + +::: {.signature} + +class ClassifierMetrics() -```python -class ClassifierMetrics(TestSuite): -``` +::: + + Test suite for sklearn classifier metrics **Inherited members** + + ## [class]{.muted} ClassifierPerformance - + + +::: {.signature} -```python -class ClassifierPerformance(TestSuite): -``` +class ClassifierPerformance() + +::: + + Test suite for sklearn classifier models **Inherited members** + + ## [class]{.muted} TextDataQuality - + + +::: {.signature} + +class TextDataQuality() + +::: -```python -class TextDataQuality(TestSuite): -``` + Test suite for data quality on text data diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index d5f1a0b20..99c6f526c 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -3,65 +3,98 @@ title: "[validmind](/reference/validmind.html).nlp" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Test suites for NLP models + + ## [class]{.muted} NLPClassifierFullSuite - + + +::: {.signature} -```python -class NLPClassifierFullSuite(TestSuite): -``` +class NLPClassifierFullSuite() + +::: + + Full test suite for NLP classification models. **Inherited members** + + ## [class]{.muted} ClassifierDiagnosis - + -```python -class ClassifierDiagnosis(TestSuite): -``` +::: {.signature} + +class ClassifierDiagnosis() + +::: + + Test suite for sklearn classifier model diagnosis tests **Inherited members** + + ## [class]{.muted} ClassifierMetrics - + + +::: {.signature} -```python -class ClassifierMetrics(TestSuite): -``` +class ClassifierMetrics() + +::: + + Test suite for sklearn classifier metrics **Inherited members** + + ## [class]{.muted} ClassifierPerformance - + + +::: {.signature} + +class ClassifierPerformance() -```python -class ClassifierPerformance(TestSuite): -``` +::: + + Test suite for sklearn classifier models **Inherited members** + + ## [class]{.muted} TextDataQuality - + + +::: {.signature} + +class TextDataQuality() + +::: -```python -class TextDataQuality(TestSuite): -``` + Test suite for data quality on text data diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index 4833dd6bf..d9a2fc430 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -3,17 +3,26 @@ title: "[validmind](/reference/validmind.html).parameters_optimization" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Test suites for sklearn-compatible hyper parameters tunning Ideal setup is to have the API client to read a custom test suite from the project's configuration + + ## [class]{.muted} KmeansParametersOptimization - + + +::: {.signature} + +class KmeansParametersOptimization() + +::: -```python -class KmeansParametersOptimization(TestSuite): -``` + Test suite for sklearn hyperparameters optimization diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index 32401cd0a..c4d5dcaee 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -3,63 +3,94 @@ title: "[validmind](/reference/validmind.html).regression" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## [class]{.muted} RegressionFullSuite - + + +::: {.signature} + +class RegressionFullSuite() -```python -class RegressionFullSuite(TestSuite): -``` +::: + + Full test suite for regression models. **Inherited members** + + ## [class]{.muted} RegressionMetrics - + -```python -class RegressionMetrics(TestSuite): -``` +::: {.signature} + +class RegressionMetrics() + +::: + + Test suite for performance metrics of regression metrics **Inherited members** + + ## [class]{.muted} RegressionPerformance - + + +::: {.signature} -```python -class RegressionPerformance(TestSuite): -``` +class RegressionPerformance() + +::: + + Test suite for regression model performance **Inherited members** + + ## [class]{.muted} TabularDataQuality - + + +::: {.signature} + +class TabularDataQuality() -```python -class TabularDataQuality(TestSuite): -``` +::: + + Test suite for data quality on tabular datasets **Inherited members** + + ## [class]{.muted} TabularDatasetDescription - + + +::: {.signature} + +class TabularDatasetDescription() + +::: -```python -class TabularDatasetDescription(TestSuite): -``` + Test suite to extract metadata and descriptive statistics from a tabular dataset diff --git a/docs/validmind/test_suites/statsmodels_timeseries.qmd b/docs/validmind/test_suites/statsmodels_timeseries.qmd index f0d1a21b9..ab0e8ccd4 100644 --- a/docs/validmind/test_suites/statsmodels_timeseries.qmd +++ b/docs/validmind/test_suites/statsmodels_timeseries.qmd @@ -3,29 +3,44 @@ title: "[validmind](/reference/validmind.html).statsmodels_timeseries" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Time Series Test Suites from statsmodels + + ## [class]{.muted} RegressionModelDescription - + + +::: {.signature} + +class RegressionModelDescription() + +::: -```python -class RegressionModelDescription(TestSuite): -``` + Test suite for performance metric of regression model of statsmodels library **Inherited members** + + ## [class]{.muted} RegressionModelsEvaluation - + + +::: {.signature} + +class RegressionModelsEvaluation() + +::: -```python -class RegressionModelsEvaluation(TestSuite): -``` + Test suite for metrics comparison of regression model of statsmodels library diff --git a/docs/validmind/test_suites/summarization.qmd b/docs/validmind/test_suites/summarization.qmd index abf50b7d4..1eba8187d 100644 --- a/docs/validmind/test_suites/summarization.qmd +++ b/docs/validmind/test_suites/summarization.qmd @@ -3,17 +3,26 @@ title: "[validmind](/reference/validmind.html).summarization" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Test suites for llm summarization models + + ## [class]{.muted} SummarizationMetrics - + + +::: {.signature} + +class SummarizationMetrics() + +::: -```python -class SummarizationMetrics(TestSuite): -``` + Test suite for Summarization metrics diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd index 158f9f5ff..a2fef591a 100644 --- a/docs/validmind/test_suites/tabular_datasets.qmd +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -3,41 +3,62 @@ title: "[validmind](/reference/validmind.html).tabular_datasets" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Test suites for tabular datasets + + ## [class]{.muted} TabularDataQuality - + + +::: {.signature} + +class TabularDataQuality() -```python -class TabularDataQuality(TestSuite): -``` +::: + + Test suite for data quality on tabular datasets **Inherited members** + + ## [class]{.muted} TabularDataset - + + +::: {.signature} -```python -class TabularDataset(TestSuite): -``` +class TabularDataset() + +::: + + Test suite for tabular datasets. **Inherited members** + + ## [class]{.muted} TabularDatasetDescription - + + +::: {.signature} + +class TabularDatasetDescription() + +::: -```python -class TabularDatasetDescription(TestSuite): -``` + Test suite to extract metadata and descriptive statistics from a tabular dataset diff --git a/docs/validmind/test_suites/text_data.qmd b/docs/validmind/test_suites/text_data.qmd index c5e4ece66..3b73356e4 100644 --- a/docs/validmind/test_suites/text_data.qmd +++ b/docs/validmind/test_suites/text_data.qmd @@ -3,17 +3,26 @@ title: "[validmind](/reference/validmind.html).text_data" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Test suites for text datasets + + ## [class]{.muted} TextDataQuality - + + +::: {.signature} + +class TextDataQuality() + +::: -```python -class TextDataQuality(TestSuite): -``` + Test suite for data quality on text data diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index cda6fe4f1..683cc5a4b 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -3,65 +3,98 @@ title: "[validmind](/reference/validmind.html).time_series" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Time Series Test Suites + + ## [class]{.muted} TimeSeriesDataQuality - + + +::: {.signature} + +class TimeSeriesDataQuality() -```python -class TimeSeriesDataQuality(TestSuite): -``` +::: + + Test suite for data quality on time series datasets **Inherited members** + + ## [class]{.muted} TimeSeriesDataset - + + +::: {.signature} + +class TimeSeriesDataset() -```python -class TimeSeriesDataset(TestSuite): -``` +::: + + Test suite for time series datasets. **Inherited members** + + ## [class]{.muted} TimeSeriesModelValidation - + + +::: {.signature} + +class TimeSeriesModelValidation() -```python -class TimeSeriesModelValidation(TestSuite): -``` +::: + + Test suite for time series model validation. **Inherited members** + + ## [class]{.muted} TimeSeriesMultivariate - + + +::: {.signature} -```python -class TimeSeriesMultivariate(TestSuite): -``` +class TimeSeriesMultivariate() + +::: + + This test suite provides a preliminary understanding of the features and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. **Inherited members** + + ## [class]{.muted} TimeSeriesUnivariate - + + +::: {.signature} -```python -class TimeSeriesUnivariate(TestSuite): -``` +class TimeSeriesUnivariate() + +::: + + This test suite provides a preliminary understanding of the target variable(s) used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). @@ -69,25 +102,37 @@ The raw time series data provides a visual inspection of the target variable's b **Inherited members** + + ## [class]{.muted} RegressionModelDescription - + -```python -class RegressionModelDescription(TestSuite): -``` +::: {.signature} + +class RegressionModelDescription() + +::: + + Test suite for performance metric of regression model of statsmodels library **Inherited members** + + ## [class]{.muted} RegressionModelsEvaluation - + + +::: {.signature} + +class RegressionModelsEvaluation() + +::: -```python -class RegressionModelsEvaluation(TestSuite): -``` + Test suite for metrics comparison of regression model of statsmodels library diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 8c4deb398..791c6d20c 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -3,8 +3,11 @@ title: "[validmind](/reference/validmind.html).tests" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ValidMind Tests Module - [data_validation](tests/data_validation.qmd) @@ -13,17 +16,16 @@ ValidMind Tests Module ## describe_test() - + ::: {.signature} - -def describe_test( - test_id: TestID = None, raw: bool = False, show: bool = True): - +def describe_test(test_id:TestID = None,raw:bool = False,show:bool = True) ::: + + Get or show details about the test This function can be used to see test details including the test name, description, required inputs and default params. It can also be used to get a dictionary of the above information for programmatic use. **Parameters** @@ -33,44 +35,44 @@ Get or show details about the test This function can be used to see test details ## list_tags() - + ::: {.signature} - -def list_tags(): - +def list_tags() ::: + + List unique tags from all test classes. ## list_tasks() - + ::: {.signature} - -def list_tasks(): - +def list_tasks() ::: + + List unique tasks from all test classes. ## list_tasks_and_tags() - + ::: {.signature} - -def list_tasks_and_tags(as_json = False): - +def list_tasks_and_tags(as_json=False) ::: + + List all task types and their associated tags, with one row per task type and all tags for a task type in one row. **Returns** @@ -79,17 +81,16 @@ List all task types and their associated tags, with one row per task type and al ## list_tests() - + ::: {.signature} - -def list_tests( - filter = None, task = None, tags = None, pretty = True, truncate = True): - +def list_tests(filter = None,task = None,tags = None,pretty = True,truncate = True) ::: + + List all tests in the tests directory. **Parameters** @@ -106,17 +107,16 @@ List all tests in the tests directory. ## load_test() - + ::: {.signature} - -def load_test( - test_id: str, test_func: callable = None, reload: bool = False): - +def load_test(test_id:str,test_func:callable = None,reload:bool = False) ::: + + Load a test by test ID Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. The tag is optional and is used to distinguish between multiple results from the same test. **Parameters** @@ -126,17 +126,16 @@ Load a test by test ID Test IDs are in the format `namespace.path_to_module.Test ## run_test() - + ::: {.signature} - -def run_test( - test_id: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'TestID'}, 'None'], 'implicit': True}} = None, name: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None, unit_metrics: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'TestID'}}, 'None'], 'implicit': True}} = None, inputs: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, 'None'], 'implicit': True}} = None, input_grid: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'Any'}}], 'implicit': True}}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}, 'None'], 'implicit': True}} = None, params: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, 'None'], 'implicit': True}} = None, param_grid: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'Any'}}], 'implicit': True}}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}, 'None'], 'implicit': True}} = None, show: bool = True, generate_description: bool = True, title: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None, post_process_fn: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Callable'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, 'None'], 'implicit': True}}, 'None'], 'implicit': True}} = None, kwargs = {}) -> TestResult: - +def run_test(test_id:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'TestID'}, 'None'], 'implicit': True}} = None,name:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None,unit_metrics:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'TestID'}}, 'None'], 'implicit': True}} = None,inputs:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, 'None'\], 'implicit': True}} = None,input_grid:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'Any'}}], 'implicit': True}}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}, 'None'\], 'implicit': True}} = None,params:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, 'None'\], 'implicit': True}} = None,param_grid:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'Any'}}], 'implicit': True}}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}, 'None'\], 'implicit': True}} = None,show:bool = True,generate_description:bool = True,title:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None,post_process_fn:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Callable'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, 'None'\], 'implicit': True}}, 'None'\], 'implicit': True}} = None,kwargs = {})TestResult: ::: + + Run a ValidMind or custom test This function is the main entry point for running tests. It can run simple unit metrics, ValidMind and custom tests, composite tests made up of multiple unit metrics and comparison tests made up of multiple tests. **Parameters** @@ -168,16 +167,16 @@ Run a ValidMind or custom test This function is the main entry point for running ## tags() - + ::: {.signature} - -def tags(tags = ()): - +def tags(tags=()) ::: + + Decorator for specifying tags for a test. **Parameters** @@ -186,16 +185,16 @@ Decorator for specifying tags for a test. ## tasks() - + ::: {.signature} - -def tasks(tasks = ()): - +def tasks(tasks=()) ::: + + Decorator for specifying the task types that a test is designed for. **Parameters** @@ -204,16 +203,16 @@ Decorator for specifying the task types that a test is designed for. ## test() - + ::: {.signature} - -def test(func_or_id): - +def test(func_or_id) ::: + + Decorator for creating and registering custom tests This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. The function can take two different types of arguments: @@ -239,19 +238,20 @@ The function may also include a docstring. This docstring will be used and logge - The decorated function. + + ## register_test_provider[()]{.muted} - + ::: {.signature} - -def register_test_provider( - namespace: str, test_provider: TestProvider) -> None: - +def register_test_provider(namespace:str,test_provider:TestProvider)None: ::: + + Register an external test provider **Parameters** @@ -259,13 +259,19 @@ Register an external test provider - **namespace** str: The namespace of the test provider - **test_provider** TestProvider: The test provider + + ## [class]{.muted} LoadTestError - + -```python -class LoadTestError(BaseError): -``` +::: {.signature} + +class LoadTestError() + +::: + + Exception raised when an error occurs while loading a test @@ -274,13 +280,19 @@ Exception raised when an error occurs while loading a test - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} LocalTestProvider - + -```python -class LocalTestProvider(): -``` +::: {.signature} + +class LocalTestProvider() + +::: + + Test providers in ValidMind are responsible for loading tests from different sources, such as local files, databases, or remote services. The LocalTestProvider specifically loads tests from the local file system. @@ -311,16 +323,16 @@ test = test_provider.load_test("my_namespace.my_test_class") ### [list_tests[()]{.muted}](#list_tests) - + ::: {.signature} - -def list_tests(self): - +def list_tests(self) ::: + + List all tests in the given namespace **Returns** @@ -329,30 +341,35 @@ List all tests in the given namespace ### [load_test[()]{.muted}](#load_test) - + ::: {.signature} - -def load_test( - self, test_id: str): - +def load_test(self,test_id:str) ::: + + Load the test identified by the given test_id. Args: test_id (str): The identifier of the test. This corresponds to the relative path of the python file from the root folder, with slashes replaced by dots Returns: The test class that matches the last part of the test_id. Raises: LocalTestProviderLoadModuleError: If the test module cannot be imported LocalTestProviderLoadTestError: If the test class cannot be found in the module + + ## [class]{.muted} TestProvider - + -```python -class TestProvider(Protocol): -``` +::: {.signature} + +class TestProvider() + +::: + + Protocol for user-defined test providers @@ -360,16 +377,16 @@ Protocol for user-defined test providers ### [list_tests[()]{.muted}](#list_tests) - + ::: {.signature} - -def list_tests(self) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}: - +def list_tests(self){'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}: ::: + + List all tests in the given namespace **Returns** @@ -378,17 +395,16 @@ List all tests in the given namespace ### [load_test[()]{.muted}](#load_test) - + ::: {.signature} - -def load_test( - self, test_id: str) -> callable: - +def load_test(self,test_id:str)callable: ::: + + Load the test function identified by the given test_id **Parameters** diff --git a/docs/validmind/tests/data_validation.qmd b/docs/validmind/tests/data_validation.qmd index 6851ede08..8f1c044fb 100644 --- a/docs/validmind/tests/data_validation.qmd +++ b/docs/validmind/tests/data_validation.qmd @@ -3,6 +3,7 @@ title: "[validmind](/reference/validmind.html).data_validation" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- - [ACFandPACFPlot](data_validation/ACFandPACFPlot.qmd) diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 6996a14eb..65f8cddf1 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).ACFandPACFPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ACFandPACFPlot[()]{.muted} - + ::: {.signature} - -def ACFandPACFPlot(dataset: VMDataset): - +def ACFandPACFPlot(dataset:VMDataset) ::: + + Analyzes time series data using Autocorrelation Function (ACF) and Partial Autocorrelation Function (PACF) plots to reveal trends and correlations. ### Purpose diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 24db20980..8c1da7105 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -3,35 +3,37 @@ title: "[validmind](/reference/validmind.html).ADF" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## ADF[()]{.muted} - + ::: {.signature} - -def ADF(dataset: VMDataset): - +def ADF(dataset:VMDataset) ::: + + Assesses the stationarity of a time series dataset using the Augmented Dickey-Fuller (ADF) test. ### Purpose diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index f7bb6f0ac..66190d07f 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).AutoAR" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## AutoAR[()]{.muted} - + ::: {.signature} - -def AutoAR( - dataset: VMDataset, max_ar_order: int = 3): - +def AutoAR(dataset:VMDataset,max_ar_order:int = 3) ::: + + Automatically identifies the optimal Autoregressive (AR) order for a time series using BIC and AIC criteria. ### Purpose diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index a65c91a48..e109028a8 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).AutoMA" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## AutoMA[()]{.muted} - + ::: {.signature} - -def AutoMA( - dataset: VMDataset, max_ma_order: int = 3): - +def AutoMA(dataset:VMDataset,max_ma_order:int = 3) ::: + + Automatically selects the optimal Moving Average (MA) order for each variable in a time series dataset based on minimal BIC and AIC values. ### Purpose diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 077a39366..463f28e1e 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).AutoStationarity" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## AutoStationarity[()]{.muted} - + ::: {.signature} - -def AutoStationarity( - dataset: VMDataset, max_order: int = 5, threshold: float = 0.05): - +def AutoStationarity(dataset:VMDataset,max_order:int = 5,threshold:float = 0.05) ::: + + Automates Augmented Dickey-Fuller test to assess stationarity across multiple time series in a DataFrame. ### Purpose diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 410e98dda..64b0768da 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).BivariateScatterPlots" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## BivariateScatterPlots[()]{.muted} - + ::: {.signature} - -def BivariateScatterPlots(dataset): - +def BivariateScatterPlots(dataset) ::: + + Generates bivariate scatterplots to visually inspect relationships between pairs of numerical predictor variables in machine learning classification tasks. ### Purpose diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index e8ed574fc..8ac583cb2 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).BoxPierce" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## BoxPierce[()]{.muted} - + ::: {.signature} - -def BoxPierce(dataset): - +def BoxPierce(dataset) ::: + + Detects autocorrelation in time-series data through the Box-Pierce test to validate model performance. ### Purpose diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 905dd9387..bca8fc64e 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).ChiSquaredFeaturesTable" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ChiSquaredFeaturesTable[()]{.muted} - + ::: {.signature} - -def ChiSquaredFeaturesTable( - dataset, p_threshold = 0.05): - +def ChiSquaredFeaturesTable(dataset,p_threshold = 0.05) ::: + + Assesses the statistical association between categorical features and a target variable using the Chi-Squared test. ### Purpose @@ -46,13 +48,19 @@ The function creates a contingency table for each categorical feature and the ta - As with all hypothesis tests, the Chi-Squared test can only detect associations, not causal relationships. - The choice of p-value threshold can affect the interpretation of feature relevance, and different thresholds may lead to different conclusions. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 83fc43fa6..b4f9b0f47 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -3,23 +3,27 @@ title: "[validmind](/reference/validmind.html).ClassImbalance" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Threshold based tests + + ## ClassImbalance[()]{.muted} - + ::: {.signature} - -def ClassImbalance( - dataset: VMDataset, min_percent_threshold: int = 10) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Tuple'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, {'cls': 'ExprName', 'name': 'bool'}], 'implicit': True}}: - +def ClassImbalance(dataset:VMDataset,min_percent_threshold:int = 10){'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Tuple'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, {'cls': 'ExprName', 'name': 'bool'}\], 'implicit': True}}: ::: + + Evaluates and quantifies class distribution imbalance in a dataset used by a machine learning model. ### Purpose @@ -52,13 +56,19 @@ This Class Imbalance test operates by calculating the frequency (expressed as a - While it can identify imbalances in class distribution, it doesn't provide direct methods to address or correct these imbalances. - The test is only applicable for classification operations and unsuitable for regression or clustering tasks. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 0bb1ce532..dfbb49803 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -3,35 +3,37 @@ title: "[validmind](/reference/validmind.html).DatasetDescription" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## DatasetDescription[()]{.muted} - + ::: {.signature} - -def DatasetDescription(dataset: VMDataset): - +def DatasetDescription(dataset:VMDataset) ::: + + Provides comprehensive analysis and statistical summaries of each column in a machine learning model's dataset. ### Purpose @@ -64,72 +66,81 @@ The DatasetDescription class accomplishes the purpose as follows: firstly, the t - Columns with all null or missing values are not included in histogram computation. - This test only validates the quality of the dataset but doesn't address the model's performance directly. + + ## describe_column[()]{.muted} - + ::: {.signature} - -def describe_column( - df, column): - +def describe_column(df,column) ::: + + Gets descriptive statistics for a single column in a Pandas DataFrame. + + ## get_column_histograms[()]{.muted} - + ::: {.signature} - -def get_column_histograms( - df, column, type_): - +def get_column_histograms(df,column,type\_) ::: + + Returns a collection of histograms for a numerical or categorical column. We store different combinations of bin sizes to allow analyzing the data better Will be used in favor of \_get_histogram in the future + + ## get_numerical_histograms[()]{.muted} - + ::: {.signature} - -def get_numerical_histograms( - df, column): - +def get_numerical_histograms(df,column) ::: + + Returns a collection of histograms for a numerical column, each one with a different bin size + + ## infer_datatypes[()]{.muted} - + ::: {.signature} - -def infer_datatypes(df): - +def infer_datatypes(df) ::: + + ## [class]{.muted} UnsupportedColumnTypeError - + + +::: {.signature} + +class UnsupportedColumnTypeError() + +::: -```python -class UnsupportedColumnTypeError(BaseError): -``` + When an unsupported column type is found on a dataset. diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 09d090647..6150db469 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).DatasetSplit" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## DatasetSplit[()]{.muted} - + ::: {.signature} - -def DatasetSplit(datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}): - +def DatasetSplit(datasets:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}) ::: + + Evaluates and visualizes the distribution proportions among training, testing, and validation datasets of an ML model. ### Purpose diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index f194b15fa..78ace2fc2 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -3,20 +3,21 @@ title: "[validmind](/reference/validmind.html).DescriptiveStatistics" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## format_records() - + ::: {.signature} - -def format_records(df: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}: - +def format_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}: ::: + + Round the values on each dataframe's column to a given number of decimal places. The returned value is converted to a dict in "records" with Pandas's to_dict() function. We do this for display purposes before sending data to ValidMind. Rules: @@ -25,18 +26,20 @@ We do this for display purposes before sending data to ValidMind. Rules: - If the column's smallest number has more decimals 6, use that number's precision so we can avoid rendering a 0 instead - If the column's smallest number has less decimals than 6, use 6 decimal places + + ## DescriptiveStatistics[()]{.muted} - + ::: {.signature} - -def DescriptiveStatistics(dataset: VMDataset): - +def DescriptiveStatistics(dataset:VMDataset) ::: + + Performs a detailed descriptive statistical analysis of both numerical and categorical data within a model's dataset. ### Purpose @@ -65,39 +68,43 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des - Alone, descriptive statistics cannot be used to infer properties about future unseen data. - Should be used in conjunction with other statistical tests to provide a comprehensive understanding of the model's data. + + ## get_summary_statistics_categorical[()]{.muted} - + ::: {.signature} - -def get_summary_statistics_categorical( - df, categorical_fields): - +def get_summary_statistics_categorical(df,categorical_fields) ::: + + ## get_summary_statistics_numerical[()]{.muted} - + ::: {.signature} - -def get_summary_statistics_numerical( - df, numerical_fields): - +def get_summary_statistics_numerical(df,numerical_fields) ::: + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index a40d7fbd7..714646167 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -3,35 +3,37 @@ title: "[validmind](/reference/validmind.html).DickeyFullerGLS" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## DickeyFullerGLS[()]{.muted} - + ::: {.signature} - -def DickeyFullerGLS(dataset: VMDataset): - +def DickeyFullerGLS(dataset:VMDataset) ::: + + Assesses stationarity in time series data using the Dickey-Fuller GLS test to determine the order of integration. ### Purpose @@ -58,13 +60,19 @@ This code implements the Dickey-Fuller GLS unit root test on each attribute of t - If the time series tends to follow a trend while still being stationary, the test might misinterpret it, necessitating further detrending. - The test also presents challenges when dealing with shorter time series data or volatile data, not producing reliable results in these cases. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 4a14a45be..6db785a36 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).Duplicates" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## Duplicates[()]{.muted} - + ::: {.signature} - -def Duplicates( - dataset, min_threshold = 1): - +def Duplicates(dataset,min_threshold = 1) ::: + + Tests dataset for duplicate entries, ensuring model reliability via data quality verification. ### Purpose diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 54514b6b6..eff7ff9aa 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).EngleGrangerCoint" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## EngleGrangerCoint[()]{.muted} - + ::: {.signature} - -def EngleGrangerCoint( - dataset: VMDataset, threshold: float = 0.05): - +def EngleGrangerCoint(dataset:VMDataset,threshold:float = 0.05) ::: + + Assesses the degree of co-movement between pairs of time series data using the Engle-Granger cointegration test. ### Purpose @@ -44,13 +46,19 @@ The test first drops any non-applicable values from the input dataset and then i - The presence of non-stationary characteristics in the series or structural breaks can result in falsely positive or negative cointegration results. - May not perform well for small sample sizes due to lack of statistical power and should be supplemented with other predictive indicators for a more robust model evaluation. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 6a631e662..b714255e6 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).FeatureTargetCorrelationPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## FeatureTargetCorrelationPlot[()]{.muted} - + ::: {.signature} - -def FeatureTargetCorrelationPlot( - dataset, fig_height = 600): - +def FeatureTargetCorrelationPlot(dataset,fig_height = 600) ::: + + Visualizes the correlation between input features and the model's target output in a color-coded horizontal bar plot. ### Purpose diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 39b8bffa8..7f8c2da25 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).HighCardinality" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## HighCardinality[()]{.muted} - + ::: {.signature} - -def HighCardinality( - dataset: VMDataset, num_threshold: int = 100, percent_threshold: float = 0.1, threshold_type: str = 'percent'): - +def HighCardinality(dataset:VMDataset,num_threshold:int = 100,percent_threshold:float = 0.1,threshold_type:str = 'percent') ::: + + Assesses the number of unique values in categorical columns to detect high cardinality and potential overfitting. ### Purpose diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 6a4d95625..398299314 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).HighPearsonCorrelation" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## HighPearsonCorrelation[()]{.muted} - + ::: {.signature} - -def HighPearsonCorrelation( - dataset: VMDataset, max_threshold: float = 0.3, top_n_correlations: int = 10, feature_columns: list = None): - +def HighPearsonCorrelation(dataset:VMDataset,max_threshold:float = 0.3,top_n_correlations:int = 10,feature_columns:list = None) ::: + + Identifies highly correlated feature pairs in a dataset suggesting feature redundancy or multicollinearity. ### Purpose diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 41098f0a3..4b6c47b53 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -3,34 +3,35 @@ title: "[validmind](/reference/validmind.html).IQROutliersBarPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## compute_outliers[()]{.muted} - + ::: {.signature} - -def compute_outliers( - series, threshold): - +def compute_outliers(series,threshold) ::: + + ## IQROutliersBarPlot[()]{.muted} - + ::: {.signature} - -def IQROutliersBarPlot( - dataset: VMDataset, threshold: float = 1.5, fig_width: int = 800): - +def IQROutliersBarPlot(dataset:VMDataset,threshold:float = 1.5,fig_width:int = 800) ::: + + Visualizes outlier distribution across percentiles in numerical data using the Interquartile Range (IQR) method. ### Purpose diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 685c756b9..748f5bbdf 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -3,34 +3,35 @@ title: "[validmind](/reference/validmind.html).IQROutliersTable" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## compute_outliers[()]{.muted} - + ::: {.signature} - -def compute_outliers( - series, threshold = 1.5): - +def compute_outliers(series,threshold = 1.5) ::: + + ## IQROutliersTable[()]{.muted} - + ::: {.signature} - -def IQROutliersTable( - dataset: VMDataset, threshold: float = 1.5): - +def IQROutliersTable(dataset:VMDataset,threshold:float = 1.5) ::: + + Determines and summarizes outliers in numerical features using the Interquartile Range method. ### Purpose diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index aa1fb52a6..905a3514f 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).IsolationForestOutliers" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## IsolationForestOutliers[()]{.muted} - + ::: {.signature} - -def IsolationForestOutliers( - dataset: VMDataset, random_state: int = 0, contamination: float = 0.1, feature_columns: list = None): - +def IsolationForestOutliers(dataset:VMDataset,random_state:int = 0,contamination:float = 0.1,feature_columns:list = None) ::: + + Detects outliers in a dataset using the Isolation Forest algorithm and visualizes results through scatter plots. ### Purpose diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index b1fd670d1..08884025d 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).JarqueBera" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## JarqueBera[()]{.muted} - + ::: {.signature} - -def JarqueBera(dataset): - +def JarqueBera(dataset) ::: + + Assesses normality of dataset features in an ML model using the Jarque-Bera test. ### Purpose diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 328bf0996..a946b4ef9 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -3,35 +3,37 @@ title: "[validmind](/reference/validmind.html).KPSS" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## KPSS[()]{.muted} - + ::: {.signature} - -def KPSS(dataset: VMDataset): - +def KPSS(dataset:VMDataset) ::: + + Assesses the stationarity of time-series data in a machine learning model using the KPSS unit root test. ### Purpose @@ -58,13 +60,19 @@ This test calculates the KPSS score for each feature in the dataset. The KPSS sc - The test may have restricted power against certain alternatives. - The reliability of the test is contingent on the number of lags selected, which introduces potential bias in the measurement. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 6e5e7afb9..6122a6cca 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).LJungBox" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## LJungBox[()]{.muted} - + ::: {.signature} - -def LJungBox(dataset): - +def LJungBox(dataset) ::: + + Assesses autocorrelations in dataset features by performing a Ljung-Box test on each feature. ### Purpose diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index d5b1f418e..5daa49c9a 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).LaggedCorrelationHeatmap" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## LaggedCorrelationHeatmap[()]{.muted} - + ::: {.signature} - -def LaggedCorrelationHeatmap( - dataset: VMDataset, num_lags: int = 10): - +def LaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int = 10) ::: + + Assesses and visualizes correlation between target variable and lagged independent variables in a time-series dataset. ### Purpose diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 3187af97b..868a7ca93 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).MissingValues" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## MissingValues[()]{.muted} - + ::: {.signature} - -def MissingValues( - dataset: VMDataset, min_threshold: int = 1): - +def MissingValues(dataset:VMDataset,min_threshold:int = 1) ::: + + Evaluates dataset quality by ensuring missing value ratio across all features does not exceed a set threshold. ### Purpose diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index f97590c97..21a5c62a1 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).MissingValuesBarPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## MissingValuesBarPlot[()]{.muted} - + ::: {.signature} - -def MissingValuesBarPlot( - dataset: VMDataset, threshold: int = 80, fig_height: int = 600): - +def MissingValuesBarPlot(dataset:VMDataset,threshold:int = 80,fig_height:int = 600) ::: + + Assesses the percentage and distribution of missing values in the dataset via a bar plot, with emphasis on identifying high-risk columns based on a user-defined threshold. ### Purpose diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 7cd67e522..022157f6c 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).MutualInformation" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## MutualInformation[()]{.muted} - + ::: {.signature} - -def MutualInformation( - dataset: VMDataset, min_threshold: float = 0.01, task: str = 'classification'): - +def MutualInformation(dataset:VMDataset,min_threshold:float = 0.01,task:str = 'classification') ::: + + Calculates mutual information scores between features and target variable to evaluate feature relevance. ### Purpose diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index 5575aa99c..53e00b9a5 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).PearsonCorrelationMatrix" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## PearsonCorrelationMatrix[()]{.muted} - + ::: {.signature} - -def PearsonCorrelationMatrix(dataset): - +def PearsonCorrelationMatrix(dataset) ::: + + Evaluates linear dependency between numerical variables in a dataset via a Pearson Correlation coefficient heat map. ### Purpose diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 4be26affa..8bb38c271 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -3,35 +3,37 @@ title: "[validmind](/reference/validmind.html).PhillipsPerronArch" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## PhillipsPerronArch[()]{.muted} - + ::: {.signature} - -def PhillipsPerronArch(dataset: VMDataset): - +def PhillipsPerronArch(dataset:VMDataset) ::: + + Assesses the stationarity of time series data in each feature of the ML model using the Phillips-Perron test. ### Purpose @@ -64,13 +66,19 @@ The PP test is conducted for each feature in the dataset as follows: - Relies on asymptotic theory, which may reduce the test’s power for small sample sizes. - Non-stationary time series must be converted to stationary series through differencing, potentially leading to loss of important data points. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 86b150d0c..9a9652da9 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).ProtectedClassesCombination" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## ProtectedClassesCombination[()]{.muted} - + ::: {.signature} - -def ProtectedClassesCombination( - dataset, model, protected_classes = None): - +def ProtectedClassesCombination(dataset,model,protected_classes = None) ::: + + Visualizes combinations of protected classes and their corresponding error metric differences. ### Purpose @@ -65,13 +66,19 @@ The test performs the following steps: - Does not provide statistical significance of observed differences. - Visualization alone may not capture all nuances of intersectional fairness. + + ## [class]{.muted} MissingDependencyError - + + +::: {.signature} + +class MissingDependencyError() + +::: -```python -class MissingDependencyError(BaseError): -``` + When a required dependency is missing. diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index c16cb3462..c400e7fab 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).ProtectedClassesDescription" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## ProtectedClassesDescription[()]{.muted} - + ::: {.signature} - -def ProtectedClassesDescription( - dataset, protected_classes = None): - +def ProtectedClassesDescription(dataset,protected_classes = None) ::: + + Visualizes the distribution of protected classes in the dataset relative to the target variable and provides descriptive statistics. ### Purpose diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 93afbeef8..85aa5aeb0 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).ProtectedClassesDisparity" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## ProtectedClassesDisparity[()]{.muted} - + ::: {.signature} - -def ProtectedClassesDisparity( - dataset, model, protected_classes = None, disparity_tolerance = 1.25, metrics = {'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}): - +def ProtectedClassesDisparity(dataset,model,protected_classes = None,disparity_tolerance = 1.25,metrics = {'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}) ::: + + Investigates disparities in model performance across different protected class segments. ### Purpose @@ -67,13 +68,19 @@ The test performs the following steps: - Does not account for intersectionality between different protected attributes. - The interpretation of results may require domain expertise to understand the implications of observed disparities. + + ## [class]{.muted} MissingDependencyError - + + +::: {.signature} + +class MissingDependencyError() + +::: -```python -class MissingDependencyError(BaseError): -``` + When a required dependency is missing. diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index ae3a7b87b..95e7992d7 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -3,112 +3,109 @@ title: "[validmind](/reference/validmind.html).ProtectedClassesThresholdOptimize sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## calculate_fairness_metrics[()]{.muted} - + ::: {.signature} - -def calculate_fairness_metrics( - test_df, target, y_pred_opt, protected_classes): - +def calculate_fairness_metrics(test_df,target,y_pred_opt,protected_classes) ::: + + ## calculate_group_metrics[()]{.muted} - + ::: {.signature} - -def calculate_group_metrics( - test_df, target, y_pred_opt, protected_classes): - +def calculate_group_metrics(test_df,target,y_pred_opt,protected_classes) ::: + + ## get_thresholds_by_group[()]{.muted} - + ::: {.signature} - -def get_thresholds_by_group(threshold_optimizer): - +def get_thresholds_by_group(threshold_optimizer) ::: + + ## initialize_and_fit_optimizer[()]{.muted} - + ::: {.signature} - -def initialize_and_fit_optimizer( - pipeline, X_train, y_train, protected_classes_df): - +def initialize_and_fit_optimizer(pipeline,X_train,y_train,protected_classes_df) ::: + + ## make_predictions[()]{.muted} - + ::: {.signature} - -def make_predictions( - threshold_optimizer, test_df, protected_classes): - +def make_predictions(threshold_optimizer,test_df,protected_classes) ::: + + ## plot_thresholds[()]{.muted} - + ::: {.signature} - -def plot_thresholds(threshold_optimizer): - +def plot_thresholds(threshold_optimizer) ::: + + ## ProtectedClassesThresholdOptimizer[()]{.muted} - + ::: {.signature} - -def ProtectedClassesThresholdOptimizer( - dataset, pipeline = None, protected_classes = None, X_train = None, y_train = None): - +def ProtectedClassesThresholdOptimizer(dataset,pipeline = None,protected_classes = None,X_train = None,y_train = None) ::: + + Obtains a classifier by applying group-specific thresholds to the provided estimator. ### Purpose @@ -142,13 +139,19 @@ The test uses Fairlearn's ThresholdOptimizer to: - Requires access to protected attribute information at prediction time. - The effectiveness can vary depending on the chosen fairness constraint and objective. + + ## [class]{.muted} MissingDependencyError - + + +::: {.signature} + +class MissingDependencyError() + +::: -```python -class MissingDependencyError(BaseError): -``` + When a required dependency is missing. diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 626c13d6f..2793956e0 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -3,34 +3,35 @@ title: "[validmind](/reference/validmind.html).RollingStatsPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## plot_rolling_statistics[()]{.muted} - + ::: {.signature} - -def plot_rolling_statistics( - df, col, window_size): - +def plot_rolling_statistics(df,col,window_size) ::: + + ## RollingStatsPlot[()]{.muted} - + ::: {.signature} - -def RollingStatsPlot( - dataset: VMDataset, window_size: int = 12): - +def RollingStatsPlot(dataset:VMDataset,window_size:int = 12) ::: + + Evaluates the stationarity of time series data by plotting its rolling mean and standard deviation over a specified window. ### Purpose @@ -60,13 +61,19 @@ This mechanism is comprised of two steps. Initially, the rolling mean and standa - Requires the dataset to be indexed by date and time, hence it may not be usable for datasets without a timestamp index. - Primarily serves for data visualization as it does not facilitate any quantitative measures for stationarity, such as through statistical tests. Therefore, the interpretation is subjective and depends heavily on modeler discretion. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 00b24d860..81166d112 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).RunsTest" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## RunsTest[()]{.muted} - + ::: {.signature} - -def RunsTest(dataset): - +def RunsTest(dataset) ::: + + Executes Runs Test on ML model to detect non-random patterns in output data sequence. ### Purpose diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index fdfed32f9..770ced1aa 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).ScatterPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ScatterPlot[()]{.muted} - + ::: {.signature} - -def ScatterPlot(dataset): - +def ScatterPlot(dataset) ::: + + Assesses visual relationships, patterns, and outliers among features in a dataset through scatter plot matrices. ### Purpose diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 057b19fbc..404178693 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).ScoreBandDefaultRates" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ScoreBandDefaultRates[()]{.muted} - + ::: {.signature} - -def ScoreBandDefaultRates( - dataset: VMDataset, model: VMModel, score_column: str = 'score', score_bands: list = None): - +def ScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str = 'score',score_bands:list = None) ::: + + Analyzes default rates and population distribution across credit score bands. ### Purpose diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index d53ce5fa9..02fb3763d 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).SeasonalDecompose" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## SeasonalDecompose[()]{.muted} - + ::: {.signature} - -def SeasonalDecompose( - dataset: VMDataset, seasonal_model: str = 'additive'): - +def SeasonalDecompose(dataset:VMDataset,seasonal_model:str = 'additive') ::: + + Assesses patterns and seasonality in a time series dataset by decomposing its features into foundational components. ### Purpose @@ -61,13 +62,19 @@ The testing process leverages the `seasonal_decompose` function from the `statsm - **Handling Non-Finite Values**: Disregards non-finite values during analysis, potentially resulting in an incomplete understanding of the dataset. - **Unreliability with Noisy Datasets**: Produces unreliable results when used with datasets that contain heavy noise. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 7c812b29f..8ee8e9ab4 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).ShapiroWilk" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ShapiroWilk[()]{.muted} - + ::: {.signature} - -def ShapiroWilk(dataset): - +def ShapiroWilk(dataset) ::: + + Evaluates feature-wise normality of training data using the Shapiro-Wilk test. ### Purpose diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index 4e82aa946..2f55e786d 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).Skewness" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## Skewness[()]{.muted} - + ::: {.signature} - -def Skewness( - dataset, max_threshold = 1): - +def Skewness(dataset,max_threshold = 1) ::: + + Evaluates the skewness of numerical data in a dataset to check against a defined threshold, aiming to ensure data quality and optimize model performance. ### Purpose diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 5edfac61e..ceceb0b15 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).SpreadPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## SpreadPlot[()]{.muted} - + ::: {.signature} - -def SpreadPlot(dataset: VMDataset): - +def SpreadPlot(dataset:VMDataset) ::: + + Assesses potential correlations between pairs of time series variables through visualization to enhance understanding of their relationships. ### Purpose @@ -47,13 +50,19 @@ The SpreadPlot test computes and represents the spread between each pair of time - Can become inefficient or difficult to interpret with a high number of variables due to the profuse number of plots. - Might not completely capture intricate non-linear relationships between the variables. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 3e5a5ff21..f93fa4756 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).TabularCategoricalBarPlots" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## TabularCategoricalBarPlots[()]{.muted} - + ::: {.signature} - -def TabularCategoricalBarPlots(dataset: VMDataset): - +def TabularCategoricalBarPlots(dataset:VMDataset) ::: + + Generates and visualizes bar plots for each category in categorical features to evaluate the dataset's composition. ### Purpose @@ -44,13 +47,19 @@ The provided dataset is first checked to determine if it contains any categorica - It does not provide informative value when there are too many categories, as the bar chart could become cluttered and hard to interpret. - Offers no insights into the model's performance or precision, but rather provides a descriptive analysis of the input. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 254272299..73fbae262 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).TabularDateTimeHistograms" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## TabularDateTimeHistograms[()]{.muted} - + ::: {.signature} - -def TabularDateTimeHistograms(dataset: VMDataset): - +def TabularDateTimeHistograms(dataset:VMDataset) ::: + + Generates histograms to provide graphical insight into the distribution of time intervals in a model's datetime data. ### Purpose @@ -45,13 +48,19 @@ This test operates by first identifying all datetime columns and extracting them - The test is only applicable to datasets containing datetime columns and will fail if such columns are unavailable. - The interpretation of the histograms relies heavily on the domain expertise and experience of the reviewer. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index dead0a409..6dc6f7687 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -3,95 +3,95 @@ title: "[validmind](/reference/validmind.html).TabularDescriptionTables" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## get_categorical_columns[()]{.muted} - + ::: {.signature} - -def get_categorical_columns(dataset): - +def get_categorical_columns(dataset) ::: + + ## get_datetime_columns[()]{.muted} - + ::: {.signature} - -def get_datetime_columns(dataset): - +def get_datetime_columns(dataset) ::: + + ## get_numerical_columns[()]{.muted} - + ::: {.signature} - -def get_numerical_columns(dataset): - +def get_numerical_columns(dataset) ::: + + ## get_summary_statistics_categorical[()]{.muted} - + ::: {.signature} - -def get_summary_statistics_categorical( - dataset, categorical_fields): - +def get_summary_statistics_categorical(dataset,categorical_fields) ::: + + ## get_summary_statistics_datetime[()]{.muted} - + ::: {.signature} - -def get_summary_statistics_datetime( - dataset, datetime_fields): - +def get_summary_statistics_datetime(dataset,datetime_fields) ::: + + ## get_summary_statistics_numerical[()]{.muted} - + ::: {.signature} - -def get_summary_statistics_numerical( - dataset, numerical_fields): - +def get_summary_statistics_numerical(dataset,numerical_fields) ::: + + ## TabularDescriptionTables[()]{.muted} - + ::: {.signature} - -def TabularDescriptionTables(dataset): - +def TabularDescriptionTables(dataset) ::: + + Summarizes key descriptive statistics for numerical, categorical, and datetime variables in a dataset. ### Purpose diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index aadec5853..f5f30a3b5 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).TabularNumericalHistograms" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## TabularNumericalHistograms[()]{.muted} - + ::: {.signature} - -def TabularNumericalHistograms(dataset: VMDataset): - +def TabularNumericalHistograms(dataset:VMDataset) ::: + + Generates histograms for each numerical feature in a dataset to provide visual insights into data distribution and detect potential issues. ### Purpose diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index f9862ceaa..6535ce9e5 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).TargetRateBarPlots" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## TargetRateBarPlots[()]{.muted} - + ::: {.signature} - -def TargetRateBarPlots(dataset: VMDataset): - +def TargetRateBarPlots(dataset:VMDataset) ::: + + Generates bar plots visualizing the default rates of categorical features for a classification machine learning model. ### Purpose @@ -41,13 +44,19 @@ The test involves creating a pair of bar plots for each categorical feature in t - The readability of the bar plots drops as the number of distinct categories increases in the dataset, which can make them harder to understand and less useful. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 6f271545c..92e4e39ab 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).TimeSeriesDescription" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## TimeSeriesDescription[()]{.muted} - + ::: {.signature} - -def TimeSeriesDescription(dataset): - +def TimeSeriesDescription(dataset) ::: + + Generates a detailed analysis for the provided time series dataset, summarizing key statistics to identify trends, patterns, and data quality issues. ### Purpose diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 46cf9e2f1..95b0d3180 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).TimeSeriesDescriptiveStatistics" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## TimeSeriesDescriptiveStatistics[()]{.muted} - + ::: {.signature} - -def TimeSeriesDescriptiveStatistics(dataset): - +def TimeSeriesDescriptiveStatistics(dataset) ::: + + Evaluates the descriptive statistics of a time series dataset to identify trends, patterns, and data quality issues. ### Purpose diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 127aef744..7d08ad15c 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).TimeSeriesFrequency" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## TimeSeriesFrequency[()]{.muted} - + ::: {.signature} - -def TimeSeriesFrequency(dataset: VMDataset): - +def TimeSeriesFrequency(dataset:VMDataset) ::: + + Evaluates consistency of time series data frequency and generates a frequency plot. ### Purpose @@ -44,13 +47,19 @@ Initially, the test checks if the dataframe index is in datetime format. Subsequ - The `infer_freq` method might not always correctly infer frequency when faced with missing or irregular data points. - Depending on context or the model under development, mixed frequencies might sometimes be acceptable, but this test considers them a failing condition. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 36794a89b..6aa3bdc3e 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).TimeSeriesHistogram" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## TimeSeriesHistogram[()]{.muted} - + ::: {.signature} - -def TimeSeriesHistogram( - dataset, nbins = 30): - +def TimeSeriesHistogram(dataset,nbins = 30) ::: + + Visualizes distribution of time-series data using histograms and Kernel Density Estimation (KDE) lines. ### Purpose diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 217b42274..8ed890758 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).TimeSeriesLinePlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## TimeSeriesLinePlot[()]{.muted} - + ::: {.signature} - -def TimeSeriesLinePlot(dataset: VMDataset): - +def TimeSeriesLinePlot(dataset:VMDataset) ::: + + Generates and analyses time-series data through line plots revealing trends, patterns, anomalies over time. ### Purpose @@ -46,13 +49,19 @@ The mechanism for this Python class involves extracting the column names from th - The metric necessitates that the time-specific data has been transformed into a datetime index, with the data formatted correctly. - The metric has an inherent limitation in that it cannot extract deeper statistical insights from the time series data, which can limit its efficacy with complex data structures and phenomena. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index a54da3c92..4c245390f 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).TimeSeriesMissingValues" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## TimeSeriesMissingValues[()]{.muted} - + ::: {.signature} - -def TimeSeriesMissingValues( - dataset: VMDataset, min_threshold: int = 1): - +def TimeSeriesMissingValues(dataset:VMDataset,min_threshold:int = 1) ::: + + Validates time-series data quality by confirming the count of missing values is below a certain threshold. ### Purpose @@ -45,13 +47,19 @@ The test method commences by validating if the dataset has a datetime index; if - The test's sensitivity to the 'min_threshold' parameter may raise false alarms if set too strictly or may overlook problematic data if set too loosely. - Solely focuses on the 'missingness' of the data and might fall short in addressing other aspects of data quality. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 7ddc35ffe..45c0e379e 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).TimeSeriesOutliers" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## TimeSeriesOutliers[()]{.muted} - + ::: {.signature} - -def TimeSeriesOutliers( - dataset: VMDataset, zscore_threshold: int = 3): - +def TimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int = 3) ::: + + Identifies and visualizes outliers in time-series data using the z-score method. ### Purpose @@ -50,13 +52,19 @@ The test processes a given dataset which must have datetime indexing, checks if - It does not address possible ways to handle identified outliers in the data. - The requirement for a datetime index could limit its application. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index e1464391e..8c9855863 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).TooManyZeroValues" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## TooManyZeroValues[()]{.muted} - + ::: {.signature} - -def TooManyZeroValues( - dataset: VMDataset, max_percent_threshold: float = 0.03): - +def TooManyZeroValues(dataset:VMDataset,max_percent_threshold:float = 0.03) ::: + + Identifies numerical columns in a dataset that contain an excessive number of zero values, defined by a threshold percentage. ### Purpose diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index bccd1f10c..dce92dd04 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).UniqueRows" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## UniqueRows[()]{.muted} - + ::: {.signature} - -def UniqueRows( - dataset: VMDataset, min_percent_threshold: float = 1): - +def UniqueRows(dataset:VMDataset,min_percent_threshold:float = 1) ::: + + Verifies the diversity of the dataset by ensuring that the count of unique rows exceeds a prescribed threshold. ### Purpose diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index bf44eea79..50f678eb9 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).WOEBinPlots" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## WOEBinPlots[()]{.muted} - + ::: {.signature} - -def WOEBinPlots( - dataset: VMDataset, breaks_adj: list = None, fig_height: int = 600, fig_width: int = 500): - +def WOEBinPlots(dataset:VMDataset,breaks_adj:list = None,fig_height:int = 600,fig_width:int = 500) ::: + + Generates visualizations of Weight of Evidence (WoE) and Information Value (IV) for understanding predictive power of categorical variables in a data set. ### Purpose @@ -62,13 +63,19 @@ The test implementation follows defined steps. Initially, it selects non-numeric - Extreme or outlier values can dramatically affect the computation of WoE and IV, skewing results. - The method requires a sufficient number of events per bin to generate a reliable information value and weight of evidence. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 069bd1cac..2e69211d7 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).WOEBinTable" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## WOEBinTable[()]{.muted} - + ::: {.signature} - -def WOEBinTable( - dataset: VMDataset, breaks_adj: list = None): - +def WOEBinTable(dataset:VMDataset,breaks_adj:list = None) ::: + + Assesses the Weight of Evidence (WoE) and Information Value (IV) of each feature to evaluate its predictive power in a binary classification model. ### Purpose @@ -44,13 +46,19 @@ The test uses the `scorecardpy.woebin` method to perform automatic binning of th - Potential difficulties if the dataset has many features, non-binnable features, or non-numeric features. - The metric does not help in distinguishing whether the observed predictive factor is due to data randomness or a true phenomenon. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 127f1fd58..04066a1e1 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -3,35 +3,37 @@ title: "[validmind](/reference/validmind.html).ZivotAndrewsArch" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## ZivotAndrewsArch[()]{.muted} - + ::: {.signature} - -def ZivotAndrewsArch(dataset: VMDataset): - +def ZivotAndrewsArch(dataset:VMDataset) ::: + + Evaluates the order of integration and stationarity of time series data using the Zivot-Andrews unit root test. ### Purpose @@ -57,13 +59,19 @@ The Zivot-Andrews unit root test is performed on each feature in the dataset usi - Assumes data is derived from a single-equation, autoregressive model, making it less appropriate for multivariate time series data or data not aligning with this model. - May not account for unexpected shocks or changes in the series trend, both of which can significantly impact data stationarity. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/nlp.qmd b/docs/validmind/tests/data_validation/nlp.qmd index 4dde30e85..c27846e97 100644 --- a/docs/validmind/tests/data_validation/nlp.qmd +++ b/docs/validmind/tests/data_validation/nlp.qmd @@ -3,6 +3,7 @@ title: "[validmind](/reference/validmind.html).nlp" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- - [CommonWords](nlp/CommonWords.qmd) diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index c6761d3f6..e9a1a1e61 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).CommonWords" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## CommonWords[()]{.muted} - + ::: {.signature} - -def CommonWords(dataset: VMDataset): - +def CommonWords(dataset:VMDataset) ::: + + Assesses the most frequent non-stopwords in a text column for identifying prevalent language patterns. ### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index d2ad55d95..1c4170467 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).Hashtags" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## Hashtags[()]{.muted} - + ::: {.signature} - -def Hashtags( - dataset: VMDataset, top_hashtags: int = 25): - +def Hashtags(dataset:VMDataset,top_hashtags:int = 25) ::: + + Assesses hashtag frequency in a text column, highlighting usage trends and potential dataset bias or spam. ### Purpose @@ -47,13 +49,19 @@ The test implements a regular expression (regex) to extract all hashtags from th - Does not account for typographical errors, variations, or synonyms in hashtags. - Does not provide context or sentiment associated with the hashtags, so the information provided may have limited utility on its own. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index f6a7ec548..3e3ddef9a 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).LanguageDetection" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## LanguageDetection[()]{.muted} - + ::: {.signature} - -def LanguageDetection(dataset): - +def LanguageDetection(dataset) ::: + + Assesses the diversity of languages in a textual dataset by detecting and visualizing the distribution of languages. ### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index d32134148..51cfae591 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).Mentions" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## Mentions[()]{.muted} - + ::: {.signature} - -def Mentions( - dataset: VMDataset, top_mentions: int = 25): - +def Mentions(dataset:VMDataset,top_mentions:int = 25) ::: + + Calculates and visualizes frequencies of '@' prefixed mentions in a text-based dataset for NLP model analysis. ### Purpose @@ -45,13 +47,19 @@ The test first verifies the existence of a text column in the provided dataset. - This test isn't suited for datasets devoid of textual data. - It does not provide insights on less frequently occurring data or outliers, which means potentially significant patterns could be overlooked. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index 96c6a7f8c..6085144df 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).PolarityAndSubjectivity" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## PolarityAndSubjectivity[()]{.muted} - + ::: {.signature} - -def PolarityAndSubjectivity( - dataset, threshold_subjectivity = 0.5, threshold_polarity = 0): - +def PolarityAndSubjectivity(dataset,threshold_subjectivity = 0.5,threshold_polarity = 0) ::: + + Analyzes the polarity and subjectivity of text data within a given dataset to visualize the sentiment distribution. ### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index 5082b178c..9d915d252 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -3,23 +3,27 @@ title: "[validmind](/reference/validmind.html).Punctuations" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Metrics functions for any Pandas-compatible datasets + + ## Punctuations[()]{.muted} - + ::: {.signature} - -def Punctuations( - dataset, count_mode = 'token'): - +def Punctuations(dataset,count_mode = 'token') ::: + + Analyzes and visualizes the frequency distribution of punctuation usage in a given text dataset. ### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index 736165ebc..2909bf7de 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).Sentiment" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## Sentiment[()]{.muted} - + ::: {.signature} - -def Sentiment(dataset): - +def Sentiment(dataset) ::: + + Analyzes the sentiment of text data within a dataset using the VADER sentiment analysis tool. ### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index 1d321cb8b..f91a69d42 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -3,23 +3,27 @@ title: "[validmind](/reference/validmind.html).StopWords" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Threshold based tests + + ## StopWords[()]{.muted} - + ::: {.signature} - -def StopWords( - dataset: VMDataset, min_percent_threshold: float = 0.5, num_words: int = 25): - +def StopWords(dataset:VMDataset,min_percent_threshold:float = 0.5,num_words:int = 25) ::: + + Evaluates and visualizes the frequency of English stop words in a text dataset against a defined threshold. ### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 59c5f8fa3..2aa1b0761 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -3,34 +3,35 @@ title: "[validmind](/reference/validmind.html).TextDescription" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## create_metrics_df[()]{.muted} - + ::: {.signature} - -def create_metrics_df( - df, text_column, unwanted_tokens, lang): - +def create_metrics_df(df,text_column,unwanted_tokens,lang) ::: + + ## TextDescription[()]{.muted} - + ::: {.signature} - -def TextDescription( - dataset: VMDataset, unwanted_tokens: set = {'cls': 'ExprSet', 'elements': ["'s'", '"s\'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"\'s"', "' '", '"\'\'"', "'dollar'", "'us'", "'``'"]}, lang: str = 'english'): - +def TextDescription(dataset:VMDataset,unwanted_tokens:set = {'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str = 'english') ::: + + Conducts comprehensive textual analysis on a dataset using NLTK to evaluate various parameters and generate visualizations. ### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index 6515368c5..ff6da3f85 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).Toxicity" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## Toxicity[()]{.muted} - + ::: {.signature} - -def Toxicity(dataset): - +def Toxicity(dataset) ::: + + Assesses the toxicity of text data within a dataset to visualize the distribution of toxicity scores. ### Purpose diff --git a/docs/validmind/tests/model_validation.qmd b/docs/validmind/tests/model_validation.qmd index 01dcff7f6..41ddcf516 100644 --- a/docs/validmind/tests/model_validation.qmd +++ b/docs/validmind/tests/model_validation.qmd @@ -3,6 +3,7 @@ title: "[validmind](/reference/validmind.html).model_validation" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- - [BertScore](model_validation/BertScore.qmd) diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index fa5669bd3..f41a96f33 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -3,21 +3,21 @@ title: "[validmind](/reference/validmind.html).BertScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## validate_prediction() - + ::: {.signature} - -def validate_prediction( - y_true, y_pred, dataset_id = None): - +def validate_prediction(y_true,y_pred,dataset_id = None) ::: + + Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. **Parameters** @@ -30,19 +30,20 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val - (cleaned_y_true, cleaned_y_pred) with matching lengths and no NaN values + + ## BertScore[()]{.muted} - + ::: {.signature} - -def BertScore( - dataset, model, evaluation_model = 'distilbert-base-uncased'): - +def BertScore(dataset,model,evaluation_model = 'distilbert-base-uncased') ::: + + Assesses the quality of machine-generated text using BERTScore metrics and visualizes results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics. ### Purpose diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 4a4420703..03dc0c4a2 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -3,21 +3,21 @@ title: "[validmind](/reference/validmind.html).BleuScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## validate_prediction() - + ::: {.signature} - -def validate_prediction( - y_true, y_pred, dataset_id = None): - +def validate_prediction(y_true,y_pred,dataset_id = None) ::: + + Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. **Parameters** @@ -30,19 +30,20 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val - (cleaned_y_true, cleaned_y_pred) with matching lengths and no NaN values + + ## BleuScore[()]{.muted} - + ::: {.signature} - -def BleuScore( - dataset, model): - +def BleuScore(dataset,model) ::: + + Evaluates the quality of machine-generated text using BLEU metrics and visualizes the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for BLEU scores. ### Purpose diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index ae7cd0d10..0d204822a 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).ClusterSizeDistribution" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ClusterSizeDistribution[()]{.muted} - + ::: {.signature} - -def ClusterSizeDistribution( - dataset: VMDataset, model: VMModel): - +def ClusterSizeDistribution(dataset:VMDataset,model:VMModel) ::: + + Assesses the performance of clustering models by comparing the distribution of cluster sizes in model predictions with the actual data. ### Purpose diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 08f77721a..2df6a5186 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -3,21 +3,21 @@ title: "[validmind](/reference/validmind.html).ContextualRecall" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## validate_prediction() - + ::: {.signature} - -def validate_prediction( - y_true, y_pred, dataset_id = None): - +def validate_prediction(y_true,y_pred,dataset_id = None) ::: + + Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. **Parameters** @@ -30,19 +30,20 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val - (cleaned_y_true, cleaned_y_pred) with matching lengths and no NaN values + + ## ContextualRecall[()]{.muted} - + ::: {.signature} - -def ContextualRecall( - dataset, model): - +def ContextualRecall(dataset,model) ::: + + Evaluates a Natural Language Generation model's ability to generate contextually relevant and factually correct text, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for contextual recall scores. ### Purpose diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 87dd279ff..01e5b5753 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).FeaturesAUC" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## FeaturesAUC[()]{.muted} - + ::: {.signature} - -def FeaturesAUC( - dataset: VMDataset, fontsize: int = 12, figure_height: int = 500): - +def FeaturesAUC(dataset:VMDataset,fontsize:int = 12,figure_height:int = 500) ::: + + Evaluates the discriminatory power of each individual feature within a binary classification model by calculating the Area Under the Curve (AUC) for each feature separately. ### Purpose @@ -59,13 +60,19 @@ For each feature, the metric treats the feature values as raw scores to compute - The AUC values are calculated without considering the model's use of the features, which could lead to different interpretations of feature importance when considering the model holistically. - This metric is applicable only to binary classification tasks and cannot be directly extended to multiclass classification or regression without modifications. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 22707dcfe..d60b7cd48 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -3,21 +3,21 @@ title: "[validmind](/reference/validmind.html).MeteorScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## validate_prediction() - + ::: {.signature} - -def validate_prediction( - y_true, y_pred, dataset_id = None): - +def validate_prediction(y_true,y_pred,dataset_id = None) ::: + + Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. **Parameters** @@ -30,19 +30,20 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val - (cleaned_y_true, cleaned_y_pred) with matching lengths and no NaN values + + ## MeteorScore[()]{.muted} - + ::: {.signature} - -def MeteorScore( - dataset, model): - +def MeteorScore(dataset,model) ::: + + Assesses the quality of machine-generated translations by comparing them to human-produced references using the METEOR score, which evaluates precision, recall, and word order. ### Purpose diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index 7c69c386e..758cf86f0 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -3,34 +3,37 @@ title: "[validmind](/reference/validmind.html).ModelMetadata" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_model_info() - + ::: {.signature} - -def get_model_info(model): - +def get_model_info(model) ::: + + Attempts to extract all model info from a model object instance + + ## ModelMetadata[()]{.muted} - + ::: {.signature} - -def ModelMetadata(model): - +def ModelMetadata(model) ::: + + Compare metadata of different models and generate a summary table with the results. **Purpose**: The purpose of this function is to compare the metadata of different models, including information about their architecture, framework, framework version, and programming language. **Test Mechanism**: The function retrieves the metadata for each model using `get_model_info`, renames columns according to a predefined set of labels, and compiles this information into a summary table. diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index 9e70f47d0..baf4ea531 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).ModelPredictionResiduals" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ModelPredictionResiduals[()]{.muted} - + ::: {.signature} - -def ModelPredictionResiduals( - dataset, model, nbins = 100, p_value_threshold = 0.05, start_date = None, end_date = None): - +def ModelPredictionResiduals(dataset,model,nbins = 100,p_value_threshold = 0.05,start_date = None,end_date = None) ::: + + Assesses normality and behavior of residuals in regression models through visualization and statistical tests. ### Purpose diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 78af431cd..c1ecb80af 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -3,21 +3,21 @@ title: "[validmind](/reference/validmind.html).RegardScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## validate_prediction() - + ::: {.signature} - -def validate_prediction( - y_true, y_pred, dataset_id = None): - +def validate_prediction(y_true,y_pred,dataset_id = None) ::: + + Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. **Parameters** @@ -30,19 +30,20 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val - (cleaned_y_true, cleaned_y_pred) with matching lengths and no NaN values + + ## RegardScore[()]{.muted} - + ::: {.signature} - -def RegardScore( - dataset, model): - +def RegardScore(dataset,model) ::: + + Assesses the sentiment and potential biases in text generated by NLP models by computing and visualizing regard scores. ### Purpose diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 91bd9843d..101481ec0 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).RegressionResidualsPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## RegressionResidualsPlot[()]{.muted} - + ::: {.signature} - -def RegressionResidualsPlot( - model: VMModel, dataset: VMDataset, bin_size: float = 0.1): - +def RegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float = 0.1) ::: + + Evaluates regression model performance using residual distribution and actual vs. predicted plots. ### Purpose diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index df601ff5e..9168bc876 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).RougeScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## RougeScore[()]{.muted} - + ::: {.signature} - -def RougeScore( - dataset, model, metric = 'rouge-1'): - +def RougeScore(dataset,model,metric = 'rouge-1') ::: + + Assesses the quality of machine-generated text using ROUGE metrics and visualizes the results to provide comprehensive performance insights. ### Purpose diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index ef99c8de1..f07e2ccdf 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).TimeSeriesPredictionWithCI" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## TimeSeriesPredictionWithCI[()]{.muted} - + ::: {.signature} - -def TimeSeriesPredictionWithCI( - dataset, model, confidence = 0.95): - +def TimeSeriesPredictionWithCI(dataset,model,confidence = 0.95) ::: + + Assesses predictive accuracy and uncertainty in time series models, highlighting breaches beyond confidence intervals. ### Purpose diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index eec003026..0e0bc5731 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).TimeSeriesPredictionsPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## TimeSeriesPredictionsPlot[()]{.muted} - + ::: {.signature} - -def TimeSeriesPredictionsPlot( - dataset, model): - +def TimeSeriesPredictionsPlot(dataset,model) ::: + + Plot actual vs predicted values for time series data and generate a visual comparison for the model. ### Purpose diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 11d28b25d..698cc2d1f 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).TimeSeriesR2SquareBySegments" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## TimeSeriesR2SquareBySegments[()]{.muted} - + ::: {.signature} - -def TimeSeriesR2SquareBySegments( - dataset, model, segments = None): - +def TimeSeriesR2SquareBySegments(dataset,model,segments = None) ::: + + Evaluates the R-Squared values of regression models over specified time segments in time series data to assess segment-wise model performance. ### Purpose diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index 805a6d615..84cb56a29 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).TokenDisparity" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## TokenDisparity[()]{.muted} - + ::: {.signature} - -def TokenDisparity( - dataset, model): - +def TokenDisparity(dataset,model) ::: + + Evaluates the token disparity between reference and generated texts, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for token counts. ### Purpose diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index b164f7f8c..a23456d4c 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).ToxicityScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ToxicityScore[()]{.muted} - + ::: {.signature} - -def ToxicityScore( - dataset, model): - +def ToxicityScore(dataset,model) ::: + + Assesses the toxicity levels of texts generated by NLP models to identify and mitigate harmful or offensive content. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn.qmd b/docs/validmind/tests/model_validation/sklearn.qmd index 871dfb51e..3f05429dd 100644 --- a/docs/validmind/tests/model_validation/sklearn.qmd +++ b/docs/validmind/tests/model_validation/sklearn.qmd @@ -3,6 +3,7 @@ title: "[validmind](/reference/validmind.html).sklearn" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- - [AdjustedMutualInformation](sklearn/AdjustedMutualInformation.qmd) diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 0824ffff7..729af67fc 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).AdjustedMutualInformation" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## AdjustedMutualInformation[()]{.muted} - + ::: {.signature} - -def AdjustedMutualInformation( - model: VMModel, dataset: VMDataset): - +def AdjustedMutualInformation(model:VMModel,dataset:VMDataset) ::: + + Evaluates clustering model performance by measuring mutual information between true and predicted labels, adjusting for chance. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 80af48576..064be5017 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).AdjustedRandIndex" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## AdjustedRandIndex[()]{.muted} - + ::: {.signature} - -def AdjustedRandIndex( - model: VMModel, dataset: VMDataset): - +def AdjustedRandIndex(model:VMModel,dataset:VMDataset) ::: + + Measures the similarity between two data clusters using the Adjusted Rand Index (ARI) metric in clustering machine learning models. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index a7e870499..8702b6069 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).CalibrationCurve" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## CalibrationCurve[()]{.muted} - + ::: {.signature} - -def CalibrationCurve( - model: VMModel, dataset: VMDataset, n_bins: int = 10): - +def CalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int = 10) ::: + + Evaluates the calibration of probability estimates by comparing predicted probabilities against observed frequencies. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index 1f048fc41..9901f0f85 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).ClassifierPerformance" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ClassifierPerformance[()]{.muted} - + ::: {.signature} - -def ClassifierPerformance( - dataset: VMDataset, model: VMModel, average: str = 'macro'): - +def ClassifierPerformance(dataset:VMDataset,model:VMModel,average:str = 'macro') ::: + + Evaluates performance of binary or multiclass classification models using precision, recall, F1-Score, accuracy, and ROC AUC scores. ### Purpose @@ -46,15 +48,14 @@ The test produces a report that includes precision, recall, F1-Score, and accura - Specifically designed for classification models and not suitable for regression models. - May provide limited insights if the test dataset does not represent real-world scenarios adequately. + + ## multiclass_roc_auc_score[()]{.muted} - + ::: {.signature} - -def multiclass_roc_auc_score( - y_test, y_pred, average = 'macro'): - +def multiclass_roc_auc_score(y_test,y_pred,average = 'macro') ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 7595f08d8..7dd3497e9 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).ClassifierThresholdOptimization" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ClassifierThresholdOptimization[()]{.muted} - + ::: {.signature} - -def ClassifierThresholdOptimization( - dataset: VMDataset, model: VMModel, methods = None, target_recall = None): - +def ClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods = None,target_recall = None) ::: + + Analyzes and visualizes different threshold optimization methods for binary classification models. ### Purpose @@ -80,19 +82,20 @@ The test implements multiple threshold optimization methods: - table: DataFrame comparing different threshold optimization methods (using weighted averages for precision, recall, and f1) - figure: Plotly figure showing ROC and PR curves with optimal thresholds + + ## find_optimal_threshold[()]{.muted} - + ::: {.signature} - -def find_optimal_threshold( - y_true, y_prob, method = 'youden', target_recall = None): - +def find_optimal_threshold(y_true,y_prob,method = 'youden',target_recall = None) ::: + + Find the optimal classification threshold using various methods. **Parameters** diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 39a6970aa..55ef272e1 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).ClusterCosineSimilarity" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ClusterCosineSimilarity[()]{.muted} - + ::: {.signature} - -def ClusterCosineSimilarity( - model: VMModel, dataset: VMDataset): - +def ClusterCosineSimilarity(model:VMModel,dataset:VMDataset) ::: + + Measures the intra-cluster similarity of a clustering model using cosine similarity. ### Purpose @@ -46,13 +48,19 @@ This test works by first extracting the true and predicted clusters of the model - It primarily works with continuous variables and is not suitable for binary or categorical variables. - Lastly, although rare, perfect perpendicular vectors (cosine similarity = 0) could be within the same cluster, which may give an inaccurate representation of a 'bad' cluster due to low cosine similarity score. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index a040af919..8b035ce0e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).ClusterPerformanceMetrics" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ClusterPerformanceMetrics[()]{.muted} - + ::: {.signature} - -def ClusterPerformanceMetrics( - model: VMModel, dataset: VMDataset): - +def ClusterPerformanceMetrics(model:VMModel,dataset:VMDataset) ::: + + Evaluates the performance of clustering machine learning models using multiple established metrics. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 2612b2b5f..24b110d77 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).CompletenessScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## CompletenessScore[()]{.muted} - + ::: {.signature} - -def CompletenessScore( - model: VMModel, dataset: VMDataset): - +def CompletenessScore(model:VMModel,dataset:VMDataset) ::: + + Evaluates a clustering model's capacity to categorize instances from a single class into the same cluster. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 439417bdc..cf3f62452 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).ConfusionMatrix" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ConfusionMatrix[()]{.muted} - + ::: {.signature} - -def ConfusionMatrix( - dataset: VMDataset, model: VMModel): - +def ConfusionMatrix(dataset:VMDataset,model:VMModel) ::: + + Evaluates and visually represents the classification ML model's predictive performance using a Confusion Matrix heatmap. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index b0c7824a2..d14efc905 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).FeatureImportance" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## FeatureImportance[()]{.muted} - + ::: {.signature} - -def FeatureImportance( - dataset: VMDataset, model: VMModel, num_features: int = 3): - +def FeatureImportance(dataset:VMDataset,model:VMModel,num_features:int = 3) ::: + + Compute feature importance scores for a given model and generate a summary table with the top important features. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index d6d0e4fa1..6d9f4cd4b 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).FowlkesMallowsScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## FowlkesMallowsScore[()]{.muted} - + ::: {.signature} - -def FowlkesMallowsScore( - dataset: VMDataset, model: VMModel): - +def FowlkesMallowsScore(dataset:VMDataset,model:VMModel) ::: + + Evaluates the similarity between predicted and actual cluster assignments in a model using the Fowlkes-Mallows score. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 89a438182..3bd29ceec 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).HomogeneityScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## HomogeneityScore[()]{.muted} - + ::: {.signature} - -def HomogeneityScore( - dataset: VMDataset, model: VMModel): - +def HomogeneityScore(dataset:VMDataset,model:VMModel) ::: + + Assesses clustering homogeneity by comparing true and predicted labels, scoring from 0 (heterogeneous) to 1 (homogeneous). ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 2c85aa48f..044a16949 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -3,34 +3,35 @@ title: "[validmind](/reference/validmind.html).HyperParametersTuning" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## custom_recall[()]{.muted} - + ::: {.signature} - -def custom_recall( - y_true, y_pred_proba, threshold = 0.5): - +def custom_recall(y_true,y_pred_proba,threshold = 0.5) ::: + + ## HyperParametersTuning[()]{.muted} - + ::: {.signature} - -def HyperParametersTuning( - model: VMModel, dataset: VMDataset, param_grid: dict, scoring: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'List'}, {'cls': 'ExprName', 'name': 'Dict'}], 'implicit': True}} = None, thresholds: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'float'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}}], 'implicit': True}} = None, fit_params: dict = None): - +def HyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'List'}, {'cls': 'ExprName', 'name': 'Dict'}], 'implicit': True}} = None,thresholds:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'float'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}}], 'implicit': True}} = None,fit_params:dict = None) ::: + + Performs exhaustive grid search over specified parameter ranges to find optimal model configurations across different metrics and decision thresholds. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index c1164873a..3695f1715 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).KMeansClustersOptimization" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## KMeansClustersOptimization[()]{.muted} - + ::: {.signature} - -def KMeansClustersOptimization( - model: VMModel, dataset: VMDataset, n_clusters: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'int'}}, 'None'], 'implicit': True}} = None): - +def KMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'int'}}, 'None'], 'implicit': True}} = None) ::: + + Optimizes the number of clusters in K-means models using Elbow and Silhouette methods. ### Purpose @@ -47,13 +49,19 @@ The test mechanism involves iterating over a predefined range of cluster numbers - Might not be straightforward to determine the 'elbow' point or maximize the silhouette average score, especially in larger and complicated datasets. - Assumes spherical clusters (due to using the Euclidean distance in the Elbow method), which might not align with the actual structure of the data. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 255094a50..eec0f30e9 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).MinimumAccuracy" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## MinimumAccuracy[()]{.muted} - + ::: {.signature} - -def MinimumAccuracy( - dataset: VMDataset, model: VMModel, min_threshold: float = 0.7): - +def MinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float = 0.7) ::: + + Checks if the model's prediction accuracy meets or surpasses a specified threshold. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index cdd563c36..2adf579b1 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).MinimumF1Score" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## MinimumF1Score[()]{.muted} - + ::: {.signature} - -def MinimumF1Score( - dataset: VMDataset, model: VMModel, min_threshold: float = 0.5): - +def MinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float = 0.5) ::: + + Assesses if the model's F1 score on the validation set meets a predefined minimum threshold, ensuring balanced performance between precision and recall. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 070286c4a..bb335406d 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).MinimumROCAUCScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## MinimumROCAUCScore[()]{.muted} - + ::: {.signature} - -def MinimumROCAUCScore( - dataset: VMDataset, model: VMModel, min_threshold: float = 0.5): - +def MinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float = 0.5) ::: + + Validates model by checking if the ROC AUC score meets or surpasses a specified threshold. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 32747fe82..aaa49bba4 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).ModelParameters" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ModelParameters[()]{.muted} - + ::: {.signature} - -def ModelParameters( - model, model_params = None): - +def ModelParameters(model,model_params = None) ::: + + Extracts and displays model parameters in a structured format for transparency and reproducibility. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index ac899ce69..654e69067 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -3,34 +3,33 @@ title: "[validmind](/reference/validmind.html).ModelsPerformanceComparison" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## multiclass_roc_auc_score() - + ::: {.signature} - -def multiclass_roc_auc_score( - y_test, y_pred, average = 'macro'): - +def multiclass_roc_auc_score(y_test,y_pred,average = 'macro') ::: + + ## ModelsPerformanceComparison[()]{.muted} - + ::: {.signature} - -def ModelsPerformanceComparison( - dataset: VMDataset, models: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'list'}, 'slice': {'cls': 'ExprName', 'name': 'VMModel'}}): - +def ModelsPerformanceComparison(dataset:VMDataset,models:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'list'}, 'slice': {'cls': 'ExprName', 'name': 'VMModel'}}) ::: + + Evaluates and compares the performance of multiple Machine Learning models using various metrics like accuracy, precision, recall, and F1 score. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index e0a979c51..a7acece93 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).OverfitDiagnosis" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## OverfitDiagnosis[()]{.muted} - + ::: {.signature} - -def OverfitDiagnosis( - model: VMModel, datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, metric: str = None, cut_off_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): - +def OverfitDiagnosis(model:VMModel,datasets:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}},metric:str = None,cut_off_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}) ::: + + Assesses potential overfitting in a model's predictions, identifying regions where performance between training and testing sets deviates significantly. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index a49106f81..fafdfd06e 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).PermutationFeatureImportance" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## PermutationFeatureImportance[()]{.muted} - + ::: {.signature} - -def PermutationFeatureImportance( - model: VMModel, dataset: VMDataset, fontsize: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'int'}, 'None'], 'implicit': True}} = None, figure_height: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'int'}, 'None'], 'implicit': True}} = None): - +def PermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'int'}, 'None'], 'implicit': True}} = None,figure_height:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'int'}, 'None'], 'implicit': True}} = None) ::: + + Assesses the significance of each feature in a model by evaluating the impact on model performance when feature values are randomly rearranged. ### Purpose @@ -60,13 +61,19 @@ PFI is calculated via the `permutation_importance` method from the `sklearn.insp - Does not account for interactions between features. If features are correlated, the permutation importance may allocate importance to one and not the other. - Cannot interact with certain libraries like statsmodels, pytorch, catboost, etc., thus limiting its applicability. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 07506c250..2599498cf 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -3,51 +3,53 @@ title: "[validmind](/reference/validmind.html).PopulationStabilityIndex" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## calculate_psi[()]{.muted} - + ::: {.signature} - -def calculate_psi( - score_initial, score_new, num_bins = 10, mode = 'fixed'): - +def calculate_psi(score_initial,score_new,num_bins = 10,mode = 'fixed') ::: + + Taken from: https://towardsdatascience.com/checking-model-stability-and-population-shift-with-psi-and-csi-6d12af008783 + + ## PopulationStabilityIndex[()]{.muted} - + ::: {.signature} - -def PopulationStabilityIndex( - datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, num_bins: int = 10, mode: str = 'fixed'): - +def PopulationStabilityIndex(datasets:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}},model:VMModel,num_bins:int = 10,mode:str = 'fixed') ::: + + Assesses the Population Stability Index (PSI) to quantify the stability of an ML model's predictions across different datasets. ### Purpose @@ -77,13 +79,19 @@ The implementation of the PSI in this script involves calculating the PSI for ea - The test may not handle features with significant outliers adequately. - Additionally, the PSI test is performed on model predictions, not on the underlying data distributions which can lead to misinterpretations. Any changes in PSI could be due to shifts in the model (model drift), changes in the relationships between features and the target variable (concept drift), or both. However, distinguishing between these causes is non-trivial. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index d2911acd7..9fab57f84 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).PrecisionRecallCurve" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## PrecisionRecallCurve[()]{.muted} - + ::: {.signature} - -def PrecisionRecallCurve( - model: VMModel, dataset: VMDataset): - +def PrecisionRecallCurve(model:VMModel,dataset:VMDataset) ::: + + Evaluates the precision-recall trade-off for binary classification models and visualizes the Precision-Recall curve. ### Purpose @@ -44,13 +46,19 @@ The test extracts ground truth labels and prediction probabilities from the mode - This metric is only applicable to binary classification models - it raises errors for multiclass classification models or Foundation models. - It may not fully represent the overall accuracy of the model if the cost of false positives and false negatives are extremely different, or if the dataset is heavily imbalanced. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 42b103b4e..7c8fdb9ea 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).ROCCurve" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ROCCurve[()]{.muted} - + ::: {.signature} - -def ROCCurve( - model: VMModel, dataset: VMDataset): - +def ROCCurve(model:VMModel,dataset:VMDataset) ::: + + Evaluates binary classification model performance by generating and plotting the Receiver Operating Characteristic (ROC) curve and calculating the Area Under Curve (AUC) score. ### Purpose @@ -45,13 +47,19 @@ First, this script selects the target model and datasets that require binary cla - Furthermore, its performance might be subpar with models that output probabilities highly skewed towards 0 or 1. - At the extreme, the ROC curve could reflect high performance even when the majority of classifications are incorrect, provided that the model's ranking format is retained. This phenomenon is commonly termed the "Class Imbalance Problem". + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index 9347cb3ad..b5a900c9a 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).RegressionErrors" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## RegressionErrors[()]{.muted} - + ::: {.signature} - -def RegressionErrors( - model, dataset): - +def RegressionErrors(model,dataset) ::: + + Assesses the performance and error distribution of a regression model using various error metrics. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 11338d8aa..26cc6f94b 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).RegressionErrorsComparison" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## RegressionErrorsComparison[()]{.muted} - + ::: {.signature} - -def RegressionErrorsComparison( - datasets, models): - +def RegressionErrorsComparison(datasets,models) ::: + + Assesses multiple regression error metrics to compare model performance across different datasets, emphasizing systematic overestimation or underestimation and large percentage errors. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 008ac5297..b7606b621 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).RegressionPerformance" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## RegressionPerformance[()]{.muted} - + ::: {.signature} - -def RegressionPerformance( - model: VMModel, dataset: VMDataset): - +def RegressionPerformance(model:VMModel,dataset:VMDataset) ::: + + Evaluates the performance of a regression model using five different metrics: MAE, MSE, RMSE, MAPE, and MBD. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index cdb684685..5f6a5244d 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).RegressionR2Square" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## adj_r2_score() - + ::: {.signature} - -def adj_r2_score( - actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: int, featurecount: int): - +def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) ::: + + Adjusted R2 Score + + ## RegressionR2Square[()]{.muted} - + ::: {.signature} - -def RegressionR2Square( - dataset, model): - +def RegressionR2Square(dataset,model) ::: + + Assesses the overall goodness-of-fit of a regression model by evaluating R-squared (R2) and Adjusted R-squared (Adj R2) scores to determine the model's explanatory power over the dependent variable. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 16aeb921a..0a0a2702e 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).RegressionR2SquareComparison" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## adj_r2_score() - + ::: {.signature} - -def adj_r2_score( - actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: int, featurecount: int): - +def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) ::: + + Adjusted R2 Score + + ## RegressionR2SquareComparison[()]{.muted} - + ::: {.signature} - -def RegressionR2SquareComparison( - datasets, models): - +def RegressionR2SquareComparison(datasets,models) ::: + + Compares R-Squared and Adjusted R-Squared values for different regression models across multiple datasets to assess model performance and relevance of features. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index fc6f02b25..fa19498d0 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).RobustnessDiagnosis" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## RobustnessDiagnosis[()]{.muted} - + ::: {.signature} - -def RobustnessDiagnosis( - datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, metric: str = None, scaling_factor_std_dev_list: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}} = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'}, performance_decay_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): - +def RobustnessDiagnosis(datasets:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}},model:VMModel,metric:str = None,scaling_factor_std_dev_list:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}} = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}) ::: + + Assesses the robustness of a machine learning model by evaluating performance decay under noisy conditions. ### Purpose @@ -65,13 +66,19 @@ This test introduces Gaussian noise to the numeric input features of the dataset - Performance thresholds are somewhat arbitrary and might need tuning. - The test may not account for more complex or unstructured noise patterns that could affect model robustness. + + ## [class]{.muted} MissingOrInvalidModelPredictFnError - + + +::: {.signature} + +class MissingOrInvalidModelPredictFnError() + +::: -```python -class MissingOrInvalidModelPredictFnError(BaseError): -``` + When the pytorch model is missing a predict function or its predict method does not have the expected arguments. diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 44daff6c9..366c268e7 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).SHAPGlobalImportance" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## generate_shap_plot[()]{.muted} - + ::: {.signature} - -def generate_shap_plot( - type_, shap_values, x_test): - +def generate_shap_plot(type\_,shap_values,x_test) ::: + + Plots two types of SHAP global importance (SHAP). **Parameters** @@ -45,19 +46,20 @@ Plots two types of SHAP global importance (SHAP). - The generated plot. + + ## select_shap_values[()]{.muted} - + ::: {.signature} - -def select_shap_values( - shap_values, class_of_interest): - +def select_shap_values(shap_values,class_of_interest) ::: + + Selects SHAP values for binary or multiclass classification. For regression models, returns the SHAP values directly as there are no classes. **Parameters** @@ -73,19 +75,20 @@ Selects SHAP values for binary or multiclass classification. For regression mode - **ValueError**: If class_of_interest is specified and is out of bounds for the number of classes. + + ## SHAPGlobalImportance[()]{.muted} - + ::: {.signature} - -def SHAPGlobalImportance( - model: VMModel, dataset: VMDataset, kernel_explainer_samples: int = 10, tree_or_linear_explainer_samples: int = 200, class_of_interest: int = None): - +def SHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int = 10,tree_or_linear_explainer_samples:int = 200,class_of_interest:int = None) ::: + + Evaluates and visualizes global feature importance using SHAP values for model explanation and risk identification. ### Purpose @@ -116,13 +119,19 @@ The exam begins with the selection of a suitable explainer which aligns with the - High-dimensional data can convolute interpretations. - Associating importance with tangible real-world impact still involves a certain degree of subjectivity. + + ## [class]{.muted} UnsupportedModelForSHAPError - + + +::: {.signature} + +class UnsupportedModelForSHAPError() + +::: -```python -class UnsupportedModelForSHAPError(BaseError): -``` + When an unsupported model is used for SHAP importance. diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 3593bea0a..022fa14de 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).ScoreProbabilityAlignment" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ScoreProbabilityAlignment[()]{.muted} - + ::: {.signature} - -def ScoreProbabilityAlignment( - model: VMModel, dataset: VMDataset, score_column: str = 'score', n_bins: int = 10): - +def ScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str = 'score',n_bins:int = 10) ::: + + Analyzes the alignment between credit scores and predicted probabilities. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index be46ec366..aaa6312db 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).SilhouettePlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## SilhouettePlot[()]{.muted} - + ::: {.signature} - -def SilhouettePlot( - model: VMModel, dataset: VMDataset): - +def SilhouettePlot(model:VMModel,dataset:VMDataset) ::: + + Calculates and visualizes Silhouette Score, assessing the degree of data point suitability to its cluster in ML models. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index e2dd75864..ac122c886 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).TrainingTestDegradation" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## TrainingTestDegradation[()]{.muted} - + ::: {.signature} - -def TrainingTestDegradation( - datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, max_threshold: float = 0.1): - +def TrainingTestDegradation(datasets:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}},model:VMModel,max_threshold:float = 0.1) ::: + + Tests if model performance degradation between training and test datasets exceeds a predefined threshold. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 3ac50e22c..80b2c1181 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).VMeasure" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## VMeasure[()]{.muted} - + ::: {.signature} - -def VMeasure( - dataset: VMDataset, model: VMModel): - +def VMeasure(dataset:VMDataset,model:VMModel) ::: + + Evaluates homogeneity and completeness of a clustering model using the V Measure Score. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 149e8edd1..f21c7ae39 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).WeakspotsDiagnosis" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## WeakspotsDiagnosis[()]{.muted} - + ::: {.signature} - -def WeakspotsDiagnosis( - datasets: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}, model: VMModel, features_columns: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}, 'None'], 'implicit': True}} = None, metrics: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Callable'}], 'implicit': True}}, 'None'], 'implicit': True}} = None, thresholds: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'float'}], 'implicit': True}}, 'None'], 'implicit': True}} = None): - +def WeakspotsDiagnosis(datasets:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}},model:VMModel,features_columns:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}, 'None'], 'implicit': True}} = None,metrics:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Callable'}], 'implicit': True}}, 'None'\], 'implicit': True}} = None,thresholds:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'float'}], 'implicit': True}}, 'None'\], 'implicit': True}} = None) ::: + + Identifies and visualizes weak spots in a machine learning model's performance across various sections of the feature space. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels.qmd b/docs/validmind/tests/model_validation/statsmodels.qmd index 799310a34..8c3d3a3c6 100644 --- a/docs/validmind/tests/model_validation/statsmodels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels.qmd @@ -3,6 +3,7 @@ title: "[validmind](/reference/validmind.html).statsmodels" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- - [AutoARIMA](statsmodels/AutoARIMA.qmd) diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 19c2a8114..d4394cd38 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).AutoARIMA" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## AutoARIMA[()]{.muted} - + ::: {.signature} - -def AutoARIMA( - model: VMModel, dataset: VMDataset): - +def AutoARIMA(model:VMModel,dataset:VMDataset) ::: + + Evaluates ARIMA models for time-series forecasting, ranking them using Bayesian and Akaike Information Criteria. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 32363108f..6f3d1e677 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).CumulativePredictionProbabilities sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## CumulativePredictionProbabilities[()]{.muted} - + ::: {.signature} - -def CumulativePredictionProbabilities( - dataset, model, title = 'Cumulative Probabilities'): - +def CumulativePredictionProbabilities(dataset,model,title = 'Cumulative Probabilities') ::: + + Visualizes cumulative probabilities of positive and negative classes for both training and testing in classification models. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 2e8676783..88f049728 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).DurbinWatsonTest" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## DurbinWatsonTest[()]{.muted} - + ::: {.signature} - -def DurbinWatsonTest( - dataset, model, threshold = {'cls': 'ExprList', 'elements': ['1.5', '2.5']}): - +def DurbinWatsonTest(dataset,model,threshold = {'cls': 'ExprList', 'elements': ['1.5', '2.5']}) ::: + + Assesses autocorrelation in time series data features using the Durbin-Watson statistic. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index 9ea0e580e..e7ea1383c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).GINITable" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## GINITable[()]{.muted} - + ::: {.signature} - -def GINITable( - dataset, model): - +def GINITable(dataset,model) ::: + + Evaluates classification model performance using AUC, GINI, and KS metrics for training and test datasets. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index e6cee4b08..06cbd8d3d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).KolmogorovSmirnov" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## KolmogorovSmirnov[()]{.muted} - + ::: {.signature} - -def KolmogorovSmirnov( - model: VMModel, dataset: VMDataset, dist: str = 'norm'): - +def KolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str = 'norm') ::: + + Assesses whether each feature in the dataset aligns with a normal distribution using the Kolmogorov-Smirnov test. ### Purpose @@ -45,13 +47,19 @@ This test calculates the KS statistic and corresponding p-value for each feature - Less effective for multivariate distributions, as it is designed for univariate distributions. - Does not identify specific types of non-normality, such as skewness or kurtosis, which could impact model fitting. + + ## [class]{.muted} InvalidTestParametersError - + + +::: {.signature} + +class InvalidTestParametersError() + +::: -```python -class InvalidTestParametersError(BaseError): -``` + When an invalid parameters for the test. diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 0def345b9..e522046de 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).Lilliefors" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## Lilliefors[()]{.muted} - + ::: {.signature} - -def Lilliefors(dataset: VMDataset): - +def Lilliefors(dataset:VMDataset) ::: + + Assesses the normality of feature distributions in an ML model's training dataset using the Lilliefors test. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index 0657f1a01..7ad3aa6d9 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).PredictionProbabilitiesHistogram" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## PredictionProbabilitiesHistogram[()]{.muted} - + ::: {.signature} - -def PredictionProbabilitiesHistogram( - dataset, model, title = 'Histogram of Predictive Probabilities'): - +def PredictionProbabilitiesHistogram(dataset,model,title = 'Histogram of Predictive Probabilities') ::: + + Assesses the predictive probability distribution for binary classification to evaluate model performance and potential overfitting or bias. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index f90901316..5b2100dc6 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -3,20 +3,23 @@ title: "[validmind](/reference/validmind.html).RegressionCoeffs" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## RegressionCoeffs[()]{.muted} - + ::: {.signature} - -def RegressionCoeffs(model): - +def RegressionCoeffs(model) ::: + + Assesses the significance and uncertainty of predictor variables in a regression model through visualization of coefficients and their 95% confidence intervals. ### Purpose @@ -44,13 +47,19 @@ The function operates by extracting the estimated coefficients and their standar - It does not address issues related to multi-collinearity among predictor variables, which can affect the interpretation of coefficients. - This metric is limited to regression tasks using tabular data and is not applicable to other types of machine learning tasks or data structures. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 9ac9dd9ee..9cf69ca22 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).RegressionFeatureSignificance" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## RegressionFeatureSignificance[()]{.muted} - + ::: {.signature} - -def RegressionFeatureSignificance( - model: VMModel, fontsize: int = 10, p_threshold: float = 0.05): - +def RegressionFeatureSignificance(model:VMModel,fontsize:int = 10,p_threshold:float = 0.05) ::: + + Assesses and visualizes the statistical significance of features in a regression model. ### Purpose @@ -60,13 +61,19 @@ The test mechanism involves extracting the model's coefficients and p-values for - This test is specific to regression models and wouldn't be suitable for other types of ML models. - P-value thresholds are somewhat arbitrary and do not always indicate practical significance, only statistical significance. + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 5c3b92a70..12f9a55f5 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).RegressionModelForecastPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## RegressionModelForecastPlot[()]{.muted} - + ::: {.signature} - -def RegressionModelForecastPlot( - model: VMModel, dataset: VMDataset, start_date: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None, end_date: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None): - +def RegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None,end_date:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None) ::: + + Generates plots to visually compare the forecasted outcomes of a regression model against actual observed values over a specified date range. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 7672c9825..067e8d618 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -3,34 +3,35 @@ title: "[validmind](/reference/validmind.html).RegressionModelForecastPlotLevels sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## integrate_diff[()]{.muted} - + ::: {.signature} - -def integrate_diff( - series_diff, start_value): - +def integrate_diff(series_diff,start_value) ::: + + ## RegressionModelForecastPlotLevels[()]{.muted} - + ::: {.signature} - -def RegressionModelForecastPlotLevels( - model: VMModel, dataset: VMDataset): - +def RegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset) ::: + + Assesses the alignment between forecasted and observed values in regression models through visual plots ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 580d25b66..1714354e8 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -3,49 +3,49 @@ title: "[validmind](/reference/validmind.html).RegressionModelSensitivityPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## integrate_diff[()]{.muted} - + ::: {.signature} - -def integrate_diff( - series_diff, start_value): - +def integrate_diff(series_diff,start_value) ::: + + ## RegressionModelSensitivityPlot[()]{.muted} - + ::: {.signature} - -def RegressionModelSensitivityPlot( - dataset: VMDataset, model: VMModel, shocks: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}} = {'cls': 'ExprList', 'elements': ['0.1']}, transformation: {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None): - +def RegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}} = {'cls': 'ExprList', 'elements': ['0.1']},transformation:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None) ::: + + Assesses the sensitivity of a regression model to changes in independent variables by applying shocks and visualizing the impact. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index a5de4b8cb..218722d52 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).RegressionModelSummary" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## adj_r2_score() - + ::: {.signature} - -def adj_r2_score( - actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: int, featurecount: int): - +def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) ::: + + Adjusted R2 Score + + ## RegressionModelSummary[()]{.muted} - + ::: {.signature} - -def RegressionModelSummary( - dataset: VMDataset, model: VMModel): - +def RegressionModelSummary(dataset:VMDataset,model:VMModel) ::: + + Evaluates regression model performance using metrics including R-Squared, Adjusted R-Squared, MSE, and RMSE. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 1caac1f0c..ce16ec5cc 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).RegressionPermutationFeatureImpor sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## get_logger() - + ::: {.signature} - -def get_logger( - name = 'validmind', log_level = None): - +def get_logger(name = 'validmind',log_level = None) ::: + + Get a logger for the given module name + + ## RegressionPermutationFeatureImportance[()]{.muted} - + ::: {.signature} - -def RegressionPermutationFeatureImportance( - dataset: VMDataset, model: VMModel, fontsize: int = 12, figure_height: int = 500): - +def RegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int = 12,figure_height:int = 500) ::: + + Assesses the significance of each feature in a model by evaluating the impact on model performance when feature values are randomly rearranged. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index c70a40691..55b8c3445 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -3,21 +3,23 @@ title: "[validmind](/reference/validmind.html).ScorecardHistogram" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## ScorecardHistogram[()]{.muted} - + ::: {.signature} - -def ScorecardHistogram( - dataset, title = 'Histogram of Scores', score_column = 'score'): - +def ScorecardHistogram(dataset,title = 'Histogram of Scores',score_column = 'score') ::: + + The Scorecard Histogram test evaluates the distribution of credit scores between default and non-default instances, providing critical insights into the performance and generalizability of credit-risk models. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index cd8a3bdb8..88407a521 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -3,19 +3,21 @@ title: "[validmind](/reference/validmind.html).statsutils" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## adj_r2_score[()]{.muted} - + ::: {.signature} - -def adj_r2_score( - actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}, rowcount: int, featurecount: int): - +def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) ::: + + Adjusted R2 Score diff --git a/docs/validmind/tests/prompt_validation.qmd b/docs/validmind/tests/prompt_validation.qmd index 503410fce..a3b348303 100644 --- a/docs/validmind/tests/prompt_validation.qmd +++ b/docs/validmind/tests/prompt_validation.qmd @@ -3,6 +3,7 @@ title: "[validmind](/reference/validmind.html).prompt_validation" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- - [ai_powered_test](prompt_validation/ai_powered_test.qmd) diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index be04fd45d..2b2c78713 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -3,35 +3,35 @@ title: "[validmind](/reference/validmind.html).Bias" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## call_model() - + ::: {.signature} - -def call_model( - system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): - +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: + + Call LLM with the given prompts and return the response ## get_explanation() - + ::: {.signature} - -def get_explanation(response: str): - +def get_explanation(response:str) ::: + + Get just the explanation from the response string TODO: use json response mode instead of this ``` @@ -42,16 +42,16 @@ Explanation: " -> "" ## get_score() - + ::: {.signature} - -def get_score(response: str): - +def get_score(response:str) ::: + + Get just the score from the response string TODO: use json response mode instead of this ``` @@ -60,19 +60,20 @@ e.g. "Score: 8 Explanation: " -> 8 + + ## Bias[()]{.muted} - + ::: {.signature} - -def Bias( - model, min_threshold = 7): - +def Bias(model,min_threshold = 7) ::: + + Assesses potential bias in a Large Language Model by analyzing the distribution and order of exemplars in the prompt. ### Purpose @@ -105,13 +106,19 @@ For each test case, the LLM grades the input prompt on a scale of 1 to 10. It ev - The test's effectiveness will decrease if the quality or balance of positive and negative exemplars is not representative of the problem space the model is intended to solve. - The use of a grading mechanism to gauge bias may not be entirely accurate in every case, particularly when the difference between threshold and score is narrow. + + ## [class]{.muted} MissingRequiredTestInputError - + -```python -class MissingRequiredTestInputError(BaseError): -``` +::: {.signature} + +class MissingRequiredTestInputError() + +::: + + When a required test context variable is missing. diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index f9d5adb15..b3a506f3e 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -3,35 +3,35 @@ title: "[validmind](/reference/validmind.html).Clarity" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## call_model() - + ::: {.signature} - -def call_model( - system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): - +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: + + Call LLM with the given prompts and return the response ## get_explanation() - + ::: {.signature} - -def get_explanation(response: str): - +def get_explanation(response:str) ::: + + Get just the explanation from the response string TODO: use json response mode instead of this ``` @@ -42,16 +42,16 @@ Explanation: " -> "" ## get_score() - + ::: {.signature} - -def get_score(response: str): - +def get_score(response:str) ::: + + Get just the score from the response string TODO: use json response mode instead of this ``` @@ -60,19 +60,20 @@ e.g. "Score: 8 Explanation: " -> 8 + + ## Clarity[()]{.muted} - + ::: {.signature} - -def Clarity( - model, min_threshold = 7): - +def Clarity(model,min_threshold = 7) ::: + + Evaluates and scores the clarity of prompts in a Large Language Model based on specified guidelines. ### Purpose @@ -100,13 +101,19 @@ The evaluation uses an LLM to scrutinize the clarity of prompts, factoring in co - The test assumes that all required factors (detail inclusion, persona adoption, step-by-step instructions, use of examples, and specification of output length) contribute equally to clarity, which might not always be the case - The evaluation may not be as effective if used on non-textual models + + ## [class]{.muted} MissingRequiredTestInputError - + -```python -class MissingRequiredTestInputError(BaseError): -``` +::: {.signature} + +class MissingRequiredTestInputError() + +::: + + When a required test context variable is missing. diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index aac462b1a..c66d22d88 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -3,35 +3,35 @@ title: "[validmind](/reference/validmind.html).Conciseness" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## call_model() - + ::: {.signature} - -def call_model( - system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): - +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: + + Call LLM with the given prompts and return the response ## get_explanation() - + ::: {.signature} - -def get_explanation(response: str): - +def get_explanation(response:str) ::: + + Get just the explanation from the response string TODO: use json response mode instead of this ``` @@ -42,16 +42,16 @@ Explanation: " -> "" ## get_score() - + ::: {.signature} - -def get_score(response: str): - +def get_score(response:str) ::: + + Get just the score from the response string TODO: use json response mode instead of this ``` @@ -60,19 +60,20 @@ e.g. "Score: 8 Explanation: " -> 8 + + ## Conciseness[()]{.muted} - + ::: {.signature} - -def Conciseness( - model, min_threshold = 7): - +def Conciseness(model,min_threshold = 7) ::: + + Analyzes and grades the conciseness of prompts provided to a Large Language Model. ### Purpose @@ -102,13 +103,19 @@ Using an LLM, this test conducts a conciseness analysis on input prompts. The an - The predefined threshold for conciseness could be subjective and might need adjustment based on application. - The test is dependent on the LLM’s understanding of conciseness, which might vary from model to model. + + ## [class]{.muted} MissingRequiredTestInputError - + -```python -class MissingRequiredTestInputError(BaseError): -``` +::: {.signature} + +class MissingRequiredTestInputError() + +::: + + When a required test context variable is missing. diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index dadcab89f..00748a168 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -3,35 +3,35 @@ title: "[validmind](/reference/validmind.html).Delimitation" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## call_model() - + ::: {.signature} - -def call_model( - system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): - +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: + + Call LLM with the given prompts and return the response ## get_explanation() - + ::: {.signature} - -def get_explanation(response: str): - +def get_explanation(response:str) ::: + + Get just the explanation from the response string TODO: use json response mode instead of this ``` @@ -42,16 +42,16 @@ Explanation: " -> "" ## get_score() - + ::: {.signature} - -def get_score(response: str): - +def get_score(response:str) ::: + + Get just the score from the response string TODO: use json response mode instead of this ``` @@ -60,19 +60,20 @@ e.g. "Score: 8 Explanation: " -> 8 + + ## Delimitation[()]{.muted} - + ::: {.signature} - -def Delimitation( - model, min_threshold = 7): - +def Delimitation(model,min_threshold = 7) ::: + + Evaluates the proper use of delimiters in prompts provided to Large Language Models. ### Purpose @@ -101,13 +102,19 @@ The test employs an LLM to examine prompts for appropriate use of delimiters suc - May not fully reveal the impacts of poor delimitation on the LLM's final performance. - The preset score threshold may not be refined enough for complex tasks and prompts, requiring regular manual adjustment. + + ## [class]{.muted} MissingRequiredTestInputError - + -```python -class MissingRequiredTestInputError(BaseError): -``` +::: {.signature} + +class MissingRequiredTestInputError() + +::: + + When a required test context variable is missing. diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 206a2b6f0..61071b34a 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -3,35 +3,35 @@ title: "[validmind](/reference/validmind.html).NegativeInstruction" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## call_model() - + ::: {.signature} - -def call_model( - system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): - +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: + + Call LLM with the given prompts and return the response ## get_explanation() - + ::: {.signature} - -def get_explanation(response: str): - +def get_explanation(response:str) ::: + + Get just the explanation from the response string TODO: use json response mode instead of this ``` @@ -42,16 +42,16 @@ Explanation: " -> "" ## get_score() - + ::: {.signature} - -def get_score(response: str): - +def get_score(response:str) ::: + + Get just the score from the response string TODO: use json response mode instead of this ``` @@ -60,19 +60,20 @@ e.g. "Score: 8 Explanation: " -> 8 + + ## NegativeInstruction[()]{.muted} - + ::: {.signature} - -def NegativeInstruction( - model, min_threshold = 7): - +def NegativeInstruction(model,min_threshold = 7) ::: + + Evaluates and grades the use of affirmative, proactive language over negative instructions in LLM prompts. ### Purpose @@ -101,13 +102,19 @@ An LLM is employed to evaluate each prompt. The prompt is graded based on its us - A numeric scoring system, while straightforward, may oversimplify complex issues related to prompt designing and instruction clarity. - The effectiveness of the test hinges significantly on the predetermined threshold level, which can be subjective and may need to be adjusted according to specific use-cases. + + ## [class]{.muted} MissingRequiredTestInputError - + -```python -class MissingRequiredTestInputError(BaseError): -``` +::: {.signature} + +class MissingRequiredTestInputError() + +::: + + When a required test context variable is missing. diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 4c267812a..70352310e 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -3,36 +3,37 @@ title: "[validmind](/reference/validmind.html).Robustness" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## call_model() - + ::: {.signature} - -def call_model( - system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): - +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: + + Call LLM with the given prompts and return the response + + ## Robustness[()]{.muted} - + ::: {.signature} - -def Robustness( - model, dataset, num_tests = 10): - +def Robustness(model,dataset,num_tests = 10) ::: + + Assesses the robustness of prompts provided to a Large Language Model under varying conditions and contexts. This test specifically measures the model's ability to generate correct classifications with the given prompt even when the inputs are edge cases or otherwise difficult to classify. ### Purpose @@ -60,13 +61,19 @@ The Robustness test appraises prompts under various conditions, alterations, and - When there are too many target classes (over 10), the test is skipped, which can leave potential vulnerabilities unchecked in complex multi-class models. - The test may not account for all potential conditions or alterations that could show up in practical use scenarios. + + ## [class]{.muted} MissingRequiredTestInputError - + -```python -class MissingRequiredTestInputError(BaseError): -``` +::: {.signature} + +class MissingRequiredTestInputError() + +::: + + When a required test context variable is missing. @@ -75,13 +82,19 @@ When a required test context variable is missing. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + + ## [class]{.muted} SkipTestError - + + +::: {.signature} + +class SkipTestError() + +::: -```python -class SkipTestError(BaseError): -``` + Useful error to throw when a test cannot be executed. diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index ffb45a313..32b847457 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -3,35 +3,35 @@ title: "[validmind](/reference/validmind.html).Specificity" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- ## call_model() - + ::: {.signature} - -def call_model( - system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): - +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: + + Call LLM with the given prompts and return the response ## get_explanation() - + ::: {.signature} - -def get_explanation(response: str): - +def get_explanation(response:str) ::: + + Get just the explanation from the response string TODO: use json response mode instead of this ``` @@ -42,16 +42,16 @@ Explanation: " -> "" ## get_score() - + ::: {.signature} - -def get_score(response: str): - +def get_score(response:str) ::: + + Get just the score from the response string TODO: use json response mode instead of this ``` @@ -60,19 +60,20 @@ e.g. "Score: 8 Explanation: " -> 8 + + ## Specificity[()]{.muted} - + ::: {.signature} - -def Specificity( - model, min_threshold = 7): - +def Specificity(model,min_threshold = 7) ::: + + Evaluates and scores the specificity of prompts provided to a Large Language Model (LLM), based on clarity, detail, and relevance. ### Purpose @@ -101,13 +102,19 @@ The Specificity Test employs an LLM to grade each prompt based on clarity, detai - High specificity score doesn't guarantee a high-quality response from the LLM, as the model's performance is also dependent on various other factors - Striking a balance between specificity and verbosity can be challenging, as overly detailed prompts might confuse or mislead the model + + ## [class]{.muted} MissingRequiredTestInputError - + -```python -class MissingRequiredTestInputError(BaseError): -``` +::: {.signature} + +class MissingRequiredTestInputError() + +::: + + When a required test context variable is missing. diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index edf83f804..863a7feb8 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -3,35 +3,39 @@ title: "[validmind](/reference/validmind.html).ai_powered_test" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## call_model[()]{.muted} - + ::: {.signature} - -def call_model( - system_prompt: str, user_prompt: str, temperature: float = 0.0, seed: int = 42): - +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: + + Call LLM with the given prompts and return the response + + ## get_explanation[()]{.muted} - + ::: {.signature} - -def get_explanation(response: str): - +def get_explanation(response:str) ::: + + Get just the explanation from the response string TODO: use json response mode instead of this ``` @@ -40,18 +44,20 @@ e.g. "Score: 8 Explanation: " -> "" + + ## get_score[()]{.muted} - + ::: {.signature} - -def get_score(response: str): - +def get_score(response:str) ::: + + Get just the score from the response string TODO: use json response mode instead of this ``` diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 2c93eed90..30d9d6ce0 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -3,48 +3,53 @@ title: "[validmind](/reference/validmind.html).unit_metrics" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + ## describe_metric[()]{.muted} - + ::: {.signature} - -def describe_metric( - metric_id: str, kwargs = {}): - +def describe_metric(metric_id:str,kwargs = {}) ::: + + Describe a metric + + ## list_metrics[()]{.muted} - + ::: {.signature} - -def list_metrics(kwargs = {}): - +def list_metrics(kwargs={}) ::: + + List all metrics + + ## run_metric[()]{.muted} - + ::: {.signature} - -def run_metric( - metric_id: str, kwargs = {}): - +def run_metric(metric_id:str,kwargs = {}) ::: + + Run a metric diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 07137695d..b5f778cfc 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -3,94 +3,114 @@ title: "[validmind](/reference/validmind.html).vm_models" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 +# module.qmd.jinja2 --- + + Models entrypoint + + ## [class]{.muted} Figure - + -```python -class Figure(): -``` +::: {.signature} + +class Figure() + +::: + + Figure objects track the schema supported by the ValidMind API ### [serialize[()]{.muted}](#serialize) - + ::: {.signature} - -def serialize(self): - +def serialize(self) ::: + + Serializes the Figure to a dictionary so it can be sent to the API ### [serialize_files[()]{.muted}](#serialize_files) - + ::: {.signature} - -def serialize_files(self): - +def serialize_files(self) ::: + + Creates a `requests`-compatible files object to be sent to the API ### [to_widget[()]{.muted}](#to_widget) - + ::: {.signature} - -def to_widget(self): - +def to_widget(self) ::: + + Returns the ipywidget compatible representation of the figure. Ideally we would render images as-is, but Plotly FigureWidgets don't work well on Google Colab when they are combined with ipywidgets. + + ## [class]{.muted} ModelAttributes - + + +::: {.signature} + +class ModelAttributes() + +::: -```python -class ModelAttributes(): -``` + Model attributes definition ### [from_dict[()]{.muted}](#from_dict) - + ::: {.signature} - -def from_dict( - cls, data): - +def from_dict(cls,data) ::: + + Creates a ModelAttributes instance from a dictionary + + ## [class]{.muted} TestSuite - + + +::: {.signature} -```python -class TestSuite(): -``` +class TestSuite() + +::: + + Base class for test suites. Test suites are used to define a grouping of tests that can be run as a suite against datasets and models. Test Suites can be defined by inheriting from this base class and defining the list of tests as a class variable. @@ -98,16 +118,16 @@ Tests can be a flat list of strings or may be nested into sections by using a di ### [get_default_config[()]{.muted}](#get_default_config) - + ::: {.signature} - -def get_default_config(self) -> dict: - +def get_default_config(self)dict: ::: + + Returns the default configuration for the test suite Each test in a test suite can accept parameters and those parameters can have default values. Both the parameters and their defaults are set in the test class and a config object can be passed to the test suite's run method to override the defaults. This function returns a dictionary containing the parameters and their default values for every test to allow users to view and set values **Returns** @@ -116,69 +136,74 @@ Returns the default configuration for the test suite Each test in a test suite c ### [get_tests[()]{.muted}](#get_tests) - + ::: {.signature} - -def get_tests(self) -> {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}: - +def get_tests(self){'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}: ::: + + Get all test suite test objects from all sections ### [num_tests[()]{.muted}](#num_tests) - + ::: {.signature} - -def num_tests(self) -> int: - +def num_tests(self)int: ::: + + Returns the total number of tests in the test suite + + ## [class]{.muted} TestSuiteRunner - + + +::: {.signature} + +class TestSuiteRunner() -```python -class TestSuiteRunner(): -``` +::: + + Runs a test suite ### [log_results[()]{.muted}](#log_results) - + ::: {.signature} - -def log_results(self): - +def log_results(self) ::: + + Logs the results of the test suite to ValidMind This method will be called after the test suite has been run and all results have been collected. This method will log the results to ValidMind. ### [run[()]{.muted}](#run) - + ::: {.signature} - -def run( - self, send: bool = True, fail_fast: bool = False): - +def run(self,send:bool = True,fail_fast:bool = False) ::: + + Runs the test suite, renders the summary and sends the results to ValidMind **Parameters** @@ -188,24 +213,27 @@ Runs the test suite, renders the summary and sends the results to ValidMind ### [summarize[()]{.muted}](#summarize) - + ::: {.signature} - -def summarize( - self, show_link: bool = True): - +def summarize(self,show_link:bool = True) ::: + + ## [class]{.muted} VMDataset - + + +::: {.signature} -```python -class VMDataset(VMInput): -``` +class VMDataset() + +::: + + Base class for VM datasets Child classes should be used to support new dataset types (tensor, polars etc) by converting the user's dataset into a numpy array collecting metadata like column names and then call this (parent) class `__init__` method. @@ -230,17 +258,16 @@ This way we can support multiple dataset types but under the hood we only need t ### [add_extra_column[()]{.muted}](#add_extra_column) - + ::: {.signature} - -def add_extra_column( - self, column_name, column_values = None): - +def add_extra_column(self,column_name,column_values = None) ::: + + Adds an extra column to the dataset without modifying the dataset `features` and `target` columns. **Parameters** @@ -250,17 +277,16 @@ Adds an extra column to the dataset without modifying the dataset `features` and ### [assign_predictions[()]{.muted}](#assign_predictions) - + ::: {.signature} - -def assign_predictions( - self, model: VMModel, prediction_column: str = None, prediction_values: list = None, probability_column: str = None, probability_values: list = None, prediction_probabilities: list = None, kwargs = {}): - +def assign_predictions(self,model:VMModel,prediction_column:str = None,prediction_values:list = None,probability_column:str = None,probability_values:list = None,prediction_probabilities:list = None,kwargs = {}) ::: + + Assign predictions and probabilities to the dataset. **Parameters** @@ -275,61 +301,58 @@ Assign predictions and probabilities to the dataset. ### [prediction_column[()]{.muted}](#prediction_column) - + ::: {.signature} - -def prediction_column( - self, model: VMModel, column_name: str = None) -> str: - +def prediction_column(self,model:VMModel,column_name:str = None)str: ::: + + Get or set the prediction column for a model. ### [probability_column[()]{.muted}](#probability_column) - + ::: {.signature} - -def probability_column( - self, model: VMModel, column_name: str = None) -> str: - +def probability_column(self,model:VMModel,column_name:str = None)str: ::: + + Get or set the probability column for a model. ### [target_classes[()]{.muted}](#target_classes) - + ::: {.signature} - -def target_classes(self): - +def target_classes(self) ::: + + Returns the target class labels or unique values of the target column. ### [with_options[()]{.muted}](#with_options) - + ::: {.signature} - -def with_options( - self, kwargs = {}) -> VMDataset: - +def with_options(self,kwargs = {})VMDataset: ::: + + Support options provided when passing an input to run_test or run_test_suite **Parameters** @@ -343,45 +366,44 @@ Support options provided when passing an input to run_test or run_test_suite ### [x_df[()]{.muted}](#x_df) - + ::: {.signature} - -def x_df(self): - +def x_df(self) ::: + + Returns a dataframe containing only the feature columns ### [y_df[()]{.muted}](#y_df) - + ::: {.signature} - -def y_df(self) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: - +def y_df(self){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: + + Returns a dataframe containing the target column ### [y_pred[()]{.muted}](#y_pred) - + ::: {.signature} - -def y_pred( - self, model) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: - +def y_pred(self,model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: ::: + + Returns the predictions for a given model. Attempts to stack complex prediction types (e.g., embeddings) into a single, multi-dimensional array. **Parameters** @@ -394,32 +416,30 @@ Returns the predictions for a given model. Attempts to stack complex prediction ### [y_pred_df[()]{.muted}](#y_pred_df) - + ::: {.signature} - -def y_pred_df( - self, model) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: - +def y_pred_df(self,model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: + + Returns a dataframe containing the predictions for a given model ### [y_prob[()]{.muted}](#y_prob) - + ::: {.signature} - -def y_prob( - self, model) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: - +def y_prob(self,model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: ::: + + Returns the probabilities for a given model. **Parameters** @@ -432,26 +452,31 @@ Returns the probabilities for a given model. ### [y_prob_df[()]{.muted}](#y_prob_df) - + ::: {.signature} - -def y_prob_df( - self, model) -> {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: - +def y_prob_df(self,model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: + + Returns a dataframe containing the probabilities for a given model + + ## [class]{.muted} VMInput - + -```python -class VMInput(ABC): -``` +::: {.signature} + +class VMInput() + +::: + + Base class for ValidMind Input types @@ -459,17 +484,16 @@ Base class for ValidMind Input types ### [with_options[()]{.muted}](#with_options) - + ::: {.signature} - -def with_options( - self, kwargs = {}) -> VMInput: - +def with_options(self,kwargs = {})VMInput: ::: + + Allows for setting options on the input object that are passed by the user when using the input to run a test or set of tests To allow options, just override this method in the subclass (see VMDataset) and ensure that it returns a new instance of the input with the specified options set. @@ -482,13 +506,19 @@ To allow options, just override this method in the subclass (see VMDataset) and - A new instance of the input with the specified options set + + ## [class]{.muted} VMModel - + -```python -class VMModel(VMInput): -``` +::: {.signature} + +class VMModel() + +::: + + An base class that wraps a trained model instance and its associated data. @@ -503,44 +533,42 @@ An base class that wraps a trained model instance and its associated data. ### [predict[()]{.muted}](#predict) - + ::: {.signature} - -def predict( - self, args = (), kwargs = {}): - +def predict(self,args = (),kwargs = {}) ::: + + Predict method for the model. This is a wrapper around the model's ### [predict_proba[()]{.muted}](#predict_proba) - + ::: {.signature} - -def predict_proba( - self, args = (), kwargs = {}): - +def predict_proba(self,args = (),kwargs = {}) ::: + + Predict probabilties - must be implemented by subclass if needed ### [serialize[()]{.muted}](#serialize) - + ::: {.signature} - -def serialize(self): - +def serialize(self) ::: + + Serializes the model to a dictionary so it can be sent to the API From ede3cf630eee27ba275154768f2df6d8dc332e7b Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 2 Feb 2025 14:01:23 -0800 Subject: [PATCH 049/207] Remove dead code --- scripts/generate_quarto_docs.py | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 17ef67af0..1fd54e77e 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -513,36 +513,6 @@ def get_inherited_members(base: Dict[str, Any], full_data: Dict[str, Any]) -> Li return members -def generate_module_doc(module, full_data, env, output_dir): - """Generate documentation for a module.""" - is_errors = module.get('name') == 'errors' - - # Choose template based on module name - template = env.get_template('errors.qmd.jinja2' if is_errors else 'module.qmd.jinja2') - - # For errors module, filter to only include classes and skip module-level functions - if is_errors: - filtered_members = { - name: member for name, member in module.get('members', {}).items() - if member.get('kind') == 'class' - } - else: - filtered_members = module.get('members', {}) - - # Generate documentation - output = template.render( - module=module, - members=filtered_members, - full_data=full_data, - doc=doc_utils, - is_errors_module=is_errors - ) - - # Write output - output_path = os.path.join(output_dir, f"{module['name']}.qmd") - with open(output_path, 'w') as f: - f.write(output) - def get_child_files(files_dict: Dict[str, str], module_name: str) -> List[Dict[str, Any]]: """Get all child QMD files for a given module.""" prefix = f'docs/validmind/{module_name}/' From b35a72da3fd3b9bfce68ae2083c6e103078e4213 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 2 Feb 2025 15:30:07 -0800 Subject: [PATCH 050/207] More signatures fine-tuning --- docs/templates/macros/signatures.jinja2 | 54 +++++++++--- docs/templates/version.qmd.jinja2 | 10 ++- docs/validmind.qmd | 36 ++++---- .../classification/customer_churn.qmd | 12 +-- .../datasets/classification/taiwan_credit.qmd | 10 +-- .../datasets/credit_risk/lending_club.qmd | 20 ++--- .../credit_risk/lending_club_bias.qmd | 8 +- docs/validmind/datasets/nlp/cnn_dailymail.qmd | 4 +- .../datasets/nlp/twitter_covid_19.qmd | 2 +- docs/validmind/datasets/regression/fred.qmd | 16 ++-- .../datasets/regression/lending_club.qmd | 6 +- docs/validmind/errors.qmd | 88 +++++++++---------- docs/validmind/test_suites.qmd | 74 ++++++++-------- docs/validmind/test_suites/classifier.qmd | 14 +-- docs/validmind/test_suites/cluster.qmd | 8 +- docs/validmind/test_suites/embeddings.qmd | 6 +- docs/validmind/test_suites/llm.qmd | 12 +-- docs/validmind/test_suites/nlp.qmd | 10 +-- .../test_suites/parameters_optimization.qmd | 2 +- docs/validmind/test_suites/regression.qmd | 10 +-- .../test_suites/statsmodels_timeseries.qmd | 4 +- docs/validmind/test_suites/summarization.qmd | 2 +- .../test_suites/tabular_datasets.qmd | 6 +- docs/validmind/test_suites/text_data.qmd | 2 +- docs/validmind/test_suites/time_series.qmd | 14 +-- docs/validmind/tests.qmd | 36 ++++---- .../tests/data_validation/ACFandPACFPlot.qmd | 2 +- docs/validmind/tests/data_validation/ADF.qmd | 4 +- .../tests/data_validation/AutoAR.qmd | 4 +- .../tests/data_validation/AutoMA.qmd | 4 +- .../data_validation/AutoStationarity.qmd | 2 +- .../data_validation/BivariateScatterPlots.qmd | 2 +- .../tests/data_validation/BoxPierce.qmd | 2 +- .../ChiSquaredFeaturesTable.qmd | 4 +- .../tests/data_validation/ClassImbalance.qmd | 4 +- .../data_validation/DatasetDescription.qmd | 14 +-- .../tests/data_validation/DatasetSplit.qmd | 2 +- .../data_validation/DescriptiveStatistics.qmd | 10 +-- .../tests/data_validation/DickeyFullerGLS.qmd | 6 +- .../tests/data_validation/Duplicates.qmd | 2 +- .../data_validation/EngleGrangerCoint.qmd | 4 +- .../FeatureTargetCorrelationPlot.qmd | 2 +- .../tests/data_validation/HighCardinality.qmd | 2 +- .../HighPearsonCorrelation.qmd | 2 +- .../data_validation/IQROutliersBarPlot.qmd | 4 +- .../data_validation/IQROutliersTable.qmd | 4 +- .../IsolationForestOutliers.qmd | 2 +- .../tests/data_validation/JarqueBera.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 6 +- .../tests/data_validation/LJungBox.qmd | 2 +- .../LaggedCorrelationHeatmap.qmd | 2 +- .../tests/data_validation/MissingValues.qmd | 2 +- .../data_validation/MissingValuesBarPlot.qmd | 2 +- .../data_validation/MutualInformation.qmd | 2 +- .../PearsonCorrelationMatrix.qmd | 2 +- .../data_validation/PhillipsPerronArch.qmd | 6 +- .../ProtectedClassesCombination.qmd | 6 +- .../ProtectedClassesDescription.qmd | 4 +- .../ProtectedClassesDisparity.qmd | 6 +- .../ProtectedClassesThresholdOptimizer.qmd | 18 ++-- .../data_validation/RollingStatsPlot.qmd | 6 +- .../tests/data_validation/RunsTest.qmd | 2 +- .../tests/data_validation/ScatterPlot.qmd | 2 +- .../data_validation/ScoreBandDefaultRates.qmd | 2 +- .../data_validation/SeasonalDecompose.qmd | 6 +- .../tests/data_validation/ShapiroWilk.qmd | 2 +- .../tests/data_validation/Skewness.qmd | 2 +- .../tests/data_validation/SpreadPlot.qmd | 4 +- .../TabularCategoricalBarPlots.qmd | 4 +- .../TabularDateTimeHistograms.qmd | 4 +- .../TabularDescriptionTables.qmd | 14 +-- .../TabularNumericalHistograms.qmd | 2 +- .../data_validation/TargetRateBarPlots.qmd | 4 +- .../data_validation/TimeSeriesDescription.qmd | 2 +- .../TimeSeriesDescriptiveStatistics.qmd | 2 +- .../data_validation/TimeSeriesFrequency.qmd | 4 +- .../data_validation/TimeSeriesHistogram.qmd | 4 +- .../data_validation/TimeSeriesLinePlot.qmd | 4 +- .../TimeSeriesMissingValues.qmd | 4 +- .../data_validation/TimeSeriesOutliers.qmd | 4 +- .../data_validation/TooManyZeroValues.qmd | 2 +- .../tests/data_validation/UniqueRows.qmd | 2 +- .../tests/data_validation/WOEBinPlots.qmd | 6 +- .../tests/data_validation/WOEBinTable.qmd | 4 +- .../data_validation/ZivotAndrewsArch.qmd | 6 +- .../tests/data_validation/nlp/CommonWords.qmd | 2 +- .../tests/data_validation/nlp/Hashtags.qmd | 4 +- .../data_validation/nlp/LanguageDetection.qmd | 2 +- .../tests/data_validation/nlp/Mentions.qmd | 4 +- .../nlp/PolarityAndSubjectivity.qmd | 2 +- .../data_validation/nlp/Punctuations.qmd | 2 +- .../tests/data_validation/nlp/Sentiment.qmd | 2 +- .../tests/data_validation/nlp/StopWords.qmd | 2 +- .../data_validation/nlp/TextDescription.qmd | 4 +- .../tests/data_validation/nlp/Toxicity.qmd | 2 +- .../tests/model_validation/BertScore.qmd | 4 +- .../tests/model_validation/BleuScore.qmd | 4 +- .../ClusterSizeDistribution.qmd | 2 +- .../model_validation/ContextualRecall.qmd | 4 +- .../tests/model_validation/FeaturesAUC.qmd | 6 +- .../tests/model_validation/MeteorScore.qmd | 4 +- .../tests/model_validation/ModelMetadata.qmd | 4 +- .../ModelPredictionResiduals.qmd | 2 +- .../tests/model_validation/RegardScore.qmd | 4 +- .../RegressionResidualsPlot.qmd | 2 +- .../tests/model_validation/RougeScore.qmd | 2 +- .../TimeSeriesPredictionWithCI.qmd | 2 +- .../TimeSeriesPredictionsPlot.qmd | 2 +- .../TimeSeriesR2SquareBySegments.qmd | 2 +- .../tests/model_validation/TokenDisparity.qmd | 2 +- .../tests/model_validation/ToxicityScore.qmd | 2 +- .../sklearn/AdjustedMutualInformation.qmd | 2 +- .../sklearn/AdjustedRandIndex.qmd | 2 +- .../sklearn/CalibrationCurve.qmd | 2 +- .../sklearn/ClassifierPerformance.qmd | 4 +- .../ClassifierThresholdOptimization.qmd | 4 +- .../sklearn/ClusterCosineSimilarity.qmd | 4 +- .../sklearn/ClusterPerformanceMetrics.qmd | 2 +- .../sklearn/CompletenessScore.qmd | 2 +- .../sklearn/ConfusionMatrix.qmd | 2 +- .../sklearn/FeatureImportance.qmd | 2 +- .../sklearn/FowlkesMallowsScore.qmd | 2 +- .../sklearn/HomogeneityScore.qmd | 2 +- .../sklearn/HyperParametersTuning.qmd | 4 +- .../sklearn/KMeansClustersOptimization.qmd | 4 +- .../sklearn/MinimumAccuracy.qmd | 2 +- .../sklearn/MinimumF1Score.qmd | 2 +- .../sklearn/MinimumROCAUCScore.qmd | 2 +- .../sklearn/ModelParameters.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 4 +- .../sklearn/OverfitDiagnosis.qmd | 4 +- .../sklearn/PermutationFeatureImportance.qmd | 6 +- .../sklearn/PopulationStabilityIndex.qmd | 8 +- .../sklearn/PrecisionRecallCurve.qmd | 4 +- .../model_validation/sklearn/ROCCurve.qmd | 4 +- .../sklearn/RegressionErrors.qmd | 2 +- .../sklearn/RegressionErrorsComparison.qmd | 4 +- .../sklearn/RegressionPerformance.qmd | 4 +- .../sklearn/RegressionR2Square.qmd | 4 +- .../sklearn/RegressionR2SquareComparison.qmd | 4 +- .../sklearn/RobustnessDiagnosis.qmd | 6 +- .../sklearn/SHAPGlobalImportance.qmd | 10 +-- .../sklearn/ScoreProbabilityAlignment.qmd | 2 +- .../sklearn/SilhouettePlot.qmd | 2 +- .../sklearn/TrainingTestDegradation.qmd | 2 +- .../model_validation/sklearn/VMeasure.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 2 +- .../statsmodels/AutoARIMA.qmd | 4 +- .../CumulativePredictionProbabilities.qmd | 2 +- .../statsmodels/DurbinWatsonTest.qmd | 2 +- .../statsmodels/GINITable.qmd | 2 +- .../statsmodels/KolmogorovSmirnov.qmd | 4 +- .../statsmodels/Lilliefors.qmd | 2 +- .../PredictionProbabilitiesHistogram.qmd | 2 +- .../statsmodels/RegressionCoeffs.qmd | 4 +- .../RegressionFeatureSignificance.qmd | 6 +- .../RegressionModelForecastPlot.qmd | 4 +- .../RegressionModelForecastPlotLevels.qmd | 4 +- .../RegressionModelSensitivityPlot.qmd | 6 +- .../statsmodels/RegressionModelSummary.qmd | 4 +- ...RegressionPermutationFeatureImportance.qmd | 4 +- .../statsmodels/ScorecardHistogram.qmd | 2 +- .../statsmodels/statsutils.qmd | 2 +- .../tests/prompt_validation/Bias.qmd | 10 +-- .../tests/prompt_validation/Clarity.qmd | 10 +-- .../tests/prompt_validation/Conciseness.qmd | 10 +-- .../tests/prompt_validation/Delimitation.qmd | 10 +-- .../prompt_validation/NegativeInstruction.qmd | 10 +-- .../tests/prompt_validation/Robustness.qmd | 8 +- .../tests/prompt_validation/Specificity.qmd | 10 +-- .../prompt_validation/ai_powered_test.qmd | 6 +- docs/validmind/unit_metrics.qmd | 6 +- docs/validmind/version.qmd | 10 ++- docs/validmind/vm_models.qmd | 66 +++++++------- 174 files changed, 573 insertions(+), 537 deletions(-) diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index 8c1a8c7a2..d48c1d7f3 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -1,3 +1,21 @@ +{%- macro extract_type(annotation) -%} + {%- if annotation is mapping -%} + {%- if 'name' in annotation -%} + {{ annotation.name }} + {%- elif 'slice' in annotation -%} + {{ extract_type(annotation.slice) }} + {%- elif 'left' in annotation and 'slice' in annotation -%} + {{ extract_type(annotation.left) }}[{{ extract_type(annotation.slice) }}] + {%- elif 'elements' in annotation -%} + {{ annotation.elements | map(attribute='name') | join(', ') }} + {%- else -%} + {{ annotation }} + {%- endif -%} + {%- else -%} + {{ annotation }} + {%- endif -%} +{%- endmacro -%} + {%- macro render_signature(member) -%} ::: {.signature} @@ -8,21 +26,21 @@ {%- else -%}{{ member.kind }} {%- endif -%} -{{ member.name }}{%- if member.parameters -%}( - {%- if member.parameters|length == 1 -%} +{{ member.name }}{%- if member.parameters -%}({{- '' -}} + {%- if member.parameters | length == 1 -%} {{ member.parameters[0].name }} {%- if member.parameters[0].annotation -%} - :{{ member.parameters[0].annotation['name'] if member.parameters[0].annotation is mapping and 'name' in member.parameters[0].annotation else member.parameters[0].annotation }} + :{{ extract_type(member.parameters[0].annotation) }} {%- endif -%} {%- if member.parameters[0].default is not none -%} - ={{ member.parameters[0].default }} + = {{ member.parameters[0].default }} {%- endif -%} {%- else -%} {%- for param in member.parameters -%} - {{ param.name }} + {{ param.name }} {%- if param.annotation -%} - :{{ param.annotation['name'] if param.annotation is mapping and 'name' in param.annotation else param.annotation }} + :{{ extract_type(param.annotation) }} {%- endif -%} {%- if param.default is not none -%} = {{ param.default }} @@ -30,13 +48,27 @@ {%- if not loop.last -%},{%- endif -%} {%- endfor -%} - {%- endif -%} -){%- else -%}(){%- endif -%}{%- if member.returns -%} + {%- endif -%}) + {%- else -%}() +{%- endif -%} +{%- if member.returns -%} - {%- set return_name = member.returns['name'] if member.returns is mapping and 'name' in member.returns else member.returns -%} - {{ return_name }}: + {%- if member.returns is mapping -%} + {%- if 'values' in member.returns and member.returns.values is iterable -%} + {# Handle np.ndarray case #} + {{- member.returns.values | map(attribute='name') | join('.') -}} + {%- elif 'name' in member.returns -%} + {%- if member.returns.name in ['str', 'dict', 'list', 'bool', 'int', 'float'] -%} + {{- member.returns.name -}} + {%- else -%} + validmind.vm_models.{{ member.returns.name }} + {%- endif -%} + {%- endif -%} + {%- else -%} + {{- member.returns -}} + {%- endif -%} -{%- endif -%} +{%- endif +%} ::: {%- endmacro -%} \ No newline at end of file diff --git a/docs/templates/version.qmd.jinja2 b/docs/templates/version.qmd.jinja2 index 461452469..6c98589e5 100644 --- a/docs/templates/version.qmd.jinja2 +++ b/docs/templates/version.qmd.jinja2 @@ -3,7 +3,9 @@ title: "[validmind](/reference/validmind.html).__version__" sidebar: validmind-reference --- - -```python -{{ module.members.__version__.value | replace("'", "") if module.members.__version__.value else module.members.__version__.members.__version__.value | replace("'", "") }} -``` + +::: {.signature} + +{{ module.members.__version__.value | replace("'", "") if module.members.__version__.value else module.members.__version__.members.__version__.value | replace("'", "") }} + +::: diff --git a/docs/validmind.qmd b/docs/validmind.qmd index eb01fc40a..a2a5211fa 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -53,7 +53,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -def get_test_suite(test_suite_id:str = None,section:str = None,args = (),kwargs = {})TestSuite: +def get_test_suite(test_suite_id:str = None,section:str = None,args = (),kwargs = {})validmind.vm_models.TestSuite ::: @@ -74,7 +74,7 @@ Gets a TestSuite object for the current project or a specific test suite This fu ::: {.signature} -def init(project:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None,api_key:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None,api_secret:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None,api_host:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None,model:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None,monitoring:bool = False,generate_descriptions:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'bool'}} = None) +def init(project:str = None,api_key:str = None,api_secret:str = None,api_host:str = None,model:str = None,monitoring:bool = False,generate_descriptions:bool = None) ::: @@ -104,7 +104,7 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -def init_dataset(dataset,model = None,index = None,index_name:str = None,date_time_index:bool = False,columns:list = None,text_column:str = None,target_column:str = None,feature_columns:list = None,extra_columns:dict = None,class_labels:dict = None,type:str = None,input_id:str = None,\_\_log = True)VMDataset: +def init_dataset(dataset,model = None,index = None,index_name:str = None,date_time_index:bool = False,columns:list = None,text_column:str = None,target_column:str = None,feature_columns:list = None,extra_columns:dict = None,class_labels:dict = None,type:str = None,input_id:str = None,\_\_log = True)validmind.vm_models.VMDataset ::: @@ -131,7 +131,7 @@ Returns: vm.vm.Dataset: A VM Dataset instance ::: {.signature} -def init_model(model:object = None,input_id:str = 'model',attributes:dict = None,predict_fn:callable = None,\_\_log = True,kwargs = {})VMModel: +def init_model(model:object = None,input_id:str = 'model',attributes:dict = None,predict_fn:callable = None,\_\_log = True,kwargs = {})validmind.vm_models.VMModel ::: @@ -161,7 +161,7 @@ Initializes a VM Model, which can then be passed to other functions that can per ::: {.signature} -def init_r_model(model_path:str,input_id:str = 'model')VMModel: +def init_r_model(model_path:str,input_id:str = 'model')validmind.vm_models.VMModel ::: @@ -191,7 +191,7 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ::: {.signature} -def log_metric(key:str,value:float,inputs:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}} = None,params:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}} = None,recorded_at:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None,thresholds:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}} = None) +def log_metric(key:str,value:float,inputs:str = None,params:str, Any = None,recorded_at:str = None,thresholds:str, Any = None) ::: @@ -214,7 +214,7 @@ Logs a unit metric Unit metrics are key-value pairs where the key is the metric ::: {.signature} -def preview_template() +def preview_template() ::: @@ -232,7 +232,7 @@ Preview the documentation template for the current project This function will di ::: {.signature} -def print_env() +def print_env() ::: @@ -246,7 +246,7 @@ Prints a log of the running environment for debugging. Output includes: ValidMin ::: {.signature} -def reload() +def reload() ::: @@ -260,7 +260,7 @@ Reconnect to the ValidMind API and reload the project configuration ::: {.signature} -def run_documentation_tests(section = None,send = True,fail_fast = False,inputs = None,config = None,kwargs = {}) +def run_documentation_tests(section = None,send = True,fail_fast = False,inputs = None,config = None,kwargs = {}) ::: @@ -291,7 +291,7 @@ Collect and run all the tests associated with a template This function will anal ::: {.signature} -def run_test_suite(test_suite_id,send = True,fail_fast = False,config = None,inputs = None,kwargs = {}) +def run_test_suite(test_suite_id,send = True,fail_fast = False,config = None,inputs = None,kwargs = {}) ::: @@ -322,7 +322,7 @@ High Level function for running a test suite This function provides a high level ::: {.signature} -def tags(tags=()) +def tags(tags = ()) ::: @@ -340,7 +340,7 @@ Decorator for specifying tags for a test. ::: {.signature} -def tasks(tasks=()) +def tasks(tasks = ()) ::: @@ -358,7 +358,7 @@ Decorator for specifying the task types that a test is designed for. ::: {.signature} -def test(func_or_id) +def test(func_or_id) ::: @@ -397,7 +397,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -class RawData() +class RawData() ::: @@ -411,7 +411,7 @@ Holds raw data for a test result ::: {.signature} -def __init__(self,log:bool = False,kwargs = {}) +def __init__(self,log:bool = False,kwargs = {}) ::: @@ -430,7 +430,7 @@ Create a new RawData object ::: {.signature} -def inspect(self,show:bool = True) +def inspect(self,show:bool = True) ::: @@ -444,6 +444,6 @@ Inspect the raw data ::: {.signature} -def serialize(self) +def serialize(self) ::: diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index e5b33b1e4..2b532841a 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def simple_preprocess_booleans(df,columns) +def simple_preprocess_booleans(df,columns) ::: @@ -35,7 +35,7 @@ Preprocess boolean columns. ::: {.signature} -def simple_preprocess_categoricals(df,columns) +def simple_preprocess_categoricals(df,columns) ::: @@ -58,7 +58,7 @@ Preprocess categorical columns. ::: {.signature} -def simple_preprocess_numericals(df,columns) +def simple_preprocess_numericals(df,columns) ::: @@ -83,7 +83,7 @@ Preprocess numerical columns. ::: {.signature} -def get_demo_test_config(test_suite=None) +def get_demo_test_config(test_suite = None) ::: @@ -114,7 +114,7 @@ We assign the following inputs depending on the input config expected by each te ::: {.signature} -def load_data(full_dataset=False) +def load_data(full_dataset = False) ::: @@ -126,6 +126,6 @@ We assign the following inputs depending on the input config expected by each te ::: {.signature} -def preprocess(df) +def preprocess(df) ::: diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index f44c7c972..c5ac35e65 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def simple_preprocess_booleans(df,columns) +def simple_preprocess_booleans(df,columns) ::: @@ -35,7 +35,7 @@ Preprocess boolean columns. ::: {.signature} -def simple_preprocess_categoricals(df,columns) +def simple_preprocess_categoricals(df,columns) ::: @@ -58,7 +58,7 @@ Preprocess categorical columns. ::: {.signature} -def simple_preprocess_numericals(df,columns) +def simple_preprocess_numericals(df,columns) ::: @@ -83,7 +83,7 @@ Preprocess numerical columns. ::: {.signature} -def load_data() +def load_data() ::: @@ -95,6 +95,6 @@ Preprocess numerical columns. ::: {.signature} -def preprocess(df) +def preprocess(df) ::: diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index 3ffb83444..2e4d80936 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def compute_scores(probabilities) +def compute_scores(probabilities) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def feature_engineering(df,verbose = True) +def feature_engineering(df,verbose = True) ::: @@ -38,7 +38,7 @@ toc-expand: 4 ::: {.signature} -def get_demo_test_config(x_test = None,y_test = None) +def get_demo_test_config(x_test = None,y_test = None) ::: @@ -63,7 +63,7 @@ Get demo test configuration. ::: {.signature} -def init_vm_objects(scorecard) +def init_vm_objects(scorecard) ::: @@ -75,7 +75,7 @@ Get demo test configuration. ::: {.signature} -def load_data(source = 'online',verbose = True) +def load_data(source = 'online',verbose = True) ::: @@ -91,7 +91,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -def load_scorecard() +def load_scorecard() ::: @@ -103,7 +103,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -def load_test_config(scorecard) +def load_test_config(scorecard) ::: @@ -115,7 +115,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -def preprocess(df,verbose = True) +def preprocess(df,verbose = True) ::: @@ -127,7 +127,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -def split(df,validation_size = None,test_size = 0.2,add_constant = False,verbose = True) +def split(df,validation_size = None,test_size = 0.2,add_constant = False,verbose = True) ::: @@ -154,6 +154,6 @@ Split dataset into train, validation (optional), and test sets. ::: {.signature} -def woe_encoding(df,verbose = True) +def woe_encoding(df,verbose = True) ::: diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 2d5762277..0395572c5 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def compute_scores(probabilities) +def compute_scores(probabilities) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def load_data() +def load_data() ::: @@ -42,7 +42,7 @@ Load data from the specified CSV file. :return: DataFrame containing the loaded ::: {.signature} -def preprocess(df) +def preprocess(df) ::: @@ -54,6 +54,6 @@ Load data from the specified CSV file. :return: DataFrame containing the loaded ::: {.signature} -def split(df,test_size = 0.3) +def split(df,test_size = 0.3) ::: diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index 382996b32..4da81ee98 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def display_nice(df,num_rows = None) +def display_nice(df,num_rows = None) ::: @@ -30,7 +30,7 @@ Primary function to format and display a DataFrame. ::: {.signature} -def load_data(source = 'online',dataset_size = None) +def load_data(source = 'online',dataset_size = None) ::: diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index 8276fb55b..6be339e18 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -14,6 +14,6 @@ toc-expand: 4 ::: {.signature} -def load_data(full_dataset=False) +def load_data(full_dataset = False) ::: diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index b0d36f2d7..36f92adbd 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def load_all_data() +def load_all_data() ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def load_data() +def load_data() ::: @@ -38,7 +38,7 @@ toc-expand: 4 ::: {.signature} -def load_model(model_name) +def load_model(model_name) ::: @@ -50,7 +50,7 @@ toc-expand: 4 ::: {.signature} -def load_processed_data() +def load_processed_data() ::: @@ -62,7 +62,7 @@ toc-expand: 4 ::: {.signature} -def load_test_dataset(model_name) +def load_test_dataset(model_name) ::: @@ -74,7 +74,7 @@ toc-expand: 4 ::: {.signature} -def load_train_dataset(model_path) +def load_train_dataset(model_path) ::: @@ -86,7 +86,7 @@ toc-expand: 4 ::: {.signature} -def preprocess(df,split_option = 'train_test_val',train_size = 0.6,test_size = 0.2) +def preprocess(df,split_option = 'train_test_val',train_size = 0.6,test_size = 0.2) ::: @@ -113,6 +113,6 @@ Split a time series DataFrame into train, validation, and test sets. ::: {.signature} -def transform(df,transform_func = 'diff') +def transform(df,transform_func = 'diff') ::: diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index f1801acf0..c6859a48b 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def load_data() +def load_data() ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def preprocess(df,split_option = 'train_test_val',train_size = 0.6,test_size = 0.2) +def preprocess(df,split_option = 'train_test_val',train_size = 0.6,test_size = 0.2) ::: @@ -53,6 +53,6 @@ Split a time series DataFrame into train, validation, and test sets. ::: {.signature} -def transform(df,transform_func = 'diff') +def transform(df,transform_func = 'diff') ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index b5445fd4a..7751bc625 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -21,7 +21,7 @@ This module contains all the custom errors that are used in the ValidMind Librar ::: {.signature} -class APIRequestError() +class APIRequestError() ::: @@ -42,7 +42,7 @@ Generic error for API request errors that are not known. ::: {.signature} -class BaseError() +class BaseError() ::: @@ -56,7 +56,7 @@ Generic error for API request errors that are not known. ::: {.signature} -def description(self,args = (),kwargs = {}) +def description(self,args = (),kwargs = {}) ::: @@ -68,7 +68,7 @@ Generic error for API request errors that are not known. ::: {.signature} -class GetTestSuiteError() +class GetTestSuiteError() ::: @@ -89,7 +89,7 @@ When the test suite could not be found. ::: {.signature} -class InitializeTestSuiteError() +class InitializeTestSuiteError() ::: @@ -110,7 +110,7 @@ When the test suite was found but could not be initialized. ::: {.signature} -class InvalidAPICredentialsError() +class InvalidAPICredentialsError() ::: @@ -125,7 +125,7 @@ When the test suite was found but could not be initialized. ::: {.signature} -def description(self,args = (),kwargs = {}) +def description(self,args = (),kwargs = {}) ::: @@ -137,7 +137,7 @@ When the test suite was found but could not be initialized. ::: {.signature} -class InvalidContentIdPrefixError() +class InvalidContentIdPrefixError() ::: @@ -158,7 +158,7 @@ When an invalid text content_id is sent to the API. ::: {.signature} -class InvalidInputError() +class InvalidInputError() ::: @@ -179,7 +179,7 @@ When an invalid input object. ::: {.signature} -class InvalidMetricResultsError() +class InvalidMetricResultsError() ::: @@ -200,7 +200,7 @@ When an invalid metric results object is sent to the API. ::: {.signature} -class InvalidProjectError() +class InvalidProjectError() ::: @@ -215,7 +215,7 @@ When an invalid metric results object is sent to the API. ::: {.signature} -def description(self,args = (),kwargs = {}) +def description(self,args = (),kwargs = {}) ::: @@ -227,7 +227,7 @@ When an invalid metric results object is sent to the API. ::: {.signature} -class InvalidRequestBodyError() +class InvalidRequestBodyError() ::: @@ -248,7 +248,7 @@ When a POST/PUT request is made with an invalid request body. ::: {.signature} -class InvalidTestParametersError() +class InvalidTestParametersError() ::: @@ -269,7 +269,7 @@ When an invalid parameters for the test. ::: {.signature} -class InvalidTestResultsError() +class InvalidTestResultsError() ::: @@ -290,7 +290,7 @@ When an invalid test results object is sent to the API. ::: {.signature} -class InvalidTextObjectError() +class InvalidTextObjectError() ::: @@ -311,7 +311,7 @@ When an invalid Metadat (Text) object is sent to the API. ::: {.signature} -class InvalidValueFormatterError() +class InvalidValueFormatterError() ::: @@ -332,7 +332,7 @@ When an invalid value formatter is provided when serializing results. ::: {.signature} -class InvalidXGBoostTrainedModelError() +class InvalidXGBoostTrainedModelError() ::: @@ -353,7 +353,7 @@ When an invalid XGBoost trained model is used when calling init_r_model. ::: {.signature} -class LoadTestError() +class LoadTestError() ::: @@ -374,7 +374,7 @@ Exception raised when an error occurs while loading a test ::: {.signature} -class MismatchingClassLabelsError() +class MismatchingClassLabelsError() ::: @@ -395,7 +395,7 @@ When the class labels found in the dataset don't match the provided target label ::: {.signature} -class MissingAPICredentialsError() +class MissingAPICredentialsError() ::: @@ -410,7 +410,7 @@ When the class labels found in the dataset don't match the provided target label ::: {.signature} -def description(self,args = (),kwargs = {}) +def description(self,args = (),kwargs = {}) ::: @@ -422,7 +422,7 @@ When the class labels found in the dataset don't match the provided target label ::: {.signature} -class MissingCacheResultsArgumentsError() +class MissingCacheResultsArgumentsError() ::: @@ -443,7 +443,7 @@ When the cache_results function is missing arguments. ::: {.signature} -class MissingClassLabelError() +class MissingClassLabelError() ::: @@ -464,7 +464,7 @@ When the one or more class labels are missing from provided dataset targets. ::: {.signature} -class MissingDependencyError() +class MissingDependencyError() ::: @@ -485,7 +485,7 @@ When a required dependency is missing. ::: {.signature} -class MissingDocumentationTemplate() +class MissingDocumentationTemplate() ::: @@ -506,7 +506,7 @@ When the client config is missing the documentation template. ::: {.signature} -class MissingModelIdError() +class MissingModelIdError() ::: @@ -521,7 +521,7 @@ When the client config is missing the documentation template. ::: {.signature} -def description(self,args = (),kwargs = {}) +def description(self,args = (),kwargs = {}) ::: @@ -533,7 +533,7 @@ When the client config is missing the documentation template. ::: {.signature} -class MissingOrInvalidModelPredictFnError() +class MissingOrInvalidModelPredictFnError() ::: @@ -554,7 +554,7 @@ When the pytorch model is missing a predict function or its predict method does ::: {.signature} -class MissingRequiredTestInputError() +class MissingRequiredTestInputError() ::: @@ -575,7 +575,7 @@ When a required test context variable is missing. ::: {.signature} -class MissingRExtrasError() +class MissingRExtrasError() ::: @@ -594,7 +594,7 @@ When the R extras have not been installed. ::: {.signature} -def description(self,args = (),kwargs = {}) +def description(self,args = (),kwargs = {}) ::: @@ -606,7 +606,7 @@ When the R extras have not been installed. ::: {.signature} -class MissingTextContentIdError() +class MissingTextContentIdError() ::: @@ -627,7 +627,7 @@ When a Text object is sent to the API without a content_id. ::: {.signature} -class MissingTextContentsError() +class MissingTextContentsError() ::: @@ -648,7 +648,7 @@ When a Text object is sent to the API without a "text" attribute. ::: {.signature} -class SkipTestError() +class SkipTestError() ::: @@ -669,7 +669,7 @@ Useful error to throw when a test cannot be executed. ::: {.signature} -class TestInputInvalidDatasetError() +class TestInputInvalidDatasetError() ::: @@ -690,7 +690,7 @@ When an invalid dataset is used in a test context. ::: {.signature} -class UnsupportedColumnTypeError() +class UnsupportedColumnTypeError() ::: @@ -711,7 +711,7 @@ When an unsupported column type is found on a dataset. ::: {.signature} -class UnsupportedDatasetError() +class UnsupportedDatasetError() ::: @@ -732,7 +732,7 @@ When an unsupported dataset is used. ::: {.signature} -class UnsupportedFigureError() +class UnsupportedFigureError() ::: @@ -753,7 +753,7 @@ When an unsupported figure object is constructed. ::: {.signature} -class UnsupportedModelError() +class UnsupportedModelError() ::: @@ -774,7 +774,7 @@ When an unsupported model is used. ::: {.signature} -class UnsupportedModelForSHAPError() +class UnsupportedModelForSHAPError() ::: @@ -795,7 +795,7 @@ When an unsupported model is used for SHAP importance. ::: {.signature} -class UnsupportedRModelError() +class UnsupportedRModelError() ::: @@ -816,7 +816,7 @@ When an unsupported R model is used. ::: {.signature} -def raise_api_error(error_string) +def raise_api_error(error_string) ::: @@ -832,7 +832,7 @@ Safely try to parse JSON from the response message in case the API returns a non ::: {.signature} -def should_raise_on_fail_fast(error)bool: +def should_raise_on_fail_fast(error)bool ::: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index df1b7c5e8..0482ecaf3 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,7 +29,7 @@ Entrypoint for test suites. ::: {.signature} -def format_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +def format_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}) ::: @@ -43,7 +43,7 @@ Format a pandas DataFrame for display purposes ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -57,7 +57,7 @@ Get a logger for the given module name ::: {.signature} -def test_id_to_name(test_id:str)str: +def test_id_to_name(test_id:str)str ::: @@ -81,7 +81,7 @@ Convert a test ID to a human-readable name. ::: {.signature} -def describe_suite(test_suite_id:str,verbose = False) +def describe_suite(test_suite_id:str,verbose = False) ::: @@ -106,7 +106,7 @@ Describes a Test Suite by ID ::: {.signature} -def get_by_id(test_suite_id:str) +def get_by_id(test_suite_id:str) ::: @@ -122,7 +122,7 @@ Returns the test suite by ID ::: {.signature} -def list_suites(pretty:bool=True) +def list_suites(pretty:bool = True) ::: @@ -138,7 +138,7 @@ Returns a list of all available test suites ::: {.signature} -def register_test_suite(suite_id:str,suite:TestSuite) +def register_test_suite(suite_id:str,suite:TestSuite) ::: @@ -154,7 +154,7 @@ Registers a custom test suite ::: {.signature} -class ClassifierDiagnosis() +class ClassifierDiagnosis() ::: @@ -172,7 +172,7 @@ Test suite for sklearn classifier model diagnosis tests ::: {.signature} -class ClassifierFullSuite() +class ClassifierFullSuite() ::: @@ -190,7 +190,7 @@ Full test suite for binary classification models. ::: {.signature} -class ClassifierMetrics() +class ClassifierMetrics() ::: @@ -208,7 +208,7 @@ Test suite for sklearn classifier metrics ::: {.signature} -class ClassifierModelValidation() +class ClassifierModelValidation() ::: @@ -226,7 +226,7 @@ Test suite for binary classification models. ::: {.signature} -class ClassifierPerformance() +class ClassifierPerformance() ::: @@ -244,7 +244,7 @@ Test suite for sklearn classifier models ::: {.signature} -class ClusterFullSuite() +class ClusterFullSuite() ::: @@ -262,7 +262,7 @@ Full test suite for clustering models. ::: {.signature} -class ClusterMetrics() +class ClusterMetrics() ::: @@ -280,7 +280,7 @@ Test suite for sklearn clustering metrics ::: {.signature} -class ClusterPerformance() +class ClusterPerformance() ::: @@ -298,7 +298,7 @@ Test suite for sklearn cluster performance ::: {.signature} -class EmbeddingsFullSuite() +class EmbeddingsFullSuite() ::: @@ -316,7 +316,7 @@ Full test suite for embeddings models. ::: {.signature} -class EmbeddingsMetrics() +class EmbeddingsMetrics() ::: @@ -334,7 +334,7 @@ Test suite for embeddings metrics ::: {.signature} -class EmbeddingsPerformance() +class EmbeddingsPerformance() ::: @@ -352,7 +352,7 @@ Test suite for embeddings model performance ::: {.signature} -class KmeansParametersOptimization() +class KmeansParametersOptimization() ::: @@ -370,7 +370,7 @@ Test suite for sklearn hyperparameters optimization ::: {.signature} -class LLMClassifierFullSuite() +class LLMClassifierFullSuite() ::: @@ -388,7 +388,7 @@ Full test suite for LLM classification models. ::: {.signature} -class NLPClassifierFullSuite() +class NLPClassifierFullSuite() ::: @@ -406,7 +406,7 @@ Full test suite for NLP classification models. ::: {.signature} -class PromptValidation() +class PromptValidation() ::: @@ -424,7 +424,7 @@ Test suite for prompt validation ::: {.signature} -class RegressionFullSuite() +class RegressionFullSuite() ::: @@ -442,7 +442,7 @@ Full test suite for regression models. ::: {.signature} -class RegressionMetrics() +class RegressionMetrics() ::: @@ -460,7 +460,7 @@ Test suite for performance metrics of regression metrics ::: {.signature} -class RegressionModelDescription() +class RegressionModelDescription() ::: @@ -478,7 +478,7 @@ Test suite for performance metric of regression model of statsmodels library ::: {.signature} -class RegressionModelsEvaluation() +class RegressionModelsEvaluation() ::: @@ -496,7 +496,7 @@ Test suite for metrics comparison of regression model of statsmodels library ::: {.signature} -class RegressionPerformance() +class RegressionPerformance() ::: @@ -514,7 +514,7 @@ Test suite for regression model performance ::: {.signature} -class SummarizationMetrics() +class SummarizationMetrics() ::: @@ -532,7 +532,7 @@ Test suite for Summarization metrics ::: {.signature} -class TabularDataQuality() +class TabularDataQuality() ::: @@ -550,7 +550,7 @@ Test suite for data quality on tabular datasets ::: {.signature} -class TabularDataset() +class TabularDataset() ::: @@ -568,7 +568,7 @@ Test suite for tabular datasets. ::: {.signature} -class TabularDatasetDescription() +class TabularDatasetDescription() ::: @@ -586,7 +586,7 @@ Test suite to extract metadata and descriptive statistics from a tabular dataset ::: {.signature} -class TextDataQuality() +class TextDataQuality() ::: @@ -604,7 +604,7 @@ Test suite for data quality on text data ::: {.signature} -class TimeSeriesDataQuality() +class TimeSeriesDataQuality() ::: @@ -622,7 +622,7 @@ Test suite for data quality on time series datasets ::: {.signature} -class TimeSeriesDataset() +class TimeSeriesDataset() ::: @@ -640,7 +640,7 @@ Test suite for time series datasets. ::: {.signature} -class TimeSeriesModelValidation() +class TimeSeriesModelValidation() ::: @@ -658,7 +658,7 @@ Test suite for time series model validation. ::: {.signature} -class TimeSeriesMultivariate() +class TimeSeriesMultivariate() ::: @@ -676,7 +676,7 @@ This test suite provides a preliminary understanding of the features and relatio ::: {.signature} -class TimeSeriesUnivariate() +class TimeSeriesUnivariate() ::: diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index 0b7f44066..594308d53 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -18,7 +18,7 @@ Test suites for sklearn-compatible classifier models Ideal setup is to have the ::: {.signature} -class ClassifierDiagnosis() +class ClassifierDiagnosis() ::: @@ -36,7 +36,7 @@ Test suite for sklearn classifier model diagnosis tests ::: {.signature} -class ClassifierFullSuite() +class ClassifierFullSuite() ::: @@ -54,7 +54,7 @@ Full test suite for binary classification models. ::: {.signature} -class ClassifierMetrics() +class ClassifierMetrics() ::: @@ -72,7 +72,7 @@ Test suite for sklearn classifier metrics ::: {.signature} -class ClassifierModelValidation() +class ClassifierModelValidation() ::: @@ -90,7 +90,7 @@ Test suite for binary classification models. ::: {.signature} -class ClassifierPerformance() +class ClassifierPerformance() ::: @@ -108,7 +108,7 @@ Test suite for sklearn classifier models ::: {.signature} -class TabularDataQuality() +class TabularDataQuality() ::: @@ -126,7 +126,7 @@ Test suite for data quality on tabular datasets ::: {.signature} -class TabularDatasetDescription() +class TabularDatasetDescription() ::: diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index 3bc32b5a6..ff937b456 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -18,7 +18,7 @@ Test suites for sklearn-compatible clustering models Ideal setup is to have the ::: {.signature} -class ClusterFullSuite() +class ClusterFullSuite() ::: @@ -36,7 +36,7 @@ Full test suite for clustering models. ::: {.signature} -class ClusterMetrics() +class ClusterMetrics() ::: @@ -54,7 +54,7 @@ Test suite for sklearn clustering metrics ::: {.signature} -class ClusterPerformance() +class ClusterPerformance() ::: @@ -72,7 +72,7 @@ Test suite for sklearn cluster performance ::: {.signature} -class KmeansParametersOptimization() +class KmeansParametersOptimization() ::: diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index 57fa800eb..ec57f5a73 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -18,7 +18,7 @@ Test suites for embeddings models Ideal setup is to have the API client to read ::: {.signature} -class EmbeddingsFullSuite() +class EmbeddingsFullSuite() ::: @@ -36,7 +36,7 @@ Full test suite for embeddings models. ::: {.signature} -class EmbeddingsMetrics() +class EmbeddingsMetrics() ::: @@ -54,7 +54,7 @@ Test suite for embeddings metrics ::: {.signature} -class EmbeddingsPerformance() +class EmbeddingsPerformance() ::: diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index a94157864..22fafaebe 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -18,7 +18,7 @@ Test suites for LLMs ::: {.signature} -class LLMClassifierFullSuite() +class LLMClassifierFullSuite() ::: @@ -36,7 +36,7 @@ Full test suite for LLM classification models. ::: {.signature} -class PromptValidation() +class PromptValidation() ::: @@ -54,7 +54,7 @@ Test suite for prompt validation ::: {.signature} -class ClassifierDiagnosis() +class ClassifierDiagnosis() ::: @@ -72,7 +72,7 @@ Test suite for sklearn classifier model diagnosis tests ::: {.signature} -class ClassifierMetrics() +class ClassifierMetrics() ::: @@ -90,7 +90,7 @@ Test suite for sklearn classifier metrics ::: {.signature} -class ClassifierPerformance() +class ClassifierPerformance() ::: @@ -108,7 +108,7 @@ Test suite for sklearn classifier models ::: {.signature} -class TextDataQuality() +class TextDataQuality() ::: diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index 99c6f526c..e61bd41d5 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -18,7 +18,7 @@ Test suites for NLP models ::: {.signature} -class NLPClassifierFullSuite() +class NLPClassifierFullSuite() ::: @@ -36,7 +36,7 @@ Full test suite for NLP classification models. ::: {.signature} -class ClassifierDiagnosis() +class ClassifierDiagnosis() ::: @@ -54,7 +54,7 @@ Test suite for sklearn classifier model diagnosis tests ::: {.signature} -class ClassifierMetrics() +class ClassifierMetrics() ::: @@ -72,7 +72,7 @@ Test suite for sklearn classifier metrics ::: {.signature} -class ClassifierPerformance() +class ClassifierPerformance() ::: @@ -90,7 +90,7 @@ Test suite for sklearn classifier models ::: {.signature} -class TextDataQuality() +class TextDataQuality() ::: diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index d9a2fc430..5f28b3714 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -18,7 +18,7 @@ Test suites for sklearn-compatible hyper parameters tunning Ideal setup is to ha ::: {.signature} -class KmeansParametersOptimization() +class KmeansParametersOptimization() ::: diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index c4d5dcaee..d3afd3734 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -class RegressionFullSuite() +class RegressionFullSuite() ::: @@ -32,7 +32,7 @@ Full test suite for regression models. ::: {.signature} -class RegressionMetrics() +class RegressionMetrics() ::: @@ -50,7 +50,7 @@ Test suite for performance metrics of regression metrics ::: {.signature} -class RegressionPerformance() +class RegressionPerformance() ::: @@ -68,7 +68,7 @@ Test suite for regression model performance ::: {.signature} -class TabularDataQuality() +class TabularDataQuality() ::: @@ -86,7 +86,7 @@ Test suite for data quality on tabular datasets ::: {.signature} -class TabularDatasetDescription() +class TabularDatasetDescription() ::: diff --git a/docs/validmind/test_suites/statsmodels_timeseries.qmd b/docs/validmind/test_suites/statsmodels_timeseries.qmd index ab0e8ccd4..13b926388 100644 --- a/docs/validmind/test_suites/statsmodels_timeseries.qmd +++ b/docs/validmind/test_suites/statsmodels_timeseries.qmd @@ -18,7 +18,7 @@ Time Series Test Suites from statsmodels ::: {.signature} -class RegressionModelDescription() +class RegressionModelDescription() ::: @@ -36,7 +36,7 @@ Test suite for performance metric of regression model of statsmodels library ::: {.signature} -class RegressionModelsEvaluation() +class RegressionModelsEvaluation() ::: diff --git a/docs/validmind/test_suites/summarization.qmd b/docs/validmind/test_suites/summarization.qmd index 1eba8187d..00b8f8241 100644 --- a/docs/validmind/test_suites/summarization.qmd +++ b/docs/validmind/test_suites/summarization.qmd @@ -18,7 +18,7 @@ Test suites for llm summarization models ::: {.signature} -class SummarizationMetrics() +class SummarizationMetrics() ::: diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd index a2fef591a..e1c6d29af 100644 --- a/docs/validmind/test_suites/tabular_datasets.qmd +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -18,7 +18,7 @@ Test suites for tabular datasets ::: {.signature} -class TabularDataQuality() +class TabularDataQuality() ::: @@ -36,7 +36,7 @@ Test suite for data quality on tabular datasets ::: {.signature} -class TabularDataset() +class TabularDataset() ::: @@ -54,7 +54,7 @@ Test suite for tabular datasets. ::: {.signature} -class TabularDatasetDescription() +class TabularDatasetDescription() ::: diff --git a/docs/validmind/test_suites/text_data.qmd b/docs/validmind/test_suites/text_data.qmd index 3b73356e4..489476fdd 100644 --- a/docs/validmind/test_suites/text_data.qmd +++ b/docs/validmind/test_suites/text_data.qmd @@ -18,7 +18,7 @@ Test suites for text datasets ::: {.signature} -class TextDataQuality() +class TextDataQuality() ::: diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index 683cc5a4b..829fbaeec 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -18,7 +18,7 @@ Time Series Test Suites ::: {.signature} -class TimeSeriesDataQuality() +class TimeSeriesDataQuality() ::: @@ -36,7 +36,7 @@ Test suite for data quality on time series datasets ::: {.signature} -class TimeSeriesDataset() +class TimeSeriesDataset() ::: @@ -54,7 +54,7 @@ Test suite for time series datasets. ::: {.signature} -class TimeSeriesModelValidation() +class TimeSeriesModelValidation() ::: @@ -72,7 +72,7 @@ Test suite for time series model validation. ::: {.signature} -class TimeSeriesMultivariate() +class TimeSeriesMultivariate() ::: @@ -90,7 +90,7 @@ This test suite provides a preliminary understanding of the features and relatio ::: {.signature} -class TimeSeriesUnivariate() +class TimeSeriesUnivariate() ::: @@ -110,7 +110,7 @@ The raw time series data provides a visual inspection of the target variable's b ::: {.signature} -class RegressionModelDescription() +class RegressionModelDescription() ::: @@ -128,7 +128,7 @@ Test suite for performance metric of regression model of statsmodels library ::: {.signature} -class RegressionModelsEvaluation() +class RegressionModelsEvaluation() ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 791c6d20c..aef4074c2 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -20,7 +20,7 @@ ValidMind Tests Module ::: {.signature} -def describe_test(test_id:TestID = None,raw:bool = False,show:bool = True) +def describe_test(test_id:TestID = None,raw:bool = False,show:bool = True) ::: @@ -39,7 +39,7 @@ Get or show details about the test This function can be used to see test details ::: {.signature} -def list_tags() +def list_tags() ::: @@ -53,7 +53,7 @@ List unique tags from all test classes. ::: {.signature} -def list_tasks() +def list_tasks() ::: @@ -67,7 +67,7 @@ List unique tasks from all test classes. ::: {.signature} -def list_tasks_and_tags(as_json=False) +def list_tasks_and_tags(as_json = False) ::: @@ -85,7 +85,7 @@ List all task types and their associated tags, with one row per task type and al ::: {.signature} -def list_tests(filter = None,task = None,tags = None,pretty = True,truncate = True) +def list_tests(filter = None,task = None,tags = None,pretty = True,truncate = True) ::: @@ -111,7 +111,7 @@ List all tests in the tests directory. ::: {.signature} -def load_test(test_id:str,test_func:callable = None,reload:bool = False) +def load_test(test_id:str,test_func:callable = None,reload:bool = False) ::: @@ -130,7 +130,7 @@ Load a test by test ID Test IDs are in the format `namespace.path_to_module.Test ::: {.signature} -def run_test(test_id:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'TestID'}, 'None'], 'implicit': True}} = None,name:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None,unit_metrics:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'TestID'}}, 'None'], 'implicit': True}} = None,inputs:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, 'None'\], 'implicit': True}} = None,input_grid:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'Any'}}], 'implicit': True}}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}, 'None'\], 'implicit': True}} = None,params:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, 'None'\], 'implicit': True}} = None,param_grid:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'Any'}}], 'implicit': True}}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}, 'None'\], 'implicit': True}} = None,show:bool = True,generate_description:bool = True,title:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Optional'}, 'slice': {'cls': 'ExprName', 'name': 'str'}} = None,post_process_fn:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Callable'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, 'None'\], 'implicit': True}}, 'None'\], 'implicit': True}} = None,kwargs = {})TestResult: +def run_test(test_id:TestID, = None,name:str, = None,unit_metrics:, = None,inputs:, = None,input_grid:, , = None,params:, = None,param_grid:, , = None,show:bool = True,generate_description:bool = True,title:str = None,post_process_fn:, = None,kwargs = {})validmind.vm_models.TestResult ::: @@ -171,7 +171,7 @@ Run a ValidMind or custom test This function is the main entry point for running ::: {.signature} -def tags(tags=()) +def tags(tags = ()) ::: @@ -189,7 +189,7 @@ Decorator for specifying tags for a test. ::: {.signature} -def tasks(tasks=()) +def tasks(tasks = ()) ::: @@ -207,7 +207,7 @@ Decorator for specifying the task types that a test is designed for. ::: {.signature} -def test(func_or_id) +def test(func_or_id) ::: @@ -246,7 +246,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -def register_test_provider(namespace:str,test_provider:TestProvider)None: +def register_test_provider(namespace:str,test_provider:TestProvider)None ::: @@ -267,7 +267,7 @@ Register an external test provider ::: {.signature} -class LoadTestError() +class LoadTestError() ::: @@ -288,7 +288,7 @@ Exception raised when an error occurs while loading a test ::: {.signature} -class LocalTestProvider() +class LocalTestProvider() ::: @@ -327,7 +327,7 @@ test = test_provider.load_test("my_namespace.my_test_class") ::: {.signature} -def list_tests(self) +def list_tests(self) ::: @@ -345,7 +345,7 @@ List all tests in the given namespace ::: {.signature} -def load_test(self,test_id:str) +def load_test(self,test_id:str) ::: @@ -365,7 +365,7 @@ Raises: LocalTestProviderLoadModuleError: If the test module cannot be imported ::: {.signature} -class TestProvider() +class TestProvider() ::: @@ -381,7 +381,7 @@ Protocol for user-defined test providers ::: {.signature} -def list_tests(self){'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}: +def list_tests(self) ::: @@ -399,7 +399,7 @@ List all tests in the given namespace ::: {.signature} -def load_test(self,test_id:str)callable: +def load_test(self,test_id:str)validmind.vm_models.callable ::: diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 65f8cddf1..1f1291b36 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ACFandPACFPlot(dataset:VMDataset) +def ACFandPACFPlot(dataset:VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 8c1da7105..4e3e0ba38 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def ADF(dataset:VMDataset) +def ADF(dataset:VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 66190d07f..9894e75bc 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def AutoAR(dataset:VMDataset,max_ar_order:int = 3) +def AutoAR(dataset:VMDataset,max_ar_order:int = 3) ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index e109028a8..db1fbcd97 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def AutoMA(dataset:VMDataset,max_ma_order:int = 3) +def AutoMA(dataset:VMDataset,max_ma_order:int = 3) ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 463f28e1e..0487f637c 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def AutoStationarity(dataset:VMDataset,max_order:int = 5,threshold:float = 0.05) +def AutoStationarity(dataset:VMDataset,max_order:int = 5,threshold:float = 0.05) ::: diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 64b0768da..d06111ba2 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def BivariateScatterPlots(dataset) +def BivariateScatterPlots(dataset) ::: diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index 8ac583cb2..707ef0662 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def BoxPierce(dataset) +def BoxPierce(dataset) ::: diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index bca8fc64e..9b39a289d 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ChiSquaredFeaturesTable(dataset,p_threshold = 0.05) +def ChiSquaredFeaturesTable(dataset,p_threshold = 0.05) ::: @@ -56,7 +56,7 @@ The function creates a contingency table for each categorical feature and the ta ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index b4f9b0f47..f68990179 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -def ClassImbalance(dataset:VMDataset,min_percent_threshold:int = 10){'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Tuple'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}, {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, {'cls': 'ExprName', 'name': 'bool'}\], 'implicit': True}}: +def ClassImbalance(dataset:VMDataset,min_percent_threshold:int = 10) ::: @@ -64,7 +64,7 @@ This Class Imbalance test operates by calculating the frequency (expressed as a ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index dfbb49803..3ee265c24 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def DatasetDescription(dataset:VMDataset) +def DatasetDescription(dataset:VMDataset) ::: @@ -74,7 +74,7 @@ The DatasetDescription class accomplishes the purpose as follows: firstly, the t ::: {.signature} -def describe_column(df,column) +def describe_column(df,column) ::: @@ -90,7 +90,7 @@ Gets descriptive statistics for a single column in a Pandas DataFrame. ::: {.signature} -def get_column_histograms(df,column,type\_) +def get_column_histograms(df,column,type\_) ::: @@ -108,7 +108,7 @@ Will be used in favor of \_get_histogram in the future ::: {.signature} -def get_numerical_histograms(df,column) +def get_numerical_histograms(df,column) ::: @@ -124,7 +124,7 @@ Returns a collection of histograms for a numerical column, each one with a diffe ::: {.signature} -def infer_datatypes(df) +def infer_datatypes(df) ::: @@ -136,7 +136,7 @@ Returns a collection of histograms for a numerical column, each one with a diffe ::: {.signature} -class UnsupportedColumnTypeError() +class UnsupportedColumnTypeError() ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 6150db469..796adf3be 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def DatasetSplit(datasets:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}}) +def DatasetSplit(datasets:VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 78ace2fc2..bcce4ea92 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def format_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Any'}], 'implicit': True}}}: +def format_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}) ::: @@ -34,7 +34,7 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -def DescriptiveStatistics(dataset:VMDataset) +def DescriptiveStatistics(dataset:VMDataset) ::: @@ -76,7 +76,7 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des ::: {.signature} -def get_summary_statistics_categorical(df,categorical_fields) +def get_summary_statistics_categorical(df,categorical_fields) ::: @@ -88,7 +88,7 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des ::: {.signature} -def get_summary_statistics_numerical(df,numerical_fields) +def get_summary_statistics_numerical(df,numerical_fields) ::: @@ -100,7 +100,7 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 714646167..f446dd9ec 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def DickeyFullerGLS(dataset:VMDataset) +def DickeyFullerGLS(dataset:VMDataset) ::: @@ -68,7 +68,7 @@ This code implements the Dickey-Fuller GLS unit root test on each attribute of t ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 6db785a36..baf8cf636 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Duplicates(dataset,min_threshold = 1) +def Duplicates(dataset,min_threshold = 1) ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index eff7ff9aa..183f4ac07 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def EngleGrangerCoint(dataset:VMDataset,threshold:float = 0.05) +def EngleGrangerCoint(dataset:VMDataset,threshold:float = 0.05) ::: @@ -54,7 +54,7 @@ The test first drops any non-applicable values from the input dataset and then i ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index b714255e6..1f2940ac1 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def FeatureTargetCorrelationPlot(dataset,fig_height = 600) +def FeatureTargetCorrelationPlot(dataset,fig_height = 600) ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 7f8c2da25..a930a77c9 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def HighCardinality(dataset:VMDataset,num_threshold:int = 100,percent_threshold:float = 0.1,threshold_type:str = 'percent') +def HighCardinality(dataset:VMDataset,num_threshold:int = 100,percent_threshold:float = 0.1,threshold_type:str = 'percent') ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 398299314..b883d73d1 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def HighPearsonCorrelation(dataset:VMDataset,max_threshold:float = 0.3,top_n_correlations:int = 10,feature_columns:list = None) +def HighPearsonCorrelation(dataset:VMDataset,max_threshold:float = 0.3,top_n_correlations:int = 10,feature_columns:list = None) ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 4b6c47b53..e00506eea 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def compute_outliers(series,threshold) +def compute_outliers(series,threshold) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def IQROutliersBarPlot(dataset:VMDataset,threshold:float = 1.5,fig_width:int = 800) +def IQROutliersBarPlot(dataset:VMDataset,threshold:float = 1.5,fig_width:int = 800) ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 748f5bbdf..481059515 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def compute_outliers(series,threshold = 1.5) +def compute_outliers(series,threshold = 1.5) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def IQROutliersTable(dataset:VMDataset,threshold:float = 1.5) +def IQROutliersTable(dataset:VMDataset,threshold:float = 1.5) ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index 905a3514f..3327b9e89 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def IsolationForestOutliers(dataset:VMDataset,random_state:int = 0,contamination:float = 0.1,feature_columns:list = None) +def IsolationForestOutliers(dataset:VMDataset,random_state:int = 0,contamination:float = 0.1,feature_columns:list = None) ::: diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index 08884025d..436237968 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def JarqueBera(dataset) +def JarqueBera(dataset) ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index a946b4ef9..546160cc6 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def KPSS(dataset:VMDataset) +def KPSS(dataset:VMDataset) ::: @@ -68,7 +68,7 @@ This test calculates the KPSS score for each feature in the dataset. The KPSS sc ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 6122a6cca..0b6ed94ae 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def LJungBox(dataset) +def LJungBox(dataset) ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index 5daa49c9a..6b5d36909 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def LaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int = 10) +def LaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int = 10) ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 868a7ca93..500bedddd 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MissingValues(dataset:VMDataset,min_threshold:int = 1) +def MissingValues(dataset:VMDataset,min_threshold:int = 1) ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 21a5c62a1..66df609a0 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MissingValuesBarPlot(dataset:VMDataset,threshold:int = 80,fig_height:int = 600) +def MissingValuesBarPlot(dataset:VMDataset,threshold:int = 80,fig_height:int = 600) ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 022157f6c..8783c5fc9 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MutualInformation(dataset:VMDataset,min_threshold:float = 0.01,task:str = 'classification') +def MutualInformation(dataset:VMDataset,min_threshold:float = 0.01,task:str = 'classification') ::: diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index 53e00b9a5..97d169fb3 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def PearsonCorrelationMatrix(dataset) +def PearsonCorrelationMatrix(dataset) ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 8bb38c271..161566dca 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def PhillipsPerronArch(dataset:VMDataset) +def PhillipsPerronArch(dataset:VMDataset) ::: @@ -74,7 +74,7 @@ The PP test is conducted for each feature in the dataset as follows: ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 9a9652da9..288ff0296 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def ProtectedClassesCombination(dataset,model,protected_classes = None) +def ProtectedClassesCombination(dataset,model,protected_classes = None) ::: @@ -74,7 +74,7 @@ The test performs the following steps: ::: {.signature} -class MissingDependencyError() +class MissingDependencyError() ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index c400e7fab..e1785eb87 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def ProtectedClassesDescription(dataset,protected_classes = None) +def ProtectedClassesDescription(dataset,protected_classes = None) ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 85aa5aeb0..b7c2da73f 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def ProtectedClassesDisparity(dataset,model,protected_classes = None,disparity_tolerance = 1.25,metrics = {'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}) +def ProtectedClassesDisparity(dataset,model,protected_classes = None,disparity_tolerance = 1.25,metrics = {'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}) ::: @@ -76,7 +76,7 @@ The test performs the following steps: ::: {.signature} -class MissingDependencyError() +class MissingDependencyError() ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 95e7992d7..d8959e2a8 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def calculate_fairness_metrics(test_df,target,y_pred_opt,protected_classes) +def calculate_fairness_metrics(test_df,target,y_pred_opt,protected_classes) ::: @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -def calculate_group_metrics(test_df,target,y_pred_opt,protected_classes) +def calculate_group_metrics(test_df,target,y_pred_opt,protected_classes) ::: @@ -52,7 +52,7 @@ Get a logger for the given module name ::: {.signature} -def get_thresholds_by_group(threshold_optimizer) +def get_thresholds_by_group(threshold_optimizer) ::: @@ -64,7 +64,7 @@ Get a logger for the given module name ::: {.signature} -def initialize_and_fit_optimizer(pipeline,X_train,y_train,protected_classes_df) +def initialize_and_fit_optimizer(pipeline,X_train,y_train,protected_classes_df) ::: @@ -76,7 +76,7 @@ Get a logger for the given module name ::: {.signature} -def make_predictions(threshold_optimizer,test_df,protected_classes) +def make_predictions(threshold_optimizer,test_df,protected_classes) ::: @@ -88,7 +88,7 @@ Get a logger for the given module name ::: {.signature} -def plot_thresholds(threshold_optimizer) +def plot_thresholds(threshold_optimizer) ::: @@ -100,7 +100,7 @@ Get a logger for the given module name ::: {.signature} -def ProtectedClassesThresholdOptimizer(dataset,pipeline = None,protected_classes = None,X_train = None,y_train = None) +def ProtectedClassesThresholdOptimizer(dataset,pipeline = None,protected_classes = None,X_train = None,y_train = None) ::: @@ -147,7 +147,7 @@ The test uses Fairlearn's ThresholdOptimizer to: ::: {.signature} -class MissingDependencyError() +class MissingDependencyError() ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 2793956e0..1558b8719 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def plot_rolling_statistics(df,col,window_size) +def plot_rolling_statistics(df,col,window_size) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def RollingStatsPlot(dataset:VMDataset,window_size:int = 12) +def RollingStatsPlot(dataset:VMDataset,window_size:int = 12) ::: @@ -69,7 +69,7 @@ This mechanism is comprised of two steps. Initially, the rolling mean and standa ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 81166d112..8b7c6014e 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def RunsTest(dataset) +def RunsTest(dataset) ::: diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 770ced1aa..0846d99d4 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ScatterPlot(dataset) +def ScatterPlot(dataset) ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 404178693..ac0690710 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str = 'score',score_bands:list = None) +def ScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str = 'score',score_bands:list = None) ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 02fb3763d..180fc8137 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def SeasonalDecompose(dataset:VMDataset,seasonal_model:str = 'additive') +def SeasonalDecompose(dataset:VMDataset,seasonal_model:str = 'additive') ::: @@ -70,7 +70,7 @@ The testing process leverages the `seasonal_decompose` function from the `statsm ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 8ee8e9ab4..17d59360c 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ShapiroWilk(dataset) +def ShapiroWilk(dataset) ::: diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index 2f55e786d..50d739827 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Skewness(dataset,max_threshold = 1) +def Skewness(dataset,max_threshold = 1) ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index ceceb0b15..1afbe6445 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def SpreadPlot(dataset:VMDataset) +def SpreadPlot(dataset:VMDataset) ::: @@ -58,7 +58,7 @@ The SpreadPlot test computes and represents the spread between each pair of time ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index f93fa4756..91fcf9020 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TabularCategoricalBarPlots(dataset:VMDataset) +def TabularCategoricalBarPlots(dataset:VMDataset) ::: @@ -55,7 +55,7 @@ The provided dataset is first checked to determine if it contains any categorica ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 73fbae262..6ed8188a7 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TabularDateTimeHistograms(dataset:VMDataset) +def TabularDateTimeHistograms(dataset:VMDataset) ::: @@ -56,7 +56,7 @@ This test operates by first identifying all datetime columns and extracting them ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 6dc6f7687..bc6ee8922 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def get_categorical_columns(dataset) +def get_categorical_columns(dataset) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def get_datetime_columns(dataset) +def get_datetime_columns(dataset) ::: @@ -38,7 +38,7 @@ toc-expand: 4 ::: {.signature} -def get_numerical_columns(dataset) +def get_numerical_columns(dataset) ::: @@ -50,7 +50,7 @@ toc-expand: 4 ::: {.signature} -def get_summary_statistics_categorical(dataset,categorical_fields) +def get_summary_statistics_categorical(dataset,categorical_fields) ::: @@ -62,7 +62,7 @@ toc-expand: 4 ::: {.signature} -def get_summary_statistics_datetime(dataset,datetime_fields) +def get_summary_statistics_datetime(dataset,datetime_fields) ::: @@ -74,7 +74,7 @@ toc-expand: 4 ::: {.signature} -def get_summary_statistics_numerical(dataset,numerical_fields) +def get_summary_statistics_numerical(dataset,numerical_fields) ::: @@ -86,7 +86,7 @@ toc-expand: 4 ::: {.signature} -def TabularDescriptionTables(dataset) +def TabularDescriptionTables(dataset) ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index f5f30a3b5..832382b26 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TabularNumericalHistograms(dataset:VMDataset) +def TabularNumericalHistograms(dataset:VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 6535ce9e5..8030f3233 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TargetRateBarPlots(dataset:VMDataset) +def TargetRateBarPlots(dataset:VMDataset) ::: @@ -52,7 +52,7 @@ The test involves creating a pair of bar plots for each categorical feature in t ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 92e4e39ab..1762c211c 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesDescription(dataset) +def TimeSeriesDescription(dataset) ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 95b0d3180..6056d4a28 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesDescriptiveStatistics(dataset) +def TimeSeriesDescriptiveStatistics(dataset) ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 7d08ad15c..bf8012a40 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesFrequency(dataset:VMDataset) +def TimeSeriesFrequency(dataset:VMDataset) ::: @@ -55,7 +55,7 @@ Initially, the test checks if the dataframe index is in datetime format. Subsequ ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 6aa3bdc3e..204ad68e7 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def TimeSeriesHistogram(dataset,nbins = 30) +def TimeSeriesHistogram(dataset,nbins = 30) ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 8ed890758..2d00396fc 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesLinePlot(dataset:VMDataset) +def TimeSeriesLinePlot(dataset:VMDataset) ::: @@ -57,7 +57,7 @@ The mechanism for this Python class involves extracting the column names from th ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 4c245390f..9383921b9 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesMissingValues(dataset:VMDataset,min_threshold:int = 1) +def TimeSeriesMissingValues(dataset:VMDataset,min_threshold:int = 1) ::: @@ -55,7 +55,7 @@ The test method commences by validating if the dataset has a datetime index; if ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 45c0e379e..6e24144d9 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int = 3) +def TimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int = 3) ::: @@ -60,7 +60,7 @@ The test processes a given dataset which must have datetime indexing, checks if ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 8c9855863..5da4454f0 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TooManyZeroValues(dataset:VMDataset,max_percent_threshold:float = 0.03) +def TooManyZeroValues(dataset:VMDataset,max_percent_threshold:float = 0.03) ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index dce92dd04..d40bc3ae9 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def UniqueRows(dataset:VMDataset,min_percent_threshold:float = 1) +def UniqueRows(dataset:VMDataset,min_percent_threshold:float = 1) ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 50f678eb9..a135b8a54 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def WOEBinPlots(dataset:VMDataset,breaks_adj:list = None,fig_height:int = 600,fig_width:int = 500) +def WOEBinPlots(dataset:VMDataset,breaks_adj:list = None,fig_height:int = 600,fig_width:int = 500) ::: @@ -71,7 +71,7 @@ The test implementation follows defined steps. Initially, it selects non-numeric ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 2e69211d7..e3b818202 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def WOEBinTable(dataset:VMDataset,breaks_adj:list = None) +def WOEBinTable(dataset:VMDataset,breaks_adj:list = None) ::: @@ -54,7 +54,7 @@ The test uses the `scorecardpy.woebin` method to perform automatic binning of th ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 04066a1e1..17216f1aa 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def ZivotAndrewsArch(dataset:VMDataset) +def ZivotAndrewsArch(dataset:VMDataset) ::: @@ -67,7 +67,7 @@ The Zivot-Andrews unit root test is performed on each feature in the dataset usi ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index e9a1a1e61..ec16db892 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def CommonWords(dataset:VMDataset) +def CommonWords(dataset:VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 1c4170467..9b9097be4 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Hashtags(dataset:VMDataset,top_hashtags:int = 25) +def Hashtags(dataset:VMDataset,top_hashtags:int = 25) ::: @@ -57,7 +57,7 @@ The test implements a regular expression (regex) to extract all hashtags from th ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 3e3ddef9a..da822bf3a 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def LanguageDetection(dataset) +def LanguageDetection(dataset) ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 51cfae591..81b477d3a 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Mentions(dataset:VMDataset,top_mentions:int = 25) +def Mentions(dataset:VMDataset,top_mentions:int = 25) ::: @@ -55,7 +55,7 @@ The test first verifies the existence of a text column in the provided dataset. ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index 6085144df..2f19679b5 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def PolarityAndSubjectivity(dataset,threshold_subjectivity = 0.5,threshold_polarity = 0) +def PolarityAndSubjectivity(dataset,threshold_subjectivity = 0.5,threshold_polarity = 0) ::: diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index 9d915d252..3af115615 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -18,7 +18,7 @@ Metrics functions for any Pandas-compatible datasets ::: {.signature} -def Punctuations(dataset,count_mode = 'token') +def Punctuations(dataset,count_mode = 'token') ::: diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index 2909bf7de..0dc5e391e 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Sentiment(dataset) +def Sentiment(dataset) ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index f91a69d42..7e8b8a319 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -def StopWords(dataset:VMDataset,min_percent_threshold:float = 0.5,num_words:int = 25) +def StopWords(dataset:VMDataset,min_percent_threshold:float = 0.5,num_words:int = 25) ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 2aa1b0761..e9be05451 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def create_metrics_df(df,text_column,unwanted_tokens,lang) +def create_metrics_df(df,text_column,unwanted_tokens,lang) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def TextDescription(dataset:VMDataset,unwanted_tokens:set = {'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str = 'english') +def TextDescription(dataset:VMDataset,unwanted_tokens:set = {'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str = 'english') ::: diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index ff6da3f85..9ca2d2582 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Toxicity(dataset) +def Toxicity(dataset) ::: diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index f41a96f33..3c856aa28 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def validate_prediction(y_true,y_pred,dataset_id = None) +def validate_prediction(y_true,y_pred,dataset_id = None) ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -def BertScore(dataset,model,evaluation_model = 'distilbert-base-uncased') +def BertScore(dataset,model,evaluation_model = 'distilbert-base-uncased') ::: diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 03dc0c4a2..3e091ceaf 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def validate_prediction(y_true,y_pred,dataset_id = None) +def validate_prediction(y_true,y_pred,dataset_id = None) ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -def BleuScore(dataset,model) +def BleuScore(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 0d204822a..3fb0efa34 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClusterSizeDistribution(dataset:VMDataset,model:VMModel) +def ClusterSizeDistribution(dataset:VMDataset,model:VMModel) ::: diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 2df6a5186..7136e74c6 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def validate_prediction(y_true,y_pred,dataset_id = None) +def validate_prediction(y_true,y_pred,dataset_id = None) ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -def ContextualRecall(dataset,model) +def ContextualRecall(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 01e5b5753..363cc283a 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def FeaturesAUC(dataset:VMDataset,fontsize:int = 12,figure_height:int = 500) +def FeaturesAUC(dataset:VMDataset,fontsize:int = 12,figure_height:int = 500) ::: @@ -68,7 +68,7 @@ For each feature, the metric treats the feature values as raw scores to compute ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index d60b7cd48..671b25485 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def validate_prediction(y_true,y_pred,dataset_id = None) +def validate_prediction(y_true,y_pred,dataset_id = None) ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -def MeteorScore(dataset,model) +def MeteorScore(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index 758cf86f0..cd13567f2 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_model_info(model) +def get_model_info(model) ::: @@ -28,7 +28,7 @@ Attempts to extract all model info from a model object instance ::: {.signature} -def ModelMetadata(model) +def ModelMetadata(model) ::: diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index baf4ea531..eec9e4ad7 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ModelPredictionResiduals(dataset,model,nbins = 100,p_value_threshold = 0.05,start_date = None,end_date = None) +def ModelPredictionResiduals(dataset,model,nbins = 100,p_value_threshold = 0.05,start_date = None,end_date = None) ::: diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index c1ecb80af..97ebe9293 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def validate_prediction(y_true,y_pred,dataset_id = None) +def validate_prediction(y_true,y_pred,dataset_id = None) ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -def RegardScore(dataset,model) +def RegardScore(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 101481ec0..c3ae7bc69 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def RegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float = 0.1) +def RegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float = 0.1) ::: diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 9168bc876..76c3c35e0 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def RougeScore(dataset,model,metric = 'rouge-1') +def RougeScore(dataset,model,metric = 'rouge-1') ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index f07e2ccdf..0e11abae0 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesPredictionWithCI(dataset,model,confidence = 0.95) +def TimeSeriesPredictionWithCI(dataset,model,confidence = 0.95) ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index 0e0bc5731..781e042ab 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesPredictionsPlot(dataset,model) +def TimeSeriesPredictionsPlot(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 698cc2d1f..7dbd4fbdc 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesR2SquareBySegments(dataset,model,segments = None) +def TimeSeriesR2SquareBySegments(dataset,model,segments = None) ::: diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index 84cb56a29..5e9e4667a 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TokenDisparity(dataset,model) +def TokenDisparity(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index a23456d4c..619815e9b 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ToxicityScore(dataset,model) +def ToxicityScore(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 729af67fc..83a93f044 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def AdjustedMutualInformation(model:VMModel,dataset:VMDataset) +def AdjustedMutualInformation(model:VMModel,dataset:VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 064be5017..a701f1392 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def AdjustedRandIndex(model:VMModel,dataset:VMDataset) +def AdjustedRandIndex(model:VMModel,dataset:VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 8702b6069..fc33586ee 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def CalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int = 10) +def CalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int = 10) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index 9901f0f85..1122aae5d 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClassifierPerformance(dataset:VMDataset,model:VMModel,average:str = 'macro') +def ClassifierPerformance(dataset:VMDataset,model:VMModel,average:str = 'macro') ::: @@ -56,6 +56,6 @@ The test produces a report that includes precision, recall, F1-Score, and accura ::: {.signature} -def multiclass_roc_auc_score(y_test,y_pred,average = 'macro') +def multiclass_roc_auc_score(y_test,y_pred,average = 'macro') ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 7dd3497e9..d63612e5a 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods = None,target_recall = None) +def ClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods = None,target_recall = None) ::: @@ -90,7 +90,7 @@ The test implements multiple threshold optimization methods: ::: {.signature} -def find_optimal_threshold(y_true,y_prob,method = 'youden',target_recall = None) +def find_optimal_threshold(y_true,y_prob,method = 'youden',target_recall = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 55ef272e1..fefdff0ef 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClusterCosineSimilarity(model:VMModel,dataset:VMDataset) +def ClusterCosineSimilarity(model:VMModel,dataset:VMDataset) ::: @@ -56,7 +56,7 @@ This test works by first extracting the true and predicted clusters of the model ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 8b035ce0e..417daa4db 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClusterPerformanceMetrics(model:VMModel,dataset:VMDataset) +def ClusterPerformanceMetrics(model:VMModel,dataset:VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 24b110d77..f936c1ea0 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def CompletenessScore(model:VMModel,dataset:VMDataset) +def CompletenessScore(model:VMModel,dataset:VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index cf3f62452..e9538faa6 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ConfusionMatrix(dataset:VMDataset,model:VMModel) +def ConfusionMatrix(dataset:VMDataset,model:VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index d14efc905..1d8bd21fe 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def FeatureImportance(dataset:VMDataset,model:VMModel,num_features:int = 3) +def FeatureImportance(dataset:VMDataset,model:VMModel,num_features:int = 3) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 6d9f4cd4b..2a5f1a7a8 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def FowlkesMallowsScore(dataset:VMDataset,model:VMModel) +def FowlkesMallowsScore(dataset:VMDataset,model:VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 3bd29ceec..d05892942 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def HomogeneityScore(dataset:VMDataset,model:VMModel) +def HomogeneityScore(dataset:VMDataset,model:VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 044a16949..d0360e509 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def custom_recall(y_true,y_pred_proba,threshold = 0.5) +def custom_recall(y_true,y_pred_proba,threshold = 0.5) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def HyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'List'}, {'cls': 'ExprName', 'name': 'Dict'}], 'implicit': True}} = None,thresholds:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'float'}, {'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}}], 'implicit': True}} = None,fit_params:dict = None) +def HyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:str, List, Dict = None,thresholds:float, = None,fit_params:dict = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 3695f1715..df19224db 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def KMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'int'}}, 'None'], 'implicit': True}} = None) +def KMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:, = None) ::: @@ -57,7 +57,7 @@ The test mechanism involves iterating over a predefined range of cluster numbers ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index eec0f30e9..a2d01ec1e 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float = 0.7) +def MinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float = 0.7) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 2adf579b1..b4be9ae8a 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float = 0.5) +def MinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float = 0.5) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index bb335406d..4a0d014ae 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float = 0.5) +def MinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float = 0.5) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index aaa49bba4..5ad245ead 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ModelParameters(model,model_params = None) +def ModelParameters(model,model_params = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 654e69067..9ae828b5d 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def multiclass_roc_auc_score(y_test,y_pred,average = 'macro') +def multiclass_roc_auc_score(y_test,y_pred,average = 'macro') ::: @@ -24,7 +24,7 @@ toc-expand: 4 ::: {.signature} -def ModelsPerformanceComparison(dataset:VMDataset,models:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'list'}, 'slice': {'cls': 'ExprName', 'name': 'VMModel'}}) +def ModelsPerformanceComparison(dataset:VMDataset,models:VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index a7acece93..c3c9b45f8 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def OverfitDiagnosis(model:VMModel,datasets:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}},metric:str = None,cut_off_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}) +def OverfitDiagnosis(model:VMModel,datasets:VMDataset,metric:str = None,cut_off_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index fafdfd06e..c475146d6 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def PermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'int'}, 'None'], 'implicit': True}} = None,figure_height:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'int'}, 'None'], 'implicit': True}} = None) +def PermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:int, = None,figure_height:int, = None) ::: @@ -69,7 +69,7 @@ PFI is calculated via the `permutation_importance` method from the `sklearn.insp ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 2599498cf..048c52254 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def calculate_psi(score_initial,score_new,num_bins = 10,mode = 'fixed') +def calculate_psi(score_initial,score_new,num_bins = 10,mode = 'fixed') ::: @@ -44,7 +44,7 @@ Taken from: https://towardsdatascience.com/checking-model-stability-and-populati ::: {.signature} -def PopulationStabilityIndex(datasets:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}},model:VMModel,num_bins:int = 10,mode:str = 'fixed') +def PopulationStabilityIndex(datasets:VMDataset,model:VMModel,num_bins:int = 10,mode:str = 'fixed') ::: @@ -87,7 +87,7 @@ The implementation of the PSI in this script involves calculating the PSI for ea ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 9fab57f84..48345e8ef 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def PrecisionRecallCurve(model:VMModel,dataset:VMDataset) +def PrecisionRecallCurve(model:VMModel,dataset:VMDataset) ::: @@ -54,7 +54,7 @@ The test extracts ground truth labels and prediction probabilities from the mode ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 7c8fdb9ea..3294c1a9c 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ROCCurve(model:VMModel,dataset:VMDataset) +def ROCCurve(model:VMModel,dataset:VMDataset) ::: @@ -55,7 +55,7 @@ First, this script selects the target model and datasets that require binary cla ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index b5a900c9a..ff9ff266f 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def RegressionErrors(model,dataset) +def RegressionErrors(model,dataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 26cc6f94b..13858d190 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionErrorsComparison(datasets,models) +def RegressionErrorsComparison(datasets,models) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index b7606b621..4d1b5781f 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionPerformance(model:VMModel,dataset:VMDataset) +def RegressionPerformance(model:VMModel,dataset:VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 5f6a5244d..5a6f40416 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) +def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -def RegressionR2Square(dataset,model) +def RegressionR2Square(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 0a0a2702e..a6238c3c1 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) +def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -def RegressionR2SquareComparison(datasets,models) +def RegressionR2SquareComparison(datasets,models) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index fa19498d0..44dc504ab 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RobustnessDiagnosis(datasets:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}},model:VMModel,metric:str = None,scaling_factor_std_dev_list:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}} = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}) +def RobustnessDiagnosis(datasets:VMDataset,model:VMModel,metric:str = None,scaling_factor_std_dev_list:float = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}) ::: @@ -74,7 +74,7 @@ This test introduces Gaussian noise to the numeric input features of the dataset ::: {.signature} -class MissingOrInvalidModelPredictFnError() +class MissingOrInvalidModelPredictFnError() ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 366c268e7..e0367851f 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def generate_shap_plot(type\_,shap_values,x_test) +def generate_shap_plot(type\_,shap_values,x_test) ::: @@ -54,7 +54,7 @@ Plots two types of SHAP global importance (SHAP). ::: {.signature} -def select_shap_values(shap_values,class_of_interest) +def select_shap_values(shap_values,class_of_interest) ::: @@ -83,7 +83,7 @@ Selects SHAP values for binary or multiclass classification. For regression mode ::: {.signature} -def SHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int = 10,tree_or_linear_explainer_samples:int = 200,class_of_interest:int = None) +def SHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int = 10,tree_or_linear_explainer_samples:int = 200,class_of_interest:int = None) ::: @@ -127,7 +127,7 @@ The exam begins with the selection of a suitable explainer which aligns with the ::: {.signature} -class UnsupportedModelForSHAPError() +class UnsupportedModelForSHAPError() ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 022fa14de..0b70cf718 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str = 'score',n_bins:int = 10) +def ScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str = 'score',n_bins:int = 10) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index aaa6312db..492b6006b 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def SilhouettePlot(model:VMModel,dataset:VMDataset) +def SilhouettePlot(model:VMModel,dataset:VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index ac122c886..7de48b2a1 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TrainingTestDegradation(datasets:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}},model:VMModel,max_threshold:float = 0.1) +def TrainingTestDegradation(datasets:VMDataset,model:VMModel,max_threshold:float = 0.1) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 80b2c1181..8bf4ec812 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def VMeasure(dataset:VMDataset,model:VMModel) +def VMeasure(dataset:VMDataset,model:VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index f21c7ae39..7e170ab69 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def WeakspotsDiagnosis(datasets:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'VMDataset'}},model:VMModel,features_columns:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}, 'None'], 'implicit': True}} = None,metrics:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'Callable'}], 'implicit': True}}, 'None'\], 'implicit': True}} = None,thresholds:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': \[{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Dict'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, {'cls': 'ExprName', 'name': 'float'}], 'implicit': True}}, 'None'\], 'implicit': True}} = None) +def WeakspotsDiagnosis(datasets:VMDataset,model:VMModel,features_columns:, = None,metrics:, = None,thresholds:, = None) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index d4394cd38..c4faa90ae 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def AutoARIMA(model:VMModel,dataset:VMDataset) +def AutoARIMA(model:VMModel,dataset:VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 6f3d1e677..7c24337ae 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def CumulativePredictionProbabilities(dataset,model,title = 'Cumulative Probabilities') +def CumulativePredictionProbabilities(dataset,model,title = 'Cumulative Probabilities') ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 88f049728..ad7119f8d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def DurbinWatsonTest(dataset,model,threshold = {'cls': 'ExprList', 'elements': ['1.5', '2.5']}) +def DurbinWatsonTest(dataset,model,threshold = {'cls': 'ExprList', 'elements': ['1.5', '2.5']}) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index e7ea1383c..f9be844a4 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def GINITable(dataset,model) +def GINITable(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 06cbd8d3d..297223377 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def KolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str = 'norm') +def KolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str = 'norm') ::: @@ -55,7 +55,7 @@ This test calculates the KS statistic and corresponding p-value for each feature ::: {.signature} -class InvalidTestParametersError() +class InvalidTestParametersError() ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index e522046de..f1d1e3c97 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Lilliefors(dataset:VMDataset) +def Lilliefors(dataset:VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index 7ad3aa6d9..12cbf8ebf 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def PredictionProbabilitiesHistogram(dataset,model,title = 'Histogram of Predictive Probabilities') +def PredictionProbabilitiesHistogram(dataset,model,title = 'Histogram of Predictive Probabilities') ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 5b2100dc6..81bfae0eb 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def RegressionCoeffs(model) +def RegressionCoeffs(model) ::: @@ -55,7 +55,7 @@ The function operates by extracting the estimated coefficients and their standar ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 9cf69ca22..76d2ea4c6 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionFeatureSignificance(model:VMModel,fontsize:int = 10,p_threshold:float = 0.05) +def RegressionFeatureSignificance(model:VMModel,fontsize:int = 10,p_threshold:float = 0.05) ::: @@ -69,7 +69,7 @@ The test mechanism involves extracting the model's coefficients and p-values for ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 12f9a55f5..0053248bd 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None,end_date:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None) +def RegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:str, = None,end_date:str, = None) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 067e8d618..97d1032b7 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def integrate_diff(series_diff,start_value) +def integrate_diff(series_diff,start_value) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def RegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset) +def RegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 1714354e8..eae1e6af7 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def integrate_diff(series_diff,start_value) +def integrate_diff(series_diff,start_value) ::: @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'float'}} = {'cls': 'ExprList', 'elements': ['0.1']},transformation:{'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'Union'}, 'slice': {'cls': 'ExprTuple', 'elements': [{'cls': 'ExprName', 'name': 'str'}, 'None'], 'implicit': True}} = None) +def RegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:float = {'cls': 'ExprList', 'elements': ['0.1']},transformation:str, = None) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 218722d52..ae6681d42 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) +def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -def RegressionModelSummary(dataset:VMDataset,model:VMModel) +def RegressionModelSummary(dataset:VMDataset,model:VMModel) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index ce16ec5cc..4fcaedb46 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +def get_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int = 12,figure_height:int = 500) +def RegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int = 12,figure_height:int = 500) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index 55b8c3445..3a631ff67 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ScorecardHistogram(dataset,title = 'Histogram of Scores',score_column = 'score') +def ScorecardHistogram(dataset,title = 'Histogram of Scores',score_column = 'score') ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 88407a521..ed8bb7a6d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) +def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 2b2c78713..93ffb2bea 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -46,7 +46,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: @@ -68,7 +68,7 @@ Explanation: " -> 8 ::: {.signature} -def Bias(model,min_threshold = 7) +def Bias(model,min_threshold = 7) ::: @@ -114,7 +114,7 @@ For each test case, the LLM grades the input prompt on a scale of 1 to 10. It ev ::: {.signature} -class MissingRequiredTestInputError() +class MissingRequiredTestInputError() ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index b3a506f3e..16b0d41c9 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -46,7 +46,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: @@ -68,7 +68,7 @@ Explanation: " -> 8 ::: {.signature} -def Clarity(model,min_threshold = 7) +def Clarity(model,min_threshold = 7) ::: @@ -109,7 +109,7 @@ The evaluation uses an LLM to scrutinize the clarity of prompts, factoring in co ::: {.signature} -class MissingRequiredTestInputError() +class MissingRequiredTestInputError() ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index c66d22d88..908023e21 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -46,7 +46,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: @@ -68,7 +68,7 @@ Explanation: " -> 8 ::: {.signature} -def Conciseness(model,min_threshold = 7) +def Conciseness(model,min_threshold = 7) ::: @@ -111,7 +111,7 @@ Using an LLM, this test conducts a conciseness analysis on input prompts. The an ::: {.signature} -class MissingRequiredTestInputError() +class MissingRequiredTestInputError() ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 00748a168..d9083625e 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -46,7 +46,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: @@ -68,7 +68,7 @@ Explanation: " -> 8 ::: {.signature} -def Delimitation(model,min_threshold = 7) +def Delimitation(model,min_threshold = 7) ::: @@ -110,7 +110,7 @@ The test employs an LLM to examine prompts for appropriate use of delimiters suc ::: {.signature} -class MissingRequiredTestInputError() +class MissingRequiredTestInputError() ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 61071b34a..e7de011f0 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -46,7 +46,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: @@ -68,7 +68,7 @@ Explanation: " -> 8 ::: {.signature} -def NegativeInstruction(model,min_threshold = 7) +def NegativeInstruction(model,min_threshold = 7) ::: @@ -110,7 +110,7 @@ An LLM is employed to evaluate each prompt. The prompt is graded based on its us ::: {.signature} -class MissingRequiredTestInputError() +class MissingRequiredTestInputError() ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 70352310e..38804a5d8 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -28,7 +28,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def Robustness(model,dataset,num_tests = 10) +def Robustness(model,dataset,num_tests = 10) ::: @@ -69,7 +69,7 @@ The Robustness test appraises prompts under various conditions, alterations, and ::: {.signature} -class MissingRequiredTestInputError() +class MissingRequiredTestInputError() ::: @@ -90,7 +90,7 @@ When a required test context variable is missing. ::: {.signature} -class SkipTestError() +class SkipTestError() ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 32b847457..86f3a34ab 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -46,7 +46,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: @@ -68,7 +68,7 @@ Explanation: " -> 8 ::: {.signature} -def Specificity(model,min_threshold = 7) +def Specificity(model,min_threshold = 7) ::: @@ -110,7 +110,7 @@ The Specificity Test employs an LLM to grade each prompt based on clarity, detai ::: {.signature} -class MissingRequiredTestInputError() +class MissingRequiredTestInputError() ::: diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index 863a7feb8..c99115ce3 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -30,7 +30,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -52,7 +52,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 30d9d6ce0..9cefc8cce 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def describe_metric(metric_id:str,kwargs = {}) +def describe_metric(metric_id:str,kwargs = {}) ::: @@ -30,7 +30,7 @@ Describe a metric ::: {.signature} -def list_metrics(kwargs={}) +def list_metrics(kwargs = {}) ::: @@ -46,7 +46,7 @@ List all metrics ::: {.signature} -def run_metric(metric_id:str,kwargs = {}) +def run_metric(metric_id:str,kwargs = {}) ::: diff --git a/docs/validmind/version.qmd b/docs/validmind/version.qmd index 45f1fa8cf..3cfe68a7e 100644 --- a/docs/validmind/version.qmd +++ b/docs/validmind/version.qmd @@ -3,8 +3,10 @@ title: "[validmind](/reference/validmind.html).__version__" sidebar: validmind-reference --- - + -```python -2.8.4 -``` +::: {.signature} + +2.8.4 + +::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index b5f778cfc..8ee7d6ee8 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -18,7 +18,7 @@ Models entrypoint ::: {.signature} -class Figure() +class Figure() ::: @@ -32,7 +32,7 @@ Figure objects track the schema supported by the ValidMind API ::: {.signature} -def serialize(self) +def serialize(self) ::: @@ -46,7 +46,7 @@ Serializes the Figure to a dictionary so it can be sent to the API ::: {.signature} -def serialize_files(self) +def serialize_files(self) ::: @@ -60,7 +60,7 @@ Creates a `requests`-compatible files object to be sent to the API ::: {.signature} -def to_widget(self) +def to_widget(self) ::: @@ -76,7 +76,7 @@ Returns the ipywidget compatible representation of the figure. Ideally we would ::: {.signature} -class ModelAttributes() +class ModelAttributes() ::: @@ -90,7 +90,7 @@ Model attributes definition ::: {.signature} -def from_dict(cls,data) +def from_dict(cls,data) ::: @@ -106,7 +106,7 @@ Creates a ModelAttributes instance from a dictionary ::: {.signature} -class TestSuite() +class TestSuite() ::: @@ -122,7 +122,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -def get_default_config(self)dict: +def get_default_config(self)dict ::: @@ -140,7 +140,7 @@ Returns the default configuration for the test suite Each test in a test suite c ::: {.signature} -def get_tests(self){'cls': 'ExprSubscript', 'left': {'cls': 'ExprName', 'name': 'List'}, 'slice': {'cls': 'ExprName', 'name': 'str'}}: +def get_tests(self) ::: @@ -154,7 +154,7 @@ Get all test suite test objects from all sections ::: {.signature} -def num_tests(self)int: +def num_tests(self)int ::: @@ -170,7 +170,7 @@ Returns the total number of tests in the test suite ::: {.signature} -class TestSuiteRunner() +class TestSuiteRunner() ::: @@ -184,7 +184,7 @@ Runs a test suite ::: {.signature} -def log_results(self) +def log_results(self) ::: @@ -198,7 +198,7 @@ Logs the results of the test suite to ValidMind This method will be called after ::: {.signature} -def run(self,send:bool = True,fail_fast:bool = False) +def run(self,send:bool = True,fail_fast:bool = False) ::: @@ -217,7 +217,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -def summarize(self,show_link:bool = True) +def summarize(self,show_link:bool = True) ::: @@ -229,7 +229,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -class VMDataset() +class VMDataset() ::: @@ -262,7 +262,7 @@ This way we can support multiple dataset types but under the hood we only need t ::: {.signature} -def add_extra_column(self,column_name,column_values = None) +def add_extra_column(self,column_name,column_values = None) ::: @@ -281,7 +281,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -def assign_predictions(self,model:VMModel,prediction_column:str = None,prediction_values:list = None,probability_column:str = None,probability_values:list = None,prediction_probabilities:list = None,kwargs = {}) +def assign_predictions(self,model:VMModel,prediction_column:str = None,prediction_values:list = None,probability_column:str = None,probability_values:list = None,prediction_probabilities:list = None,kwargs = {}) ::: @@ -305,7 +305,7 @@ Assign predictions and probabilities to the dataset. ::: {.signature} -def prediction_column(self,model:VMModel,column_name:str = None)str: +def prediction_column(self,model:VMModel,column_name:str = None)str ::: @@ -319,7 +319,7 @@ Get or set the prediction column for a model. ::: {.signature} -def probability_column(self,model:VMModel,column_name:str = None)str: +def probability_column(self,model:VMModel,column_name:str = None)str ::: @@ -333,7 +333,7 @@ Get or set the probability column for a model. ::: {.signature} -def target_classes(self) +def target_classes(self) ::: @@ -347,7 +347,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -def with_options(self,kwargs = {})VMDataset: +def with_options(self,kwargs = {})validmind.vm_models.VMDataset ::: @@ -370,7 +370,7 @@ Support options provided when passing an input to run_test or run_test_suite ::: {.signature} -def x_df(self) +def x_df(self) ::: @@ -384,7 +384,7 @@ Returns a dataframe containing only the feature columns ::: {.signature} -def y_df(self){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +def y_df(self) ::: @@ -398,7 +398,7 @@ Returns a dataframe containing the target column ::: {.signature} -def y_pred(self,model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: +def y_pred(self,model) ::: @@ -420,7 +420,7 @@ Returns the predictions for a given model. Attempts to stack complex prediction ::: {.signature} -def y_pred_df(self,model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +def y_pred_df(self,model) ::: @@ -434,7 +434,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -def y_prob(self,model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: +def y_prob(self,model) ::: @@ -456,7 +456,7 @@ Returns the probabilities for a given model. ::: {.signature} -def y_prob_df(self,model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +def y_prob_df(self,model) ::: @@ -472,7 +472,7 @@ Returns a dataframe containing the probabilities for a given model ::: {.signature} -class VMInput() +class VMInput() ::: @@ -488,7 +488,7 @@ Base class for ValidMind Input types ::: {.signature} -def with_options(self,kwargs = {})VMInput: +def with_options(self,kwargs = {})validmind.vm_models.VMInput ::: @@ -514,7 +514,7 @@ To allow options, just override this method in the subclass (see VMDataset) and ::: {.signature} -class VMModel() +class VMModel() ::: @@ -537,7 +537,7 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -def predict(self,args = (),kwargs = {}) +def predict(self,args = (),kwargs = {}) ::: @@ -551,7 +551,7 @@ Predict method for the model. This is a wrapper around the model's ::: {.signature} -def predict_proba(self,args = (),kwargs = {}) +def predict_proba(self,args = (),kwargs = {}) ::: @@ -565,7 +565,7 @@ Predict probabilties - must be implemented by subclass if needed ::: {.signature} -def serialize(self) +def serialize(self) ::: From 740620444ea54fd81f15ee17ec64f02e3c2ab87e Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 2 Feb 2025 15:30:42 -0800 Subject: [PATCH 051/207] More signatures fine-tuning --- docs/templates/macros/signatures.jinja2 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index d48c1d7f3..1aad7b4ca 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -63,6 +63,9 @@ {%- else -%} validmind.vm_models.{{ member.returns.name }} {%- endif -%} + {%- else -%} + {# Fallback for other mappings - don't show raw JSON #} + Any {%- endif -%} {%- else -%} {{- member.returns -}} From 1f2d24b9665cc1a4f2bc09aeeab6f5bc233fa576 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 2 Feb 2025 16:32:53 -0800 Subject: [PATCH 052/207] Save point for return annotations --- docs/templates/macros/signatures.jinja2 | 10 ++++++---- docs/validmind/test_suites.qmd | 2 +- docs/validmind/tests.qmd | 2 +- .../tests/data_validation/ClassImbalance.qmd | 2 +- .../tests/data_validation/DescriptiveStatistics.qmd | 2 +- docs/validmind/vm_models.qmd | 12 ++++++------ 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index 1aad7b4ca..0691367fb 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -54,8 +54,7 @@ {%- if member.returns -%} {%- if member.returns is mapping -%} - {%- if 'values' in member.returns and member.returns.values is iterable -%} - {# Handle np.ndarray case #} + {%- if 'values' in member.returns and member.returns.values is sequence -%} {{- member.returns.values | map(attribute='name') | join('.') -}} {%- elif 'name' in member.returns -%} {%- if member.returns.name in ['str', 'dict', 'list', 'bool', 'int', 'float'] -%} @@ -63,12 +62,15 @@ {%- else -%} validmind.vm_models.{{ member.returns.name }} {%- endif -%} + {%- elif member.returns.cls == 'ExprSubscript' -%} + {# Handle generic types like List[str] #} + {{- member.returns.left.name }}[{{- member.returns.slice.name -}}] {%- else -%} - {# Fallback for other mappings - don't show raw JSON #} + {# Fallback for other mappings #} Any {%- endif -%} {%- else -%} - {{- member.returns -}} + {{- member.returns if member.returns else 'Any' -}} {%- endif -%} {%- endif +%} diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 0482ecaf3..a65c0961a 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,7 +29,7 @@ Entrypoint for test suites. ::: {.signature} -def format_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}) +def format_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}) Any ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index aef4074c2..619ece71a 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -381,7 +381,7 @@ Protocol for user-defined test providers ::: {.signature} -def list_tests(self) +def list_tests(self)List[str] ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index f68990179..0a36e6d55 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -def ClassImbalance(dataset:VMDataset,min_percent_threshold:int = 10) +def ClassImbalance(dataset:VMDataset,min_percent_threshold:int = 10)Tuple[] ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index bcce4ea92..d46057117 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def format_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}) +def format_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List[] ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 8ee7d6ee8..0b97394e9 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -140,7 +140,7 @@ Returns the default configuration for the test suite Each test in a test suite c ::: {.signature} -def get_tests(self) +def get_tests(self)List[str] ::: @@ -384,7 +384,7 @@ Returns a dataframe containing only the feature columns ::: {.signature} -def y_df(self) +def y_df(self) Any ::: @@ -398,7 +398,7 @@ Returns a dataframe containing the target column ::: {.signature} -def y_pred(self,model) +def y_pred(self,model) Any ::: @@ -420,7 +420,7 @@ Returns the predictions for a given model. Attempts to stack complex prediction ::: {.signature} -def y_pred_df(self,model) +def y_pred_df(self,model) Any ::: @@ -434,7 +434,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -def y_prob(self,model) +def y_prob(self,model) Any ::: @@ -456,7 +456,7 @@ Returns the probabilities for a given model. ::: {.signature} -def y_prob_df(self,model) +def y_prob_df(self,model) Any ::: From 5140934513713ff47e518795f58ab0ceb64cb55a Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 2 Feb 2025 18:08:26 -0800 Subject: [PATCH 053/207] Save point with most return annotations fixed but still getting NoneNoneNoneTuple --- docs/templates/macros/signatures.jinja2 | 53 +++++++++++++------ docs/validmind.qmd | 8 +-- docs/validmind/test_suites.qmd | 2 +- docs/validmind/tests.qmd | 4 +- .../tests/data_validation/ClassImbalance.qmd | 2 +- docs/validmind/vm_models.qmd | 14 ++--- 6 files changed, 52 insertions(+), 31 deletions(-) diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index 0691367fb..7e2b63e1a 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -52,26 +52,47 @@ {%- else -%}() {%- endif -%} {%- if member.returns -%} + - {%- if member.returns is mapping -%} - {%- if 'values' in member.returns and member.returns.values is sequence -%} - {{- member.returns.values | map(attribute='name') | join('.') -}} - {%- elif 'name' in member.returns -%} - {%- if member.returns.name in ['str', 'dict', 'list', 'bool', 'int', 'float'] -%} - {{- member.returns.name -}} - {%- else -%} - validmind.vm_models.{{ member.returns.name }} - {%- endif -%} - {%- elif member.returns.cls == 'ExprSubscript' -%} - {# Handle generic types like List[str] #} - {{- member.returns.left.name }}[{{- member.returns.slice.name -}}] +{%- if member.returns is mapping -%} + {%- if 'values' in member.returns and member.returns.values is sequence -%} + {{ member.returns.values | selectattr('name', 'defined') | map(attribute='name') | join('.') }} + {%- elif 'name' in member.returns -%} + {%- if member.returns.name in ['str', 'dict', 'list', 'bool', 'int', 'float'] -%} + {{ member.returns.name }} {%- else -%} - {# Fallback for other mappings #} - Any + + validmind.vm_models.{{ member.returns.name }} + + {%- endif -%} + {%- elif member.returns.cls == 'ExprAttribute' and 'values' in member.returns -%} + {%- set values_list = member.returns['values'] if member.returns['values'] is sequence else [] -%} + {%- set extracted_values = values_list | selectattr('name', 'defined') | map(attribute='name') | list -%} + {{ extracted_values | join('.') if extracted_values else 'ExprAttribute' }} +{%- elif member.returns.cls == 'ExprSubscript' -%} + {%- if member.returns.slice.cls == 'ExprTuple' -%} + {%- set extracted_elements = [] -%} + {%- for element in member.returns.slice.elements -%} + {%- if element.cls == 'ExprSubscript' -%} + {{ extracted_elements.append(element.left.name ~ '[' ~ element.slice.elements | map(attribute='name') | join(', ') ~ ']') }} + {%- elif element.cls == 'ExprAttribute' and 'values' in element -%} + {%- set attr_values = element['values'] if element['values'] is sequence else [] -%} + {{ extracted_elements.append(attr_values | map(attribute='name') | join('.')) }} + {%- elif 'name' in element -%} + {{ extracted_elements.append(element.name) }} + {%- else -%} + {{ extracted_elements.append('Unknown') }} + {%- endif -%} + {%- endfor -%} + + {{ member.returns.left.name }}[{{ extracted_elements | join(', ') }}] + {%- else -%} + {{ member.returns.left.name }}[{{ member.returns.slice.name }}] {%- endif -%} - {%- else -%} - {{- member.returns if member.returns else 'Any' -}} {%- endif -%} +{%- else -%} + {{ member.returns if member.returns else 'Any' }} +{%- endif -%} {%- endif +%} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index a2a5211fa..6e08d69f8 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -53,7 +53,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -def get_test_suite(test_suite_id:str = None,section:str = None,args = (),kwargs = {})validmind.vm_models.TestSuite +def get_test_suite(test_suite_id:str = None,section:str = None,args = (),kwargs = {}) validmind.vm_models.TestSuite ::: @@ -104,7 +104,7 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -def init_dataset(dataset,model = None,index = None,index_name:str = None,date_time_index:bool = False,columns:list = None,text_column:str = None,target_column:str = None,feature_columns:list = None,extra_columns:dict = None,class_labels:dict = None,type:str = None,input_id:str = None,\_\_log = True)validmind.vm_models.VMDataset +def init_dataset(dataset,model = None,index = None,index_name:str = None,date_time_index:bool = False,columns:list = None,text_column:str = None,target_column:str = None,feature_columns:list = None,extra_columns:dict = None,class_labels:dict = None,type:str = None,input_id:str = None,\_\_log = True) validmind.vm_models.VMDataset ::: @@ -131,7 +131,7 @@ Returns: vm.vm.Dataset: A VM Dataset instance ::: {.signature} -def init_model(model:object = None,input_id:str = 'model',attributes:dict = None,predict_fn:callable = None,\_\_log = True,kwargs = {})validmind.vm_models.VMModel +def init_model(model:object = None,input_id:str = 'model',attributes:dict = None,predict_fn:callable = None,\_\_log = True,kwargs = {}) validmind.vm_models.VMModel ::: @@ -161,7 +161,7 @@ Initializes a VM Model, which can then be passed to other functions that can per ::: {.signature} -def init_r_model(model_path:str,input_id:str = 'model')validmind.vm_models.VMModel +def init_r_model(model_path:str,input_id:str = 'model') validmind.vm_models.VMModel ::: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index a65c0961a..298cf9f67 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,7 +29,7 @@ Entrypoint for test suites. ::: {.signature} -def format_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}) Any +def format_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})pd.DataFrame ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 619ece71a..5ce4fa659 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -130,7 +130,7 @@ Load a test by test ID Test IDs are in the format `namespace.path_to_module.Test ::: {.signature} -def run_test(test_id:TestID, = None,name:str, = None,unit_metrics:, = None,inputs:, = None,input_grid:, , = None,params:, = None,param_grid:, , = None,show:bool = True,generate_description:bool = True,title:str = None,post_process_fn:, = None,kwargs = {})validmind.vm_models.TestResult +def run_test(test_id:TestID, = None,name:str, = None,unit_metrics:, = None,inputs:, = None,input_grid:, , = None,params:, = None,param_grid:, , = None,show:bool = True,generate_description:bool = True,title:str = None,post_process_fn:, = None,kwargs = {}) validmind.vm_models.TestResult ::: @@ -399,7 +399,7 @@ List all tests in the given namespace ::: {.signature} -def load_test(self,test_id:str)validmind.vm_models.callable +def load_test(self,test_id:str) validmind.vm_models.callable ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 0a36e6d55..51889849b 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -def ClassImbalance(dataset:VMDataset,min_percent_threshold:int = 10)Tuple[] +def ClassImbalance(dataset:VMDataset,min_percent_threshold:int = 10)NoneNoneNoneTuple\[Dict[str, Any], go.Figure, bool\] ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 0b97394e9..086c98a67 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -347,7 +347,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -def with_options(self,kwargs = {})validmind.vm_models.VMDataset +def with_options(self,kwargs = {}) validmind.vm_models.VMDataset ::: @@ -384,7 +384,7 @@ Returns a dataframe containing only the feature columns ::: {.signature} -def y_df(self) Any +def y_df(self)pd.DataFrame ::: @@ -398,7 +398,7 @@ Returns a dataframe containing the target column ::: {.signature} -def y_pred(self,model) Any +def y_pred(self,model)np.ndarray ::: @@ -420,7 +420,7 @@ Returns the predictions for a given model. Attempts to stack complex prediction ::: {.signature} -def y_pred_df(self,model) Any +def y_pred_df(self,model)pd.DataFrame ::: @@ -434,7 +434,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -def y_prob(self,model) Any +def y_prob(self,model)np.ndarray ::: @@ -456,7 +456,7 @@ Returns the probabilities for a given model. ::: {.signature} -def y_prob_df(self,model) Any +def y_prob_df(self,model)pd.DataFrame ::: @@ -488,7 +488,7 @@ Base class for ValidMind Input types ::: {.signature} -def with_options(self,kwargs = {})validmind.vm_models.VMInput +def with_options(self,kwargs = {}) validmind.vm_models.VMInput ::: From 863007d2b858c340bbd66145b9cc3e7a41a2ccde Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 2 Feb 2025 18:15:41 -0800 Subject: [PATCH 054/207] Save point with most return annotations fixed but still getting NoneNoneNoneTuple --- docs/templates/macros/docstring.jinja2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/templates/macros/docstring.jinja2 b/docs/templates/macros/docstring.jinja2 index 11fab75a7..e05df020a 100644 --- a/docs/templates/macros/docstring.jinja2 +++ b/docs/templates/macros/docstring.jinja2 @@ -23,7 +23,7 @@ {%- set desc = desc[:-1] ~ ')' -%} {%- endif -%} {%- if param.type_name -%} - {%- set type_info = param.type_name -%} + {%- set type_info = '(' ~ param.type_name ~ ')' -%} {%- if type_info.endswith(')') and not type_info.startswith('(') -%} {%- set type_info = '(' ~ type_info -%} {%- endif -%} From 2dba7c1edb9c91f4c21f206ec9bcd05703ea6377 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 2 Feb 2025 18:16:46 -0800 Subject: [PATCH 055/207] Fix docstrings --- docs/validmind.qmd | 60 +++++++++---------- .../classification/customer_churn.qmd | 12 ++-- .../datasets/classification/taiwan_credit.qmd | 12 ++-- docs/validmind/datasets/regression/fred.qmd | 8 +-- .../datasets/regression/lending_club.qmd | 8 +-- docs/validmind/test_suites.qmd | 2 +- docs/validmind/tests.qmd | 48 +++++++-------- docs/validmind/vm_models.qmd | 56 ++++++++--------- 8 files changed, 103 insertions(+), 103 deletions(-) diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 6e08d69f8..c97156b4e 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -63,8 +63,8 @@ Gets a TestSuite object for the current project or a specific test suite This fu **Parameters** -- **test_suite_id** str: The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. -- **section** str: The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. +- **test_suite_id** (str): The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. +- **section** (str): The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. - **args**: Additional arguments to pass to the TestSuite - **kwargs**: Additional keyword arguments to pass to the TestSuite @@ -86,13 +86,13 @@ If the API key and secret are not provided, the client will attempt to retrieve **Parameters** -- **project** str: The project CUID. Alias for model. Defaults to None. [DEPRECATED] -- **model** str: The model CUID. Defaults to None. -- **api_key** str: The API key. Defaults to None. -- **api_secret** str: The API secret. Defaults to None. -- **api_host** str: The API host. Defaults to None. -- **monitoring** bool: The ongoing monitoring flag. Defaults to False. -- **generate_descriptions** bool: Whether to use GenAI to generate test result descriptions. Defaults to True. +- **project** (str): The project CUID. Alias for model. Defaults to None. [DEPRECATED] +- **model** (str): The model CUID. Defaults to None. +- **api_key** (str): The API key. Defaults to None. +- **api_secret** (str): The API secret. Defaults to None. +- **api_host** (str): The API host. Defaults to None. +- **monitoring** (bool): The ongoing monitoring flag. Defaults to False. +- **generate_descriptions** (bool): Whether to use GenAI to generate test result descriptions. Defaults to True. **Raises** @@ -142,9 +142,9 @@ Initializes a VM Model, which can then be passed to other functions that can per **Parameters** - **model**: A trained model or VMModel instance -- **input_id** str: The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. -- **attributes** dict: A dictionary of model attributes -- **predict_fn** callable: A function that takes an input and returns a prediction +- **input_id** (str): The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. +- **attributes** (dict): A dictionary of model attributes +- **predict_fn** (callable): A function that takes an input and returns a prediction - \*\***kwargs**: Additional arguments to pass to the model **Returns** @@ -178,8 +178,8 @@ LogisticRegression and LinearRegression models are converted to sklearn models b **Parameters** -- **model_path** str: The path to the R model saved as an RDS or XGB file -- **model_type** str: The type of the model (one of R_MODEL_TYPES) +- **model_path** (str): The path to the R model saved as an RDS or XGB file +- **model_type** (str): The type of the model (one of R_MODEL_TYPES) **Returns** @@ -201,12 +201,12 @@ Logs a unit metric Unit metrics are key-value pairs where the key is the metric **Parameters** -- **key** str: The metric key -- **value** float: The metric value -- **inputs** list: A list of input IDs that were used to compute the metric. -- **params** dict: Dictionary of parameters used to compute the metric. -- **recorded_at** str: The timestamp of the metric. Server will use current time if not provided. -- **thresholds** dict: Dictionary of thresholds for the metric. +- **key** (str): The metric key +- **value** (float): The metric value +- **inputs** (list): A list of input IDs that were used to compute the metric. +- **params** (dict): Dictionary of parameters used to compute the metric. +- **recorded_at** (str): The timestamp of the metric. Server will use current time if not provided. +- **thresholds** (dict): Dictionary of thresholds for the metric. ### preview_template() @@ -270,10 +270,10 @@ Collect and run all the tests associated with a template This function will anal **Parameters** -- **section** str or list: The section(s) to preview. Defaults to None. -- **send** bool: Whether to send the results to the ValidMind API. Defaults to True. -- **fail_fast** bool: Whether to stop running tests after the first failure. Defaults to False. -- **inputs** dict: A dictionary of test inputs to pass to the TestSuite +- **section** (str or list): The section(s) to preview. Defaults to None. +- **send** (bool): Whether to send the results to the ValidMind API. Defaults to True. +- **fail_fast** (bool): Whether to stop running tests after the first failure. Defaults to False. +- **inputs** (dict): A dictionary of test inputs to pass to the TestSuite - **config**: A dictionary of test parameters to override the defaults - \*\***kwargs**: backwards compatibility for passing in test inputs using keyword arguments @@ -301,11 +301,11 @@ High Level function for running a test suite This function provides a high level **Parameters** -- **test_suite_id** str: The test suite name (e.g. 'classifier_full_suite') -- **config** dict: A dictionary of parameters to pass to the tests in the test suite. Defaults to None. -- **send** bool: Whether to post the test results to the API. send=False is useful for testing. Defaults to True. -- **fail_fast** bool: Whether to stop running tests after the first failure. Defaults to False. -- **inputs** dict: A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` `models` etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. +- **test_suite_id** (str): The test suite name (e.g. 'classifier_full_suite') +- **config** (dict): A dictionary of parameters to pass to the tests in the test suite. Defaults to None. +- **send** (bool): Whether to post the test results to the API. send=False is useful for testing. Defaults to True. +- **fail_fast** (bool): Whether to stop running tests after the first failure. Defaults to False. +- **inputs** (dict): A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` `models` etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. - \*\***kwargs**: backwards compatibility for passing in test inputs using keyword arguments **Returns** @@ -421,7 +421,7 @@ Create a new RawData object **Parameters** -- **log** bool: If True, log the raw data to ValidMind +- **log** (bool): If True, log the raw data to ValidMind - \*\***kwargs**: Keyword arguments to set as attributes e.g. `RawData(log=True, dataset_duplicates=df_duplicates)` #### inspect() diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index 2b532841a..e269b0031 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -22,8 +22,8 @@ Preprocess boolean columns. **Parameters** -- **df** pandas.DataFrame: Dataframe to preprocess. -- **columns** list: List of columns to preprocess. +- **df** (pandas.DataFrame): Dataframe to preprocess. +- **columns** (list): List of columns to preprocess. **Returns** @@ -45,8 +45,8 @@ Preprocess categorical columns. **Parameters** -- **df** pandas.DataFrame: Dataframe to preprocess. -- **columns** list: List of columns to preprocess. +- **df** (pandas.DataFrame): Dataframe to preprocess. +- **columns** (list): List of columns to preprocess. **Returns** @@ -68,8 +68,8 @@ Preprocess numerical columns. **Parameters** -- **df** pandas.DataFrame: Dataframe to preprocess. -- **columns** list: List of columns to preprocess. +- **df** (pandas.DataFrame): Dataframe to preprocess. +- **columns** (list): List of columns to preprocess. **Returns** diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index c5ac35e65..155c4a7bf 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -22,8 +22,8 @@ Preprocess boolean columns. **Parameters** -- **df** pandas.DataFrame: Dataframe to preprocess. -- **columns** list: List of columns to preprocess. +- **df** (pandas.DataFrame): Dataframe to preprocess. +- **columns** (list): List of columns to preprocess. **Returns** @@ -45,8 +45,8 @@ Preprocess categorical columns. **Parameters** -- **df** pandas.DataFrame: Dataframe to preprocess. -- **columns** list: List of columns to preprocess. +- **df** (pandas.DataFrame): Dataframe to preprocess. +- **columns** (list): List of columns to preprocess. **Returns** @@ -68,8 +68,8 @@ Preprocess numerical columns. **Parameters** -- **df** pandas.DataFrame: Dataframe to preprocess. -- **columns** list: List of columns to preprocess. +- **df** (pandas.DataFrame): Dataframe to preprocess. +- **columns** (list): List of columns to preprocess. **Returns** diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index 36f92adbd..ca7d95b2a 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -96,10 +96,10 @@ Split a time series DataFrame into train, validation, and test sets. **Parameters** -- **df** pandas.DataFrame: The time series DataFrame to be split. -- **split_option** str: The split option to choose from: 'train_test_val' (default) or 'train_test'. -- **train_size** float: The proportion of the dataset to include in the training set. Default is 0.6. -- **test_size** float: The proportion of the dataset to include in the test set. Default is 0.2. +- **df** (pandas.DataFrame): The time series DataFrame to be split. +- **split_option** (str): The split option to choose from: 'train_test_val' (default) or 'train_test'. +- **train_size** (float): The proportion of the dataset to include in the training set. Default is 0.6. +- **test_size** (float): The proportion of the dataset to include in the test set. Default is 0.2. **Returns** diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index c6859a48b..431c7bafb 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -36,10 +36,10 @@ Split a time series DataFrame into train, validation, and test sets. **Parameters** -- **df** pandas.DataFrame: The time series DataFrame to be split. -- **split_option** str: The split option to choose from: 'train_test_val' (default) or 'train_test'. -- **train_size** float: The proportion of the dataset to include in the training set. Default is 0.6. -- **test_size** float: The proportion of the dataset to include in the test set. Default is 0.2. +- **df** (pandas.DataFrame): The time series DataFrame to be split. +- **split_option** (str): The split option to choose from: 'train_test_val' (default) or 'train_test'. +- **train_size** (float): The proportion of the dataset to include in the training set. Default is 0.6. +- **test_size** (float): The proportion of the dataset to include in the test set. Default is 0.2. **Returns** diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 298cf9f67..030acb8ed 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -67,7 +67,7 @@ Convert a test ID to a human-readable name. **Parameters** -- **test_id** str: The test identifier, typically in CamelCase or snake_case. +- **test_id** (str): The test identifier, typically in CamelCase or snake_case. **Returns** diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 5ce4fa659..f3782a120 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -30,8 +30,8 @@ Get or show details about the test This function can be used to see test details **Parameters** -- **test_id** str: The test ID. Defaults to None. -- **raw** bool: If True, returns a dictionary with the test details. Defaults to False. +- **test_id** (str): The test ID. Defaults to None. +- **raw** (bool): If True, returns a dictionary with the test details. Defaults to False. ## list_tags() @@ -95,11 +95,11 @@ List all tests in the tests directory. **Parameters** -- **filter** str: Find tests where the ID, tasks or tags match the filter string. Defaults to None. -- **task** str: Find tests that match the task. Can be used to narrow down matches from the filter string. Defaults to None. -- **tags** list: Find tests that match list of tags. Can be used to narrow down matches from the filter string. Defaults to None. -- **pretty** bool: If True, returns a pandas DataFrame with a formatted table. Defaults to True. -- **truncate** bool: If True, truncates the test description to the first line. Defaults to True. (only used if pretty=True) +- **filter** (str): Find tests where the ID, tasks or tags match the filter string. Defaults to None. +- **task** (str): Find tests that match the task. Can be used to narrow down matches from the filter string. Defaults to None. +- **tags** (list): Find tests that match list of tags. Can be used to narrow down matches from the filter string. Defaults to None. +- **pretty** (bool): If True, returns a pandas DataFrame with a formatted table. Defaults to True. +- **truncate** (bool): If True, truncates the test description to the first line. Defaults to True. (only used if pretty=True) **Returns** @@ -121,8 +121,8 @@ Load a test by test ID Test IDs are in the format `namespace.path_to_module.Test **Parameters** -- **test_id** str: The test ID in the format `namespace.path_to_module.TestName[:tag]` -- **test_func** callable: The test function to load. If not provided, the test will be loaded from the test provider. Defaults to None. +- **test_id** (str): The test ID in the format `namespace.path_to_module.TestName[:tag]` +- **test_func** (callable): The test function to load. If not provided, the test will be loaded from the test provider. Defaults to None. ## run_test() @@ -140,21 +140,21 @@ Run a ValidMind or custom test This function is the main entry point for running **Parameters** -- **test_id** TestID: Test ID to run. Not required if `name` and `unit_metrics` provided. -- **params** dict: Parameters to customize test behavior. See test details for available parameters. -- **param_grid** Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\]: For comparison tests, either: +- **test_id** (TestID): Test ID to run. Not required if `name` and `unit_metrics` provided. +- **params** (dict): Parameters to customize test behavior. See test details for available parameters. +- **param_grid** (Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\]): For comparison tests, either: - Dict mapping parameter names to lists of values (creates Cartesian product) - List of parameter dictionaries to test -- **inputs** Dict\[str, Any\]: Test inputs (models/datasets initialized with vm.init_model/dataset) -- **input_grid** Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\]: For comparison tests, either: +- **inputs** (Dict[str, Any]): Test inputs (models/datasets initialized with vm.init_model/dataset) +- **input_grid** (Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\]): For comparison tests, either: - Dict mapping input names to lists of values (creates Cartesian product) - List of input dictionaries to test -- **name** str: Test name (required for composite metrics) -- **unit_metrics** list: Unit metric IDs to run as composite metric -- **show** bool: Whether to display results. Defaults to True. -- **generate_description** bool: Whether to generate a description. Defaults to True. -- **title** str: Custom title for the test result -- **post_process_fn** Callable\[[TestResult], None\]: Function to post-process the test result +- **name** (str): Test name (required for composite metrics) +- **unit_metrics** (list): Unit metric IDs to run as composite metric +- **show** (bool): Whether to display results. Defaults to True. +- **generate_description** (bool): Whether to generate a description. Defaults to True. +- **title** (str): Custom title for the test result +- **post_process_fn** (Callable\[[TestResult], None\]): Function to post-process the test result **Returns** @@ -256,8 +256,8 @@ Register an external test provider **Parameters** -- **namespace** str: The namespace of the test provider -- **test_provider** TestProvider: The test provider +- **namespace** (str): The namespace of the test provider +- **test_provider** (TestProvider): The test provider @@ -319,7 +319,7 @@ test = test_provider.load_test("my_namespace.my_test_class") **Parameters** -- **root_folder** str: The root directory for local tests. +- **root_folder** (str): The root directory for local tests. ### [list_tests[()]{.muted}](#list_tests) @@ -409,7 +409,7 @@ Load the test function identified by the given test_id **Parameters** -- **test_id** str: The test ID (does not contain the namespace under which the test is registered) +- **test_id** (str): The test ID (does not contain the namespace under which the test is registered) **Returns** diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 086c98a67..260ae7109 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -208,8 +208,8 @@ Runs the test suite, renders the summary and sends the results to ValidMind **Parameters** -- **send** bool: Whether to send the results to ValidMind. Defaults to True. -- **fail_fast** bool: Whether to stop running tests after the first failure. Defaults to False. +- **send** (bool): Whether to send the results to ValidMind. Defaults to True. +- **fail_fast** (bool): Whether to stop running tests after the first failure. Defaults to False. ### [summarize[()]{.muted}](#summarize) @@ -241,18 +241,18 @@ This way we can support multiple dataset types but under the hood we only need t **Parameters** -- **raw_dataset** np.ndarray: The raw dataset as a NumPy array. -- **input_id** str: Identifier for the dataset. -- **index** np.ndarray: The raw dataset index as a NumPy array. -- **columns** Set\[str\]: The column names of the dataset. -- **target_column** str: The target column name of the dataset. -- **feature_columns** List\[str\]: The feature column names of the dataset. -- **feature_columns_numeric** List\[str\]: The numeric feature column names of the dataset. -- **feature_columns_categorical** List\[str\]: The categorical feature column names of the dataset. -- **text_column** str: The text column name of the dataset for NLP tasks. -- **target_class_labels** Dict: The class labels for the target columns. -- **df** pd.DataFrame: The dataset as a pandas DataFrame. -- **extra_columns** Dict: Extra columns to include in the dataset. +- **raw_dataset** (np.ndarray): The raw dataset as a NumPy array. +- **input_id** (str): Identifier for the dataset. +- **index** (np.ndarray): The raw dataset index as a NumPy array. +- **columns** (Set[str]): The column names of the dataset. +- **target_column** (str): The target column name of the dataset. +- **feature_columns** (List[str]): The feature column names of the dataset. +- **feature_columns_numeric** (List[str]): The numeric feature column names of the dataset. +- **feature_columns_categorical** (List[str]): The categorical feature column names of the dataset. +- **text_column** (str): The text column name of the dataset for NLP tasks. +- **target_class_labels** (Dict): The class labels for the target columns. +- **df** (pd.DataFrame): The dataset as a pandas DataFrame. +- **extra_columns** (Dict): Extra columns to include in the dataset. **Inherited members** @@ -272,8 +272,8 @@ Adds an extra column to the dataset without modifying the dataset `features` and **Parameters** -- **column_name** str: The name of the extra column. -- **column_values** np.ndarray: The values of the extra column. +- **column_name** (str): The name of the extra column. +- **column_values** (np.ndarray): The values of the extra column. ### [assign_predictions[()]{.muted}](#assign_predictions) @@ -291,12 +291,12 @@ Assign predictions and probabilities to the dataset. **Parameters** -- **model** VMModel: The model used to generate the predictions. -- **prediction_column** str: The name of the column containing the predictions. Defaults to None. -- **prediction_values** list: The values of the predictions. Defaults to None. -- **probability_column** str: The name of the column containing the probabilities. Defaults to None. -- **probability_values** list: The values of the probabilities. Defaults to None. -- **prediction_probabilities** list: DEPRECATED: The values of the probabilities. Defaults to None. +- **model** (VMModel): The model used to generate the predictions. +- **prediction_column** (str): The name of the column containing the predictions. Defaults to None. +- **prediction_values** (list): The values of the predictions. Defaults to None. +- **probability_column** (str): The name of the column containing the probabilities. Defaults to None. +- **probability_values** (list): The values of the probabilities. Defaults to None. +- **prediction_probabilities** (list): DEPRECATED: The values of the probabilities. Defaults to None. - **kwargs**: Additional keyword arguments that will get passed through to the model's `predict` method. ### [prediction_column[()]{.muted}](#prediction_column) @@ -408,7 +408,7 @@ Returns the predictions for a given model. Attempts to stack complex prediction **Parameters** -- **model** VMModel: The model whose predictions are sought. +- **model** (VMModel): The model whose predictions are sought. **Returns** @@ -444,7 +444,7 @@ Returns the probabilities for a given model. **Parameters** -- **model** str: The ID of the model whose predictions are sought. +- **model** (str): The ID of the model whose predictions are sought. **Returns** @@ -524,10 +524,10 @@ An base class that wraps a trained model instance and its associated data. **Parameters** -- **model** object: The trained model instance. Defaults to None. -- **input_id** str: The input ID for the model. Defaults to None. -- **attributes** ModelAttributes: The attributes of the model. Defaults to None. -- **name** str: The name of the model. Defaults to the class name. +- **model** (object): The trained model instance. Defaults to None. +- **input_id** (str): The input ID for the model. Defaults to None. +- **attributes** (ModelAttributes): The attributes of the model. Defaults to None. +- **name** (str): The name of the model. Defaults to the class name. **Inherited members** From 3d91dea6dc6eb7c3a86359eed9374e0779d27422 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 2 Feb 2025 18:25:19 -0800 Subject: [PATCH 056/207] Fix docstrings --- docs/templates/macros/docstring.jinja2 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/templates/macros/docstring.jinja2 b/docs/templates/macros/docstring.jinja2 index e05df020a..cd5e8b175 100644 --- a/docs/templates/macros/docstring.jinja2 +++ b/docs/templates/macros/docstring.jinja2 @@ -22,11 +22,11 @@ {%- if desc.endswith(')') and '(default:' in desc -%} {%- set desc = desc[:-1] ~ ')' -%} {%- endif -%} + + {# Check if the parameter has a type annotation #} {%- if param.type_name -%} - {%- set type_info = '(' ~ param.type_name ~ ')' -%} - {%- if type_info.endswith(')') and not type_info.startswith('(') -%} - {%- set type_info = '(' ~ type_info -%} - {%- endif -%} + {%- set is_optional = param.value == "None" -%} + {%- set type_info = '(' ~ param.type_name ~ (', optional' if is_optional else '') ~ ')' -%} {%- set _ = sections.append("- **" ~ param.arg_name ~ "** " ~ type_info ~ ": " ~ desc) -%} {%- else -%} {%- set _ = sections.append("- **" ~ param.arg_name ~ "**: " ~ desc) -%} @@ -34,7 +34,7 @@ {%- endif -%} {%- endfor -%} {%- endif -%} - + {# Returns #} {%- if docstring.parsed.returns -%} {%- set _ = sections.append("\n**Returns**") -%} From cb66108dcd7cfe2a48aacd7c5dfadc1bb743cca6 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 2 Feb 2025 18:28:31 -0800 Subject: [PATCH 057/207] Fixed docstring defaults when set to None --- docs/templates/macros/docstring.jinja2 | 12 ++++++++---- docs/validmind.qmd | 12 ++++++------ docs/validmind/tests.qmd | 2 +- docs/validmind/vm_models.qmd | 16 ++++++++-------- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/docs/templates/macros/docstring.jinja2 b/docs/templates/macros/docstring.jinja2 index cd5e8b175..bdd4ee6da 100644 --- a/docs/templates/macros/docstring.jinja2 +++ b/docs/templates/macros/docstring.jinja2 @@ -22,11 +22,15 @@ {%- if desc.endswith(')') and '(default:' in desc -%} {%- set desc = desc[:-1] ~ ')' -%} {%- endif -%} - - {# Check if the parameter has a type annotation #} {%- if param.type_name -%} - {%- set is_optional = param.value == "None" -%} - {%- set type_info = '(' ~ param.type_name ~ (', optional' if is_optional else '') ~ ')' -%} + {%- set type_info = '(' ~ param.type_name -%} + {%- if param.default == "None" -%} + {%- set type_info = type_info ~ ', optional' -%} + {%- endif -%} + {%- set type_info = type_info ~ ')' -%} + {%- if type_info.endswith(')') and not type_info.startswith('(') -%} + {%- set type_info = '(' ~ type_info -%} + {%- endif -%} {%- set _ = sections.append("- **" ~ param.arg_name ~ "** " ~ type_info ~ ": " ~ desc) -%} {%- else -%} {%- set _ = sections.append("- **" ~ param.arg_name ~ "**: " ~ desc) -%} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index c97156b4e..e4310e906 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -86,11 +86,11 @@ If the API key and secret are not provided, the client will attempt to retrieve **Parameters** -- **project** (str): The project CUID. Alias for model. Defaults to None. [DEPRECATED] -- **model** (str): The model CUID. Defaults to None. -- **api_key** (str): The API key. Defaults to None. -- **api_secret** (str): The API secret. Defaults to None. -- **api_host** (str): The API host. Defaults to None. +- **project** (str, optional): The project CUID. Alias for model. Defaults to None. [DEPRECATED] +- **model** (str, optional): The model CUID. Defaults to None. +- **api_key** (str, optional): The API key. Defaults to None. +- **api_secret** (str, optional): The API secret. Defaults to None. +- **api_host** (str, optional): The API host. Defaults to None. - **monitoring** (bool): The ongoing monitoring flag. Defaults to False. - **generate_descriptions** (bool): Whether to use GenAI to generate test result descriptions. Defaults to True. @@ -270,7 +270,7 @@ Collect and run all the tests associated with a template This function will anal **Parameters** -- **section** (str or list): The section(s) to preview. Defaults to None. +- **section** (str or list, optional): The section(s) to preview. Defaults to None. - **send** (bool): Whether to send the results to the ValidMind API. Defaults to True. - **fail_fast** (bool): Whether to stop running tests after the first failure. Defaults to False. - **inputs** (dict): A dictionary of test inputs to pass to the TestSuite diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index f3782a120..36ff2a87d 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -30,7 +30,7 @@ Get or show details about the test This function can be used to see test details **Parameters** -- **test_id** (str): The test ID. Defaults to None. +- **test_id** (str, optional): The test ID. Defaults to None. - **raw** (bool): If True, returns a dictionary with the test details. Defaults to False. ## list_tags() diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 260ae7109..c45b4985c 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -292,11 +292,11 @@ Assign predictions and probabilities to the dataset. **Parameters** - **model** (VMModel): The model used to generate the predictions. -- **prediction_column** (str): The name of the column containing the predictions. Defaults to None. -- **prediction_values** (list): The values of the predictions. Defaults to None. -- **probability_column** (str): The name of the column containing the probabilities. Defaults to None. -- **probability_values** (list): The values of the probabilities. Defaults to None. -- **prediction_probabilities** (list): DEPRECATED: The values of the probabilities. Defaults to None. +- **prediction_column** (str, optional): The name of the column containing the predictions. Defaults to None. +- **prediction_values** (list, optional): The values of the predictions. Defaults to None. +- **probability_column** (str, optional): The name of the column containing the probabilities. Defaults to None. +- **probability_values** (list, optional): The values of the probabilities. Defaults to None. +- **prediction_probabilities** (list, optional): DEPRECATED: The values of the probabilities. Defaults to None. - **kwargs**: Additional keyword arguments that will get passed through to the model's `predict` method. ### [prediction_column[()]{.muted}](#prediction_column) @@ -524,9 +524,9 @@ An base class that wraps a trained model instance and its associated data. **Parameters** -- **model** (object): The trained model instance. Defaults to None. -- **input_id** (str): The input ID for the model. Defaults to None. -- **attributes** (ModelAttributes): The attributes of the model. Defaults to None. +- **model** (object, optional): The trained model instance. Defaults to None. +- **input_id** (str, optional): The input ID for the model. Defaults to None. +- **attributes** (ModelAttributes, optional): The attributes of the model. Defaults to None. - **name** (str): The name of the model. Defaults to the class name. **Inherited members** From 0a7fe1cbb63a4e65bbfb9fcf142e59b7516a3a89 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 5 Feb 2025 08:18:58 -0800 Subject: [PATCH 058/207] Save point for type annotations rework --- docs/templates/macros/signatures.jinja2 | 63 ++----------------- docs/templates/macros/types.jinja2 | 57 +++++++++++++---- docs/validmind.qmd | 16 ++--- docs/validmind/errors.qmd | 2 +- docs/validmind/test_suites.qmd | 12 ++-- docs/validmind/tests.qmd | 14 ++--- .../tests/data_validation/ACFandPACFPlot.qmd | 2 +- docs/validmind/tests/data_validation/ADF.qmd | 2 +- .../tests/data_validation/AutoAR.qmd | 2 +- .../tests/data_validation/AutoMA.qmd | 2 +- .../data_validation/AutoStationarity.qmd | 2 +- .../tests/data_validation/ClassImbalance.qmd | 2 +- .../data_validation/DatasetDescription.qmd | 2 +- .../tests/data_validation/DatasetSplit.qmd | 2 +- .../data_validation/DescriptiveStatistics.qmd | 4 +- .../tests/data_validation/DickeyFullerGLS.qmd | 2 +- .../data_validation/EngleGrangerCoint.qmd | 2 +- .../tests/data_validation/HighCardinality.qmd | 2 +- .../HighPearsonCorrelation.qmd | 2 +- .../data_validation/IQROutliersBarPlot.qmd | 2 +- .../data_validation/IQROutliersTable.qmd | 2 +- .../IsolationForestOutliers.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 2 +- .../LaggedCorrelationHeatmap.qmd | 2 +- .../tests/data_validation/MissingValues.qmd | 2 +- .../data_validation/MissingValuesBarPlot.qmd | 2 +- .../data_validation/MutualInformation.qmd | 2 +- .../data_validation/PhillipsPerronArch.qmd | 2 +- .../data_validation/RollingStatsPlot.qmd | 2 +- .../data_validation/ScoreBandDefaultRates.qmd | 2 +- .../data_validation/SeasonalDecompose.qmd | 2 +- .../tests/data_validation/SpreadPlot.qmd | 2 +- .../TabularCategoricalBarPlots.qmd | 2 +- .../TabularDateTimeHistograms.qmd | 2 +- .../TabularNumericalHistograms.qmd | 2 +- .../data_validation/TargetRateBarPlots.qmd | 2 +- .../data_validation/TimeSeriesFrequency.qmd | 2 +- .../data_validation/TimeSeriesLinePlot.qmd | 2 +- .../TimeSeriesMissingValues.qmd | 2 +- .../data_validation/TimeSeriesOutliers.qmd | 2 +- .../data_validation/TooManyZeroValues.qmd | 2 +- .../tests/data_validation/UniqueRows.qmd | 2 +- .../tests/data_validation/WOEBinPlots.qmd | 2 +- .../tests/data_validation/WOEBinTable.qmd | 2 +- .../data_validation/ZivotAndrewsArch.qmd | 2 +- .../tests/data_validation/nlp/CommonWords.qmd | 2 +- .../tests/data_validation/nlp/Hashtags.qmd | 2 +- .../tests/data_validation/nlp/Mentions.qmd | 2 +- .../tests/data_validation/nlp/StopWords.qmd | 2 +- .../data_validation/nlp/TextDescription.qmd | 2 +- .../ClusterSizeDistribution.qmd | 2 +- .../tests/model_validation/FeaturesAUC.qmd | 2 +- .../RegressionResidualsPlot.qmd | 2 +- .../sklearn/AdjustedMutualInformation.qmd | 2 +- .../sklearn/AdjustedRandIndex.qmd | 2 +- .../sklearn/CalibrationCurve.qmd | 2 +- .../sklearn/ClassifierPerformance.qmd | 2 +- .../ClassifierThresholdOptimization.qmd | 2 +- .../sklearn/ClusterCosineSimilarity.qmd | 2 +- .../sklearn/ClusterPerformanceMetrics.qmd | 2 +- .../sklearn/CompletenessScore.qmd | 2 +- .../sklearn/ConfusionMatrix.qmd | 2 +- .../sklearn/FeatureImportance.qmd | 2 +- .../sklearn/FowlkesMallowsScore.qmd | 2 +- .../sklearn/HomogeneityScore.qmd | 2 +- .../sklearn/HyperParametersTuning.qmd | 2 +- .../sklearn/KMeansClustersOptimization.qmd | 2 +- .../sklearn/MinimumAccuracy.qmd | 2 +- .../sklearn/MinimumF1Score.qmd | 2 +- .../sklearn/MinimumROCAUCScore.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 2 +- .../sklearn/OverfitDiagnosis.qmd | 2 +- .../sklearn/PermutationFeatureImportance.qmd | 2 +- .../sklearn/PopulationStabilityIndex.qmd | 2 +- .../sklearn/PrecisionRecallCurve.qmd | 2 +- .../model_validation/sklearn/ROCCurve.qmd | 2 +- .../sklearn/RegressionPerformance.qmd | 2 +- .../sklearn/RegressionR2Square.qmd | 2 +- .../sklearn/RegressionR2SquareComparison.qmd | 2 +- .../sklearn/RobustnessDiagnosis.qmd | 2 +- .../sklearn/SHAPGlobalImportance.qmd | 2 +- .../sklearn/ScoreProbabilityAlignment.qmd | 2 +- .../sklearn/SilhouettePlot.qmd | 2 +- .../sklearn/TrainingTestDegradation.qmd | 2 +- .../model_validation/sklearn/VMeasure.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 2 +- .../statsmodels/AutoARIMA.qmd | 2 +- .../statsmodels/KolmogorovSmirnov.qmd | 2 +- .../statsmodels/Lilliefors.qmd | 2 +- .../RegressionFeatureSignificance.qmd | 2 +- .../RegressionModelForecastPlot.qmd | 2 +- .../RegressionModelForecastPlotLevels.qmd | 2 +- .../RegressionModelSensitivityPlot.qmd | 2 +- .../statsmodels/RegressionModelSummary.qmd | 4 +- ...RegressionPermutationFeatureImportance.qmd | 2 +- .../statsmodels/statsutils.qmd | 2 +- .../tests/prompt_validation/Bias.qmd | 6 +- .../tests/prompt_validation/Clarity.qmd | 6 +- .../tests/prompt_validation/Conciseness.qmd | 6 +- .../tests/prompt_validation/Delimitation.qmd | 6 +- .../prompt_validation/NegativeInstruction.qmd | 6 +- .../tests/prompt_validation/Robustness.qmd | 2 +- .../tests/prompt_validation/Specificity.qmd | 6 +- .../prompt_validation/ai_powered_test.qmd | 6 +- docs/validmind/unit_metrics.qmd | 4 +- docs/validmind/vm_models.qmd | 30 ++++----- scripts/generate_quarto_docs.py | 54 +++++++++++++++- 107 files changed, 254 insertions(+), 226 deletions(-) diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index 7e2b63e1a..8621105fc 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -1,20 +1,4 @@ -{%- macro extract_type(annotation) -%} - {%- if annotation is mapping -%} - {%- if 'name' in annotation -%} - {{ annotation.name }} - {%- elif 'slice' in annotation -%} - {{ extract_type(annotation.slice) }} - {%- elif 'left' in annotation and 'slice' in annotation -%} - {{ extract_type(annotation.left) }}[{{ extract_type(annotation.slice) }}] - {%- elif 'elements' in annotation -%} - {{ annotation.elements | map(attribute='name') | join(', ') }} - {%- else -%} - {{ annotation }} - {%- endif -%} - {%- else -%} - {{ annotation }} - {%- endif -%} -{%- endmacro -%} +{%- from 'macros/types.jinja2' import format_type -%} {%- macro render_signature(member) -%} @@ -30,7 +14,7 @@ {%- if member.parameters | length == 1 -%} {{ member.parameters[0].name }} {%- if member.parameters[0].annotation -%} - :{{ extract_type(member.parameters[0].annotation) }} + :{{ format_type(member.parameters[0].annotation, add_links=true) }} {%- endif -%} {%- if member.parameters[0].default is not none -%} = {{ member.parameters[0].default }} @@ -40,7 +24,7 @@ {%- for param in member.parameters -%} {{ param.name }} {%- if param.annotation -%} - :{{ extract_type(param.annotation) }} + :{{ format_type(param.annotation, add_links=true) }} {%- endif -%} {%- if param.default is not none -%} = {{ param.default }} @@ -52,47 +36,8 @@ {%- else -%}() {%- endif -%} {%- if member.returns -%} - -{%- if member.returns is mapping -%} - {%- if 'values' in member.returns and member.returns.values is sequence -%} - {{ member.returns.values | selectattr('name', 'defined') | map(attribute='name') | join('.') }} - {%- elif 'name' in member.returns -%} - {%- if member.returns.name in ['str', 'dict', 'list', 'bool', 'int', 'float'] -%} - {{ member.returns.name }} - {%- else -%} - - validmind.vm_models.{{ member.returns.name }} - - {%- endif -%} - {%- elif member.returns.cls == 'ExprAttribute' and 'values' in member.returns -%} - {%- set values_list = member.returns['values'] if member.returns['values'] is sequence else [] -%} - {%- set extracted_values = values_list | selectattr('name', 'defined') | map(attribute='name') | list -%} - {{ extracted_values | join('.') if extracted_values else 'ExprAttribute' }} -{%- elif member.returns.cls == 'ExprSubscript' -%} - {%- if member.returns.slice.cls == 'ExprTuple' -%} - {%- set extracted_elements = [] -%} - {%- for element in member.returns.slice.elements -%} - {%- if element.cls == 'ExprSubscript' -%} - {{ extracted_elements.append(element.left.name ~ '[' ~ element.slice.elements | map(attribute='name') | join(', ') ~ ']') }} - {%- elif element.cls == 'ExprAttribute' and 'values' in element -%} - {%- set attr_values = element['values'] if element['values'] is sequence else [] -%} - {{ extracted_elements.append(attr_values | map(attribute='name') | join('.')) }} - {%- elif 'name' in element -%} - {{ extracted_elements.append(element.name) }} - {%- else -%} - {{ extracted_elements.append('Unknown') }} - {%- endif -%} - {%- endfor -%} - - {{ member.returns.left.name }}[{{ extracted_elements | join(', ') }}] - {%- else -%} - {{ member.returns.left.name }}[{{ member.returns.slice.name }}] - {%- endif -%} - {%- endif -%} -{%- else -%} - {{ member.returns if member.returns else 'Any' }} -{%- endif -%} + {{- format_type(member.returns, add_links=true) if member.returns else 'Any' -}} {%- endif +%} diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index 16abdd11c..1b3ce7875 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -1,20 +1,51 @@ -{% macro format_type(type) %} - -{% if type is mapping %} -{% if type.kind == 'union' %} -{{ type.types | map('format_type') | join(' | ') }} -{% elif type.kind == 'generic' %} -{{ type.base }}[{{ type.args | map('format_type') | join(', ') }}] -{% else %} -{{ type.name }} -{% endif %} +{% macro format_type(type, module=None, add_links=false) %} + +{%- if type is mapping -%} + {%- if type.kind == 'union' -%} + Union[ + {%- for t in type.types -%} + {{ format_type(t, module, add_links) }} + {%- if not loop.last %}, {% endif -%} + {%- endfor -%} + ] + {%- elif type.kind == 'generic' -%} + {%- if type.base == 'Dict' -%} + Dict[{{ format_type(type.args[0], module, add_links) }}, {{ format_type(type.args[1], module, add_links) }}] + {%- elif type.base == 'List' -%} + List[{{ format_type(type.args[0], module, add_links) }}] + {%- else -%} + {{ type.base }}[{{ type.args | map(attribute='format_type') | join(', ') }}] + {%- endif -%} + {%- elif type.cls == "ExprName" -%} + {%- if module and type.name in module.members and module.members[type.name].kind == "alias" -%} + {{ module.members[type.name].target_path }} + {%- elif add_links and type.name not in ['str', 'dict', 'list', 'bool', 'int', 'float', 'Any'] -%} + validmind.vm_models.{{ type.name }} + {%- else -%} + {{ type.name }} + {%- endif -%} + {%- elif type.cls == "ExprAttribute" and type.values is sequence -%} + {{ type.values | map(attribute='name') | join('.') }} + {%- elif type.cls == "ExprSubscript" and type.left is defined -%} + {{ type.left.name }}[ + {%- if type.slice.cls == "ExprTuple" -%} + {{ type.slice.elements|map(attribute="name")|join(", ") }} + {%- else -%} + {{ format_type(type.slice, module, add_links) }} + {%- endif -%} + ] + {%- elif type.name is defined and add_links and type.name not in ['str', 'dict', 'list', 'bool', 'int', 'float'] -%} + validmind.vm_models.{{ type.name }} + {%- else -%} + {{ type.name if 'name' in type else type|string }} + {%- endif -%} {% else %} -{{ type }} + {{ type }} {% endif %} {% endmacro %} {%- macro format_return_type(returns) -%} - + {%- if returns.cls == "ExprName" -%} {%- if returns.name in validmind.members.client.members and validmind.members.client.members[returns.name].kind == "alias" -%} {{ validmind.members.client.members[returns.name].target_path }} @@ -35,7 +66,7 @@ {%- endmacro %} {%- macro format_module_return_type(returns, module, full_data) -%} - + {%- if returns.cls == "ExprName" -%} {%- if returns.name in module.members and module.members[returns.name].kind == "alias" -%} {{ module.members[returns.name].target_path }} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index e4310e906..7185a2643 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -53,7 +53,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -def get_test_suite(test_suite_id:str = None,section:str = None,args = (),kwargs = {}) validmind.vm_models.TestSuite +def get_test_suite(test_suite_id:str = None,section:str = None,args = (),kwargs = {})validmind.vm_models.TestSuite ::: @@ -74,7 +74,7 @@ Gets a TestSuite object for the current project or a specific test suite This fu ::: {.signature} -def init(project:str = None,api_key:str = None,api_secret:str = None,api_host:str = None,model:str = None,monitoring:bool = False,generate_descriptions:bool = None) +def init(project:Optional\[str\] = None,api_key:Optional\[str\] = None,api_secret:Optional\[str\] = None,api_host:Optional\[str\] = None,model:Optional\[str\] = None,monitoring:bool = False,generate_descriptions:Optional\[bool\] = None) ::: @@ -104,7 +104,7 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -def init_dataset(dataset,model = None,index = None,index_name:str = None,date_time_index:bool = False,columns:list = None,text_column:str = None,target_column:str = None,feature_columns:list = None,extra_columns:dict = None,class_labels:dict = None,type:str = None,input_id:str = None,\_\_log = True) validmind.vm_models.VMDataset +def init_dataset(dataset,model = None,index = None,index_name:str = None,date_time_index:bool = False,columns:list = None,text_column:str = None,target_column:str = None,feature_columns:list = None,extra_columns:dict = None,class_labels:dict = None,type:str = None,input_id:str = None,\_\_log = True)validmind.vm_models.VMDataset ::: @@ -131,7 +131,7 @@ Returns: vm.vm.Dataset: A VM Dataset instance ::: {.signature} -def init_model(model:object = None,input_id:str = 'model',attributes:dict = None,predict_fn:callable = None,\_\_log = True,kwargs = {}) validmind.vm_models.VMModel +def init_model(model:validmind.vm_models.object = None,input_id:str = 'model',attributes:dict = None,predict_fn:validmind.vm_models.callable = None,\_\_log = True,kwargs = {})validmind.vm_models.VMModel ::: @@ -161,7 +161,7 @@ Initializes a VM Model, which can then be passed to other functions that can per ::: {.signature} -def init_r_model(model_path:str,input_id:str = 'model') validmind.vm_models.VMModel +def init_r_model(model_path:str,input_id:str = 'model')validmind.vm_models.VMModel ::: @@ -191,7 +191,7 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ::: {.signature} -def log_metric(key:str,value:float,inputs:str = None,params:str, Any = None,recorded_at:str = None,thresholds:str, Any = None) +def log_metric(key:str,value:float,inputs:Optional\[List\[str\]\] = None,params:Optional\[Dict[str, Any]\] = None,recorded_at:Optional\[str\] = None,thresholds:Optional\[Dict[str, Any]\] = None) ::: @@ -411,7 +411,7 @@ Holds raw data for a test result ::: {.signature} -def __init__(self,log:bool = False,kwargs = {}) +def __init__(self,log:bool = False,kwargs = {}) ::: @@ -430,7 +430,7 @@ Create a new RawData object ::: {.signature} -def inspect(self,show:bool = True) +def inspect(self,show:bool = True) ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index 7751bc625..becba8cfe 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -832,7 +832,7 @@ Safely try to parse JSON from the response message in case the API returns a non ::: {.signature} -def should_raise_on_fail_fast(error)bool +def should_raise_on_fail_fast(error)bool ::: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 030acb8ed..de416cc93 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,7 +29,7 @@ Entrypoint for test suites. ::: {.signature} -def format_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})pd.DataFrame +def format_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -57,7 +57,7 @@ Get a logger for the given module name ::: {.signature} -def test_id_to_name(test_id:str)str +def test_id_to_name(test_id:str)str ::: @@ -81,7 +81,7 @@ Convert a test ID to a human-readable name. ::: {.signature} -def describe_suite(test_suite_id:str,verbose = False) +def describe_suite(test_suite_id:str,verbose = False) ::: @@ -106,7 +106,7 @@ Describes a Test Suite by ID ::: {.signature} -def get_by_id(test_suite_id:str) +def get_by_id(test_suite_id:str) ::: @@ -122,7 +122,7 @@ Returns the test suite by ID ::: {.signature} -def list_suites(pretty:bool = True) +def list_suites(pretty:bool = True) ::: @@ -138,7 +138,7 @@ Returns a list of all available test suites ::: {.signature} -def register_test_suite(suite_id:str,suite:TestSuite) +def register_test_suite(suite_id:str,suite:validmind.vm_models.TestSuite) ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 36ff2a87d..ac18a0750 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -20,7 +20,7 @@ ValidMind Tests Module ::: {.signature} -def describe_test(test_id:TestID = None,raw:bool = False,show:bool = True) +def describe_test(test_id:validmind.vm_models.TestID = None,raw:bool = False,show:bool = True) ::: @@ -111,7 +111,7 @@ List all tests in the tests directory. ::: {.signature} -def load_test(test_id:str,test_func:callable = None,reload:bool = False) +def load_test(test_id:str,test_func:validmind.vm_models.callable = None,reload:bool = False) ::: @@ -130,7 +130,7 @@ Load a test by test ID Test IDs are in the format `namespace.path_to_module.Test ::: {.signature} -def run_test(test_id:TestID, = None,name:str, = None,unit_metrics:, = None,inputs:, = None,input_grid:, , = None,params:, = None,param_grid:, , = None,show:bool = True,generate_description:bool = True,title:str = None,post_process_fn:, = None,kwargs = {}) validmind.vm_models.TestResult +def run_test(test_id:Union[TestID, ] = None,name:Union[str, ] = None,unit_metrics:Union[, ] = None,inputs:Union[, ] = None,input_grid:Union[, , ] = None,params:Union[, ] = None,param_grid:Union[, , ] = None,show:bool = True,generate_description:bool = True,title:Optional\[str\] = None,post_process_fn:Union[, ] = None,kwargs = {})validmind.vm_models.TestResult ::: @@ -246,7 +246,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -def register_test_provider(namespace:str,test_provider:TestProvider)None +def register_test_provider(namespace:str,test_provider:validmind.vm_models.TestProvider) None ::: @@ -345,7 +345,7 @@ List all tests in the given namespace ::: {.signature} -def load_test(self,test_id:str) +def load_test(self,test_id:str) ::: @@ -381,7 +381,7 @@ Protocol for user-defined test providers ::: {.signature} -def list_tests(self)List[str] +def list_tests(self)List\[str\] ::: @@ -399,7 +399,7 @@ List all tests in the given namespace ::: {.signature} -def load_test(self,test_id:str) validmind.vm_models.callable +def load_test(self,test_id:str)validmind.vm_models.callable ::: diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 1f1291b36..b50fa95cc 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ACFandPACFPlot(dataset:VMDataset) +def ACFandPACFPlot(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 4e3e0ba38..3abcd9dbc 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def ADF(dataset:VMDataset) +def ADF(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 9894e75bc..6f017a1dd 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def AutoAR(dataset:VMDataset,max_ar_order:int = 3) +def AutoAR(dataset:validmind.vm_models.VMDataset,max_ar_order:int = 3) ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index db1fbcd97..b467233c9 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def AutoMA(dataset:VMDataset,max_ma_order:int = 3) +def AutoMA(dataset:validmind.vm_models.VMDataset,max_ma_order:int = 3) ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 0487f637c..9e56db8fd 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def AutoStationarity(dataset:VMDataset,max_order:int = 5,threshold:float = 0.05) +def AutoStationarity(dataset:validmind.vm_models.VMDataset,max_order:int = 5,threshold:float = 0.05) ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 51889849b..a93c9f72f 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -def ClassImbalance(dataset:VMDataset,min_percent_threshold:int = 10)NoneNoneNoneTuple\[Dict[str, Any], go.Figure, bool\] +def ClassImbalance(dataset:validmind.vm_models.VMDataset,min_percent_threshold:int = 10)Tuple[, , bool] ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 3ee265c24..effc630c9 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def DatasetDescription(dataset:VMDataset) +def DatasetDescription(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 796adf3be..45e07da22 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def DatasetSplit(datasets:VMDataset) +def DatasetSplit(datasets:List\[validmind.vm_models.VMDataset\]) ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index d46057117..566ad9ad4 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def format_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List[] +def format_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict[str, Any]\] ::: @@ -34,7 +34,7 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -def DescriptiveStatistics(dataset:VMDataset) +def DescriptiveStatistics(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index f446dd9ec..f3c2c1f3e 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def DickeyFullerGLS(dataset:VMDataset) +def DickeyFullerGLS(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 183f4ac07..908ddc4bb 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def EngleGrangerCoint(dataset:VMDataset,threshold:float = 0.05) +def EngleGrangerCoint(dataset:validmind.vm_models.VMDataset,threshold:float = 0.05) ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index a930a77c9..9db7cc046 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def HighCardinality(dataset:VMDataset,num_threshold:int = 100,percent_threshold:float = 0.1,threshold_type:str = 'percent') +def HighCardinality(dataset:validmind.vm_models.VMDataset,num_threshold:int = 100,percent_threshold:float = 0.1,threshold_type:str = 'percent') ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index b883d73d1..2aa29e56f 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def HighPearsonCorrelation(dataset:VMDataset,max_threshold:float = 0.3,top_n_correlations:int = 10,feature_columns:list = None) +def HighPearsonCorrelation(dataset:validmind.vm_models.VMDataset,max_threshold:float = 0.3,top_n_correlations:int = 10,feature_columns:list = None) ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index e00506eea..67031d502 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def IQROutliersBarPlot(dataset:VMDataset,threshold:float = 1.5,fig_width:int = 800) +def IQROutliersBarPlot(dataset:validmind.vm_models.VMDataset,threshold:float = 1.5,fig_width:int = 800) ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 481059515..debef04c6 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def IQROutliersTable(dataset:VMDataset,threshold:float = 1.5) +def IQROutliersTable(dataset:validmind.vm_models.VMDataset,threshold:float = 1.5) ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index 3327b9e89..806bb37f2 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def IsolationForestOutliers(dataset:VMDataset,random_state:int = 0,contamination:float = 0.1,feature_columns:list = None) +def IsolationForestOutliers(dataset:validmind.vm_models.VMDataset,random_state:int = 0,contamination:float = 0.1,feature_columns:list = None) ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 546160cc6..89ab1b0d2 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def KPSS(dataset:VMDataset) +def KPSS(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index 6b5d36909..a988801cf 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def LaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int = 10) +def LaggedCorrelationHeatmap(dataset:validmind.vm_models.VMDataset,num_lags:int = 10) ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 500bedddd..0956bba85 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MissingValues(dataset:VMDataset,min_threshold:int = 1) +def MissingValues(dataset:validmind.vm_models.VMDataset,min_threshold:int = 1) ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 66df609a0..a78bdbb64 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MissingValuesBarPlot(dataset:VMDataset,threshold:int = 80,fig_height:int = 600) +def MissingValuesBarPlot(dataset:validmind.vm_models.VMDataset,threshold:int = 80,fig_height:int = 600) ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 8783c5fc9..9ce541b21 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MutualInformation(dataset:VMDataset,min_threshold:float = 0.01,task:str = 'classification') +def MutualInformation(dataset:validmind.vm_models.VMDataset,min_threshold:float = 0.01,task:str = 'classification') ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 161566dca..7e48ae092 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def PhillipsPerronArch(dataset:VMDataset) +def PhillipsPerronArch(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 1558b8719..7a2102641 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def RollingStatsPlot(dataset:VMDataset,window_size:int = 12) +def RollingStatsPlot(dataset:validmind.vm_models.VMDataset,window_size:int = 12) ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index ac0690710..a468bcbb7 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str = 'score',score_bands:list = None) +def ScoreBandDefaultRates(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,score_column:str = 'score',score_bands:list = None) ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 180fc8137..d8fdb4958 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def SeasonalDecompose(dataset:VMDataset,seasonal_model:str = 'additive') +def SeasonalDecompose(dataset:validmind.vm_models.VMDataset,seasonal_model:str = 'additive') ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 1afbe6445..270e9393f 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def SpreadPlot(dataset:VMDataset) +def SpreadPlot(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 91fcf9020..38894ba25 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TabularCategoricalBarPlots(dataset:VMDataset) +def TabularCategoricalBarPlots(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 6ed8188a7..18e59d8f5 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TabularDateTimeHistograms(dataset:VMDataset) +def TabularDateTimeHistograms(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 832382b26..6e352cd62 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TabularNumericalHistograms(dataset:VMDataset) +def TabularNumericalHistograms(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 8030f3233..9e429ac4f 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TargetRateBarPlots(dataset:VMDataset) +def TargetRateBarPlots(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index bf8012a40..713c0d425 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesFrequency(dataset:VMDataset) +def TimeSeriesFrequency(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 2d00396fc..8dbac7cd8 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesLinePlot(dataset:VMDataset) +def TimeSeriesLinePlot(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 9383921b9..b5fc92d41 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesMissingValues(dataset:VMDataset,min_threshold:int = 1) +def TimeSeriesMissingValues(dataset:validmind.vm_models.VMDataset,min_threshold:int = 1) ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 6e24144d9..40c744482 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int = 3) +def TimeSeriesOutliers(dataset:validmind.vm_models.VMDataset,zscore_threshold:int = 3) ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 5da4454f0..ef6c24c75 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TooManyZeroValues(dataset:VMDataset,max_percent_threshold:float = 0.03) +def TooManyZeroValues(dataset:validmind.vm_models.VMDataset,max_percent_threshold:float = 0.03) ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index d40bc3ae9..f24ff7e2e 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def UniqueRows(dataset:VMDataset,min_percent_threshold:float = 1) +def UniqueRows(dataset:validmind.vm_models.VMDataset,min_percent_threshold:float = 1) ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index a135b8a54..c3d225a53 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def WOEBinPlots(dataset:VMDataset,breaks_adj:list = None,fig_height:int = 600,fig_width:int = 500) +def WOEBinPlots(dataset:validmind.vm_models.VMDataset,breaks_adj:list = None,fig_height:int = 600,fig_width:int = 500) ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index e3b818202..0a5139a0a 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def WOEBinTable(dataset:VMDataset,breaks_adj:list = None) +def WOEBinTable(dataset:validmind.vm_models.VMDataset,breaks_adj:list = None) ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 17216f1aa..00f35d6ad 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def ZivotAndrewsArch(dataset:VMDataset) +def ZivotAndrewsArch(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index ec16db892..cf52d44c9 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def CommonWords(dataset:VMDataset) +def CommonWords(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 9b9097be4..0c2342d18 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Hashtags(dataset:VMDataset,top_hashtags:int = 25) +def Hashtags(dataset:validmind.vm_models.VMDataset,top_hashtags:int = 25) ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 81b477d3a..f046220b1 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Mentions(dataset:VMDataset,top_mentions:int = 25) +def Mentions(dataset:validmind.vm_models.VMDataset,top_mentions:int = 25) ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index 7e8b8a319..ddab57850 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -def StopWords(dataset:VMDataset,min_percent_threshold:float = 0.5,num_words:int = 25) +def StopWords(dataset:validmind.vm_models.VMDataset,min_percent_threshold:float = 0.5,num_words:int = 25) ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index e9be05451..2d26dcce0 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def TextDescription(dataset:VMDataset,unwanted_tokens:set = {'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str = 'english') +def TextDescription(dataset:validmind.vm_models.VMDataset,unwanted_tokens:validmind.vm_models.set = {'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str = 'english') ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 3fb0efa34..b11b57965 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClusterSizeDistribution(dataset:VMDataset,model:VMModel) +def ClusterSizeDistribution(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 363cc283a..01f2c6c8f 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def FeaturesAUC(dataset:VMDataset,fontsize:int = 12,figure_height:int = 500) +def FeaturesAUC(dataset:validmind.vm_models.VMDataset,fontsize:int = 12,figure_height:int = 500) ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index c3ae7bc69..7e90601f1 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def RegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float = 0.1) +def RegressionResidualsPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,bin_size:float = 0.1) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 83a93f044..fd6d762cf 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def AdjustedMutualInformation(model:VMModel,dataset:VMDataset) +def AdjustedMutualInformation(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index a701f1392..85b2fca9f 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def AdjustedRandIndex(model:VMModel,dataset:VMDataset) +def AdjustedRandIndex(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index fc33586ee..80b273f0e 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def CalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int = 10) +def CalibrationCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_bins:int = 10) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index 1122aae5d..2c8c623ed 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClassifierPerformance(dataset:VMDataset,model:VMModel,average:str = 'macro') +def ClassifierPerformance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,average:str = 'macro') ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index d63612e5a..46539177b 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods = None,target_recall = None) +def ClassifierThresholdOptimization(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,methods = None,target_recall = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index fefdff0ef..38fb5fe6b 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClusterCosineSimilarity(model:VMModel,dataset:VMDataset) +def ClusterCosineSimilarity(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 417daa4db..3f0bee1d4 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClusterPerformanceMetrics(model:VMModel,dataset:VMDataset) +def ClusterPerformanceMetrics(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index f936c1ea0..5d5d1befa 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def CompletenessScore(model:VMModel,dataset:VMDataset) +def CompletenessScore(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index e9538faa6..cebac4adb 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ConfusionMatrix(dataset:VMDataset,model:VMModel) +def ConfusionMatrix(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 1d8bd21fe..1d9af3af0 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def FeatureImportance(dataset:VMDataset,model:VMModel,num_features:int = 3) +def FeatureImportance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,num_features:int = 3) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 2a5f1a7a8..90b388a81 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def FowlkesMallowsScore(dataset:VMDataset,model:VMModel) +def FowlkesMallowsScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index d05892942..278d2ceff 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def HomogeneityScore(dataset:VMDataset,model:VMModel) +def HomogeneityScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index d0360e509..2ecb6fe80 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def HyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:str, List, Dict = None,thresholds:float, = None,fit_params:dict = None) +def HyperParametersTuning(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,param_grid:dict,scoring:Union[str, List, Dict] = None,thresholds:Union[float, ] = None,fit_params:dict = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index df19224db..b4fe9dfc0 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def KMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:, = None) +def KMeansClustersOptimization(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_clusters:Union[, ] = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index a2d01ec1e..e0fe8984d 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float = 0.7) +def MinimumAccuracy(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float = 0.7) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index b4be9ae8a..00d700bcf 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float = 0.5) +def MinimumF1Score(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float = 0.5) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 4a0d014ae..7ef727cd6 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float = 0.5) +def MinimumROCAUCScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float = 0.5) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 9ae828b5d..d8d3bb365 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -24,7 +24,7 @@ toc-expand: 4 ::: {.signature} -def ModelsPerformanceComparison(dataset:VMDataset,models:VMModel) +def ModelsPerformanceComparison(dataset:validmind.vm_models.VMDataset,models:list\[validmind.vm_models.VMModel\]) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index c3c9b45f8..b9b9739a4 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def OverfitDiagnosis(model:VMModel,datasets:VMDataset,metric:str = None,cut_off_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}) +def OverfitDiagnosis(model:validmind.vm_models.VMModel,datasets:List\[validmind.vm_models.VMDataset\],metric:str = None,cut_off_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index c475146d6..17c95282c 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def PermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:int, = None,figure_height:int, = None) +def PermutationFeatureImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,fontsize:Union[int, ] = None,figure_height:Union[int, ] = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 048c52254..6cbacf3e8 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -44,7 +44,7 @@ Taken from: https://towardsdatascience.com/checking-model-stability-and-populati ::: {.signature} -def PopulationStabilityIndex(datasets:VMDataset,model:VMModel,num_bins:int = 10,mode:str = 'fixed') +def PopulationStabilityIndex(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,num_bins:int = 10,mode:str = 'fixed') ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 48345e8ef..ef161bf94 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def PrecisionRecallCurve(model:VMModel,dataset:VMDataset) +def PrecisionRecallCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 3294c1a9c..654c07a90 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ROCCurve(model:VMModel,dataset:VMDataset) +def ROCCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 4d1b5781f..3602a6913 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionPerformance(model:VMModel,dataset:VMDataset) +def RegressionPerformance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 5a6f40416..5206ed39b 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) +def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index a6238c3c1..cfa14f13c 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) +def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 44dc504ab..01fd941a6 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RobustnessDiagnosis(datasets:VMDataset,model:VMModel,metric:str = None,scaling_factor_std_dev_list:float = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}) +def RobustnessDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,metric:str = None,scaling_factor_std_dev_list:List\[float\] = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index e0367851f..dac00ce4b 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -83,7 +83,7 @@ Selects SHAP values for binary or multiclass classification. For regression mode ::: {.signature} -def SHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int = 10,tree_or_linear_explainer_samples:int = 200,class_of_interest:int = None) +def SHAPGlobalImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,kernel_explainer_samples:int = 10,tree_or_linear_explainer_samples:int = 200,class_of_interest:int = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 0b70cf718..1142a9326 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str = 'score',n_bins:int = 10) +def ScoreProbabilityAlignment(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,score_column:str = 'score',n_bins:int = 10) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 492b6006b..9c0cac08d 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def SilhouettePlot(model:VMModel,dataset:VMDataset) +def SilhouettePlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 7de48b2a1..cf2943e8a 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TrainingTestDegradation(datasets:VMDataset,model:VMModel,max_threshold:float = 0.1) +def TrainingTestDegradation(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,max_threshold:float = 0.1) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 8bf4ec812..e43ee9c9b 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def VMeasure(dataset:VMDataset,model:VMModel) +def VMeasure(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 7e170ab69..60b139ba3 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def WeakspotsDiagnosis(datasets:VMDataset,model:VMModel,features_columns:, = None,metrics:, = None,thresholds:, = None) +def WeakspotsDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,features_columns:Union[, ] = None,metrics:Union[, ] = None,thresholds:Union[, ] = None) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index c4faa90ae..3ea7f383a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def AutoARIMA(model:VMModel,dataset:VMDataset) +def AutoARIMA(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 297223377..6db5abe3c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def KolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str = 'norm') +def KolmogorovSmirnov(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,dist:str = 'norm') ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index f1d1e3c97..aa13d52cb 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Lilliefors(dataset:VMDataset) +def Lilliefors(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 76d2ea4c6..b51421a3b 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionFeatureSignificance(model:VMModel,fontsize:int = 10,p_threshold:float = 0.05) +def RegressionFeatureSignificance(model:validmind.vm_models.VMModel,fontsize:int = 10,p_threshold:float = 0.05) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 0053248bd..811f51278 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:str, = None,end_date:str, = None) +def RegressionModelForecastPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,start_date:Union[str, ] = None,end_date:Union[str, ] = None) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 97d1032b7..2618e765b 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def RegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset) +def RegressionModelForecastPlotLevels(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index eae1e6af7..61a576f63 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:float = {'cls': 'ExprList', 'elements': ['0.1']},transformation:str, = None) +def RegressionModelSensitivityPlot(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,shocks:List\[float\] = {'cls': 'ExprList', 'elements': ['0.1']},transformation:Union[str, ] = None) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index ae6681d42..6d870ddc7 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) +def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -def RegressionModelSummary(dataset:VMDataset,model:VMModel) +def RegressionModelSummary(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 4fcaedb46..35b24ec54 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int = 12,figure_height:int = 500) +def RegressionPermutationFeatureImportance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,fontsize:int = 12,figure_height:int = 500) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index ed8bb7a6d..1a0c8f771 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) +def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 93ffb2bea..e42a28985 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -46,7 +46,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 16b0d41c9..1b26678f9 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -46,7 +46,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 908023e21..9f3e05c94 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -46,7 +46,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index d9083625e..936e87369 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -46,7 +46,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index e7de011f0..831ee8fb8 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -46,7 +46,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 38804a5d8..f98a65d3c 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 86f3a34ab..4c77e22a0 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -46,7 +46,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index c99115ce3..e2af32470 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -30,7 +30,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -52,7 +52,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 9cefc8cce..ba34e81b1 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def describe_metric(metric_id:str,kwargs = {}) +def describe_metric(metric_id:str,kwargs = {}) ::: @@ -46,7 +46,7 @@ List all metrics ::: {.signature} -def run_metric(metric_id:str,kwargs = {}) +def run_metric(metric_id:str,kwargs = {}) ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index c45b4985c..db15d8e2a 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -122,7 +122,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -def get_default_config(self)dict +def get_default_config(self)dict ::: @@ -140,7 +140,7 @@ Returns the default configuration for the test suite Each test in a test suite c ::: {.signature} -def get_tests(self)List[str] +def get_tests(self)List\[str\] ::: @@ -154,7 +154,7 @@ Get all test suite test objects from all sections ::: {.signature} -def num_tests(self)int +def num_tests(self)int ::: @@ -198,7 +198,7 @@ Logs the results of the test suite to ValidMind This method will be called after ::: {.signature} -def run(self,send:bool = True,fail_fast:bool = False) +def run(self,send:bool = True,fail_fast:bool = False) ::: @@ -217,7 +217,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -def summarize(self,show_link:bool = True) +def summarize(self,show_link:bool = True) ::: @@ -281,7 +281,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -def assign_predictions(self,model:VMModel,prediction_column:str = None,prediction_values:list = None,probability_column:str = None,probability_values:list = None,prediction_probabilities:list = None,kwargs = {}) +def assign_predictions(self,model:validmind.vm_models.VMModel,prediction_column:str = None,prediction_values:list = None,probability_column:str = None,probability_values:list = None,prediction_probabilities:list = None,kwargs = {}) ::: @@ -305,7 +305,7 @@ Assign predictions and probabilities to the dataset. ::: {.signature} -def prediction_column(self,model:VMModel,column_name:str = None)str +def prediction_column(self,model:validmind.vm_models.VMModel,column_name:str = None)str ::: @@ -319,7 +319,7 @@ Get or set the prediction column for a model. ::: {.signature} -def probability_column(self,model:VMModel,column_name:str = None)str +def probability_column(self,model:validmind.vm_models.VMModel,column_name:str = None)str ::: @@ -347,7 +347,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -def with_options(self,kwargs = {}) validmind.vm_models.VMDataset +def with_options(self,kwargs = {})validmind.vm_models.VMDataset ::: @@ -384,7 +384,7 @@ Returns a dataframe containing only the feature columns ::: {.signature} -def y_df(self)pd.DataFrame +def y_df(self){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -398,7 +398,7 @@ Returns a dataframe containing the target column ::: {.signature} -def y_pred(self,model)np.ndarray +def y_pred(self,model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]} ::: @@ -420,7 +420,7 @@ Returns the predictions for a given model. Attempts to stack complex prediction ::: {.signature} -def y_pred_df(self,model)pd.DataFrame +def y_pred_df(self,model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -434,7 +434,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -def y_prob(self,model)np.ndarray +def y_prob(self,model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]} ::: @@ -456,7 +456,7 @@ Returns the probabilities for a given model. ::: {.signature} -def y_prob_df(self,model)pd.DataFrame +def y_prob_df(self,model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -488,7 +488,7 @@ Base class for ValidMind Input types ::: {.signature} -def with_options(self,kwargs = {}) validmind.vm_models.VMInput +def with_options(self,kwargs = {})validmind.vm_models.VMInput ::: diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 1fd54e77e..5f3e786df 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -2,13 +2,14 @@ import json import os from pathlib import Path -from typing import Any, Dict, Set, List +from typing import Any, Dict, Set, List, get_type_hints, ForwardRef from jinja2 import Environment, FileSystemLoader import mdformat from docstring_parser import parse, Style from glob import glob import subprocess import re +import inspect # Add at module level _alias_cache = {} # Cache for resolved aliases @@ -574,6 +575,51 @@ def find_qmd_files(base_path: str) -> Dict[str, str]: relative_paths[filename] = f'docs/{path}' return relative_paths +def process_type_annotation(annotation, module_globals=None): + """Convert type annotation into a structured format.""" + if isinstance(annotation, ForwardRef): + # Resolve forward references + try: + resolved = annotation._evaluate(module_globals, {}) + return process_type_annotation(resolved) + except: + return {'name': annotation.__forward_arg__} + + if hasattr(annotation, '__origin__'): # Generic types like List, Dict + origin = annotation.__origin__ + args = annotation.__args__ + + if origin == Union: + return { + 'kind': 'union', + 'types': [process_type_annotation(arg) for arg in args] + } + else: + return { + 'kind': 'generic', + 'base': origin.__name__, + 'args': [process_type_annotation(arg) for arg in args] + } + + # Basic types + return {'name': getattr(annotation, '__name__', str(annotation))} + +def process_signature(member_data, module_globals): + """Pre-process signature type information.""" + if 'parameters' in member_data: + for param in member_data['parameters']: + if 'annotation' in param: + param['annotation'] = process_type_annotation( + param['annotation'], + module_globals + ) + + if 'returns' in member_data: + member_data['returns'] = process_type_annotation( + member_data['returns'], + module_globals + ) + def generate_docs(json_path: str, template_dir: str, output_dir: str): """Generate documentation from JSON data using templates.""" # print("\nEntering generate_docs()") @@ -599,6 +645,12 @@ def generate_docs(json_path: str, template_dir: str, output_dir: str): env.globals['get_all_members'] = get_all_members env.globals['get_inherited_members'] = get_inherited_members + # Pre-process type annotations + for module_name, module in data.items(): + if 'members' in module: + for member in module['members'].values(): + process_signature(member, module.get('globals', {})) + # Start processing from root module if 'validmind' in data: # First pass: Generate module documentation From ec84f2f5701c10ede956a3407a682f64db513c72 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 5 Feb 2025 08:43:29 -0800 Subject: [PATCH 059/207] Undo new processing functions in script --- scripts/generate_quarto_docs.py | 54 +-------------------------------- 1 file changed, 1 insertion(+), 53 deletions(-) diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 5f3e786df..1fd54e77e 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -2,14 +2,13 @@ import json import os from pathlib import Path -from typing import Any, Dict, Set, List, get_type_hints, ForwardRef +from typing import Any, Dict, Set, List from jinja2 import Environment, FileSystemLoader import mdformat from docstring_parser import parse, Style from glob import glob import subprocess import re -import inspect # Add at module level _alias_cache = {} # Cache for resolved aliases @@ -575,51 +574,6 @@ def find_qmd_files(base_path: str) -> Dict[str, str]: relative_paths[filename] = f'docs/{path}' return relative_paths -def process_type_annotation(annotation, module_globals=None): - """Convert type annotation into a structured format.""" - if isinstance(annotation, ForwardRef): - # Resolve forward references - try: - resolved = annotation._evaluate(module_globals, {}) - return process_type_annotation(resolved) - except: - return {'name': annotation.__forward_arg__} - - if hasattr(annotation, '__origin__'): # Generic types like List, Dict - origin = annotation.__origin__ - args = annotation.__args__ - - if origin == Union: - return { - 'kind': 'union', - 'types': [process_type_annotation(arg) for arg in args] - } - else: - return { - 'kind': 'generic', - 'base': origin.__name__, - 'args': [process_type_annotation(arg) for arg in args] - } - - # Basic types - return {'name': getattr(annotation, '__name__', str(annotation))} - -def process_signature(member_data, module_globals): - """Pre-process signature type information.""" - if 'parameters' in member_data: - for param in member_data['parameters']: - if 'annotation' in param: - param['annotation'] = process_type_annotation( - param['annotation'], - module_globals - ) - - if 'returns' in member_data: - member_data['returns'] = process_type_annotation( - member_data['returns'], - module_globals - ) - def generate_docs(json_path: str, template_dir: str, output_dir: str): """Generate documentation from JSON data using templates.""" # print("\nEntering generate_docs()") @@ -645,12 +599,6 @@ def generate_docs(json_path: str, template_dir: str, output_dir: str): env.globals['get_all_members'] = get_all_members env.globals['get_inherited_members'] = get_inherited_members - # Pre-process type annotations - for module_name, module in data.items(): - if 'members' in module: - for member in module['members'].values(): - process_signature(member, module.get('globals', {})) - # Start processing from root module if 'validmind' in data: # First pass: Generate module documentation From 38b504fbde13d6e58a459a66e76199938a73477a Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 5 Feb 2025 11:45:21 -0800 Subject: [PATCH 060/207] Fix docstring regression --- docs/_sidebar.yml | 11 +- docs/templates/macros/types.jinja2 | 41 ++++-- docs/templates/module.qmd.jinja2 | 10 +- docs/templates/sidebar.qmd.jinja2 | 10 +- docs/validmind.qmd | 44 +++--- docs/validmind/tests.qmd | 4 +- .../tests/data_validation/ClassImbalance.qmd | 2 +- .../tests/data_validation/DatasetSplit.qmd | 2 +- .../data_validation/DescriptiveStatistics.qmd | 2 +- .../sklearn/HyperParametersTuning.qmd | 2 +- .../sklearn/KMeansClustersOptimization.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 2 +- .../sklearn/OverfitDiagnosis.qmd | 2 +- .../sklearn/PermutationFeatureImportance.qmd | 2 +- .../sklearn/PopulationStabilityIndex.qmd | 2 +- .../sklearn/RobustnessDiagnosis.qmd | 2 +- .../sklearn/TrainingTestDegradation.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 2 +- .../RegressionModelForecastPlot.qmd | 2 +- .../RegressionModelSensitivityPlot.qmd | 2 +- docs/validmind/vm_models.qmd | 2 +- scripts/generate_quarto_docs.py | 126 ++++-------------- 22 files changed, 109 insertions(+), 167 deletions(-) diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml index 35f1000af..fba48f76c 100644 --- a/docs/_sidebar.yml +++ b/docs/_sidebar.yml @@ -42,13 +42,6 @@ website: file: reference/validmind.qmd#test - text: "class RawData" file: reference/validmind.qmd#class-rawdata - contents: - - text: "RawData()" - file: reference/validmind.qmd#rawdata - - text: "inspect()" - file: reference/validmind.qmd#inspect - - text: "serialize()" - file: reference/validmind.qmd#serialize # All module documentation pages - text: "---" - text: "Submodules" @@ -67,6 +60,8 @@ website: - text: "credit_risk" file: reference/validmind/datasets/credit_risk.qmd contents: + - text: "lending_club" + file: reference/validmind/datasets/credit_risk/lending_club.qmd - text: "lending_club_bias" file: reference/validmind/datasets/credit_risk/lending_club_bias.qmd - text: "nlp" @@ -96,6 +91,8 @@ website: file: reference/validmind/test_suites/embeddings.qmd - text: "llm" file: reference/validmind/test_suites/llm.qmd + - text: "nlp" + file: reference/validmind/test_suites/nlp.qmd - text: "parameters_optimization" file: reference/validmind/test_suites/parameters_optimization.qmd - text: "regression" diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index 1b3ce7875..d9129a832 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -16,25 +16,42 @@ {%- else -%} {{ type.base }}[{{ type.args | map(attribute='format_type') | join(', ') }}] {%- endif -%} - {%- elif type.cls == "ExprName" -%} - {%- if module and type.name in module.members and module.members[type.name].kind == "alias" -%} - {{ module.members[type.name].target_path }} - {%- elif add_links and type.name not in ['str', 'dict', 'list', 'bool', 'int', 'float', 'Any'] -%} - validmind.vm_models.{{ type.name }} - {%- else -%} - {{ type.name }} - {%- endif -%} {%- elif type.cls == "ExprAttribute" and type.values is sequence -%} {{ type.values | map(attribute='name') | join('.') }} {%- elif type.cls == "ExprSubscript" and type.left is defined -%} - {{ type.left.name }}[ + {{ format_type(type.left, module, add_links) }}[ {%- if type.slice.cls == "ExprTuple" -%} - {{ type.slice.elements|map(attribute="name")|join(", ") }} + {%- for elem in type.slice.elements -%} + {{ format_type(elem, module, add_links) }} + {%- if not loop.last -%}, {% endif -%} + {%- endfor -%} {%- else -%} {{ format_type(type.slice, module, add_links) }} {%- endif -%} ] - {%- elif type.name is defined and add_links and type.name not in ['str', 'dict', 'list', 'bool', 'int', 'float'] -%} + {%- elif type.cls == "ExprName" -%} + {%- if module and type.name in module.members and module.members[type.name].kind == "alias" -%} + {{ module.members[type.name].target_path }} + {%- elif add_links and type.name not in ['str', 'dict', 'list', 'bool', 'int', 'float', 'Any', 'Union', 'Dict', 'List', 'Optional', 'Callable', 'Tuple'] -%} + validmind.vm_models.{{ type.name }} + {%- else -%} + {{ type.name }} + {%- endif -%} + {%- elif type.cls == "ExprTuple" -%} + {%- for elem in type.elements -%} + {{ format_type(elem, module, add_links) }} + {%- if not loop.last -%}, {% endif -%} + {%- endfor -%} + {%- elif type.cls == "ExprCall" -%} + {{ format_type(type.func, module, add_links) }}( + {%- for arg in type.args -%} + {{ format_type(arg, module, add_links) }} + {%- if not loop.last -%}, {% endif -%} + {%- endfor -%} + ) + {%- elif type.cls == "ExprBinOp" -%} + {{ format_type(type.left, module, add_links) }}{{ type.op }}{{ format_type(type.right, module, add_links) }} + {%- elif type.name is defined and add_links and type.name not in ['str', 'dict', 'list', 'bool', 'int', 'float', 'Any', 'Union', 'Dict', 'List', 'Optional', 'Callable', 'Tuple'] -%} validmind.vm_models.{{ type.name }} {%- else -%} {{ type.name if 'name' in type else type|string }} @@ -84,4 +101,4 @@ {%- else -%} {{ returns|string }} {%- endif -%} -{%- endmacro %} \ No newline at end of file +{%- endmacro %} \ No newline at end of file diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index 10691d5a2..a350aa7cd 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -19,10 +19,10 @@ toc-expand: 4 {% endif %} {% if module.members and module.name == "validmind" %} -## Python API + {% if module.members.__version__ %} -### __version__ +## __version__ ::: {.signature} @@ -37,7 +37,7 @@ toc-expand: 4 {% if is_public(member, module, full_data, is_root) and member.kind == "alias" %} {% set target = resolve_alias(member, full_data) %} {% if target and target.docstring %} -### {{ member.name }}() +## {{ member.name }}() {% if target.kind == "function" %} {{ signatures.render_signature(target) }} @@ -106,7 +106,7 @@ toc-expand: 4 {% if member.kind == "class" or (member.kind == "alias" and member.target_path and member.target_path.split(".")[-1][0].isupper()) %} {% set target = resolve_alias(resolved, full_data) %} -### class {{ member.name }} +## class {{ member.name }} @@ -121,7 +121,7 @@ toc-expand: 4 {% for method_name, method in target.members.items() %} {% if method.kind == "function" and (not method_name.startswith('_') or method_name in ['__init__']) %} -#### {{ member.name if method_name == '__init__' else method_name }}() +### {{ member.name if method_name == '__init__' else method_name }}() {{ signatures.render_signature(method) }} diff --git a/docs/templates/sidebar.qmd.jinja2 b/docs/templates/sidebar.qmd.jinja2 index aa10b3462..7646615fe 100644 --- a/docs/templates/sidebar.qmd.jinja2 +++ b/docs/templates/sidebar.qmd.jinja2 @@ -12,17 +12,13 @@ website: # Root level items from validmind.qmd {% if documented_items.get('root') %} {% for item in documented_items['root'] %} + - text: "{{ item.text }}" + file: {{ item.file }} {% if item.contents %} - {% for child in item.contents %} - - text: "{{ child.text }}" - file: {{ child.file }} - {% if child.contents %} contents: - {% for method in child.contents %} + {% for method in item.contents %} - text: "{{ method.text }}" file: {{ method.file }} - {% endfor %} - {% endif %} {% endfor %} {% endif %} {% endfor %} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 7185a2643..2872b170e 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -35,9 +35,9 @@ vm.init( After you have pasted the code snippet into your development source code and executed the code, the Python Library API will register with ValidMind. You can now use the ValidMind Library to document and test your models, and to upload to the ValidMind Platform. -## Python API + -### \_\_version\_\_ +## \_\_version\_\_ @@ -47,7 +47,7 @@ After you have pasted the code snippet into your development source code and exe ::: -### get_test_suite() +## get_test_suite() @@ -68,13 +68,13 @@ Gets a TestSuite object for the current project or a specific test suite This fu - **args**: Additional arguments to pass to the TestSuite - **kwargs**: Additional keyword arguments to pass to the TestSuite -### init() +## init() ::: {.signature} -def init(project:Optional\[str\] = None,api_key:Optional\[str\] = None,api_secret:Optional\[str\] = None,api_host:Optional\[str\] = None,model:Optional\[str\] = None,monitoring:bool = False,generate_descriptions:Optional\[bool\] = None) +def init(project:Optional\[str\] = None,api_key:Optional\[str\] = None,api_secret:Optional\[str\] = None,api_host:Optional\[str\] = None,model:Optional\[str\] = None,monitoring:bool = False,generate_descriptions:Optional\[bool\] = None) ::: @@ -98,7 +98,7 @@ If the API key and secret are not provided, the client will attempt to retrieve - **ValueError**: If the API key and secret are not provided -### init_dataset() +## init_dataset() @@ -125,7 +125,7 @@ Raises: ValueError: If the dataset type is not supported Returns: vm.vm.Dataset: A VM Dataset instance -### init_model() +## init_model() @@ -155,7 +155,7 @@ Initializes a VM Model, which can then be passed to other functions that can per - **ValueError**: If the model type is not supported -### init_r_model() +## init_r_model() @@ -185,13 +185,13 @@ LogisticRegression and LinearRegression models are converted to sklearn models b - A VM Model instance -### log_metric() +## log_metric() ::: {.signature} -def log_metric(key:str,value:float,inputs:Optional\[List\[str\]\] = None,params:Optional\[Dict[str, Any]\] = None,recorded_at:Optional\[str\] = None,thresholds:Optional\[Dict[str, Any]\] = None) +def log_metric(key:str,value:float,inputs:Optional\[List\[str\]\] = None,params:Optional\[Dict\[str, Any\]\] = None,recorded_at:Optional\[str\] = None,thresholds:Optional\[Dict\[str, Any\]\] = None) ::: @@ -208,7 +208,7 @@ Logs a unit metric Unit metrics are key-value pairs where the key is the metric - **recorded_at** (str): The timestamp of the metric. Server will use current time if not provided. - **thresholds** (dict): Dictionary of thresholds for the metric. -### preview_template() +## preview_template() @@ -226,7 +226,7 @@ Preview the documentation template for the current project This function will di - **ValueError**: If the project has not been initialized -### print_env() +## print_env() @@ -240,7 +240,7 @@ Preview the documentation template for the current project This function will di Prints a log of the running environment for debugging. Output includes: ValidMind Library version, operating system details, installed dependencies, and the ISO 8601 timestamp at log creation. -### reload() +## reload() @@ -254,7 +254,7 @@ Prints a log of the running environment for debugging. Output includes: ValidMin Reconnect to the ValidMind API and reload the project configuration -### run_documentation_tests() +## run_documentation_tests() @@ -285,7 +285,7 @@ Collect and run all the tests associated with a template This function will anal - **ValueError**: If the project has not been initialized -### run_test_suite() +## run_test_suite() @@ -316,7 +316,7 @@ High Level function for running a test suite This function provides a high level - **ValueError**: If the test suite name is not found or if there is an error initializing the test suite -### tags() +## tags() @@ -334,7 +334,7 @@ Decorator for specifying tags for a test. - \***tags**: The tags to apply to the test. -### tasks() +## tasks() @@ -352,7 +352,7 @@ Decorator for specifying the task types that a test is designed for. - \***tasks**: The task types that the test is designed for. -### test() +## test() @@ -389,7 +389,7 @@ The function may also include a docstring. This docstring will be used and logge - The decorated function. -### class RawData +## class RawData @@ -405,7 +405,7 @@ The function may also include a docstring. This docstring will be used and logge Holds raw data for a test result -#### RawData() +### RawData() @@ -424,7 +424,7 @@ Create a new RawData object - **log** (bool): If True, log the raw data to ValidMind - \*\***kwargs**: Keyword arguments to set as attributes e.g. `RawData(log=True, dataset_duplicates=df_duplicates)` -#### inspect() +### inspect() @@ -438,7 +438,7 @@ Create a new RawData object Inspect the raw data -#### serialize() +### serialize() diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index ac18a0750..1bd3af7ad 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -130,7 +130,7 @@ Load a test by test ID Test IDs are in the format `namespace.path_to_module.Test ::: {.signature} -def run_test(test_id:Union[TestID, ] = None,name:Union[str, ] = None,unit_metrics:Union[, ] = None,inputs:Union[, ] = None,input_grid:Union[, , ] = None,params:Union[, ] = None,param_grid:Union[, , ] = None,show:bool = True,generate_description:bool = True,title:Optional\[str\] = None,post_process_fn:Union[, ] = None,kwargs = {})validmind.vm_models.TestResult +def run_test(test_id:Union\[validmind.vm_models.TestID, None \] = None,name:Union\[str, None \] = None,unit_metrics:Union\[List\[validmind.vm_models.TestID\], None \] = None,inputs:Union\[Dict\[str, Any\], None \] = None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None \] = None,params:Union\[Dict\[str, Any\], None \] = None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None \] = None,show:bool = True,generate_description:bool = True,title:Optional\[str\] = None,post_process_fn:Union\[Callable\[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, None \], None \] = None,kwargs = {})validmind.vm_models.TestResult ::: @@ -381,7 +381,7 @@ Protocol for user-defined test providers ::: {.signature} -def list_tests(self)List\[str\] +def list_tests(self)List\[str\] ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index a93c9f72f..b4e9c8493 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -def ClassImbalance(dataset:validmind.vm_models.VMDataset,min_percent_threshold:int = 10)Tuple[, , bool] +def ClassImbalance(dataset:validmind.vm_models.VMDataset,min_percent_threshold:int = 10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\] ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 45e07da22..f14642fb4 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def DatasetSplit(datasets:List\[validmind.vm_models.VMDataset\]) +def DatasetSplit(datasets:List\[validmind.vm_models.VMDataset\]) ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 566ad9ad4..068dd295e 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def format_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict[str, Any]\] +def format_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict\[str, Any\]\] ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 2ecb6fe80..0b9ba9fe1 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def HyperParametersTuning(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,param_grid:dict,scoring:Union[str, List, Dict] = None,thresholds:Union[float, ] = None,fit_params:dict = None) +def HyperParametersTuning(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\] = None,thresholds:Union\[float, List\[float\]\] = None,fit_params:dict = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index b4fe9dfc0..d32aab84d 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def KMeansClustersOptimization(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_clusters:Union[, ] = None) +def KMeansClustersOptimization(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_clusters:Union\[List\[int\], None \] = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index d8d3bb365..44c9b0e84 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -24,7 +24,7 @@ toc-expand: 4 ::: {.signature} -def ModelsPerformanceComparison(dataset:validmind.vm_models.VMDataset,models:list\[validmind.vm_models.VMModel\]) +def ModelsPerformanceComparison(dataset:validmind.vm_models.VMDataset,models:list\[validmind.vm_models.VMModel\]) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index b9b9739a4..279132993 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def OverfitDiagnosis(model:validmind.vm_models.VMModel,datasets:List\[validmind.vm_models.VMDataset\],metric:str = None,cut_off_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}) +def OverfitDiagnosis(model:validmind.vm_models.VMModel,datasets:List\[validmind.vm_models.VMDataset\],metric:str = None,cut_off_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 17c95282c..7257713e2 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def PermutationFeatureImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,fontsize:Union[int, ] = None,figure_height:Union[int, ] = None) +def PermutationFeatureImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,fontsize:Union\[int, None \] = None,figure_height:Union\[int, None \] = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 6cbacf3e8..18535c240 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -44,7 +44,7 @@ Taken from: https://towardsdatascience.com/checking-model-stability-and-populati ::: {.signature} -def PopulationStabilityIndex(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,num_bins:int = 10,mode:str = 'fixed') +def PopulationStabilityIndex(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,num_bins:int = 10,mode:str = 'fixed') ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 01fd941a6..03270fc16 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RobustnessDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,metric:str = None,scaling_factor_std_dev_list:List\[float\] = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}) +def RobustnessDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,metric:str = None,scaling_factor_std_dev_list:List\[float\] = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index cf2943e8a..d81be3ea5 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TrainingTestDegradation(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,max_threshold:float = 0.1) +def TrainingTestDegradation(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,max_threshold:float = 0.1) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 60b139ba3..e9f9b70f1 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def WeakspotsDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,features_columns:Union[, ] = None,metrics:Union[, ] = None,thresholds:Union[, ] = None) +def WeakspotsDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,features_columns:Union\[List\[str\], None \] = None,metrics:Union\[Dict\[str, Callable\], None \] = None,thresholds:Union\[Dict\[str, float\], None \] = None) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 811f51278..8ec5c8a55 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionModelForecastPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,start_date:Union[str, ] = None,end_date:Union[str, ] = None) +def RegressionModelForecastPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,start_date:Union\[str, None \] = None,end_date:Union\[str, None \] = None) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 61a576f63..763f57bb2 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionModelSensitivityPlot(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,shocks:List\[float\] = {'cls': 'ExprList', 'elements': ['0.1']},transformation:Union[str, ] = None) +def RegressionModelSensitivityPlot(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,shocks:List\[float\] = {'cls': 'ExprList', 'elements': ['0.1']},transformation:Union\[str, None \] = None) ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index db15d8e2a..46a352421 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -140,7 +140,7 @@ Returns the default configuration for the test suite Each test in a test suite c ::: {.signature} -def get_tests(self)List\[str\] +def get_tests(self)List\[str\] ::: diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 1fd54e77e..1dc462959 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -90,29 +90,20 @@ def is_public(member: Dict[str, Any], module: Dict[str, Any], full_data: Dict[st """Check if a member should be included in public documentation.""" name = member.get('name', '') - # Add debug logging - # print(f"\nChecking visibility for: {name}") - # print(f"Is root: {is_root}") - # Skip private members except __init__ and __post_init__ if name.startswith('_') and name not in {'__init__', '__post_init__'}: - # print(f"- Skipping private member: {name}") return False # At root level, only show items from __all__ if is_root: root_all = get_all_members(full_data['validmind'].get('members', {})) - # print(f"- Root __all__: {root_all}") return name in root_all # If module has __all__, only include members listed there if module and '__all__' in module.get('members', {}): module_all = get_all_members(module.get('members', {})) - # print(f"- Module __all__: {module_all}") - # print(f"- Is {name} in module __all__? {name in module_all}") return name in module_all - # print(f"- No __all__ found, including {name}") return True def ensure_dir(path): @@ -146,6 +137,9 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: if not module.get('members'): return result + # Determine if this is the root module + is_root = module.get('name') == 'validmind' or is_root + # Build the current file path file_path = '/'.join(path) module_name = module.get('name', 'root') @@ -157,92 +151,43 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: qmd_path = written_qmd_files.get(qmd_filename) if qmd_path and os.path.exists(qmd_path): - # print(f"\nParsing headings from: {qmd_path}") with open(qmd_path, 'r') as f: content = f.read() - # print("\nRaw content:") - # for line in content.split('\n'): - # if line.startswith('#'): - # print(f"Found heading line: {line}") - # Track current class for nesting methods current_class = None - # Parse headings - current_section = None + # Parse headings - only update the heading level checks for line in content.split('\n'): - if line.startswith('## '): + if line.startswith('## '): # Main function/class level heading = line[3:].strip() - # print(f"Found L2 heading: {heading}") anchor = clean_anchor_text(heading) item = { 'text': heading, - 'file': f"reference/validmind.qmd#{anchor}", - 'contents': [] + 'file': f"reference/validmind.qmd#{anchor}" } + if 'class' in heading: + item['contents'] = [] + current_class = item module_items.append(item) - current_section = item - current_class = None - elif line.startswith('### '): - if current_section: - heading = line[4:].strip() - # print(f" Found L3 heading under {current_section['text']}: {heading}") - anchor = clean_anchor_text(heading) - item = { - 'text': heading, - 'file': f"reference/validmind.qmd#{anchor}" - } - if 'class' in heading or 'class' in heading: - item['contents'] = [] - current_class = item - # print(f" Set current_class to: {heading}") - current_section['contents'].append(item) - # print(f" Current section contents: {current_section['contents']}") - elif line.startswith('#### '): - if current_class: - heading = line[5:].strip() - # print(f" Found L4 heading under class {current_class['text']}: {heading}") - anchor = clean_anchor_text(heading) - method_item = { - 'text': heading, - 'file': f"reference/validmind.qmd#{anchor}" - } - current_class['contents'].append(method_item) - # print(f" Added method to class. Class contents now: {current_class['contents']}") + elif line.startswith('### ') and current_class: # Method level + heading = line[4:].strip() + anchor = clean_anchor_text(heading) + method_item = { + 'text': heading, + 'file': f"reference/validmind.qmd#{anchor}" + } + current_class['contents'].append(method_item) - # Clean up empty contents lists at the end + # Clean up empty contents lists for item in module_items: - if not item.get('contents'): + if 'contents' in item and not item['contents']: del item['contents'] - else: - for child in item['contents']: - if child.get('contents') and not child['contents']: - del child['contents'] - - # print("\nFinal structure:") - # for item in module_items: - # print(f"Section: {item['text']}") - # if 'contents' in item: - # for child in item['contents']: - # print(f" Child: {child['text']}") - # if 'contents' in child: - # for method in child['contents']: - # print(f" Method: {method['text']}") - - if module_items: - result['root'] = module_items - # print("\nCollected items:") - # for item in module_items: - # print(f" {item['text']} -> {item['file']}") - # if item.get('contents'): - # for child in item['contents']: - # print(f" - {child['text']} -> {child['file']}") - # if child.get('contents'): # Add this to show class methods - # for method in child['contents']: - # print(f" * {method['text']} -> {method['file']}") - - # Recursively collect from submodules + + if module_items: + result['root'] = module_items + + # Process submodules for member in sort_members(module['members'], module.get('name') == 'errors'): if member['kind'] == 'module' and is_public(member, module, full_data, is_root): submodule_path = path + [member['name']] @@ -269,23 +214,10 @@ def process_module(module: Dict[str, Any], path: List[str], env: Environment, fu module_dir = os.path.join('docs', *path[:-1]) ensure_dir(module_dir) - + # Get module template module_template = env.get_template('module.qmd.jinja2') - # Debug template rendering for root module - # if len(path) <= 1: # Root module - # print("\nGenerating root module (validmind.qmd):") - # for name, member in module.get('members', {}).items(): - # if member['kind'] != 'module': - # print(f"\nMember: {name}") - # print(f" Kind: {member['kind']}") - # print(f" Has docstring: {'docstring' in member}") - # if member.get('members'): - # print(" Methods:") - # for method_name, method in member['members'].items(): - # print(f" - {method_name} ({method.get('kind')})") - # Generate module documentation output = module_template.render( module=module, @@ -300,10 +232,10 @@ def process_module(module: Dict[str, Any], path: List[str], env: Environment, fu with open(output_path, 'w') as f: f.write(output) - # Track with full path and print full path + # Track with full relative path as key + rel_path = os.path.join(*path[1:], filename) if len(path) > 1 else filename full_path = os.path.join("docs", os.path.relpath(output_path, "docs")) - # print(f"Wrote file: {full_path}") - written_qmd_files[filename] = full_path + written_qmd_files[rel_path] = full_path # Generate version.qmd for root module if module.get('name') == 'validmind' and module.get('members', {}).get('__version__'): @@ -444,7 +376,7 @@ def try_parse_docstring(docstring: str) -> Any: return parse(docstring, style=Style.REST) except Exception: return None - + def parse_docstrings_recursively(data: Dict[str, Any]): """Recursively parse all docstrings in the data structure.""" if isinstance(data, dict): From e94720432478f719bd9465697ca043bccee8387e Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 5 Feb 2025 12:39:24 -0800 Subject: [PATCH 061/207] Fix docstrings in Python API --- validmind/client.py | 2 +- validmind/datasets/credit_risk/lending_club.py | 7 +++++-- validmind/datasets/nlp/cnn_dailymail.py | 9 ++++++--- validmind/datasets/regression/__init__.py | 7 +++++-- validmind/tests/test_providers.py | 2 +- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/validmind/client.py b/validmind/client.py index ef94dc117..c624c7431 100644 --- a/validmind/client.py +++ b/validmind/client.py @@ -75,7 +75,7 @@ def init_dataset( target_column (str): The name of the target column in the dataset feature_columns (list): A list of names of feature columns in the dataset extra_columns (dictionary): A dictionary containing the names of the - prediction_column and group_by_columns in the dataset + prediction_column and group_by_columns in the dataset class_labels (dict): A list of class labels for classification problems type (str): The type of dataset (one of DATASET_TYPES) input_id (str): The input ID for the dataset (e.g. "my_dataset"). By default, diff --git a/validmind/datasets/credit_risk/lending_club.py b/validmind/datasets/credit_risk/lending_club.py index d6bd535b3..f28892c72 100644 --- a/validmind/datasets/credit_risk/lending_club.py +++ b/validmind/datasets/credit_risk/lending_club.py @@ -105,8 +105,11 @@ def load_data(source="online", verbose=True): """ Load data from either an online source or offline files, automatically dropping specified columns for offline data. - :param source: 'online' for online data, 'offline' for offline files. Defaults to 'online'. - :return: DataFrame containing the loaded data. + Args: + source: 'online' for online data, 'offline' for offline files. Defaults to 'online'. + + Returns: + DataFrame: DataFrame containing the loaded data. """ if source == "online": diff --git a/validmind/datasets/nlp/cnn_dailymail.py b/validmind/datasets/nlp/cnn_dailymail.py index 2dc021a6f..e856dc4f5 100644 --- a/validmind/datasets/nlp/cnn_dailymail.py +++ b/validmind/datasets/nlp/cnn_dailymail.py @@ -26,9 +26,12 @@ def load_data(source="online", dataset_size=None): """ Load data from either online source or offline files. - :param source: 'online' for online data, 'offline' for offline data. Defaults to 'online'. - :param dataset_size: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. - :return: DataFrame containing the loaded data. + Args: + source: 'online' for online data, 'offline' for offline data. Defaults to 'online'. + dataset_size: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. + + Returns: + DataFrame containing the loaded data. """ if source == "online": # Load online data without predictions diff --git a/validmind/datasets/regression/__init__.py b/validmind/datasets/regression/__init__.py index f4d7f99c6..649b225c8 100644 --- a/validmind/datasets/regression/__init__.py +++ b/validmind/datasets/regression/__init__.py @@ -17,8 +17,11 @@ def identify_frequencies(df): """ Identify the frequency of each series in the DataFrame. - :param df: Time-series DataFrame - :return: DataFrame with two columns: 'Variable' and 'Frequency' + Args: + df: Time-series DataFrame. + + Returns: + DataFrame with two columns: "Variable" and "Frequency". """ frequencies = [] for column in df.columns: diff --git a/validmind/tests/test_providers.py b/validmind/tests/test_providers.py index 6820e247d..43064f5f7 100644 --- a/validmind/tests/test_providers.py +++ b/validmind/tests/test_providers.py @@ -126,7 +126,7 @@ def load_test(self, test_id: str): Args: test_id (str): The identifier of the test. This corresponds to the relative - path of the python file from the root folder, with slashes replaced by dots + path of the python file from the root folder, with slashes replaced by dots Returns: The test class that matches the last part of the test_id. From b63c4ef224ccd5ce3fde4f56fb962b774d456918 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 5 Feb 2025 12:47:29 -0800 Subject: [PATCH 062/207] Fix Python API docstring --- validmind/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validmind/client.py b/validmind/client.py index c624c7431..bc1673c32 100644 --- a/validmind/client.py +++ b/validmind/client.py @@ -69,7 +69,7 @@ def init_dataset( - Torch TensorDataset Args: - dataset : dataset from various python libraries + dataset: Dataset from various Python libraries model (VMModel): ValidMind model object targets (vm.vm.DatasetTargets): A list of target variables target_column (str): The name of the target column in the dataset From f9c361159aed4d89baac29ac7776fa9d7e2d415b Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 5 Feb 2025 12:50:12 -0800 Subject: [PATCH 063/207] Fix Python API docstring --- validmind/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validmind/client.py b/validmind/client.py index bc1673c32..62b4c3b14 100644 --- a/validmind/client.py +++ b/validmind/client.py @@ -278,7 +278,7 @@ def init_r_model( """ Initializes a VM Model for an R model - R models must be saved to disk and the filetype depends on the model type... + R models must be saved to disk and the filetype depends on the model type. Currently we support the following model types: - LogisticRegression `glm` model in R: saved as an RDS file with `saveRDS` From 72951a0ab47a6c386a091193351f71472dedb1c9 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 5 Feb 2025 13:17:02 -0800 Subject: [PATCH 064/207] Save point while fixing some docstrings --- docs/templates/macros/docstring.jinja2 | 10 ++- docs/validmind.qmd | 90 +++++++++++++------ .../classification/customer_churn.qmd | 10 ++- .../datasets/classification/taiwan_credit.qmd | 6 +- .../datasets/credit_risk/lending_club.qmd | 14 ++- .../credit_risk/lending_club_bias.qmd | 4 +- docs/validmind/datasets/nlp/cnn_dailymail.qmd | 11 ++- docs/validmind/datasets/regression/fred.qmd | 2 +- .../datasets/regression/lending_club.qmd | 2 +- docs/validmind/errors.qmd | 12 ++- docs/validmind/test_suites.qmd | 16 ++-- docs/validmind/test_suites/classifier.qmd | 8 +- docs/validmind/test_suites/cluster.qmd | 4 +- docs/validmind/test_suites/embeddings.qmd | 4 +- .../test_suites/parameters_optimization.qmd | 4 +- docs/validmind/test_suites/regression.qmd | 4 +- .../test_suites/tabular_datasets.qmd | 4 +- docs/validmind/test_suites/time_series.qmd | 8 +- docs/validmind/tests.qmd | 59 ++++++++---- .../tests/data_validation/ACFandPACFPlot.qmd | 4 +- .../tests/data_validation/AutoMA.qmd | 4 +- .../data_validation/BivariateScatterPlots.qmd | 4 +- .../data_validation/DatasetDescription.qmd | 8 +- .../tests/data_validation/DatasetSplit.qmd | 4 +- .../data_validation/DescriptiveStatistics.qmd | 8 +- .../FeatureTargetCorrelationPlot.qmd | 4 +- .../LaggedCorrelationHeatmap.qmd | 4 +- .../data_validation/MissingValuesBarPlot.qmd | 4 +- .../ProtectedClassesDescription.qmd | 4 +- .../data_validation/RollingStatsPlot.qmd | 4 +- .../tests/data_validation/Skewness.qmd | 4 +- .../tests/data_validation/SpreadPlot.qmd | 4 +- .../TabularDateTimeHistograms.qmd | 4 +- .../TabularNumericalHistograms.qmd | 4 +- .../data_validation/TargetRateBarPlots.qmd | 4 +- .../data_validation/TimeSeriesDescription.qmd | 4 +- .../data_validation/TooManyZeroValues.qmd | 4 +- .../tests/data_validation/WOEBinPlots.qmd | 4 +- .../tests/data_validation/WOEBinTable.qmd | 4 +- .../data_validation/nlp/TextDescription.qmd | 4 +- .../tests/model_validation/BertScore.qmd | 10 ++- .../tests/model_validation/BleuScore.qmd | 10 ++- .../ClusterSizeDistribution.qmd | 4 +- .../model_validation/ContextualRecall.qmd | 10 ++- .../tests/model_validation/FeaturesAUC.qmd | 4 +- .../tests/model_validation/MeteorScore.qmd | 10 ++- .../tests/model_validation/ModelMetadata.qmd | 4 +- .../tests/model_validation/RegardScore.qmd | 10 ++- .../tests/model_validation/RougeScore.qmd | 4 +- .../TimeSeriesPredictionWithCI.qmd | 4 +- .../TimeSeriesR2SquareBySegments.qmd | 4 +- .../tests/model_validation/TokenDisparity.qmd | 4 +- .../sklearn/AdjustedMutualInformation.qmd | 4 +- .../sklearn/AdjustedRandIndex.qmd | 4 +- .../sklearn/CalibrationCurve.qmd | 4 +- .../sklearn/ClassifierPerformance.qmd | 4 +- .../ClassifierThresholdOptimization.qmd | 4 +- .../sklearn/ConfusionMatrix.qmd | 4 +- .../sklearn/FeatureImportance.qmd | 4 +- .../sklearn/FowlkesMallowsScore.qmd | 4 +- .../sklearn/HomogeneityScore.qmd | 4 +- .../sklearn/HyperParametersTuning.qmd | 4 +- .../sklearn/MinimumF1Score.qmd | 4 +- .../sklearn/ModelsPerformanceComparison.qmd | 4 +- .../sklearn/OverfitDiagnosis.qmd | 4 +- .../sklearn/PermutationFeatureImportance.qmd | 4 +- .../sklearn/PopulationStabilityIndex.qmd | 8 +- .../model_validation/sklearn/ROCCurve.qmd | 4 +- .../sklearn/RegressionErrorsComparison.qmd | 4 +- .../sklearn/RegressionR2Square.qmd | 4 +- .../sklearn/RegressionR2SquareComparison.qmd | 4 +- .../sklearn/RobustnessDiagnosis.qmd | 4 +- .../sklearn/SHAPGlobalImportance.qmd | 8 +- .../sklearn/SilhouettePlot.qmd | 4 +- .../sklearn/WeakspotsDiagnosis.qmd | 4 +- .../PredictionProbabilitiesHistogram.qmd | 4 +- .../statsmodels/RegressionCoeffs.qmd | 4 +- .../RegressionModelForecastPlot.qmd | 4 +- .../RegressionModelSensitivityPlot.qmd | 4 +- ...RegressionPermutationFeatureImportance.qmd | 4 +- .../statsmodels/ScorecardHistogram.qmd | 4 +- .../tests/prompt_validation/Bias.qmd | 12 ++- .../tests/prompt_validation/Clarity.qmd | 8 +- .../tests/prompt_validation/Conciseness.qmd | 8 +- .../tests/prompt_validation/Delimitation.qmd | 8 +- .../prompt_validation/NegativeInstruction.qmd | 8 +- .../tests/prompt_validation/Robustness.qmd | 4 +- .../tests/prompt_validation/Specificity.qmd | 12 ++- .../prompt_validation/ai_powered_test.qmd | 8 +- docs/validmind/vm_models.qmd | 46 ++++++---- scripts/generate_quarto_docs.py | 71 ++++++--------- 91 files changed, 515 insertions(+), 236 deletions(-) diff --git a/docs/templates/macros/docstring.jinja2 b/docs/templates/macros/docstring.jinja2 index bdd4ee6da..f2853f0e6 100644 --- a/docs/templates/macros/docstring.jinja2 +++ b/docs/templates/macros/docstring.jinja2 @@ -8,14 +8,16 @@ {# Main description #} {%- if docstring.parsed.short_description -%} {%- set _ = sections.append(docstring.parsed.short_description) -%} + {%- if docstring.parsed.long_description -%} + {%- endif -%} {%- endif -%} - {%- if docstring.parsed.long_description -%} - {%- set _ = sections.append(docstring.parsed.long_description) -%} - {%- endif -%} + {% if docstring.parsed.long_description %} + {% set _ = sections.append(docstring.parsed.long_description) %} + {% endif %} {# Parameters #} {%- if docstring.parsed.params -%} - {%- set _ = sections.append("\n**Parameters**") -%} + {%- set _ = sections.append("\n**Arguments**") -%} {%- for param in docstring.parsed.params -%} {%- if param.arg_name and param.description -%} {%- set desc = param.description | trim -%} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 2872b170e..88dfad5a5 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -10,7 +10,9 @@ toc-expand: 4 -The ValidMind Library is a suite of developer tools and methods designed to automate the documentation and validation of your models. Designed to be model agnostic, the ValidMind Library provides all the standard functionality without requiring you to rewrite any functions as long as your model is built in Python. +The ValidMind Library is a suite of developer tools and methods designed to automate the documentation and validation of your models. + +Designed to be model agnostic, the ValidMind Library provides all the standard functionality without requiring you to rewrite any functions as long as your model is built in Python. With a rich array of documentation tools and test suites, from documenting descriptions of your datasets to testing your models for weak spots and overfit areas, the ValidMind Library helps you automate model documentation by feeding the ValidMind Platform with documentation artifacts and test results. @@ -59,9 +61,11 @@ After you have pasted the code snippet into your development source code and exe -Gets a TestSuite object for the current project or a specific test suite This function provides an interface to retrieve the TestSuite instance for the current project or a specific TestSuite instance identified by test_suite_id. The project Test Suite will contain sections for every section in the project's documentation template and these Test Suite Sections will contain all the tests associated with that template section. +Gets a TestSuite object for the current project or a specific test suite + +This function provides an interface to retrieve the TestSuite instance for the current project or a specific TestSuite instance identified by test_suite_id. The project Test Suite will contain sections for every section in the project's documentation template and these Test Suite Sections will contain all the tests associated with that template section. -**Parameters** +**Arguments** - **test_suite_id** (str): The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. - **section** (str): The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. @@ -80,11 +84,13 @@ Gets a TestSuite object for the current project or a specific test suite This fu -Initializes the API client instances and calls the /ping endpoint to ensure the provided credentials are valid and we can connect to the ValidMind API. +Initializes the API client instances and calls the /ping endpoint to ensure + +the provided credentials are valid and we can connect to the ValidMind API. If the API key and secret are not provided, the client will attempt to retrieve them from the environment variables `VM_API_KEY` and `VM_API_SECRET`. -**Parameters** +**Arguments** - **project** (str, optional): The project CUID. Alias for model. Defaults to None. [DEPRECATED] - **model** (str, optional): The model CUID. Defaults to None. @@ -110,7 +116,9 @@ If the API key and secret are not provided, the client will attempt to retrieve -Initializes a VM Dataset, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are reading a valid dataset type. +Initializes a VM Dataset, which can then be passed to other functions + +that can perform additional analysis and tests on the data. This function also ensures we are reading a valid dataset type. The following dataset types are supported: @@ -119,11 +127,25 @@ The following dataset types are supported: - Numpy ndarray - Torch TensorDataset -Args: dataset : dataset from various python libraries model (VMModel): ValidMind model object targets (vm.vm.DatasetTargets): A list of target variables target_column (str): The name of the target column in the dataset feature_columns (list): A list of names of feature columns in the dataset extra_columns (dictionary): A dictionary containing the names of the prediction_column and group_by_columns in the dataset class_labels (dict): A list of class labels for classification problems type (str): The type of dataset (one of DATASET_TYPES) input_id (str): The input ID for the dataset (e.g. "my_dataset"). By default, this will be set to `dataset` but if you are passing this dataset as a test input using some other key than `dataset`, then you should set this to the same key. +**Arguments** + +- **dataset**: Dataset from various Python libraries +- **model** (VMModel): ValidMind model object +- **targets** (vm.vm.DatasetTargets): A list of target variables +- **target_column** (str): The name of the target column in the dataset +- **feature_columns** (list): A list of names of feature columns in the dataset +- **extra_columns** (dictionary): A dictionary containing the names of the prediction_column and group_by_columns in the dataset +- **class_labels** (dict): A list of class labels for classification problems +- **type** (str): The type of dataset (one of DATASET_TYPES) +- **input_id** (str): The input ID for the dataset (e.g. "my_dataset"). By default, this will be set to `dataset` but if you are passing this dataset as a test input using some other key than `dataset`, then you should set this to the same key. -Raises: ValueError: If the dataset type is not supported +**Returns** + +- A VM Dataset instance + +**Raises** -Returns: vm.vm.Dataset: A VM Dataset instance +- **ValueError**: If the dataset type is not supported ## init_model() @@ -137,9 +159,11 @@ Returns: vm.vm.Dataset: A VM Dataset instance -Initializes a VM Model, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are creating a model supported libraries. +Initializes a VM Model, which can then be passed to other functions -**Parameters** +that can perform additional analysis and tests on the data. This function also ensures we are creating a model supported libraries. + +**Arguments** - **model**: A trained model or VMModel instance - **input_id** (str): The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. @@ -167,7 +191,9 @@ Initializes a VM Model, which can then be passed to other functions that can per -Initializes a VM Model for an R model R models must be saved to disk and the filetype depends on the model type... Currently we support the following model types: +Initializes a VM Model for an R model + +R models must be saved to disk and the filetype depends on the model type. Currently we support the following model types: - LogisticRegression `glm` model in R: saved as an RDS file with `saveRDS` - LinearRegression `lm` model in R: saved as an RDS file with `saveRDS` @@ -176,7 +202,7 @@ Initializes a VM Model for an R model R models must be saved to disk and the fil LogisticRegression and LinearRegression models are converted to sklearn models by extracting the coefficients and intercept from the R model. XGB models are loaded using the xgboost since xgb models saved in .json or .bin format can be loaded directly with either Python or R -**Parameters** +**Arguments** - **model_path** (str): The path to the R model saved as an RDS or XGB file - **model_type** (str): The type of the model (one of R_MODEL_TYPES) @@ -197,9 +223,11 @@ LogisticRegression and LinearRegression models are converted to sklearn models b -Logs a unit metric Unit metrics are key-value pairs where the key is the metric name and the value is a scalar (int or float). These key-value pairs are associated with the currently selected model (inventory model in the ValidMind Platform) and keys can be logged to over time to create a history of the metric. On the ValidMind Platform, these metrics will be used to create plots/visualizations for documentation and dashboards etc. +Logs a unit metric -**Parameters** +Unit metrics are key-value pairs where the key is the metric name and the value is a scalar (int or float). These key-value pairs are associated with the currently selected model (inventory model in the ValidMind Platform) and keys can be logged to over time to create a history of the metric. On the ValidMind Platform, these metrics will be used to create plots/visualizations for documentation and dashboards etc. + +**Arguments** - **key** (str): The metric key - **value** (float): The metric value @@ -220,7 +248,9 @@ Logs a unit metric Unit metrics are key-value pairs where the key is the metric -Preview the documentation template for the current project This function will display the documentation template for the current project. If the project has not been initialized, then an error will be raised. +Preview the documentation template for the current project + +This function will display the documentation template for the current project. If the project has not been initialized, then an error will be raised. **Raises** @@ -238,7 +268,9 @@ Preview the documentation template for the current project This function will di -Prints a log of the running environment for debugging. Output includes: ValidMind Library version, operating system details, installed dependencies, and the ISO 8601 timestamp at log creation. +Prints a log of the running environment for debugging. + +Output includes: ValidMind Library version, operating system details, installed dependencies, and the ISO 8601 timestamp at log creation. ## reload() @@ -266,9 +298,11 @@ Reconnect to the ValidMind API and reload the project configuration -Collect and run all the tests associated with a template This function will analyze the current project's documentation template and collect all the tests associated with it into a test suite. It will then run the test suite, log the results to the ValidMind API, and display them to the user. +Collect and run all the tests associated with a template + +This function will analyze the current project's documentation template and collect all the tests associated with it into a test suite. It will then run the test suite, log the results to the ValidMind API, and display them to the user. -**Parameters** +**Arguments** - **section** (str or list, optional): The section(s) to preview. Defaults to None. - **send** (bool): Whether to send the results to the ValidMind API. Defaults to True. @@ -297,9 +331,11 @@ Collect and run all the tests associated with a template This function will anal -High Level function for running a test suite This function provides a high level interface for running a test suite. A test suite is a collection of tests. This function will automatically find the correct test suite class based on the test_suite_id, initialize each of the tests, and run them. +High Level function for running a test suite -**Parameters** +This function provides a high level interface for running a test suite. A test suite is a collection of tests. This function will automatically find the correct test suite class based on the test_suite_id, initialize each of the tests, and run them. + +**Arguments** - **test_suite_id** (str): The test suite name (e.g. 'classifier_full_suite') - **config** (dict): A dictionary of parameters to pass to the tests in the test suite. Defaults to None. @@ -330,7 +366,7 @@ High Level function for running a test suite This function provides a high level Decorator for specifying tags for a test. -**Parameters** +**Arguments** - \***tags**: The tags to apply to the test. @@ -348,7 +384,7 @@ Decorator for specifying tags for a test. Decorator for specifying the task types that a test is designed for. -**Parameters** +**Arguments** - \***tasks**: The task types that the test is designed for. @@ -364,7 +400,9 @@ Decorator for specifying the task types that a test is designed for. -Decorator for creating and registering custom tests This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. +Decorator for creating and registering custom tests + +This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. The function can take two different types of arguments: @@ -380,7 +418,7 @@ The function should return one of the following types: The function may also include a docstring. This docstring will be used and logged as the metric's description. -**Parameters** +**Arguments** - **func**: The function to decorate - **test_id**: The identifier for the metric. If not provided, the function name is used. @@ -419,7 +457,7 @@ Holds raw data for a test result Create a new RawData object -**Parameters** +**Arguments** - **log** (bool): If True, log the raw data to ValidMind - \*\***kwargs**: Keyword arguments to set as attributes e.g. `RawData(log=True, dataset_duplicates=df_duplicates)` diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index e269b0031..cc25b9832 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -20,7 +20,7 @@ toc-expand: 4 Preprocess boolean columns. -**Parameters** +**Arguments** - **df** (pandas.DataFrame): Dataframe to preprocess. - **columns** (list): List of columns to preprocess. @@ -43,7 +43,7 @@ Preprocess boolean columns. Preprocess categorical columns. -**Parameters** +**Arguments** - **df** (pandas.DataFrame): Dataframe to preprocess. - **columns** (list): List of columns to preprocess. @@ -66,7 +66,7 @@ Preprocess categorical columns. Preprocess numerical columns. -**Parameters** +**Arguments** - **df** (pandas.DataFrame): Dataframe to preprocess. - **columns** (list): List of columns to preprocess. @@ -89,7 +89,9 @@ Preprocess numerical columns. -Returns input configuration for the default documentation template assigned to this demo model +Returns input configuration for the default documentation + +template assigned to this demo model The default documentation template uses the following inputs: diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index 155c4a7bf..43620eded 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -20,7 +20,7 @@ toc-expand: 4 Preprocess boolean columns. -**Parameters** +**Arguments** - **df** (pandas.DataFrame): Dataframe to preprocess. - **columns** (list): List of columns to preprocess. @@ -43,7 +43,7 @@ Preprocess boolean columns. Preprocess categorical columns. -**Parameters** +**Arguments** - **df** (pandas.DataFrame): Dataframe to preprocess. - **columns** (list): List of columns to preprocess. @@ -66,7 +66,7 @@ Preprocess categorical columns. Preprocess numerical columns. -**Parameters** +**Arguments** - **df** (pandas.DataFrame): Dataframe to preprocess. - **columns** (list): List of columns to preprocess. diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index 2e4d80936..79779965a 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -46,7 +46,7 @@ toc-expand: 4 Get demo test configuration. -**Parameters** +**Arguments** - **x_test**: Test features DataFrame - **y_test**: Test target Series @@ -81,7 +81,15 @@ Get demo test configuration. -Load data from either an online source or offline files, automatically dropping specified columns for offline data. :param source: 'online' for online data, 'offline' for offline files. Defaults to 'online'. :return: DataFrame containing the loaded data. +Load data from either an online source or offline files, automatically dropping specified columns for offline data. + +**Arguments** + +- **source**: 'online' for online data, 'offline' for offline files. Defaults to 'online'. + +**Returns** + +- DataFrame containing the loaded data. @@ -135,7 +143,7 @@ Load data from either an online source or offline files, automatically dropping Split dataset into train, validation (optional), and test sets. -**Parameters** +**Arguments** - **df**: Input DataFrame - **validation_split**: If None, returns train/test split. If float, returns train/val/test split diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 0395572c5..7338520b3 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -32,7 +32,9 @@ toc-expand: 4 -Load data from the specified CSV file. :return: DataFrame containing the loaded data. +Load data from the specified CSV file. + +:return: DataFrame containing the loaded data. diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index 4da81ee98..246927922 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -36,4 +36,13 @@ Primary function to format and display a DataFrame. -Load data from either online source or offline files. :param source: 'online' for online data, 'offline' for offline data. Defaults to 'online'. :param dataset_size: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. :return: DataFrame containing the loaded data. +Load data from either online source or offline files. + +**Arguments** + +- **source**: 'online' for online data, 'offline' for offline data. Defaults to 'online'. +- **dataset_size**: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. + +**Returns** + +- DataFrame containing the loaded data. diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index ca7d95b2a..c02e9670b 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -94,7 +94,7 @@ toc-expand: 4 Split a time series DataFrame into train, validation, and test sets. -**Parameters** +**Arguments** - **df** (pandas.DataFrame): The time series DataFrame to be split. - **split_option** (str): The split option to choose from: 'train_test_val' (default) or 'train_test'. diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 431c7bafb..8796e644c 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -34,7 +34,7 @@ toc-expand: 4 Split a time series DataFrame into train, validation, and test sets. -**Parameters** +**Arguments** - **df** (pandas.DataFrame): The time series DataFrame to be split. - **split_option** (str): The split option to choose from: 'train_test_val' (default) or 'train_test'. diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index becba8cfe..3bf3268d4 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -8,7 +8,9 @@ toc-expand: 4 -This module contains all the custom errors that are used in the ValidMind Library. The following base errors are defined for others: +This module contains all the custom errors that are used in the ValidMind Library. + +The following base errors are defined for others: - BaseError - APIRequestError @@ -539,7 +541,9 @@ When the client config is missing the documentation template. -When the pytorch model is missing a predict function or its predict method does not have the expected arguments. +When the pytorch model is missing a predict function or its predict + +method does not have the expected arguments. **Inherited members** @@ -822,7 +826,9 @@ When an unsupported R model is used. -Safely try to parse JSON from the response message in case the API returns a non-JSON string or if the API returns a non-standard error +Safely try to parse JSON from the response message in case the API + +returns a non-JSON string or if the API returns a non-standard error diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index de416cc93..ad3f9da29 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -65,7 +65,7 @@ Get a logger for the given module name Convert a test ID to a human-readable name. -**Parameters** +**Arguments** - **test_id** (str): The test identifier, typically in CamelCase or snake_case. @@ -89,7 +89,7 @@ Convert a test ID to a human-readable name. Describes a Test Suite by ID -**Parameters** +**Arguments** - **test_suite_id**: Test Suite ID - **verbose**: If True, describe all plans and tests in the Test Suite @@ -574,7 +574,9 @@ Test suite for tabular datasets. -Test suite to extract metadata and descriptive statistics from a tabular dataset +Test suite to extract metadata and descriptive + +statistics from a tabular dataset **Inherited members** @@ -664,7 +666,9 @@ Test suite for time series model validation. -This test suite provides a preliminary understanding of the features and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. +This test suite provides a preliminary understanding of the features + +and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. **Inherited members** @@ -682,7 +686,9 @@ This test suite provides a preliminary understanding of the features and relatio -This test suite provides a preliminary understanding of the target variable(s) used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). +This test suite provides a preliminary understanding of the target variable(s) + +used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). The raw time series data provides a visual inspection of the target variable's behavior over time. This helps to identify any patterns or trends in the data, as well as any potential outliers or anomalies. The histogram of the target variable displays the distribution of values, providing insight into the range and frequency of values observed in the data. diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index 594308d53..08ac5a799 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -8,7 +8,9 @@ toc-expand: 4 -Test suites for sklearn-compatible classifier models Ideal setup is to have the API client to read a custom test suite from the project's configuration +Test suites for sklearn-compatible classifier models + +Ideal setup is to have the API client to read a custom test suite from the project's configuration @@ -132,6 +134,8 @@ Test suite for data quality on tabular datasets -Test suite to extract metadata and descriptive statistics from a tabular dataset +Test suite to extract metadata and descriptive + +statistics from a tabular dataset **Inherited members** diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index ff937b456..e717b59ef 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -8,7 +8,9 @@ toc-expand: 4 -Test suites for sklearn-compatible clustering models Ideal setup is to have the API client to read a custom test suite from the project's configuration +Test suites for sklearn-compatible clustering models + +Ideal setup is to have the API client to read a custom test suite from the project's configuration diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index ec57f5a73..45e6ede7b 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -8,7 +8,9 @@ toc-expand: 4 -Test suites for embeddings models Ideal setup is to have the API client to read a custom test suite from the project's configuration +Test suites for embeddings models + +Ideal setup is to have the API client to read a custom test suite from the project's configuration diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index 5f28b3714..4c3f7c849 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -8,7 +8,9 @@ toc-expand: 4 -Test suites for sklearn-compatible hyper parameters tunning Ideal setup is to have the API client to read a custom test suite from the project's configuration +Test suites for sklearn-compatible hyper parameters tunning + +Ideal setup is to have the API client to read a custom test suite from the project's configuration diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index d3afd3734..2e84f5cd8 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -92,6 +92,8 @@ Test suite for data quality on tabular datasets -Test suite to extract metadata and descriptive statistics from a tabular dataset +Test suite to extract metadata and descriptive + +statistics from a tabular dataset **Inherited members** diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd index e1c6d29af..4266a0e54 100644 --- a/docs/validmind/test_suites/tabular_datasets.qmd +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -60,6 +60,8 @@ Test suite for tabular datasets. -Test suite to extract metadata and descriptive statistics from a tabular dataset +Test suite to extract metadata and descriptive + +statistics from a tabular dataset **Inherited members** diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index 829fbaeec..d2f74d68a 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -78,7 +78,9 @@ Test suite for time series model validation. -This test suite provides a preliminary understanding of the features and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. +This test suite provides a preliminary understanding of the features + +and relationship in multivariate dataset. It presents various multivariate visualizations that can help identify patterns, trends, and relationships between pairs of variables. The visualizations are designed to explore the relationships between multiple features simultaneously. They allow you to quickly identify any patterns or trends in the data, as well as any potential outliers or anomalies. The individual feature distribution can also be explored to provide insight into the range and frequency of values observed in the data. This multivariate analysis test suite aims to provide an overview of the data structure and guide further exploration and modeling. **Inherited members** @@ -96,7 +98,9 @@ This test suite provides a preliminary understanding of the features and relatio -This test suite provides a preliminary understanding of the target variable(s) used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). +This test suite provides a preliminary understanding of the target variable(s) + +used in the time series dataset. It visualizations that present the raw time series data and a histogram of the target variable(s). The raw time series data provides a visual inspection of the target variable's behavior over time. This helps to identify any patterns or trends in the data, as well as any potential outliers or anomalies. The histogram of the target variable displays the distribution of values, providing insight into the range and frequency of values observed in the data. diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 1bd3af7ad..1e609c72d 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -26,9 +26,11 @@ ValidMind Tests Module -Get or show details about the test This function can be used to see test details including the test name, description, required inputs and default params. It can also be used to get a dictionary of the above information for programmatic use. +Get or show details about the test -**Parameters** +This function can be used to see test details including the test name, description, required inputs and default params. It can also be used to get a dictionary of the above information for programmatic use. + +**Arguments** - **test_id** (str, optional): The test ID. Defaults to None. - **raw** (bool): If True, returns a dictionary with the test details. Defaults to False. @@ -73,7 +75,9 @@ List unique tasks from all test classes. -List all task types and their associated tags, with one row per task type and all tags for a task type in one row. +List all task types and their associated tags, with one row per task type and + +all tags for a task type in one row. **Returns** @@ -93,7 +97,7 @@ List all task types and their associated tags, with one row per task type and al List all tests in the tests directory. -**Parameters** +**Arguments** - **filter** (str): Find tests where the ID, tasks or tags match the filter string. Defaults to None. - **task** (str): Find tests that match the task. Can be used to narrow down matches from the filter string. Defaults to None. @@ -117,9 +121,11 @@ List all tests in the tests directory. -Load a test by test ID Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. The tag is optional and is used to distinguish between multiple results from the same test. +Load a test by test ID + +Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. The tag is optional and is used to distinguish between multiple results from the same test. -**Parameters** +**Arguments** - **test_id** (str): The test ID in the format `namespace.path_to_module.TestName[:tag]` - **test_func** (callable): The test function to load. If not provided, the test will be loaded from the test provider. Defaults to None. @@ -136,9 +142,11 @@ Load a test by test ID Test IDs are in the format `namespace.path_to_module.Test -Run a ValidMind or custom test This function is the main entry point for running tests. It can run simple unit metrics, ValidMind and custom tests, composite tests made up of multiple unit metrics and comparison tests made up of multiple tests. +Run a ValidMind or custom test -**Parameters** +This function is the main entry point for running tests. It can run simple unit metrics, ValidMind and custom tests, composite tests made up of multiple unit metrics and comparison tests made up of multiple tests. + +**Arguments** - **test_id** (TestID): Test ID to run. Not required if `name` and `unit_metrics` provided. - **params** (dict): Parameters to customize test behavior. See test details for available parameters. @@ -179,7 +187,7 @@ Run a ValidMind or custom test This function is the main entry point for running Decorator for specifying tags for a test. -**Parameters** +**Arguments** - \***tags**: The tags to apply to the test. @@ -197,7 +205,7 @@ Decorator for specifying tags for a test. Decorator for specifying the task types that a test is designed for. -**Parameters** +**Arguments** - \***tasks**: The task types that the test is designed for. @@ -213,7 +221,9 @@ Decorator for specifying the task types that a test is designed for. -Decorator for creating and registering custom tests This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. +Decorator for creating and registering custom tests + +This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the `validmind.tests.run_test` function. The function can take two different types of arguments: @@ -229,7 +239,7 @@ The function should return one of the following types: The function may also include a docstring. This docstring will be used and logged as the metric's description. -**Parameters** +**Arguments** - **func**: The function to decorate - **test_id**: The identifier for the metric. If not provided, the function name is used. @@ -254,7 +264,7 @@ The function may also include a docstring. This docstring will be used and logge Register an external test provider -**Parameters** +**Arguments** - **namespace** (str): The namespace of the test provider - **test_provider** (TestProvider): The test provider @@ -294,7 +304,9 @@ Exception raised when an error occurs while loading a test -Test providers in ValidMind are responsible for loading tests from different sources, such as local files, databases, or remote services. The LocalTestProvider specifically loads tests from the local file system. +Test providers in ValidMind are responsible for loading tests from different sources, + +such as local files, databases, or remote services. The LocalTestProvider specifically loads tests from the local file system. To use the LocalTestProvider, you need to provide the root_folder, which is the root directory for local tests. The test_id is a combination of the namespace (set when registering the test provider) and the path to the test class module, where slashes are replaced by dots and the .py extension is left out. @@ -317,7 +329,7 @@ test = test_provider.load_test("my_namespace.my_test_class") # full path to the test class module is /path/to/tests/folder/my_test_class.py ``` -**Parameters** +**Arguments** - **root_folder** (str): The root directory for local tests. @@ -351,11 +363,20 @@ List all tests in the given namespace -Load the test identified by the given test_id. Args: test_id (str): The identifier of the test. This corresponds to the relative path of the python file from the root folder, with slashes replaced by dots +Load the test identified by the given test_id. -Returns: The test class that matches the last part of the test_id. +**Arguments** + +- **test_id** (str): The identifier of the test. This corresponds to the relative path of the python file from the root folder, with slashes replaced by dots + +**Returns** + +- The test class that matches the last part of the test_id. + +**Raises** -Raises: LocalTestProviderLoadModuleError: If the test module cannot be imported LocalTestProviderLoadTestError: If the test class cannot be found in the module +- **LocalTestProviderLoadModuleError**: If the test module cannot be imported +- **LocalTestProviderLoadTestError**: If the test class cannot be found in the module @@ -407,7 +428,7 @@ List all tests in the given namespace Load the test function identified by the given test_id -**Parameters** +**Arguments** - **test_id** (str): The test ID (does not contain the namespace under which the test is registered) diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index b50fa95cc..72decf7bc 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Analyzes time series data using Autocorrelation Function (ACF) and Partial Autocorrelation Function (PACF) plots to reveal trends and correlations. +Analyzes time series data using Autocorrelation Function (ACF) and Partial Autocorrelation Function (PACF) plots to + +reveal trends and correlations. ### Purpose diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index b467233c9..2abfbd90d 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -34,7 +34,9 @@ Get a logger for the given module name -Automatically selects the optimal Moving Average (MA) order for each variable in a time series dataset based on minimal BIC and AIC values. +Automatically selects the optimal Moving Average (MA) order for each variable in a time series dataset based on + +minimal BIC and AIC values. ### Purpose diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index d06111ba2..86e7210b2 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Generates bivariate scatterplots to visually inspect relationships between pairs of numerical predictor variables in machine learning classification tasks. +Generates bivariate scatterplots to visually inspect relationships between pairs of numerical predictor variables + +in machine learning classification tasks. ### Purpose diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index effc630c9..7ab1df1db 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -96,7 +96,9 @@ Gets descriptive statistics for a single column in a Pandas DataFrame. -Returns a collection of histograms for a numerical or categorical column. We store different combinations of bin sizes to allow analyzing the data better +Returns a collection of histograms for a numerical or categorical column. + +We store different combinations of bin sizes to allow analyzing the data better Will be used in favor of \_get_histogram in the future @@ -114,7 +116,9 @@ Will be used in favor of \_get_histogram in the future -Returns a collection of histograms for a numerical column, each one with a different bin size +Returns a collection of histograms for a numerical column, each one + +with a different bin size diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index f14642fb4..fbb2900ec 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Evaluates and visualizes the distribution proportions among training, testing, and validation datasets of an ML model. +Evaluates and visualizes the distribution proportions among training, testing, and validation datasets of an ML + +model. ### Purpose diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 068dd295e..588929624 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -18,7 +18,9 @@ toc-expand: 4 -Round the values on each dataframe's column to a given number of decimal places. The returned value is converted to a dict in "records" with Pandas's to_dict() function. +Round the values on each dataframe's column to a given number of decimal places. + +The returned value is converted to a dict in "records" with Pandas's to_dict() function. We do this for display purposes before sending data to ValidMind. Rules: @@ -40,7 +42,9 @@ We do this for display purposes before sending data to ValidMind. Rules: -Performs a detailed descriptive statistical analysis of both numerical and categorical data within a model's dataset. +Performs a detailed descriptive statistical analysis of both numerical and categorical data within a model's + +dataset. ### Purpose diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 1f2940ac1..ab8df7130 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Visualizes the correlation between input features and the model's target output in a color-coded horizontal bar plot. +Visualizes the correlation between input features and the model's target output in a color-coded horizontal bar + +plot. ### Purpose diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index a988801cf..3f42539e8 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Assesses and visualizes correlation between target variable and lagged independent variables in a time-series dataset. +Assesses and visualizes correlation between target variable and lagged independent variables in a time-series + +dataset. ### Purpose diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index a78bdbb64..858bbd371 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Assesses the percentage and distribution of missing values in the dataset via a bar plot, with emphasis on identifying high-risk columns based on a user-defined threshold. +Assesses the percentage and distribution of missing values in the dataset via a bar plot, with emphasis on + +identifying high-risk columns based on a user-defined threshold. ### Purpose diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index e1785eb87..0d718b3aa 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -34,7 +34,9 @@ Get a logger for the given module name -Visualizes the distribution of protected classes in the dataset relative to the target variable and provides descriptive statistics. +Visualizes the distribution of protected classes in the dataset relative to the target variable + +and provides descriptive statistics. ### Purpose diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 7a2102641..7412aa831 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -32,7 +32,9 @@ toc-expand: 4 -Evaluates the stationarity of time series data by plotting its rolling mean and standard deviation over a specified window. +Evaluates the stationarity of time series data by plotting its rolling mean and standard deviation over a specified + +window. ### Purpose diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index 50d739827..ef7212f73 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Evaluates the skewness of numerical data in a dataset to check against a defined threshold, aiming to ensure data quality and optimize model performance. +Evaluates the skewness of numerical data in a dataset to check against a defined threshold, aiming to ensure data + +quality and optimize model performance. ### Purpose diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 270e9393f..d5a9801dd 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Assesses potential correlations between pairs of time series variables through visualization to enhance understanding of their relationships. +Assesses potential correlations between pairs of time series variables through visualization to enhance + +understanding of their relationships. ### Purpose diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 18e59d8f5..8805b8ccc 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Generates histograms to provide graphical insight into the distribution of time intervals in a model's datetime data. +Generates histograms to provide graphical insight into the distribution of time intervals in a model's datetime + +data. ### Purpose diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 6e352cd62..64cf7901f 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Generates histograms for each numerical feature in a dataset to provide visual insights into data distribution and detect potential issues. +Generates histograms for each numerical feature in a dataset to provide visual insights into data distribution and + +detect potential issues. ### Purpose diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 9e429ac4f..5e78ba751 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Generates bar plots visualizing the default rates of categorical features for a classification machine learning model. +Generates bar plots visualizing the default rates of categorical features for a classification machine learning + +model. ### Purpose diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 1762c211c..1cf14a342 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Generates a detailed analysis for the provided time series dataset, summarizing key statistics to identify trends, patterns, and data quality issues. +Generates a detailed analysis for the provided time series dataset, summarizing key statistics to identify trends, + +patterns, and data quality issues. ### Purpose diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index ef6c24c75..ab6651807 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Identifies numerical columns in a dataset that contain an excessive number of zero values, defined by a threshold percentage. +Identifies numerical columns in a dataset that contain an excessive number of zero values, defined by a threshold + +percentage. ### Purpose diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index c3d225a53..ebdf2f0cb 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -34,7 +34,9 @@ Get a logger for the given module name -Generates visualizations of Weight of Evidence (WoE) and Information Value (IV) for understanding predictive power of categorical variables in a data set. +Generates visualizations of Weight of Evidence (WoE) and Information Value (IV) for understanding predictive power + +of categorical variables in a data set. ### Purpose diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 0a5139a0a..9e39befbf 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Assesses the Weight of Evidence (WoE) and Information Value (IV) of each feature to evaluate its predictive power in a binary classification model. +Assesses the Weight of Evidence (WoE) and Information Value (IV) of each feature to evaluate its predictive power + +in a binary classification model. ### Purpose diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 2d26dcce0..f5b36925f 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -32,7 +32,9 @@ toc-expand: 4 -Conducts comprehensive textual analysis on a dataset using NLTK to evaluate various parameters and generate visualizations. +Conducts comprehensive textual analysis on a dataset using NLTK to evaluate various parameters and generate + +visualizations. ### Purpose diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 3c856aa28..b66845f4c 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -18,9 +18,11 @@ toc-expand: 4 -Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. +Comprehensive validation of true and predicted value pairs. -**Parameters** +Handles NaN/None values and length mismatches. + +**Arguments** - **y_true**: List or array of true values - **y_pred**: List or array of predicted values @@ -44,7 +46,9 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val -Assesses the quality of machine-generated text using BERTScore metrics and visualizes results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics. +Assesses the quality of machine-generated text using BERTScore metrics and visualizes results through histograms + +and bar charts, alongside compiling a comprehensive table of descriptive statistics. ### Purpose diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 3e091ceaf..2c5e47d1f 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -18,9 +18,11 @@ toc-expand: 4 -Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. +Comprehensive validation of true and predicted value pairs. -**Parameters** +Handles NaN/None values and length mismatches. + +**Arguments** - **y_true**: List or array of true values - **y_pred**: List or array of predicted values @@ -44,7 +46,9 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val -Evaluates the quality of machine-generated text using BLEU metrics and visualizes the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for BLEU scores. +Evaluates the quality of machine-generated text using BLEU metrics and visualizes the results through histograms + +and bar charts, alongside compiling a comprehensive table of descriptive statistics for BLEU scores. ### Purpose diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index b11b57965..b5b44d5d1 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Assesses the performance of clustering models by comparing the distribution of cluster sizes in model predictions with the actual data. +Assesses the performance of clustering models by comparing the distribution of cluster sizes in model predictions + +with the actual data. ### Purpose diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 7136e74c6..3a70b742e 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -18,9 +18,11 @@ toc-expand: 4 -Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. +Comprehensive validation of true and predicted value pairs. -**Parameters** +Handles NaN/None values and length mismatches. + +**Arguments** - **y_true**: List or array of true values - **y_pred**: List or array of predicted values @@ -44,7 +46,9 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val -Evaluates a Natural Language Generation model's ability to generate contextually relevant and factually correct text, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for contextual recall scores. +Evaluates a Natural Language Generation model's ability to generate contextually relevant and factually correct + +text, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for contextual recall scores. ### Purpose diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 01f2c6c8f..7a6c10b42 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -34,7 +34,9 @@ Get a logger for the given module name -Evaluates the discriminatory power of each individual feature within a binary classification model by calculating the Area Under the Curve (AUC) for each feature separately. +Evaluates the discriminatory power of each individual feature within a binary classification model by calculating + +the Area Under the Curve (AUC) for each feature separately. ### Purpose diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 671b25485..b371cd127 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -18,9 +18,11 @@ toc-expand: 4 -Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. +Comprehensive validation of true and predicted value pairs. -**Parameters** +Handles NaN/None values and length mismatches. + +**Arguments** - **y_true**: List or array of true values - **y_pred**: List or array of predicted values @@ -44,7 +46,9 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val -Assesses the quality of machine-generated translations by comparing them to human-produced references using the METEOR score, which evaluates precision, recall, and word order. +Assesses the quality of machine-generated translations by comparing them to human-produced references using the + +METEOR score, which evaluates precision, recall, and word order. ### Purpose diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index cd13567f2..174f9f62d 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -34,7 +34,9 @@ Attempts to extract all model info from a model object instance -Compare metadata of different models and generate a summary table with the results. **Purpose**: The purpose of this function is to compare the metadata of different models, including information about their architecture, framework, framework version, and programming language. +Compare metadata of different models and generate a summary table with the results. + +**Purpose**: The purpose of this function is to compare the metadata of different models, including information about their architecture, framework, framework version, and programming language. **Test Mechanism**: The function retrieves the metadata for each model using `get_model_info`, renames columns according to a predefined set of labels, and compiles this information into a summary table. diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 97ebe9293..b8afd84ae 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -18,9 +18,11 @@ toc-expand: 4 -Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. +Comprehensive validation of true and predicted value pairs. -**Parameters** +Handles NaN/None values and length mismatches. + +**Arguments** - **y_true**: List or array of true values - **y_pred**: List or array of predicted values @@ -44,7 +46,9 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val -Assesses the sentiment and potential biases in text generated by NLP models by computing and visualizing regard scores. +Assesses the sentiment and potential biases in text generated by NLP models by computing and visualizing regard + +scores. ### Purpose diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 76c3c35e0..86765a003 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Assesses the quality of machine-generated text using ROUGE metrics and visualizes the results to provide comprehensive performance insights. +Assesses the quality of machine-generated text using ROUGE metrics and visualizes the results to provide + +comprehensive performance insights. ### Purpose diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index 0e11abae0..e6e8cdd0f 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Assesses predictive accuracy and uncertainty in time series models, highlighting breaches beyond confidence intervals. +Assesses predictive accuracy and uncertainty in time series models, highlighting breaches beyond confidence + +intervals. ### Purpose diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 7dbd4fbdc..2374a6df4 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Evaluates the R-Squared values of regression models over specified time segments in time series data to assess segment-wise model performance. +Evaluates the R-Squared values of regression models over specified time segments in time series data to assess + +segment-wise model performance. ### Purpose diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index 5e9e4667a..5a716e2ec 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Evaluates the token disparity between reference and generated texts, visualizing the results through histograms and bar charts, alongside compiling a comprehensive table of descriptive statistics for token counts. +Evaluates the token disparity between reference and generated texts, visualizing the results through histograms and + +bar charts, alongside compiling a comprehensive table of descriptive statistics for token counts. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index fd6d762cf..1a6aba3c0 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Evaluates clustering model performance by measuring mutual information between true and predicted labels, adjusting for chance. +Evaluates clustering model performance by measuring mutual information between true and predicted labels, adjusting + +for chance. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 85b2fca9f..b088c1b4f 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Measures the similarity between two data clusters using the Adjusted Rand Index (ARI) metric in clustering machine learning models. +Measures the similarity between two data clusters using the Adjusted Rand Index (ARI) metric in clustering machine + +learning models. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 80b273f0e..d448534e1 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Evaluates the calibration of probability estimates by comparing predicted probabilities against observed frequencies. +Evaluates the calibration of probability estimates by comparing predicted probabilities against observed + +frequencies. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index 2c8c623ed..2c3e2564f 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Evaluates performance of binary or multiclass classification models using precision, recall, F1-Score, accuracy, and ROC AUC scores. +Evaluates performance of binary or multiclass classification models using precision, recall, F1-Score, accuracy, + +and ROC AUC scores. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 46539177b..2e3574733 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -69,7 +69,7 @@ The test implements multiple threshold optimization methods: - May not capture temporal changes in optimal threshold - Single threshold may not be optimal for all subgroups -**Parameters** +**Arguments** - **dataset**: VMDataset containing features and target - **model**: VMModel containing predictions @@ -98,7 +98,7 @@ The test implements multiple threshold optimization methods: Find the optimal classification threshold using various methods. -**Parameters** +**Arguments** - **y_true**: True binary labels - **y_prob**: Predicted probabilities diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index cebac4adb..74723f112 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Evaluates and visually represents the classification ML model's predictive performance using a Confusion Matrix heatmap. +Evaluates and visually represents the classification ML model's predictive performance using a Confusion Matrix + +heatmap. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 1d9af3af0..80902315f 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Compute feature importance scores for a given model and generate a summary table with the top important features. +Compute feature importance scores for a given model and generate a summary table + +with the top important features. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 90b388a81..6f31a0641 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Evaluates the similarity between predicted and actual cluster assignments in a model using the Fowlkes-Mallows score. +Evaluates the similarity between predicted and actual cluster assignments in a model using the Fowlkes-Mallows + +score. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 278d2ceff..af78602bd 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Assesses clustering homogeneity by comparing true and predicted labels, scoring from 0 (heterogeneous) to 1 (homogeneous). +Assesses clustering homogeneity by comparing true and predicted labels, scoring from 0 (heterogeneous) to 1 + +(homogeneous). ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 0b9ba9fe1..6419d36e9 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -32,7 +32,9 @@ toc-expand: 4 -Performs exhaustive grid search over specified parameter ranges to find optimal model configurations across different metrics and decision thresholds. +Performs exhaustive grid search over specified parameter ranges to find optimal model configurations + +across different metrics and decision thresholds. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 00d700bcf..eec811247 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Assesses if the model's F1 score on the validation set meets a predefined minimum threshold, ensuring balanced performance between precision and recall. +Assesses if the model's F1 score on the validation set meets a predefined minimum threshold, ensuring balanced + +performance between precision and recall. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 44c9b0e84..66b8fe8d2 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -30,7 +30,9 @@ toc-expand: 4 -Evaluates and compares the performance of multiple Machine Learning models using various metrics like accuracy, precision, recall, and F1 score. +Evaluates and compares the performance of multiple Machine Learning models using various metrics like accuracy, + +precision, recall, and F1 score. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 279132993..3e64b8949 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -34,7 +34,9 @@ Get a logger for the given module name -Assesses potential overfitting in a model's predictions, identifying regions where performance between training and testing sets deviates significantly. +Assesses potential overfitting in a model's predictions, identifying regions where performance between training and + +testing sets deviates significantly. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 7257713e2..ab0716759 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -34,7 +34,9 @@ Get a logger for the given module name -Assesses the significance of each feature in a model by evaluating the impact on model performance when feature values are randomly rearranged. +Assesses the significance of each feature in a model by evaluating the impact on model performance when feature + +values are randomly rearranged. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 18535c240..8eeacd5cb 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -34,7 +34,9 @@ Get a logger for the given module name -Taken from: https://towardsdatascience.com/checking-model-stability-and-population-shift-with-psi-and-csi-6d12af008783 +Taken from: + +https://towardsdatascience.com/checking-model-stability-and-population-shift-with-psi-and-csi-6d12af008783 @@ -50,7 +52,9 @@ Taken from: https://towardsdatascience.com/checking-model-stability-and-populati -Assesses the Population Stability Index (PSI) to quantify the stability of an ML model's predictions across different datasets. +Assesses the Population Stability Index (PSI) to quantify the stability of an ML model's predictions across + +different datasets. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 654c07a90..44a47c410 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Evaluates binary classification model performance by generating and plotting the Receiver Operating Characteristic (ROC) curve and calculating the Area Under Curve (AUC) score. +Evaluates binary classification model performance by generating and plotting the Receiver Operating Characteristic + +(ROC) curve and calculating the Area Under Curve (AUC) score. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 13858d190..fb982b7f7 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -34,7 +34,9 @@ Get a logger for the given module name -Assesses multiple regression error metrics to compare model performance across different datasets, emphasizing systematic overestimation or underestimation and large percentage errors. +Assesses multiple regression error metrics to compare model performance across different datasets, emphasizing + +systematic overestimation or underestimation and large percentage errors. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 5206ed39b..5f406e146 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -34,7 +34,9 @@ Adjusted R2 Score -Assesses the overall goodness-of-fit of a regression model by evaluating R-squared (R2) and Adjusted R-squared (Adj R2) scores to determine the model's explanatory power over the dependent variable. +Assesses the overall goodness-of-fit of a regression model by evaluating R-squared (R2) and Adjusted R-squared (Adj + +R2) scores to determine the model's explanatory power over the dependent variable. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index cfa14f13c..68e33fd7a 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -34,7 +34,9 @@ Adjusted R2 Score -Compares R-Squared and Adjusted R-Squared values for different regression models across multiple datasets to assess model performance and relevance of features. +Compares R-Squared and Adjusted R-Squared values for different regression models across multiple datasets to assess + +model performance and relevance of features. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 03270fc16..0d5da1b77 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -80,7 +80,9 @@ This test introduces Gaussian noise to the numeric input features of the dataset -When the pytorch model is missing a predict function or its predict method does not have the expected arguments. +When the pytorch model is missing a predict function or its predict + +method does not have the expected arguments. **Inherited members** diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index dac00ce4b..f967d4df9 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -36,7 +36,7 @@ Get a logger for the given module name Plots two types of SHAP global importance (SHAP). -**Parameters** +**Arguments** - **type\_**: The type of SHAP plot to generate. Must be "mean" or "summary". - **shap_values**: The SHAP values to plot. @@ -60,9 +60,11 @@ Plots two types of SHAP global importance (SHAP). -Selects SHAP values for binary or multiclass classification. For regression models, returns the SHAP values directly as there are no classes. +Selects SHAP values for binary or multiclass classification. -**Parameters** +For regression models, returns the SHAP values directly as there are no classes. + +**Arguments** - **shap_values**: The SHAP values returned by the SHAP explainer. For multiclass classification, this will be a list where each element corresponds to a class. For regression, this will be a single array of SHAP values. - **class_of_interest**: The class index for which to retrieve SHAP values. If None (default), the function will assume binary classification and use class 1 by default. diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 9c0cac08d..1e962acad 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Calculates and visualizes Silhouette Score, assessing the degree of data point suitability to its cluster in ML models. +Calculates and visualizes Silhouette Score, assessing the degree of data point suitability to its cluster in ML + +models. ### Purpose diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index e9f9b70f1..1a8cc0c15 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Identifies and visualizes weak spots in a machine learning model's performance across various sections of the feature space. +Identifies and visualizes weak spots in a machine learning model's performance across various sections of the + +feature space. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index 12cbf8ebf..df2fa168e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Assesses the predictive probability distribution for binary classification to evaluate model performance and potential overfitting or bias. +Assesses the predictive probability distribution for binary classification to evaluate model performance and + +potential overfitting or bias. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 81bfae0eb..d452fe057 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -Assesses the significance and uncertainty of predictor variables in a regression model through visualization of coefficients and their 95% confidence intervals. +Assesses the significance and uncertainty of predictor variables in a regression model through visualization of + +coefficients and their 95% confidence intervals. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 8ec5c8a55..791a416d3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -34,7 +34,9 @@ Get a logger for the given module name -Generates plots to visually compare the forecasted outcomes of a regression model against actual observed values over a specified date range. +Generates plots to visually compare the forecasted outcomes of a regression model against actual observed values over + +a specified date range. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 763f57bb2..5b2b1549e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -46,7 +46,9 @@ Get a logger for the given module name -Assesses the sensitivity of a regression model to changes in independent variables by applying shocks and visualizing the impact. +Assesses the sensitivity of a regression model to changes in independent variables by applying shocks and + +visualizing the impact. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 35b24ec54..3c5afbf40 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -34,7 +34,9 @@ Get a logger for the given module name -Assesses the significance of each feature in a model by evaluating the impact on model performance when feature values are randomly rearranged. +Assesses the significance of each feature in a model by evaluating the impact on model performance when feature + +values are randomly rearranged. ### Purpose diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index 3a631ff67..599332db7 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -20,7 +20,9 @@ toc-expand: 4 -The Scorecard Histogram test evaluates the distribution of credit scores between default and non-default instances, providing critical insights into the performance and generalizability of credit-risk models. +The Scorecard Histogram test evaluates the distribution of credit scores between default and non-default instances, + +providing critical insights into the performance and generalizability of credit-risk models. ### Purpose diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index e42a28985..6b1c02837 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -32,7 +32,9 @@ Call LLM with the given prompts and return the response -Get just the explanation from the response string TODO: use json response mode instead of this +Get just the explanation from the response string + +TODO: use json response mode instead of this ``` e.g. "Score: 8 @@ -52,7 +54,9 @@ Explanation: " -> "" -Get just the score from the response string TODO: use json response mode instead of this +Get just the score from the response string + +TODO: use json response mode instead of this ``` e.g. "Score: 8 @@ -74,7 +78,9 @@ Explanation: " -> 8 -Assesses potential bias in a Large Language Model by analyzing the distribution and order of exemplars in the prompt. +Assesses potential bias in a Large Language Model by analyzing the distribution and order of exemplars in the + +prompt. ### Purpose diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 1b26678f9..0002d2b67 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -32,7 +32,9 @@ Call LLM with the given prompts and return the response -Get just the explanation from the response string TODO: use json response mode instead of this +Get just the explanation from the response string + +TODO: use json response mode instead of this ``` e.g. "Score: 8 @@ -52,7 +54,9 @@ Explanation: " -> "" -Get just the score from the response string TODO: use json response mode instead of this +Get just the score from the response string + +TODO: use json response mode instead of this ``` e.g. "Score: 8 diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 9f3e05c94..09a003403 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -32,7 +32,9 @@ Call LLM with the given prompts and return the response -Get just the explanation from the response string TODO: use json response mode instead of this +Get just the explanation from the response string + +TODO: use json response mode instead of this ``` e.g. "Score: 8 @@ -52,7 +54,9 @@ Explanation: " -> "" -Get just the score from the response string TODO: use json response mode instead of this +Get just the score from the response string + +TODO: use json response mode instead of this ``` e.g. "Score: 8 diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 936e87369..345a16686 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -32,7 +32,9 @@ Call LLM with the given prompts and return the response -Get just the explanation from the response string TODO: use json response mode instead of this +Get just the explanation from the response string + +TODO: use json response mode instead of this ``` e.g. "Score: 8 @@ -52,7 +54,9 @@ Explanation: " -> "" -Get just the score from the response string TODO: use json response mode instead of this +Get just the score from the response string + +TODO: use json response mode instead of this ``` e.g. "Score: 8 diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 831ee8fb8..355fe3ec1 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -32,7 +32,9 @@ Call LLM with the given prompts and return the response -Get just the explanation from the response string TODO: use json response mode instead of this +Get just the explanation from the response string + +TODO: use json response mode instead of this ``` e.g. "Score: 8 @@ -52,7 +54,9 @@ Explanation: " -> "" -Get just the score from the response string TODO: use json response mode instead of this +Get just the score from the response string + +TODO: use json response mode instead of this ``` e.g. "Score: 8 diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index f98a65d3c..c9d78f466 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -34,7 +34,9 @@ Call LLM with the given prompts and return the response -Assesses the robustness of prompts provided to a Large Language Model under varying conditions and contexts. This test specifically measures the model's ability to generate correct classifications with the given prompt even when the inputs are edge cases or otherwise difficult to classify. +Assesses the robustness of prompts provided to a Large Language Model under varying conditions and contexts. This test + +specifically measures the model's ability to generate correct classifications with the given prompt even when the inputs are edge cases or otherwise difficult to classify. ### Purpose diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 4c77e22a0..44b5c9600 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -32,7 +32,9 @@ Call LLM with the given prompts and return the response -Get just the explanation from the response string TODO: use json response mode instead of this +Get just the explanation from the response string + +TODO: use json response mode instead of this ``` e.g. "Score: 8 @@ -52,7 +54,9 @@ Explanation: " -> "" -Get just the score from the response string TODO: use json response mode instead of this +Get just the score from the response string + +TODO: use json response mode instead of this ``` e.g. "Score: 8 @@ -74,7 +78,9 @@ Explanation: " -> 8 -Evaluates and scores the specificity of prompts provided to a Large Language Model (LLM), based on clarity, detail, and relevance. +Evaluates and scores the specificity of prompts provided to a Large Language Model (LLM), based on clarity, detail, + +and relevance. ### Purpose diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index e2af32470..686ed45f2 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -36,7 +36,9 @@ Call LLM with the given prompts and return the response -Get just the explanation from the response string TODO: use json response mode instead of this +Get just the explanation from the response string + +TODO: use json response mode instead of this ``` e.g. "Score: 8 @@ -58,7 +60,9 @@ Explanation: " -> "" -Get just the score from the response string TODO: use json response mode instead of this +Get just the score from the response string + +TODO: use json response mode instead of this ``` e.g. "Score: 8 diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 46a352421..a6ad663b2 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -66,7 +66,9 @@ Creates a `requests`-compatible files object to be sent to the API -Returns the ipywidget compatible representation of the figure. Ideally we would render images as-is, but Plotly FigureWidgets don't work well on Google Colab when they are combined with ipywidgets. +Returns the ipywidget compatible representation of the figure. Ideally + +we would render images as-is, but Plotly FigureWidgets don't work well on Google Colab when they are combined with ipywidgets. @@ -112,7 +114,9 @@ Creates a ModelAttributes instance from a dictionary -Base class for test suites. Test suites are used to define a grouping of tests that can be run as a suite against datasets and models. Test Suites can be defined by inheriting from this base class and defining the list of tests as a class variable. +Base class for test suites. Test suites are used to define a grouping of tests that + +can be run as a suite against datasets and models. Test Suites can be defined by inheriting from this base class and defining the list of tests as a class variable. Tests can be a flat list of strings or may be nested into sections by using a dict @@ -128,7 +132,9 @@ Tests can be a flat list of strings or may be nested into sections by using a di -Returns the default configuration for the test suite Each test in a test suite can accept parameters and those parameters can have default values. Both the parameters and their defaults are set in the test class and a config object can be passed to the test suite's run method to override the defaults. This function returns a dictionary containing the parameters and their default values for every test to allow users to view and set values +Returns the default configuration for the test suite + +Each test in a test suite can accept parameters and those parameters can have default values. Both the parameters and their defaults are set in the test class and a config object can be passed to the test suite's run method to override the defaults. This function returns a dictionary containing the parameters and their default values for every test to allow users to view and set values **Returns** @@ -190,7 +196,9 @@ Runs a test suite -Logs the results of the test suite to ValidMind This method will be called after the test suite has been run and all results have been collected. This method will log the results to ValidMind. +Logs the results of the test suite to ValidMind + +This method will be called after the test suite has been run and all results have been collected. This method will log the results to ValidMind. ### [run[()]{.muted}](#run) @@ -206,7 +214,7 @@ Logs the results of the test suite to ValidMind This method will be called after Runs the test suite, renders the summary and sends the results to ValidMind -**Parameters** +**Arguments** - **send** (bool): Whether to send the results to ValidMind. Defaults to True. - **fail_fast** (bool): Whether to stop running tests after the first failure. Defaults to False. @@ -235,11 +243,13 @@ Runs the test suite, renders the summary and sends the results to ValidMind -Base class for VM datasets Child classes should be used to support new dataset types (tensor, polars etc) by converting the user's dataset into a numpy array collecting metadata like column names and then call this (parent) class `__init__` method. +Base class for VM datasets + +Child classes should be used to support new dataset types (tensor, polars etc) by converting the user's dataset into a numpy array collecting metadata like column names and then call this (parent) class `__init__` method. This way we can support multiple dataset types but under the hood we only need to work with numpy arrays and pandas dataframes in this class. -**Parameters** +**Arguments** - **raw_dataset** (np.ndarray): The raw dataset as a NumPy array. - **input_id** (str): Identifier for the dataset. @@ -270,7 +280,7 @@ This way we can support multiple dataset types but under the hood we only need t Adds an extra column to the dataset without modifying the dataset `features` and `target` columns. -**Parameters** +**Arguments** - **column_name** (str): The name of the extra column. - **column_values** (np.ndarray): The values of the extra column. @@ -289,7 +299,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and Assign predictions and probabilities to the dataset. -**Parameters** +**Arguments** - **model** (VMModel): The model used to generate the predictions. - **prediction_column** (str, optional): The name of the column containing the predictions. Defaults to None. @@ -355,7 +365,7 @@ Returns the target class labels or unique values of the target column. Support options provided when passing an input to run_test or run_test_suite -**Parameters** +**Arguments** - \*\***kwargs**: Options: - columns: Filter columns in the dataset @@ -404,9 +414,11 @@ Returns a dataframe containing the target column -Returns the predictions for a given model. Attempts to stack complex prediction types (e.g., embeddings) into a single, multi-dimensional array. +Returns the predictions for a given model. + +Attempts to stack complex prediction types (e.g., embeddings) into a single, multi-dimensional array. -**Parameters** +**Arguments** - **model** (VMModel): The model whose predictions are sought. @@ -442,7 +454,7 @@ Returns a dataframe containing the predictions for a given model Returns the probabilities for a given model. -**Parameters** +**Arguments** - **model** (str): The ID of the model whose predictions are sought. @@ -494,11 +506,13 @@ Base class for ValidMind Input types -Allows for setting options on the input object that are passed by the user when using the input to run a test or set of tests +Allows for setting options on the input object that are passed by the user + +when using the input to run a test or set of tests To allow options, just override this method in the subclass (see VMDataset) and ensure that it returns a new instance of the input with the specified options set. -**Parameters** +**Arguments** - \*\***kwargs**: Arbitrary keyword arguments that will be passed to the input object @@ -522,7 +536,7 @@ To allow options, just override this method in the subclass (see VMDataset) and An base class that wraps a trained model instance and its associated data. -**Parameters** +**Arguments** - **model** (object, optional): The trained model instance. Defaults to None. - **input_id** (str, optional): The input ID for the model. Defaults to None. diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 1dc462959..ac72d76db 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -210,7 +210,7 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: def process_module(module: Dict[str, Any], path: List[str], env: Environment, full_data: Dict[str, Any]): """Process a module and its submodules.""" # Parse docstrings first - parse_docstrings_recursively(module) + parse_docstrings(module) module_dir = os.path.join('docs', *path[:-1]) ensure_dir(module_dir) @@ -341,43 +341,7 @@ def format_google_docstring(docstring: str) -> str: return '\n'.join(lines) -def format_rst_docstring(docstring: str) -> str: - """Format an RST-style docstring from JSON format back to proper structure.""" - - # Split on ":param" and ":return:" to separate sections - parts = [] - current = [] - - for part in docstring.split(): - if part.startswith(':param') or part.startswith(':return:'): - if current: - parts.append(' '.join(current)) - current = [part] - else: - current.append(part) - if current: - parts.append(' '.join(current)) - - # Join with newlines - result = '\n'.join(parts) - return result - -def try_parse_docstring(docstring: str) -> Any: - """Try to parse a docstring in multiple styles, defaulting to Google.""" - # Convert escaped newlines to actual newlines - docstring = docstring.replace('\\n', '\n') - - # Try Google style first - try: - return parse(docstring, style=Style.GOOGLE) - except Exception: - # Fallback to RST style - try: - return parse(docstring, style=Style.REST) - except Exception: - return None - -def parse_docstrings_recursively(data: Dict[str, Any]): +def parse_docstrings(data: Dict[str, Any]): """Recursively parse all docstrings in the data structure.""" if isinstance(data, dict): if 'docstring' in data: @@ -388,16 +352,33 @@ def parse_docstrings_recursively(data: Dict[str, Any]): else: original = str(data['docstring']) - # Parse docstring once and store both original and parsed versions - parsed = try_parse_docstring(original) - data['docstring'] = { - 'value': original, - 'parsed': parsed - } if parsed else {'value': original} + try: + # Debug original docstring + if 'Args:' in original: + print(f"\nProcessing docstring for: {data.get('name', 'unknown')}") + print(f"Original:\n{original}") + + parsed = parse(original, style=Style.GOOGLE) + + # Debug parsed result + if 'Args:' in original: + print("\nParsed result:") + print(f"- short_description: {parsed.short_description}") + print(f"- long_description: {parsed.long_description}") + print(f"- params: {[(p.arg_name, p.type_name, p.description) for p in parsed.params]}") + + data['docstring'] = { + 'value': original, + 'parsed': parsed + } + except Exception as e: + print(f"\nParsing failed for {data.get('name', 'unknown')}:") + print(f"Error: {str(e)}") + print(f"Original:\n{original}") if 'members' in data: for member in data['members'].values(): - parse_docstrings_recursively(member) + parse_docstrings(member) def get_inherited_members(base: Dict[str, Any], full_data: Dict[str, Any]) -> List[Dict[str, Any]]: """Get all inherited members from a base class.""" From 9883d1db3db7e92a7714e7fe6be540e940f3b171 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 5 Feb 2025 13:42:55 -0800 Subject: [PATCH 065/207] Fixed short and long description regression --- docs/templates/macros/docstring.jinja2 | 1 + docs/validmind.qmd | 12 +--- .../tests/model_validation/BertScore.qmd | 4 +- .../tests/model_validation/BleuScore.qmd | 4 +- .../model_validation/ContextualRecall.qmd | 4 +- .../tests/model_validation/MeteorScore.qmd | 4 +- .../tests/model_validation/RegardScore.qmd | 4 +- docs/validmind/vm_models.qmd | 4 +- scripts/generate_quarto_docs.py | 68 +++---------------- 9 files changed, 21 insertions(+), 84 deletions(-) diff --git a/docs/templates/macros/docstring.jinja2 b/docs/templates/macros/docstring.jinja2 index f2853f0e6..0bd0521ca 100644 --- a/docs/templates/macros/docstring.jinja2 +++ b/docs/templates/macros/docstring.jinja2 @@ -9,6 +9,7 @@ {%- if docstring.parsed.short_description -%} {%- set _ = sections.append(docstring.parsed.short_description) -%} {%- if docstring.parsed.long_description -%} + {%- set _ = sections.append('\n') -%} {%- endif -%} {%- endif -%} {% if docstring.parsed.long_description %} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 88dfad5a5..26b89ef6f 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -84,9 +84,7 @@ This function provides an interface to retrieve the TestSuite instance for the c -Initializes the API client instances and calls the /ping endpoint to ensure - -the provided credentials are valid and we can connect to the ValidMind API. +Initializes the API client instances and calls the /ping endpoint to ensure the provided credentials are valid and we can connect to the ValidMind API. If the API key and secret are not provided, the client will attempt to retrieve them from the environment variables `VM_API_KEY` and `VM_API_SECRET`. @@ -116,9 +114,7 @@ If the API key and secret are not provided, the client will attempt to retrieve -Initializes a VM Dataset, which can then be passed to other functions - -that can perform additional analysis and tests on the data. This function also ensures we are reading a valid dataset type. +Initializes a VM Dataset, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are reading a valid dataset type. The following dataset types are supported: @@ -159,9 +155,7 @@ The following dataset types are supported: -Initializes a VM Model, which can then be passed to other functions - -that can perform additional analysis and tests on the data. This function also ensures we are creating a model supported libraries. +Initializes a VM Model, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are creating a model supported libraries. **Arguments** diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index b66845f4c..40c10066e 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -18,9 +18,7 @@ toc-expand: 4 -Comprehensive validation of true and predicted value pairs. - -Handles NaN/None values and length mismatches. +Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. **Arguments** diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 2c5e47d1f..1c2a55e7a 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -18,9 +18,7 @@ toc-expand: 4 -Comprehensive validation of true and predicted value pairs. - -Handles NaN/None values and length mismatches. +Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. **Arguments** diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 3a70b742e..5428ae277 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -18,9 +18,7 @@ toc-expand: 4 -Comprehensive validation of true and predicted value pairs. - -Handles NaN/None values and length mismatches. +Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. **Arguments** diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index b371cd127..5064e535b 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -18,9 +18,7 @@ toc-expand: 4 -Comprehensive validation of true and predicted value pairs. - -Handles NaN/None values and length mismatches. +Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. **Arguments** diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index b8afd84ae..25797e40d 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -18,9 +18,7 @@ toc-expand: 4 -Comprehensive validation of true and predicted value pairs. - -Handles NaN/None values and length mismatches. +Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. **Arguments** diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index a6ad663b2..d68185918 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -506,9 +506,7 @@ Base class for ValidMind Input types -Allows for setting options on the input object that are passed by the user - -when using the input to run a test or set of tests +Allows for setting options on the input object that are passed by the user when using the input to run a test or set of tests To allow options, just override this method in the subclass (see VMDataset) and ensure that it returns a new instance of the input with the specified options set. diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index ac72d76db..6cef996df 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -286,61 +286,6 @@ def lint_markdown_files(output_dir: str): with open(path, 'w') as f: f.write(formatted) -def format_google_docstring(docstring: str) -> str: - """Format a Google-style docstring from JSON format back to proper structure.""" - lines = [] - sections = docstring.split('\n\n') - - for section in sections: - if section.startswith('Args:'): - lines.append('Args:') - args_text = section.replace('Args:', '').strip() - - current_param = None - param_desc = [] - - parts = args_text.split() - i = 0 - while i < len(parts): - part = parts[i] - - if ':' in part and not part.startswith('(default'): - # If we have a previous parameter, add it - if current_param: - lines.append(f" {current_param}: {' '.join(param_desc)}") - current_param = part.split(':', 1)[0] - param_desc = [part.split(':', 1)[1]] - - elif part.startswith('(default'): - # Look ahead for the default value - try: - if ':' in part: - default_value = part.split(':', 1)[1].rstrip(')') - param_desc.append(f"(default: {default_value})") - else: - param_desc.append(part) - except IndexError: - param_desc.append(part) - - else: - param_desc.append(part) - - i += 1 - - # Add the last parameter - if current_param: - lines.append(f" {current_param}: {' '.join(param_desc)}") - - elif section.startswith('Returns:'): - lines.append('\nReturns:') - returns_text = section.replace('Returns:', '').strip() - lines.append(f" {returns_text}") - - else: - lines.append(section.strip()) - - return '\n'.join(lines) - def parse_docstrings(data: Dict[str, Any]): """Recursively parse all docstrings in the data structure.""" if isinstance(data, dict): @@ -356,13 +301,22 @@ def parse_docstrings(data: Dict[str, Any]): # Debug original docstring if 'Args:' in original: print(f"\nProcessing docstring for: {data.get('name', 'unknown')}") - print(f"Original:\n{original}") + print(f"ORIGINAL:\n{original}") + + # Split on double newlines and join first section's lines + sections = original.split('\n\n') + sections[0] = ' '.join(sections[0].split('\n')) + original = '\n\n'.join(sections) + + print("\nSections after double newline split:") + for i, section in enumerate(sections): + print(f"\nSection {i}:\n{section}") parsed = parse(original, style=Style.GOOGLE) # Debug parsed result if 'Args:' in original: - print("\nParsed result:") + print("\nPARSED RESULT:") print(f"- short_description: {parsed.short_description}") print(f"- long_description: {parsed.long_description}") print(f"- params: {[(p.arg_name, p.type_name, p.description) for p in parsed.params]}") From 352ec3772377eb055ebe96bb240f5fd58c23b2f5 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 7 Feb 2025 16:01:18 -0800 Subject: [PATCH 066/207] Minor content update --- docs/validmind.qmd | 2 +- docs/validmind/version.qmd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 26b89ef6f..e909ce03e 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -45,7 +45,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -2.8.4 +2.8.9 ::: diff --git a/docs/validmind/version.qmd b/docs/validmind/version.qmd index 3cfe68a7e..ade61f919 100644 --- a/docs/validmind/version.qmd +++ b/docs/validmind/version.qmd @@ -7,6 +7,6 @@ sidebar: validmind-reference ::: {.signature} -2.8.4 +2.8.9 ::: From 59c0121ce1d14e9eba504e39d854823ecf795fd2 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 9 Feb 2025 09:43:55 -0800 Subject: [PATCH 067/207] Fix type class annotations --- docs/templates/macros/signatures.jinja2 | 4 ++-- docs/validmind.qmd | 16 ++++++++-------- docs/validmind/test_suites.qmd | 12 ++++++------ docs/validmind/tests.qmd | 12 ++++++------ .../tests/data_validation/ACFandPACFPlot.qmd | 2 +- docs/validmind/tests/data_validation/ADF.qmd | 2 +- docs/validmind/tests/data_validation/AutoAR.qmd | 2 +- docs/validmind/tests/data_validation/AutoMA.qmd | 2 +- .../tests/data_validation/AutoStationarity.qmd | 2 +- .../tests/data_validation/ClassImbalance.qmd | 2 +- .../tests/data_validation/DatasetDescription.qmd | 2 +- .../tests/data_validation/DatasetSplit.qmd | 2 +- .../data_validation/DescriptiveStatistics.qmd | 4 ++-- .../tests/data_validation/DickeyFullerGLS.qmd | 2 +- .../tests/data_validation/EngleGrangerCoint.qmd | 2 +- .../tests/data_validation/HighCardinality.qmd | 2 +- .../data_validation/HighPearsonCorrelation.qmd | 2 +- .../tests/data_validation/IQROutliersBarPlot.qmd | 2 +- .../tests/data_validation/IQROutliersTable.qmd | 2 +- .../data_validation/IsolationForestOutliers.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 2 +- .../data_validation/LaggedCorrelationHeatmap.qmd | 2 +- .../tests/data_validation/MissingValues.qmd | 2 +- .../data_validation/MissingValuesBarPlot.qmd | 2 +- .../tests/data_validation/MutualInformation.qmd | 2 +- .../tests/data_validation/PhillipsPerronArch.qmd | 2 +- .../tests/data_validation/RollingStatsPlot.qmd | 2 +- .../data_validation/ScoreBandDefaultRates.qmd | 2 +- .../tests/data_validation/SeasonalDecompose.qmd | 2 +- .../tests/data_validation/SpreadPlot.qmd | 2 +- .../TabularCategoricalBarPlots.qmd | 2 +- .../TabularDateTimeHistograms.qmd | 2 +- .../TabularNumericalHistograms.qmd | 2 +- .../tests/data_validation/TargetRateBarPlots.qmd | 2 +- .../data_validation/TimeSeriesFrequency.qmd | 2 +- .../tests/data_validation/TimeSeriesLinePlot.qmd | 2 +- .../data_validation/TimeSeriesMissingValues.qmd | 2 +- .../tests/data_validation/TimeSeriesOutliers.qmd | 2 +- .../tests/data_validation/TooManyZeroValues.qmd | 2 +- .../tests/data_validation/UniqueRows.qmd | 2 +- .../tests/data_validation/WOEBinPlots.qmd | 2 +- .../tests/data_validation/WOEBinTable.qmd | 2 +- .../tests/data_validation/ZivotAndrewsArch.qmd | 2 +- .../tests/data_validation/nlp/CommonWords.qmd | 2 +- .../tests/data_validation/nlp/Hashtags.qmd | 2 +- .../tests/data_validation/nlp/Mentions.qmd | 2 +- .../tests/data_validation/nlp/StopWords.qmd | 2 +- .../data_validation/nlp/TextDescription.qmd | 2 +- .../model_validation/ClusterSizeDistribution.qmd | 2 +- .../tests/model_validation/FeaturesAUC.qmd | 2 +- .../model_validation/RegressionResidualsPlot.qmd | 2 +- .../sklearn/AdjustedMutualInformation.qmd | 2 +- .../sklearn/AdjustedRandIndex.qmd | 2 +- .../sklearn/CalibrationCurve.qmd | 2 +- .../sklearn/ClassifierPerformance.qmd | 2 +- .../sklearn/ClassifierThresholdOptimization.qmd | 2 +- .../sklearn/ClusterCosineSimilarity.qmd | 2 +- .../sklearn/ClusterPerformanceMetrics.qmd | 2 +- .../sklearn/CompletenessScore.qmd | 2 +- .../model_validation/sklearn/ConfusionMatrix.qmd | 2 +- .../sklearn/FeatureImportance.qmd | 2 +- .../sklearn/FowlkesMallowsScore.qmd | 2 +- .../sklearn/HomogeneityScore.qmd | 2 +- .../sklearn/HyperParametersTuning.qmd | 2 +- .../sklearn/KMeansClustersOptimization.qmd | 2 +- .../model_validation/sklearn/MinimumAccuracy.qmd | 2 +- .../model_validation/sklearn/MinimumF1Score.qmd | 2 +- .../sklearn/MinimumROCAUCScore.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 2 +- .../sklearn/OverfitDiagnosis.qmd | 2 +- .../sklearn/PermutationFeatureImportance.qmd | 2 +- .../sklearn/PopulationStabilityIndex.qmd | 2 +- .../sklearn/PrecisionRecallCurve.qmd | 2 +- .../tests/model_validation/sklearn/ROCCurve.qmd | 2 +- .../sklearn/RegressionPerformance.qmd | 2 +- .../sklearn/RegressionR2Square.qmd | 2 +- .../sklearn/RegressionR2SquareComparison.qmd | 2 +- .../sklearn/RobustnessDiagnosis.qmd | 2 +- .../sklearn/SHAPGlobalImportance.qmd | 2 +- .../sklearn/ScoreProbabilityAlignment.qmd | 2 +- .../model_validation/sklearn/SilhouettePlot.qmd | 2 +- .../sklearn/TrainingTestDegradation.qmd | 2 +- .../tests/model_validation/sklearn/VMeasure.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 2 +- .../model_validation/statsmodels/AutoARIMA.qmd | 2 +- .../statsmodels/KolmogorovSmirnov.qmd | 2 +- .../model_validation/statsmodels/Lilliefors.qmd | 2 +- .../RegressionFeatureSignificance.qmd | 2 +- .../statsmodels/RegressionModelForecastPlot.qmd | 2 +- .../RegressionModelForecastPlotLevels.qmd | 2 +- .../RegressionModelSensitivityPlot.qmd | 2 +- .../statsmodels/RegressionModelSummary.qmd | 4 ++-- .../RegressionPermutationFeatureImportance.qmd | 2 +- .../model_validation/statsmodels/statsutils.qmd | 2 +- docs/validmind/tests/prompt_validation/Bias.qmd | 6 +++--- .../tests/prompt_validation/Clarity.qmd | 6 +++--- .../tests/prompt_validation/Conciseness.qmd | 6 +++--- .../tests/prompt_validation/Delimitation.qmd | 6 +++--- .../prompt_validation/NegativeInstruction.qmd | 6 +++--- .../tests/prompt_validation/Robustness.qmd | 2 +- .../tests/prompt_validation/Specificity.qmd | 6 +++--- .../tests/prompt_validation/ai_powered_test.qmd | 6 +++--- docs/validmind/unit_metrics.qmd | 4 ++-- docs/validmind/vm_models.qmd | 10 +++++----- 104 files changed, 143 insertions(+), 143 deletions(-) diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index 8621105fc..35c55ebe9 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -14,7 +14,7 @@ {%- if member.parameters | length == 1 -%} {{ member.parameters[0].name }} {%- if member.parameters[0].annotation -%} - :{{ format_type(member.parameters[0].annotation, add_links=true) }} + :{{ format_type(member.parameters[0].annotation, add_links=true) }} {%- endif -%} {%- if member.parameters[0].default is not none -%} = {{ member.parameters[0].default }} @@ -24,7 +24,7 @@ {%- for param in member.parameters -%} {{ param.name }} {%- if param.annotation -%} - :{{ format_type(param.annotation, add_links=true) }} + :{{ format_type(param.annotation, add_links=true) }} {%- endif -%} {%- if param.default is not none -%} = {{ param.default }} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index e909ce03e..d9a7145b6 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -55,7 +55,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -def get_test_suite(test_suite_id:str = None,section:str = None,args = (),kwargs = {})validmind.vm_models.TestSuite +def get_test_suite(test_suite_id:str = None,section:str = None,args = (),kwargs = {})validmind.vm_models.TestSuite ::: @@ -78,7 +78,7 @@ This function provides an interface to retrieve the TestSuite instance for the c ::: {.signature} -def init(project:Optional\[str\] = None,api_key:Optional\[str\] = None,api_secret:Optional\[str\] = None,api_host:Optional\[str\] = None,model:Optional\[str\] = None,monitoring:bool = False,generate_descriptions:Optional\[bool\] = None) +def init(project:Optional\[str\] = None,api_key:Optional\[str\] = None,api_secret:Optional\[str\] = None,api_host:Optional\[str\] = None,model:Optional\[str\] = None,monitoring:bool = False,generate_descriptions:Optional\[bool\] = None) ::: @@ -108,7 +108,7 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -def init_dataset(dataset,model = None,index = None,index_name:str = None,date_time_index:bool = False,columns:list = None,text_column:str = None,target_column:str = None,feature_columns:list = None,extra_columns:dict = None,class_labels:dict = None,type:str = None,input_id:str = None,\_\_log = True)validmind.vm_models.VMDataset +def init_dataset(dataset,model = None,index = None,index_name:str = None,date_time_index:bool = False,columns:list = None,text_column:str = None,target_column:str = None,feature_columns:list = None,extra_columns:dict = None,class_labels:dict = None,type:str = None,input_id:str = None,\_\_log = True)validmind.vm_models.VMDataset ::: @@ -149,7 +149,7 @@ The following dataset types are supported: ::: {.signature} -def init_model(model:validmind.vm_models.object = None,input_id:str = 'model',attributes:dict = None,predict_fn:validmind.vm_models.callable = None,\_\_log = True,kwargs = {})validmind.vm_models.VMModel +def init_model(model:validmind.vm_models.object = None,input_id:str = 'model',attributes:dict = None,predict_fn:validmind.vm_models.callable = None,\_\_log = True,kwargs = {})validmind.vm_models.VMModel ::: @@ -179,7 +179,7 @@ Initializes a VM Model, which can then be passed to other functions that can per ::: {.signature} -def init_r_model(model_path:str,input_id:str = 'model')validmind.vm_models.VMModel +def init_r_model(model_path:str,input_id:str = 'model')validmind.vm_models.VMModel ::: @@ -211,7 +211,7 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ::: {.signature} -def log_metric(key:str,value:float,inputs:Optional\[List\[str\]\] = None,params:Optional\[Dict\[str, Any\]\] = None,recorded_at:Optional\[str\] = None,thresholds:Optional\[Dict\[str, Any\]\] = None) +def log_metric(key:str,value:float,inputs:Optional\[List\[str\]\] = None,params:Optional\[Dict\[str, Any\]\] = None,recorded_at:Optional\[str\] = None,thresholds:Optional\[Dict\[str, Any\]\] = None) ::: @@ -443,7 +443,7 @@ Holds raw data for a test result ::: {.signature} -def __init__(self,log:bool = False,kwargs = {}) +def __init__(self,log:bool = False,kwargs = {}) ::: @@ -462,7 +462,7 @@ Create a new RawData object ::: {.signature} -def inspect(self,show:bool = True) +def inspect(self,show:bool = True) ::: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index ad3f9da29..5e3ff8187 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,7 +29,7 @@ Entrypoint for test suites. ::: {.signature} -def format_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +def format_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -57,7 +57,7 @@ Get a logger for the given module name ::: {.signature} -def test_id_to_name(test_id:str)str +def test_id_to_name(test_id:str)str ::: @@ -81,7 +81,7 @@ Convert a test ID to a human-readable name. ::: {.signature} -def describe_suite(test_suite_id:str,verbose = False) +def describe_suite(test_suite_id:str,verbose = False) ::: @@ -106,7 +106,7 @@ Describes a Test Suite by ID ::: {.signature} -def get_by_id(test_suite_id:str) +def get_by_id(test_suite_id:str) ::: @@ -122,7 +122,7 @@ Returns the test suite by ID ::: {.signature} -def list_suites(pretty:bool = True) +def list_suites(pretty:bool = True) ::: @@ -138,7 +138,7 @@ Returns a list of all available test suites ::: {.signature} -def register_test_suite(suite_id:str,suite:validmind.vm_models.TestSuite) +def register_test_suite(suite_id:str,suite:validmind.vm_models.TestSuite) ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 1e609c72d..ec2562998 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -20,7 +20,7 @@ ValidMind Tests Module ::: {.signature} -def describe_test(test_id:validmind.vm_models.TestID = None,raw:bool = False,show:bool = True) +def describe_test(test_id:validmind.vm_models.TestID = None,raw:bool = False,show:bool = True) ::: @@ -115,7 +115,7 @@ List all tests in the tests directory. ::: {.signature} -def load_test(test_id:str,test_func:validmind.vm_models.callable = None,reload:bool = False) +def load_test(test_id:str,test_func:validmind.vm_models.callable = None,reload:bool = False) ::: @@ -136,7 +136,7 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. ::: {.signature} -def run_test(test_id:Union\[validmind.vm_models.TestID, None \] = None,name:Union\[str, None \] = None,unit_metrics:Union\[List\[validmind.vm_models.TestID\], None \] = None,inputs:Union\[Dict\[str, Any\], None \] = None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None \] = None,params:Union\[Dict\[str, Any\], None \] = None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None \] = None,show:bool = True,generate_description:bool = True,title:Optional\[str\] = None,post_process_fn:Union\[Callable\[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, None \], None \] = None,kwargs = {})validmind.vm_models.TestResult +def run_test(test_id:Union\[validmind.vm_models.TestID, None \] = None,name:Union\[str, None \] = None,unit_metrics:Union\[List\[validmind.vm_models.TestID\], None \] = None,inputs:Union\[Dict\[str, Any\], None \] = None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None \] = None,params:Union\[Dict\[str, Any\], None \] = None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None \] = None,show:bool = True,generate_description:bool = True,title:Optional\[str\] = None,post_process_fn:Union\[Callable\[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, None \], None \] = None,kwargs = {})validmind.vm_models.TestResult ::: @@ -256,7 +256,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -def register_test_provider(namespace:str,test_provider:validmind.vm_models.TestProvider) None +def register_test_provider(namespace:str,test_provider:validmind.vm_models.TestProvider) None ::: @@ -357,7 +357,7 @@ List all tests in the given namespace ::: {.signature} -def load_test(self,test_id:str) +def load_test(self,test_id:str) ::: @@ -420,7 +420,7 @@ List all tests in the given namespace ::: {.signature} -def load_test(self,test_id:str)validmind.vm_models.callable +def load_test(self,test_id:str)validmind.vm_models.callable ::: diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 72decf7bc..409b026f8 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ACFandPACFPlot(dataset:validmind.vm_models.VMDataset) +def ACFandPACFPlot(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 3abcd9dbc..82d248df7 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def ADF(dataset:validmind.vm_models.VMDataset) +def ADF(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 6f017a1dd..888b07684 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def AutoAR(dataset:validmind.vm_models.VMDataset,max_ar_order:int = 3) +def AutoAR(dataset:validmind.vm_models.VMDataset,max_ar_order:int = 3) ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index 2abfbd90d..0e0664765 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def AutoMA(dataset:validmind.vm_models.VMDataset,max_ma_order:int = 3) +def AutoMA(dataset:validmind.vm_models.VMDataset,max_ma_order:int = 3) ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 9e56db8fd..e787e2317 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def AutoStationarity(dataset:validmind.vm_models.VMDataset,max_order:int = 5,threshold:float = 0.05) +def AutoStationarity(dataset:validmind.vm_models.VMDataset,max_order:int = 5,threshold:float = 0.05) ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index b4e9c8493..1c217c5b3 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -def ClassImbalance(dataset:validmind.vm_models.VMDataset,min_percent_threshold:int = 10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\] +def ClassImbalance(dataset:validmind.vm_models.VMDataset,min_percent_threshold:int = 10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\] ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 7ab1df1db..966ebfbf8 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def DatasetDescription(dataset:validmind.vm_models.VMDataset) +def DatasetDescription(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index fbb2900ec..9dd882d8c 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def DatasetSplit(datasets:List\[validmind.vm_models.VMDataset\]) +def DatasetSplit(datasets:List\[validmind.vm_models.VMDataset\]) ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 588929624..96b78f7b6 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def format_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict\[str, Any\]\] +def format_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict\[str, Any\]\] ::: @@ -36,7 +36,7 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -def DescriptiveStatistics(dataset:validmind.vm_models.VMDataset) +def DescriptiveStatistics(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index f3c2c1f3e..384561c5d 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def DickeyFullerGLS(dataset:validmind.vm_models.VMDataset) +def DickeyFullerGLS(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 908ddc4bb..7521d2985 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def EngleGrangerCoint(dataset:validmind.vm_models.VMDataset,threshold:float = 0.05) +def EngleGrangerCoint(dataset:validmind.vm_models.VMDataset,threshold:float = 0.05) ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 9db7cc046..96bbca8d2 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def HighCardinality(dataset:validmind.vm_models.VMDataset,num_threshold:int = 100,percent_threshold:float = 0.1,threshold_type:str = 'percent') +def HighCardinality(dataset:validmind.vm_models.VMDataset,num_threshold:int = 100,percent_threshold:float = 0.1,threshold_type:str = 'percent') ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 2aa29e56f..427d53d3d 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def HighPearsonCorrelation(dataset:validmind.vm_models.VMDataset,max_threshold:float = 0.3,top_n_correlations:int = 10,feature_columns:list = None) +def HighPearsonCorrelation(dataset:validmind.vm_models.VMDataset,max_threshold:float = 0.3,top_n_correlations:int = 10,feature_columns:list = None) ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 67031d502..52c39a6b4 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def IQROutliersBarPlot(dataset:validmind.vm_models.VMDataset,threshold:float = 1.5,fig_width:int = 800) +def IQROutliersBarPlot(dataset:validmind.vm_models.VMDataset,threshold:float = 1.5,fig_width:int = 800) ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index debef04c6..8aa922a38 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def IQROutliersTable(dataset:validmind.vm_models.VMDataset,threshold:float = 1.5) +def IQROutliersTable(dataset:validmind.vm_models.VMDataset,threshold:float = 1.5) ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index 806bb37f2..6ff0099f6 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def IsolationForestOutliers(dataset:validmind.vm_models.VMDataset,random_state:int = 0,contamination:float = 0.1,feature_columns:list = None) +def IsolationForestOutliers(dataset:validmind.vm_models.VMDataset,random_state:int = 0,contamination:float = 0.1,feature_columns:list = None) ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 89ab1b0d2..4b001cd18 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def KPSS(dataset:validmind.vm_models.VMDataset) +def KPSS(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index 3f42539e8..d6219299c 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def LaggedCorrelationHeatmap(dataset:validmind.vm_models.VMDataset,num_lags:int = 10) +def LaggedCorrelationHeatmap(dataset:validmind.vm_models.VMDataset,num_lags:int = 10) ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 0956bba85..37c8c41f6 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MissingValues(dataset:validmind.vm_models.VMDataset,min_threshold:int = 1) +def MissingValues(dataset:validmind.vm_models.VMDataset,min_threshold:int = 1) ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 858bbd371..2ca4f04b6 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MissingValuesBarPlot(dataset:validmind.vm_models.VMDataset,threshold:int = 80,fig_height:int = 600) +def MissingValuesBarPlot(dataset:validmind.vm_models.VMDataset,threshold:int = 80,fig_height:int = 600) ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 9ce541b21..6dcbc97ef 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MutualInformation(dataset:validmind.vm_models.VMDataset,min_threshold:float = 0.01,task:str = 'classification') +def MutualInformation(dataset:validmind.vm_models.VMDataset,min_threshold:float = 0.01,task:str = 'classification') ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 7e48ae092..924c8ad25 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def PhillipsPerronArch(dataset:validmind.vm_models.VMDataset) +def PhillipsPerronArch(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 7412aa831..c3186c830 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def RollingStatsPlot(dataset:validmind.vm_models.VMDataset,window_size:int = 12) +def RollingStatsPlot(dataset:validmind.vm_models.VMDataset,window_size:int = 12) ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index a468bcbb7..7aa167f6d 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ScoreBandDefaultRates(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,score_column:str = 'score',score_bands:list = None) +def ScoreBandDefaultRates(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,score_column:str = 'score',score_bands:list = None) ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index d8fdb4958..8998e11e6 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def SeasonalDecompose(dataset:validmind.vm_models.VMDataset,seasonal_model:str = 'additive') +def SeasonalDecompose(dataset:validmind.vm_models.VMDataset,seasonal_model:str = 'additive') ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index d5a9801dd..7abc8bded 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def SpreadPlot(dataset:validmind.vm_models.VMDataset) +def SpreadPlot(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 38894ba25..9f55b919d 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TabularCategoricalBarPlots(dataset:validmind.vm_models.VMDataset) +def TabularCategoricalBarPlots(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 8805b8ccc..aaf689289 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TabularDateTimeHistograms(dataset:validmind.vm_models.VMDataset) +def TabularDateTimeHistograms(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 64cf7901f..f5261a8aa 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TabularNumericalHistograms(dataset:validmind.vm_models.VMDataset) +def TabularNumericalHistograms(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 5e78ba751..3e270d1fd 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TargetRateBarPlots(dataset:validmind.vm_models.VMDataset) +def TargetRateBarPlots(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 713c0d425..0762578c8 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesFrequency(dataset:validmind.vm_models.VMDataset) +def TimeSeriesFrequency(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 8dbac7cd8..bfa0b6bbe 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesLinePlot(dataset:validmind.vm_models.VMDataset) +def TimeSeriesLinePlot(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index b5fc92d41..5a158a0bb 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesMissingValues(dataset:validmind.vm_models.VMDataset,min_threshold:int = 1) +def TimeSeriesMissingValues(dataset:validmind.vm_models.VMDataset,min_threshold:int = 1) ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 40c744482..f943a3589 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesOutliers(dataset:validmind.vm_models.VMDataset,zscore_threshold:int = 3) +def TimeSeriesOutliers(dataset:validmind.vm_models.VMDataset,zscore_threshold:int = 3) ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index ab6651807..b4cf92e97 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TooManyZeroValues(dataset:validmind.vm_models.VMDataset,max_percent_threshold:float = 0.03) +def TooManyZeroValues(dataset:validmind.vm_models.VMDataset,max_percent_threshold:float = 0.03) ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index f24ff7e2e..2456c62e4 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def UniqueRows(dataset:validmind.vm_models.VMDataset,min_percent_threshold:float = 1) +def UniqueRows(dataset:validmind.vm_models.VMDataset,min_percent_threshold:float = 1) ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index ebdf2f0cb..00f235a40 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def WOEBinPlots(dataset:validmind.vm_models.VMDataset,breaks_adj:list = None,fig_height:int = 600,fig_width:int = 500) +def WOEBinPlots(dataset:validmind.vm_models.VMDataset,breaks_adj:list = None,fig_height:int = 600,fig_width:int = 500) ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 9e39befbf..29adf266e 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def WOEBinTable(dataset:validmind.vm_models.VMDataset,breaks_adj:list = None) +def WOEBinTable(dataset:validmind.vm_models.VMDataset,breaks_adj:list = None) ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 00f35d6ad..5d5e180fd 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def ZivotAndrewsArch(dataset:validmind.vm_models.VMDataset) +def ZivotAndrewsArch(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index cf52d44c9..0ce0cf549 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def CommonWords(dataset:validmind.vm_models.VMDataset) +def CommonWords(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 0c2342d18..5dee5e471 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Hashtags(dataset:validmind.vm_models.VMDataset,top_hashtags:int = 25) +def Hashtags(dataset:validmind.vm_models.VMDataset,top_hashtags:int = 25) ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index f046220b1..43fd0ef09 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Mentions(dataset:validmind.vm_models.VMDataset,top_mentions:int = 25) +def Mentions(dataset:validmind.vm_models.VMDataset,top_mentions:int = 25) ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index ddab57850..c05f6f31a 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -def StopWords(dataset:validmind.vm_models.VMDataset,min_percent_threshold:float = 0.5,num_words:int = 25) +def StopWords(dataset:validmind.vm_models.VMDataset,min_percent_threshold:float = 0.5,num_words:int = 25) ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index f5b36925f..290ac8f87 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def TextDescription(dataset:validmind.vm_models.VMDataset,unwanted_tokens:validmind.vm_models.set = {'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str = 'english') +def TextDescription(dataset:validmind.vm_models.VMDataset,unwanted_tokens:validmind.vm_models.set = {'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str = 'english') ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index b5b44d5d1..0dc7da2c2 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClusterSizeDistribution(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) +def ClusterSizeDistribution(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 7a6c10b42..c9a2afe88 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def FeaturesAUC(dataset:validmind.vm_models.VMDataset,fontsize:int = 12,figure_height:int = 500) +def FeaturesAUC(dataset:validmind.vm_models.VMDataset,fontsize:int = 12,figure_height:int = 500) ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 7e90601f1..ad94b7c39 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def RegressionResidualsPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,bin_size:float = 0.1) +def RegressionResidualsPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,bin_size:float = 0.1) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 1a6aba3c0..82911dce0 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def AdjustedMutualInformation(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +def AdjustedMutualInformation(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index b088c1b4f..3938fab8f 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def AdjustedRandIndex(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +def AdjustedRandIndex(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index d448534e1..3ad35117d 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def CalibrationCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_bins:int = 10) +def CalibrationCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_bins:int = 10) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index 2c3e2564f..e0e4bffef 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClassifierPerformance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,average:str = 'macro') +def ClassifierPerformance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,average:str = 'macro') ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 2e3574733..897c19f53 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClassifierThresholdOptimization(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,methods = None,target_recall = None) +def ClassifierThresholdOptimization(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,methods = None,target_recall = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 38fb5fe6b..caf38bc59 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClusterCosineSimilarity(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +def ClusterCosineSimilarity(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 3f0bee1d4..aa0fe5eb4 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClusterPerformanceMetrics(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +def ClusterPerformanceMetrics(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 5d5d1befa..5f76a3da6 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def CompletenessScore(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +def CompletenessScore(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 74723f112..aeab34da2 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ConfusionMatrix(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) +def ConfusionMatrix(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 80902315f..def8589c4 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def FeatureImportance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,num_features:int = 3) +def FeatureImportance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,num_features:int = 3) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 6f31a0641..081c476e6 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def FowlkesMallowsScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) +def FowlkesMallowsScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index af78602bd..56f3c9d24 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def HomogeneityScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) +def HomogeneityScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 6419d36e9..0363770b5 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def HyperParametersTuning(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\] = None,thresholds:Union\[float, List\[float\]\] = None,fit_params:dict = None) +def HyperParametersTuning(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\] = None,thresholds:Union\[float, List\[float\]\] = None,fit_params:dict = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index d32aab84d..892b1cf74 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def KMeansClustersOptimization(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_clusters:Union\[List\[int\], None \] = None) +def KMeansClustersOptimization(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_clusters:Union\[List\[int\], None \] = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index e0fe8984d..cd53e9d3d 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MinimumAccuracy(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float = 0.7) +def MinimumAccuracy(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float = 0.7) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index eec811247..7dec91a33 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MinimumF1Score(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float = 0.5) +def MinimumF1Score(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float = 0.5) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 7ef727cd6..036e30633 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MinimumROCAUCScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float = 0.5) +def MinimumROCAUCScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float = 0.5) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 66b8fe8d2..9de6f1cbe 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -24,7 +24,7 @@ toc-expand: 4 ::: {.signature} -def ModelsPerformanceComparison(dataset:validmind.vm_models.VMDataset,models:list\[validmind.vm_models.VMModel\]) +def ModelsPerformanceComparison(dataset:validmind.vm_models.VMDataset,models:list\[validmind.vm_models.VMModel\]) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 3e64b8949..89985b870 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def OverfitDiagnosis(model:validmind.vm_models.VMModel,datasets:List\[validmind.vm_models.VMDataset\],metric:str = None,cut_off_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}) +def OverfitDiagnosis(model:validmind.vm_models.VMModel,datasets:List\[validmind.vm_models.VMDataset\],metric:str = None,cut_off_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index ab0716759..cbeefec3f 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def PermutationFeatureImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,fontsize:Union\[int, None \] = None,figure_height:Union\[int, None \] = None) +def PermutationFeatureImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,fontsize:Union\[int, None \] = None,figure_height:Union\[int, None \] = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 8eeacd5cb..d52d08df0 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -46,7 +46,7 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -def PopulationStabilityIndex(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,num_bins:int = 10,mode:str = 'fixed') +def PopulationStabilityIndex(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,num_bins:int = 10,mode:str = 'fixed') ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index ef161bf94..844de3b73 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def PrecisionRecallCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +def PrecisionRecallCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 44a47c410..61239192e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ROCCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +def ROCCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 3602a6913..55655b1cb 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionPerformance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +def RegressionPerformance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 5f406e146..70c7c4fcd 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) +def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 68e33fd7a..96e370977 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) +def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 0d5da1b77..9d1b1c459 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RobustnessDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,metric:str = None,scaling_factor_std_dev_list:List\[float\] = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}) +def RobustnessDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,metric:str = None,scaling_factor_std_dev_list:List\[float\] = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index f967d4df9..2318142af 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -85,7 +85,7 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -def SHAPGlobalImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,kernel_explainer_samples:int = 10,tree_or_linear_explainer_samples:int = 200,class_of_interest:int = None) +def SHAPGlobalImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,kernel_explainer_samples:int = 10,tree_or_linear_explainer_samples:int = 200,class_of_interest:int = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 1142a9326..d826e1f88 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ScoreProbabilityAlignment(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,score_column:str = 'score',n_bins:int = 10) +def ScoreProbabilityAlignment(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,score_column:str = 'score',n_bins:int = 10) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 1e962acad..56f01f3a3 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def SilhouettePlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +def SilhouettePlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index d81be3ea5..67fba1f06 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TrainingTestDegradation(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,max_threshold:float = 0.1) +def TrainingTestDegradation(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,max_threshold:float = 0.1) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index e43ee9c9b..24f36cf8c 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def VMeasure(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) +def VMeasure(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 1a8cc0c15..9d00cefbc 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def WeakspotsDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,features_columns:Union\[List\[str\], None \] = None,metrics:Union\[Dict\[str, Callable\], None \] = None,thresholds:Union\[Dict\[str, float\], None \] = None) +def WeakspotsDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,features_columns:Union\[List\[str\], None \] = None,metrics:Union\[Dict\[str, Callable\], None \] = None,thresholds:Union\[Dict\[str, float\], None \] = None) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 3ea7f383a..098b50bfb 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def AutoARIMA(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +def AutoARIMA(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 6db5abe3c..5c163132e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def KolmogorovSmirnov(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,dist:str = 'norm') +def KolmogorovSmirnov(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,dist:str = 'norm') ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index aa13d52cb..7f0730d4b 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Lilliefors(dataset:validmind.vm_models.VMDataset) +def Lilliefors(dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index b51421a3b..abce7f959 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionFeatureSignificance(model:validmind.vm_models.VMModel,fontsize:int = 10,p_threshold:float = 0.05) +def RegressionFeatureSignificance(model:validmind.vm_models.VMModel,fontsize:int = 10,p_threshold:float = 0.05) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 791a416d3..9d43d7f37 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionModelForecastPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,start_date:Union\[str, None \] = None,end_date:Union\[str, None \] = None) +def RegressionModelForecastPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,start_date:Union\[str, None \] = None,end_date:Union\[str, None \] = None) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 2618e765b..6bb29b27f 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def RegressionModelForecastPlotLevels(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +def RegressionModelForecastPlotLevels(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 5b2b1549e..24c6854b9 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionModelSensitivityPlot(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,shocks:List\[float\] = {'cls': 'ExprList', 'elements': ['0.1']},transformation:Union\[str, None \] = None) +def RegressionModelSensitivityPlot(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,shocks:List\[float\] = {'cls': 'ExprList', 'elements': ['0.1']},transformation:Union\[str, None \] = None) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 6d870ddc7..dd303c0ff 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) +def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -def RegressionModelSummary(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) +def RegressionModelSummary(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 3c5afbf40..8d80a2ccf 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionPermutationFeatureImportance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,fontsize:int = 12,figure_height:int = 500) +def RegressionPermutationFeatureImportance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,fontsize:int = 12,figure_height:int = 500) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 1a0c8f771..ce2f083ff 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) +def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 6b1c02837..e7c2ae548 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 0002d2b67..adf4781dc 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 09a003403..f406559a1 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 345a16686..ed6f21254 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 355fe3ec1..341c58a83 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index c9d78f466..5431e639d 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 44b5c9600..6cf232450 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index 686ed45f2..9aa8fa49b 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) ::: @@ -30,7 +30,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +def get_explanation(response:str) ::: @@ -54,7 +54,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +def get_score(response:str) ::: diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index ba34e81b1..4b72a3a22 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def describe_metric(metric_id:str,kwargs = {}) +def describe_metric(metric_id:str,kwargs = {}) ::: @@ -46,7 +46,7 @@ List all metrics ::: {.signature} -def run_metric(metric_id:str,kwargs = {}) +def run_metric(metric_id:str,kwargs = {}) ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index d68185918..baae05fc9 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -206,7 +206,7 @@ This method will be called after the test suite has been run and all results hav ::: {.signature} -def run(self,send:bool = True,fail_fast:bool = False) +def run(self,send:bool = True,fail_fast:bool = False) ::: @@ -225,7 +225,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -def summarize(self,show_link:bool = True) +def summarize(self,show_link:bool = True) ::: @@ -291,7 +291,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -def assign_predictions(self,model:validmind.vm_models.VMModel,prediction_column:str = None,prediction_values:list = None,probability_column:str = None,probability_values:list = None,prediction_probabilities:list = None,kwargs = {}) +def assign_predictions(self,model:validmind.vm_models.VMModel,prediction_column:str = None,prediction_values:list = None,probability_column:str = None,probability_values:list = None,prediction_probabilities:list = None,kwargs = {}) ::: @@ -315,7 +315,7 @@ Assign predictions and probabilities to the dataset. ::: {.signature} -def prediction_column(self,model:validmind.vm_models.VMModel,column_name:str = None)str +def prediction_column(self,model:validmind.vm_models.VMModel,column_name:str = None)str ::: @@ -329,7 +329,7 @@ Get or set the prediction column for a model. ::: {.signature} -def probability_column(self,model:validmind.vm_models.VMModel,column_name:str = None)str +def probability_column(self,model:validmind.vm_models.VMModel,column_name:str = None)str ::: From 9d29514dac1df6cebecd6e96b433d3b879b2c20e Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 9 Feb 2025 09:49:28 -0800 Subject: [PATCH 068/207] Fix type class annotations --- docs/templates/macros/signatures.jinja2 | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index 35c55ebe9..c0a0fcaeb 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -10,19 +10,20 @@ {%- else -%}{{ member.kind }} {%- endif -%} -{{ member.name }}{%- if member.parameters -%}({{- '' -}} - {%- if member.parameters | length == 1 -%} - {{ member.parameters[0].name }} - {%- if member.parameters[0].annotation -%} - :{{ format_type(member.parameters[0].annotation, add_links=true) }} +{{ member.name if member.name != "__init__" else member.parent.name }}{%- if member.parameters -%}({{- '' -}} + {%- set params = member.parameters | reject('equalto', 'self') | list -%} + {%- if params | length == 1 -%} + {{ params[0].name }} + {%- if params[0].annotation -%} + :{{ format_type(params[0].annotation, add_links=true) }} {%- endif -%} - {%- if member.parameters[0].default is not none -%} - = {{ member.parameters[0].default }} + {%- if params[0].default is not none -%} + = {{ params[0].default }} {%- endif -%} {%- else -%} - {%- for param in member.parameters -%} - {{ param.name }} + {%- for param in params -%} + {{ "**" if param.name == "kwargs" else "" }}{{ param.name }} {%- if param.annotation -%} :{{ format_type(param.annotation, add_links=true) }} {%- endif -%} From 89a7045326df5c5f2035bdce6d60a1c6443c92b2 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 9 Feb 2025 13:09:26 -0800 Subject: [PATCH 069/207] Save point types fine-tuning --- docs/templates/macros/docstring.jinja2 | 12 +- docs/templates/macros/signatures.jinja2 | 45 +++--- docs/templates/macros/types.jinja2 | 49 +++--- docs/validmind.qmd | 150 +++++++++--------- .../classification/customer_churn.qmd | 24 +-- .../datasets/classification/taiwan_credit.qmd | 22 +-- .../datasets/credit_risk/lending_club.qmd | 34 ++-- .../credit_risk/lending_club_bias.qmd | 8 +- docs/validmind/datasets/nlp/cnn_dailymail.qmd | 8 +- .../datasets/nlp/twitter_covid_19.qmd | 2 +- docs/validmind/datasets/regression/fred.qmd | 24 +-- .../datasets/regression/lending_club.qmd | 14 +- docs/validmind/errors.qmd | 88 +++++----- docs/validmind/test_suites.qmd | 80 +++++----- docs/validmind/test_suites/classifier.qmd | 14 +- docs/validmind/test_suites/cluster.qmd | 8 +- docs/validmind/test_suites/embeddings.qmd | 6 +- docs/validmind/test_suites/llm.qmd | 12 +- docs/validmind/test_suites/nlp.qmd | 10 +- .../test_suites/parameters_optimization.qmd | 2 +- docs/validmind/test_suites/regression.qmd | 10 +- .../test_suites/statsmodels_timeseries.qmd | 4 +- docs/validmind/test_suites/summarization.qmd | 2 +- .../test_suites/tabular_datasets.qmd | 6 +- docs/validmind/test_suites/text_data.qmd | 2 +- docs/validmind/test_suites/time_series.qmd | 14 +- docs/validmind/tests.qmd | 104 ++++++------ .../tests/data_validation/ACFandPACFPlot.qmd | 2 +- docs/validmind/tests/data_validation/ADF.qmd | 4 +- .../tests/data_validation/AutoAR.qmd | 4 +- .../tests/data_validation/AutoMA.qmd | 4 +- .../data_validation/AutoStationarity.qmd | 2 +- .../data_validation/BivariateScatterPlots.qmd | 2 +- .../tests/data_validation/BoxPierce.qmd | 2 +- .../ChiSquaredFeaturesTable.qmd | 4 +- .../tests/data_validation/ClassImbalance.qmd | 4 +- .../data_validation/DatasetDescription.qmd | 14 +- .../tests/data_validation/DatasetSplit.qmd | 2 +- .../data_validation/DescriptiveStatistics.qmd | 10 +- .../tests/data_validation/DickeyFullerGLS.qmd | 6 +- .../tests/data_validation/Duplicates.qmd | 2 +- .../data_validation/EngleGrangerCoint.qmd | 4 +- .../FeatureTargetCorrelationPlot.qmd | 2 +- .../tests/data_validation/HighCardinality.qmd | 2 +- .../HighPearsonCorrelation.qmd | 2 +- .../data_validation/IQROutliersBarPlot.qmd | 4 +- .../data_validation/IQROutliersTable.qmd | 4 +- .../IsolationForestOutliers.qmd | 2 +- .../tests/data_validation/JarqueBera.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 6 +- .../tests/data_validation/LJungBox.qmd | 2 +- .../LaggedCorrelationHeatmap.qmd | 2 +- .../tests/data_validation/MissingValues.qmd | 2 +- .../data_validation/MissingValuesBarPlot.qmd | 2 +- .../data_validation/MutualInformation.qmd | 2 +- .../PearsonCorrelationMatrix.qmd | 2 +- .../data_validation/PhillipsPerronArch.qmd | 6 +- .../ProtectedClassesCombination.qmd | 6 +- .../ProtectedClassesDescription.qmd | 4 +- .../ProtectedClassesDisparity.qmd | 6 +- .../ProtectedClassesThresholdOptimizer.qmd | 18 +-- .../data_validation/RollingStatsPlot.qmd | 6 +- .../tests/data_validation/RunsTest.qmd | 2 +- .../tests/data_validation/ScatterPlot.qmd | 2 +- .../data_validation/ScoreBandDefaultRates.qmd | 2 +- .../data_validation/SeasonalDecompose.qmd | 6 +- .../tests/data_validation/ShapiroWilk.qmd | 2 +- .../tests/data_validation/Skewness.qmd | 2 +- .../tests/data_validation/SpreadPlot.qmd | 4 +- .../TabularCategoricalBarPlots.qmd | 4 +- .../TabularDateTimeHistograms.qmd | 4 +- .../TabularDescriptionTables.qmd | 14 +- .../TabularNumericalHistograms.qmd | 2 +- .../data_validation/TargetRateBarPlots.qmd | 4 +- .../data_validation/TimeSeriesDescription.qmd | 2 +- .../TimeSeriesDescriptiveStatistics.qmd | 2 +- .../data_validation/TimeSeriesFrequency.qmd | 4 +- .../data_validation/TimeSeriesHistogram.qmd | 4 +- .../data_validation/TimeSeriesLinePlot.qmd | 4 +- .../TimeSeriesMissingValues.qmd | 4 +- .../data_validation/TimeSeriesOutliers.qmd | 4 +- .../data_validation/TooManyZeroValues.qmd | 2 +- .../tests/data_validation/UniqueRows.qmd | 2 +- .../tests/data_validation/WOEBinPlots.qmd | 6 +- .../tests/data_validation/WOEBinTable.qmd | 4 +- .../data_validation/ZivotAndrewsArch.qmd | 6 +- .../tests/data_validation/nlp/CommonWords.qmd | 2 +- .../tests/data_validation/nlp/Hashtags.qmd | 4 +- .../data_validation/nlp/LanguageDetection.qmd | 2 +- .../tests/data_validation/nlp/Mentions.qmd | 4 +- .../nlp/PolarityAndSubjectivity.qmd | 2 +- .../data_validation/nlp/Punctuations.qmd | 2 +- .../tests/data_validation/nlp/Sentiment.qmd | 2 +- .../tests/data_validation/nlp/StopWords.qmd | 2 +- .../data_validation/nlp/TextDescription.qmd | 4 +- .../tests/data_validation/nlp/Toxicity.qmd | 2 +- .../tests/model_validation/BertScore.qmd | 10 +- .../tests/model_validation/BleuScore.qmd | 10 +- .../ClusterSizeDistribution.qmd | 2 +- .../model_validation/ContextualRecall.qmd | 10 +- .../tests/model_validation/FeaturesAUC.qmd | 6 +- .../tests/model_validation/MeteorScore.qmd | 10 +- .../tests/model_validation/ModelMetadata.qmd | 4 +- .../ModelPredictionResiduals.qmd | 2 +- .../tests/model_validation/RegardScore.qmd | 10 +- .../RegressionResidualsPlot.qmd | 2 +- .../tests/model_validation/RougeScore.qmd | 2 +- .../TimeSeriesPredictionWithCI.qmd | 2 +- .../TimeSeriesPredictionsPlot.qmd | 2 +- .../TimeSeriesR2SquareBySegments.qmd | 2 +- .../tests/model_validation/TokenDisparity.qmd | 2 +- .../tests/model_validation/ToxicityScore.qmd | 2 +- .../sklearn/AdjustedMutualInformation.qmd | 2 +- .../sklearn/AdjustedRandIndex.qmd | 2 +- .../sklearn/CalibrationCurve.qmd | 2 +- .../sklearn/ClassifierPerformance.qmd | 4 +- .../ClassifierThresholdOptimization.qmd | 20 +-- .../sklearn/ClusterCosineSimilarity.qmd | 4 +- .../sklearn/ClusterPerformanceMetrics.qmd | 2 +- .../sklearn/CompletenessScore.qmd | 2 +- .../sklearn/ConfusionMatrix.qmd | 2 +- .../sklearn/FeatureImportance.qmd | 2 +- .../sklearn/FowlkesMallowsScore.qmd | 2 +- .../sklearn/HomogeneityScore.qmd | 2 +- .../sklearn/HyperParametersTuning.qmd | 4 +- .../sklearn/KMeansClustersOptimization.qmd | 4 +- .../sklearn/MinimumAccuracy.qmd | 2 +- .../sklearn/MinimumF1Score.qmd | 2 +- .../sklearn/MinimumROCAUCScore.qmd | 2 +- .../sklearn/ModelParameters.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 4 +- .../sklearn/OverfitDiagnosis.qmd | 4 +- .../sklearn/PermutationFeatureImportance.qmd | 6 +- .../sklearn/PopulationStabilityIndex.qmd | 8 +- .../sklearn/PrecisionRecallCurve.qmd | 4 +- .../model_validation/sklearn/ROCCurve.qmd | 4 +- .../sklearn/RegressionErrors.qmd | 2 +- .../sklearn/RegressionErrorsComparison.qmd | 4 +- .../sklearn/RegressionPerformance.qmd | 4 +- .../sklearn/RegressionR2Square.qmd | 4 +- .../sklearn/RegressionR2SquareComparison.qmd | 4 +- .../sklearn/RobustnessDiagnosis.qmd | 6 +- .../sklearn/SHAPGlobalImportance.qmd | 22 +-- .../sklearn/ScoreProbabilityAlignment.qmd | 2 +- .../sklearn/SilhouettePlot.qmd | 2 +- .../sklearn/TrainingTestDegradation.qmd | 2 +- .../model_validation/sklearn/VMeasure.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 2 +- .../statsmodels/AutoARIMA.qmd | 4 +- .../CumulativePredictionProbabilities.qmd | 2 +- .../statsmodels/DurbinWatsonTest.qmd | 2 +- .../statsmodels/GINITable.qmd | 2 +- .../statsmodels/KolmogorovSmirnov.qmd | 4 +- .../statsmodels/Lilliefors.qmd | 2 +- .../PredictionProbabilitiesHistogram.qmd | 2 +- .../statsmodels/RegressionCoeffs.qmd | 4 +- .../RegressionFeatureSignificance.qmd | 6 +- .../RegressionModelForecastPlot.qmd | 4 +- .../RegressionModelForecastPlotLevels.qmd | 4 +- .../RegressionModelSensitivityPlot.qmd | 6 +- .../statsmodels/RegressionModelSummary.qmd | 4 +- ...RegressionPermutationFeatureImportance.qmd | 4 +- .../statsmodels/ScorecardHistogram.qmd | 2 +- .../statsmodels/statsutils.qmd | 2 +- .../tests/prompt_validation/Bias.qmd | 10 +- .../tests/prompt_validation/Clarity.qmd | 10 +- .../tests/prompt_validation/Conciseness.qmd | 10 +- .../tests/prompt_validation/Delimitation.qmd | 10 +- .../prompt_validation/NegativeInstruction.qmd | 10 +- .../tests/prompt_validation/Robustness.qmd | 8 +- .../tests/prompt_validation/Specificity.qmd | 10 +- .../prompt_validation/ai_powered_test.qmd | 6 +- docs/validmind/unit_metrics.qmd | 6 +- docs/validmind/vm_models.qmd | 128 +++++++-------- 174 files changed, 762 insertions(+), 746 deletions(-) diff --git a/docs/templates/macros/docstring.jinja2 b/docs/templates/macros/docstring.jinja2 index 0bd0521ca..b2f7de1a7 100644 --- a/docs/templates/macros/docstring.jinja2 +++ b/docs/templates/macros/docstring.jinja2 @@ -18,7 +18,7 @@ {# Parameters #} {%- if docstring.parsed.params -%} - {%- set _ = sections.append("\n**Arguments**") -%} + {%- set _ = sections.append("\n**Arguments**\n") -%} {%- for param in docstring.parsed.params -%} {%- if param.arg_name and param.description -%} {%- set desc = param.description | trim -%} @@ -34,9 +34,9 @@ {%- if type_info.endswith(')') and not type_info.startswith('(') -%} {%- set type_info = '(' ~ type_info -%} {%- endif -%} - {%- set _ = sections.append("- **" ~ param.arg_name ~ "** " ~ type_info ~ ": " ~ desc) -%} + {%- set _ = sections.append("- `" ~ param.arg_name ~ "` " ~ type_info ~ ": " ~ desc) -%} {%- else -%} - {%- set _ = sections.append("- **" ~ param.arg_name ~ "**: " ~ desc) -%} + {%- set _ = sections.append("- `" ~ param.arg_name ~ "`: " ~ desc) -%} {%- endif -%} {%- endif -%} {%- endfor -%} @@ -44,7 +44,7 @@ {# Returns #} {%- if docstring.parsed.returns -%} - {%- set _ = sections.append("\n**Returns**") -%} + {%- set _ = sections.append("\n**Returns**\n") -%} {%- if docstring.parsed.returns.description -%} {%- set _ = sections.append("- " ~ docstring.parsed.returns.description | trim) -%} {%- endif -%} @@ -52,10 +52,10 @@ {# Raises #} {%- if docstring.parsed.raises -%} - {%- set _ = sections.append("\n**Raises**") -%} + {%- set _ = sections.append("\n**Raises**\n") -%} {%- for raises in docstring.parsed.raises -%} {%- if raises.type_name and raises.description -%} - {%- set _ = sections.append("- **" ~ raises.type_name ~ "**: " ~ raises.description | trim) -%} + {%- set _ = sections.append("- `" ~ raises.type_name ~ "`: " ~ raises.description | trim) -%} {%- endif -%} {%- endfor -%} {%- endif -%} diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index c0a0fcaeb..74a81826b 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -4,36 +4,39 @@ ::: {.signature} +{# Skip 'def' for constructors #} +{%- if not (member.name == "__init__" and member.kind == "method") -%} {%- if member.kind == "class" or member.kind == "alias" -%}class {%- elif member.kind == "function" or member.kind == "method" -%}def {%- else -%}{{ member.kind }} {%- endif -%} -{{ member.name if member.name != "__init__" else member.parent.name }}{%- if member.parameters -%}({{- '' -}} - {%- set params = member.parameters | reject('equalto', 'self') | list -%} - {%- if params | length == 1 -%} - {{ params[0].name }} - {%- if params[0].annotation -%} - :{{ format_type(params[0].annotation, add_links=true) }} +{%- endif -%} +{# Use class name for constructors #} +{{ member.parent.name if (member.name == "__init__" and member.kind == "method") else member.name }}{%- if member.parameters -%}({{- '' -}} + {%- set params = [] -%} + {%- for param in member.parameters -%} + {%- if param.name != "self" -%} + {%- set _ = params.append(param) -%} {%- endif -%} - {%- if params[0].default is not none -%} - = {{ params[0].default }} + {%- endfor -%} + {%- for param in params -%} + {{ "**" if param.name == "kwargs" else "" }}{{ param.name }} + {%- if param.annotation -%} + : {{ format_type(param.annotation, add_links=true) }} {%- endif -%} - - {%- else -%} - {%- for param in params -%} - {{ "**" if param.name == "kwargs" else "" }}{{ param.name }} - {%- if param.annotation -%} - :{{ format_type(param.annotation, add_links=true) }} - {%- endif -%} - {%- if param.default is not none -%} - = {{ param.default }} + {%- if param.default is not none -%} + = + {%- if param.default is string and param.default.startswith("'") and param.default.endswith("'") -%} + {{ param.default }} + {%- else -%} + {{ param.default }} {%- endif -%} - {%- if not loop.last -%},{%- endif -%} - - {%- endfor -%} - {%- endif -%}) + {%- endif -%} + {%- if not loop.last -%},{%- endif -%} + + {%- endfor -%}) {%- else -%}() {%- endif -%} {%- if member.returns -%} diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index d9129a832..6adfabdf1 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -1,63 +1,76 @@ +{%- set builtin_types = ['str', 'dict', 'list', 'bool', 'int', 'float', 'object', 'callable', 'tuple', 'type', 'None'] -%} +{%- set type_keywords = ['Any', 'Union', 'Dict', 'List', 'Optional', 'Callable', 'Tuple'] -%} + {% macro format_type(type, module=None, add_links=false) %} {%- if type is mapping -%} {%- if type.kind == 'union' -%} - Union[ + Union[ {%- for t in type.types -%} {{ format_type(t, module, add_links) }} - {%- if not loop.last %}, {% endif -%} + {%- if not loop.last -%}, {%- endif -%} {%- endfor -%} - ] + ] {%- elif type.kind == 'generic' -%} {%- if type.base == 'Dict' -%} - Dict[{{ format_type(type.args[0], module, add_links) }}, {{ format_type(type.args[1], module, add_links) }}] + Dict[{{ format_type(type.args[0], module, add_links) }}, {{ format_type(type.args[1], module, add_links) }}] {%- elif type.base == 'List' -%} - List[{{ format_type(type.args[0], module, add_links) }}] + List[{{ format_type(type.args[0], module, add_links) }}] {%- else -%} - {{ type.base }}[{{ type.args | map(attribute='format_type') | join(', ') }}] + {{ type.base }}[{{ type.args | map(attribute='format_type') | join(', ') }}] {%- endif -%} {%- elif type.cls == "ExprAttribute" and type.values is sequence -%} {{ type.values | map(attribute='name') | join('.') }} {%- elif type.cls == "ExprSubscript" and type.left is defined -%} - {{ format_type(type.left, module, add_links) }}[ + {{ format_type(type.left, module, add_links) }}[ {%- if type.slice.cls == "ExprTuple" -%} {%- for elem in type.slice.elements -%} {{ format_type(elem, module, add_links) }} - {%- if not loop.last -%}, {% endif -%} + {%- if not loop.last -%}, {%- endif -%} {%- endfor -%} {%- else -%} {{ format_type(type.slice, module, add_links) }} {%- endif -%} - ] + ] {%- elif type.cls == "ExprName" -%} {%- if module and type.name in module.members and module.members[type.name].kind == "alias" -%} {{ module.members[type.name].target_path }} - {%- elif add_links and type.name not in ['str', 'dict', 'list', 'bool', 'int', 'float', 'Any', 'Union', 'Dict', 'List', 'Optional', 'Callable', 'Tuple'] -%} + {%- elif type.name|lower in builtin_types -%} + {{ type.name }} + {%- elif add_links and type.name not in type_keywords -%} validmind.vm_models.{{ type.name }} {%- else -%} - {{ type.name }} + {{ type.name }} {%- endif -%} {%- elif type.cls == "ExprTuple" -%} {%- for elem in type.elements -%} {{ format_type(elem, module, add_links) }} - {%- if not loop.last -%}, {% endif -%} + {%- if not loop.last -%}, {%- endif -%} {%- endfor -%} {%- elif type.cls == "ExprCall" -%} - {{ format_type(type.func, module, add_links) }}( + {{ format_type(type.func, module, add_links) }}( {%- for arg in type.args -%} {{ format_type(arg, module, add_links) }} - {%- if not loop.last -%}, {% endif -%} + {%- if not loop.last -%}, {%- endif -%} {%- endfor -%} - ) + ) {%- elif type.cls == "ExprBinOp" -%} - {{ format_type(type.left, module, add_links) }}{{ type.op }}{{ format_type(type.right, module, add_links) }} + {{ format_type(type.left, module, add_links) }}{{ type.op }}{{ format_type(type.right, module, add_links) }} {%- elif type.name is defined and add_links and type.name not in ['str', 'dict', 'list', 'bool', 'int', 'float', 'Any', 'Union', 'Dict', 'List', 'Optional', 'Callable', 'Tuple'] -%} validmind.vm_models.{{ type.name }} {%- else -%} - {{ type.name if 'name' in type else type|string }} + {%- if type.name in ['str', 'dict', 'list', 'bool', 'int', 'float'] -%} + {{ type.name if 'name' in type else type|string }} + {%- else -%} + {{ type.name if 'name' in type else type|string }} + {%- endif -%} {%- endif -%} {% else %} - {{ type }} + {%- if type|lower in builtin_types -%} + {{ type }} + {%- else -%} + {{ type }} + {%- endif -%} {% endif %} {% endmacro %} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index d9a7145b6..537dad9fa 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -55,7 +55,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -def get_test_suite(test_suite_id:str = None,section:str = None,args = (),kwargs = {})validmind.vm_models.TestSuite +defget_test_suite(test_suite_id: str = None,section: str = None,args = (),\*\*kwargs = {})validmind.vm_models.TestSuite ::: @@ -67,10 +67,10 @@ This function provides an interface to retrieve the TestSuite instance for the c **Arguments** -- **test_suite_id** (str): The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. -- **section** (str): The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. -- **args**: Additional arguments to pass to the TestSuite -- **kwargs**: Additional keyword arguments to pass to the TestSuite +- `test_suite_id` (str): The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. +- `section` (str): The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. +- `args`: Additional arguments to pass to the TestSuite +- `kwargs`: Additional keyword arguments to pass to the TestSuite ## init() @@ -78,7 +78,7 @@ This function provides an interface to retrieve the TestSuite instance for the c ::: {.signature} -def init(project:Optional\[str\] = None,api_key:Optional\[str\] = None,api_secret:Optional\[str\] = None,api_host:Optional\[str\] = None,model:Optional\[str\] = None,monitoring:bool = False,generate_descriptions:Optional\[bool\] = None) +definit(project: Optional\[str\] = None,api_key: Optional\[str\] = None,api_secret: Optional\[str\] = None,api_host: Optional\[str\] = None,model: Optional\[str\] = None,monitoring: bool = False,generate_descriptions: Optional\[bool\] = None) ::: @@ -90,17 +90,17 @@ If the API key and secret are not provided, the client will attempt to retrieve **Arguments** -- **project** (str, optional): The project CUID. Alias for model. Defaults to None. [DEPRECATED] -- **model** (str, optional): The model CUID. Defaults to None. -- **api_key** (str, optional): The API key. Defaults to None. -- **api_secret** (str, optional): The API secret. Defaults to None. -- **api_host** (str, optional): The API host. Defaults to None. -- **monitoring** (bool): The ongoing monitoring flag. Defaults to False. -- **generate_descriptions** (bool): Whether to use GenAI to generate test result descriptions. Defaults to True. +- `project` (str, optional): The project CUID. Alias for model. Defaults to None. [DEPRECATED] +- `model` (str, optional): The model CUID. Defaults to None. +- `api_key` (str, optional): The API key. Defaults to None. +- `api_secret` (str, optional): The API secret. Defaults to None. +- `api_host` (str, optional): The API host. Defaults to None. +- `monitoring` (bool): The ongoing monitoring flag. Defaults to False. +- `generate_descriptions` (bool): Whether to use GenAI to generate test result descriptions. Defaults to True. **Raises** -- **ValueError**: If the API key and secret are not provided +- `ValueError`: If the API key and secret are not provided ## init_dataset() @@ -108,7 +108,7 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -def init_dataset(dataset,model = None,index = None,index_name:str = None,date_time_index:bool = False,columns:list = None,text_column:str = None,target_column:str = None,feature_columns:list = None,extra_columns:dict = None,class_labels:dict = None,type:str = None,input_id:str = None,\_\_log = True)validmind.vm_models.VMDataset +definit_dataset(dataset,model = None,index = None,index_name: str = None,date_time_index: bool = False,columns: list = None,text_column: str = None,target_column: str = None,feature_columns: list = None,extra_columns: dict = None,class_labels: dict = None,type: str = None,input_id: str = None,\_\_log = True)validmind.vm_models.VMDataset ::: @@ -125,15 +125,15 @@ The following dataset types are supported: **Arguments** -- **dataset**: Dataset from various Python libraries -- **model** (VMModel): ValidMind model object -- **targets** (vm.vm.DatasetTargets): A list of target variables -- **target_column** (str): The name of the target column in the dataset -- **feature_columns** (list): A list of names of feature columns in the dataset -- **extra_columns** (dictionary): A dictionary containing the names of the prediction_column and group_by_columns in the dataset -- **class_labels** (dict): A list of class labels for classification problems -- **type** (str): The type of dataset (one of DATASET_TYPES) -- **input_id** (str): The input ID for the dataset (e.g. "my_dataset"). By default, this will be set to `dataset` but if you are passing this dataset as a test input using some other key than `dataset`, then you should set this to the same key. +- `dataset`: Dataset from various Python libraries +- `model` (VMModel): ValidMind model object +- `targets` (vm.vm.DatasetTargets): A list of target variables +- `target_column` (str): The name of the target column in the dataset +- `feature_columns` (list): A list of names of feature columns in the dataset +- `extra_columns` (dictionary): A dictionary containing the names of the prediction_column and group_by_columns in the dataset +- `class_labels` (dict): A list of class labels for classification problems +- `type` (str): The type of dataset (one of DATASET_TYPES) +- `input_id` (str): The input ID for the dataset (e.g. "my_dataset"). By default, this will be set to `dataset` but if you are passing this dataset as a test input using some other key than `dataset`, then you should set this to the same key. **Returns** @@ -141,7 +141,7 @@ The following dataset types are supported: **Raises** -- **ValueError**: If the dataset type is not supported +- `ValueError`: If the dataset type is not supported ## init_model() @@ -149,7 +149,7 @@ The following dataset types are supported: ::: {.signature} -def init_model(model:validmind.vm_models.object = None,input_id:str = 'model',attributes:dict = None,predict_fn:validmind.vm_models.callable = None,\_\_log = True,kwargs = {})validmind.vm_models.VMModel +definit_model(model: object = None,input_id: str = 'model',attributes: dict = None,predict_fn: callable = None,\_\_log = True,\*\*kwargs = {})validmind.vm_models.VMModel ::: @@ -159,11 +159,11 @@ Initializes a VM Model, which can then be passed to other functions that can per **Arguments** -- **model**: A trained model or VMModel instance -- **input_id** (str): The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. -- **attributes** (dict): A dictionary of model attributes -- **predict_fn** (callable): A function that takes an input and returns a prediction -- \*\***kwargs**: Additional arguments to pass to the model +- `model`: A trained model or VMModel instance +- `input_id` (str): The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. +- `attributes` (dict): A dictionary of model attributes +- `predict_fn` (callable): A function that takes an input and returns a prediction +- `**kwargs`: Additional arguments to pass to the model **Returns** @@ -171,7 +171,7 @@ Initializes a VM Model, which can then be passed to other functions that can per **Raises** -- **ValueError**: If the model type is not supported +- `ValueError`: If the model type is not supported ## init_r_model() @@ -179,7 +179,7 @@ Initializes a VM Model, which can then be passed to other functions that can per ::: {.signature} -def init_r_model(model_path:str,input_id:str = 'model')validmind.vm_models.VMModel +definit_r_model(model_path: str,input_id: str = 'model')validmind.vm_models.VMModel ::: @@ -198,8 +198,8 @@ LogisticRegression and LinearRegression models are converted to sklearn models b **Arguments** -- **model_path** (str): The path to the R model saved as an RDS or XGB file -- **model_type** (str): The type of the model (one of R_MODEL_TYPES) +- `model_path` (str): The path to the R model saved as an RDS or XGB file +- `model_type` (str): The type of the model (one of R_MODEL_TYPES) **Returns** @@ -211,7 +211,7 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ::: {.signature} -def log_metric(key:str,value:float,inputs:Optional\[List\[str\]\] = None,params:Optional\[Dict\[str, Any\]\] = None,recorded_at:Optional\[str\] = None,thresholds:Optional\[Dict\[str, Any\]\] = None) +deflog_metric(key: str,value: float,inputs: Optional\[List\[str\]\] = None,params: Optional\[Dict\[str, Any\]\] = None,recorded_at: Optional\[str\] = None,thresholds: Optional\[Dict\[str, Any\]\] = None) ::: @@ -223,12 +223,12 @@ Unit metrics are key-value pairs where the key is the metric name and the value **Arguments** -- **key** (str): The metric key -- **value** (float): The metric value -- **inputs** (list): A list of input IDs that were used to compute the metric. -- **params** (dict): Dictionary of parameters used to compute the metric. -- **recorded_at** (str): The timestamp of the metric. Server will use current time if not provided. -- **thresholds** (dict): Dictionary of thresholds for the metric. +- `key` (str): The metric key +- `value` (float): The metric value +- `inputs` (list): A list of input IDs that were used to compute the metric. +- `params` (dict): Dictionary of parameters used to compute the metric. +- `recorded_at` (str): The timestamp of the metric. Server will use current time if not provided. +- `thresholds` (dict): Dictionary of thresholds for the metric. ## preview_template() @@ -236,7 +236,7 @@ Unit metrics are key-value pairs where the key is the metric name and the value ::: {.signature} -def preview_template() +defpreview_template() ::: @@ -248,7 +248,7 @@ This function will display the documentation template for the current project. I **Raises** -- **ValueError**: If the project has not been initialized +- `ValueError`: If the project has not been initialized ## print_env() @@ -256,7 +256,7 @@ This function will display the documentation template for the current project. I ::: {.signature} -def print_env() +defprint_env() ::: @@ -272,7 +272,7 @@ Output includes: ValidMind Library version, operating system details, installed ::: {.signature} -def reload() +defreload() ::: @@ -286,7 +286,7 @@ Reconnect to the ValidMind API and reload the project configuration ::: {.signature} -def run_documentation_tests(section = None,send = True,fail_fast = False,inputs = None,config = None,kwargs = {}) +defrun_documentation_tests(section = None,send = True,fail_fast = False,inputs = None,config = None,\*\*kwargs = {}) ::: @@ -298,12 +298,12 @@ This function will analyze the current project's documentation template and coll **Arguments** -- **section** (str or list, optional): The section(s) to preview. Defaults to None. -- **send** (bool): Whether to send the results to the ValidMind API. Defaults to True. -- **fail_fast** (bool): Whether to stop running tests after the first failure. Defaults to False. -- **inputs** (dict): A dictionary of test inputs to pass to the TestSuite -- **config**: A dictionary of test parameters to override the defaults -- \*\***kwargs**: backwards compatibility for passing in test inputs using keyword arguments +- `section` (str or list, optional): The section(s) to preview. Defaults to None. +- `send` (bool): Whether to send the results to the ValidMind API. Defaults to True. +- `fail_fast` (bool): Whether to stop running tests after the first failure. Defaults to False. +- `inputs` (dict): A dictionary of test inputs to pass to the TestSuite +- `config`: A dictionary of test parameters to override the defaults +- `**kwargs`: backwards compatibility for passing in test inputs using keyword arguments **Returns** @@ -311,7 +311,7 @@ This function will analyze the current project's documentation template and coll **Raises** -- **ValueError**: If the project has not been initialized +- `ValueError`: If the project has not been initialized ## run_test_suite() @@ -319,7 +319,7 @@ This function will analyze the current project's documentation template and coll ::: {.signature} -def run_test_suite(test_suite_id,send = True,fail_fast = False,config = None,inputs = None,kwargs = {}) +defrun_test_suite(test_suite_id,send = True,fail_fast = False,config = None,inputs = None,\*\*kwargs = {}) ::: @@ -331,12 +331,12 @@ This function provides a high level interface for running a test suite. A test s **Arguments** -- **test_suite_id** (str): The test suite name (e.g. 'classifier_full_suite') -- **config** (dict): A dictionary of parameters to pass to the tests in the test suite. Defaults to None. -- **send** (bool): Whether to post the test results to the API. send=False is useful for testing. Defaults to True. -- **fail_fast** (bool): Whether to stop running tests after the first failure. Defaults to False. -- **inputs** (dict): A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` `models` etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. -- \*\***kwargs**: backwards compatibility for passing in test inputs using keyword arguments +- `test_suite_id` (str): The test suite name (e.g. 'classifier_full_suite') +- `config` (dict): A dictionary of parameters to pass to the tests in the test suite. Defaults to None. +- `send` (bool): Whether to post the test results to the API. send=False is useful for testing. Defaults to True. +- `fail_fast` (bool): Whether to stop running tests after the first failure. Defaults to False. +- `inputs` (dict): A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` `models` etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. +- `**kwargs`: backwards compatibility for passing in test inputs using keyword arguments **Returns** @@ -344,7 +344,7 @@ This function provides a high level interface for running a test suite. A test s **Raises** -- **ValueError**: If the test suite name is not found or if there is an error initializing the test suite +- `ValueError`: If the test suite name is not found or if there is an error initializing the test suite ## tags() @@ -352,7 +352,7 @@ This function provides a high level interface for running a test suite. A test s ::: {.signature} -def tags(tags = ()) +deftags(tags = ()) ::: @@ -362,7 +362,7 @@ Decorator for specifying tags for a test. **Arguments** -- \***tags**: The tags to apply to the test. +- `*tags`: The tags to apply to the test. ## tasks() @@ -370,7 +370,7 @@ Decorator for specifying tags for a test. ::: {.signature} -def tasks(tasks = ()) +deftasks(tasks = ()) ::: @@ -380,7 +380,7 @@ Decorator for specifying the task types that a test is designed for. **Arguments** -- \***tasks**: The task types that the test is designed for. +- `*tasks`: The task types that the test is designed for. ## test() @@ -388,7 +388,7 @@ Decorator for specifying the task types that a test is designed for. ::: {.signature} -def test(func_or_id) +deftest(func_or_id) ::: @@ -414,8 +414,8 @@ The function may also include a docstring. This docstring will be used and logge **Arguments** -- **func**: The function to decorate -- **test_id**: The identifier for the metric. If not provided, the function name is used. +- `func`: The function to decorate +- `test_id`: The identifier for the metric. If not provided, the function name is used. **Returns** @@ -429,7 +429,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -class RawData() +classRawData() ::: @@ -443,7 +443,7 @@ Holds raw data for a test result ::: {.signature} -def __init__(self,log:bool = False,kwargs = {}) +def__init__(log: bool = False,\*\*kwargs = {}) ::: @@ -453,8 +453,8 @@ Create a new RawData object **Arguments** -- **log** (bool): If True, log the raw data to ValidMind -- \*\***kwargs**: Keyword arguments to set as attributes e.g. `RawData(log=True, dataset_duplicates=df_duplicates)` +- `log` (bool): If True, log the raw data to ValidMind +- `**kwargs`: Keyword arguments to set as attributes e.g. `RawData(log=True, dataset_duplicates=df_duplicates)` ### inspect() @@ -462,7 +462,7 @@ Create a new RawData object ::: {.signature} -def inspect(self,show:bool = True) +definspect(show: bool = True) ::: @@ -476,6 +476,6 @@ Inspect the raw data ::: {.signature} -def serialize(self) +defserialize() ::: diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index cc25b9832..2d2445dd5 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def simple_preprocess_booleans(df,columns) +defsimple_preprocess_booleans(df,columns) ::: @@ -22,8 +22,8 @@ Preprocess boolean columns. **Arguments** -- **df** (pandas.DataFrame): Dataframe to preprocess. -- **columns** (list): List of columns to preprocess. +- `df` (pandas.DataFrame): Dataframe to preprocess. +- `columns` (list): List of columns to preprocess. **Returns** @@ -35,7 +35,7 @@ Preprocess boolean columns. ::: {.signature} -def simple_preprocess_categoricals(df,columns) +defsimple_preprocess_categoricals(df,columns) ::: @@ -45,8 +45,8 @@ Preprocess categorical columns. **Arguments** -- **df** (pandas.DataFrame): Dataframe to preprocess. -- **columns** (list): List of columns to preprocess. +- `df` (pandas.DataFrame): Dataframe to preprocess. +- `columns` (list): List of columns to preprocess. **Returns** @@ -58,7 +58,7 @@ Preprocess categorical columns. ::: {.signature} -def simple_preprocess_numericals(df,columns) +defsimple_preprocess_numericals(df,columns) ::: @@ -68,8 +68,8 @@ Preprocess numerical columns. **Arguments** -- **df** (pandas.DataFrame): Dataframe to preprocess. -- **columns** (list): List of columns to preprocess. +- `df` (pandas.DataFrame): Dataframe to preprocess. +- `columns` (list): List of columns to preprocess. **Returns** @@ -83,7 +83,7 @@ Preprocess numerical columns. ::: {.signature} -def get_demo_test_config(test_suite = None) +defget_demo_test_config(test_suite = None) ::: @@ -116,7 +116,7 @@ We assign the following inputs depending on the input config expected by each te ::: {.signature} -def load_data(full_dataset = False) +defload_data(full_dataset = False) ::: @@ -128,6 +128,6 @@ We assign the following inputs depending on the input config expected by each te ::: {.signature} -def preprocess(df) +defpreprocess(df) ::: diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index 43620eded..693d76507 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def simple_preprocess_booleans(df,columns) +defsimple_preprocess_booleans(df,columns) ::: @@ -22,8 +22,8 @@ Preprocess boolean columns. **Arguments** -- **df** (pandas.DataFrame): Dataframe to preprocess. -- **columns** (list): List of columns to preprocess. +- `df` (pandas.DataFrame): Dataframe to preprocess. +- `columns` (list): List of columns to preprocess. **Returns** @@ -35,7 +35,7 @@ Preprocess boolean columns. ::: {.signature} -def simple_preprocess_categoricals(df,columns) +defsimple_preprocess_categoricals(df,columns) ::: @@ -45,8 +45,8 @@ Preprocess categorical columns. **Arguments** -- **df** (pandas.DataFrame): Dataframe to preprocess. -- **columns** (list): List of columns to preprocess. +- `df` (pandas.DataFrame): Dataframe to preprocess. +- `columns` (list): List of columns to preprocess. **Returns** @@ -58,7 +58,7 @@ Preprocess categorical columns. ::: {.signature} -def simple_preprocess_numericals(df,columns) +defsimple_preprocess_numericals(df,columns) ::: @@ -68,8 +68,8 @@ Preprocess numerical columns. **Arguments** -- **df** (pandas.DataFrame): Dataframe to preprocess. -- **columns** (list): List of columns to preprocess. +- `df` (pandas.DataFrame): Dataframe to preprocess. +- `columns` (list): List of columns to preprocess. **Returns** @@ -83,7 +83,7 @@ Preprocess numerical columns. ::: {.signature} -def load_data() +defload_data() ::: @@ -95,6 +95,6 @@ Preprocess numerical columns. ::: {.signature} -def preprocess(df) +defpreprocess(df) ::: diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index 79779965a..51a415ba0 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def compute_scores(probabilities) +defcompute_scores(probabilities) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def feature_engineering(df,verbose = True) +deffeature_engineering(df,verbose = True) ::: @@ -38,7 +38,7 @@ toc-expand: 4 ::: {.signature} -def get_demo_test_config(x_test = None,y_test = None) +defget_demo_test_config(x_test = None,y_test = None) ::: @@ -48,8 +48,8 @@ Get demo test configuration. **Arguments** -- **x_test**: Test features DataFrame -- **y_test**: Test target Series +- `x_test`: Test features DataFrame +- `y_test`: Test target Series **Returns** @@ -63,7 +63,7 @@ Get demo test configuration. ::: {.signature} -def init_vm_objects(scorecard) +definit_vm_objects(scorecard) ::: @@ -75,7 +75,7 @@ Get demo test configuration. ::: {.signature} -def load_data(source = 'online',verbose = True) +defload_data(source = 'online',verbose = True) ::: @@ -85,7 +85,7 @@ Load data from either an online source or offline files, automatically dropping **Arguments** -- **source**: 'online' for online data, 'offline' for offline files. Defaults to 'online'. +- `source`: 'online' for online data, 'offline' for offline files. Defaults to 'online'. **Returns** @@ -99,7 +99,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -def load_scorecard() +defload_scorecard() ::: @@ -111,7 +111,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -def load_test_config(scorecard) +defload_test_config(scorecard) ::: @@ -123,7 +123,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -def preprocess(df,verbose = True) +defpreprocess(df,verbose = True) ::: @@ -135,7 +135,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -def split(df,validation_size = None,test_size = 0.2,add_constant = False,verbose = True) +defsplit(df,validation_size = None,test_size = 0.2,add_constant = False,verbose = True) ::: @@ -145,10 +145,10 @@ Split dataset into train, validation (optional), and test sets. **Arguments** -- **df**: Input DataFrame -- **validation_split**: If None, returns train/test split. If float, returns train/val/test split -- **test_size**: Proportion of data for test set (default: 0.2) -- **add_constant**: Whether to add constant column for statsmodels (default: False) +- `df`: Input DataFrame +- `validation_split`: If None, returns train/test split. If float, returns train/val/test split +- `test_size`: Proportion of data for test set (default: 0.2) +- `add_constant`: Whether to add constant column for statsmodels (default: False) **Returns** @@ -162,6 +162,6 @@ Split dataset into train, validation (optional), and test sets. ::: {.signature} -def woe_encoding(df,verbose = True) +defwoe_encoding(df,verbose = True) ::: diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 7338520b3..79a4697a9 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def compute_scores(probabilities) +defcompute_scores(probabilities) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def load_data() +defload_data() ::: @@ -44,7 +44,7 @@ Load data from the specified CSV file. ::: {.signature} -def preprocess(df) +defpreprocess(df) ::: @@ -56,6 +56,6 @@ Load data from the specified CSV file. ::: {.signature} -def split(df,test_size = 0.3) +defsplit(df,test_size = 0.3) ::: diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index 246927922..23e257b7a 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def display_nice(df,num_rows = None) +defdisplay_nice(df,num_rows = None) ::: @@ -30,7 +30,7 @@ Primary function to format and display a DataFrame. ::: {.signature} -def load_data(source = 'online',dataset_size = None) +defload_data(source = 'online',dataset_size = None) ::: @@ -40,8 +40,8 @@ Load data from either online source or offline files. **Arguments** -- **source**: 'online' for online data, 'offline' for offline data. Defaults to 'online'. -- **dataset_size**: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. +- `source`: 'online' for online data, 'offline' for offline data. Defaults to 'online'. +- `dataset_size`: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. **Returns** diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index 6be339e18..105df535b 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -14,6 +14,6 @@ toc-expand: 4 ::: {.signature} -def load_data(full_dataset = False) +defload_data(full_dataset = False) ::: diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index c02e9670b..29f6040d6 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def load_all_data() +defload_all_data() ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def load_data() +defload_data() ::: @@ -38,7 +38,7 @@ toc-expand: 4 ::: {.signature} -def load_model(model_name) +defload_model(model_name) ::: @@ -50,7 +50,7 @@ toc-expand: 4 ::: {.signature} -def load_processed_data() +defload_processed_data() ::: @@ -62,7 +62,7 @@ toc-expand: 4 ::: {.signature} -def load_test_dataset(model_name) +defload_test_dataset(model_name) ::: @@ -74,7 +74,7 @@ toc-expand: 4 ::: {.signature} -def load_train_dataset(model_path) +defload_train_dataset(model_path) ::: @@ -86,7 +86,7 @@ toc-expand: 4 ::: {.signature} -def preprocess(df,split_option = 'train_test_val',train_size = 0.6,test_size = 0.2) +defpreprocess(df,split_option = 'train_test_val',train_size = 0.6,test_size = 0.2) ::: @@ -96,10 +96,10 @@ Split a time series DataFrame into train, validation, and test sets. **Arguments** -- **df** (pandas.DataFrame): The time series DataFrame to be split. -- **split_option** (str): The split option to choose from: 'train_test_val' (default) or 'train_test'. -- **train_size** (float): The proportion of the dataset to include in the training set. Default is 0.6. -- **test_size** (float): The proportion of the dataset to include in the test set. Default is 0.2. +- `df` (pandas.DataFrame): The time series DataFrame to be split. +- `split_option` (str): The split option to choose from: 'train_test_val' (default) or 'train_test'. +- `train_size` (float): The proportion of the dataset to include in the training set. Default is 0.6. +- `test_size` (float): The proportion of the dataset to include in the test set. Default is 0.2. **Returns** @@ -113,6 +113,6 @@ Split a time series DataFrame into train, validation, and test sets. ::: {.signature} -def transform(df,transform_func = 'diff') +deftransform(df,transform_func = 'diff') ::: diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 8796e644c..86c360402 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def load_data() +defload_data() ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def preprocess(df,split_option = 'train_test_val',train_size = 0.6,test_size = 0.2) +defpreprocess(df,split_option = 'train_test_val',train_size = 0.6,test_size = 0.2) ::: @@ -36,10 +36,10 @@ Split a time series DataFrame into train, validation, and test sets. **Arguments** -- **df** (pandas.DataFrame): The time series DataFrame to be split. -- **split_option** (str): The split option to choose from: 'train_test_val' (default) or 'train_test'. -- **train_size** (float): The proportion of the dataset to include in the training set. Default is 0.6. -- **test_size** (float): The proportion of the dataset to include in the test set. Default is 0.2. +- `df` (pandas.DataFrame): The time series DataFrame to be split. +- `split_option` (str): The split option to choose from: 'train_test_val' (default) or 'train_test'. +- `train_size` (float): The proportion of the dataset to include in the training set. Default is 0.6. +- `test_size` (float): The proportion of the dataset to include in the test set. Default is 0.2. **Returns** @@ -53,6 +53,6 @@ Split a time series DataFrame into train, validation, and test sets. ::: {.signature} -def transform(df,transform_func = 'diff') +deftransform(df,transform_func = 'diff') ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index 3bf3268d4..d400e7023 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -23,7 +23,7 @@ The following base errors are defined for others: ::: {.signature} -class APIRequestError() +classAPIRequestError() ::: @@ -44,7 +44,7 @@ Generic error for API request errors that are not known. ::: {.signature} -class BaseError() +classBaseError() ::: @@ -58,7 +58,7 @@ Generic error for API request errors that are not known. ::: {.signature} -def description(self,args = (),kwargs = {}) +defdescription(args = (),\*\*kwargs = {}) ::: @@ -70,7 +70,7 @@ Generic error for API request errors that are not known. ::: {.signature} -class GetTestSuiteError() +classGetTestSuiteError() ::: @@ -91,7 +91,7 @@ When the test suite could not be found. ::: {.signature} -class InitializeTestSuiteError() +classInitializeTestSuiteError() ::: @@ -112,7 +112,7 @@ When the test suite was found but could not be initialized. ::: {.signature} -class InvalidAPICredentialsError() +classInvalidAPICredentialsError() ::: @@ -127,7 +127,7 @@ When the test suite was found but could not be initialized. ::: {.signature} -def description(self,args = (),kwargs = {}) +defdescription(args = (),\*\*kwargs = {}) ::: @@ -139,7 +139,7 @@ When the test suite was found but could not be initialized. ::: {.signature} -class InvalidContentIdPrefixError() +classInvalidContentIdPrefixError() ::: @@ -160,7 +160,7 @@ When an invalid text content_id is sent to the API. ::: {.signature} -class InvalidInputError() +classInvalidInputError() ::: @@ -181,7 +181,7 @@ When an invalid input object. ::: {.signature} -class InvalidMetricResultsError() +classInvalidMetricResultsError() ::: @@ -202,7 +202,7 @@ When an invalid metric results object is sent to the API. ::: {.signature} -class InvalidProjectError() +classInvalidProjectError() ::: @@ -217,7 +217,7 @@ When an invalid metric results object is sent to the API. ::: {.signature} -def description(self,args = (),kwargs = {}) +defdescription(args = (),\*\*kwargs = {}) ::: @@ -229,7 +229,7 @@ When an invalid metric results object is sent to the API. ::: {.signature} -class InvalidRequestBodyError() +classInvalidRequestBodyError() ::: @@ -250,7 +250,7 @@ When a POST/PUT request is made with an invalid request body. ::: {.signature} -class InvalidTestParametersError() +classInvalidTestParametersError() ::: @@ -271,7 +271,7 @@ When an invalid parameters for the test. ::: {.signature} -class InvalidTestResultsError() +classInvalidTestResultsError() ::: @@ -292,7 +292,7 @@ When an invalid test results object is sent to the API. ::: {.signature} -class InvalidTextObjectError() +classInvalidTextObjectError() ::: @@ -313,7 +313,7 @@ When an invalid Metadat (Text) object is sent to the API. ::: {.signature} -class InvalidValueFormatterError() +classInvalidValueFormatterError() ::: @@ -334,7 +334,7 @@ When an invalid value formatter is provided when serializing results. ::: {.signature} -class InvalidXGBoostTrainedModelError() +classInvalidXGBoostTrainedModelError() ::: @@ -355,7 +355,7 @@ When an invalid XGBoost trained model is used when calling init_r_model. ::: {.signature} -class LoadTestError() +classLoadTestError() ::: @@ -376,7 +376,7 @@ Exception raised when an error occurs while loading a test ::: {.signature} -class MismatchingClassLabelsError() +classMismatchingClassLabelsError() ::: @@ -397,7 +397,7 @@ When the class labels found in the dataset don't match the provided target label ::: {.signature} -class MissingAPICredentialsError() +classMissingAPICredentialsError() ::: @@ -412,7 +412,7 @@ When the class labels found in the dataset don't match the provided target label ::: {.signature} -def description(self,args = (),kwargs = {}) +defdescription(args = (),\*\*kwargs = {}) ::: @@ -424,7 +424,7 @@ When the class labels found in the dataset don't match the provided target label ::: {.signature} -class MissingCacheResultsArgumentsError() +classMissingCacheResultsArgumentsError() ::: @@ -445,7 +445,7 @@ When the cache_results function is missing arguments. ::: {.signature} -class MissingClassLabelError() +classMissingClassLabelError() ::: @@ -466,7 +466,7 @@ When the one or more class labels are missing from provided dataset targets. ::: {.signature} -class MissingDependencyError() +classMissingDependencyError() ::: @@ -487,7 +487,7 @@ When a required dependency is missing. ::: {.signature} -class MissingDocumentationTemplate() +classMissingDocumentationTemplate() ::: @@ -508,7 +508,7 @@ When the client config is missing the documentation template. ::: {.signature} -class MissingModelIdError() +classMissingModelIdError() ::: @@ -523,7 +523,7 @@ When the client config is missing the documentation template. ::: {.signature} -def description(self,args = (),kwargs = {}) +defdescription(args = (),\*\*kwargs = {}) ::: @@ -535,7 +535,7 @@ When the client config is missing the documentation template. ::: {.signature} -class MissingOrInvalidModelPredictFnError() +classMissingOrInvalidModelPredictFnError() ::: @@ -558,7 +558,7 @@ method does not have the expected arguments. ::: {.signature} -class MissingRequiredTestInputError() +classMissingRequiredTestInputError() ::: @@ -579,7 +579,7 @@ When a required test context variable is missing. ::: {.signature} -class MissingRExtrasError() +classMissingRExtrasError() ::: @@ -598,7 +598,7 @@ When the R extras have not been installed. ::: {.signature} -def description(self,args = (),kwargs = {}) +defdescription(args = (),\*\*kwargs = {}) ::: @@ -610,7 +610,7 @@ When the R extras have not been installed. ::: {.signature} -class MissingTextContentIdError() +classMissingTextContentIdError() ::: @@ -631,7 +631,7 @@ When a Text object is sent to the API without a content_id. ::: {.signature} -class MissingTextContentsError() +classMissingTextContentsError() ::: @@ -652,7 +652,7 @@ When a Text object is sent to the API without a "text" attribute. ::: {.signature} -class SkipTestError() +classSkipTestError() ::: @@ -673,7 +673,7 @@ Useful error to throw when a test cannot be executed. ::: {.signature} -class TestInputInvalidDatasetError() +classTestInputInvalidDatasetError() ::: @@ -694,7 +694,7 @@ When an invalid dataset is used in a test context. ::: {.signature} -class UnsupportedColumnTypeError() +classUnsupportedColumnTypeError() ::: @@ -715,7 +715,7 @@ When an unsupported column type is found on a dataset. ::: {.signature} -class UnsupportedDatasetError() +classUnsupportedDatasetError() ::: @@ -736,7 +736,7 @@ When an unsupported dataset is used. ::: {.signature} -class UnsupportedFigureError() +classUnsupportedFigureError() ::: @@ -757,7 +757,7 @@ When an unsupported figure object is constructed. ::: {.signature} -class UnsupportedModelError() +classUnsupportedModelError() ::: @@ -778,7 +778,7 @@ When an unsupported model is used. ::: {.signature} -class UnsupportedModelForSHAPError() +classUnsupportedModelForSHAPError() ::: @@ -799,7 +799,7 @@ When an unsupported model is used for SHAP importance. ::: {.signature} -class UnsupportedRModelError() +classUnsupportedRModelError() ::: @@ -820,7 +820,7 @@ When an unsupported R model is used. ::: {.signature} -def raise_api_error(error_string) +defraise_api_error(error_string) ::: @@ -838,7 +838,7 @@ returns a non-JSON string or if the API returns a non-standard error ::: {.signature} -def should_raise_on_fail_fast(error)bool +defshould_raise_on_fail_fast(error)bool ::: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 5e3ff8187..6cb83f600 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,7 +29,7 @@ Entrypoint for test suites. ::: {.signature} -def format_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +defformat_dataframe(df: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -43,7 +43,7 @@ Format a pandas DataFrame for display purposes ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -57,7 +57,7 @@ Get a logger for the given module name ::: {.signature} -def test_id_to_name(test_id:str)str +deftest_id_to_name(test_id: str)str ::: @@ -67,7 +67,7 @@ Convert a test ID to a human-readable name. **Arguments** -- **test_id** (str): The test identifier, typically in CamelCase or snake_case. +- `test_id` (str): The test identifier, typically in CamelCase or snake_case. **Returns** @@ -81,7 +81,7 @@ Convert a test ID to a human-readable name. ::: {.signature} -def describe_suite(test_suite_id:str,verbose = False) +defdescribe_suite(test_suite_id: str,verbose = False) ::: @@ -91,8 +91,8 @@ Describes a Test Suite by ID **Arguments** -- **test_suite_id**: Test Suite ID -- **verbose**: If True, describe all plans and tests in the Test Suite +- `test_suite_id`: Test Suite ID +- `verbose`: If True, describe all plans and tests in the Test Suite **Returns** @@ -106,7 +106,7 @@ Describes a Test Suite by ID ::: {.signature} -def get_by_id(test_suite_id:str) +defget_by_id(test_suite_id: str) ::: @@ -122,7 +122,7 @@ Returns the test suite by ID ::: {.signature} -def list_suites(pretty:bool = True) +deflist_suites(pretty: bool = True) ::: @@ -138,7 +138,7 @@ Returns a list of all available test suites ::: {.signature} -def register_test_suite(suite_id:str,suite:validmind.vm_models.TestSuite) +defregister_test_suite(suite_id: str,suite: validmind.vm_models.TestSuite) ::: @@ -154,7 +154,7 @@ Registers a custom test suite ::: {.signature} -class ClassifierDiagnosis() +classClassifierDiagnosis() ::: @@ -172,7 +172,7 @@ Test suite for sklearn classifier model diagnosis tests ::: {.signature} -class ClassifierFullSuite() +classClassifierFullSuite() ::: @@ -190,7 +190,7 @@ Full test suite for binary classification models. ::: {.signature} -class ClassifierMetrics() +classClassifierMetrics() ::: @@ -208,7 +208,7 @@ Test suite for sklearn classifier metrics ::: {.signature} -class ClassifierModelValidation() +classClassifierModelValidation() ::: @@ -226,7 +226,7 @@ Test suite for binary classification models. ::: {.signature} -class ClassifierPerformance() +classClassifierPerformance() ::: @@ -244,7 +244,7 @@ Test suite for sklearn classifier models ::: {.signature} -class ClusterFullSuite() +classClusterFullSuite() ::: @@ -262,7 +262,7 @@ Full test suite for clustering models. ::: {.signature} -class ClusterMetrics() +classClusterMetrics() ::: @@ -280,7 +280,7 @@ Test suite for sklearn clustering metrics ::: {.signature} -class ClusterPerformance() +classClusterPerformance() ::: @@ -298,7 +298,7 @@ Test suite for sklearn cluster performance ::: {.signature} -class EmbeddingsFullSuite() +classEmbeddingsFullSuite() ::: @@ -316,7 +316,7 @@ Full test suite for embeddings models. ::: {.signature} -class EmbeddingsMetrics() +classEmbeddingsMetrics() ::: @@ -334,7 +334,7 @@ Test suite for embeddings metrics ::: {.signature} -class EmbeddingsPerformance() +classEmbeddingsPerformance() ::: @@ -352,7 +352,7 @@ Test suite for embeddings model performance ::: {.signature} -class KmeansParametersOptimization() +classKmeansParametersOptimization() ::: @@ -370,7 +370,7 @@ Test suite for sklearn hyperparameters optimization ::: {.signature} -class LLMClassifierFullSuite() +classLLMClassifierFullSuite() ::: @@ -388,7 +388,7 @@ Full test suite for LLM classification models. ::: {.signature} -class NLPClassifierFullSuite() +classNLPClassifierFullSuite() ::: @@ -406,7 +406,7 @@ Full test suite for NLP classification models. ::: {.signature} -class PromptValidation() +classPromptValidation() ::: @@ -424,7 +424,7 @@ Test suite for prompt validation ::: {.signature} -class RegressionFullSuite() +classRegressionFullSuite() ::: @@ -442,7 +442,7 @@ Full test suite for regression models. ::: {.signature} -class RegressionMetrics() +classRegressionMetrics() ::: @@ -460,7 +460,7 @@ Test suite for performance metrics of regression metrics ::: {.signature} -class RegressionModelDescription() +classRegressionModelDescription() ::: @@ -478,7 +478,7 @@ Test suite for performance metric of regression model of statsmodels library ::: {.signature} -class RegressionModelsEvaluation() +classRegressionModelsEvaluation() ::: @@ -496,7 +496,7 @@ Test suite for metrics comparison of regression model of statsmodels library ::: {.signature} -class RegressionPerformance() +classRegressionPerformance() ::: @@ -514,7 +514,7 @@ Test suite for regression model performance ::: {.signature} -class SummarizationMetrics() +classSummarizationMetrics() ::: @@ -532,7 +532,7 @@ Test suite for Summarization metrics ::: {.signature} -class TabularDataQuality() +classTabularDataQuality() ::: @@ -550,7 +550,7 @@ Test suite for data quality on tabular datasets ::: {.signature} -class TabularDataset() +classTabularDataset() ::: @@ -568,7 +568,7 @@ Test suite for tabular datasets. ::: {.signature} -class TabularDatasetDescription() +classTabularDatasetDescription() ::: @@ -588,7 +588,7 @@ statistics from a tabular dataset ::: {.signature} -class TextDataQuality() +classTextDataQuality() ::: @@ -606,7 +606,7 @@ Test suite for data quality on text data ::: {.signature} -class TimeSeriesDataQuality() +classTimeSeriesDataQuality() ::: @@ -624,7 +624,7 @@ Test suite for data quality on time series datasets ::: {.signature} -class TimeSeriesDataset() +classTimeSeriesDataset() ::: @@ -642,7 +642,7 @@ Test suite for time series datasets. ::: {.signature} -class TimeSeriesModelValidation() +classTimeSeriesModelValidation() ::: @@ -660,7 +660,7 @@ Test suite for time series model validation. ::: {.signature} -class TimeSeriesMultivariate() +classTimeSeriesMultivariate() ::: @@ -680,7 +680,7 @@ and relationship in multivariate dataset. It presents various multivariate visua ::: {.signature} -class TimeSeriesUnivariate() +classTimeSeriesUnivariate() ::: diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index 08ac5a799..5fbff7d7d 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -20,7 +20,7 @@ Ideal setup is to have the API client to read a custom test suite from the proje ::: {.signature} -class ClassifierDiagnosis() +classClassifierDiagnosis() ::: @@ -38,7 +38,7 @@ Test suite for sklearn classifier model diagnosis tests ::: {.signature} -class ClassifierFullSuite() +classClassifierFullSuite() ::: @@ -56,7 +56,7 @@ Full test suite for binary classification models. ::: {.signature} -class ClassifierMetrics() +classClassifierMetrics() ::: @@ -74,7 +74,7 @@ Test suite for sklearn classifier metrics ::: {.signature} -class ClassifierModelValidation() +classClassifierModelValidation() ::: @@ -92,7 +92,7 @@ Test suite for binary classification models. ::: {.signature} -class ClassifierPerformance() +classClassifierPerformance() ::: @@ -110,7 +110,7 @@ Test suite for sklearn classifier models ::: {.signature} -class TabularDataQuality() +classTabularDataQuality() ::: @@ -128,7 +128,7 @@ Test suite for data quality on tabular datasets ::: {.signature} -class TabularDatasetDescription() +classTabularDatasetDescription() ::: diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index e717b59ef..7c8a71bf5 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -20,7 +20,7 @@ Ideal setup is to have the API client to read a custom test suite from the proje ::: {.signature} -class ClusterFullSuite() +classClusterFullSuite() ::: @@ -38,7 +38,7 @@ Full test suite for clustering models. ::: {.signature} -class ClusterMetrics() +classClusterMetrics() ::: @@ -56,7 +56,7 @@ Test suite for sklearn clustering metrics ::: {.signature} -class ClusterPerformance() +classClusterPerformance() ::: @@ -74,7 +74,7 @@ Test suite for sklearn cluster performance ::: {.signature} -class KmeansParametersOptimization() +classKmeansParametersOptimization() ::: diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index 45e6ede7b..d0156bc38 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -20,7 +20,7 @@ Ideal setup is to have the API client to read a custom test suite from the proje ::: {.signature} -class EmbeddingsFullSuite() +classEmbeddingsFullSuite() ::: @@ -38,7 +38,7 @@ Full test suite for embeddings models. ::: {.signature} -class EmbeddingsMetrics() +classEmbeddingsMetrics() ::: @@ -56,7 +56,7 @@ Test suite for embeddings metrics ::: {.signature} -class EmbeddingsPerformance() +classEmbeddingsPerformance() ::: diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index 22fafaebe..f4942f021 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -18,7 +18,7 @@ Test suites for LLMs ::: {.signature} -class LLMClassifierFullSuite() +classLLMClassifierFullSuite() ::: @@ -36,7 +36,7 @@ Full test suite for LLM classification models. ::: {.signature} -class PromptValidation() +classPromptValidation() ::: @@ -54,7 +54,7 @@ Test suite for prompt validation ::: {.signature} -class ClassifierDiagnosis() +classClassifierDiagnosis() ::: @@ -72,7 +72,7 @@ Test suite for sklearn classifier model diagnosis tests ::: {.signature} -class ClassifierMetrics() +classClassifierMetrics() ::: @@ -90,7 +90,7 @@ Test suite for sklearn classifier metrics ::: {.signature} -class ClassifierPerformance() +classClassifierPerformance() ::: @@ -108,7 +108,7 @@ Test suite for sklearn classifier models ::: {.signature} -class TextDataQuality() +classTextDataQuality() ::: diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index e61bd41d5..e034231ca 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -18,7 +18,7 @@ Test suites for NLP models ::: {.signature} -class NLPClassifierFullSuite() +classNLPClassifierFullSuite() ::: @@ -36,7 +36,7 @@ Full test suite for NLP classification models. ::: {.signature} -class ClassifierDiagnosis() +classClassifierDiagnosis() ::: @@ -54,7 +54,7 @@ Test suite for sklearn classifier model diagnosis tests ::: {.signature} -class ClassifierMetrics() +classClassifierMetrics() ::: @@ -72,7 +72,7 @@ Test suite for sklearn classifier metrics ::: {.signature} -class ClassifierPerformance() +classClassifierPerformance() ::: @@ -90,7 +90,7 @@ Test suite for sklearn classifier models ::: {.signature} -class TextDataQuality() +classTextDataQuality() ::: diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index 4c3f7c849..13d550470 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -20,7 +20,7 @@ Ideal setup is to have the API client to read a custom test suite from the proje ::: {.signature} -class KmeansParametersOptimization() +classKmeansParametersOptimization() ::: diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index 2e84f5cd8..8ab5ffb8f 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -class RegressionFullSuite() +classRegressionFullSuite() ::: @@ -32,7 +32,7 @@ Full test suite for regression models. ::: {.signature} -class RegressionMetrics() +classRegressionMetrics() ::: @@ -50,7 +50,7 @@ Test suite for performance metrics of regression metrics ::: {.signature} -class RegressionPerformance() +classRegressionPerformance() ::: @@ -68,7 +68,7 @@ Test suite for regression model performance ::: {.signature} -class TabularDataQuality() +classTabularDataQuality() ::: @@ -86,7 +86,7 @@ Test suite for data quality on tabular datasets ::: {.signature} -class TabularDatasetDescription() +classTabularDatasetDescription() ::: diff --git a/docs/validmind/test_suites/statsmodels_timeseries.qmd b/docs/validmind/test_suites/statsmodels_timeseries.qmd index 13b926388..c8724165c 100644 --- a/docs/validmind/test_suites/statsmodels_timeseries.qmd +++ b/docs/validmind/test_suites/statsmodels_timeseries.qmd @@ -18,7 +18,7 @@ Time Series Test Suites from statsmodels ::: {.signature} -class RegressionModelDescription() +classRegressionModelDescription() ::: @@ -36,7 +36,7 @@ Test suite for performance metric of regression model of statsmodels library ::: {.signature} -class RegressionModelsEvaluation() +classRegressionModelsEvaluation() ::: diff --git a/docs/validmind/test_suites/summarization.qmd b/docs/validmind/test_suites/summarization.qmd index 00b8f8241..67fb4a1c7 100644 --- a/docs/validmind/test_suites/summarization.qmd +++ b/docs/validmind/test_suites/summarization.qmd @@ -18,7 +18,7 @@ Test suites for llm summarization models ::: {.signature} -class SummarizationMetrics() +classSummarizationMetrics() ::: diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd index 4266a0e54..fd029155a 100644 --- a/docs/validmind/test_suites/tabular_datasets.qmd +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -18,7 +18,7 @@ Test suites for tabular datasets ::: {.signature} -class TabularDataQuality() +classTabularDataQuality() ::: @@ -36,7 +36,7 @@ Test suite for data quality on tabular datasets ::: {.signature} -class TabularDataset() +classTabularDataset() ::: @@ -54,7 +54,7 @@ Test suite for tabular datasets. ::: {.signature} -class TabularDatasetDescription() +classTabularDatasetDescription() ::: diff --git a/docs/validmind/test_suites/text_data.qmd b/docs/validmind/test_suites/text_data.qmd index 489476fdd..829ea57b5 100644 --- a/docs/validmind/test_suites/text_data.qmd +++ b/docs/validmind/test_suites/text_data.qmd @@ -18,7 +18,7 @@ Test suites for text datasets ::: {.signature} -class TextDataQuality() +classTextDataQuality() ::: diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index d2f74d68a..3af2135a7 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -18,7 +18,7 @@ Time Series Test Suites ::: {.signature} -class TimeSeriesDataQuality() +classTimeSeriesDataQuality() ::: @@ -36,7 +36,7 @@ Test suite for data quality on time series datasets ::: {.signature} -class TimeSeriesDataset() +classTimeSeriesDataset() ::: @@ -54,7 +54,7 @@ Test suite for time series datasets. ::: {.signature} -class TimeSeriesModelValidation() +classTimeSeriesModelValidation() ::: @@ -72,7 +72,7 @@ Test suite for time series model validation. ::: {.signature} -class TimeSeriesMultivariate() +classTimeSeriesMultivariate() ::: @@ -92,7 +92,7 @@ and relationship in multivariate dataset. It presents various multivariate visua ::: {.signature} -class TimeSeriesUnivariate() +classTimeSeriesUnivariate() ::: @@ -114,7 +114,7 @@ The raw time series data provides a visual inspection of the target variable's b ::: {.signature} -class RegressionModelDescription() +classRegressionModelDescription() ::: @@ -132,7 +132,7 @@ Test suite for performance metric of regression model of statsmodels library ::: {.signature} -class RegressionModelsEvaluation() +classRegressionModelsEvaluation() ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index ec2562998..662c820d2 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -20,7 +20,7 @@ ValidMind Tests Module ::: {.signature} -def describe_test(test_id:validmind.vm_models.TestID = None,raw:bool = False,show:bool = True) +defdescribe_test(test_id: validmind.vm_models.TestID = None,raw: bool = False,show: bool = True) ::: @@ -32,8 +32,8 @@ This function can be used to see test details including the test name, descripti **Arguments** -- **test_id** (str, optional): The test ID. Defaults to None. -- **raw** (bool): If True, returns a dictionary with the test details. Defaults to False. +- `test_id` (str, optional): The test ID. Defaults to None. +- `raw` (bool): If True, returns a dictionary with the test details. Defaults to False. ## list_tags() @@ -41,7 +41,7 @@ This function can be used to see test details including the test name, descripti ::: {.signature} -def list_tags() +deflist_tags() ::: @@ -55,7 +55,7 @@ List unique tags from all test classes. ::: {.signature} -def list_tasks() +deflist_tasks() ::: @@ -69,7 +69,7 @@ List unique tasks from all test classes. ::: {.signature} -def list_tasks_and_tags(as_json = False) +deflist_tasks_and_tags(as_json = False) ::: @@ -89,7 +89,7 @@ all tags for a task type in one row. ::: {.signature} -def list_tests(filter = None,task = None,tags = None,pretty = True,truncate = True) +deflist_tests(filter = None,task = None,tags = None,pretty = True,truncate = True) ::: @@ -99,11 +99,11 @@ List all tests in the tests directory. **Arguments** -- **filter** (str): Find tests where the ID, tasks or tags match the filter string. Defaults to None. -- **task** (str): Find tests that match the task. Can be used to narrow down matches from the filter string. Defaults to None. -- **tags** (list): Find tests that match list of tags. Can be used to narrow down matches from the filter string. Defaults to None. -- **pretty** (bool): If True, returns a pandas DataFrame with a formatted table. Defaults to True. -- **truncate** (bool): If True, truncates the test description to the first line. Defaults to True. (only used if pretty=True) +- `filter` (str): Find tests where the ID, tasks or tags match the filter string. Defaults to None. +- `task` (str): Find tests that match the task. Can be used to narrow down matches from the filter string. Defaults to None. +- `tags` (list): Find tests that match list of tags. Can be used to narrow down matches from the filter string. Defaults to None. +- `pretty` (bool): If True, returns a pandas DataFrame with a formatted table. Defaults to True. +- `truncate` (bool): If True, truncates the test description to the first line. Defaults to True. (only used if pretty=True) **Returns** @@ -115,7 +115,7 @@ List all tests in the tests directory. ::: {.signature} -def load_test(test_id:str,test_func:validmind.vm_models.callable = None,reload:bool = False) +defload_test(test_id: str,test_func: callable = None,reload: bool = False) ::: @@ -127,8 +127,8 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. **Arguments** -- **test_id** (str): The test ID in the format `namespace.path_to_module.TestName[:tag]` -- **test_func** (callable): The test function to load. If not provided, the test will be loaded from the test provider. Defaults to None. +- `test_id` (str): The test ID in the format `namespace.path_to_module.TestName[:tag]` +- `test_func` (callable): The test function to load. If not provided, the test will be loaded from the test provider. Defaults to None. ## run_test() @@ -136,7 +136,7 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. ::: {.signature} -def run_test(test_id:Union\[validmind.vm_models.TestID, None \] = None,name:Union\[str, None \] = None,unit_metrics:Union\[List\[validmind.vm_models.TestID\], None \] = None,inputs:Union\[Dict\[str, Any\], None \] = None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None \] = None,params:Union\[Dict\[str, Any\], None \] = None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None \] = None,show:bool = True,generate_description:bool = True,title:Optional\[str\] = None,post_process_fn:Union\[Callable\[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, None \], None \] = None,kwargs = {})validmind.vm_models.TestResult +defrun_test(test_id: Union\[validmind.vm_models.TestID, None\] = None,name: Union\[str, None\] = None,unit_metrics: Union\[List\[validmind.vm_models.TestID\], None\] = None,inputs: Union\[Dict\[str, Any\], None\] = None,input_grid: Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\] = None,params: Union\[Dict\[str, Any\], None\] = None,param_grid: Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\] = None,show: bool = True,generate_description: bool = True,title: Optional\[str\] = None,post_process_fn: Union\[Callable\[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, None\], None\] = None,\*\*kwargs = {})validmind.vm_models.TestResult ::: @@ -148,21 +148,21 @@ This function is the main entry point for running tests. It can run simple unit **Arguments** -- **test_id** (TestID): Test ID to run. Not required if `name` and `unit_metrics` provided. -- **params** (dict): Parameters to customize test behavior. See test details for available parameters. -- **param_grid** (Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\]): For comparison tests, either: +- `test_id` (TestID): Test ID to run. Not required if `name` and `unit_metrics` provided. +- `params` (dict): Parameters to customize test behavior. See test details for available parameters. +- `param_grid` (Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\]): For comparison tests, either: - Dict mapping parameter names to lists of values (creates Cartesian product) - List of parameter dictionaries to test -- **inputs** (Dict[str, Any]): Test inputs (models/datasets initialized with vm.init_model/dataset) -- **input_grid** (Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\]): For comparison tests, either: +- `inputs` (Dict[str, Any]): Test inputs (models/datasets initialized with vm.init_model/dataset) +- `input_grid` (Union\[Dict\[str, List[Any]\], List\[Dict[str, Any]\]\]): For comparison tests, either: - Dict mapping input names to lists of values (creates Cartesian product) - List of input dictionaries to test -- **name** (str): Test name (required for composite metrics) -- **unit_metrics** (list): Unit metric IDs to run as composite metric -- **show** (bool): Whether to display results. Defaults to True. -- **generate_description** (bool): Whether to generate a description. Defaults to True. -- **title** (str): Custom title for the test result -- **post_process_fn** (Callable\[[TestResult], None\]): Function to post-process the test result +- `name` (str): Test name (required for composite metrics) +- `unit_metrics` (list): Unit metric IDs to run as composite metric +- `show` (bool): Whether to display results. Defaults to True. +- `generate_description` (bool): Whether to generate a description. Defaults to True. +- `title` (str): Custom title for the test result +- `post_process_fn` (Callable\[[TestResult], None\]): Function to post-process the test result **Returns** @@ -170,8 +170,8 @@ This function is the main entry point for running tests. It can run simple unit **Raises** -- **ValueError**: If the test inputs are invalid -- **LoadTestError**: If the test class fails to load +- `ValueError`: If the test inputs are invalid +- `LoadTestError`: If the test class fails to load ## tags() @@ -179,7 +179,7 @@ This function is the main entry point for running tests. It can run simple unit ::: {.signature} -def tags(tags = ()) +deftags(tags = ()) ::: @@ -189,7 +189,7 @@ Decorator for specifying tags for a test. **Arguments** -- \***tags**: The tags to apply to the test. +- `*tags`: The tags to apply to the test. ## tasks() @@ -197,7 +197,7 @@ Decorator for specifying tags for a test. ::: {.signature} -def tasks(tasks = ()) +deftasks(tasks = ()) ::: @@ -207,7 +207,7 @@ Decorator for specifying the task types that a test is designed for. **Arguments** -- \***tasks**: The task types that the test is designed for. +- `*tasks`: The task types that the test is designed for. ## test() @@ -215,7 +215,7 @@ Decorator for specifying the task types that a test is designed for. ::: {.signature} -def test(func_or_id) +deftest(func_or_id) ::: @@ -241,8 +241,8 @@ The function may also include a docstring. This docstring will be used and logge **Arguments** -- **func**: The function to decorate -- **test_id**: The identifier for the metric. If not provided, the function name is used. +- `func`: The function to decorate +- `test_id`: The identifier for the metric. If not provided, the function name is used. **Returns** @@ -256,7 +256,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -def register_test_provider(namespace:str,test_provider:validmind.vm_models.TestProvider) None +defregister_test_provider(namespace: str,test_provider: validmind.vm_models.TestProvider)None ::: @@ -266,8 +266,8 @@ Register an external test provider **Arguments** -- **namespace** (str): The namespace of the test provider -- **test_provider** (TestProvider): The test provider +- `namespace` (str): The namespace of the test provider +- `test_provider` (TestProvider): The test provider @@ -277,7 +277,7 @@ Register an external test provider ::: {.signature} -class LoadTestError() +classLoadTestError() ::: @@ -298,7 +298,7 @@ Exception raised when an error occurs while loading a test ::: {.signature} -class LocalTestProvider() +classLocalTestProvider() ::: @@ -331,7 +331,7 @@ test = test_provider.load_test("my_namespace.my_test_class") **Arguments** -- **root_folder** (str): The root directory for local tests. +- `root_folder` (str): The root directory for local tests. ### [list_tests[()]{.muted}](#list_tests) @@ -339,7 +339,7 @@ test = test_provider.load_test("my_namespace.my_test_class") ::: {.signature} -def list_tests(self) +deflist_tests() ::: @@ -357,7 +357,7 @@ List all tests in the given namespace ::: {.signature} -def load_test(self,test_id:str) +defload_test(test_id: str) ::: @@ -367,7 +367,7 @@ Load the test identified by the given test_id. **Arguments** -- **test_id** (str): The identifier of the test. This corresponds to the relative path of the python file from the root folder, with slashes replaced by dots +- `test_id` (str): The identifier of the test. This corresponds to the relative path of the python file from the root folder, with slashes replaced by dots **Returns** @@ -375,8 +375,8 @@ Load the test identified by the given test_id. **Raises** -- **LocalTestProviderLoadModuleError**: If the test module cannot be imported -- **LocalTestProviderLoadTestError**: If the test class cannot be found in the module +- `LocalTestProviderLoadModuleError`: If the test module cannot be imported +- `LocalTestProviderLoadTestError`: If the test class cannot be found in the module @@ -386,7 +386,7 @@ Load the test identified by the given test_id. ::: {.signature} -class TestProvider() +classTestProvider() ::: @@ -402,7 +402,7 @@ Protocol for user-defined test providers ::: {.signature} -def list_tests(self)List\[str\] +deflist_tests()List\[str\] ::: @@ -420,7 +420,7 @@ List all tests in the given namespace ::: {.signature} -def load_test(self,test_id:str)validmind.vm_models.callable +defload_test(test_id: str)callable ::: @@ -430,7 +430,7 @@ Load the test function identified by the given test_id **Arguments** -- **test_id** (str): The test ID (does not contain the namespace under which the test is registered) +- `test_id` (str): The test ID (does not contain the namespace under which the test is registered) **Returns** @@ -438,4 +438,4 @@ Load the test function identified by the given test_id **Raises** -- **FileNotFoundError**: If the test is not found +- `FileNotFoundError`: If the test is not found diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 409b026f8..373433208 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ACFandPACFPlot(dataset:validmind.vm_models.VMDataset) +defACFandPACFPlot(dataset: validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 82d248df7..2574ba33e 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def ADF(dataset:validmind.vm_models.VMDataset) +defADF(dataset: validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 888b07684..a15cf9fcd 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def AutoAR(dataset:validmind.vm_models.VMDataset,max_ar_order:int = 3) +defAutoAR(dataset: validmind.vm_models.VMDataset,max_ar_order: int = 3) ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index 0e0664765..3f562e1ec 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def AutoMA(dataset:validmind.vm_models.VMDataset,max_ma_order:int = 3) +defAutoMA(dataset: validmind.vm_models.VMDataset,max_ma_order: int = 3) ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index e787e2317..18f8ea9f4 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def AutoStationarity(dataset:validmind.vm_models.VMDataset,max_order:int = 5,threshold:float = 0.05) +defAutoStationarity(dataset: validmind.vm_models.VMDataset,max_order: int = 5,threshold: float = 0.05) ::: diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 86e7210b2..708a7b00d 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def BivariateScatterPlots(dataset) +defBivariateScatterPlots(dataset) ::: diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index 707ef0662..abdc38095 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def BoxPierce(dataset) +defBoxPierce(dataset) ::: diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 9b39a289d..66fc14893 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ChiSquaredFeaturesTable(dataset,p_threshold = 0.05) +defChiSquaredFeaturesTable(dataset,p_threshold = 0.05) ::: @@ -56,7 +56,7 @@ The function creates a contingency table for each categorical feature and the ta ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 1c217c5b3..19f6b7034 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -def ClassImbalance(dataset:validmind.vm_models.VMDataset,min_percent_threshold:int = 10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\] +defClassImbalance(dataset: validmind.vm_models.VMDataset,min_percent_threshold: int = 10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\] ::: @@ -64,7 +64,7 @@ This Class Imbalance test operates by calculating the frequency (expressed as a ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 966ebfbf8..aa7b74301 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def DatasetDescription(dataset:validmind.vm_models.VMDataset) +defDatasetDescription(dataset: validmind.vm_models.VMDataset) ::: @@ -74,7 +74,7 @@ The DatasetDescription class accomplishes the purpose as follows: firstly, the t ::: {.signature} -def describe_column(df,column) +defdescribe_column(df,column) ::: @@ -90,7 +90,7 @@ Gets descriptive statistics for a single column in a Pandas DataFrame. ::: {.signature} -def get_column_histograms(df,column,type\_) +defget_column_histograms(df,column,type\_) ::: @@ -110,7 +110,7 @@ Will be used in favor of \_get_histogram in the future ::: {.signature} -def get_numerical_histograms(df,column) +defget_numerical_histograms(df,column) ::: @@ -128,7 +128,7 @@ with a different bin size ::: {.signature} -def infer_datatypes(df) +definfer_datatypes(df) ::: @@ -140,7 +140,7 @@ with a different bin size ::: {.signature} -class UnsupportedColumnTypeError() +classUnsupportedColumnTypeError() ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 9dd882d8c..3648c3f7e 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def DatasetSplit(datasets:List\[validmind.vm_models.VMDataset\]) +defDatasetSplit(datasets: List\[validmind.vm_models.VMDataset\]) ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 96b78f7b6..3897e3ad7 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def format_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict\[str, Any\]\] +defformat_records(df: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict\[str, Any\]\] ::: @@ -36,7 +36,7 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -def DescriptiveStatistics(dataset:validmind.vm_models.VMDataset) +defDescriptiveStatistics(dataset: validmind.vm_models.VMDataset) ::: @@ -80,7 +80,7 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des ::: {.signature} -def get_summary_statistics_categorical(df,categorical_fields) +defget_summary_statistics_categorical(df,categorical_fields) ::: @@ -92,7 +92,7 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des ::: {.signature} -def get_summary_statistics_numerical(df,numerical_fields) +defget_summary_statistics_numerical(df,numerical_fields) ::: @@ -104,7 +104,7 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 384561c5d..8a52b82f9 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def DickeyFullerGLS(dataset:validmind.vm_models.VMDataset) +defDickeyFullerGLS(dataset: validmind.vm_models.VMDataset) ::: @@ -68,7 +68,7 @@ This code implements the Dickey-Fuller GLS unit root test on each attribute of t ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index baf8cf636..5b0120de6 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Duplicates(dataset,min_threshold = 1) +defDuplicates(dataset,min_threshold = 1) ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 7521d2985..f43bd8b11 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def EngleGrangerCoint(dataset:validmind.vm_models.VMDataset,threshold:float = 0.05) +defEngleGrangerCoint(dataset: validmind.vm_models.VMDataset,threshold: float = 0.05) ::: @@ -54,7 +54,7 @@ The test first drops any non-applicable values from the input dataset and then i ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index ab8df7130..a81f90d52 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def FeatureTargetCorrelationPlot(dataset,fig_height = 600) +defFeatureTargetCorrelationPlot(dataset,fig_height = 600) ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 96bbca8d2..1b67878ed 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def HighCardinality(dataset:validmind.vm_models.VMDataset,num_threshold:int = 100,percent_threshold:float = 0.1,threshold_type:str = 'percent') +defHighCardinality(dataset: validmind.vm_models.VMDataset,num_threshold: int = 100,percent_threshold: float = 0.1,threshold_type: str = 'percent') ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 427d53d3d..6eecc1b3b 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def HighPearsonCorrelation(dataset:validmind.vm_models.VMDataset,max_threshold:float = 0.3,top_n_correlations:int = 10,feature_columns:list = None) +defHighPearsonCorrelation(dataset: validmind.vm_models.VMDataset,max_threshold: float = 0.3,top_n_correlations: int = 10,feature_columns: list = None) ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 52c39a6b4..c9c79d05d 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def compute_outliers(series,threshold) +defcompute_outliers(series,threshold) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def IQROutliersBarPlot(dataset:validmind.vm_models.VMDataset,threshold:float = 1.5,fig_width:int = 800) +defIQROutliersBarPlot(dataset: validmind.vm_models.VMDataset,threshold: float = 1.5,fig_width: int = 800) ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 8aa922a38..78eae850b 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def compute_outliers(series,threshold = 1.5) +defcompute_outliers(series,threshold = 1.5) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def IQROutliersTable(dataset:validmind.vm_models.VMDataset,threshold:float = 1.5) +defIQROutliersTable(dataset: validmind.vm_models.VMDataset,threshold: float = 1.5) ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index 6ff0099f6..e01c68333 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def IsolationForestOutliers(dataset:validmind.vm_models.VMDataset,random_state:int = 0,contamination:float = 0.1,feature_columns:list = None) +defIsolationForestOutliers(dataset: validmind.vm_models.VMDataset,random_state: int = 0,contamination: float = 0.1,feature_columns: list = None) ::: diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index 436237968..570f931c0 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def JarqueBera(dataset) +defJarqueBera(dataset) ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 4b001cd18..940191977 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def KPSS(dataset:validmind.vm_models.VMDataset) +defKPSS(dataset: validmind.vm_models.VMDataset) ::: @@ -68,7 +68,7 @@ This test calculates the KPSS score for each feature in the dataset. The KPSS sc ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 0b6ed94ae..4cc8755af 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def LJungBox(dataset) +defLJungBox(dataset) ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index d6219299c..9ccb72d04 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def LaggedCorrelationHeatmap(dataset:validmind.vm_models.VMDataset,num_lags:int = 10) +defLaggedCorrelationHeatmap(dataset: validmind.vm_models.VMDataset,num_lags: int = 10) ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 37c8c41f6..b96021a07 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MissingValues(dataset:validmind.vm_models.VMDataset,min_threshold:int = 1) +defMissingValues(dataset: validmind.vm_models.VMDataset,min_threshold: int = 1) ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 2ca4f04b6..d976e032f 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MissingValuesBarPlot(dataset:validmind.vm_models.VMDataset,threshold:int = 80,fig_height:int = 600) +defMissingValuesBarPlot(dataset: validmind.vm_models.VMDataset,threshold: int = 80,fig_height: int = 600) ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 6dcbc97ef..ceac2ed51 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MutualInformation(dataset:validmind.vm_models.VMDataset,min_threshold:float = 0.01,task:str = 'classification') +defMutualInformation(dataset: validmind.vm_models.VMDataset,min_threshold: float = 0.01,task: str = 'classification') ::: diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index 97d169fb3..673750693 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def PearsonCorrelationMatrix(dataset) +defPearsonCorrelationMatrix(dataset) ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 924c8ad25..210a363c4 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def PhillipsPerronArch(dataset:validmind.vm_models.VMDataset) +defPhillipsPerronArch(dataset: validmind.vm_models.VMDataset) ::: @@ -74,7 +74,7 @@ The PP test is conducted for each feature in the dataset as follows: ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 288ff0296..978a3469b 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def ProtectedClassesCombination(dataset,model,protected_classes = None) +defProtectedClassesCombination(dataset,model,protected_classes = None) ::: @@ -74,7 +74,7 @@ The test performs the following steps: ::: {.signature} -class MissingDependencyError() +classMissingDependencyError() ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index 0d718b3aa..e63376f66 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def ProtectedClassesDescription(dataset,protected_classes = None) +defProtectedClassesDescription(dataset,protected_classes = None) ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index b7c2da73f..2eea6b4a3 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def ProtectedClassesDisparity(dataset,model,protected_classes = None,disparity_tolerance = 1.25,metrics = {'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}) +defProtectedClassesDisparity(dataset,model,protected_classes = None,disparity_tolerance = 1.25,metrics = {'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}) ::: @@ -76,7 +76,7 @@ The test performs the following steps: ::: {.signature} -class MissingDependencyError() +classMissingDependencyError() ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index d8959e2a8..425472f2c 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def calculate_fairness_metrics(test_df,target,y_pred_opt,protected_classes) +defcalculate_fairness_metrics(test_df,target,y_pred_opt,protected_classes) ::: @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -def calculate_group_metrics(test_df,target,y_pred_opt,protected_classes) +defcalculate_group_metrics(test_df,target,y_pred_opt,protected_classes) ::: @@ -52,7 +52,7 @@ Get a logger for the given module name ::: {.signature} -def get_thresholds_by_group(threshold_optimizer) +defget_thresholds_by_group(threshold_optimizer) ::: @@ -64,7 +64,7 @@ Get a logger for the given module name ::: {.signature} -def initialize_and_fit_optimizer(pipeline,X_train,y_train,protected_classes_df) +definitialize_and_fit_optimizer(pipeline,X_train,y_train,protected_classes_df) ::: @@ -76,7 +76,7 @@ Get a logger for the given module name ::: {.signature} -def make_predictions(threshold_optimizer,test_df,protected_classes) +defmake_predictions(threshold_optimizer,test_df,protected_classes) ::: @@ -88,7 +88,7 @@ Get a logger for the given module name ::: {.signature} -def plot_thresholds(threshold_optimizer) +defplot_thresholds(threshold_optimizer) ::: @@ -100,7 +100,7 @@ Get a logger for the given module name ::: {.signature} -def ProtectedClassesThresholdOptimizer(dataset,pipeline = None,protected_classes = None,X_train = None,y_train = None) +defProtectedClassesThresholdOptimizer(dataset,pipeline = None,protected_classes = None,X_train = None,y_train = None) ::: @@ -147,7 +147,7 @@ The test uses Fairlearn's ThresholdOptimizer to: ::: {.signature} -class MissingDependencyError() +classMissingDependencyError() ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index c3186c830..d0657780f 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def plot_rolling_statistics(df,col,window_size) +defplot_rolling_statistics(df,col,window_size) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def RollingStatsPlot(dataset:validmind.vm_models.VMDataset,window_size:int = 12) +defRollingStatsPlot(dataset: validmind.vm_models.VMDataset,window_size: int = 12) ::: @@ -71,7 +71,7 @@ This mechanism is comprised of two steps. Initially, the rolling mean and standa ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 8b7c6014e..5d37fe55a 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def RunsTest(dataset) +defRunsTest(dataset) ::: diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 0846d99d4..469d18731 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ScatterPlot(dataset) +defScatterPlot(dataset) ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 7aa167f6d..42092a96d 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ScoreBandDefaultRates(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,score_column:str = 'score',score_bands:list = None) +defScoreBandDefaultRates(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,score_column: str = 'score',score_bands: list = None) ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 8998e11e6..93f9ad4d7 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def SeasonalDecompose(dataset:validmind.vm_models.VMDataset,seasonal_model:str = 'additive') +defSeasonalDecompose(dataset: validmind.vm_models.VMDataset,seasonal_model: str = 'additive') ::: @@ -70,7 +70,7 @@ The testing process leverages the `seasonal_decompose` function from the `statsm ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 17d59360c..0769dd8ed 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ShapiroWilk(dataset) +defShapiroWilk(dataset) ::: diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index ef7212f73..17d988eb1 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Skewness(dataset,max_threshold = 1) +defSkewness(dataset,max_threshold = 1) ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 7abc8bded..91f7ff51c 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def SpreadPlot(dataset:validmind.vm_models.VMDataset) +defSpreadPlot(dataset: validmind.vm_models.VMDataset) ::: @@ -60,7 +60,7 @@ The SpreadPlot test computes and represents the spread between each pair of time ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 9f55b919d..5774f4f87 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TabularCategoricalBarPlots(dataset:validmind.vm_models.VMDataset) +defTabularCategoricalBarPlots(dataset: validmind.vm_models.VMDataset) ::: @@ -55,7 +55,7 @@ The provided dataset is first checked to determine if it contains any categorica ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index aaf689289..80a2d76c1 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TabularDateTimeHistograms(dataset:validmind.vm_models.VMDataset) +defTabularDateTimeHistograms(dataset: validmind.vm_models.VMDataset) ::: @@ -58,7 +58,7 @@ This test operates by first identifying all datetime columns and extracting them ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index bc6ee8922..d32a40e22 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def get_categorical_columns(dataset) +defget_categorical_columns(dataset) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def get_datetime_columns(dataset) +defget_datetime_columns(dataset) ::: @@ -38,7 +38,7 @@ toc-expand: 4 ::: {.signature} -def get_numerical_columns(dataset) +defget_numerical_columns(dataset) ::: @@ -50,7 +50,7 @@ toc-expand: 4 ::: {.signature} -def get_summary_statistics_categorical(dataset,categorical_fields) +defget_summary_statistics_categorical(dataset,categorical_fields) ::: @@ -62,7 +62,7 @@ toc-expand: 4 ::: {.signature} -def get_summary_statistics_datetime(dataset,datetime_fields) +defget_summary_statistics_datetime(dataset,datetime_fields) ::: @@ -74,7 +74,7 @@ toc-expand: 4 ::: {.signature} -def get_summary_statistics_numerical(dataset,numerical_fields) +defget_summary_statistics_numerical(dataset,numerical_fields) ::: @@ -86,7 +86,7 @@ toc-expand: 4 ::: {.signature} -def TabularDescriptionTables(dataset) +defTabularDescriptionTables(dataset) ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index f5261a8aa..28e145997 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TabularNumericalHistograms(dataset:validmind.vm_models.VMDataset) +defTabularNumericalHistograms(dataset: validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 3e270d1fd..c495463c3 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TargetRateBarPlots(dataset:validmind.vm_models.VMDataset) +defTargetRateBarPlots(dataset: validmind.vm_models.VMDataset) ::: @@ -54,7 +54,7 @@ The test involves creating a pair of bar plots for each categorical feature in t ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 1cf14a342..80436dffd 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesDescription(dataset) +defTimeSeriesDescription(dataset) ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 6056d4a28..aeb979d58 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesDescriptiveStatistics(dataset) +defTimeSeriesDescriptiveStatistics(dataset) ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 0762578c8..2440fa7c0 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesFrequency(dataset:validmind.vm_models.VMDataset) +defTimeSeriesFrequency(dataset: validmind.vm_models.VMDataset) ::: @@ -55,7 +55,7 @@ Initially, the test checks if the dataframe index is in datetime format. Subsequ ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 204ad68e7..c97519743 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def TimeSeriesHistogram(dataset,nbins = 30) +defTimeSeriesHistogram(dataset,nbins = 30) ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index bfa0b6bbe..97042f590 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesLinePlot(dataset:validmind.vm_models.VMDataset) +defTimeSeriesLinePlot(dataset: validmind.vm_models.VMDataset) ::: @@ -57,7 +57,7 @@ The mechanism for this Python class involves extracting the column names from th ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 5a158a0bb..456869d92 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesMissingValues(dataset:validmind.vm_models.VMDataset,min_threshold:int = 1) +defTimeSeriesMissingValues(dataset: validmind.vm_models.VMDataset,min_threshold: int = 1) ::: @@ -55,7 +55,7 @@ The test method commences by validating if the dataset has a datetime index; if ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index f943a3589..b4cf75b2f 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesOutliers(dataset:validmind.vm_models.VMDataset,zscore_threshold:int = 3) +defTimeSeriesOutliers(dataset: validmind.vm_models.VMDataset,zscore_threshold: int = 3) ::: @@ -60,7 +60,7 @@ The test processes a given dataset which must have datetime indexing, checks if ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index b4cf92e97..6b7070b2f 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TooManyZeroValues(dataset:validmind.vm_models.VMDataset,max_percent_threshold:float = 0.03) +defTooManyZeroValues(dataset: validmind.vm_models.VMDataset,max_percent_threshold: float = 0.03) ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 2456c62e4..111cd9901 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def UniqueRows(dataset:validmind.vm_models.VMDataset,min_percent_threshold:float = 1) +defUniqueRows(dataset: validmind.vm_models.VMDataset,min_percent_threshold: float = 1) ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 00f235a40..ac76c8497 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def WOEBinPlots(dataset:validmind.vm_models.VMDataset,breaks_adj:list = None,fig_height:int = 600,fig_width:int = 500) +defWOEBinPlots(dataset: validmind.vm_models.VMDataset,breaks_adj: list = None,fig_height: int = 600,fig_width: int = 500) ::: @@ -73,7 +73,7 @@ The test implementation follows defined steps. Initially, it selects non-numeric ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 29adf266e..c026155af 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def WOEBinTable(dataset:validmind.vm_models.VMDataset,breaks_adj:list = None) +defWOEBinTable(dataset: validmind.vm_models.VMDataset,breaks_adj: list = None) ::: @@ -56,7 +56,7 @@ The test uses the `scorecardpy.woebin` method to perform automatic binning of th ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 5d5e180fd..58f3f777e 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def ZivotAndrewsArch(dataset:validmind.vm_models.VMDataset) +defZivotAndrewsArch(dataset: validmind.vm_models.VMDataset) ::: @@ -67,7 +67,7 @@ The Zivot-Andrews unit root test is performed on each feature in the dataset usi ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index 0ce0cf549..e4854a82a 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def CommonWords(dataset:validmind.vm_models.VMDataset) +defCommonWords(dataset: validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 5dee5e471..16d4f987c 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Hashtags(dataset:validmind.vm_models.VMDataset,top_hashtags:int = 25) +defHashtags(dataset: validmind.vm_models.VMDataset,top_hashtags: int = 25) ::: @@ -57,7 +57,7 @@ The test implements a regular expression (regex) to extract all hashtags from th ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index da822bf3a..5ba76065f 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def LanguageDetection(dataset) +defLanguageDetection(dataset) ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 43fd0ef09..e636b81a0 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Mentions(dataset:validmind.vm_models.VMDataset,top_mentions:int = 25) +defMentions(dataset: validmind.vm_models.VMDataset,top_mentions: int = 25) ::: @@ -55,7 +55,7 @@ The test first verifies the existence of a text column in the provided dataset. ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index 2f19679b5..e5bc0653b 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def PolarityAndSubjectivity(dataset,threshold_subjectivity = 0.5,threshold_polarity = 0) +defPolarityAndSubjectivity(dataset,threshold_subjectivity = 0.5,threshold_polarity = 0) ::: diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index 3af115615..dda79858a 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -18,7 +18,7 @@ Metrics functions for any Pandas-compatible datasets ::: {.signature} -def Punctuations(dataset,count_mode = 'token') +defPunctuations(dataset,count_mode = 'token') ::: diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index 0dc5e391e..7807dc2ca 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Sentiment(dataset) +defSentiment(dataset) ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index c05f6f31a..ecf1ac5ed 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -def StopWords(dataset:validmind.vm_models.VMDataset,min_percent_threshold:float = 0.5,num_words:int = 25) +defStopWords(dataset: validmind.vm_models.VMDataset,min_percent_threshold: float = 0.5,num_words: int = 25) ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 290ac8f87..ec0e9819c 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def create_metrics_df(df,text_column,unwanted_tokens,lang) +defcreate_metrics_df(df,text_column,unwanted_tokens,lang) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def TextDescription(dataset:validmind.vm_models.VMDataset,unwanted_tokens:validmind.vm_models.set = {'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str = 'english') +defTextDescription(dataset: validmind.vm_models.VMDataset,unwanted_tokens: validmind.vm_models.set = {'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang: str = 'english') ::: diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index 9ca2d2582..4c9207309 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Toxicity(dataset) +defToxicity(dataset) ::: diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 40c10066e..4602329af 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def validate_prediction(y_true,y_pred,dataset_id = None) +defvalidate_prediction(y_true,y_pred,dataset_id = None) ::: @@ -22,9 +22,9 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val **Arguments** -- **y_true**: List or array of true values -- **y_pred**: List or array of predicted values -- **dataset_id**: Optional identifier for the dataset (for logging) +- `y_true`: List or array of true values +- `y_pred`: List or array of predicted values +- `dataset_id`: Optional identifier for the dataset (for logging) **Returns** @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -def BertScore(dataset,model,evaluation_model = 'distilbert-base-uncased') +defBertScore(dataset,model,evaluation_model = 'distilbert-base-uncased') ::: diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 1c2a55e7a..815c53a92 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def validate_prediction(y_true,y_pred,dataset_id = None) +defvalidate_prediction(y_true,y_pred,dataset_id = None) ::: @@ -22,9 +22,9 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val **Arguments** -- **y_true**: List or array of true values -- **y_pred**: List or array of predicted values -- **dataset_id**: Optional identifier for the dataset (for logging) +- `y_true`: List or array of true values +- `y_pred`: List or array of predicted values +- `dataset_id`: Optional identifier for the dataset (for logging) **Returns** @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -def BleuScore(dataset,model) +defBleuScore(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 0dc7da2c2..fd12fa372 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClusterSizeDistribution(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) +defClusterSizeDistribution(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 5428ae277..5215dea44 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def validate_prediction(y_true,y_pred,dataset_id = None) +defvalidate_prediction(y_true,y_pred,dataset_id = None) ::: @@ -22,9 +22,9 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val **Arguments** -- **y_true**: List or array of true values -- **y_pred**: List or array of predicted values -- **dataset_id**: Optional identifier for the dataset (for logging) +- `y_true`: List or array of true values +- `y_pred`: List or array of predicted values +- `dataset_id`: Optional identifier for the dataset (for logging) **Returns** @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -def ContextualRecall(dataset,model) +defContextualRecall(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index c9a2afe88..8e0ec7e59 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def FeaturesAUC(dataset:validmind.vm_models.VMDataset,fontsize:int = 12,figure_height:int = 500) +defFeaturesAUC(dataset: validmind.vm_models.VMDataset,fontsize: int = 12,figure_height: int = 500) ::: @@ -70,7 +70,7 @@ For each feature, the metric treats the feature values as raw scores to compute ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 5064e535b..58c22c36c 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def validate_prediction(y_true,y_pred,dataset_id = None) +defvalidate_prediction(y_true,y_pred,dataset_id = None) ::: @@ -22,9 +22,9 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val **Arguments** -- **y_true**: List or array of true values -- **y_pred**: List or array of predicted values -- **dataset_id**: Optional identifier for the dataset (for logging) +- `y_true`: List or array of true values +- `y_pred`: List or array of predicted values +- `dataset_id`: Optional identifier for the dataset (for logging) **Returns** @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -def MeteorScore(dataset,model) +defMeteorScore(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index 174f9f62d..0c02e4ad3 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_model_info(model) +defget_model_info(model) ::: @@ -28,7 +28,7 @@ Attempts to extract all model info from a model object instance ::: {.signature} -def ModelMetadata(model) +defModelMetadata(model) ::: diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index eec9e4ad7..36c07de93 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ModelPredictionResiduals(dataset,model,nbins = 100,p_value_threshold = 0.05,start_date = None,end_date = None) +defModelPredictionResiduals(dataset,model,nbins = 100,p_value_threshold = 0.05,start_date = None,end_date = None) ::: diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 25797e40d..ef7080eea 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def validate_prediction(y_true,y_pred,dataset_id = None) +defvalidate_prediction(y_true,y_pred,dataset_id = None) ::: @@ -22,9 +22,9 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val **Arguments** -- **y_true**: List or array of true values -- **y_pred**: List or array of predicted values -- **dataset_id**: Optional identifier for the dataset (for logging) +- `y_true`: List or array of true values +- `y_pred`: List or array of predicted values +- `dataset_id`: Optional identifier for the dataset (for logging) **Returns** @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -def RegardScore(dataset,model) +defRegardScore(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index ad94b7c39..79311a875 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def RegressionResidualsPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,bin_size:float = 0.1) +defRegressionResidualsPlot(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,bin_size: float = 0.1) ::: diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 86765a003..110e3001d 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def RougeScore(dataset,model,metric = 'rouge-1') +defRougeScore(dataset,model,metric = 'rouge-1') ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index e6e8cdd0f..65c55b6bd 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesPredictionWithCI(dataset,model,confidence = 0.95) +defTimeSeriesPredictionWithCI(dataset,model,confidence = 0.95) ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index 781e042ab..f0f298a80 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesPredictionsPlot(dataset,model) +defTimeSeriesPredictionsPlot(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 2374a6df4..7ec0a5d4e 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TimeSeriesR2SquareBySegments(dataset,model,segments = None) +defTimeSeriesR2SquareBySegments(dataset,model,segments = None) ::: diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index 5a716e2ec..58f374286 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TokenDisparity(dataset,model) +defTokenDisparity(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index 619815e9b..33ad53e55 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ToxicityScore(dataset,model) +defToxicityScore(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 82911dce0..0b1080d68 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def AdjustedMutualInformation(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +defAdjustedMutualInformation(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 3938fab8f..78d660ebe 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def AdjustedRandIndex(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +defAdjustedRandIndex(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 3ad35117d..3b983933d 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def CalibrationCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_bins:int = 10) +defCalibrationCurve(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,n_bins: int = 10) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index e0e4bffef..a8e140032 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClassifierPerformance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,average:str = 'macro') +defClassifierPerformance(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,average: str = 'macro') ::: @@ -58,6 +58,6 @@ The test produces a report that includes precision, recall, F1-Score, and accura ::: {.signature} -def multiclass_roc_auc_score(y_test,y_pred,average = 'macro') +defmulticlass_roc_auc_score(y_test,y_pred,average = 'macro') ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 897c19f53..09c451897 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClassifierThresholdOptimization(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,methods = None,target_recall = None) +defClassifierThresholdOptimization(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,methods = None,target_recall = None) ::: @@ -71,10 +71,10 @@ The test implements multiple threshold optimization methods: **Arguments** -- **dataset**: VMDataset containing features and target -- **model**: VMModel containing predictions -- **methods**: List of methods to compare (default: ['youden', 'f1', 'precision_recall']) -- **target_recall**: Target recall value if using 'target_recall' method +- `dataset`: VMDataset containing features and target +- `model`: VMModel containing predictions +- `methods`: List of methods to compare (default: ['youden', 'f1', 'precision_recall']) +- `target_recall`: Target recall value if using 'target_recall' method **Returns** @@ -90,7 +90,7 @@ The test implements multiple threshold optimization methods: ::: {.signature} -def find_optimal_threshold(y_true,y_prob,method = 'youden',target_recall = None) +deffind_optimal_threshold(y_true,y_prob,method = 'youden',target_recall = None) ::: @@ -100,10 +100,10 @@ Find the optimal classification threshold using various methods. **Arguments** -- **y_true**: True binary labels -- **y_prob**: Predicted probabilities -- **method**: Method to use for finding optimal threshold -- **target_recall**: Required if method='target_recall' +- `y_true`: True binary labels +- `y_prob`: Predicted probabilities +- `method`: Method to use for finding optimal threshold +- `target_recall`: Required if method='target_recall' **Returns** diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index caf38bc59..e165aea9a 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClusterCosineSimilarity(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +defClusterCosineSimilarity(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) ::: @@ -56,7 +56,7 @@ This test works by first extracting the true and predicted clusters of the model ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index aa0fe5eb4..e1ec0c755 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ClusterPerformanceMetrics(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +defClusterPerformanceMetrics(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 5f76a3da6..0678542ad 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def CompletenessScore(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +defCompletenessScore(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index aeab34da2..319f2f62d 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ConfusionMatrix(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) +defConfusionMatrix(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index def8589c4..3627d4145 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def FeatureImportance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,num_features:int = 3) +defFeatureImportance(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,num_features: int = 3) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 081c476e6..014dc440d 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def FowlkesMallowsScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) +defFowlkesMallowsScore(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 56f3c9d24..3c8759768 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def HomogeneityScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) +defHomogeneityScore(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 0363770b5..10b5ea3a0 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def custom_recall(y_true,y_pred_proba,threshold = 0.5) +defcustom_recall(y_true,y_pred_proba,threshold = 0.5) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def HyperParametersTuning(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\] = None,thresholds:Union\[float, List\[float\]\] = None,fit_params:dict = None) +defHyperParametersTuning(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,param_grid: dict,scoring: Union\[str, List, Dict\] = None,thresholds: Union\[float, List\[float\]\] = None,fit_params: dict = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 892b1cf74..a1b2ae73f 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def KMeansClustersOptimization(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_clusters:Union\[List\[int\], None \] = None) +defKMeansClustersOptimization(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,n_clusters: Union\[List\[int\], None\] = None) ::: @@ -57,7 +57,7 @@ The test mechanism involves iterating over a predefined range of cluster numbers ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index cd53e9d3d..2b77f24da 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MinimumAccuracy(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float = 0.7) +defMinimumAccuracy(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,min_threshold: float = 0.7) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 7dec91a33..0381d04fe 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MinimumF1Score(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float = 0.5) +defMinimumF1Score(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,min_threshold: float = 0.5) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 036e30633..42c521de9 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def MinimumROCAUCScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float = 0.5) +defMinimumROCAUCScore(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,min_threshold: float = 0.5) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 5ad245ead..7661eafd8 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ModelParameters(model,model_params = None) +defModelParameters(model,model_params = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 9de6f1cbe..4a7592db9 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def multiclass_roc_auc_score(y_test,y_pred,average = 'macro') +defmulticlass_roc_auc_score(y_test,y_pred,average = 'macro') ::: @@ -24,7 +24,7 @@ toc-expand: 4 ::: {.signature} -def ModelsPerformanceComparison(dataset:validmind.vm_models.VMDataset,models:list\[validmind.vm_models.VMModel\]) +defModelsPerformanceComparison(dataset: validmind.vm_models.VMDataset,models: list\[validmind.vm_models.VMModel\]) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 89985b870..ce09ac56c 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def OverfitDiagnosis(model:validmind.vm_models.VMModel,datasets:List\[validmind.vm_models.VMDataset\],metric:str = None,cut_off_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}) +defOverfitDiagnosis(model: validmind.vm_models.VMModel,datasets: List\[validmind.vm_models.VMDataset\],metric: str = None,cut_off_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index cbeefec3f..f9e0a956d 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def PermutationFeatureImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,fontsize:Union\[int, None \] = None,figure_height:Union\[int, None \] = None) +defPermutationFeatureImportance(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,fontsize: Union\[int, None\] = None,figure_height: Union\[int, None\] = None) ::: @@ -71,7 +71,7 @@ PFI is calculated via the `permutation_importance` method from the `sklearn.insp ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index d52d08df0..c1fffb5ff 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def calculate_psi(score_initial,score_new,num_bins = 10,mode = 'fixed') +defcalculate_psi(score_initial,score_new,num_bins = 10,mode = 'fixed') ::: @@ -46,7 +46,7 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -def PopulationStabilityIndex(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,num_bins:int = 10,mode:str = 'fixed') +defPopulationStabilityIndex(datasets: List\[validmind.vm_models.VMDataset\],model: validmind.vm_models.VMModel,num_bins: int = 10,mode: str = 'fixed') ::: @@ -91,7 +91,7 @@ The implementation of the PSI in this script involves calculating the PSI for ea ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 844de3b73..ef70aaedc 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def PrecisionRecallCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +defPrecisionRecallCurve(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) ::: @@ -54,7 +54,7 @@ The test extracts ground truth labels and prediction probabilities from the mode ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 61239192e..31dccc646 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ROCCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +defROCCurve(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) ::: @@ -57,7 +57,7 @@ First, this script selects the target model and datasets that require binary cla ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index ff9ff266f..7a182058d 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def RegressionErrors(model,dataset) +defRegressionErrors(model,dataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index fb982b7f7..82252efb0 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionErrorsComparison(datasets,models) +defRegressionErrorsComparison(datasets,models) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 55655b1cb..349bdd5b6 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionPerformance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +defRegressionPerformance(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 70c7c4fcd..f29dc8426 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) +defadj_r2_score(actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount: int,featurecount: int) ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -def RegressionR2Square(dataset,model) +defRegressionR2Square(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 96e370977..f4e0eb4b9 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) +defadj_r2_score(actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount: int,featurecount: int) ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -def RegressionR2SquareComparison(datasets,models) +defRegressionR2SquareComparison(datasets,models) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 9d1b1c459..aa96be14d 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RobustnessDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,metric:str = None,scaling_factor_std_dev_list:List\[float\] = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}) +defRobustnessDiagnosis(datasets: List\[validmind.vm_models.VMDataset\],model: validmind.vm_models.VMModel,metric: str = None,scaling_factor_std_dev_list: List\[float\] = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}) ::: @@ -74,7 +74,7 @@ This test introduces Gaussian noise to the numeric input features of the dataset ::: {.signature} -class MissingOrInvalidModelPredictFnError() +classMissingOrInvalidModelPredictFnError() ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 2318142af..b8a43aa4e 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def generate_shap_plot(type\_,shap_values,x_test) +defgenerate_shap_plot(type\_,shap_values,x_test) ::: @@ -38,9 +38,9 @@ Plots two types of SHAP global importance (SHAP). **Arguments** -- **type\_**: The type of SHAP plot to generate. Must be "mean" or "summary". -- **shap_values**: The SHAP values to plot. -- **x_test**: The test data used to generate the SHAP values. +- `type_`: The type of SHAP plot to generate. Must be "mean" or "summary". +- `shap_values`: The SHAP values to plot. +- `x_test`: The test data used to generate the SHAP values. **Returns** @@ -54,7 +54,7 @@ Plots two types of SHAP global importance (SHAP). ::: {.signature} -def select_shap_values(shap_values,class_of_interest) +defselect_shap_values(shap_values,class_of_interest) ::: @@ -66,8 +66,8 @@ For regression models, returns the SHAP values directly as there are no classes. **Arguments** -- **shap_values**: The SHAP values returned by the SHAP explainer. For multiclass classification, this will be a list where each element corresponds to a class. For regression, this will be a single array of SHAP values. -- **class_of_interest**: The class index for which to retrieve SHAP values. If None (default), the function will assume binary classification and use class 1 by default. +- `shap_values`: The SHAP values returned by the SHAP explainer. For multiclass classification, this will be a list where each element corresponds to a class. For regression, this will be a single array of SHAP values. +- `class_of_interest`: The class index for which to retrieve SHAP values. If None (default), the function will assume binary classification and use class 1 by default. **Returns** @@ -75,7 +75,7 @@ For regression models, returns the SHAP values directly as there are no classes. **Raises** -- **ValueError**: If class_of_interest is specified and is out of bounds for the number of classes. +- `ValueError`: If class_of_interest is specified and is out of bounds for the number of classes. @@ -85,7 +85,7 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -def SHAPGlobalImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,kernel_explainer_samples:int = 10,tree_or_linear_explainer_samples:int = 200,class_of_interest:int = None) +defSHAPGlobalImportance(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,kernel_explainer_samples: int = 10,tree_or_linear_explainer_samples: int = 200,class_of_interest: int = None) ::: @@ -129,7 +129,7 @@ The exam begins with the selection of a suitable explainer which aligns with the ::: {.signature} -class UnsupportedModelForSHAPError() +classUnsupportedModelForSHAPError() ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index d826e1f88..154540dc1 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ScoreProbabilityAlignment(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,score_column:str = 'score',n_bins:int = 10) +defScoreProbabilityAlignment(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,score_column: str = 'score',n_bins: int = 10) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 56f01f3a3..7c4233cc6 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def SilhouettePlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +defSilhouettePlot(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 67fba1f06..58d2e6fbe 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def TrainingTestDegradation(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,max_threshold:float = 0.1) +defTrainingTestDegradation(datasets: List\[validmind.vm_models.VMDataset\],model: validmind.vm_models.VMModel,max_threshold: float = 0.1) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 24f36cf8c..747a0dc36 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def VMeasure(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) +defVMeasure(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 9d00cefbc..a920d8736 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def WeakspotsDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,features_columns:Union\[List\[str\], None \] = None,metrics:Union\[Dict\[str, Callable\], None \] = None,thresholds:Union\[Dict\[str, float\], None \] = None) +defWeakspotsDiagnosis(datasets: List\[validmind.vm_models.VMDataset\],model: validmind.vm_models.VMModel,features_columns: Union\[List\[str\], None\] = None,metrics: Union\[Dict\[str, Callable\], None\] = None,thresholds: Union\[Dict\[str, float\], None\] = None) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 098b50bfb..e6703ddb4 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def AutoARIMA(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +defAutoARIMA(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 7c24337ae..8bb6df271 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def CumulativePredictionProbabilities(dataset,model,title = 'Cumulative Probabilities') +defCumulativePredictionProbabilities(dataset,model,title = 'Cumulative Probabilities') ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index ad7119f8d..33a3e3557 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def DurbinWatsonTest(dataset,model,threshold = {'cls': 'ExprList', 'elements': ['1.5', '2.5']}) +defDurbinWatsonTest(dataset,model,threshold = {'cls': 'ExprList', 'elements': ['1.5', '2.5']}) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index f9be844a4..72317c195 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def GINITable(dataset,model) +defGINITable(dataset,model) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 5c163132e..935655a0e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def KolmogorovSmirnov(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,dist:str = 'norm') +defKolmogorovSmirnov(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,dist: str = 'norm') ::: @@ -55,7 +55,7 @@ This test calculates the KS statistic and corresponding p-value for each feature ::: {.signature} -class InvalidTestParametersError() +classInvalidTestParametersError() ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 7f0730d4b..20fec6599 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def Lilliefors(dataset:validmind.vm_models.VMDataset) +defLilliefors(dataset: validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index df2fa168e..251d13f70 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def PredictionProbabilitiesHistogram(dataset,model,title = 'Histogram of Predictive Probabilities') +defPredictionProbabilitiesHistogram(dataset,model,title = 'Histogram of Predictive Probabilities') ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index d452fe057..d00678550 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def RegressionCoeffs(model) +defRegressionCoeffs(model) ::: @@ -57,7 +57,7 @@ The function operates by extracting the estimated coefficients and their standar ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index abce7f959..26e61f4e6 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionFeatureSignificance(model:validmind.vm_models.VMModel,fontsize:int = 10,p_threshold:float = 0.05) +defRegressionFeatureSignificance(model: validmind.vm_models.VMModel,fontsize: int = 10,p_threshold: float = 0.05) ::: @@ -69,7 +69,7 @@ The test mechanism involves extracting the model's coefficients and p-values for ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 9d43d7f37..4ef691493 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionModelForecastPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,start_date:Union\[str, None \] = None,end_date:Union\[str, None \] = None) +defRegressionModelForecastPlot(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,start_date: Union\[str, None\] = None,end_date: Union\[str, None\] = None) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 6bb29b27f..4d7a524af 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def integrate_diff(series_diff,start_value) +defintegrate_diff(series_diff,start_value) ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -def RegressionModelForecastPlotLevels(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset) +defRegressionModelForecastPlotLevels(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 24c6854b9..b50fc20e2 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def integrate_diff(series_diff,start_value) +defintegrate_diff(series_diff,start_value) ::: @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionModelSensitivityPlot(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,shocks:List\[float\] = {'cls': 'ExprList', 'elements': ['0.1']},transformation:Union\[str, None \] = None) +defRegressionModelSensitivityPlot(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,shocks: List\[float\] = {'cls': 'ExprList', 'elements': ['0.1']},transformation: Union\[str, None\] = None) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index dd303c0ff..28339fd16 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) +defadj_r2_score(actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount: int,featurecount: int) ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -def RegressionModelSummary(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel) +defRegressionModelSummary(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 8d80a2ccf..68f977c32 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def get_logger(name = 'validmind',log_level = None) +defget_logger(name = 'validmind',log_level = None) ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -def RegressionPermutationFeatureImportance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,fontsize:int = 12,figure_height:int = 500) +defRegressionPermutationFeatureImportance(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,fontsize: int = 12,figure_height: int = 500) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index 599332db7..9109c6b16 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def ScorecardHistogram(dataset,title = 'Histogram of Scores',score_column = 'score') +defScorecardHistogram(dataset,title = 'Histogram of Scores',score_column = 'score') ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index ce2f083ff..16b30238f 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def adj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int) +defadj_r2_score(actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount: int,featurecount: int) ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index e7c2ae548..4ac6a87b2 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +defcall_model(system_prompt: str,user_prompt: str,temperature: float = 0.0,seed: int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +defget_explanation(response: str) ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +defget_score(response: str) ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -def Bias(model,min_threshold = 7) +defBias(model,min_threshold = 7) ::: @@ -120,7 +120,7 @@ For each test case, the LLM grades the input prompt on a scale of 1 to 10. It ev ::: {.signature} -class MissingRequiredTestInputError() +classMissingRequiredTestInputError() ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index adf4781dc..46d4c7c1d 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +defcall_model(system_prompt: str,user_prompt: str,temperature: float = 0.0,seed: int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +defget_explanation(response: str) ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +defget_score(response: str) ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -def Clarity(model,min_threshold = 7) +defClarity(model,min_threshold = 7) ::: @@ -113,7 +113,7 @@ The evaluation uses an LLM to scrutinize the clarity of prompts, factoring in co ::: {.signature} -class MissingRequiredTestInputError() +classMissingRequiredTestInputError() ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index f406559a1..4e25e1432 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +defcall_model(system_prompt: str,user_prompt: str,temperature: float = 0.0,seed: int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +defget_explanation(response: str) ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +defget_score(response: str) ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -def Conciseness(model,min_threshold = 7) +defConciseness(model,min_threshold = 7) ::: @@ -115,7 +115,7 @@ Using an LLM, this test conducts a conciseness analysis on input prompts. The an ::: {.signature} -class MissingRequiredTestInputError() +classMissingRequiredTestInputError() ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index ed6f21254..402fc4f58 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +defcall_model(system_prompt: str,user_prompt: str,temperature: float = 0.0,seed: int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +defget_explanation(response: str) ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +defget_score(response: str) ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -def Delimitation(model,min_threshold = 7) +defDelimitation(model,min_threshold = 7) ::: @@ -114,7 +114,7 @@ The test employs an LLM to examine prompts for appropriate use of delimiters suc ::: {.signature} -class MissingRequiredTestInputError() +classMissingRequiredTestInputError() ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 341c58a83..e2fe0d6f2 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +defcall_model(system_prompt: str,user_prompt: str,temperature: float = 0.0,seed: int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +defget_explanation(response: str) ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +defget_score(response: str) ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -def NegativeInstruction(model,min_threshold = 7) +defNegativeInstruction(model,min_threshold = 7) ::: @@ -114,7 +114,7 @@ An LLM is employed to evaluate each prompt. The prompt is graded based on its us ::: {.signature} -class MissingRequiredTestInputError() +classMissingRequiredTestInputError() ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 5431e639d..922ee2e2e 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +defcall_model(system_prompt: str,user_prompt: str,temperature: float = 0.0,seed: int = 42) ::: @@ -28,7 +28,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def Robustness(model,dataset,num_tests = 10) +defRobustness(model,dataset,num_tests = 10) ::: @@ -71,7 +71,7 @@ The Robustness test appraises prompts under various conditions, alterations, and ::: {.signature} -class MissingRequiredTestInputError() +classMissingRequiredTestInputError() ::: @@ -92,7 +92,7 @@ When a required test context variable is missing. ::: {.signature} -class SkipTestError() +classSkipTestError() ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 6cf232450..107a99fca 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +defcall_model(system_prompt: str,user_prompt: str,temperature: float = 0.0,seed: int = 42) ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +defget_explanation(response: str) ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +defget_score(response: str) ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -def Specificity(model,min_threshold = 7) +defSpecificity(model,min_threshold = 7) ::: @@ -116,7 +116,7 @@ The Specificity Test employs an LLM to grade each prompt based on clarity, detai ::: {.signature} -class MissingRequiredTestInputError() +classMissingRequiredTestInputError() ::: diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index 9aa8fa49b..ec1fcc9c7 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def call_model(system_prompt:str,user_prompt:str,temperature:float = 0.0,seed:int = 42) +defcall_model(system_prompt: str,user_prompt: str,temperature: float = 0.0,seed: int = 42) ::: @@ -30,7 +30,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -def get_explanation(response:str) +defget_explanation(response: str) ::: @@ -54,7 +54,7 @@ Explanation: " -> "" ::: {.signature} -def get_score(response:str) +defget_score(response: str) ::: diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 4b72a3a22..acb24a274 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -def describe_metric(metric_id:str,kwargs = {}) +defdescribe_metric(metric_id: str,\*\*kwargs = {}) ::: @@ -30,7 +30,7 @@ Describe a metric ::: {.signature} -def list_metrics(kwargs = {}) +deflist_metrics(\*\*kwargs = {}) ::: @@ -46,7 +46,7 @@ List all metrics ::: {.signature} -def run_metric(metric_id:str,kwargs = {}) +defrun_metric(metric_id: str,\*\*kwargs = {}) ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index baae05fc9..b0cb9c483 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -18,7 +18,7 @@ Models entrypoint ::: {.signature} -class Figure() +classFigure() ::: @@ -32,7 +32,7 @@ Figure objects track the schema supported by the ValidMind API ::: {.signature} -def serialize(self) +defserialize() ::: @@ -46,7 +46,7 @@ Serializes the Figure to a dictionary so it can be sent to the API ::: {.signature} -def serialize_files(self) +defserialize_files() ::: @@ -60,7 +60,7 @@ Creates a `requests`-compatible files object to be sent to the API ::: {.signature} -def to_widget(self) +defto_widget() ::: @@ -78,7 +78,7 @@ we would render images as-is, but Plotly FigureWidgets don't work well on Google ::: {.signature} -class ModelAttributes() +classModelAttributes() ::: @@ -92,7 +92,7 @@ Model attributes definition ::: {.signature} -def from_dict(cls,data) +deffrom_dict(cls,data) ::: @@ -108,7 +108,7 @@ Creates a ModelAttributes instance from a dictionary ::: {.signature} -class TestSuite() +classTestSuite() ::: @@ -126,7 +126,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -def get_default_config(self)dict +defget_default_config()dict ::: @@ -146,7 +146,7 @@ Each test in a test suite can accept parameters and those parameters can have de ::: {.signature} -def get_tests(self)List\[str\] +defget_tests()List\[str\] ::: @@ -160,7 +160,7 @@ Get all test suite test objects from all sections ::: {.signature} -def num_tests(self)int +defnum_tests()int ::: @@ -176,7 +176,7 @@ Returns the total number of tests in the test suite ::: {.signature} -class TestSuiteRunner() +classTestSuiteRunner() ::: @@ -190,7 +190,7 @@ Runs a test suite ::: {.signature} -def log_results(self) +deflog_results() ::: @@ -206,7 +206,7 @@ This method will be called after the test suite has been run and all results hav ::: {.signature} -def run(self,send:bool = True,fail_fast:bool = False) +defrun(send: bool = True,fail_fast: bool = False) ::: @@ -216,8 +216,8 @@ Runs the test suite, renders the summary and sends the results to ValidMind **Arguments** -- **send** (bool): Whether to send the results to ValidMind. Defaults to True. -- **fail_fast** (bool): Whether to stop running tests after the first failure. Defaults to False. +- `send` (bool): Whether to send the results to ValidMind. Defaults to True. +- `fail_fast` (bool): Whether to stop running tests after the first failure. Defaults to False. ### [summarize[()]{.muted}](#summarize) @@ -225,7 +225,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -def summarize(self,show_link:bool = True) +defsummarize(show_link: bool = True) ::: @@ -237,7 +237,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -class VMDataset() +classVMDataset() ::: @@ -251,18 +251,18 @@ This way we can support multiple dataset types but under the hood we only need t **Arguments** -- **raw_dataset** (np.ndarray): The raw dataset as a NumPy array. -- **input_id** (str): Identifier for the dataset. -- **index** (np.ndarray): The raw dataset index as a NumPy array. -- **columns** (Set[str]): The column names of the dataset. -- **target_column** (str): The target column name of the dataset. -- **feature_columns** (List[str]): The feature column names of the dataset. -- **feature_columns_numeric** (List[str]): The numeric feature column names of the dataset. -- **feature_columns_categorical** (List[str]): The categorical feature column names of the dataset. -- **text_column** (str): The text column name of the dataset for NLP tasks. -- **target_class_labels** (Dict): The class labels for the target columns. -- **df** (pd.DataFrame): The dataset as a pandas DataFrame. -- **extra_columns** (Dict): Extra columns to include in the dataset. +- `raw_dataset` (np.ndarray): The raw dataset as a NumPy array. +- `input_id` (str): Identifier for the dataset. +- `index` (np.ndarray): The raw dataset index as a NumPy array. +- `columns` (Set[str]): The column names of the dataset. +- `target_column` (str): The target column name of the dataset. +- `feature_columns` (List[str]): The feature column names of the dataset. +- `feature_columns_numeric` (List[str]): The numeric feature column names of the dataset. +- `feature_columns_categorical` (List[str]): The categorical feature column names of the dataset. +- `text_column` (str): The text column name of the dataset for NLP tasks. +- `target_class_labels` (Dict): The class labels for the target columns. +- `df` (pd.DataFrame): The dataset as a pandas DataFrame. +- `extra_columns` (Dict): Extra columns to include in the dataset. **Inherited members** @@ -272,7 +272,7 @@ This way we can support multiple dataset types but under the hood we only need t ::: {.signature} -def add_extra_column(self,column_name,column_values = None) +defadd_extra_column(column_name,column_values = None) ::: @@ -282,8 +282,8 @@ Adds an extra column to the dataset without modifying the dataset `features` and **Arguments** -- **column_name** (str): The name of the extra column. -- **column_values** (np.ndarray): The values of the extra column. +- `column_name` (str): The name of the extra column. +- `column_values` (np.ndarray): The values of the extra column. ### [assign_predictions[()]{.muted}](#assign_predictions) @@ -291,7 +291,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -def assign_predictions(self,model:validmind.vm_models.VMModel,prediction_column:str = None,prediction_values:list = None,probability_column:str = None,probability_values:list = None,prediction_probabilities:list = None,kwargs = {}) +defassign_predictions(model: validmind.vm_models.VMModel,prediction_column: str = None,prediction_values: list = None,probability_column: str = None,probability_values: list = None,prediction_probabilities: list = None,\*\*kwargs = {}) ::: @@ -301,13 +301,13 @@ Assign predictions and probabilities to the dataset. **Arguments** -- **model** (VMModel): The model used to generate the predictions. -- **prediction_column** (str, optional): The name of the column containing the predictions. Defaults to None. -- **prediction_values** (list, optional): The values of the predictions. Defaults to None. -- **probability_column** (str, optional): The name of the column containing the probabilities. Defaults to None. -- **probability_values** (list, optional): The values of the probabilities. Defaults to None. -- **prediction_probabilities** (list, optional): DEPRECATED: The values of the probabilities. Defaults to None. -- **kwargs**: Additional keyword arguments that will get passed through to the model's `predict` method. +- `model` (VMModel): The model used to generate the predictions. +- `prediction_column` (str, optional): The name of the column containing the predictions. Defaults to None. +- `prediction_values` (list, optional): The values of the predictions. Defaults to None. +- `probability_column` (str, optional): The name of the column containing the probabilities. Defaults to None. +- `probability_values` (list, optional): The values of the probabilities. Defaults to None. +- `prediction_probabilities` (list, optional): DEPRECATED: The values of the probabilities. Defaults to None. +- `kwargs`: Additional keyword arguments that will get passed through to the model's `predict` method. ### [prediction_column[()]{.muted}](#prediction_column) @@ -315,7 +315,7 @@ Assign predictions and probabilities to the dataset. ::: {.signature} -def prediction_column(self,model:validmind.vm_models.VMModel,column_name:str = None)str +defprediction_column(model: validmind.vm_models.VMModel,column_name: str = None)str ::: @@ -329,7 +329,7 @@ Get or set the prediction column for a model. ::: {.signature} -def probability_column(self,model:validmind.vm_models.VMModel,column_name:str = None)str +defprobability_column(model: validmind.vm_models.VMModel,column_name: str = None)str ::: @@ -343,7 +343,7 @@ Get or set the probability column for a model. ::: {.signature} -def target_classes(self) +deftarget_classes() ::: @@ -357,7 +357,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -def with_options(self,kwargs = {})validmind.vm_models.VMDataset +defwith_options(\*\*kwargs = {})validmind.vm_models.VMDataset ::: @@ -367,7 +367,7 @@ Support options provided when passing an input to run_test or run_test_suite **Arguments** -- \*\***kwargs**: Options: +- `**kwargs`: Options: - columns: Filter columns in the dataset **Returns** @@ -380,7 +380,7 @@ Support options provided when passing an input to run_test or run_test_suite ::: {.signature} -def x_df(self) +defx_df() ::: @@ -394,7 +394,7 @@ Returns a dataframe containing only the feature columns ::: {.signature} -def y_df(self){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +defy_df(){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -408,7 +408,7 @@ Returns a dataframe containing the target column ::: {.signature} -def y_pred(self,model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]} +defy_pred(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]} ::: @@ -420,7 +420,7 @@ Attempts to stack complex prediction types (e.g., embeddings) into a single, mul **Arguments** -- **model** (VMModel): The model whose predictions are sought. +- `model` (VMModel): The model whose predictions are sought. **Returns** @@ -432,7 +432,7 @@ Attempts to stack complex prediction types (e.g., embeddings) into a single, mul ::: {.signature} -def y_pred_df(self,model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +defy_pred_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -446,7 +446,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -def y_prob(self,model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]} +defy_prob(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]} ::: @@ -456,7 +456,7 @@ Returns the probabilities for a given model. **Arguments** -- **model** (str): The ID of the model whose predictions are sought. +- `model` (str): The ID of the model whose predictions are sought. **Returns** @@ -468,7 +468,7 @@ Returns the probabilities for a given model. ::: {.signature} -def y_prob_df(self,model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +defy_prob_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -484,7 +484,7 @@ Returns a dataframe containing the probabilities for a given model ::: {.signature} -class VMInput() +classVMInput() ::: @@ -500,7 +500,7 @@ Base class for ValidMind Input types ::: {.signature} -def with_options(self,kwargs = {})validmind.vm_models.VMInput +defwith_options(\*\*kwargs = {})validmind.vm_models.VMInput ::: @@ -512,7 +512,7 @@ To allow options, just override this method in the subclass (see VMDataset) and **Arguments** -- \*\***kwargs**: Arbitrary keyword arguments that will be passed to the input object +- `**kwargs`: Arbitrary keyword arguments that will be passed to the input object **Returns** @@ -526,7 +526,7 @@ To allow options, just override this method in the subclass (see VMDataset) and ::: {.signature} -class VMModel() +classVMModel() ::: @@ -536,10 +536,10 @@ An base class that wraps a trained model instance and its associated data. **Arguments** -- **model** (object, optional): The trained model instance. Defaults to None. -- **input_id** (str, optional): The input ID for the model. Defaults to None. -- **attributes** (ModelAttributes, optional): The attributes of the model. Defaults to None. -- **name** (str): The name of the model. Defaults to the class name. +- `model` (object, optional): The trained model instance. Defaults to None. +- `input_id` (str, optional): The input ID for the model. Defaults to None. +- `attributes` (ModelAttributes, optional): The attributes of the model. Defaults to None. +- `name` (str): The name of the model. Defaults to the class name. **Inherited members** @@ -549,7 +549,7 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -def predict(self,args = (),kwargs = {}) +defpredict(args = (),\*\*kwargs = {}) ::: @@ -563,7 +563,7 @@ Predict method for the model. This is a wrapper around the model's ::: {.signature} -def predict_proba(self,args = (),kwargs = {}) +defpredict_proba(args = (),\*\*kwargs = {}) ::: @@ -577,7 +577,7 @@ Predict probabilties - must be implemented by subclass if needed ::: {.signature} -def serialize(self) +defserialize() ::: From 5c7aea612d2a84311d25a81df4d59a9e255eb435 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 9 Feb 2025 18:33:14 -0800 Subject: [PATCH 070/207] Save point types fine-tuning --- docs/templates/macros/types.jinja2 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index 6adfabdf1..731d7dca7 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -39,6 +39,8 @@ {{ type.name }} {%- elif add_links and type.name not in type_keywords -%} validmind.vm_models.{{ type.name }} + {%- elif type.name in type_keywords -%} + {{ type.name }} {%- else -%} {{ type.name }} {%- endif -%} @@ -68,6 +70,8 @@ {% else %} {%- if type|lower in builtin_types -%} {{ type }} + {%- elif type in type_keywords -%} + {{ type }} {%- else -%} {{ type }} {%- endif -%} From f33043e799ee9c157ee3898d70993c3ba9ff749e Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 9 Feb 2025 19:04:35 -0800 Subject: [PATCH 071/207] Add missing default to docstring and fix grammar --- validmind/client.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/validmind/client.py b/validmind/client.py index 62b4c3b14..0dee309c6 100644 --- a/validmind/client.py +++ b/validmind/client.py @@ -380,9 +380,9 @@ class based on the test_suite_id, initialize each of the tests, and run them. send (bool, optional): Whether to post the test results to the API. send=False is useful for testing. Defaults to True. fail_fast (bool, optional): Whether to stop running tests after the first failure. Defaults to False. - inputs (dict, optional): A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` - `models` etc. These inputs will be accessible by any test in the test suite. See the test - documentation or `vm.describe_test()` for more details on the inputs required for each. + inputs (dict, optional): A dictionary of test inputs to pass to the TestSuite, such as `model`, `dataset` + `models`, etc. These inputs will be accessible by any test in the test suite. See the test + documentation or `vm.describe_test()` for more details on the inputs required for each. Defaults to None. **kwargs: backwards compatibility for passing in test inputs using keyword arguments Raises: From f1b14437d7f46ec0ebedea340134d2fb23bd13a9 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 9 Feb 2025 19:05:45 -0800 Subject: [PATCH 072/207] Fix default handling in docstrings, fix class for type keywords --- docs/templates/macros/docstring.jinja2 | 2 +- docs/templates/macros/signatures.jinja2 | 2 +- docs/templates/macros/types.jinja2 | 10 +++--- docs/validmind.qmd | 32 +++++++++---------- docs/validmind/errors.qmd | 12 +++---- docs/validmind/tests.qmd | 22 ++++++------- .../tests/data_validation/ClassImbalance.qmd | 2 +- .../tests/data_validation/DatasetSplit.qmd | 2 +- .../data_validation/DescriptiveStatistics.qmd | 2 +- .../sklearn/HyperParametersTuning.qmd | 2 +- .../sklearn/KMeansClustersOptimization.qmd | 2 +- .../sklearn/OverfitDiagnosis.qmd | 2 +- .../sklearn/PopulationStabilityIndex.qmd | 2 +- .../sklearn/RobustnessDiagnosis.qmd | 2 +- .../sklearn/TrainingTestDegradation.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 2 +- .../RegressionModelSensitivityPlot.qmd | 2 +- docs/validmind/unit_metrics.qmd | 6 ++-- docs/validmind/vm_models.qmd | 18 +++++------ 19 files changed, 63 insertions(+), 63 deletions(-) diff --git a/docs/templates/macros/docstring.jinja2 b/docs/templates/macros/docstring.jinja2 index b2f7de1a7..08548d7dc 100644 --- a/docs/templates/macros/docstring.jinja2 +++ b/docs/templates/macros/docstring.jinja2 @@ -27,7 +27,7 @@ {%- endif -%} {%- if param.type_name -%} {%- set type_info = '(' ~ param.type_name -%} - {%- if param.default == "None" -%} + {%- if param.default == "None" or param.default == "True" or param.default == "False" or "Defaults to" in desc -%} {%- set type_info = type_info ~ ', optional' -%} {%- endif -%} {%- set type_info = type_info ~ ')' -%} diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index 74a81826b..b43ab878e 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -26,7 +26,7 @@ {%- if param.annotation -%} : {{ format_type(param.annotation, add_links=true) }} {%- endif -%} - {%- if param.default is not none -%} + {%- if param.default is not none and param.name != "kwargs" -%} = {%- if param.default is string and param.default.startswith("'") and param.default.endswith("'") -%} {{ param.default }} diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index 731d7dca7..96d63bc3c 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -35,12 +35,12 @@ {%- elif type.cls == "ExprName" -%} {%- if module and type.name in module.members and module.members[type.name].kind == "alias" -%} {{ module.members[type.name].target_path }} + {%- elif type.name in type_keywords -%} + {{ type.name }} {%- elif type.name|lower in builtin_types -%} {{ type.name }} {%- elif add_links and type.name not in type_keywords -%} validmind.vm_models.{{ type.name }} - {%- elif type.name in type_keywords -%} - {{ type.name }} {%- else -%} {{ type.name }} {%- endif -%} @@ -68,10 +68,10 @@ {%- endif -%} {%- endif -%} {% else %} - {%- if type|lower in builtin_types -%} - {{ type }} - {%- elif type in type_keywords -%} + {%- if type in type_keywords -%} {{ type }} + {%- elif type|lower in builtin_types -%} + {{ type }} {%- else -%} {{ type }} {%- endif -%} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 537dad9fa..48bd14f25 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -55,7 +55,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -defget_test_suite(test_suite_id: str = None,section: str = None,args = (),\*\*kwargs = {})validmind.vm_models.TestSuite +defget_test_suite(test_suite_id: str = None,section: str = None,args = (),\*\*kwargs)validmind.vm_models.TestSuite ::: @@ -67,8 +67,8 @@ This function provides an interface to retrieve the TestSuite instance for the c **Arguments** -- `test_suite_id` (str): The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. -- `section` (str): The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. +- `test_suite_id` (str, optional): The test suite name. If not passed, then the project's test suite will be returned. Defaults to None. +- `section` (str, optional): The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. - `args`: Additional arguments to pass to the TestSuite - `kwargs`: Additional keyword arguments to pass to the TestSuite @@ -95,8 +95,8 @@ If the API key and secret are not provided, the client will attempt to retrieve - `api_key` (str, optional): The API key. Defaults to None. - `api_secret` (str, optional): The API secret. Defaults to None. - `api_host` (str, optional): The API host. Defaults to None. -- `monitoring` (bool): The ongoing monitoring flag. Defaults to False. -- `generate_descriptions` (bool): Whether to use GenAI to generate test result descriptions. Defaults to True. +- `monitoring` (bool, optional): The ongoing monitoring flag. Defaults to False. +- `generate_descriptions` (bool, optional): Whether to use GenAI to generate test result descriptions. Defaults to True. **Raises** @@ -149,7 +149,7 @@ The following dataset types are supported: ::: {.signature} -definit_model(model: object = None,input_id: str = 'model',attributes: dict = None,predict_fn: callable = None,\_\_log = True,\*\*kwargs = {})validmind.vm_models.VMModel +definit_model(model: object = None,input_id: str = 'model',attributes: dict = None,predict_fn: callable = None,\_\_log = True,\*\*kwargs)validmind.vm_models.VMModel ::: @@ -211,7 +211,7 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ::: {.signature} -deflog_metric(key: str,value: float,inputs: Optional\[List\[str\]\] = None,params: Optional\[Dict\[str, Any\]\] = None,recorded_at: Optional\[str\] = None,thresholds: Optional\[Dict\[str, Any\]\] = None) +deflog_metric(key: str,value: float,inputs: Optional\[List\[str\]\] = None,params: Optional\[Dict\[str, Any\]\] = None,recorded_at: Optional\[str\] = None,thresholds: Optional\[Dict\[str, Any\]\] = None) ::: @@ -286,7 +286,7 @@ Reconnect to the ValidMind API and reload the project configuration ::: {.signature} -defrun_documentation_tests(section = None,send = True,fail_fast = False,inputs = None,config = None,\*\*kwargs = {}) +defrun_documentation_tests(section = None,send = True,fail_fast = False,inputs = None,config = None,\*\*kwargs) ::: @@ -299,8 +299,8 @@ This function will analyze the current project's documentation template and coll **Arguments** - `section` (str or list, optional): The section(s) to preview. Defaults to None. -- `send` (bool): Whether to send the results to the ValidMind API. Defaults to True. -- `fail_fast` (bool): Whether to stop running tests after the first failure. Defaults to False. +- `send` (bool, optional): Whether to send the results to the ValidMind API. Defaults to True. +- `fail_fast` (bool, optional): Whether to stop running tests after the first failure. Defaults to False. - `inputs` (dict): A dictionary of test inputs to pass to the TestSuite - `config`: A dictionary of test parameters to override the defaults - `**kwargs`: backwards compatibility for passing in test inputs using keyword arguments @@ -319,7 +319,7 @@ This function will analyze the current project's documentation template and coll ::: {.signature} -defrun_test_suite(test_suite_id,send = True,fail_fast = False,config = None,inputs = None,\*\*kwargs = {}) +defrun_test_suite(test_suite_id,send = True,fail_fast = False,config = None,inputs = None,\*\*kwargs) ::: @@ -332,10 +332,10 @@ This function provides a high level interface for running a test suite. A test s **Arguments** - `test_suite_id` (str): The test suite name (e.g. 'classifier_full_suite') -- `config` (dict): A dictionary of parameters to pass to the tests in the test suite. Defaults to None. -- `send` (bool): Whether to post the test results to the API. send=False is useful for testing. Defaults to True. -- `fail_fast` (bool): Whether to stop running tests after the first failure. Defaults to False. -- `inputs` (dict): A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` `models` etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. +- `config` (dict, optional): A dictionary of parameters to pass to the tests in the test suite. Defaults to None. +- `send` (bool, optional): Whether to post the test results to the API. send=False is useful for testing. Defaults to True. +- `fail_fast` (bool, optional): Whether to stop running tests after the first failure. Defaults to False. +- `inputs` (dict, optional): A dictionary of test inputs to pass to the TestSuite, such as `model`, `dataset` `models`, etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. Defaults to None. - `**kwargs`: backwards compatibility for passing in test inputs using keyword arguments **Returns** @@ -443,7 +443,7 @@ Holds raw data for a test result ::: {.signature} -def__init__(log: bool = False,\*\*kwargs = {}) +def__init__(log: bool = False,\*\*kwargs) ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index d400e7023..50a428ac8 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -58,7 +58,7 @@ Generic error for API request errors that are not known. ::: {.signature} -defdescription(args = (),\*\*kwargs = {}) +defdescription(args = (),\*\*kwargs) ::: @@ -127,7 +127,7 @@ When the test suite was found but could not be initialized. ::: {.signature} -defdescription(args = (),\*\*kwargs = {}) +defdescription(args = (),\*\*kwargs) ::: @@ -217,7 +217,7 @@ When an invalid metric results object is sent to the API. ::: {.signature} -defdescription(args = (),\*\*kwargs = {}) +defdescription(args = (),\*\*kwargs) ::: @@ -412,7 +412,7 @@ When the class labels found in the dataset don't match the provided target label ::: {.signature} -defdescription(args = (),\*\*kwargs = {}) +defdescription(args = (),\*\*kwargs) ::: @@ -523,7 +523,7 @@ When the client config is missing the documentation template. ::: {.signature} -defdescription(args = (),\*\*kwargs = {}) +defdescription(args = (),\*\*kwargs) ::: @@ -598,7 +598,7 @@ When the R extras have not been installed. ::: {.signature} -defdescription(args = (),\*\*kwargs = {}) +defdescription(args = (),\*\*kwargs) ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 662c820d2..40bdd9894 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -33,7 +33,7 @@ This function can be used to see test details including the test name, descripti **Arguments** - `test_id` (str, optional): The test ID. Defaults to None. -- `raw` (bool): If True, returns a dictionary with the test details. Defaults to False. +- `raw` (bool, optional): If True, returns a dictionary with the test details. Defaults to False. ## list_tags() @@ -99,11 +99,11 @@ List all tests in the tests directory. **Arguments** -- `filter` (str): Find tests where the ID, tasks or tags match the filter string. Defaults to None. -- `task` (str): Find tests that match the task. Can be used to narrow down matches from the filter string. Defaults to None. -- `tags` (list): Find tests that match list of tags. Can be used to narrow down matches from the filter string. Defaults to None. -- `pretty` (bool): If True, returns a pandas DataFrame with a formatted table. Defaults to True. -- `truncate` (bool): If True, truncates the test description to the first line. Defaults to True. (only used if pretty=True) +- `filter` (str, optional): Find tests where the ID, tasks or tags match the filter string. Defaults to None. +- `task` (str, optional): Find tests that match the task. Can be used to narrow down matches from the filter string. Defaults to None. +- `tags` (list, optional): Find tests that match list of tags. Can be used to narrow down matches from the filter string. Defaults to None. +- `pretty` (bool, optional): If True, returns a pandas DataFrame with a formatted table. Defaults to True. +- `truncate` (bool, optional): If True, truncates the test description to the first line. Defaults to True. (only used if pretty=True) **Returns** @@ -128,7 +128,7 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. **Arguments** - `test_id` (str): The test ID in the format `namespace.path_to_module.TestName[:tag]` -- `test_func` (callable): The test function to load. If not provided, the test will be loaded from the test provider. Defaults to None. +- `test_func` (callable, optional): The test function to load. If not provided, the test will be loaded from the test provider. Defaults to None. ## run_test() @@ -136,7 +136,7 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. ::: {.signature} -defrun_test(test_id: Union\[validmind.vm_models.TestID, None\] = None,name: Union\[str, None\] = None,unit_metrics: Union\[List\[validmind.vm_models.TestID\], None\] = None,inputs: Union\[Dict\[str, Any\], None\] = None,input_grid: Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\] = None,params: Union\[Dict\[str, Any\], None\] = None,param_grid: Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\] = None,show: bool = True,generate_description: bool = True,title: Optional\[str\] = None,post_process_fn: Union\[Callable\[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, None\], None\] = None,\*\*kwargs = {})validmind.vm_models.TestResult +defrun_test(test_id: Union\[validmind.vm_models.TestID, None\] = None,name: Union\[str, None\] = None,unit_metrics: Union\[List\[validmind.vm_models.TestID\], None\] = None,inputs: Union\[Dict\[str, Any\], None\] = None,input_grid: Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\] = None,params: Union\[Dict\[str, Any\], None\] = None,param_grid: Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\] = None,show: bool = True,generate_description: bool = True,title: Optional\[str\] = None,post_process_fn: Union\[Callable\[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, None\], None\] = None,\*\*kwargs)validmind.vm_models.TestResult ::: @@ -159,8 +159,8 @@ This function is the main entry point for running tests. It can run simple unit - List of input dictionaries to test - `name` (str): Test name (required for composite metrics) - `unit_metrics` (list): Unit metric IDs to run as composite metric -- `show` (bool): Whether to display results. Defaults to True. -- `generate_description` (bool): Whether to generate a description. Defaults to True. +- `show` (bool, optional): Whether to display results. Defaults to True. +- `generate_description` (bool, optional): Whether to generate a description. Defaults to True. - `title` (str): Custom title for the test result - `post_process_fn` (Callable\[[TestResult], None\]): Function to post-process the test result @@ -402,7 +402,7 @@ Protocol for user-defined test providers ::: {.signature} -deflist_tests()List\[str\] +deflist_tests()List\[str\] ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 19f6b7034..0ad0804f9 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -defClassImbalance(dataset: validmind.vm_models.VMDataset,min_percent_threshold: int = 10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\] +defClassImbalance(dataset: validmind.vm_models.VMDataset,min_percent_threshold: int = 10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\] ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 3648c3f7e..d01165d09 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defDatasetSplit(datasets: List\[validmind.vm_models.VMDataset\]) +defDatasetSplit(datasets: List\[validmind.vm_models.VMDataset\]) ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 3897e3ad7..56cedb56d 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defformat_records(df: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict\[str, Any\]\] +defformat_records(df: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict\[str, Any\]\] ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 10b5ea3a0..9de3a1c19 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defHyperParametersTuning(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,param_grid: dict,scoring: Union\[str, List, Dict\] = None,thresholds: Union\[float, List\[float\]\] = None,fit_params: dict = None) +defHyperParametersTuning(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,param_grid: dict,scoring: Union\[str, List, Dict\] = None,thresholds: Union\[float, List\[float\]\] = None,fit_params: dict = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index a1b2ae73f..328d38769 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defKMeansClustersOptimization(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,n_clusters: Union\[List\[int\], None\] = None) +defKMeansClustersOptimization(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,n_clusters: Union\[List\[int\], None\] = None) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index ce09ac56c..0d38de00b 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defOverfitDiagnosis(model: validmind.vm_models.VMModel,datasets: List\[validmind.vm_models.VMDataset\],metric: str = None,cut_off_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}) +defOverfitDiagnosis(model: validmind.vm_models.VMModel,datasets: List\[validmind.vm_models.VMDataset\],metric: str = None,cut_off_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index c1fffb5ff..5c64c28b0 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -46,7 +46,7 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -defPopulationStabilityIndex(datasets: List\[validmind.vm_models.VMDataset\],model: validmind.vm_models.VMModel,num_bins: int = 10,mode: str = 'fixed') +defPopulationStabilityIndex(datasets: List\[validmind.vm_models.VMDataset\],model: validmind.vm_models.VMModel,num_bins: int = 10,mode: str = 'fixed') ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index aa96be14d..347a59fea 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRobustnessDiagnosis(datasets: List\[validmind.vm_models.VMDataset\],model: validmind.vm_models.VMModel,metric: str = None,scaling_factor_std_dev_list: List\[float\] = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}) +defRobustnessDiagnosis(datasets: List\[validmind.vm_models.VMDataset\],model: validmind.vm_models.VMModel,metric: str = None,scaling_factor_std_dev_list: List\[float\] = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 58d2e6fbe..7a44fa4c6 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTrainingTestDegradation(datasets: List\[validmind.vm_models.VMDataset\],model: validmind.vm_models.VMModel,max_threshold: float = 0.1) +defTrainingTestDegradation(datasets: List\[validmind.vm_models.VMDataset\],model: validmind.vm_models.VMModel,max_threshold: float = 0.1) ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index a920d8736..d3da3c397 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defWeakspotsDiagnosis(datasets: List\[validmind.vm_models.VMDataset\],model: validmind.vm_models.VMModel,features_columns: Union\[List\[str\], None\] = None,metrics: Union\[Dict\[str, Callable\], None\] = None,thresholds: Union\[Dict\[str, float\], None\] = None) +defWeakspotsDiagnosis(datasets: List\[validmind.vm_models.VMDataset\],model: validmind.vm_models.VMModel,features_columns: Union\[List\[str\], None\] = None,metrics: Union\[Dict\[str, Callable\], None\] = None,thresholds: Union\[Dict\[str, float\], None\] = None) ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index b50fc20e2..1436d9b09 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionModelSensitivityPlot(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,shocks: List\[float\] = {'cls': 'ExprList', 'elements': ['0.1']},transformation: Union\[str, None\] = None) +defRegressionModelSensitivityPlot(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,shocks: List\[float\] = {'cls': 'ExprList', 'elements': ['0.1']},transformation: Union\[str, None\] = None) ::: diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index acb24a274..26292a2a4 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defdescribe_metric(metric_id: str,\*\*kwargs = {}) +defdescribe_metric(metric_id: str,\*\*kwargs) ::: @@ -30,7 +30,7 @@ Describe a metric ::: {.signature} -deflist_metrics(\*\*kwargs = {}) +deflist_metrics(\*\*kwargs) ::: @@ -46,7 +46,7 @@ List all metrics ::: {.signature} -defrun_metric(metric_id: str,\*\*kwargs = {}) +defrun_metric(metric_id: str,\*\*kwargs) ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index b0cb9c483..fc3765174 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -146,7 +146,7 @@ Each test in a test suite can accept parameters and those parameters can have de ::: {.signature} -defget_tests()List\[str\] +defget_tests()List\[str\] ::: @@ -216,8 +216,8 @@ Runs the test suite, renders the summary and sends the results to ValidMind **Arguments** -- `send` (bool): Whether to send the results to ValidMind. Defaults to True. -- `fail_fast` (bool): Whether to stop running tests after the first failure. Defaults to False. +- `send` (bool, optional): Whether to send the results to ValidMind. Defaults to True. +- `fail_fast` (bool, optional): Whether to stop running tests after the first failure. Defaults to False. ### [summarize[()]{.muted}](#summarize) @@ -291,7 +291,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -defassign_predictions(model: validmind.vm_models.VMModel,prediction_column: str = None,prediction_values: list = None,probability_column: str = None,probability_values: list = None,prediction_probabilities: list = None,\*\*kwargs = {}) +defassign_predictions(model: validmind.vm_models.VMModel,prediction_column: str = None,prediction_values: list = None,probability_column: str = None,probability_values: list = None,prediction_probabilities: list = None,\*\*kwargs) ::: @@ -357,7 +357,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -defwith_options(\*\*kwargs = {})validmind.vm_models.VMDataset +defwith_options(\*\*kwargs)validmind.vm_models.VMDataset ::: @@ -500,7 +500,7 @@ Base class for ValidMind Input types ::: {.signature} -defwith_options(\*\*kwargs = {})validmind.vm_models.VMInput +defwith_options(\*\*kwargs)validmind.vm_models.VMInput ::: @@ -539,7 +539,7 @@ An base class that wraps a trained model instance and its associated data. - `model` (object, optional): The trained model instance. Defaults to None. - `input_id` (str, optional): The input ID for the model. Defaults to None. - `attributes` (ModelAttributes, optional): The attributes of the model. Defaults to None. -- `name` (str): The name of the model. Defaults to the class name. +- `name` (str, optional): The name of the model. Defaults to the class name. **Inherited members** @@ -549,7 +549,7 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -defpredict(args = (),\*\*kwargs = {}) +defpredict(args = (),\*\*kwargs) ::: @@ -563,7 +563,7 @@ Predict method for the model. This is a wrapper around the model's ::: {.signature} -defpredict_proba(args = (),\*\*kwargs = {}) +defpredict_proba(args = (),\*\*kwargs) ::: From 2cd783f04d0752c4de218f06f9a98a5555f32960 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 9 Feb 2025 19:09:05 -0800 Subject: [PATCH 073/207] Fix default handling in docstrings, fix class for type keywords --- docs/templates/macros/signatures.jinja2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index b43ab878e..c0a0dee0b 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -13,7 +13,7 @@ {%- endif -%} {%- endif -%} -{# Use class name for constructors #} + {{ member.parent.name if (member.name == "__init__" and member.kind == "method") else member.name }}{%- if member.parameters -%}({{- '' -}} {%- set params = [] -%} {%- for param in member.parameters -%} From 40f1168b3577579ba79b5fc085421f4c2fe5fd9c Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 9 Feb 2025 19:11:44 -0800 Subject: [PATCH 074/207] Fix default handling in docstrings, fix class for type keywords --- scripts/generate_quarto_docs.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 6cef996df..4d5c3f79d 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -300,26 +300,26 @@ def parse_docstrings(data: Dict[str, Any]): try: # Debug original docstring if 'Args:' in original: - print(f"\nProcessing docstring for: {data.get('name', 'unknown')}") - print(f"ORIGINAL:\n{original}") + # print(f"\nProcessing docstring for: {data.get('name', 'unknown')}") + # print(f"ORIGINAL:\n{original}") # Split on double newlines and join first section's lines sections = original.split('\n\n') sections[0] = ' '.join(sections[0].split('\n')) original = '\n\n'.join(sections) - print("\nSections after double newline split:") - for i, section in enumerate(sections): - print(f"\nSection {i}:\n{section}") + # print("\nSections after double newline split:") + # for i, section in enumerate(sections): + # print(f"\nSection {i}:\n{section}") parsed = parse(original, style=Style.GOOGLE) # Debug parsed result - if 'Args:' in original: - print("\nPARSED RESULT:") - print(f"- short_description: {parsed.short_description}") - print(f"- long_description: {parsed.long_description}") - print(f"- params: {[(p.arg_name, p.type_name, p.description) for p in parsed.params]}") + # if 'Args:' in original: + # print("\nPARSED RESULT:") + # print(f"- short_description: {parsed.short_description}") + # print(f"- long_description: {parsed.long_description}") + # print(f"- params: {[(p.arg_name, p.type_name, p.description) for p in parsed.params]}") data['docstring'] = { 'value': original, From 2d74a7c5a052b43e863c2bd940652cfcde14752b Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 9 Feb 2025 19:55:09 -0800 Subject: [PATCH 075/207] Fix wording --- validmind/vm_models/result/result.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validmind/vm_models/result/result.py b/validmind/vm_models/result/result.py index 82da5edeb..9016c6bb0 100644 --- a/validmind/vm_models/result/result.py +++ b/validmind/vm_models/result/result.py @@ -50,7 +50,7 @@ def __init__(self, log: bool = False, **kwargs): Args: log (bool): If True, log the raw data to ValidMind - **kwargs: Keyword arguments to set as attributes e.g. + **kwargs: Keyword arguments to set as attributes, such as `RawData(log=True, dataset_duplicates=df_duplicates)` """ self.log = log From f7445220348804d07087d3f70b98c8c21b69bada Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 9 Feb 2025 20:51:22 -0800 Subject: [PATCH 076/207] Output class methods on single line and append colon for classes and class methods --- docs.qmd | 375 ------------------ docs/templates/macros/signatures.jinja2 | 21 +- docs/templates/module.qmd.jinja2 | 9 +- docs/validmind.qmd | 48 ++- .../classification/customer_churn.qmd | 12 +- .../datasets/classification/taiwan_credit.qmd | 10 +- .../datasets/credit_risk/lending_club.qmd | 20 +- .../credit_risk/lending_club_bias.qmd | 8 +- docs/validmind/datasets/nlp/cnn_dailymail.qmd | 4 +- .../datasets/nlp/twitter_covid_19.qmd | 2 +- docs/validmind/datasets/regression/fred.qmd | 16 +- .../datasets/regression/lending_club.qmd | 6 +- docs/validmind/errors.qmd | 88 ++-- docs/validmind/test_suites.qmd | 74 ++-- docs/validmind/test_suites/classifier.qmd | 14 +- docs/validmind/test_suites/cluster.qmd | 8 +- docs/validmind/test_suites/embeddings.qmd | 6 +- docs/validmind/test_suites/llm.qmd | 12 +- docs/validmind/test_suites/nlp.qmd | 10 +- .../test_suites/parameters_optimization.qmd | 2 +- docs/validmind/test_suites/regression.qmd | 10 +- .../test_suites/statsmodels_timeseries.qmd | 4 +- docs/validmind/test_suites/summarization.qmd | 2 +- .../test_suites/tabular_datasets.qmd | 6 +- docs/validmind/test_suites/text_data.qmd | 2 +- docs/validmind/test_suites/time_series.qmd | 14 +- docs/validmind/tests.qmd | 36 +- .../tests/data_validation/ACFandPACFPlot.qmd | 2 +- docs/validmind/tests/data_validation/ADF.qmd | 4 +- .../tests/data_validation/AutoAR.qmd | 4 +- .../tests/data_validation/AutoMA.qmd | 4 +- .../data_validation/AutoStationarity.qmd | 2 +- .../data_validation/BivariateScatterPlots.qmd | 2 +- .../tests/data_validation/BoxPierce.qmd | 2 +- .../ChiSquaredFeaturesTable.qmd | 4 +- .../tests/data_validation/ClassImbalance.qmd | 4 +- .../data_validation/DatasetDescription.qmd | 14 +- .../tests/data_validation/DatasetSplit.qmd | 2 +- .../data_validation/DescriptiveStatistics.qmd | 10 +- .../tests/data_validation/DickeyFullerGLS.qmd | 6 +- .../tests/data_validation/Duplicates.qmd | 2 +- .../data_validation/EngleGrangerCoint.qmd | 4 +- .../FeatureTargetCorrelationPlot.qmd | 2 +- .../tests/data_validation/HighCardinality.qmd | 2 +- .../HighPearsonCorrelation.qmd | 2 +- .../data_validation/IQROutliersBarPlot.qmd | 4 +- .../data_validation/IQROutliersTable.qmd | 4 +- .../IsolationForestOutliers.qmd | 2 +- .../tests/data_validation/JarqueBera.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 6 +- .../tests/data_validation/LJungBox.qmd | 2 +- .../LaggedCorrelationHeatmap.qmd | 2 +- .../tests/data_validation/MissingValues.qmd | 2 +- .../data_validation/MissingValuesBarPlot.qmd | 2 +- .../data_validation/MutualInformation.qmd | 2 +- .../PearsonCorrelationMatrix.qmd | 2 +- .../data_validation/PhillipsPerronArch.qmd | 6 +- .../ProtectedClassesCombination.qmd | 6 +- .../ProtectedClassesDescription.qmd | 4 +- .../ProtectedClassesDisparity.qmd | 6 +- .../ProtectedClassesThresholdOptimizer.qmd | 18 +- .../data_validation/RollingStatsPlot.qmd | 6 +- .../tests/data_validation/RunsTest.qmd | 2 +- .../tests/data_validation/ScatterPlot.qmd | 2 +- .../data_validation/ScoreBandDefaultRates.qmd | 2 +- .../data_validation/SeasonalDecompose.qmd | 6 +- .../tests/data_validation/ShapiroWilk.qmd | 2 +- .../tests/data_validation/Skewness.qmd | 2 +- .../tests/data_validation/SpreadPlot.qmd | 4 +- .../TabularCategoricalBarPlots.qmd | 4 +- .../TabularDateTimeHistograms.qmd | 4 +- .../TabularDescriptionTables.qmd | 14 +- .../TabularNumericalHistograms.qmd | 2 +- .../data_validation/TargetRateBarPlots.qmd | 4 +- .../data_validation/TimeSeriesDescription.qmd | 2 +- .../TimeSeriesDescriptiveStatistics.qmd | 2 +- .../data_validation/TimeSeriesFrequency.qmd | 4 +- .../data_validation/TimeSeriesHistogram.qmd | 4 +- .../data_validation/TimeSeriesLinePlot.qmd | 4 +- .../TimeSeriesMissingValues.qmd | 4 +- .../data_validation/TimeSeriesOutliers.qmd | 4 +- .../data_validation/TooManyZeroValues.qmd | 2 +- .../tests/data_validation/UniqueRows.qmd | 2 +- .../tests/data_validation/WOEBinPlots.qmd | 6 +- .../tests/data_validation/WOEBinTable.qmd | 4 +- .../data_validation/ZivotAndrewsArch.qmd | 6 +- .../tests/data_validation/nlp/CommonWords.qmd | 2 +- .../tests/data_validation/nlp/Hashtags.qmd | 4 +- .../data_validation/nlp/LanguageDetection.qmd | 2 +- .../tests/data_validation/nlp/Mentions.qmd | 4 +- .../nlp/PolarityAndSubjectivity.qmd | 2 +- .../data_validation/nlp/Punctuations.qmd | 2 +- .../tests/data_validation/nlp/Sentiment.qmd | 2 +- .../tests/data_validation/nlp/StopWords.qmd | 2 +- .../data_validation/nlp/TextDescription.qmd | 4 +- .../tests/data_validation/nlp/Toxicity.qmd | 2 +- .../tests/model_validation/BertScore.qmd | 4 +- .../tests/model_validation/BleuScore.qmd | 4 +- .../ClusterSizeDistribution.qmd | 2 +- .../model_validation/ContextualRecall.qmd | 4 +- .../tests/model_validation/FeaturesAUC.qmd | 6 +- .../tests/model_validation/MeteorScore.qmd | 4 +- .../tests/model_validation/ModelMetadata.qmd | 4 +- .../ModelPredictionResiduals.qmd | 2 +- .../tests/model_validation/RegardScore.qmd | 4 +- .../RegressionResidualsPlot.qmd | 2 +- .../tests/model_validation/RougeScore.qmd | 2 +- .../TimeSeriesPredictionWithCI.qmd | 2 +- .../TimeSeriesPredictionsPlot.qmd | 2 +- .../TimeSeriesR2SquareBySegments.qmd | 2 +- .../tests/model_validation/TokenDisparity.qmd | 2 +- .../tests/model_validation/ToxicityScore.qmd | 2 +- .../sklearn/AdjustedMutualInformation.qmd | 2 +- .../sklearn/AdjustedRandIndex.qmd | 2 +- .../sklearn/CalibrationCurve.qmd | 2 +- .../sklearn/ClassifierPerformance.qmd | 4 +- .../ClassifierThresholdOptimization.qmd | 4 +- .../sklearn/ClusterCosineSimilarity.qmd | 4 +- .../sklearn/ClusterPerformanceMetrics.qmd | 2 +- .../sklearn/CompletenessScore.qmd | 2 +- .../sklearn/ConfusionMatrix.qmd | 2 +- .../sklearn/FeatureImportance.qmd | 2 +- .../sklearn/FowlkesMallowsScore.qmd | 2 +- .../sklearn/HomogeneityScore.qmd | 2 +- .../sklearn/HyperParametersTuning.qmd | 4 +- .../sklearn/KMeansClustersOptimization.qmd | 4 +- .../sklearn/MinimumAccuracy.qmd | 2 +- .../sklearn/MinimumF1Score.qmd | 2 +- .../sklearn/MinimumROCAUCScore.qmd | 2 +- .../sklearn/ModelParameters.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 4 +- .../sklearn/OverfitDiagnosis.qmd | 4 +- .../sklearn/PermutationFeatureImportance.qmd | 6 +- .../sklearn/PopulationStabilityIndex.qmd | 8 +- .../sklearn/PrecisionRecallCurve.qmd | 4 +- .../model_validation/sklearn/ROCCurve.qmd | 4 +- .../sklearn/RegressionErrors.qmd | 2 +- .../sklearn/RegressionErrorsComparison.qmd | 4 +- .../sklearn/RegressionPerformance.qmd | 4 +- .../sklearn/RegressionR2Square.qmd | 4 +- .../sklearn/RegressionR2SquareComparison.qmd | 4 +- .../sklearn/RobustnessDiagnosis.qmd | 6 +- .../sklearn/SHAPGlobalImportance.qmd | 10 +- .../sklearn/ScoreProbabilityAlignment.qmd | 2 +- .../sklearn/SilhouettePlot.qmd | 2 +- .../sklearn/TrainingTestDegradation.qmd | 2 +- .../model_validation/sklearn/VMeasure.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 2 +- .../statsmodels/AutoARIMA.qmd | 4 +- .../CumulativePredictionProbabilities.qmd | 2 +- .../statsmodels/DurbinWatsonTest.qmd | 2 +- .../statsmodels/GINITable.qmd | 2 +- .../statsmodels/KolmogorovSmirnov.qmd | 4 +- .../statsmodels/Lilliefors.qmd | 2 +- .../PredictionProbabilitiesHistogram.qmd | 2 +- .../statsmodels/RegressionCoeffs.qmd | 4 +- .../RegressionFeatureSignificance.qmd | 6 +- .../RegressionModelForecastPlot.qmd | 4 +- .../RegressionModelForecastPlotLevels.qmd | 4 +- .../RegressionModelSensitivityPlot.qmd | 6 +- .../statsmodels/RegressionModelSummary.qmd | 4 +- ...RegressionPermutationFeatureImportance.qmd | 4 +- .../statsmodels/ScorecardHistogram.qmd | 2 +- .../statsmodels/statsutils.qmd | 2 +- .../tests/prompt_validation/Bias.qmd | 10 +- .../tests/prompt_validation/Clarity.qmd | 10 +- .../tests/prompt_validation/Conciseness.qmd | 10 +- .../tests/prompt_validation/Delimitation.qmd | 10 +- .../prompt_validation/NegativeInstruction.qmd | 10 +- .../tests/prompt_validation/Robustness.qmd | 8 +- .../tests/prompt_validation/Specificity.qmd | 10 +- .../prompt_validation/ai_powered_test.qmd | 6 +- docs/validmind/unit_metrics.qmd | 6 +- docs/validmind/vm_models.qmd | 66 +-- 174 files changed, 546 insertions(+), 907 deletions(-) delete mode 100644 docs.qmd diff --git a/docs.qmd b/docs.qmd deleted file mode 100644 index e877aeb44..000000000 --- a/docs.qmd +++ /dev/null @@ -1,375 +0,0 @@ ---- -title: ValidMind Library -aliases: - - index.html -sidebar: validmind-reference ---- - -The ValidMind Library is a suite of developer tools and methods designed to automate the documentation and validation of your models. -Designed to be model agnostic, the ValidMind Library provides all the standard functionality without requiring you to rewrite any functions as long as your model is built in Python. - -With a rich array of documentation tools and test suites, from documenting descriptions of your datasets to testing your models for weak spots and overfit areas, the ValidMind Library helps you automate model documentation by feeding the ValidMind Platform with documentation artifacts and test results. - -To install the ValidMind Library: - -```bash -pip install validmind -``` - -To initialize the ValidMind Library, paste the code snippet with the model identifier credentials directly into your development source code, replacing this example with your own: - -```python -import validmind as vm - -vm.init( - api_host = "https://api.dev.vm.validmind.ai/api/v1/tracking/tracking", - api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", - api_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", - project = "" -) -``` - -After you have pasted the code snippet into your development source code and executed the code, the Python Library API will register with ValidMind. You can now use the ValidMind Library to document and test your models, and to upload to the ValidMind Platform. - -## Python API - -### __version__ - -```python -2.8.0 -``` - -### get_test_suite[()]{.muted} - -```python -def get_test_suite( - test_suite_id: str = None, - section: str = None, - *args = (), - **kwargs = {}) -> TestSuite: -``` - -Gets a TestSuite object for the current project or a specific test suite -This function provides an interface to retrieve the TestSuite instance for the -current project or a specific TestSuite instance identified by test_suite_id. -The project Test Suite will contain sections for every section in the project's -documentation template and these Test Suite Sections will contain all the tests -associated with that template section. - -**Parameters** -- **test_suite_id** str: The test suite name. If not passed, then the -project's test suite will be returned. Defaults to None. -- **section** str: The section of the documentation template from which -to retrieve the test suite. This only applies if test_suite_id is None. -Defaults to None. -- **args**: Additional arguments to pass to the TestSuite -- **kwargs**: Additional keyword arguments to pass to the TestSuite -### init[()]{.muted} - -```python -def init( - project: Optional = None, - api_key: Optional = None, - api_secret: Optional = None, - api_host: Optional = None, - model: Optional = None, - monitoring: bool = False): -``` - -Initializes the API client instances and calls the /ping endpoint to ensure -the provided credentials are valid and we can connect to the ValidMind API. - -If the API key and secret are not provided, the client will attempt to -retrieve them from the environment variables `VM_API_KEY` and `VM_API_SECRET`. - -**Parameters** -- **project** str: The project CUID. Alias for model. Defaults to None. [DEPRECATED] -- **model** str: The model CUID. Defaults to None. -- **api_key** str: The API key. Defaults to None. -- **api_secret** str: The API secret. Defaults to None. -- **api_host** str: The API host. Defaults to None. -- **monitoring** bool: The ongoing monitoring flag. Defaults to False. - -**Raises** -- **ValueError**: If the API key and secret are not provided -### init_dataset[()]{.muted} - -```python -def init_dataset( - dataset, - model = None, - index = None, - index_name: str = None, - date_time_index: bool = False, - columns: list = None, - text_column: str = None, - target_column: str = None, - feature_columns: list = None, - extra_columns: dict = None, - class_labels: dict = None, - type: str = None, - input_id: str = None, - __log = True) -> VMDataset: -``` - -Initializes a VM Dataset, which can then be passed to other functions -that can perform additional analysis and tests on the data. This function -also ensures we are reading a valid dataset type. - -The following dataset types are supported: -- Pandas DataFrame -- Polars DataFrame -- Numpy ndarray -- Torch TensorDataset - -Args: - dataset : dataset from various python libraries - model (VMModel): ValidMind model object - targets (vm.vm.DatasetTargets): A list of target variables - target_column (str): The name of the target column in the dataset - feature_columns (list): A list of names of feature columns in the dataset - extra_columns (dictionary): A dictionary containing the names of the - prediction_column and group_by_columns in the dataset - class_labels (dict): A list of class labels for classification problems - type (str): The type of dataset (one of DATASET_TYPES) - input_id (str): The input ID for the dataset (e.g. "my_dataset"). By default, - this will be set to `dataset` but if you are passing this dataset as a - test input using some other key than `dataset`, then you should set - this to the same key. - -Raises: - ValueError: If the dataset type is not supported - -Returns: - vm.vm.Dataset: A VM Dataset instance -### init_model[()]{.muted} - -```python -def init_model( - model: object = None, - input_id: str = 'model', - attributes: dict = None, - predict_fn: callable = None, - __log = True, - **kwargs = {}) -> VMModel: -``` - -Initializes a VM Model, which can then be passed to other functions -that can perform additional analysis and tests on the data. This function -also ensures we are creating a model supported libraries. - -**Parameters** -- **model**: A trained model or VMModel instance -- **input_id** str: The input ID for the model (e.g. "my_model"). By default, -this will be set to `model` but if you are passing this model as a -test input using some other key than `model`, then you should set -this to the same key. -- **attributes** dict: A dictionary of model attributes -- **predict_fn** callable: A function that takes an input and returns a prediction -- ****kwargs**: Additional arguments to pass to the model - -**Returns** -- A VM Model instance - -**Raises** -- **ValueError**: If the model type is not supported -### init_r_model[()]{.muted} - -```python -def init_r_model( - model_path: str, - input_id: str = 'model') -> VMModel: -``` - -Initializes a VM Model for an R model -R models must be saved to disk and the filetype depends on the model type... -Currently we support the following model types: - -- LogisticRegression `glm` model in R: saved as an RDS file with `saveRDS` -- LinearRegression `lm` model in R: saved as an RDS file with `saveRDS` -- XGBClassifier: saved as a .json or .bin file with `xgb.save` -- XGBRegressor: saved as a .json or .bin file with `xgb.save` - -LogisticRegression and LinearRegression models are converted to sklearn models by extracting -the coefficients and intercept from the R model. XGB models are loaded using the xgboost -since xgb models saved in .json or .bin format can be loaded directly with either Python or R - -**Parameters** -- **model_path** str: The path to the R model saved as an RDS or XGB file -- **model_type** str: The type of the model (one of R_MODEL_TYPES) - -**Returns** -- A VM Model instance -### log_metric[()]{.muted} - -```python -def log_metric( - key: str, - value: float, - inputs: Optional = None, - params: Optional = None, - recorded_at: Optional = None, - thresholds: Optional = None): -``` - -Logs a unit metric -Unit metrics are key-value pairs where the key is the metric name and the value is -a scalar (int or float). These key-value pairs are associated with the currently -selected model (inventory model in the ValidMind Platform) and keys can be logged -to over time to create a history of the metric. On the ValidMind Platform, these metrics -will be used to create plots/visualizations for documentation and dashboards etc. - -**Parameters** -- **key** str: The metric key -- **value** float: The metric value -- **inputs** list: A list of input IDs that were used to compute the metric. -- **params** dict: Dictionary of parameters used to compute the metric. -- **recorded_at** str: The timestamp of the metric. Server will use -current time if not provided. -- **thresholds** dict: Dictionary of thresholds for the metric. -### preview_template[()]{.muted} - -```python -def preview_template( -): -``` - -Preview the documentation template for the current project -This function will display the documentation template for the current project. If -the project has not been initialized, then an error will be raised. - -**Raises** -- **ValueError**: If the project has not been initialized -### reload[()]{.muted} - -```python -def reload( -): -``` - -Reconnect to the ValidMind API and reload the project configuration -### run_documentation_tests[()]{.muted} - -```python -def run_documentation_tests( - section = None, - send = True, - fail_fast = False, - inputs = None, - config = None, - **kwargs = {}): -``` - -Collect and run all the tests associated with a template -This function will analyze the current project's documentation template and collect -all the tests associated with it into a test suite. It will then run the test -suite, log the results to the ValidMind API, and display them to the user. - -**Parameters** -- **section** str or list: The section(s) to preview. Defaults to None. -- **send** bool: Whether to send the results to the ValidMind API. Defaults to True. -- **fail_fast** bool: Whether to stop running tests after the first failure. Defaults to False. -- **inputs** dict: A dictionary of test inputs to pass to the TestSuite -- **config**: A dictionary of test parameters to override the defaults -- ****kwargs**: backwards compatibility for passing in test inputs using keyword arguments - -**Returns** -- TestSuite or dict: The completed TestSuite instance or a dictionary of TestSuites if section is a list. - -**Raises** -- **ValueError**: If the project has not been initialized -### run_test_suite[()]{.muted} - -```python -def run_test_suite( - test_suite_id, - send = True, - fail_fast = False, - config = None, - inputs = None, - **kwargs = {}): -``` - -High Level function for running a test suite -This function provides a high level interface for running a test suite. A test suite is -a collection of tests. This function will automatically find the correct test suite -class based on the test_suite_id, initialize each of the tests, and run them. - -**Parameters** -- **test_suite_id** str: The test suite name (e.g. 'classifier_full_suite') -- **config** dict: A dictionary of parameters to pass to the tests in the -test suite. Defaults to None. -- **send** bool: Whether to post the test results to the API. send=False -is useful for testing. Defaults to True. -- **fail_fast** bool: Whether to stop running tests after the first failure. Defaults to False. -- **inputs** dict: A dictionary of test inputs to pass to the TestSuite e.g. `model`, `dataset` -`models` etc. These inputs will be accessible by any test in the test suite. See the test -documentation or `vm.describe_test()` for more details on the inputs required for each. -- ****kwargs**: backwards compatibility for passing in test inputs using keyword arguments - -**Returns** -- the TestSuite instance - -**Raises** -- **ValueError**: If the test suite name is not found or if there is an error initializing the test suite -### tags[()]{.muted} - -```python -def tags( - *tags = ()): -``` - -Decorator for specifying tags for a test. - -**Parameters** -- ***tags**: The tags to apply to the test. -### tasks[()]{.muted} - -```python -def tasks( - *tasks = ()): -``` - -Decorator for specifying the task types that a test is designed for. - -**Parameters** -- ***tasks**: The task types that the test is designed for. -### test[()]{.muted} - -```python -def test( - func_or_id): -``` - -Decorator for creating and registering custom tests -This decorator registers the function it wraps as a test function within ValidMind -under the provided ID. Once decorated, the function can be run using the -`validmind.tests.run_test` function. - -The function can take two different types of arguments: - -- Inputs: ValidMind model or dataset (or list of models/datasets). These arguments - must use the following names: `model`, `models`, `dataset`, `datasets`. -- Parameters: Any additional keyword arguments of any type (must have a default - value) that can have any name. - -The function should return one of the following types: - -- Table: Either a list of dictionaries or a pandas DataFrame -- Plot: Either a matplotlib figure or a plotly figure -- Scalar: A single number (int or float) -- Boolean: A single boolean value indicating whether the test passed or failed - -The function may also include a docstring. This docstring will be used and logged -as the metric's description. - -**Parameters** -- **func**: The function to decorate -- **test_id**: The identifier for the metric. If not provided, the function name is used. - -**Returns** -- The decorated function. - - - - diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index c0a0dee0b..dbf9c432f 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -5,7 +5,7 @@ ::: {.signature} {# Skip 'def' for constructors #} -{%- if not (member.name == "__init__" and member.kind == "method") -%} +{%- if not (member.name == "__init__" and member.kind in ["method", "function"]) -%} {%- if member.kind == "class" or member.kind == "alias" -%}class {%- elif member.kind == "function" or member.kind == "method" -%}def @@ -13,21 +13,27 @@ {%- endif -%} {%- endif -%} - -{{ member.parent.name if (member.name == "__init__" and member.kind == "method") else member.name }}{%- if member.parameters -%}({{- '' -}} +{{ member.parent.name if (member.name == "__init__" and member.parent is defined) else member.name }} +{%- if member.kind == "class" -%}: +{%- elif member.parameters -%}({{- '' -}} {%- set params = [] -%} {%- for param in member.parameters -%} - {%- if param.name != "self" -%} + {%- if (param.name != "self" or member.parent is defined) and not (param.name == "self" and member.name == "__init__") -%} {%- set _ = params.append(param) -%} {%- endif -%} {%- endfor -%} {%- for param in params -%} - {{ "**" if param.name == "kwargs" else "" }}{{ param.name }} + + {%- if param.name == "self" -%} + self + {%- else -%} + {{ "**" if param.name == "kwargs" else "" }}{{ param.name }} + {%- endif -%} {%- if param.annotation -%} - : {{ format_type(param.annotation, add_links=true) }} + :{{ format_type(param.annotation, add_links=true) }} {%- endif -%} {%- if param.default is not none and param.name != "kwargs" -%} - = + = {%- if param.default is string and param.default.startswith("'") and param.default.endswith("'") -%} {{ param.default }} {%- else -%} @@ -39,6 +45,7 @@ {%- endfor -%}) {%- else -%}() {%- endif -%} +{%- if not (member.name == "__init__") and member.kind == "function" -%}:{%- endif -%} {%- if member.returns -%} {{- format_type(member.returns, add_links=true) if member.returns else 'Any' -}} diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index a350aa7cd..2970fa89c 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -106,13 +106,11 @@ toc-expand: 4 {% if member.kind == "class" or (member.kind == "alias" and member.target_path and member.target_path.split(".")[-1][0].isupper()) %} {% set target = resolve_alias(resolved, full_data) %} -## class {{ member.name }} - +## class {{ member.name }} {{ signatures.render_signature(target) }} - {% if target.docstring %} {{ doc.format_docstring(target.docstring) }} {% endif %} @@ -121,9 +119,12 @@ toc-expand: 4 {% for method_name, method in target.members.items() %} {% if method.kind == "function" and (not method_name.startswith('_') or method_name in ['__init__']) %} + ### {{ member.name if method_name == '__init__' else method_name }}() -{{ signatures.render_signature(method) }} +{% set method_with_parent = method %} +{% set _ = method_with_parent.update({"parent": {"name": member.name}}) %} +{{ signatures.render_signature(method_with_parent) }} {% if method.docstring %} {{ doc.format_docstring(method.docstring) }} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 48bd14f25..b063433b2 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -55,7 +55,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -defget_test_suite(test_suite_id: str = None,section: str = None,args = (),\*\*kwargs)validmind.vm_models.TestSuite +defget_test_suite(test_suite_id:str=None,section:str=None,args=(),\*\*kwargs):validmind.vm_models.TestSuite ::: @@ -78,7 +78,7 @@ This function provides an interface to retrieve the TestSuite instance for the c ::: {.signature} -definit(project: Optional\[str\] = None,api_key: Optional\[str\] = None,api_secret: Optional\[str\] = None,api_host: Optional\[str\] = None,model: Optional\[str\] = None,monitoring: bool = False,generate_descriptions: Optional\[bool\] = None) +definit(project:Optional\[str\]=None,api_key:Optional\[str\]=None,api_secret:Optional\[str\]=None,api_host:Optional\[str\]=None,model:Optional\[str\]=None,monitoring:bool=False,generate_descriptions:Optional\[bool\]=None): ::: @@ -108,7 +108,7 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -definit_dataset(dataset,model = None,index = None,index_name: str = None,date_time_index: bool = False,columns: list = None,text_column: str = None,target_column: str = None,feature_columns: list = None,extra_columns: dict = None,class_labels: dict = None,type: str = None,input_id: str = None,\_\_log = True)validmind.vm_models.VMDataset +definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True):validmind.vm_models.VMDataset ::: @@ -149,7 +149,7 @@ The following dataset types are supported: ::: {.signature} -definit_model(model: object = None,input_id: str = 'model',attributes: dict = None,predict_fn: callable = None,\_\_log = True,\*\*kwargs)validmind.vm_models.VMModel +definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs):validmind.vm_models.VMModel ::: @@ -179,7 +179,7 @@ Initializes a VM Model, which can then be passed to other functions that can per ::: {.signature} -definit_r_model(model_path: str,input_id: str = 'model')validmind.vm_models.VMModel +definit_r_model(model_path:str,input_id:str='model'):validmind.vm_models.VMModel ::: @@ -211,7 +211,7 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ::: {.signature} -deflog_metric(key: str,value: float,inputs: Optional\[List\[str\]\] = None,params: Optional\[Dict\[str, Any\]\] = None,recorded_at: Optional\[str\] = None,thresholds: Optional\[Dict\[str, Any\]\] = None) +deflog_metric(key:str,value:float,inputs:Optional\[List\[str\]\]=None,params:Optional\[Dict\[str, Any\]\]=None,recorded_at:Optional\[str\]=None,thresholds:Optional\[Dict\[str, Any\]\]=None): ::: @@ -236,7 +236,7 @@ Unit metrics are key-value pairs where the key is the metric name and the value ::: {.signature} -defpreview_template() +defpreview_template(): ::: @@ -256,7 +256,7 @@ This function will display the documentation template for the current project. I ::: {.signature} -defprint_env() +defprint_env(): ::: @@ -272,7 +272,7 @@ Output includes: ValidMind Library version, operating system details, installed ::: {.signature} -defreload() +defreload(): ::: @@ -286,7 +286,7 @@ Reconnect to the ValidMind API and reload the project configuration ::: {.signature} -defrun_documentation_tests(section = None,send = True,fail_fast = False,inputs = None,config = None,\*\*kwargs) +defrun_documentation_tests(section=None,send=True,fail_fast=False,inputs=None,config=None,\*\*kwargs): ::: @@ -319,7 +319,7 @@ This function will analyze the current project's documentation template and coll ::: {.signature} -defrun_test_suite(test_suite_id,send = True,fail_fast = False,config = None,inputs = None,\*\*kwargs) +defrun_test_suite(test_suite_id,send=True,fail_fast=False,config=None,inputs=None,\*\*kwargs): ::: @@ -352,7 +352,7 @@ This function provides a high level interface for running a test suite. A test s ::: {.signature} -deftags(tags = ()) +deftags(tags=()): ::: @@ -370,7 +370,7 @@ Decorator for specifying tags for a test. ::: {.signature} -deftasks(tasks = ()) +deftasks(tasks=()): ::: @@ -388,7 +388,7 @@ Decorator for specifying the task types that a test is designed for. ::: {.signature} -deftest(func_or_id) +deftest(func_or_id): ::: @@ -421,15 +421,15 @@ The function may also include a docstring. This docstring will be used and logge - The decorated function. -## class RawData - +## class RawData + ::: {.signature} -classRawData() +classRawData: ::: @@ -437,13 +437,15 @@ The function may also include a docstring. This docstring will be used and logge Holds raw data for a test result + + ### RawData() ::: {.signature} -def__init__(log: bool = False,\*\*kwargs) +RawData(log:bool=False,\*\*kwargs) ::: @@ -454,7 +456,9 @@ Create a new RawData object **Arguments** - `log` (bool): If True, log the raw data to ValidMind -- `**kwargs`: Keyword arguments to set as attributes e.g. `RawData(log=True, dataset_duplicates=df_duplicates)` +- `**kwargs`: Keyword arguments to set as attributes, such as `RawData(log=True, dataset_duplicates=df_duplicates)` + + ### inspect() @@ -462,7 +466,7 @@ Create a new RawData object ::: {.signature} -definspect(show: bool = True) +definspect(self,show:bool=True): ::: @@ -470,12 +474,14 @@ Create a new RawData object Inspect the raw data + + ### serialize() ::: {.signature} -defserialize() +defserialize(self): ::: diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index 2d2445dd5..9b16ff2f6 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defsimple_preprocess_booleans(df,columns) +defsimple_preprocess_booleans(df,columns): ::: @@ -35,7 +35,7 @@ Preprocess boolean columns. ::: {.signature} -defsimple_preprocess_categoricals(df,columns) +defsimple_preprocess_categoricals(df,columns): ::: @@ -58,7 +58,7 @@ Preprocess categorical columns. ::: {.signature} -defsimple_preprocess_numericals(df,columns) +defsimple_preprocess_numericals(df,columns): ::: @@ -83,7 +83,7 @@ Preprocess numerical columns. ::: {.signature} -defget_demo_test_config(test_suite = None) +defget_demo_test_config(test_suite=None): ::: @@ -116,7 +116,7 @@ We assign the following inputs depending on the input config expected by each te ::: {.signature} -defload_data(full_dataset = False) +defload_data(full_dataset=False): ::: @@ -128,6 +128,6 @@ We assign the following inputs depending on the input config expected by each te ::: {.signature} -defpreprocess(df) +defpreprocess(df): ::: diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index 693d76507..94c4c8196 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defsimple_preprocess_booleans(df,columns) +defsimple_preprocess_booleans(df,columns): ::: @@ -35,7 +35,7 @@ Preprocess boolean columns. ::: {.signature} -defsimple_preprocess_categoricals(df,columns) +defsimple_preprocess_categoricals(df,columns): ::: @@ -58,7 +58,7 @@ Preprocess categorical columns. ::: {.signature} -defsimple_preprocess_numericals(df,columns) +defsimple_preprocess_numericals(df,columns): ::: @@ -83,7 +83,7 @@ Preprocess numerical columns. ::: {.signature} -defload_data() +defload_data(): ::: @@ -95,6 +95,6 @@ Preprocess numerical columns. ::: {.signature} -defpreprocess(df) +defpreprocess(df): ::: diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index 51a415ba0..7280e7d9e 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcompute_scores(probabilities) +defcompute_scores(probabilities): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -deffeature_engineering(df,verbose = True) +deffeature_engineering(df,verbose=True): ::: @@ -38,7 +38,7 @@ toc-expand: 4 ::: {.signature} -defget_demo_test_config(x_test = None,y_test = None) +defget_demo_test_config(x_test=None,y_test=None): ::: @@ -63,7 +63,7 @@ Get demo test configuration. ::: {.signature} -definit_vm_objects(scorecard) +definit_vm_objects(scorecard): ::: @@ -75,7 +75,7 @@ Get demo test configuration. ::: {.signature} -defload_data(source = 'online',verbose = True) +defload_data(source='online',verbose=True): ::: @@ -99,7 +99,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -defload_scorecard() +defload_scorecard(): ::: @@ -111,7 +111,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -defload_test_config(scorecard) +defload_test_config(scorecard): ::: @@ -123,7 +123,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -defpreprocess(df,verbose = True) +defpreprocess(df,verbose=True): ::: @@ -135,7 +135,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -defsplit(df,validation_size = None,test_size = 0.2,add_constant = False,verbose = True) +defsplit(df,validation_size=None,test_size=0.2,add_constant=False,verbose=True): ::: @@ -162,6 +162,6 @@ Split dataset into train, validation (optional), and test sets. ::: {.signature} -defwoe_encoding(df,verbose = True) +defwoe_encoding(df,verbose=True): ::: diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 79a4697a9..119c99d2e 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcompute_scores(probabilities) +defcompute_scores(probabilities): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defload_data() +defload_data(): ::: @@ -44,7 +44,7 @@ Load data from the specified CSV file. ::: {.signature} -defpreprocess(df) +defpreprocess(df): ::: @@ -56,6 +56,6 @@ Load data from the specified CSV file. ::: {.signature} -defsplit(df,test_size = 0.3) +defsplit(df,test_size=0.3): ::: diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index 23e257b7a..2f9937472 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defdisplay_nice(df,num_rows = None) +defdisplay_nice(df,num_rows=None): ::: @@ -30,7 +30,7 @@ Primary function to format and display a DataFrame. ::: {.signature} -defload_data(source = 'online',dataset_size = None) +defload_data(source='online',dataset_size=None): ::: diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index 105df535b..408dd76fa 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -14,6 +14,6 @@ toc-expand: 4 ::: {.signature} -defload_data(full_dataset = False) +defload_data(full_dataset=False): ::: diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index 29f6040d6..c1f66b6ac 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defload_all_data() +defload_all_data(): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defload_data() +defload_data(): ::: @@ -38,7 +38,7 @@ toc-expand: 4 ::: {.signature} -defload_model(model_name) +defload_model(model_name): ::: @@ -50,7 +50,7 @@ toc-expand: 4 ::: {.signature} -defload_processed_data() +defload_processed_data(): ::: @@ -62,7 +62,7 @@ toc-expand: 4 ::: {.signature} -defload_test_dataset(model_name) +defload_test_dataset(model_name): ::: @@ -74,7 +74,7 @@ toc-expand: 4 ::: {.signature} -defload_train_dataset(model_path) +defload_train_dataset(model_path): ::: @@ -86,7 +86,7 @@ toc-expand: 4 ::: {.signature} -defpreprocess(df,split_option = 'train_test_val',train_size = 0.6,test_size = 0.2) +defpreprocess(df,split_option='train_test_val',train_size=0.6,test_size=0.2): ::: @@ -113,6 +113,6 @@ Split a time series DataFrame into train, validation, and test sets. ::: {.signature} -deftransform(df,transform_func = 'diff') +deftransform(df,transform_func='diff'): ::: diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 86c360402..3d35ecd0f 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defload_data() +defload_data(): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defpreprocess(df,split_option = 'train_test_val',train_size = 0.6,test_size = 0.2) +defpreprocess(df,split_option='train_test_val',train_size=0.6,test_size=0.2): ::: @@ -53,6 +53,6 @@ Split a time series DataFrame into train, validation, and test sets. ::: {.signature} -deftransform(df,transform_func = 'diff') +deftransform(df,transform_func='diff'): ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index 50a428ac8..5000db1a6 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -23,7 +23,7 @@ The following base errors are defined for others: ::: {.signature} -classAPIRequestError() +classAPIRequestError: ::: @@ -44,7 +44,7 @@ Generic error for API request errors that are not known. ::: {.signature} -classBaseError() +classBaseError: ::: @@ -58,7 +58,7 @@ Generic error for API request errors that are not known. ::: {.signature} -defdescription(args = (),\*\*kwargs) +defdescription(args=(),\*\*kwargs): ::: @@ -70,7 +70,7 @@ Generic error for API request errors that are not known. ::: {.signature} -classGetTestSuiteError() +classGetTestSuiteError: ::: @@ -91,7 +91,7 @@ When the test suite could not be found. ::: {.signature} -classInitializeTestSuiteError() +classInitializeTestSuiteError: ::: @@ -112,7 +112,7 @@ When the test suite was found but could not be initialized. ::: {.signature} -classInvalidAPICredentialsError() +classInvalidAPICredentialsError: ::: @@ -127,7 +127,7 @@ When the test suite was found but could not be initialized. ::: {.signature} -defdescription(args = (),\*\*kwargs) +defdescription(args=(),\*\*kwargs): ::: @@ -139,7 +139,7 @@ When the test suite was found but could not be initialized. ::: {.signature} -classInvalidContentIdPrefixError() +classInvalidContentIdPrefixError: ::: @@ -160,7 +160,7 @@ When an invalid text content_id is sent to the API. ::: {.signature} -classInvalidInputError() +classInvalidInputError: ::: @@ -181,7 +181,7 @@ When an invalid input object. ::: {.signature} -classInvalidMetricResultsError() +classInvalidMetricResultsError: ::: @@ -202,7 +202,7 @@ When an invalid metric results object is sent to the API. ::: {.signature} -classInvalidProjectError() +classInvalidProjectError: ::: @@ -217,7 +217,7 @@ When an invalid metric results object is sent to the API. ::: {.signature} -defdescription(args = (),\*\*kwargs) +defdescription(args=(),\*\*kwargs): ::: @@ -229,7 +229,7 @@ When an invalid metric results object is sent to the API. ::: {.signature} -classInvalidRequestBodyError() +classInvalidRequestBodyError: ::: @@ -250,7 +250,7 @@ When a POST/PUT request is made with an invalid request body. ::: {.signature} -classInvalidTestParametersError() +classInvalidTestParametersError: ::: @@ -271,7 +271,7 @@ When an invalid parameters for the test. ::: {.signature} -classInvalidTestResultsError() +classInvalidTestResultsError: ::: @@ -292,7 +292,7 @@ When an invalid test results object is sent to the API. ::: {.signature} -classInvalidTextObjectError() +classInvalidTextObjectError: ::: @@ -313,7 +313,7 @@ When an invalid Metadat (Text) object is sent to the API. ::: {.signature} -classInvalidValueFormatterError() +classInvalidValueFormatterError: ::: @@ -334,7 +334,7 @@ When an invalid value formatter is provided when serializing results. ::: {.signature} -classInvalidXGBoostTrainedModelError() +classInvalidXGBoostTrainedModelError: ::: @@ -355,7 +355,7 @@ When an invalid XGBoost trained model is used when calling init_r_model. ::: {.signature} -classLoadTestError() +classLoadTestError: ::: @@ -376,7 +376,7 @@ Exception raised when an error occurs while loading a test ::: {.signature} -classMismatchingClassLabelsError() +classMismatchingClassLabelsError: ::: @@ -397,7 +397,7 @@ When the class labels found in the dataset don't match the provided target label ::: {.signature} -classMissingAPICredentialsError() +classMissingAPICredentialsError: ::: @@ -412,7 +412,7 @@ When the class labels found in the dataset don't match the provided target label ::: {.signature} -defdescription(args = (),\*\*kwargs) +defdescription(args=(),\*\*kwargs): ::: @@ -424,7 +424,7 @@ When the class labels found in the dataset don't match the provided target label ::: {.signature} -classMissingCacheResultsArgumentsError() +classMissingCacheResultsArgumentsError: ::: @@ -445,7 +445,7 @@ When the cache_results function is missing arguments. ::: {.signature} -classMissingClassLabelError() +classMissingClassLabelError: ::: @@ -466,7 +466,7 @@ When the one or more class labels are missing from provided dataset targets. ::: {.signature} -classMissingDependencyError() +classMissingDependencyError: ::: @@ -487,7 +487,7 @@ When a required dependency is missing. ::: {.signature} -classMissingDocumentationTemplate() +classMissingDocumentationTemplate: ::: @@ -508,7 +508,7 @@ When the client config is missing the documentation template. ::: {.signature} -classMissingModelIdError() +classMissingModelIdError: ::: @@ -523,7 +523,7 @@ When the client config is missing the documentation template. ::: {.signature} -defdescription(args = (),\*\*kwargs) +defdescription(args=(),\*\*kwargs): ::: @@ -535,7 +535,7 @@ When the client config is missing the documentation template. ::: {.signature} -classMissingOrInvalidModelPredictFnError() +classMissingOrInvalidModelPredictFnError: ::: @@ -558,7 +558,7 @@ method does not have the expected arguments. ::: {.signature} -classMissingRequiredTestInputError() +classMissingRequiredTestInputError: ::: @@ -579,7 +579,7 @@ When a required test context variable is missing. ::: {.signature} -classMissingRExtrasError() +classMissingRExtrasError: ::: @@ -598,7 +598,7 @@ When the R extras have not been installed. ::: {.signature} -defdescription(args = (),\*\*kwargs) +defdescription(args=(),\*\*kwargs): ::: @@ -610,7 +610,7 @@ When the R extras have not been installed. ::: {.signature} -classMissingTextContentIdError() +classMissingTextContentIdError: ::: @@ -631,7 +631,7 @@ When a Text object is sent to the API without a content_id. ::: {.signature} -classMissingTextContentsError() +classMissingTextContentsError: ::: @@ -652,7 +652,7 @@ When a Text object is sent to the API without a "text" attribute. ::: {.signature} -classSkipTestError() +classSkipTestError: ::: @@ -673,7 +673,7 @@ Useful error to throw when a test cannot be executed. ::: {.signature} -classTestInputInvalidDatasetError() +classTestInputInvalidDatasetError: ::: @@ -694,7 +694,7 @@ When an invalid dataset is used in a test context. ::: {.signature} -classUnsupportedColumnTypeError() +classUnsupportedColumnTypeError: ::: @@ -715,7 +715,7 @@ When an unsupported column type is found on a dataset. ::: {.signature} -classUnsupportedDatasetError() +classUnsupportedDatasetError: ::: @@ -736,7 +736,7 @@ When an unsupported dataset is used. ::: {.signature} -classUnsupportedFigureError() +classUnsupportedFigureError: ::: @@ -757,7 +757,7 @@ When an unsupported figure object is constructed. ::: {.signature} -classUnsupportedModelError() +classUnsupportedModelError: ::: @@ -778,7 +778,7 @@ When an unsupported model is used. ::: {.signature} -classUnsupportedModelForSHAPError() +classUnsupportedModelForSHAPError: ::: @@ -799,7 +799,7 @@ When an unsupported model is used for SHAP importance. ::: {.signature} -classUnsupportedRModelError() +classUnsupportedRModelError: ::: @@ -820,7 +820,7 @@ When an unsupported R model is used. ::: {.signature} -defraise_api_error(error_string) +defraise_api_error(error_string): ::: @@ -838,7 +838,7 @@ returns a non-JSON string or if the API returns a non-standard error ::: {.signature} -defshould_raise_on_fail_fast(error)bool +defshould_raise_on_fail_fast(error):bool ::: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 6cb83f600..f9e4340f8 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,7 +29,7 @@ Entrypoint for test suites. ::: {.signature} -defformat_dataframe(df: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +defformat_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}):{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -43,7 +43,7 @@ Format a pandas DataFrame for display purposes ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -57,7 +57,7 @@ Get a logger for the given module name ::: {.signature} -deftest_id_to_name(test_id: str)str +deftest_id_to_name(test_id:str):str ::: @@ -81,7 +81,7 @@ Convert a test ID to a human-readable name. ::: {.signature} -defdescribe_suite(test_suite_id: str,verbose = False) +defdescribe_suite(test_suite_id:str,verbose=False): ::: @@ -106,7 +106,7 @@ Describes a Test Suite by ID ::: {.signature} -defget_by_id(test_suite_id: str) +defget_by_id(test_suite_id:str): ::: @@ -122,7 +122,7 @@ Returns the test suite by ID ::: {.signature} -deflist_suites(pretty: bool = True) +deflist_suites(pretty:bool=True): ::: @@ -138,7 +138,7 @@ Returns a list of all available test suites ::: {.signature} -defregister_test_suite(suite_id: str,suite: validmind.vm_models.TestSuite) +defregister_test_suite(suite_id:str,suite:validmind.vm_models.TestSuite): ::: @@ -154,7 +154,7 @@ Registers a custom test suite ::: {.signature} -classClassifierDiagnosis() +classClassifierDiagnosis: ::: @@ -172,7 +172,7 @@ Test suite for sklearn classifier model diagnosis tests ::: {.signature} -classClassifierFullSuite() +classClassifierFullSuite: ::: @@ -190,7 +190,7 @@ Full test suite for binary classification models. ::: {.signature} -classClassifierMetrics() +classClassifierMetrics: ::: @@ -208,7 +208,7 @@ Test suite for sklearn classifier metrics ::: {.signature} -classClassifierModelValidation() +classClassifierModelValidation: ::: @@ -226,7 +226,7 @@ Test suite for binary classification models. ::: {.signature} -classClassifierPerformance() +classClassifierPerformance: ::: @@ -244,7 +244,7 @@ Test suite for sklearn classifier models ::: {.signature} -classClusterFullSuite() +classClusterFullSuite: ::: @@ -262,7 +262,7 @@ Full test suite for clustering models. ::: {.signature} -classClusterMetrics() +classClusterMetrics: ::: @@ -280,7 +280,7 @@ Test suite for sklearn clustering metrics ::: {.signature} -classClusterPerformance() +classClusterPerformance: ::: @@ -298,7 +298,7 @@ Test suite for sklearn cluster performance ::: {.signature} -classEmbeddingsFullSuite() +classEmbeddingsFullSuite: ::: @@ -316,7 +316,7 @@ Full test suite for embeddings models. ::: {.signature} -classEmbeddingsMetrics() +classEmbeddingsMetrics: ::: @@ -334,7 +334,7 @@ Test suite for embeddings metrics ::: {.signature} -classEmbeddingsPerformance() +classEmbeddingsPerformance: ::: @@ -352,7 +352,7 @@ Test suite for embeddings model performance ::: {.signature} -classKmeansParametersOptimization() +classKmeansParametersOptimization: ::: @@ -370,7 +370,7 @@ Test suite for sklearn hyperparameters optimization ::: {.signature} -classLLMClassifierFullSuite() +classLLMClassifierFullSuite: ::: @@ -388,7 +388,7 @@ Full test suite for LLM classification models. ::: {.signature} -classNLPClassifierFullSuite() +classNLPClassifierFullSuite: ::: @@ -406,7 +406,7 @@ Full test suite for NLP classification models. ::: {.signature} -classPromptValidation() +classPromptValidation: ::: @@ -424,7 +424,7 @@ Test suite for prompt validation ::: {.signature} -classRegressionFullSuite() +classRegressionFullSuite: ::: @@ -442,7 +442,7 @@ Full test suite for regression models. ::: {.signature} -classRegressionMetrics() +classRegressionMetrics: ::: @@ -460,7 +460,7 @@ Test suite for performance metrics of regression metrics ::: {.signature} -classRegressionModelDescription() +classRegressionModelDescription: ::: @@ -478,7 +478,7 @@ Test suite for performance metric of regression model of statsmodels library ::: {.signature} -classRegressionModelsEvaluation() +classRegressionModelsEvaluation: ::: @@ -496,7 +496,7 @@ Test suite for metrics comparison of regression model of statsmodels library ::: {.signature} -classRegressionPerformance() +classRegressionPerformance: ::: @@ -514,7 +514,7 @@ Test suite for regression model performance ::: {.signature} -classSummarizationMetrics() +classSummarizationMetrics: ::: @@ -532,7 +532,7 @@ Test suite for Summarization metrics ::: {.signature} -classTabularDataQuality() +classTabularDataQuality: ::: @@ -550,7 +550,7 @@ Test suite for data quality on tabular datasets ::: {.signature} -classTabularDataset() +classTabularDataset: ::: @@ -568,7 +568,7 @@ Test suite for tabular datasets. ::: {.signature} -classTabularDatasetDescription() +classTabularDatasetDescription: ::: @@ -588,7 +588,7 @@ statistics from a tabular dataset ::: {.signature} -classTextDataQuality() +classTextDataQuality: ::: @@ -606,7 +606,7 @@ Test suite for data quality on text data ::: {.signature} -classTimeSeriesDataQuality() +classTimeSeriesDataQuality: ::: @@ -624,7 +624,7 @@ Test suite for data quality on time series datasets ::: {.signature} -classTimeSeriesDataset() +classTimeSeriesDataset: ::: @@ -642,7 +642,7 @@ Test suite for time series datasets. ::: {.signature} -classTimeSeriesModelValidation() +classTimeSeriesModelValidation: ::: @@ -660,7 +660,7 @@ Test suite for time series model validation. ::: {.signature} -classTimeSeriesMultivariate() +classTimeSeriesMultivariate: ::: @@ -680,7 +680,7 @@ and relationship in multivariate dataset. It presents various multivariate visua ::: {.signature} -classTimeSeriesUnivariate() +classTimeSeriesUnivariate: ::: diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index 5fbff7d7d..0e7b53d78 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -20,7 +20,7 @@ Ideal setup is to have the API client to read a custom test suite from the proje ::: {.signature} -classClassifierDiagnosis() +classClassifierDiagnosis: ::: @@ -38,7 +38,7 @@ Test suite for sklearn classifier model diagnosis tests ::: {.signature} -classClassifierFullSuite() +classClassifierFullSuite: ::: @@ -56,7 +56,7 @@ Full test suite for binary classification models. ::: {.signature} -classClassifierMetrics() +classClassifierMetrics: ::: @@ -74,7 +74,7 @@ Test suite for sklearn classifier metrics ::: {.signature} -classClassifierModelValidation() +classClassifierModelValidation: ::: @@ -92,7 +92,7 @@ Test suite for binary classification models. ::: {.signature} -classClassifierPerformance() +classClassifierPerformance: ::: @@ -110,7 +110,7 @@ Test suite for sklearn classifier models ::: {.signature} -classTabularDataQuality() +classTabularDataQuality: ::: @@ -128,7 +128,7 @@ Test suite for data quality on tabular datasets ::: {.signature} -classTabularDatasetDescription() +classTabularDatasetDescription: ::: diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index 7c8a71bf5..9fd44338e 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -20,7 +20,7 @@ Ideal setup is to have the API client to read a custom test suite from the proje ::: {.signature} -classClusterFullSuite() +classClusterFullSuite: ::: @@ -38,7 +38,7 @@ Full test suite for clustering models. ::: {.signature} -classClusterMetrics() +classClusterMetrics: ::: @@ -56,7 +56,7 @@ Test suite for sklearn clustering metrics ::: {.signature} -classClusterPerformance() +classClusterPerformance: ::: @@ -74,7 +74,7 @@ Test suite for sklearn cluster performance ::: {.signature} -classKmeansParametersOptimization() +classKmeansParametersOptimization: ::: diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index d0156bc38..60da2366d 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -20,7 +20,7 @@ Ideal setup is to have the API client to read a custom test suite from the proje ::: {.signature} -classEmbeddingsFullSuite() +classEmbeddingsFullSuite: ::: @@ -38,7 +38,7 @@ Full test suite for embeddings models. ::: {.signature} -classEmbeddingsMetrics() +classEmbeddingsMetrics: ::: @@ -56,7 +56,7 @@ Test suite for embeddings metrics ::: {.signature} -classEmbeddingsPerformance() +classEmbeddingsPerformance: ::: diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index f4942f021..0befde5b1 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -18,7 +18,7 @@ Test suites for LLMs ::: {.signature} -classLLMClassifierFullSuite() +classLLMClassifierFullSuite: ::: @@ -36,7 +36,7 @@ Full test suite for LLM classification models. ::: {.signature} -classPromptValidation() +classPromptValidation: ::: @@ -54,7 +54,7 @@ Test suite for prompt validation ::: {.signature} -classClassifierDiagnosis() +classClassifierDiagnosis: ::: @@ -72,7 +72,7 @@ Test suite for sklearn classifier model diagnosis tests ::: {.signature} -classClassifierMetrics() +classClassifierMetrics: ::: @@ -90,7 +90,7 @@ Test suite for sklearn classifier metrics ::: {.signature} -classClassifierPerformance() +classClassifierPerformance: ::: @@ -108,7 +108,7 @@ Test suite for sklearn classifier models ::: {.signature} -classTextDataQuality() +classTextDataQuality: ::: diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index e034231ca..a1da5da9f 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -18,7 +18,7 @@ Test suites for NLP models ::: {.signature} -classNLPClassifierFullSuite() +classNLPClassifierFullSuite: ::: @@ -36,7 +36,7 @@ Full test suite for NLP classification models. ::: {.signature} -classClassifierDiagnosis() +classClassifierDiagnosis: ::: @@ -54,7 +54,7 @@ Test suite for sklearn classifier model diagnosis tests ::: {.signature} -classClassifierMetrics() +classClassifierMetrics: ::: @@ -72,7 +72,7 @@ Test suite for sklearn classifier metrics ::: {.signature} -classClassifierPerformance() +classClassifierPerformance: ::: @@ -90,7 +90,7 @@ Test suite for sklearn classifier models ::: {.signature} -classTextDataQuality() +classTextDataQuality: ::: diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index 13d550470..2b33fedec 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -20,7 +20,7 @@ Ideal setup is to have the API client to read a custom test suite from the proje ::: {.signature} -classKmeansParametersOptimization() +classKmeansParametersOptimization: ::: diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index 8ab5ffb8f..b9c34a705 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -classRegressionFullSuite() +classRegressionFullSuite: ::: @@ -32,7 +32,7 @@ Full test suite for regression models. ::: {.signature} -classRegressionMetrics() +classRegressionMetrics: ::: @@ -50,7 +50,7 @@ Test suite for performance metrics of regression metrics ::: {.signature} -classRegressionPerformance() +classRegressionPerformance: ::: @@ -68,7 +68,7 @@ Test suite for regression model performance ::: {.signature} -classTabularDataQuality() +classTabularDataQuality: ::: @@ -86,7 +86,7 @@ Test suite for data quality on tabular datasets ::: {.signature} -classTabularDatasetDescription() +classTabularDatasetDescription: ::: diff --git a/docs/validmind/test_suites/statsmodels_timeseries.qmd b/docs/validmind/test_suites/statsmodels_timeseries.qmd index c8724165c..98723f820 100644 --- a/docs/validmind/test_suites/statsmodels_timeseries.qmd +++ b/docs/validmind/test_suites/statsmodels_timeseries.qmd @@ -18,7 +18,7 @@ Time Series Test Suites from statsmodels ::: {.signature} -classRegressionModelDescription() +classRegressionModelDescription: ::: @@ -36,7 +36,7 @@ Test suite for performance metric of regression model of statsmodels library ::: {.signature} -classRegressionModelsEvaluation() +classRegressionModelsEvaluation: ::: diff --git a/docs/validmind/test_suites/summarization.qmd b/docs/validmind/test_suites/summarization.qmd index 67fb4a1c7..f1af93644 100644 --- a/docs/validmind/test_suites/summarization.qmd +++ b/docs/validmind/test_suites/summarization.qmd @@ -18,7 +18,7 @@ Test suites for llm summarization models ::: {.signature} -classSummarizationMetrics() +classSummarizationMetrics: ::: diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd index fd029155a..750765ead 100644 --- a/docs/validmind/test_suites/tabular_datasets.qmd +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -18,7 +18,7 @@ Test suites for tabular datasets ::: {.signature} -classTabularDataQuality() +classTabularDataQuality: ::: @@ -36,7 +36,7 @@ Test suite for data quality on tabular datasets ::: {.signature} -classTabularDataset() +classTabularDataset: ::: @@ -54,7 +54,7 @@ Test suite for tabular datasets. ::: {.signature} -classTabularDatasetDescription() +classTabularDatasetDescription: ::: diff --git a/docs/validmind/test_suites/text_data.qmd b/docs/validmind/test_suites/text_data.qmd index 829ea57b5..281e99870 100644 --- a/docs/validmind/test_suites/text_data.qmd +++ b/docs/validmind/test_suites/text_data.qmd @@ -18,7 +18,7 @@ Test suites for text datasets ::: {.signature} -classTextDataQuality() +classTextDataQuality: ::: diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index 3af2135a7..a32c62b27 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -18,7 +18,7 @@ Time Series Test Suites ::: {.signature} -classTimeSeriesDataQuality() +classTimeSeriesDataQuality: ::: @@ -36,7 +36,7 @@ Test suite for data quality on time series datasets ::: {.signature} -classTimeSeriesDataset() +classTimeSeriesDataset: ::: @@ -54,7 +54,7 @@ Test suite for time series datasets. ::: {.signature} -classTimeSeriesModelValidation() +classTimeSeriesModelValidation: ::: @@ -72,7 +72,7 @@ Test suite for time series model validation. ::: {.signature} -classTimeSeriesMultivariate() +classTimeSeriesMultivariate: ::: @@ -92,7 +92,7 @@ and relationship in multivariate dataset. It presents various multivariate visua ::: {.signature} -classTimeSeriesUnivariate() +classTimeSeriesUnivariate: ::: @@ -114,7 +114,7 @@ The raw time series data provides a visual inspection of the target variable's b ::: {.signature} -classRegressionModelDescription() +classRegressionModelDescription: ::: @@ -132,7 +132,7 @@ Test suite for performance metric of regression model of statsmodels library ::: {.signature} -classRegressionModelsEvaluation() +classRegressionModelsEvaluation: ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 40bdd9894..cc697de2e 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -20,7 +20,7 @@ ValidMind Tests Module ::: {.signature} -defdescribe_test(test_id: validmind.vm_models.TestID = None,raw: bool = False,show: bool = True) +defdescribe_test(test_id:validmind.vm_models.TestID=None,raw:bool=False,show:bool=True): ::: @@ -41,7 +41,7 @@ This function can be used to see test details including the test name, descripti ::: {.signature} -deflist_tags() +deflist_tags(): ::: @@ -55,7 +55,7 @@ List unique tags from all test classes. ::: {.signature} -deflist_tasks() +deflist_tasks(): ::: @@ -69,7 +69,7 @@ List unique tasks from all test classes. ::: {.signature} -deflist_tasks_and_tags(as_json = False) +deflist_tasks_and_tags(as_json=False): ::: @@ -89,7 +89,7 @@ all tags for a task type in one row. ::: {.signature} -deflist_tests(filter = None,task = None,tags = None,pretty = True,truncate = True) +deflist_tests(filter=None,task=None,tags=None,pretty=True,truncate=True): ::: @@ -115,7 +115,7 @@ List all tests in the tests directory. ::: {.signature} -defload_test(test_id: str,test_func: callable = None,reload: bool = False) +defload_test(test_id:str,test_func:callable=None,reload:bool=False): ::: @@ -136,7 +136,7 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. ::: {.signature} -defrun_test(test_id: Union\[validmind.vm_models.TestID, None\] = None,name: Union\[str, None\] = None,unit_metrics: Union\[List\[validmind.vm_models.TestID\], None\] = None,inputs: Union\[Dict\[str, Any\], None\] = None,input_grid: Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\] = None,params: Union\[Dict\[str, Any\], None\] = None,param_grid: Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\] = None,show: bool = True,generate_description: bool = True,title: Optional\[str\] = None,post_process_fn: Union\[Callable\[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, None\], None\] = None,\*\*kwargs)validmind.vm_models.TestResult +defrun_test(test_id:Union\[validmind.vm_models.TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[validmind.vm_models.TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[Callable\[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, None\], None\]=None,\*\*kwargs):validmind.vm_models.TestResult ::: @@ -179,7 +179,7 @@ This function is the main entry point for running tests. It can run simple unit ::: {.signature} -deftags(tags = ()) +deftags(tags=()): ::: @@ -197,7 +197,7 @@ Decorator for specifying tags for a test. ::: {.signature} -deftasks(tasks = ()) +deftasks(tasks=()): ::: @@ -215,7 +215,7 @@ Decorator for specifying the task types that a test is designed for. ::: {.signature} -deftest(func_or_id) +deftest(func_or_id): ::: @@ -256,7 +256,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -defregister_test_provider(namespace: str,test_provider: validmind.vm_models.TestProvider)None +defregister_test_provider(namespace:str,test_provider:validmind.vm_models.TestProvider):None ::: @@ -277,7 +277,7 @@ Register an external test provider ::: {.signature} -classLoadTestError() +classLoadTestError: ::: @@ -298,7 +298,7 @@ Exception raised when an error occurs while loading a test ::: {.signature} -classLocalTestProvider() +classLocalTestProvider: ::: @@ -339,7 +339,7 @@ test = test_provider.load_test("my_namespace.my_test_class") ::: {.signature} -deflist_tests() +deflist_tests(): ::: @@ -357,7 +357,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id: str) +defload_test(test_id:str): ::: @@ -386,7 +386,7 @@ Load the test identified by the given test_id. ::: {.signature} -classTestProvider() +classTestProvider: ::: @@ -402,7 +402,7 @@ Protocol for user-defined test providers ::: {.signature} -deflist_tests()List\[str\] +deflist_tests():List\[str\] ::: @@ -420,7 +420,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id: str)callable +defload_test(test_id:str):callable ::: diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 373433208..8235821b8 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defACFandPACFPlot(dataset: validmind.vm_models.VMDataset) +defACFandPACFPlot(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 2574ba33e..632d0f5a8 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defADF(dataset: validmind.vm_models.VMDataset) +defADF(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index a15cf9fcd..235e80f3d 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoAR(dataset: validmind.vm_models.VMDataset,max_ar_order: int = 3) +defAutoAR(dataset:validmind.vm_models.VMDataset,max_ar_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index 3f562e1ec..25deb1eb3 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoMA(dataset: validmind.vm_models.VMDataset,max_ma_order: int = 3) +defAutoMA(dataset:validmind.vm_models.VMDataset,max_ma_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 18f8ea9f4..ce899ab7b 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAutoStationarity(dataset: validmind.vm_models.VMDataset,max_order: int = 5,threshold: float = 0.05) +defAutoStationarity(dataset:validmind.vm_models.VMDataset,max_order:int=5,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 708a7b00d..f650e57a5 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defBivariateScatterPlots(dataset) +defBivariateScatterPlots(dataset): ::: diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index abdc38095..5c0e76767 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defBoxPierce(dataset) +defBoxPierce(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 66fc14893..39a2a0418 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defChiSquaredFeaturesTable(dataset,p_threshold = 0.05) +defChiSquaredFeaturesTable(dataset,p_threshold=0.05): ::: @@ -56,7 +56,7 @@ The function creates a contingency table for each categorical feature and the ta ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 0ad0804f9..ecf73412f 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -defClassImbalance(dataset: validmind.vm_models.VMDataset,min_percent_threshold: int = 10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\] +defClassImbalance(dataset:validmind.vm_models.VMDataset,min_percent_threshold:int=10):Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\] ::: @@ -64,7 +64,7 @@ This Class Imbalance test operates by calculating the frequency (expressed as a ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index aa7b74301..0f2f37e41 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defDatasetDescription(dataset: validmind.vm_models.VMDataset) +defDatasetDescription(dataset:validmind.vm_models.VMDataset): ::: @@ -74,7 +74,7 @@ The DatasetDescription class accomplishes the purpose as follows: firstly, the t ::: {.signature} -defdescribe_column(df,column) +defdescribe_column(df,column): ::: @@ -90,7 +90,7 @@ Gets descriptive statistics for a single column in a Pandas DataFrame. ::: {.signature} -defget_column_histograms(df,column,type\_) +defget_column_histograms(df,column,type\_): ::: @@ -110,7 +110,7 @@ Will be used in favor of \_get_histogram in the future ::: {.signature} -defget_numerical_histograms(df,column) +defget_numerical_histograms(df,column): ::: @@ -128,7 +128,7 @@ with a different bin size ::: {.signature} -definfer_datatypes(df) +definfer_datatypes(df): ::: @@ -140,7 +140,7 @@ with a different bin size ::: {.signature} -classUnsupportedColumnTypeError() +classUnsupportedColumnTypeError: ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index d01165d09..550b3520e 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defDatasetSplit(datasets: List\[validmind.vm_models.VMDataset\]) +defDatasetSplit(datasets:List\[validmind.vm_models.VMDataset\]): ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 56cedb56d..5f8c1d9ee 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defformat_records(df: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict\[str, Any\]\] +defformat_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}):List\[Dict\[str, Any\]\] ::: @@ -36,7 +36,7 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -defDescriptiveStatistics(dataset: validmind.vm_models.VMDataset) +defDescriptiveStatistics(dataset:validmind.vm_models.VMDataset): ::: @@ -80,7 +80,7 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des ::: {.signature} -defget_summary_statistics_categorical(df,categorical_fields) +defget_summary_statistics_categorical(df,categorical_fields): ::: @@ -92,7 +92,7 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des ::: {.signature} -defget_summary_statistics_numerical(df,numerical_fields) +defget_summary_statistics_numerical(df,numerical_fields): ::: @@ -104,7 +104,7 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 8a52b82f9..be6d543e3 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defDickeyFullerGLS(dataset: validmind.vm_models.VMDataset) +defDickeyFullerGLS(dataset:validmind.vm_models.VMDataset): ::: @@ -68,7 +68,7 @@ This code implements the Dickey-Fuller GLS unit root test on each attribute of t ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 5b0120de6..fc3fd0159 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defDuplicates(dataset,min_threshold = 1) +defDuplicates(dataset,min_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index f43bd8b11..1e69037ab 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defEngleGrangerCoint(dataset: validmind.vm_models.VMDataset,threshold: float = 0.05) +defEngleGrangerCoint(dataset:validmind.vm_models.VMDataset,threshold:float=0.05): ::: @@ -54,7 +54,7 @@ The test first drops any non-applicable values from the input dataset and then i ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index a81f90d52..7895fd0da 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defFeatureTargetCorrelationPlot(dataset,fig_height = 600) +defFeatureTargetCorrelationPlot(dataset,fig_height=600): ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 1b67878ed..43c1cbed4 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHighCardinality(dataset: validmind.vm_models.VMDataset,num_threshold: int = 100,percent_threshold: float = 0.1,threshold_type: str = 'percent') +defHighCardinality(dataset:validmind.vm_models.VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 6eecc1b3b..d67fbba4c 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHighPearsonCorrelation(dataset: validmind.vm_models.VMDataset,max_threshold: float = 0.3,top_n_correlations: int = 10,feature_columns: list = None) +defHighPearsonCorrelation(dataset:validmind.vm_models.VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index c9c79d05d..467a12569 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcompute_outliers(series,threshold) +defcompute_outliers(series,threshold): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defIQROutliersBarPlot(dataset: validmind.vm_models.VMDataset,threshold: float = 1.5,fig_width: int = 800) +defIQROutliersBarPlot(dataset:validmind.vm_models.VMDataset,threshold:float=1.5,fig_width:int=800): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 78eae850b..6a78d063a 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcompute_outliers(series,threshold = 1.5) +defcompute_outliers(series,threshold=1.5): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defIQROutliersTable(dataset: validmind.vm_models.VMDataset,threshold: float = 1.5) +defIQROutliersTable(dataset:validmind.vm_models.VMDataset,threshold:float=1.5): ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index e01c68333..86f249c9c 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defIsolationForestOutliers(dataset: validmind.vm_models.VMDataset,random_state: int = 0,contamination: float = 0.1,feature_columns: list = None) +defIsolationForestOutliers(dataset:validmind.vm_models.VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index 570f931c0..d8db0be3a 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defJarqueBera(dataset) +defJarqueBera(dataset): ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 940191977..f7a82176e 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defKPSS(dataset: validmind.vm_models.VMDataset) +defKPSS(dataset:validmind.vm_models.VMDataset): ::: @@ -68,7 +68,7 @@ This test calculates the KPSS score for each feature in the dataset. The KPSS sc ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 4cc8755af..0a403809a 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defLJungBox(dataset) +defLJungBox(dataset): ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index 9ccb72d04..d4a1abf73 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defLaggedCorrelationHeatmap(dataset: validmind.vm_models.VMDataset,num_lags: int = 10) +defLaggedCorrelationHeatmap(dataset:validmind.vm_models.VMDataset,num_lags:int=10): ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index b96021a07..80ced81eb 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMissingValues(dataset: validmind.vm_models.VMDataset,min_threshold: int = 1) +defMissingValues(dataset:validmind.vm_models.VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index d976e032f..bd1a22f29 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMissingValuesBarPlot(dataset: validmind.vm_models.VMDataset,threshold: int = 80,fig_height: int = 600) +defMissingValuesBarPlot(dataset:validmind.vm_models.VMDataset,threshold:int=80,fig_height:int=600): ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index ceac2ed51..538042573 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMutualInformation(dataset: validmind.vm_models.VMDataset,min_threshold: float = 0.01,task: str = 'classification') +defMutualInformation(dataset:validmind.vm_models.VMDataset,min_threshold:float=0.01,task:str='classification'): ::: diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index 673750693..67de47299 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defPearsonCorrelationMatrix(dataset) +defPearsonCorrelationMatrix(dataset): ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 210a363c4..a36878a17 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defPhillipsPerronArch(dataset: validmind.vm_models.VMDataset) +defPhillipsPerronArch(dataset:validmind.vm_models.VMDataset): ::: @@ -74,7 +74,7 @@ The PP test is conducted for each feature in the dataset as follows: ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 978a3469b..aa529f75f 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defProtectedClassesCombination(dataset,model,protected_classes = None) +defProtectedClassesCombination(dataset,model,protected_classes=None): ::: @@ -74,7 +74,7 @@ The test performs the following steps: ::: {.signature} -classMissingDependencyError() +classMissingDependencyError: ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index e63376f66..968322bfd 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defProtectedClassesDescription(dataset,protected_classes = None) +defProtectedClassesDescription(dataset,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 2eea6b4a3..95986bd17 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defProtectedClassesDisparity(dataset,model,protected_classes = None,disparity_tolerance = 1.25,metrics = {'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}) +defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics={'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}): ::: @@ -76,7 +76,7 @@ The test performs the following steps: ::: {.signature} -classMissingDependencyError() +classMissingDependencyError: ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 425472f2c..236f7fd38 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defcalculate_fairness_metrics(test_df,target,y_pred_opt,protected_classes) +defcalculate_fairness_metrics(test_df,target,y_pred_opt,protected_classes): ::: @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -defcalculate_group_metrics(test_df,target,y_pred_opt,protected_classes) +defcalculate_group_metrics(test_df,target,y_pred_opt,protected_classes): ::: @@ -52,7 +52,7 @@ Get a logger for the given module name ::: {.signature} -defget_thresholds_by_group(threshold_optimizer) +defget_thresholds_by_group(threshold_optimizer): ::: @@ -64,7 +64,7 @@ Get a logger for the given module name ::: {.signature} -definitialize_and_fit_optimizer(pipeline,X_train,y_train,protected_classes_df) +definitialize_and_fit_optimizer(pipeline,X_train,y_train,protected_classes_df): ::: @@ -76,7 +76,7 @@ Get a logger for the given module name ::: {.signature} -defmake_predictions(threshold_optimizer,test_df,protected_classes) +defmake_predictions(threshold_optimizer,test_df,protected_classes): ::: @@ -88,7 +88,7 @@ Get a logger for the given module name ::: {.signature} -defplot_thresholds(threshold_optimizer) +defplot_thresholds(threshold_optimizer): ::: @@ -100,7 +100,7 @@ Get a logger for the given module name ::: {.signature} -defProtectedClassesThresholdOptimizer(dataset,pipeline = None,protected_classes = None,X_train = None,y_train = None) +defProtectedClassesThresholdOptimizer(dataset,pipeline=None,protected_classes=None,X_train=None,y_train=None): ::: @@ -147,7 +147,7 @@ The test uses Fairlearn's ThresholdOptimizer to: ::: {.signature} -classMissingDependencyError() +classMissingDependencyError: ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index d0657780f..6608f6f2a 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defplot_rolling_statistics(df,col,window_size) +defplot_rolling_statistics(df,col,window_size): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defRollingStatsPlot(dataset: validmind.vm_models.VMDataset,window_size: int = 12) +defRollingStatsPlot(dataset:validmind.vm_models.VMDataset,window_size:int=12): ::: @@ -71,7 +71,7 @@ This mechanism is comprised of two steps. Initially, the rolling mean and standa ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 5d37fe55a..1c2154c46 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defRunsTest(dataset) +defRunsTest(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 469d18731..69ab7b0cf 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScatterPlot(dataset) +defScatterPlot(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 42092a96d..a5295f02b 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScoreBandDefaultRates(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,score_column: str = 'score',score_bands: list = None) +defScoreBandDefaultRates(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,score_column:str='score',score_bands:list=None): ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 93f9ad4d7..9b89a7fb2 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defSeasonalDecompose(dataset: validmind.vm_models.VMDataset,seasonal_model: str = 'additive') +defSeasonalDecompose(dataset:validmind.vm_models.VMDataset,seasonal_model:str='additive'): ::: @@ -70,7 +70,7 @@ The testing process leverages the `seasonal_decompose` function from the `statsm ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 0769dd8ed..c542efd77 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defShapiroWilk(dataset) +defShapiroWilk(dataset): ::: diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index 17d988eb1..e9429ba54 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defSkewness(dataset,max_threshold = 1) +defSkewness(dataset,max_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 91f7ff51c..2e5135642 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defSpreadPlot(dataset: validmind.vm_models.VMDataset) +defSpreadPlot(dataset:validmind.vm_models.VMDataset): ::: @@ -60,7 +60,7 @@ The SpreadPlot test computes and represents the spread between each pair of time ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 5774f4f87..0cbbba982 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTabularCategoricalBarPlots(dataset: validmind.vm_models.VMDataset) +defTabularCategoricalBarPlots(dataset:validmind.vm_models.VMDataset): ::: @@ -55,7 +55,7 @@ The provided dataset is first checked to determine if it contains any categorica ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 80a2d76c1..638861430 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTabularDateTimeHistograms(dataset: validmind.vm_models.VMDataset) +defTabularDateTimeHistograms(dataset:validmind.vm_models.VMDataset): ::: @@ -58,7 +58,7 @@ This test operates by first identifying all datetime columns and extracting them ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index d32a40e22..09195a994 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defget_categorical_columns(dataset) +defget_categorical_columns(dataset): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defget_datetime_columns(dataset) +defget_datetime_columns(dataset): ::: @@ -38,7 +38,7 @@ toc-expand: 4 ::: {.signature} -defget_numerical_columns(dataset) +defget_numerical_columns(dataset): ::: @@ -50,7 +50,7 @@ toc-expand: 4 ::: {.signature} -defget_summary_statistics_categorical(dataset,categorical_fields) +defget_summary_statistics_categorical(dataset,categorical_fields): ::: @@ -62,7 +62,7 @@ toc-expand: 4 ::: {.signature} -defget_summary_statistics_datetime(dataset,datetime_fields) +defget_summary_statistics_datetime(dataset,datetime_fields): ::: @@ -74,7 +74,7 @@ toc-expand: 4 ::: {.signature} -defget_summary_statistics_numerical(dataset,numerical_fields) +defget_summary_statistics_numerical(dataset,numerical_fields): ::: @@ -86,7 +86,7 @@ toc-expand: 4 ::: {.signature} -defTabularDescriptionTables(dataset) +defTabularDescriptionTables(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 28e145997..8c85ec8bb 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTabularNumericalHistograms(dataset: validmind.vm_models.VMDataset) +defTabularNumericalHistograms(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index c495463c3..00b34a7cf 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTargetRateBarPlots(dataset: validmind.vm_models.VMDataset) +defTargetRateBarPlots(dataset:validmind.vm_models.VMDataset): ::: @@ -54,7 +54,7 @@ The test involves creating a pair of bar plots for each categorical feature in t ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 80436dffd..7de0f37e9 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesDescription(dataset) +defTimeSeriesDescription(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index aeb979d58..49d5e6208 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesDescriptiveStatistics(dataset) +defTimeSeriesDescriptiveStatistics(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 2440fa7c0..45fb1e3de 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesFrequency(dataset: validmind.vm_models.VMDataset) +defTimeSeriesFrequency(dataset:validmind.vm_models.VMDataset): ::: @@ -55,7 +55,7 @@ Initially, the test checks if the dataframe index is in datetime format. Subsequ ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index c97519743..5526602c3 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defTimeSeriesHistogram(dataset,nbins = 30) +defTimeSeriesHistogram(dataset,nbins=30): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 97042f590..412eb8a00 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesLinePlot(dataset: validmind.vm_models.VMDataset) +defTimeSeriesLinePlot(dataset:validmind.vm_models.VMDataset): ::: @@ -57,7 +57,7 @@ The mechanism for this Python class involves extracting the column names from th ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 456869d92..5335cc9fb 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesMissingValues(dataset: validmind.vm_models.VMDataset,min_threshold: int = 1) +defTimeSeriesMissingValues(dataset:validmind.vm_models.VMDataset,min_threshold:int=1): ::: @@ -55,7 +55,7 @@ The test method commences by validating if the dataset has a datetime index; if ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index b4cf75b2f..0fab76111 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesOutliers(dataset: validmind.vm_models.VMDataset,zscore_threshold: int = 3) +defTimeSeriesOutliers(dataset:validmind.vm_models.VMDataset,zscore_threshold:int=3): ::: @@ -60,7 +60,7 @@ The test processes a given dataset which must have datetime indexing, checks if ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 6b7070b2f..cdf94e046 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTooManyZeroValues(dataset: validmind.vm_models.VMDataset,max_percent_threshold: float = 0.03) +defTooManyZeroValues(dataset:validmind.vm_models.VMDataset,max_percent_threshold:float=0.03): ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 111cd9901..22f400981 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defUniqueRows(dataset: validmind.vm_models.VMDataset,min_percent_threshold: float = 1) +defUniqueRows(dataset:validmind.vm_models.VMDataset,min_percent_threshold:float=1): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index ac76c8497..8f8c7f347 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defWOEBinPlots(dataset: validmind.vm_models.VMDataset,breaks_adj: list = None,fig_height: int = 600,fig_width: int = 500) +defWOEBinPlots(dataset:validmind.vm_models.VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): ::: @@ -73,7 +73,7 @@ The test implementation follows defined steps. Initially, it selects non-numeric ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index c026155af..8722f5426 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defWOEBinTable(dataset: validmind.vm_models.VMDataset,breaks_adj: list = None) +defWOEBinTable(dataset:validmind.vm_models.VMDataset,breaks_adj:list=None): ::: @@ -56,7 +56,7 @@ The test uses the `scorecardpy.woebin` method to perform automatic binning of th ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 58f3f777e..de7ebee56 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defZivotAndrewsArch(dataset: validmind.vm_models.VMDataset) +defZivotAndrewsArch(dataset:validmind.vm_models.VMDataset): ::: @@ -67,7 +67,7 @@ The Zivot-Andrews unit root test is performed on each feature in the dataset usi ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index e4854a82a..e7d36bcca 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCommonWords(dataset: validmind.vm_models.VMDataset) +defCommonWords(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 16d4f987c..dfbff9901 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHashtags(dataset: validmind.vm_models.VMDataset,top_hashtags: int = 25) +defHashtags(dataset:validmind.vm_models.VMDataset,top_hashtags:int=25): ::: @@ -57,7 +57,7 @@ The test implements a regular expression (regex) to extract all hashtags from th ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 5ba76065f..dd40accf0 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defLanguageDetection(dataset) +defLanguageDetection(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index e636b81a0..dfac75edc 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMentions(dataset: validmind.vm_models.VMDataset,top_mentions: int = 25) +defMentions(dataset:validmind.vm_models.VMDataset,top_mentions:int=25): ::: @@ -55,7 +55,7 @@ The test first verifies the existence of a text column in the provided dataset. ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index e5bc0653b..2ca6e7a71 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defPolarityAndSubjectivity(dataset,threshold_subjectivity = 0.5,threshold_polarity = 0) +defPolarityAndSubjectivity(dataset,threshold_subjectivity=0.5,threshold_polarity=0): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index dda79858a..810478da0 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -18,7 +18,7 @@ Metrics functions for any Pandas-compatible datasets ::: {.signature} -defPunctuations(dataset,count_mode = 'token') +defPunctuations(dataset,count_mode='token'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index 7807dc2ca..23d12d13e 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defSentiment(dataset) +defSentiment(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index ecf1ac5ed..bf9bc093b 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -defStopWords(dataset: validmind.vm_models.VMDataset,min_percent_threshold: float = 0.5,num_words: int = 25) +defStopWords(dataset:validmind.vm_models.VMDataset,min_percent_threshold:float=0.5,num_words:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index ec0e9819c..c3c0abd4c 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcreate_metrics_df(df,text_column,unwanted_tokens,lang) +defcreate_metrics_df(df,text_column,unwanted_tokens,lang): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defTextDescription(dataset: validmind.vm_models.VMDataset,unwanted_tokens: validmind.vm_models.set = {'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang: str = 'english') +defTextDescription(dataset:validmind.vm_models.VMDataset,unwanted_tokens:validmind.vm_models.set={'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str='english'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index 4c9207309..bb34a9971 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defToxicity(dataset) +defToxicity(dataset): ::: diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 4602329af..d29c3062d 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id = None) +defvalidate_prediction(y_true,y_pred,dataset_id=None): ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -defBertScore(dataset,model,evaluation_model = 'distilbert-base-uncased') +defBertScore(dataset,model,evaluation_model='distilbert-base-uncased'): ::: diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 815c53a92..00abca1b9 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id = None) +defvalidate_prediction(y_true,y_pred,dataset_id=None): ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -defBleuScore(dataset,model) +defBleuScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index fd12fa372..59a65b7e8 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterSizeDistribution(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel) +defClusterSizeDistribution(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): ::: diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 5215dea44..05f8e00ec 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id = None) +defvalidate_prediction(y_true,y_pred,dataset_id=None): ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -defContextualRecall(dataset,model) +defContextualRecall(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 8e0ec7e59..3e5f1779d 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defFeaturesAUC(dataset: validmind.vm_models.VMDataset,fontsize: int = 12,figure_height: int = 500) +defFeaturesAUC(dataset:validmind.vm_models.VMDataset,fontsize:int=12,figure_height:int=500): ::: @@ -70,7 +70,7 @@ For each feature, the metric treats the feature values as raw scores to compute ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 58c22c36c..431440991 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id = None) +defvalidate_prediction(y_true,y_pred,dataset_id=None): ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -defMeteorScore(dataset,model) +defMeteorScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index 0c02e4ad3..def400815 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_model_info(model) +defget_model_info(model): ::: @@ -28,7 +28,7 @@ Attempts to extract all model info from a model object instance ::: {.signature} -defModelMetadata(model) +defModelMetadata(model): ::: diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index 36c07de93..52513c487 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defModelPredictionResiduals(dataset,model,nbins = 100,p_value_threshold = 0.05,start_date = None,end_date = None) +defModelPredictionResiduals(dataset,model,nbins=100,p_value_threshold=0.05,start_date=None,end_date=None): ::: diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index ef7080eea..f92a95093 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id = None) +defvalidate_prediction(y_true,y_pred,dataset_id=None): ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -defRegardScore(dataset,model) +defRegardScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 79311a875..1a1021fe4 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defRegressionResidualsPlot(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,bin_size: float = 0.1) +defRegressionResidualsPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,bin_size:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 110e3001d..aad1f1d6e 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defRougeScore(dataset,model,metric = 'rouge-1') +defRougeScore(dataset,model,metric='rouge-1'): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index 65c55b6bd..a8a62ee79 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesPredictionWithCI(dataset,model,confidence = 0.95) +defTimeSeriesPredictionWithCI(dataset,model,confidence=0.95): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index f0f298a80..7e4e27bcc 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesPredictionsPlot(dataset,model) +defTimeSeriesPredictionsPlot(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 7ec0a5d4e..5e60257ee 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesR2SquareBySegments(dataset,model,segments = None) +defTimeSeriesR2SquareBySegments(dataset,model,segments=None): ::: diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index 58f374286..d4026de41 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTokenDisparity(dataset,model) +defTokenDisparity(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index 33ad53e55..a2f203c12 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defToxicityScore(dataset,model) +defToxicityScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 0b1080d68..af601e4ca 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAdjustedMutualInformation(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) +defAdjustedMutualInformation(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 78d660ebe..ead349b3f 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAdjustedRandIndex(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) +defAdjustedRandIndex(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 3b983933d..d53ef077d 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCalibrationCurve(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,n_bins: int = 10) +defCalibrationCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index a8e140032..5c15ae5f1 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClassifierPerformance(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,average: str = 'macro') +defClassifierPerformance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,average:str='macro'): ::: @@ -58,6 +58,6 @@ The test produces a report that includes precision, recall, F1-Score, and accura ::: {.signature} -defmulticlass_roc_auc_score(y_test,y_pred,average = 'macro') +defmulticlass_roc_auc_score(y_test,y_pred,average='macro'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 09c451897..6e68fa0cf 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClassifierThresholdOptimization(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,methods = None,target_recall = None) +defClassifierThresholdOptimization(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,methods=None,target_recall=None): ::: @@ -90,7 +90,7 @@ The test implements multiple threshold optimization methods: ::: {.signature} -deffind_optimal_threshold(y_true,y_prob,method = 'youden',target_recall = None) +deffind_optimal_threshold(y_true,y_prob,method='youden',target_recall=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index e165aea9a..cf738d248 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterCosineSimilarity(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) +defClusterCosineSimilarity(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: @@ -56,7 +56,7 @@ This test works by first extracting the true and predicted clusters of the model ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index e1ec0c755..547dce141 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterPerformanceMetrics(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) +defClusterPerformanceMetrics(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 0678542ad..4f89f9c2f 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCompletenessScore(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) +defCompletenessScore(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 319f2f62d..d3c3ba490 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defConfusionMatrix(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel) +defConfusionMatrix(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 3627d4145..bc23a018b 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defFeatureImportance(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,num_features: int = 3) +defFeatureImportance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,num_features:int=3): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 014dc440d..1cbf25c63 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defFowlkesMallowsScore(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel) +defFowlkesMallowsScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 3c8759768..512de547f 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHomogeneityScore(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel) +defHomogeneityScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 9de3a1c19..b1ea40faa 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcustom_recall(y_true,y_pred_proba,threshold = 0.5) +defcustom_recall(y_true,y_pred_proba,threshold=0.5): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defHyperParametersTuning(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,param_grid: dict,scoring: Union\[str, List, Dict\] = None,thresholds: Union\[float, List\[float\]\] = None,fit_params: dict = None) +defHyperParametersTuning(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\]=None,thresholds:Union\[float, List\[float\]\]=None,fit_params:dict=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 328d38769..e82819db0 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defKMeansClustersOptimization(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,n_clusters: Union\[List\[int\], None\] = None) +defKMeansClustersOptimization(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_clusters:Union\[List\[int\], None\]=None): ::: @@ -57,7 +57,7 @@ The test mechanism involves iterating over a predefined range of cluster numbers ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 2b77f24da..183788f08 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumAccuracy(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,min_threshold: float = 0.7) +defMinimumAccuracy(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float=0.7): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 0381d04fe..1433ba260 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumF1Score(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,min_threshold: float = 0.5) +defMinimumF1Score(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 42c521de9..e09ff023f 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumROCAUCScore(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,min_threshold: float = 0.5) +defMinimumROCAUCScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 7661eafd8..a372d15a9 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defModelParameters(model,model_params = None) +defModelParameters(model,model_params=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 4a7592db9..b8602108e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defmulticlass_roc_auc_score(y_test,y_pred,average = 'macro') +defmulticlass_roc_auc_score(y_test,y_pred,average='macro'): ::: @@ -24,7 +24,7 @@ toc-expand: 4 ::: {.signature} -defModelsPerformanceComparison(dataset: validmind.vm_models.VMDataset,models: list\[validmind.vm_models.VMModel\]) +defModelsPerformanceComparison(dataset:validmind.vm_models.VMDataset,models:list\[validmind.vm_models.VMModel\]): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 0d38de00b..3ed7f793b 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defOverfitDiagnosis(model: validmind.vm_models.VMModel,datasets: List\[validmind.vm_models.VMDataset\],metric: str = None,cut_off_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}) +defOverfitDiagnosis(model:validmind.vm_models.VMModel,datasets:List\[validmind.vm_models.VMDataset\],metric:str=None,cut_off_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index f9e0a956d..4bf377cf8 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defPermutationFeatureImportance(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,fontsize: Union\[int, None\] = None,figure_height: Union\[int, None\] = None) +defPermutationFeatureImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,fontsize:Union\[int, None\]=None,figure_height:Union\[int, None\]=None): ::: @@ -71,7 +71,7 @@ PFI is calculated via the `permutation_importance` method from the `sklearn.insp ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 5c64c28b0..3892abb8c 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defcalculate_psi(score_initial,score_new,num_bins = 10,mode = 'fixed') +defcalculate_psi(score_initial,score_new,num_bins=10,mode='fixed'): ::: @@ -46,7 +46,7 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -defPopulationStabilityIndex(datasets: List\[validmind.vm_models.VMDataset\],model: validmind.vm_models.VMModel,num_bins: int = 10,mode: str = 'fixed') +defPopulationStabilityIndex(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,num_bins:int=10,mode:str='fixed'): ::: @@ -91,7 +91,7 @@ The implementation of the PSI in this script involves calculating the PSI for ea ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index ef70aaedc..3e1510c58 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defPrecisionRecallCurve(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) +defPrecisionRecallCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: @@ -54,7 +54,7 @@ The test extracts ground truth labels and prediction probabilities from the mode ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 31dccc646..61cdf73c7 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defROCCurve(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) +defROCCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: @@ -57,7 +57,7 @@ First, this script selects the target model and datasets that require binary cla ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index 7a182058d..c82073976 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defRegressionErrors(model,dataset) +defRegressionErrors(model,dataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 82252efb0..0be0fcf5b 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionErrorsComparison(datasets,models) +defRegressionErrorsComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 349bdd5b6..02f8ca4c1 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionPerformance(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) +defRegressionPerformance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index f29dc8426..27c6d4e55 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount: int,featurecount: int) +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -defRegressionR2Square(dataset,model) +defRegressionR2Square(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index f4e0eb4b9..854c9e87f 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount: int,featurecount: int) +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -defRegressionR2SquareComparison(datasets,models) +defRegressionR2SquareComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 347a59fea..3d0447646 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRobustnessDiagnosis(datasets: List\[validmind.vm_models.VMDataset\],model: validmind.vm_models.VMModel,metric: str = None,scaling_factor_std_dev_list: List\[float\] = {'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold: float = {'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}) +defRobustnessDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,metric:str=None,scaling_factor_std_dev_list:List\[float\]={'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): ::: @@ -74,7 +74,7 @@ This test introduces Gaussian noise to the numeric input features of the dataset ::: {.signature} -classMissingOrInvalidModelPredictFnError() +classMissingOrInvalidModelPredictFnError: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index b8a43aa4e..afd5c7c33 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defgenerate_shap_plot(type\_,shap_values,x_test) +defgenerate_shap_plot(type\_,shap_values,x_test): ::: @@ -54,7 +54,7 @@ Plots two types of SHAP global importance (SHAP). ::: {.signature} -defselect_shap_values(shap_values,class_of_interest) +defselect_shap_values(shap_values,class_of_interest): ::: @@ -85,7 +85,7 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -defSHAPGlobalImportance(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,kernel_explainer_samples: int = 10,tree_or_linear_explainer_samples: int = 200,class_of_interest: int = None) +defSHAPGlobalImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): ::: @@ -129,7 +129,7 @@ The exam begins with the selection of a suitable explainer which aligns with the ::: {.signature} -classUnsupportedModelForSHAPError() +classUnsupportedModelForSHAPError: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 154540dc1..6f23b38cc 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScoreProbabilityAlignment(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,score_column: str = 'score',n_bins: int = 10) +defScoreProbabilityAlignment(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,score_column:str='score',n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 7c4233cc6..599b92dc9 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defSilhouettePlot(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) +defSilhouettePlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 7a44fa4c6..f9e8c0048 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTrainingTestDegradation(datasets: List\[validmind.vm_models.VMDataset\],model: validmind.vm_models.VMModel,max_threshold: float = 0.1) +defTrainingTestDegradation(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,max_threshold:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 747a0dc36..f038ffa96 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defVMeasure(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel) +defVMeasure(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index d3da3c397..4b3c1fd73 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defWeakspotsDiagnosis(datasets: List\[validmind.vm_models.VMDataset\],model: validmind.vm_models.VMModel,features_columns: Union\[List\[str\], None\] = None,metrics: Union\[Dict\[str, Callable\], None\] = None,thresholds: Union\[Dict\[str, float\], None\] = None) +defWeakspotsDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,features_columns:Union\[List\[str\], None\]=None,metrics:Union\[Dict\[str, Callable\], None\]=None,thresholds:Union\[Dict\[str, float\], None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index e6703ddb4..07017fac7 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoARIMA(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) +defAutoARIMA(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 8bb6df271..10638c5ce 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCumulativePredictionProbabilities(dataset,model,title = 'Cumulative Probabilities') +defCumulativePredictionProbabilities(dataset,model,title='Cumulative Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 33a3e3557..7aff2de0a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defDurbinWatsonTest(dataset,model,threshold = {'cls': 'ExprList', 'elements': ['1.5', '2.5']}) +defDurbinWatsonTest(dataset,model,threshold={'cls': 'ExprList', 'elements': ['1.5', '2.5']}): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index 72317c195..94dd1da2d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defGINITable(dataset,model) +defGINITable(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 935655a0e..1ff2c0f36 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defKolmogorovSmirnov(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,dist: str = 'norm') +defKolmogorovSmirnov(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,dist:str='norm'): ::: @@ -55,7 +55,7 @@ This test calculates the KS statistic and corresponding p-value for each feature ::: {.signature} -classInvalidTestParametersError() +classInvalidTestParametersError: ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 20fec6599..dedcbcde6 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defLilliefors(dataset: validmind.vm_models.VMDataset) +defLilliefors(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index 251d13f70..fab0a69b2 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defPredictionProbabilitiesHistogram(dataset,model,title = 'Histogram of Predictive Probabilities') +defPredictionProbabilitiesHistogram(dataset,model,title='Histogram of Predictive Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index d00678550..645a0759f 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defRegressionCoeffs(model) +defRegressionCoeffs(model): ::: @@ -57,7 +57,7 @@ The function operates by extracting the estimated coefficients and their standar ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 26e61f4e6..5a100acf1 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionFeatureSignificance(model: validmind.vm_models.VMModel,fontsize: int = 10,p_threshold: float = 0.05) +defRegressionFeatureSignificance(model:validmind.vm_models.VMModel,fontsize:int=10,p_threshold:float=0.05): ::: @@ -69,7 +69,7 @@ The test mechanism involves extracting the model's coefficients and p-values for ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 4ef691493..cd7087381 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionModelForecastPlot(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset,start_date: Union\[str, None\] = None,end_date: Union\[str, None\] = None) +defRegressionModelForecastPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,start_date:Union\[str, None\]=None,end_date:Union\[str, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 4d7a524af..7fbe7d63d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defintegrate_diff(series_diff,start_value) +defintegrate_diff(series_diff,start_value): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defRegressionModelForecastPlotLevels(model: validmind.vm_models.VMModel,dataset: validmind.vm_models.VMDataset) +defRegressionModelForecastPlotLevels(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 1436d9b09..c97816a68 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defintegrate_diff(series_diff,start_value) +defintegrate_diff(series_diff,start_value): ::: @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionModelSensitivityPlot(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,shocks: List\[float\] = {'cls': 'ExprList', 'elements': ['0.1']},transformation: Union\[str, None\] = None) +defRegressionModelSensitivityPlot(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,shocks:List\[float\]={'cls': 'ExprList', 'elements': ['0.1']},transformation:Union\[str, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 28339fd16..90dcf56ad 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount: int,featurecount: int) +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -defRegressionModelSummary(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel) +defRegressionModelSummary(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 68f977c32..683164554 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name = 'validmind',log_level = None) +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionPermutationFeatureImportance(dataset: validmind.vm_models.VMDataset,model: validmind.vm_models.VMModel,fontsize: int = 12,figure_height: int = 500) +defRegressionPermutationFeatureImportance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index 9109c6b16..215ae3660 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScorecardHistogram(dataset,title = 'Histogram of Scores',score_column = 'score') +defScorecardHistogram(dataset,title='Histogram of Scores',score_column='score'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 16b30238f..5f3aa2bc3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted: {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount: int,featurecount: int) +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 4ac6a87b2..4d4fff93f 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt: str,user_prompt: str,temperature: float = 0.0,seed: int = 42) +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response: str) +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response: str) +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defBias(model,min_threshold = 7) +defBias(model,min_threshold=7): ::: @@ -120,7 +120,7 @@ For each test case, the LLM grades the input prompt on a scale of 1 to 10. It ev ::: {.signature} -classMissingRequiredTestInputError() +classMissingRequiredTestInputError: ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 46d4c7c1d..4d56c58e4 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt: str,user_prompt: str,temperature: float = 0.0,seed: int = 42) +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response: str) +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response: str) +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defClarity(model,min_threshold = 7) +defClarity(model,min_threshold=7): ::: @@ -113,7 +113,7 @@ The evaluation uses an LLM to scrutinize the clarity of prompts, factoring in co ::: {.signature} -classMissingRequiredTestInputError() +classMissingRequiredTestInputError: ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 4e25e1432..caff5d76d 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt: str,user_prompt: str,temperature: float = 0.0,seed: int = 42) +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response: str) +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response: str) +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defConciseness(model,min_threshold = 7) +defConciseness(model,min_threshold=7): ::: @@ -115,7 +115,7 @@ Using an LLM, this test conducts a conciseness analysis on input prompts. The an ::: {.signature} -classMissingRequiredTestInputError() +classMissingRequiredTestInputError: ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 402fc4f58..1af1f56df 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt: str,user_prompt: str,temperature: float = 0.0,seed: int = 42) +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response: str) +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response: str) +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defDelimitation(model,min_threshold = 7) +defDelimitation(model,min_threshold=7): ::: @@ -114,7 +114,7 @@ The test employs an LLM to examine prompts for appropriate use of delimiters suc ::: {.signature} -classMissingRequiredTestInputError() +classMissingRequiredTestInputError: ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index e2fe0d6f2..395fc0773 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt: str,user_prompt: str,temperature: float = 0.0,seed: int = 42) +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response: str) +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response: str) +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defNegativeInstruction(model,min_threshold = 7) +defNegativeInstruction(model,min_threshold=7): ::: @@ -114,7 +114,7 @@ An LLM is employed to evaluate each prompt. The prompt is graded based on its us ::: {.signature} -classMissingRequiredTestInputError() +classMissingRequiredTestInputError: ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 922ee2e2e..09bf36d39 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt: str,user_prompt: str,temperature: float = 0.0,seed: int = 42) +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -28,7 +28,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defRobustness(model,dataset,num_tests = 10) +defRobustness(model,dataset,num_tests=10): ::: @@ -71,7 +71,7 @@ The Robustness test appraises prompts under various conditions, alterations, and ::: {.signature} -classMissingRequiredTestInputError() +classMissingRequiredTestInputError: ::: @@ -92,7 +92,7 @@ When a required test context variable is missing. ::: {.signature} -classSkipTestError() +classSkipTestError: ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 107a99fca..f0e1e50b0 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt: str,user_prompt: str,temperature: float = 0.0,seed: int = 42) +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response: str) +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response: str) +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defSpecificity(model,min_threshold = 7) +defSpecificity(model,min_threshold=7): ::: @@ -116,7 +116,7 @@ The Specificity Test employs an LLM to grade each prompt based on clarity, detai ::: {.signature} -classMissingRequiredTestInputError() +classMissingRequiredTestInputError: ::: diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index ec1fcc9c7..a736251ae 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt: str,user_prompt: str,temperature: float = 0.0,seed: int = 42) +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -30,7 +30,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response: str) +defget_explanation(response:str): ::: @@ -54,7 +54,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response: str) +defget_score(response:str): ::: diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 26292a2a4..063dbe57a 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defdescribe_metric(metric_id: str,\*\*kwargs) +defdescribe_metric(metric_id:str,\*\*kwargs): ::: @@ -30,7 +30,7 @@ Describe a metric ::: {.signature} -deflist_metrics(\*\*kwargs) +deflist_metrics(\*\*kwargs): ::: @@ -46,7 +46,7 @@ List all metrics ::: {.signature} -defrun_metric(metric_id: str,\*\*kwargs) +defrun_metric(metric_id:str,\*\*kwargs): ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index fc3765174..79d514394 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -18,7 +18,7 @@ Models entrypoint ::: {.signature} -classFigure() +classFigure: ::: @@ -32,7 +32,7 @@ Figure objects track the schema supported by the ValidMind API ::: {.signature} -defserialize() +defserialize(): ::: @@ -46,7 +46,7 @@ Serializes the Figure to a dictionary so it can be sent to the API ::: {.signature} -defserialize_files() +defserialize_files(): ::: @@ -60,7 +60,7 @@ Creates a `requests`-compatible files object to be sent to the API ::: {.signature} -defto_widget() +defto_widget(): ::: @@ -78,7 +78,7 @@ we would render images as-is, but Plotly FigureWidgets don't work well on Google ::: {.signature} -classModelAttributes() +classModelAttributes: ::: @@ -92,7 +92,7 @@ Model attributes definition ::: {.signature} -deffrom_dict(cls,data) +deffrom_dict(cls,data): ::: @@ -108,7 +108,7 @@ Creates a ModelAttributes instance from a dictionary ::: {.signature} -classTestSuite() +classTestSuite: ::: @@ -126,7 +126,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -defget_default_config()dict +defget_default_config():dict ::: @@ -146,7 +146,7 @@ Each test in a test suite can accept parameters and those parameters can have de ::: {.signature} -defget_tests()List\[str\] +defget_tests():List\[str\] ::: @@ -160,7 +160,7 @@ Get all test suite test objects from all sections ::: {.signature} -defnum_tests()int +defnum_tests():int ::: @@ -176,7 +176,7 @@ Returns the total number of tests in the test suite ::: {.signature} -classTestSuiteRunner() +classTestSuiteRunner: ::: @@ -190,7 +190,7 @@ Runs a test suite ::: {.signature} -deflog_results() +deflog_results(): ::: @@ -206,7 +206,7 @@ This method will be called after the test suite has been run and all results hav ::: {.signature} -defrun(send: bool = True,fail_fast: bool = False) +defrun(send:bool=True,fail_fast:bool=False): ::: @@ -225,7 +225,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -defsummarize(show_link: bool = True) +defsummarize(show_link:bool=True): ::: @@ -237,7 +237,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -classVMDataset() +classVMDataset: ::: @@ -272,7 +272,7 @@ This way we can support multiple dataset types but under the hood we only need t ::: {.signature} -defadd_extra_column(column_name,column_values = None) +defadd_extra_column(column_name,column_values=None): ::: @@ -291,7 +291,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -defassign_predictions(model: validmind.vm_models.VMModel,prediction_column: str = None,prediction_values: list = None,probability_column: str = None,probability_values: list = None,prediction_probabilities: list = None,\*\*kwargs) +defassign_predictions(model:validmind.vm_models.VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): ::: @@ -315,7 +315,7 @@ Assign predictions and probabilities to the dataset. ::: {.signature} -defprediction_column(model: validmind.vm_models.VMModel,column_name: str = None)str +defprediction_column(model:validmind.vm_models.VMModel,column_name:str=None):str ::: @@ -329,7 +329,7 @@ Get or set the prediction column for a model. ::: {.signature} -defprobability_column(model: validmind.vm_models.VMModel,column_name: str = None)str +defprobability_column(model:validmind.vm_models.VMModel,column_name:str=None):str ::: @@ -343,7 +343,7 @@ Get or set the probability column for a model. ::: {.signature} -deftarget_classes() +deftarget_classes(): ::: @@ -357,7 +357,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMDataset +defwith_options(\*\*kwargs):validmind.vm_models.VMDataset ::: @@ -380,7 +380,7 @@ Support options provided when passing an input to run_test or run_test_suite ::: {.signature} -defx_df() +defx_df(): ::: @@ -394,7 +394,7 @@ Returns a dataframe containing only the feature columns ::: {.signature} -defy_df(){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +defy_df():{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -408,7 +408,7 @@ Returns a dataframe containing the target column ::: {.signature} -defy_pred(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]} +defy_pred(model):{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]} ::: @@ -432,7 +432,7 @@ Attempts to stack complex prediction types (e.g., embeddings) into a single, mul ::: {.signature} -defy_pred_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +defy_pred_df(model):{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -446,7 +446,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -defy_prob(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]} +defy_prob(model):{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]} ::: @@ -468,7 +468,7 @@ Returns the probabilities for a given model. ::: {.signature} -defy_prob_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +defy_prob_df(model):{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -484,7 +484,7 @@ Returns a dataframe containing the probabilities for a given model ::: {.signature} -classVMInput() +classVMInput: ::: @@ -500,7 +500,7 @@ Base class for ValidMind Input types ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMInput +defwith_options(\*\*kwargs):validmind.vm_models.VMInput ::: @@ -526,7 +526,7 @@ To allow options, just override this method in the subclass (see VMDataset) and ::: {.signature} -classVMModel() +classVMModel: ::: @@ -549,7 +549,7 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -defpredict(args = (),\*\*kwargs) +defpredict(args=(),\*\*kwargs): ::: @@ -563,7 +563,7 @@ Predict method for the model. This is a wrapper around the model's ::: {.signature} -defpredict_proba(args = (),\*\*kwargs) +defpredict_proba(args=(),\*\*kwargs): ::: @@ -577,7 +577,7 @@ Predict probabilties - must be implemented by subclass if needed ::: {.signature} -defserialize() +defserialize(): ::: From 4001362af970762481d625e146eac090b7118f4c Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 9 Feb 2025 20:53:41 -0800 Subject: [PATCH 077/207] Output class methods on single line and append colon for classes and class methods --- docs/templates/macros/signatures.jinja2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index dbf9c432f..d6e381ba0 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -45,7 +45,7 @@ {%- endfor -%}) {%- else -%}() {%- endif -%} -{%- if not (member.name == "__init__") and member.kind == "function" -%}:{%- endif -%} +{%- if not (member.returns andmember.name == "__init__") and member.kind == "function" -%}:{%- endif -%} {%- if member.returns -%} {{- format_type(member.returns, add_links=true) if member.returns else 'Any' -}} From 9a7666182b2bf290ae643de40f6c92a2c1315dbc Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sun, 9 Feb 2025 20:57:36 -0800 Subject: [PATCH 078/207] Remove colons for return annotations --- docs/templates/macros/signatures.jinja2 | 3 ++- docs/validmind.qmd | 8 +++---- docs/validmind/errors.qmd | 2 +- docs/validmind/test_suites.qmd | 4 ++-- docs/validmind/tests.qmd | 8 +++---- .../tests/data_validation/ClassImbalance.qmd | 2 +- .../data_validation/DescriptiveStatistics.qmd | 2 +- docs/validmind/vm_models.qmd | 24 +++++++++---------- 8 files changed, 27 insertions(+), 26 deletions(-) diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index d6e381ba0..77c8c9f18 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -45,11 +45,12 @@ {%- endfor -%}) {%- else -%}() {%- endif -%} -{%- if not (member.returns andmember.name == "__init__") and member.kind == "function" -%}:{%- endif -%} {%- if member.returns -%} {{- format_type(member.returns, add_links=true) if member.returns else 'Any' -}} +{% else %} + {%- if not (member.name == "__init__") and member.kind == "function" -%}:{%- endif -%} {%- endif +%} ::: diff --git a/docs/validmind.qmd b/docs/validmind.qmd index b063433b2..65bca66ab 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -55,7 +55,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -defget_test_suite(test_suite_id:str=None,section:str=None,args=(),\*\*kwargs):validmind.vm_models.TestSuite +defget_test_suite(test_suite_id:str=None,section:str=None,args=(),\*\*kwargs)validmind.vm_models.TestSuite ::: @@ -108,7 +108,7 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True):validmind.vm_models.VMDataset +definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True)validmind.vm_models.VMDataset ::: @@ -149,7 +149,7 @@ The following dataset types are supported: ::: {.signature} -definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs):validmind.vm_models.VMModel +definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs)validmind.vm_models.VMModel ::: @@ -179,7 +179,7 @@ Initializes a VM Model, which can then be passed to other functions that can per ::: {.signature} -definit_r_model(model_path:str,input_id:str='model'):validmind.vm_models.VMModel +definit_r_model(model_path:str,input_id:str='model')validmind.vm_models.VMModel ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index 5000db1a6..e3173a49d 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -838,7 +838,7 @@ returns a non-JSON string or if the API returns a non-standard error ::: {.signature} -defshould_raise_on_fail_fast(error):bool +defshould_raise_on_fail_fast(error)bool ::: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index f9e4340f8..44b98e7d9 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,7 +29,7 @@ Entrypoint for test suites. ::: {.signature} -defformat_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}):{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +defformat_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -57,7 +57,7 @@ Get a logger for the given module name ::: {.signature} -deftest_id_to_name(test_id:str):str +deftest_id_to_name(test_id:str)str ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index cc697de2e..ef32c4e7e 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -136,7 +136,7 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. ::: {.signature} -defrun_test(test_id:Union\[validmind.vm_models.TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[validmind.vm_models.TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[Callable\[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, None\], None\]=None,\*\*kwargs):validmind.vm_models.TestResult +defrun_test(test_id:Union\[validmind.vm_models.TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[validmind.vm_models.TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[Callable\[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, None\], None\]=None,\*\*kwargs)validmind.vm_models.TestResult ::: @@ -256,7 +256,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -defregister_test_provider(namespace:str,test_provider:validmind.vm_models.TestProvider):None +defregister_test_provider(namespace:str,test_provider:validmind.vm_models.TestProvider)None ::: @@ -402,7 +402,7 @@ Protocol for user-defined test providers ::: {.signature} -deflist_tests():List\[str\] +deflist_tests()List\[str\] ::: @@ -420,7 +420,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str):callable +defload_test(test_id:str)callable ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index ecf73412f..e744e0cea 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -defClassImbalance(dataset:validmind.vm_models.VMDataset,min_percent_threshold:int=10):Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\] +defClassImbalance(dataset:validmind.vm_models.VMDataset,min_percent_threshold:int=10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\] ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 5f8c1d9ee..49193d2ad 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defformat_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}):List\[Dict\[str, Any\]\] +defformat_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict\[str, Any\]\] ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 79d514394..452b16635 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -126,7 +126,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -defget_default_config():dict +defget_default_config()dict ::: @@ -146,7 +146,7 @@ Each test in a test suite can accept parameters and those parameters can have de ::: {.signature} -defget_tests():List\[str\] +defget_tests()List\[str\] ::: @@ -160,7 +160,7 @@ Get all test suite test objects from all sections ::: {.signature} -defnum_tests():int +defnum_tests()int ::: @@ -315,7 +315,7 @@ Assign predictions and probabilities to the dataset. ::: {.signature} -defprediction_column(model:validmind.vm_models.VMModel,column_name:str=None):str +defprediction_column(model:validmind.vm_models.VMModel,column_name:str=None)str ::: @@ -329,7 +329,7 @@ Get or set the prediction column for a model. ::: {.signature} -defprobability_column(model:validmind.vm_models.VMModel,column_name:str=None):str +defprobability_column(model:validmind.vm_models.VMModel,column_name:str=None)str ::: @@ -357,7 +357,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -defwith_options(\*\*kwargs):validmind.vm_models.VMDataset +defwith_options(\*\*kwargs)validmind.vm_models.VMDataset ::: @@ -394,7 +394,7 @@ Returns a dataframe containing only the feature columns ::: {.signature} -defy_df():{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +defy_df(){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -408,7 +408,7 @@ Returns a dataframe containing the target column ::: {.signature} -defy_pred(model):{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]} +defy_pred(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]} ::: @@ -432,7 +432,7 @@ Attempts to stack complex prediction types (e.g., embeddings) into a single, mul ::: {.signature} -defy_pred_df(model):{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +defy_pred_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -446,7 +446,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -defy_prob(model):{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]} +defy_prob(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]} ::: @@ -468,7 +468,7 @@ Returns the probabilities for a given model. ::: {.signature} -defy_prob_df(model):{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +defy_prob_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} ::: @@ -500,7 +500,7 @@ Base class for ValidMind Input types ::: {.signature} -defwith_options(\*\*kwargs):validmind.vm_models.VMInput +defwith_options(\*\*kwargs)validmind.vm_models.VMInput ::: From e33ecb74786b514fc4a806de079968ba156e68b2 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Mon, 10 Feb 2025 14:21:52 -0800 Subject: [PATCH 079/207] Remove colons for return annotations --- docs/templates/macros/signatures.jinja2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index 77c8c9f18..90e8a8800 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -49,8 +49,8 @@ {{- format_type(member.returns, add_links=true) if member.returns else 'Any' -}} -{% else %} - {%- if not (member.name == "__init__") and member.kind == "function" -%}:{%- endif -%} +{% endif %} +{%- if not (member.name == "__init__") -%}:{%- endif -%} {%- endif +%} ::: From 1ba2fc67e3ac81eb9c3607c30c83ce1412523cee Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Tue, 11 Feb 2025 16:40:05 -0800 Subject: [PATCH 080/207] Fix variadic and positional parameters --- docs/templates/macros/signatures.jinja2 | 13 +++---- docs/validmind.qmd | 22 +++++------ .../classification/customer_churn.qmd | 12 +++--- .../datasets/classification/taiwan_credit.qmd | 8 ++-- .../datasets/credit_risk/lending_club.qmd | 18 ++++----- .../credit_risk/lending_club_bias.qmd | 6 +-- docs/validmind/datasets/nlp/cnn_dailymail.qmd | 4 +- .../datasets/nlp/twitter_covid_19.qmd | 2 +- docs/validmind/datasets/regression/fred.qmd | 10 ++--- .../datasets/regression/lending_club.qmd | 4 +- docs/validmind/errors.qmd | 16 ++++---- docs/validmind/test_suites.qmd | 14 +++---- docs/validmind/tests.qmd | 24 ++++++------ .../tests/data_validation/ACFandPACFPlot.qmd | 2 +- docs/validmind/tests/data_validation/ADF.qmd | 4 +- .../tests/data_validation/AutoAR.qmd | 4 +- .../tests/data_validation/AutoMA.qmd | 4 +- .../data_validation/AutoStationarity.qmd | 2 +- .../data_validation/BivariateScatterPlots.qmd | 2 +- .../tests/data_validation/BoxPierce.qmd | 2 +- .../ChiSquaredFeaturesTable.qmd | 2 +- .../tests/data_validation/ClassImbalance.qmd | 2 +- .../data_validation/DatasetDescription.qmd | 12 +++--- .../tests/data_validation/DatasetSplit.qmd | 2 +- .../data_validation/DescriptiveStatistics.qmd | 8 ++-- .../tests/data_validation/DickeyFullerGLS.qmd | 4 +- .../tests/data_validation/Duplicates.qmd | 2 +- .../data_validation/EngleGrangerCoint.qmd | 2 +- .../FeatureTargetCorrelationPlot.qmd | 2 +- .../tests/data_validation/HighCardinality.qmd | 2 +- .../HighPearsonCorrelation.qmd | 2 +- .../data_validation/IQROutliersBarPlot.qmd | 4 +- .../data_validation/IQROutliersTable.qmd | 4 +- .../IsolationForestOutliers.qmd | 2 +- .../tests/data_validation/JarqueBera.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 4 +- .../tests/data_validation/LJungBox.qmd | 2 +- .../LaggedCorrelationHeatmap.qmd | 2 +- .../tests/data_validation/MissingValues.qmd | 2 +- .../data_validation/MissingValuesBarPlot.qmd | 2 +- .../data_validation/MutualInformation.qmd | 2 +- .../PearsonCorrelationMatrix.qmd | 2 +- .../data_validation/PhillipsPerronArch.qmd | 4 +- .../ProtectedClassesCombination.qmd | 4 +- .../ProtectedClassesDescription.qmd | 4 +- .../ProtectedClassesDisparity.qmd | 4 +- .../ProtectedClassesThresholdOptimizer.qmd | 16 ++++---- .../data_validation/RollingStatsPlot.qmd | 4 +- .../tests/data_validation/RunsTest.qmd | 2 +- .../tests/data_validation/ScatterPlot.qmd | 2 +- .../data_validation/ScoreBandDefaultRates.qmd | 2 +- .../data_validation/SeasonalDecompose.qmd | 4 +- .../tests/data_validation/ShapiroWilk.qmd | 2 +- .../tests/data_validation/Skewness.qmd | 2 +- .../tests/data_validation/SpreadPlot.qmd | 2 +- .../TabularCategoricalBarPlots.qmd | 2 +- .../TabularDateTimeHistograms.qmd | 2 +- .../TabularDescriptionTables.qmd | 14 +++---- .../TabularNumericalHistograms.qmd | 2 +- .../data_validation/TargetRateBarPlots.qmd | 2 +- .../data_validation/TimeSeriesDescription.qmd | 2 +- .../TimeSeriesDescriptiveStatistics.qmd | 2 +- .../data_validation/TimeSeriesFrequency.qmd | 2 +- .../data_validation/TimeSeriesHistogram.qmd | 4 +- .../data_validation/TimeSeriesLinePlot.qmd | 2 +- .../TimeSeriesMissingValues.qmd | 2 +- .../data_validation/TimeSeriesOutliers.qmd | 2 +- .../data_validation/TooManyZeroValues.qmd | 2 +- .../tests/data_validation/UniqueRows.qmd | 2 +- .../tests/data_validation/WOEBinPlots.qmd | 4 +- .../tests/data_validation/WOEBinTable.qmd | 2 +- .../data_validation/ZivotAndrewsArch.qmd | 4 +- .../tests/data_validation/nlp/CommonWords.qmd | 2 +- .../tests/data_validation/nlp/Hashtags.qmd | 2 +- .../data_validation/nlp/LanguageDetection.qmd | 2 +- .../tests/data_validation/nlp/Mentions.qmd | 2 +- .../nlp/PolarityAndSubjectivity.qmd | 2 +- .../data_validation/nlp/Punctuations.qmd | 2 +- .../tests/data_validation/nlp/Sentiment.qmd | 2 +- .../tests/data_validation/nlp/StopWords.qmd | 2 +- .../data_validation/nlp/TextDescription.qmd | 4 +- .../tests/data_validation/nlp/Toxicity.qmd | 2 +- .../tests/model_validation/BertScore.qmd | 4 +- .../tests/model_validation/BleuScore.qmd | 4 +- .../ClusterSizeDistribution.qmd | 2 +- .../model_validation/ContextualRecall.qmd | 4 +- .../tests/model_validation/FeaturesAUC.qmd | 4 +- .../tests/model_validation/MeteorScore.qmd | 4 +- .../tests/model_validation/ModelMetadata.qmd | 4 +- .../ModelPredictionResiduals.qmd | 2 +- .../tests/model_validation/RegardScore.qmd | 4 +- .../RegressionResidualsPlot.qmd | 2 +- .../tests/model_validation/RougeScore.qmd | 2 +- .../TimeSeriesPredictionWithCI.qmd | 2 +- .../TimeSeriesPredictionsPlot.qmd | 2 +- .../TimeSeriesR2SquareBySegments.qmd | 2 +- .../tests/model_validation/TokenDisparity.qmd | 2 +- .../tests/model_validation/ToxicityScore.qmd | 2 +- .../sklearn/AdjustedMutualInformation.qmd | 2 +- .../sklearn/AdjustedRandIndex.qmd | 2 +- .../sklearn/CalibrationCurve.qmd | 2 +- .../sklearn/ClassifierPerformance.qmd | 4 +- .../ClassifierThresholdOptimization.qmd | 4 +- .../sklearn/ClusterCosineSimilarity.qmd | 2 +- .../sklearn/ClusterPerformanceMetrics.qmd | 2 +- .../sklearn/CompletenessScore.qmd | 2 +- .../sklearn/ConfusionMatrix.qmd | 2 +- .../sklearn/FeatureImportance.qmd | 2 +- .../sklearn/FowlkesMallowsScore.qmd | 2 +- .../sklearn/HomogeneityScore.qmd | 2 +- .../sklearn/HyperParametersTuning.qmd | 4 +- .../sklearn/KMeansClustersOptimization.qmd | 2 +- .../sklearn/MinimumAccuracy.qmd | 2 +- .../sklearn/MinimumF1Score.qmd | 2 +- .../sklearn/MinimumROCAUCScore.qmd | 2 +- .../sklearn/ModelParameters.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 4 +- .../sklearn/OverfitDiagnosis.qmd | 4 +- .../sklearn/PermutationFeatureImportance.qmd | 4 +- .../sklearn/PopulationStabilityIndex.qmd | 6 +-- .../sklearn/PrecisionRecallCurve.qmd | 2 +- .../model_validation/sklearn/ROCCurve.qmd | 2 +- .../sklearn/RegressionErrors.qmd | 2 +- .../sklearn/RegressionErrorsComparison.qmd | 4 +- .../sklearn/RegressionPerformance.qmd | 4 +- .../sklearn/RegressionR2Square.qmd | 4 +- .../sklearn/RegressionR2SquareComparison.qmd | 4 +- .../sklearn/RobustnessDiagnosis.qmd | 4 +- .../sklearn/SHAPGlobalImportance.qmd | 8 ++-- .../sklearn/ScoreProbabilityAlignment.qmd | 2 +- .../sklearn/SilhouettePlot.qmd | 2 +- .../sklearn/TrainingTestDegradation.qmd | 2 +- .../model_validation/sklearn/VMeasure.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 2 +- .../statsmodels/AutoARIMA.qmd | 4 +- .../CumulativePredictionProbabilities.qmd | 2 +- .../statsmodels/DurbinWatsonTest.qmd | 2 +- .../statsmodels/GINITable.qmd | 2 +- .../statsmodels/KolmogorovSmirnov.qmd | 2 +- .../statsmodels/Lilliefors.qmd | 2 +- .../PredictionProbabilitiesHistogram.qmd | 2 +- .../statsmodels/RegressionCoeffs.qmd | 2 +- .../RegressionFeatureSignificance.qmd | 4 +- .../RegressionModelForecastPlot.qmd | 4 +- .../RegressionModelForecastPlotLevels.qmd | 4 +- .../RegressionModelSensitivityPlot.qmd | 6 +-- .../statsmodels/RegressionModelSummary.qmd | 4 +- ...RegressionPermutationFeatureImportance.qmd | 4 +- .../statsmodels/ScorecardHistogram.qmd | 2 +- .../statsmodels/statsutils.qmd | 2 +- .../tests/prompt_validation/Bias.qmd | 8 ++-- .../tests/prompt_validation/Clarity.qmd | 8 ++-- .../tests/prompt_validation/Conciseness.qmd | 8 ++-- .../tests/prompt_validation/Delimitation.qmd | 8 ++-- .../prompt_validation/NegativeInstruction.qmd | 8 ++-- .../tests/prompt_validation/Robustness.qmd | 4 +- .../tests/prompt_validation/Specificity.qmd | 8 ++-- .../prompt_validation/ai_powered_test.qmd | 6 +-- docs/validmind/unit_metrics.qmd | 6 +-- docs/validmind/vm_models.qmd | 38 +++++++++---------- 160 files changed, 333 insertions(+), 334 deletions(-) diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index 90e8a8800..ac6a947b1 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -14,7 +14,7 @@ {%- endif -%} {{ member.parent.name if (member.name == "__init__" and member.parent is defined) else member.name }} -{%- if member.kind == "class" -%}: +{%- if member.kind == "class" -%} {%- elif member.parameters -%}({{- '' -}} {%- set params = [] -%} {%- for param in member.parameters -%} @@ -23,16 +23,16 @@ {%- endif -%} {%- endfor -%} {%- for param in params -%} - + {%- if param.name == "self" -%} self {%- else -%} - {{ "**" if param.name == "kwargs" else "" }}{{ param.name }} + {{ "**" if param.name == "kwargs" else "*" if param.kind == "variadic positional" else "" }}{{ param.name }} {%- endif -%} {%- if param.annotation -%} :{{ format_type(param.annotation, add_links=true) }} {%- endif -%} - {%- if param.default is not none and param.name != "kwargs" -%} + {%- if param.default is not none and param.name != "kwargs" and param.kind != "variadic positional" -%} = {%- if param.default is string and param.default.startswith("'") and param.default.endswith("'") -%} {{ param.default }} @@ -49,9 +49,8 @@ {{- format_type(member.returns, add_links=true) if member.returns else 'Any' -}} -{% endif %} -{%- if not (member.name == "__init__") -%}:{%- endif -%} -{%- endif +%} +{%- endif -%} +{%- if not (member.name == "__init__") -%}:{%- endif +%} ::: {%- endmacro -%} \ No newline at end of file diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 65bca66ab..01810fc65 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -55,7 +55,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -defget_test_suite(test_suite_id:str=None,section:str=None,args=(),\*\*kwargs)validmind.vm_models.TestSuite +defget_test_suite(test_suite_id:str=None,section:str=None,\*args,\*\*kwargs)validmind.vm_models.TestSuite: ::: @@ -78,7 +78,7 @@ This function provides an interface to retrieve the TestSuite instance for the c ::: {.signature} -definit(project:Optional\[str\]=None,api_key:Optional\[str\]=None,api_secret:Optional\[str\]=None,api_host:Optional\[str\]=None,model:Optional\[str\]=None,monitoring:bool=False,generate_descriptions:Optional\[bool\]=None): +definit(project:Optional\[str\]=None,api_key:Optional\[str\]=None,api_secret:Optional\[str\]=None,api_host:Optional\[str\]=None,model:Optional\[str\]=None,monitoring:bool=False,generate_descriptions:Optional\[bool\]=None): ::: @@ -108,7 +108,7 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True)validmind.vm_models.VMDataset +definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True)validmind.vm_models.VMDataset: ::: @@ -149,7 +149,7 @@ The following dataset types are supported: ::: {.signature} -definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs)validmind.vm_models.VMModel +definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs)validmind.vm_models.VMModel: ::: @@ -179,7 +179,7 @@ Initializes a VM Model, which can then be passed to other functions that can per ::: {.signature} -definit_r_model(model_path:str,input_id:str='model')validmind.vm_models.VMModel +definit_r_model(model_path:str,input_id:str='model')validmind.vm_models.VMModel: ::: @@ -211,7 +211,7 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ::: {.signature} -deflog_metric(key:str,value:float,inputs:Optional\[List\[str\]\]=None,params:Optional\[Dict\[str, Any\]\]=None,recorded_at:Optional\[str\]=None,thresholds:Optional\[Dict\[str, Any\]\]=None): +deflog_metric(key:str,value:float,inputs:Optional\[List\[str\]\]=None,params:Optional\[Dict\[str, Any\]\]=None,recorded_at:Optional\[str\]=None,thresholds:Optional\[Dict\[str, Any\]\]=None): ::: @@ -286,7 +286,7 @@ Reconnect to the ValidMind API and reload the project configuration ::: {.signature} -defrun_documentation_tests(section=None,send=True,fail_fast=False,inputs=None,config=None,\*\*kwargs): +defrun_documentation_tests(section=None,send=True,fail_fast=False,inputs=None,config=None,\*\*kwargs): ::: @@ -319,7 +319,7 @@ This function will analyze the current project's documentation template and coll ::: {.signature} -defrun_test_suite(test_suite_id,send=True,fail_fast=False,config=None,inputs=None,\*\*kwargs): +defrun_test_suite(test_suite_id,send=True,fail_fast=False,config=None,inputs=None,\*\*kwargs): ::: @@ -352,7 +352,7 @@ This function provides a high level interface for running a test suite. A test s ::: {.signature} -deftags(tags=()): +deftags(\*tags): ::: @@ -370,7 +370,7 @@ Decorator for specifying tags for a test. ::: {.signature} -deftasks(tasks=()): +deftasks(\*tasks): ::: @@ -388,7 +388,7 @@ Decorator for specifying the task types that a test is designed for. ::: {.signature} -deftest(func_or_id): +deftest(func_or_id): ::: diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index 9b16ff2f6..7d83043dd 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defsimple_preprocess_booleans(df,columns): +defsimple_preprocess_booleans(df,columns): ::: @@ -35,7 +35,7 @@ Preprocess boolean columns. ::: {.signature} -defsimple_preprocess_categoricals(df,columns): +defsimple_preprocess_categoricals(df,columns): ::: @@ -58,7 +58,7 @@ Preprocess categorical columns. ::: {.signature} -defsimple_preprocess_numericals(df,columns): +defsimple_preprocess_numericals(df,columns): ::: @@ -83,7 +83,7 @@ Preprocess numerical columns. ::: {.signature} -defget_demo_test_config(test_suite=None): +defget_demo_test_config(test_suite=None): ::: @@ -116,7 +116,7 @@ We assign the following inputs depending on the input config expected by each te ::: {.signature} -defload_data(full_dataset=False): +defload_data(full_dataset=False): ::: @@ -128,6 +128,6 @@ We assign the following inputs depending on the input config expected by each te ::: {.signature} -defpreprocess(df): +defpreprocess(df): ::: diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index 94c4c8196..581e26dea 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defsimple_preprocess_booleans(df,columns): +defsimple_preprocess_booleans(df,columns): ::: @@ -35,7 +35,7 @@ Preprocess boolean columns. ::: {.signature} -defsimple_preprocess_categoricals(df,columns): +defsimple_preprocess_categoricals(df,columns): ::: @@ -58,7 +58,7 @@ Preprocess categorical columns. ::: {.signature} -defsimple_preprocess_numericals(df,columns): +defsimple_preprocess_numericals(df,columns): ::: @@ -95,6 +95,6 @@ Preprocess numerical columns. ::: {.signature} -defpreprocess(df): +defpreprocess(df): ::: diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index 7280e7d9e..e663d7e5d 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcompute_scores(probabilities): +defcompute_scores(probabilities): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -deffeature_engineering(df,verbose=True): +deffeature_engineering(df,verbose=True): ::: @@ -38,7 +38,7 @@ toc-expand: 4 ::: {.signature} -defget_demo_test_config(x_test=None,y_test=None): +defget_demo_test_config(x_test=None,y_test=None): ::: @@ -63,7 +63,7 @@ Get demo test configuration. ::: {.signature} -definit_vm_objects(scorecard): +definit_vm_objects(scorecard): ::: @@ -75,7 +75,7 @@ Get demo test configuration. ::: {.signature} -defload_data(source='online',verbose=True): +defload_data(source='online',verbose=True): ::: @@ -111,7 +111,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -defload_test_config(scorecard): +defload_test_config(scorecard): ::: @@ -123,7 +123,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -defpreprocess(df,verbose=True): +defpreprocess(df,verbose=True): ::: @@ -135,7 +135,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -defsplit(df,validation_size=None,test_size=0.2,add_constant=False,verbose=True): +defsplit(df,validation_size=None,test_size=0.2,add_constant=False,verbose=True): ::: @@ -162,6 +162,6 @@ Split dataset into train, validation (optional), and test sets. ::: {.signature} -defwoe_encoding(df,verbose=True): +defwoe_encoding(df,verbose=True): ::: diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 119c99d2e..04f692e65 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcompute_scores(probabilities): +defcompute_scores(probabilities): ::: @@ -44,7 +44,7 @@ Load data from the specified CSV file. ::: {.signature} -defpreprocess(df): +defpreprocess(df): ::: @@ -56,6 +56,6 @@ Load data from the specified CSV file. ::: {.signature} -defsplit(df,test_size=0.3): +defsplit(df,test_size=0.3): ::: diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index 2f9937472..7750053cc 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defdisplay_nice(df,num_rows=None): +defdisplay_nice(df,num_rows=None): ::: @@ -30,7 +30,7 @@ Primary function to format and display a DataFrame. ::: {.signature} -defload_data(source='online',dataset_size=None): +defload_data(source='online',dataset_size=None): ::: diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index 408dd76fa..d84be5a06 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -14,6 +14,6 @@ toc-expand: 4 ::: {.signature} -defload_data(full_dataset=False): +defload_data(full_dataset=False): ::: diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index c1f66b6ac..2a82b0a51 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -38,7 +38,7 @@ toc-expand: 4 ::: {.signature} -defload_model(model_name): +defload_model(model_name): ::: @@ -62,7 +62,7 @@ toc-expand: 4 ::: {.signature} -defload_test_dataset(model_name): +defload_test_dataset(model_name): ::: @@ -74,7 +74,7 @@ toc-expand: 4 ::: {.signature} -defload_train_dataset(model_path): +defload_train_dataset(model_path): ::: @@ -86,7 +86,7 @@ toc-expand: 4 ::: {.signature} -defpreprocess(df,split_option='train_test_val',train_size=0.6,test_size=0.2): +defpreprocess(df,split_option='train_test_val',train_size=0.6,test_size=0.2): ::: @@ -113,6 +113,6 @@ Split a time series DataFrame into train, validation, and test sets. ::: {.signature} -deftransform(df,transform_func='diff'): +deftransform(df,transform_func='diff'): ::: diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 3d35ecd0f..11abd25d7 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defpreprocess(df,split_option='train_test_val',train_size=0.6,test_size=0.2): +defpreprocess(df,split_option='train_test_val',train_size=0.6,test_size=0.2): ::: @@ -53,6 +53,6 @@ Split a time series DataFrame into train, validation, and test sets. ::: {.signature} -deftransform(df,transform_func='diff'): +deftransform(df,transform_func='diff'): ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index e3173a49d..fb041b696 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -58,7 +58,7 @@ Generic error for API request errors that are not known. ::: {.signature} -defdescription(args=(),\*\*kwargs): +defdescription(\*args,\*\*kwargs): ::: @@ -127,7 +127,7 @@ When the test suite was found but could not be initialized. ::: {.signature} -defdescription(args=(),\*\*kwargs): +defdescription(\*args,\*\*kwargs): ::: @@ -217,7 +217,7 @@ When an invalid metric results object is sent to the API. ::: {.signature} -defdescription(args=(),\*\*kwargs): +defdescription(\*args,\*\*kwargs): ::: @@ -412,7 +412,7 @@ When the class labels found in the dataset don't match the provided target label ::: {.signature} -defdescription(args=(),\*\*kwargs): +defdescription(\*args,\*\*kwargs): ::: @@ -523,7 +523,7 @@ When the client config is missing the documentation template. ::: {.signature} -defdescription(args=(),\*\*kwargs): +defdescription(\*args,\*\*kwargs): ::: @@ -598,7 +598,7 @@ When the R extras have not been installed. ::: {.signature} -defdescription(args=(),\*\*kwargs): +defdescription(\*args,\*\*kwargs): ::: @@ -820,7 +820,7 @@ When an unsupported R model is used. ::: {.signature} -defraise_api_error(error_string): +defraise_api_error(error_string): ::: @@ -838,7 +838,7 @@ returns a non-JSON string or if the API returns a non-standard error ::: {.signature} -defshould_raise_on_fail_fast(error)bool +defshould_raise_on_fail_fast(error)bool: ::: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 44b98e7d9..ad35b6caa 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,7 +29,7 @@ Entrypoint for test suites. ::: {.signature} -defformat_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +defformat_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: @@ -43,7 +43,7 @@ Format a pandas DataFrame for display purposes ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -57,7 +57,7 @@ Get a logger for the given module name ::: {.signature} -deftest_id_to_name(test_id:str)str +deftest_id_to_name(test_id:str)str: ::: @@ -81,7 +81,7 @@ Convert a test ID to a human-readable name. ::: {.signature} -defdescribe_suite(test_suite_id:str,verbose=False): +defdescribe_suite(test_suite_id:str,verbose=False): ::: @@ -106,7 +106,7 @@ Describes a Test Suite by ID ::: {.signature} -defget_by_id(test_suite_id:str): +defget_by_id(test_suite_id:str): ::: @@ -122,7 +122,7 @@ Returns the test suite by ID ::: {.signature} -deflist_suites(pretty:bool=True): +deflist_suites(pretty:bool=True): ::: @@ -138,7 +138,7 @@ Returns a list of all available test suites ::: {.signature} -defregister_test_suite(suite_id:str,suite:validmind.vm_models.TestSuite): +defregister_test_suite(suite_id:str,suite:validmind.vm_models.TestSuite): ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index ef32c4e7e..23d0c5407 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -20,7 +20,7 @@ ValidMind Tests Module ::: {.signature} -defdescribe_test(test_id:validmind.vm_models.TestID=None,raw:bool=False,show:bool=True): +defdescribe_test(test_id:validmind.vm_models.TestID=None,raw:bool=False,show:bool=True): ::: @@ -69,7 +69,7 @@ List unique tasks from all test classes. ::: {.signature} -deflist_tasks_and_tags(as_json=False): +deflist_tasks_and_tags(as_json=False): ::: @@ -89,7 +89,7 @@ all tags for a task type in one row. ::: {.signature} -deflist_tests(filter=None,task=None,tags=None,pretty=True,truncate=True): +deflist_tests(filter=None,task=None,tags=None,pretty=True,truncate=True): ::: @@ -115,7 +115,7 @@ List all tests in the tests directory. ::: {.signature} -defload_test(test_id:str,test_func:callable=None,reload:bool=False): +defload_test(test_id:str,test_func:callable=None,reload:bool=False): ::: @@ -136,7 +136,7 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. ::: {.signature} -defrun_test(test_id:Union\[validmind.vm_models.TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[validmind.vm_models.TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[Callable\[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, None\], None\]=None,\*\*kwargs)validmind.vm_models.TestResult +defrun_test(test_id:Union\[validmind.vm_models.TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[validmind.vm_models.TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[Callable\[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, None\], None\]=None,\*\*kwargs)validmind.vm_models.TestResult: ::: @@ -179,7 +179,7 @@ This function is the main entry point for running tests. It can run simple unit ::: {.signature} -deftags(tags=()): +deftags(\*tags): ::: @@ -197,7 +197,7 @@ Decorator for specifying tags for a test. ::: {.signature} -deftasks(tasks=()): +deftasks(\*tasks): ::: @@ -215,7 +215,7 @@ Decorator for specifying the task types that a test is designed for. ::: {.signature} -deftest(func_or_id): +deftest(func_or_id): ::: @@ -256,7 +256,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -defregister_test_provider(namespace:str,test_provider:validmind.vm_models.TestProvider)None +defregister_test_provider(namespace:str,test_provider:validmind.vm_models.TestProvider)None: ::: @@ -357,7 +357,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str): +defload_test(test_id:str): ::: @@ -402,7 +402,7 @@ Protocol for user-defined test providers ::: {.signature} -deflist_tests()List\[str\] +deflist_tests()List\[str\]: ::: @@ -420,7 +420,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str)callable +defload_test(test_id:str)callable: ::: diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 8235821b8..690848d98 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defACFandPACFPlot(dataset:validmind.vm_models.VMDataset): +defACFandPACFPlot(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 632d0f5a8..e50cbbfdb 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defADF(dataset:validmind.vm_models.VMDataset): +defADF(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 235e80f3d..b50489c50 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoAR(dataset:validmind.vm_models.VMDataset,max_ar_order:int=3): +defAutoAR(dataset:validmind.vm_models.VMDataset,max_ar_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index 25deb1eb3..6d5db0689 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoMA(dataset:validmind.vm_models.VMDataset,max_ma_order:int=3): +defAutoMA(dataset:validmind.vm_models.VMDataset,max_ma_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index ce899ab7b..9b99ec56e 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAutoStationarity(dataset:validmind.vm_models.VMDataset,max_order:int=5,threshold:float=0.05): +defAutoStationarity(dataset:validmind.vm_models.VMDataset,max_order:int=5,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index f650e57a5..a695c316a 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defBivariateScatterPlots(dataset): +defBivariateScatterPlots(dataset): ::: diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index 5c0e76767..cd4f570d7 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defBoxPierce(dataset): +defBoxPierce(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 39a2a0418..20f4abb0d 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defChiSquaredFeaturesTable(dataset,p_threshold=0.05): +defChiSquaredFeaturesTable(dataset,p_threshold=0.05): ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index e744e0cea..96f0bc635 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -defClassImbalance(dataset:validmind.vm_models.VMDataset,min_percent_threshold:int=10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\] +defClassImbalance(dataset:validmind.vm_models.VMDataset,min_percent_threshold:int=10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\]: ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 0f2f37e41..9ccb50e80 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defDatasetDescription(dataset:validmind.vm_models.VMDataset): +defDatasetDescription(dataset:validmind.vm_models.VMDataset): ::: @@ -74,7 +74,7 @@ The DatasetDescription class accomplishes the purpose as follows: firstly, the t ::: {.signature} -defdescribe_column(df,column): +defdescribe_column(df,column): ::: @@ -90,7 +90,7 @@ Gets descriptive statistics for a single column in a Pandas DataFrame. ::: {.signature} -defget_column_histograms(df,column,type\_): +defget_column_histograms(df,column,type\_): ::: @@ -110,7 +110,7 @@ Will be used in favor of \_get_histogram in the future ::: {.signature} -defget_numerical_histograms(df,column): +defget_numerical_histograms(df,column): ::: @@ -128,7 +128,7 @@ with a different bin size ::: {.signature} -definfer_datatypes(df): +definfer_datatypes(df): ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 550b3520e..1a24f0011 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defDatasetSplit(datasets:List\[validmind.vm_models.VMDataset\]): +defDatasetSplit(datasets:List\[validmind.vm_models.VMDataset\]): ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 49193d2ad..613703219 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defformat_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict\[str, Any\]\] +defformat_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict\[str, Any\]\]: ::: @@ -36,7 +36,7 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -defDescriptiveStatistics(dataset:validmind.vm_models.VMDataset): +defDescriptiveStatistics(dataset:validmind.vm_models.VMDataset): ::: @@ -80,7 +80,7 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des ::: {.signature} -defget_summary_statistics_categorical(df,categorical_fields): +defget_summary_statistics_categorical(df,categorical_fields): ::: @@ -92,7 +92,7 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des ::: {.signature} -defget_summary_statistics_numerical(df,numerical_fields): +defget_summary_statistics_numerical(df,numerical_fields): ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index be6d543e3..50096ae3c 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defDickeyFullerGLS(dataset:validmind.vm_models.VMDataset): +defDickeyFullerGLS(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index fc3fd0159..159fcb044 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defDuplicates(dataset,min_threshold=1): +defDuplicates(dataset,min_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 1e69037ab..9d3f8aaa0 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defEngleGrangerCoint(dataset:validmind.vm_models.VMDataset,threshold:float=0.05): +defEngleGrangerCoint(dataset:validmind.vm_models.VMDataset,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 7895fd0da..f3b7e1d73 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defFeatureTargetCorrelationPlot(dataset,fig_height=600): +defFeatureTargetCorrelationPlot(dataset,fig_height=600): ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 43c1cbed4..93376cc4e 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHighCardinality(dataset:validmind.vm_models.VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): +defHighCardinality(dataset:validmind.vm_models.VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index d67fbba4c..ea4d800d7 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHighPearsonCorrelation(dataset:validmind.vm_models.VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): +defHighPearsonCorrelation(dataset:validmind.vm_models.VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 467a12569..f2cab49e1 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcompute_outliers(series,threshold): +defcompute_outliers(series,threshold): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defIQROutliersBarPlot(dataset:validmind.vm_models.VMDataset,threshold:float=1.5,fig_width:int=800): +defIQROutliersBarPlot(dataset:validmind.vm_models.VMDataset,threshold:float=1.5,fig_width:int=800): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 6a78d063a..f98d09a49 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcompute_outliers(series,threshold=1.5): +defcompute_outliers(series,threshold=1.5): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defIQROutliersTable(dataset:validmind.vm_models.VMDataset,threshold:float=1.5): +defIQROutliersTable(dataset:validmind.vm_models.VMDataset,threshold:float=1.5): ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index 86f249c9c..0986a35df 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defIsolationForestOutliers(dataset:validmind.vm_models.VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): +defIsolationForestOutliers(dataset:validmind.vm_models.VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index d8db0be3a..a5a44ffd7 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defJarqueBera(dataset): +defJarqueBera(dataset): ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index f7a82176e..8853bdc28 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defKPSS(dataset:validmind.vm_models.VMDataset): +defKPSS(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 0a403809a..1853a1abe 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defLJungBox(dataset): +defLJungBox(dataset): ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index d4a1abf73..ff1e2153a 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defLaggedCorrelationHeatmap(dataset:validmind.vm_models.VMDataset,num_lags:int=10): +defLaggedCorrelationHeatmap(dataset:validmind.vm_models.VMDataset,num_lags:int=10): ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 80ced81eb..8571b24ff 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMissingValues(dataset:validmind.vm_models.VMDataset,min_threshold:int=1): +defMissingValues(dataset:validmind.vm_models.VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index bd1a22f29..2c1951964 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMissingValuesBarPlot(dataset:validmind.vm_models.VMDataset,threshold:int=80,fig_height:int=600): +defMissingValuesBarPlot(dataset:validmind.vm_models.VMDataset,threshold:int=80,fig_height:int=600): ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 538042573..173f6b240 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMutualInformation(dataset:validmind.vm_models.VMDataset,min_threshold:float=0.01,task:str='classification'): +defMutualInformation(dataset:validmind.vm_models.VMDataset,min_threshold:float=0.01,task:str='classification'): ::: diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index 67de47299..ec3388ee2 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defPearsonCorrelationMatrix(dataset): +defPearsonCorrelationMatrix(dataset): ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index a36878a17..480d7de54 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defPhillipsPerronArch(dataset:validmind.vm_models.VMDataset): +defPhillipsPerronArch(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index aa529f75f..0f3afd105 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defProtectedClassesCombination(dataset,model,protected_classes=None): +defProtectedClassesCombination(dataset,model,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index 968322bfd..fb4cc51b5 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defProtectedClassesDescription(dataset,protected_classes=None): +defProtectedClassesDescription(dataset,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 95986bd17..c58d155c1 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics={'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}): +defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics={'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 236f7fd38..d91ebf2ec 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defcalculate_fairness_metrics(test_df,target,y_pred_opt,protected_classes): +defcalculate_fairness_metrics(test_df,target,y_pred_opt,protected_classes): ::: @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -defcalculate_group_metrics(test_df,target,y_pred_opt,protected_classes): +defcalculate_group_metrics(test_df,target,y_pred_opt,protected_classes): ::: @@ -52,7 +52,7 @@ Get a logger for the given module name ::: {.signature} -defget_thresholds_by_group(threshold_optimizer): +defget_thresholds_by_group(threshold_optimizer): ::: @@ -64,7 +64,7 @@ Get a logger for the given module name ::: {.signature} -definitialize_and_fit_optimizer(pipeline,X_train,y_train,protected_classes_df): +definitialize_and_fit_optimizer(pipeline,X_train,y_train,protected_classes_df): ::: @@ -76,7 +76,7 @@ Get a logger for the given module name ::: {.signature} -defmake_predictions(threshold_optimizer,test_df,protected_classes): +defmake_predictions(threshold_optimizer,test_df,protected_classes): ::: @@ -88,7 +88,7 @@ Get a logger for the given module name ::: {.signature} -defplot_thresholds(threshold_optimizer): +defplot_thresholds(threshold_optimizer): ::: @@ -100,7 +100,7 @@ Get a logger for the given module name ::: {.signature} -defProtectedClassesThresholdOptimizer(dataset,pipeline=None,protected_classes=None,X_train=None,y_train=None): +defProtectedClassesThresholdOptimizer(dataset,pipeline=None,protected_classes=None,X_train=None,y_train=None): ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 6608f6f2a..c63fe5a27 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defplot_rolling_statistics(df,col,window_size): +defplot_rolling_statistics(df,col,window_size): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defRollingStatsPlot(dataset:validmind.vm_models.VMDataset,window_size:int=12): +defRollingStatsPlot(dataset:validmind.vm_models.VMDataset,window_size:int=12): ::: diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 1c2154c46..08d1fbfd5 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defRunsTest(dataset): +defRunsTest(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 69ab7b0cf..481253842 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScatterPlot(dataset): +defScatterPlot(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index a5295f02b..b8e32cba6 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScoreBandDefaultRates(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,score_column:str='score',score_bands:list=None): +defScoreBandDefaultRates(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,score_column:str='score',score_bands:list=None): ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 9b89a7fb2..9072f30ff 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defSeasonalDecompose(dataset:validmind.vm_models.VMDataset,seasonal_model:str='additive'): +defSeasonalDecompose(dataset:validmind.vm_models.VMDataset,seasonal_model:str='additive'): ::: diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index c542efd77..12d9c69b0 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defShapiroWilk(dataset): +defShapiroWilk(dataset): ::: diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index e9429ba54..83f95626e 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defSkewness(dataset,max_threshold=1): +defSkewness(dataset,max_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 2e5135642..12452b431 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defSpreadPlot(dataset:validmind.vm_models.VMDataset): +defSpreadPlot(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 0cbbba982..9ca372681 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTabularCategoricalBarPlots(dataset:validmind.vm_models.VMDataset): +defTabularCategoricalBarPlots(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 638861430..d42fc0d5f 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTabularDateTimeHistograms(dataset:validmind.vm_models.VMDataset): +defTabularDateTimeHistograms(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 09195a994..28b99f2ee 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defget_categorical_columns(dataset): +defget_categorical_columns(dataset): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defget_datetime_columns(dataset): +defget_datetime_columns(dataset): ::: @@ -38,7 +38,7 @@ toc-expand: 4 ::: {.signature} -defget_numerical_columns(dataset): +defget_numerical_columns(dataset): ::: @@ -50,7 +50,7 @@ toc-expand: 4 ::: {.signature} -defget_summary_statistics_categorical(dataset,categorical_fields): +defget_summary_statistics_categorical(dataset,categorical_fields): ::: @@ -62,7 +62,7 @@ toc-expand: 4 ::: {.signature} -defget_summary_statistics_datetime(dataset,datetime_fields): +defget_summary_statistics_datetime(dataset,datetime_fields): ::: @@ -74,7 +74,7 @@ toc-expand: 4 ::: {.signature} -defget_summary_statistics_numerical(dataset,numerical_fields): +defget_summary_statistics_numerical(dataset,numerical_fields): ::: @@ -86,7 +86,7 @@ toc-expand: 4 ::: {.signature} -defTabularDescriptionTables(dataset): +defTabularDescriptionTables(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 8c85ec8bb..eb886e4da 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTabularNumericalHistograms(dataset:validmind.vm_models.VMDataset): +defTabularNumericalHistograms(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 00b34a7cf..1e8f3d052 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTargetRateBarPlots(dataset:validmind.vm_models.VMDataset): +defTargetRateBarPlots(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 7de0f37e9..83a43f730 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesDescription(dataset): +defTimeSeriesDescription(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 49d5e6208..05e4946b0 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesDescriptiveStatistics(dataset): +defTimeSeriesDescriptiveStatistics(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 45fb1e3de..0439b0811 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesFrequency(dataset:validmind.vm_models.VMDataset): +defTimeSeriesFrequency(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 5526602c3..9e5e608e5 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defTimeSeriesHistogram(dataset,nbins=30): +defTimeSeriesHistogram(dataset,nbins=30): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 412eb8a00..25f05a795 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesLinePlot(dataset:validmind.vm_models.VMDataset): +defTimeSeriesLinePlot(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 5335cc9fb..cae3dec04 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesMissingValues(dataset:validmind.vm_models.VMDataset,min_threshold:int=1): +defTimeSeriesMissingValues(dataset:validmind.vm_models.VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 0fab76111..b7064dd9b 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesOutliers(dataset:validmind.vm_models.VMDataset,zscore_threshold:int=3): +defTimeSeriesOutliers(dataset:validmind.vm_models.VMDataset,zscore_threshold:int=3): ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index cdf94e046..b46d9202b 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTooManyZeroValues(dataset:validmind.vm_models.VMDataset,max_percent_threshold:float=0.03): +defTooManyZeroValues(dataset:validmind.vm_models.VMDataset,max_percent_threshold:float=0.03): ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 22f400981..3d029a90d 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defUniqueRows(dataset:validmind.vm_models.VMDataset,min_percent_threshold:float=1): +defUniqueRows(dataset:validmind.vm_models.VMDataset,min_percent_threshold:float=1): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 8f8c7f347..b76c115e4 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defWOEBinPlots(dataset:validmind.vm_models.VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): +defWOEBinPlots(dataset:validmind.vm_models.VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 8722f5426..bc240f54a 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defWOEBinTable(dataset:validmind.vm_models.VMDataset,breaks_adj:list=None): +defWOEBinTable(dataset:validmind.vm_models.VMDataset,breaks_adj:list=None): ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index de7ebee56..234e731d7 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defZivotAndrewsArch(dataset:validmind.vm_models.VMDataset): +defZivotAndrewsArch(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index e7d36bcca..f354650ef 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCommonWords(dataset:validmind.vm_models.VMDataset): +defCommonWords(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index dfbff9901..58053e00d 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHashtags(dataset:validmind.vm_models.VMDataset,top_hashtags:int=25): +defHashtags(dataset:validmind.vm_models.VMDataset,top_hashtags:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index dd40accf0..7a570787b 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defLanguageDetection(dataset): +defLanguageDetection(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index dfac75edc..dd9244935 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMentions(dataset:validmind.vm_models.VMDataset,top_mentions:int=25): +defMentions(dataset:validmind.vm_models.VMDataset,top_mentions:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index 2ca6e7a71..f3becb729 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defPolarityAndSubjectivity(dataset,threshold_subjectivity=0.5,threshold_polarity=0): +defPolarityAndSubjectivity(dataset,threshold_subjectivity=0.5,threshold_polarity=0): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index 810478da0..acd915ae6 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -18,7 +18,7 @@ Metrics functions for any Pandas-compatible datasets ::: {.signature} -defPunctuations(dataset,count_mode='token'): +defPunctuations(dataset,count_mode='token'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index 23d12d13e..a38229b76 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defSentiment(dataset): +defSentiment(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index bf9bc093b..788ebe7ab 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -defStopWords(dataset:validmind.vm_models.VMDataset,min_percent_threshold:float=0.5,num_words:int=25): +defStopWords(dataset:validmind.vm_models.VMDataset,min_percent_threshold:float=0.5,num_words:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index c3c0abd4c..ded7099fc 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcreate_metrics_df(df,text_column,unwanted_tokens,lang): +defcreate_metrics_df(df,text_column,unwanted_tokens,lang): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defTextDescription(dataset:validmind.vm_models.VMDataset,unwanted_tokens:validmind.vm_models.set={'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str='english'): +defTextDescription(dataset:validmind.vm_models.VMDataset,unwanted_tokens:validmind.vm_models.set={'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str='english'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index bb34a9971..258c757cf 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defToxicity(dataset): +defToxicity(dataset): ::: diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index d29c3062d..a5ad8d242 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id=None): +defvalidate_prediction(y_true,y_pred,dataset_id=None): ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -defBertScore(dataset,model,evaluation_model='distilbert-base-uncased'): +defBertScore(dataset,model,evaluation_model='distilbert-base-uncased'): ::: diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 00abca1b9..eac059c9f 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id=None): +defvalidate_prediction(y_true,y_pred,dataset_id=None): ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -defBleuScore(dataset,model): +defBleuScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 59a65b7e8..551f33b9d 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterSizeDistribution(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): +defClusterSizeDistribution(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): ::: diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 05f8e00ec..8e5d508a9 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id=None): +defvalidate_prediction(y_true,y_pred,dataset_id=None): ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -defContextualRecall(dataset,model): +defContextualRecall(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 3e5f1779d..b6a6e766e 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defFeaturesAUC(dataset:validmind.vm_models.VMDataset,fontsize:int=12,figure_height:int=500): +defFeaturesAUC(dataset:validmind.vm_models.VMDataset,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 431440991..3f58f36ef 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id=None): +defvalidate_prediction(y_true,y_pred,dataset_id=None): ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -defMeteorScore(dataset,model): +defMeteorScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index def400815..93e336ef6 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_model_info(model): +defget_model_info(model): ::: @@ -28,7 +28,7 @@ Attempts to extract all model info from a model object instance ::: {.signature} -defModelMetadata(model): +defModelMetadata(model): ::: diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index 52513c487..e7969449b 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defModelPredictionResiduals(dataset,model,nbins=100,p_value_threshold=0.05,start_date=None,end_date=None): +defModelPredictionResiduals(dataset,model,nbins=100,p_value_threshold=0.05,start_date=None,end_date=None): ::: diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index f92a95093..bf8e41dca 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id=None): +defvalidate_prediction(y_true,y_pred,dataset_id=None): ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -defRegardScore(dataset,model): +defRegardScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 1a1021fe4..b80bdaa48 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defRegressionResidualsPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,bin_size:float=0.1): +defRegressionResidualsPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,bin_size:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index aad1f1d6e..4a82f7e14 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defRougeScore(dataset,model,metric='rouge-1'): +defRougeScore(dataset,model,metric='rouge-1'): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index a8a62ee79..3cdeb5609 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesPredictionWithCI(dataset,model,confidence=0.95): +defTimeSeriesPredictionWithCI(dataset,model,confidence=0.95): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index 7e4e27bcc..c5f83088e 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesPredictionsPlot(dataset,model): +defTimeSeriesPredictionsPlot(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 5e60257ee..f30adb86d 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesR2SquareBySegments(dataset,model,segments=None): +defTimeSeriesR2SquareBySegments(dataset,model,segments=None): ::: diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index d4026de41..ce49ce453 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTokenDisparity(dataset,model): +defTokenDisparity(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index a2f203c12..627646981 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defToxicityScore(dataset,model): +defToxicityScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index af601e4ca..3675bc33a 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAdjustedMutualInformation(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defAdjustedMutualInformation(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index ead349b3f..79d1b4d64 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAdjustedRandIndex(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defAdjustedRandIndex(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index d53ef077d..34f942f0a 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCalibrationCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_bins:int=10): +defCalibrationCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index 5c15ae5f1..87c0730a7 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClassifierPerformance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,average:str='macro'): +defClassifierPerformance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,average:str='macro'): ::: @@ -58,6 +58,6 @@ The test produces a report that includes precision, recall, F1-Score, and accura ::: {.signature} -defmulticlass_roc_auc_score(y_test,y_pred,average='macro'): +defmulticlass_roc_auc_score(y_test,y_pred,average='macro'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 6e68fa0cf..b3ae636ae 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClassifierThresholdOptimization(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,methods=None,target_recall=None): +defClassifierThresholdOptimization(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,methods=None,target_recall=None): ::: @@ -90,7 +90,7 @@ The test implements multiple threshold optimization methods: ::: {.signature} -deffind_optimal_threshold(y_true,y_prob,method='youden',target_recall=None): +deffind_optimal_threshold(y_true,y_prob,method='youden',target_recall=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index cf738d248..7ba281c06 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterCosineSimilarity(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defClusterCosineSimilarity(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 547dce141..48fc21b2a 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterPerformanceMetrics(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defClusterPerformanceMetrics(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 4f89f9c2f..83c7aaaac 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCompletenessScore(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defCompletenessScore(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index d3c3ba490..314993033 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defConfusionMatrix(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): +defConfusionMatrix(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index bc23a018b..bcf648006 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defFeatureImportance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,num_features:int=3): +defFeatureImportance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,num_features:int=3): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 1cbf25c63..b8b1044c2 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defFowlkesMallowsScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): +defFowlkesMallowsScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 512de547f..096ea583b 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHomogeneityScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): +defHomogeneityScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index b1ea40faa..59dbe7948 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcustom_recall(y_true,y_pred_proba,threshold=0.5): +defcustom_recall(y_true,y_pred_proba,threshold=0.5): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defHyperParametersTuning(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\]=None,thresholds:Union\[float, List\[float\]\]=None,fit_params:dict=None): +defHyperParametersTuning(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\]=None,thresholds:Union\[float, List\[float\]\]=None,fit_params:dict=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index e82819db0..e7fa1d666 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defKMeansClustersOptimization(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_clusters:Union\[List\[int\], None\]=None): +defKMeansClustersOptimization(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_clusters:Union\[List\[int\], None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 183788f08..6a2069ba6 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumAccuracy(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float=0.7): +defMinimumAccuracy(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float=0.7): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 1433ba260..cbd846254 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumF1Score(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float=0.5): +defMinimumF1Score(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index e09ff023f..d1fcfc6ce 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumROCAUCScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float=0.5): +defMinimumROCAUCScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index a372d15a9..9c11c96bd 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defModelParameters(model,model_params=None): +defModelParameters(model,model_params=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index b8602108e..d24f0abfc 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defmulticlass_roc_auc_score(y_test,y_pred,average='macro'): +defmulticlass_roc_auc_score(y_test,y_pred,average='macro'): ::: @@ -24,7 +24,7 @@ toc-expand: 4 ::: {.signature} -defModelsPerformanceComparison(dataset:validmind.vm_models.VMDataset,models:list\[validmind.vm_models.VMModel\]): +defModelsPerformanceComparison(dataset:validmind.vm_models.VMDataset,models:list\[validmind.vm_models.VMModel\]): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 3ed7f793b..caed53b8b 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defOverfitDiagnosis(model:validmind.vm_models.VMModel,datasets:List\[validmind.vm_models.VMDataset\],metric:str=None,cut_off_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): +defOverfitDiagnosis(model:validmind.vm_models.VMModel,datasets:List\[validmind.vm_models.VMDataset\],metric:str=None,cut_off_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 4bf377cf8..0792ed76c 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defPermutationFeatureImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,fontsize:Union\[int, None\]=None,figure_height:Union\[int, None\]=None): +defPermutationFeatureImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,fontsize:Union\[int, None\]=None,figure_height:Union\[int, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 3892abb8c..f9bfde8c4 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defcalculate_psi(score_initial,score_new,num_bins=10,mode='fixed'): +defcalculate_psi(score_initial,score_new,num_bins=10,mode='fixed'): ::: @@ -46,7 +46,7 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -defPopulationStabilityIndex(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,num_bins:int=10,mode:str='fixed'): +defPopulationStabilityIndex(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,num_bins:int=10,mode:str='fixed'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 3e1510c58..813dcbf9a 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defPrecisionRecallCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defPrecisionRecallCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 61cdf73c7..c190e9d13 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defROCCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defROCCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index c82073976..7d8044a2c 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defRegressionErrors(model,dataset): +defRegressionErrors(model,dataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 0be0fcf5b..deb586952 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionErrorsComparison(datasets,models): +defRegressionErrorsComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 02f8ca4c1..b463ac1dd 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionPerformance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defRegressionPerformance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 27c6d4e55..7dd1f328c 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -defRegressionR2Square(dataset,model): +defRegressionR2Square(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 854c9e87f..1676daa7e 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -defRegressionR2SquareComparison(datasets,models): +defRegressionR2SquareComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 3d0447646..435352516 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRobustnessDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,metric:str=None,scaling_factor_std_dev_list:List\[float\]={'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): +defRobustnessDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,metric:str=None,scaling_factor_std_dev_list:List\[float\]={'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index afd5c7c33..9fb3b6915 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defgenerate_shap_plot(type\_,shap_values,x_test): +defgenerate_shap_plot(type\_,shap_values,x_test): ::: @@ -54,7 +54,7 @@ Plots two types of SHAP global importance (SHAP). ::: {.signature} -defselect_shap_values(shap_values,class_of_interest): +defselect_shap_values(shap_values,class_of_interest): ::: @@ -85,7 +85,7 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -defSHAPGlobalImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): +defSHAPGlobalImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 6f23b38cc..5f5ec383b 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScoreProbabilityAlignment(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,score_column:str='score',n_bins:int=10): +defScoreProbabilityAlignment(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,score_column:str='score',n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 599b92dc9..db33271f8 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defSilhouettePlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defSilhouettePlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index f9e8c0048..d1db2ac08 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTrainingTestDegradation(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,max_threshold:float=0.1): +defTrainingTestDegradation(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,max_threshold:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index f038ffa96..5510577fa 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defVMeasure(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): +defVMeasure(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 4b3c1fd73..fcfc1e92f 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defWeakspotsDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,features_columns:Union\[List\[str\], None\]=None,metrics:Union\[Dict\[str, Callable\], None\]=None,thresholds:Union\[Dict\[str, float\], None\]=None): +defWeakspotsDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,features_columns:Union\[List\[str\], None\]=None,metrics:Union\[Dict\[str, Callable\], None\]=None,thresholds:Union\[Dict\[str, float\], None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 07017fac7..6a557d3f5 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoARIMA(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defAutoARIMA(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 10638c5ce..f54977e3c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCumulativePredictionProbabilities(dataset,model,title='Cumulative Probabilities'): +defCumulativePredictionProbabilities(dataset,model,title='Cumulative Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 7aff2de0a..3f3cd6df9 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defDurbinWatsonTest(dataset,model,threshold={'cls': 'ExprList', 'elements': ['1.5', '2.5']}): +defDurbinWatsonTest(dataset,model,threshold={'cls': 'ExprList', 'elements': ['1.5', '2.5']}): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index 94dd1da2d..ae9172cd4 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defGINITable(dataset,model): +defGINITable(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 1ff2c0f36..fc42668c3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defKolmogorovSmirnov(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,dist:str='norm'): +defKolmogorovSmirnov(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,dist:str='norm'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index dedcbcde6..a25ef98cf 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defLilliefors(dataset:validmind.vm_models.VMDataset): +defLilliefors(dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index fab0a69b2..4931f51d7 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defPredictionProbabilitiesHistogram(dataset,model,title='Histogram of Predictive Probabilities'): +defPredictionProbabilitiesHistogram(dataset,model,title='Histogram of Predictive Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 645a0759f..b006c9e14 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defRegressionCoeffs(model): +defRegressionCoeffs(model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 5a100acf1..37451407e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionFeatureSignificance(model:validmind.vm_models.VMModel,fontsize:int=10,p_threshold:float=0.05): +defRegressionFeatureSignificance(model:validmind.vm_models.VMModel,fontsize:int=10,p_threshold:float=0.05): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index cd7087381..13d636fe3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionModelForecastPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,start_date:Union\[str, None\]=None,end_date:Union\[str, None\]=None): +defRegressionModelForecastPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,start_date:Union\[str, None\]=None,end_date:Union\[str, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 7fbe7d63d..1a24d0f0e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defintegrate_diff(series_diff,start_value): +defintegrate_diff(series_diff,start_value): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defRegressionModelForecastPlotLevels(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defRegressionModelForecastPlotLevels(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index c97816a68..4bf0c73b3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defintegrate_diff(series_diff,start_value): +defintegrate_diff(series_diff,start_value): ::: @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionModelSensitivityPlot(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,shocks:List\[float\]={'cls': 'ExprList', 'elements': ['0.1']},transformation:Union\[str, None\]=None): +defRegressionModelSensitivityPlot(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,shocks:List\[float\]={'cls': 'ExprList', 'elements': ['0.1']},transformation:Union\[str, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 90dcf56ad..0a9d0e4a2 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -defRegressionModelSummary(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): +defRegressionModelSummary(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 683164554..01cb51db4 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionPermutationFeatureImportance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,fontsize:int=12,figure_height:int=500): +defRegressionPermutationFeatureImportance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index 215ae3660..8d4c0c684 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScorecardHistogram(dataset,title='Histogram of Scores',score_column='score'): +defScorecardHistogram(dataset,title='Histogram of Scores',score_column='score'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 5f3aa2bc3..d832a323c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 4d4fff93f..da1466d2f 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defBias(model,min_threshold=7): +defBias(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 4d56c58e4..367151a97 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defClarity(model,min_threshold=7): +defClarity(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index caff5d76d..2ddabb727 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defConciseness(model,min_threshold=7): +defConciseness(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 1af1f56df..37b38853c 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defDelimitation(model,min_threshold=7): +defDelimitation(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 395fc0773..ccc1cb9ab 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defNegativeInstruction(model,min_threshold=7): +defNegativeInstruction(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 09bf36d39..d80b08c6c 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -28,7 +28,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defRobustness(model,dataset,num_tests=10): +defRobustness(model,dataset,num_tests=10): ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index f0e1e50b0..bd92930c6 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defSpecificity(model,min_threshold=7): +defSpecificity(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index a736251ae..ab5e96565 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -30,7 +30,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -54,7 +54,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 063dbe57a..3a6ce7c1e 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defdescribe_metric(metric_id:str,\*\*kwargs): +defdescribe_metric(metric_id:str,\*\*kwargs): ::: @@ -30,7 +30,7 @@ Describe a metric ::: {.signature} -deflist_metrics(\*\*kwargs): +deflist_metrics(\*\*kwargs): ::: @@ -46,7 +46,7 @@ List all metrics ::: {.signature} -defrun_metric(metric_id:str,\*\*kwargs): +defrun_metric(metric_id:str,\*\*kwargs): ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 452b16635..152f4562b 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -92,7 +92,7 @@ Model attributes definition ::: {.signature} -deffrom_dict(cls,data): +deffrom_dict(cls,data): ::: @@ -126,7 +126,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -defget_default_config()dict +defget_default_config()dict: ::: @@ -146,7 +146,7 @@ Each test in a test suite can accept parameters and those parameters can have de ::: {.signature} -defget_tests()List\[str\] +defget_tests()List\[str\]: ::: @@ -160,7 +160,7 @@ Get all test suite test objects from all sections ::: {.signature} -defnum_tests()int +defnum_tests()int: ::: @@ -206,7 +206,7 @@ This method will be called after the test suite has been run and all results hav ::: {.signature} -defrun(send:bool=True,fail_fast:bool=False): +defrun(send:bool=True,fail_fast:bool=False): ::: @@ -225,7 +225,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -defsummarize(show_link:bool=True): +defsummarize(show_link:bool=True): ::: @@ -272,7 +272,7 @@ This way we can support multiple dataset types but under the hood we only need t ::: {.signature} -defadd_extra_column(column_name,column_values=None): +defadd_extra_column(column_name,column_values=None): ::: @@ -291,7 +291,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -defassign_predictions(model:validmind.vm_models.VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): +defassign_predictions(model:validmind.vm_models.VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): ::: @@ -315,7 +315,7 @@ Assign predictions and probabilities to the dataset. ::: {.signature} -defprediction_column(model:validmind.vm_models.VMModel,column_name:str=None)str +defprediction_column(model:validmind.vm_models.VMModel,column_name:str=None)str: ::: @@ -329,7 +329,7 @@ Get or set the prediction column for a model. ::: {.signature} -defprobability_column(model:validmind.vm_models.VMModel,column_name:str=None)str +defprobability_column(model:validmind.vm_models.VMModel,column_name:str=None)str: ::: @@ -357,7 +357,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMDataset +defwith_options(\*\*kwargs)validmind.vm_models.VMDataset: ::: @@ -394,7 +394,7 @@ Returns a dataframe containing only the feature columns ::: {.signature} -defy_df(){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +defy_df(){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: @@ -408,7 +408,7 @@ Returns a dataframe containing the target column ::: {.signature} -defy_pred(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]} +defy_pred(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: ::: @@ -432,7 +432,7 @@ Attempts to stack complex prediction types (e.g., embeddings) into a single, mul ::: {.signature} -defy_pred_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +defy_pred_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: @@ -446,7 +446,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -defy_prob(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]} +defy_prob(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: ::: @@ -468,7 +468,7 @@ Returns the probabilities for a given model. ::: {.signature} -defy_prob_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]} +defy_prob_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: @@ -500,7 +500,7 @@ Base class for ValidMind Input types ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMInput +defwith_options(\*\*kwargs)validmind.vm_models.VMInput: ::: @@ -549,7 +549,7 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -defpredict(args=(),\*\*kwargs): +defpredict(\*args,\*\*kwargs): ::: @@ -563,7 +563,7 @@ Predict method for the model. This is a wrapper around the model's ::: {.signature} -defpredict_proba(args=(),\*\*kwargs): +defpredict_proba(\*args,\*\*kwargs): ::: From 5515e2d978896de27722044b8d5fa557762934f5 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Tue, 11 Feb 2025 17:13:02 -0800 Subject: [PATCH 081/207] Save point --- docs/templates/macros/signatures.jinja2 | 2 +- docs/validmind/test_suites.qmd | 2 +- docs/validmind/tests.qmd | 6 +++--- docs/validmind/tests/data_validation/ACFandPACFPlot.qmd | 2 +- docs/validmind/tests/data_validation/ADF.qmd | 2 +- docs/validmind/tests/data_validation/AutoAR.qmd | 2 +- docs/validmind/tests/data_validation/AutoMA.qmd | 2 +- docs/validmind/tests/data_validation/AutoStationarity.qmd | 2 +- docs/validmind/tests/data_validation/ClassImbalance.qmd | 2 +- docs/validmind/tests/data_validation/DatasetDescription.qmd | 2 +- docs/validmind/tests/data_validation/DatasetSplit.qmd | 2 +- .../tests/data_validation/DescriptiveStatistics.qmd | 2 +- docs/validmind/tests/data_validation/DickeyFullerGLS.qmd | 2 +- docs/validmind/tests/data_validation/EngleGrangerCoint.qmd | 2 +- docs/validmind/tests/data_validation/HighCardinality.qmd | 2 +- .../tests/data_validation/HighPearsonCorrelation.qmd | 2 +- docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd | 2 +- docs/validmind/tests/data_validation/IQROutliersTable.qmd | 2 +- .../tests/data_validation/IsolationForestOutliers.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 2 +- .../tests/data_validation/LaggedCorrelationHeatmap.qmd | 2 +- docs/validmind/tests/data_validation/MissingValues.qmd | 2 +- .../tests/data_validation/MissingValuesBarPlot.qmd | 2 +- docs/validmind/tests/data_validation/MutualInformation.qmd | 2 +- docs/validmind/tests/data_validation/PhillipsPerronArch.qmd | 2 +- docs/validmind/tests/data_validation/RollingStatsPlot.qmd | 2 +- .../tests/data_validation/ScoreBandDefaultRates.qmd | 2 +- docs/validmind/tests/data_validation/SeasonalDecompose.qmd | 2 +- docs/validmind/tests/data_validation/SpreadPlot.qmd | 2 +- .../tests/data_validation/TabularCategoricalBarPlots.qmd | 2 +- .../tests/data_validation/TabularDateTimeHistograms.qmd | 2 +- .../tests/data_validation/TabularNumericalHistograms.qmd | 2 +- docs/validmind/tests/data_validation/TargetRateBarPlots.qmd | 2 +- .../validmind/tests/data_validation/TimeSeriesFrequency.qmd | 2 +- docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd | 2 +- .../tests/data_validation/TimeSeriesMissingValues.qmd | 2 +- docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd | 2 +- docs/validmind/tests/data_validation/TooManyZeroValues.qmd | 2 +- docs/validmind/tests/data_validation/UniqueRows.qmd | 2 +- docs/validmind/tests/data_validation/WOEBinPlots.qmd | 2 +- docs/validmind/tests/data_validation/WOEBinTable.qmd | 2 +- docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd | 2 +- docs/validmind/tests/data_validation/nlp/CommonWords.qmd | 2 +- docs/validmind/tests/data_validation/nlp/Hashtags.qmd | 2 +- docs/validmind/tests/data_validation/nlp/Mentions.qmd | 2 +- docs/validmind/tests/data_validation/nlp/StopWords.qmd | 2 +- .../validmind/tests/data_validation/nlp/TextDescription.qmd | 2 +- .../tests/model_validation/ClusterSizeDistribution.qmd | 2 +- docs/validmind/tests/model_validation/FeaturesAUC.qmd | 2 +- .../tests/model_validation/RegressionResidualsPlot.qmd | 2 +- .../model_validation/sklearn/AdjustedMutualInformation.qmd | 2 +- .../tests/model_validation/sklearn/AdjustedRandIndex.qmd | 2 +- .../tests/model_validation/sklearn/CalibrationCurve.qmd | 2 +- .../model_validation/sklearn/ClassifierPerformance.qmd | 2 +- .../sklearn/ClassifierThresholdOptimization.qmd | 2 +- .../model_validation/sklearn/ClusterCosineSimilarity.qmd | 2 +- .../model_validation/sklearn/ClusterPerformanceMetrics.qmd | 2 +- .../tests/model_validation/sklearn/CompletenessScore.qmd | 2 +- .../tests/model_validation/sklearn/ConfusionMatrix.qmd | 2 +- .../tests/model_validation/sklearn/FeatureImportance.qmd | 2 +- .../tests/model_validation/sklearn/FowlkesMallowsScore.qmd | 2 +- .../tests/model_validation/sklearn/HomogeneityScore.qmd | 2 +- .../model_validation/sklearn/HyperParametersTuning.qmd | 2 +- .../model_validation/sklearn/KMeansClustersOptimization.qmd | 2 +- .../tests/model_validation/sklearn/MinimumAccuracy.qmd | 2 +- .../tests/model_validation/sklearn/MinimumF1Score.qmd | 2 +- .../tests/model_validation/sklearn/MinimumROCAUCScore.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 2 +- .../tests/model_validation/sklearn/OverfitDiagnosis.qmd | 2 +- .../sklearn/PermutationFeatureImportance.qmd | 2 +- .../model_validation/sklearn/PopulationStabilityIndex.qmd | 2 +- .../tests/model_validation/sklearn/PrecisionRecallCurve.qmd | 2 +- docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd | 2 +- .../model_validation/sklearn/RegressionPerformance.qmd | 2 +- .../tests/model_validation/sklearn/RobustnessDiagnosis.qmd | 2 +- .../tests/model_validation/sklearn/SHAPGlobalImportance.qmd | 2 +- .../model_validation/sklearn/ScoreProbabilityAlignment.qmd | 2 +- .../tests/model_validation/sklearn/SilhouettePlot.qmd | 2 +- .../model_validation/sklearn/TrainingTestDegradation.qmd | 2 +- docs/validmind/tests/model_validation/sklearn/VMeasure.qmd | 2 +- .../tests/model_validation/sklearn/WeakspotsDiagnosis.qmd | 2 +- .../tests/model_validation/statsmodels/AutoARIMA.qmd | 2 +- .../model_validation/statsmodels/KolmogorovSmirnov.qmd | 2 +- .../tests/model_validation/statsmodels/Lilliefors.qmd | 2 +- .../statsmodels/RegressionFeatureSignificance.qmd | 2 +- .../statsmodels/RegressionModelForecastPlot.qmd | 2 +- .../statsmodels/RegressionModelForecastPlotLevels.qmd | 2 +- .../statsmodels/RegressionModelSensitivityPlot.qmd | 2 +- .../model_validation/statsmodels/RegressionModelSummary.qmd | 2 +- .../statsmodels/RegressionPermutationFeatureImportance.qmd | 2 +- docs/validmind/vm_models.qmd | 6 +++--- 91 files changed, 95 insertions(+), 95 deletions(-) diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index ac6a947b1..44920d8f8 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -30,7 +30,7 @@ {{ "**" if param.name == "kwargs" else "*" if param.kind == "variadic positional" else "" }}{{ param.name }} {%- endif -%} {%- if param.annotation -%} - :{{ format_type(param.annotation, add_links=true) }} + :{{ format_type(param.annotation, add_links=false) }} {%- endif -%} {%- if param.default is not none and param.name != "kwargs" and param.kind != "variadic positional" -%} = diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index ad35b6caa..363bfd47c 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -138,7 +138,7 @@ Returns a list of all available test suites ::: {.signature} -defregister_test_suite(suite_id:str,suite:validmind.vm_models.TestSuite): +defregister_test_suite(suite_id:str,suite:TestSuite): ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 23d0c5407..b5784c8d7 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -20,7 +20,7 @@ ValidMind Tests Module ::: {.signature} -defdescribe_test(test_id:validmind.vm_models.TestID=None,raw:bool=False,show:bool=True): +defdescribe_test(test_id:TestID=None,raw:bool=False,show:bool=True): ::: @@ -136,7 +136,7 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. ::: {.signature} -defrun_test(test_id:Union\[validmind.vm_models.TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[validmind.vm_models.TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[Callable\[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, None\], None\]=None,\*\*kwargs)validmind.vm_models.TestResult: +defrun_test(test_id:Union\[TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[Callable\[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, None\], None\]=None,\*\*kwargs)validmind.vm_models.TestResult: ::: @@ -256,7 +256,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -defregister_test_provider(namespace:str,test_provider:validmind.vm_models.TestProvider)None: +defregister_test_provider(namespace:str,test_provider:TestProvider)None: ::: diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 690848d98..7babb1fdb 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defACFandPACFPlot(dataset:validmind.vm_models.VMDataset): +defACFandPACFPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index e50cbbfdb..dc852e678 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defADF(dataset:validmind.vm_models.VMDataset): +defADF(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index b50489c50..095e941ec 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoAR(dataset:validmind.vm_models.VMDataset,max_ar_order:int=3): +defAutoAR(dataset:VMDataset,max_ar_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index 6d5db0689..9e5340bc2 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoMA(dataset:validmind.vm_models.VMDataset,max_ma_order:int=3): +defAutoMA(dataset:VMDataset,max_ma_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 9b99ec56e..e8c80db1d 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAutoStationarity(dataset:validmind.vm_models.VMDataset,max_order:int=5,threshold:float=0.05): +defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 96f0bc635..cf0a8c51b 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -defClassImbalance(dataset:validmind.vm_models.VMDataset,min_percent_threshold:int=10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\]: +defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\]: ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 9ccb50e80..cf23415ca 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defDatasetDescription(dataset:validmind.vm_models.VMDataset): +defDatasetDescription(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 1a24f0011..f1d06a8a5 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defDatasetSplit(datasets:List\[validmind.vm_models.VMDataset\]): +defDatasetSplit(datasets:List\[VMDataset\]): ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 613703219..55beb8f62 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -36,7 +36,7 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -defDescriptiveStatistics(dataset:validmind.vm_models.VMDataset): +defDescriptiveStatistics(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 50096ae3c..2e6608bcf 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defDickeyFullerGLS(dataset:validmind.vm_models.VMDataset): +defDickeyFullerGLS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 9d3f8aaa0..0059abd55 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defEngleGrangerCoint(dataset:validmind.vm_models.VMDataset,threshold:float=0.05): +defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 93376cc4e..a3304df17 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHighCardinality(dataset:validmind.vm_models.VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): +defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index ea4d800d7..4928ddb5d 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHighPearsonCorrelation(dataset:validmind.vm_models.VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): +defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index f2cab49e1..35e28daf7 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defIQROutliersBarPlot(dataset:validmind.vm_models.VMDataset,threshold:float=1.5,fig_width:int=800): +defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index f98d09a49..4493ed1c2 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defIQROutliersTable(dataset:validmind.vm_models.VMDataset,threshold:float=1.5): +defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index 0986a35df..de07489f7 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defIsolationForestOutliers(dataset:validmind.vm_models.VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): +defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 8853bdc28..e3a20b421 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defKPSS(dataset:validmind.vm_models.VMDataset): +defKPSS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index ff1e2153a..c36395305 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defLaggedCorrelationHeatmap(dataset:validmind.vm_models.VMDataset,num_lags:int=10): +defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 8571b24ff..d602dd961 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMissingValues(dataset:validmind.vm_models.VMDataset,min_threshold:int=1): +defMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 2c1951964..6e0ab2794 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMissingValuesBarPlot(dataset:validmind.vm_models.VMDataset,threshold:int=80,fig_height:int=600): +defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 173f6b240..fa38e2781 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMutualInformation(dataset:validmind.vm_models.VMDataset,min_threshold:float=0.01,task:str='classification'): +defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 480d7de54..d01a0269e 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defPhillipsPerronArch(dataset:validmind.vm_models.VMDataset): +defPhillipsPerronArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index c63fe5a27..6ff1a45e8 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defRollingStatsPlot(dataset:validmind.vm_models.VMDataset,window_size:int=12): +defRollingStatsPlot(dataset:VMDataset,window_size:int=12): ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index b8e32cba6..bd2525068 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScoreBandDefaultRates(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,score_column:str='score',score_bands:list=None): +defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 9072f30ff..a3e82e808 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defSeasonalDecompose(dataset:validmind.vm_models.VMDataset,seasonal_model:str='additive'): +defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 12452b431..b4f684106 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defSpreadPlot(dataset:validmind.vm_models.VMDataset): +defSpreadPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 9ca372681..2fd767803 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTabularCategoricalBarPlots(dataset:validmind.vm_models.VMDataset): +defTabularCategoricalBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index d42fc0d5f..fc9013724 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTabularDateTimeHistograms(dataset:validmind.vm_models.VMDataset): +defTabularDateTimeHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index eb886e4da..8db60f1fe 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTabularNumericalHistograms(dataset:validmind.vm_models.VMDataset): +defTabularNumericalHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 1e8f3d052..698633ff7 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTargetRateBarPlots(dataset:validmind.vm_models.VMDataset): +defTargetRateBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 0439b0811..d950ea74b 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesFrequency(dataset:validmind.vm_models.VMDataset): +defTimeSeriesFrequency(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 25f05a795..89c6f2c16 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesLinePlot(dataset:validmind.vm_models.VMDataset): +defTimeSeriesLinePlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index cae3dec04..0d37eb6b9 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesMissingValues(dataset:validmind.vm_models.VMDataset,min_threshold:int=1): +defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index b7064dd9b..414258dcc 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesOutliers(dataset:validmind.vm_models.VMDataset,zscore_threshold:int=3): +defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index b46d9202b..83315dc3d 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTooManyZeroValues(dataset:validmind.vm_models.VMDataset,max_percent_threshold:float=0.03): +defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 3d029a90d..0511a3102 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defUniqueRows(dataset:validmind.vm_models.VMDataset,min_percent_threshold:float=1): +defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index b76c115e4..6e2a7b519 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defWOEBinPlots(dataset:validmind.vm_models.VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): +defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index bc240f54a..7b18b39f4 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defWOEBinTable(dataset:validmind.vm_models.VMDataset,breaks_adj:list=None): +defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 234e731d7..495b502e9 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defZivotAndrewsArch(dataset:validmind.vm_models.VMDataset): +defZivotAndrewsArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index f354650ef..7f1815bfc 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCommonWords(dataset:validmind.vm_models.VMDataset): +defCommonWords(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 58053e00d..fe3cb507c 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHashtags(dataset:validmind.vm_models.VMDataset,top_hashtags:int=25): +defHashtags(dataset:VMDataset,top_hashtags:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index dd9244935..177d03281 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMentions(dataset:validmind.vm_models.VMDataset,top_mentions:int=25): +defMentions(dataset:VMDataset,top_mentions:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index 788ebe7ab..4ace17ddb 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -defStopWords(dataset:validmind.vm_models.VMDataset,min_percent_threshold:float=0.5,num_words:int=25): +defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index ded7099fc..f3c56c8a4 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defTextDescription(dataset:validmind.vm_models.VMDataset,unwanted_tokens:validmind.vm_models.set={'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str='english'): +defTextDescription(dataset:VMDataset,unwanted_tokens:set={'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str='english'): ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 551f33b9d..a64587235 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterSizeDistribution(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): +defClusterSizeDistribution(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index b6a6e766e..943cc87bb 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defFeaturesAUC(dataset:validmind.vm_models.VMDataset,fontsize:int=12,figure_height:int=500): +defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index b80bdaa48..2dbd893bd 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defRegressionResidualsPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,bin_size:float=0.1): +defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 3675bc33a..d607d18ad 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAdjustedMutualInformation(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 79d1b4d64..b71e174b3 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAdjustedRandIndex(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defAdjustedRandIndex(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 34f942f0a..aa9b73d81 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCalibrationCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_bins:int=10): +defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index 87c0730a7..689d54aa3 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClassifierPerformance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,average:str='macro'): +defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index b3ae636ae..735cd0609 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClassifierThresholdOptimization(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,methods=None,target_recall=None): +defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 7ba281c06..f2128f249 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterCosineSimilarity(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 48fc21b2a..2db4f79f6 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterPerformanceMetrics(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 83c7aaaac..4f52240b1 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCompletenessScore(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defCompletenessScore(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 314993033..d6c6ee008 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defConfusionMatrix(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): +defConfusionMatrix(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index bcf648006..12f25da9d 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defFeatureImportance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,num_features:int=3): +defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index b8b1044c2..11051be5c 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defFowlkesMallowsScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): +defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 096ea583b..50c3bf33b 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHomogeneityScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): +defHomogeneityScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 59dbe7948..188e5ca20 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defHyperParametersTuning(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\]=None,thresholds:Union\[float, List\[float\]\]=None,fit_params:dict=None): +defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\]=None,thresholds:Union\[float, List\[float\]\]=None,fit_params:dict=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index e7fa1d666..4ab31817e 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defKMeansClustersOptimization(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,n_clusters:Union\[List\[int\], None\]=None): +defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union\[List\[int\], None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 6a2069ba6..8ff07afe6 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumAccuracy(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float=0.7): +defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index cbd846254..261b210e3 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumF1Score(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float=0.5): +defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index d1fcfc6ce..169a022a1 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumROCAUCScore(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,min_threshold:float=0.5): +defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index d24f0abfc..28a454055 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -24,7 +24,7 @@ toc-expand: 4 ::: {.signature} -defModelsPerformanceComparison(dataset:validmind.vm_models.VMDataset,models:list\[validmind.vm_models.VMModel\]): +defModelsPerformanceComparison(dataset:VMDataset,models:list\[VMModel\]): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index caed53b8b..b22216610 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defOverfitDiagnosis(model:validmind.vm_models.VMModel,datasets:List\[validmind.vm_models.VMDataset\],metric:str=None,cut_off_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): +defOverfitDiagnosis(model:VMModel,datasets:List\[VMDataset\],metric:str=None,cut_off_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 0792ed76c..d621f0f38 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defPermutationFeatureImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,fontsize:Union\[int, None\]=None,figure_height:Union\[int, None\]=None): +defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union\[int, None\]=None,figure_height:Union\[int, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index f9bfde8c4..3aced64bf 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -46,7 +46,7 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -defPopulationStabilityIndex(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,num_bins:int=10,mode:str='fixed'): +defPopulationStabilityIndex(datasets:List\[VMDataset\],model:VMModel,num_bins:int=10,mode:str='fixed'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 813dcbf9a..8d3531cbf 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defPrecisionRecallCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index c190e9d13..4fd62fc08 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defROCCurve(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defROCCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index b463ac1dd..fe9a32a78 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionPerformance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defRegressionPerformance(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 435352516..79cb0a1b4 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRobustnessDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,metric:str=None,scaling_factor_std_dev_list:List\[float\]={'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): +defRobustnessDiagnosis(datasets:List\[VMDataset\],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List\[float\]={'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 9fb3b6915..8fe221701 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -85,7 +85,7 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -defSHAPGlobalImportance(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): +defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 5f5ec383b..78d656620 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScoreProbabilityAlignment(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,score_column:str='score',n_bins:int=10): +defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index db33271f8..f88ba1098 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defSilhouettePlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defSilhouettePlot(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index d1db2ac08..5322f9b44 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTrainingTestDegradation(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,max_threshold:float=0.1): +defTrainingTestDegradation(datasets:List\[VMDataset\],model:VMModel,max_threshold:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 5510577fa..b89ba4915 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defVMeasure(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): +defVMeasure(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index fcfc1e92f..41a6cc7a2 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defWeakspotsDiagnosis(datasets:List\[validmind.vm_models.VMDataset\],model:validmind.vm_models.VMModel,features_columns:Union\[List\[str\], None\]=None,metrics:Union\[Dict\[str, Callable\], None\]=None,thresholds:Union\[Dict\[str, float\], None\]=None): +defWeakspotsDiagnosis(datasets:List\[VMDataset\],model:VMModel,features_columns:Union\[List\[str\], None\]=None,metrics:Union\[Dict\[str, Callable\], None\]=None,thresholds:Union\[Dict\[str, float\], None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 6a557d3f5..a95cf81aa 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoARIMA(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defAutoARIMA(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index fc42668c3..92ea234f1 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defKolmogorovSmirnov(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,dist:str='norm'): +defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index a25ef98cf..cfdfa4af0 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defLilliefors(dataset:validmind.vm_models.VMDataset): +defLilliefors(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 37451407e..284dba262 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionFeatureSignificance(model:validmind.vm_models.VMModel,fontsize:int=10,p_threshold:float=0.05): +defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 13d636fe3..d87d56e72 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionModelForecastPlot(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset,start_date:Union\[str, None\]=None,end_date:Union\[str, None\]=None): +defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union\[str, None\]=None,end_date:Union\[str, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 1a24d0f0e..268cc0012 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defRegressionModelForecastPlotLevels(model:validmind.vm_models.VMModel,dataset:validmind.vm_models.VMDataset): +defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 4bf0c73b3..dd1ac9a35 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionModelSensitivityPlot(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,shocks:List\[float\]={'cls': 'ExprList', 'elements': ['0.1']},transformation:Union\[str, None\]=None): +defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List\[float\]={'cls': 'ExprList', 'elements': ['0.1']},transformation:Union\[str, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 0a9d0e4a2..cbf22a5b8 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -defRegressionModelSummary(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel): +defRegressionModelSummary(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 01cb51db4..9c71a3761 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionPermutationFeatureImportance(dataset:validmind.vm_models.VMDataset,model:validmind.vm_models.VMModel,fontsize:int=12,figure_height:int=500): +defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 152f4562b..658913602 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -291,7 +291,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -defassign_predictions(model:validmind.vm_models.VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): +defassign_predictions(model:VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): ::: @@ -315,7 +315,7 @@ Assign predictions and probabilities to the dataset. ::: {.signature} -defprediction_column(model:validmind.vm_models.VMModel,column_name:str=None)str: +defprediction_column(model:VMModel,column_name:str=None)str: ::: @@ -329,7 +329,7 @@ Get or set the prediction column for a model. ::: {.signature} -defprobability_column(model:validmind.vm_models.VMModel,column_name:str=None)str: +defprobability_column(model:VMModel,column_name:str=None)str: ::: From b1730a436a53214a713e6aad0176a88723152ac9 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 12 Feb 2025 08:34:36 -0800 Subject: [PATCH 082/207] Fix single line vs multiline signatures regression --- docs/templates/macros/signatures.jinja2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index 44920d8f8..c9cc9ee14 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -23,7 +23,7 @@ {%- endif -%} {%- endfor -%} {%- for param in params -%} - + {%- if param.name == "self" -%} self {%- else -%} From 300dd812dac2ceb0aa98e503425e55a66db8c2a4 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 12 Feb 2025 09:48:23 -0800 Subject: [PATCH 083/207] Reapply fix for ExprList --- docs/templates/macros/types.jinja2 | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index 96d63bc3c..28312c3be 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -44,6 +44,11 @@ {%- else -%} {{ type.name }} {%- endif -%} + {%- elif type.cls == "ExprList" -%} + {%- for elem in type.elements -%} + {{ format_type(elem, module, add_links) }} + {%- if not loop.last -%}, {%- endif -%} + {%- endfor -%} {%- elif type.cls == "ExprTuple" -%} {%- for elem in type.elements -%} {{ format_type(elem, module, add_links) }} From 8ad52bcea03a6c4fce6bb4966faf049ba6d3d6e1 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 12 Feb 2025 10:07:33 -0800 Subject: [PATCH 084/207] Save point --- docs/validmind.qmd | 16 +++++----- .../classification/customer_churn.qmd | 6 ++-- .../datasets/classification/taiwan_credit.qmd | 6 ++-- .../datasets/credit_risk/lending_club.qmd | 12 ++++---- .../credit_risk/lending_club_bias.qmd | 2 +- docs/validmind/datasets/nlp/cnn_dailymail.qmd | 4 +-- docs/validmind/datasets/regression/fred.qmd | 4 +-- .../datasets/regression/lending_club.qmd | 4 +-- docs/validmind/errors.qmd | 12 ++++---- docs/validmind/test_suites.qmd | 6 ++-- docs/validmind/tests.qmd | 14 ++++----- docs/validmind/tests/data_validation/ADF.qmd | 2 +- .../tests/data_validation/AutoAR.qmd | 4 +-- .../tests/data_validation/AutoMA.qmd | 4 +-- .../data_validation/AutoStationarity.qmd | 2 +- .../ChiSquaredFeaturesTable.qmd | 2 +- .../tests/data_validation/ClassImbalance.qmd | 2 +- .../data_validation/DatasetDescription.qmd | 8 ++--- .../data_validation/DescriptiveStatistics.qmd | 4 +-- .../tests/data_validation/DickeyFullerGLS.qmd | 2 +- .../tests/data_validation/Duplicates.qmd | 2 +- .../data_validation/EngleGrangerCoint.qmd | 2 +- .../FeatureTargetCorrelationPlot.qmd | 2 +- .../tests/data_validation/HighCardinality.qmd | 2 +- .../HighPearsonCorrelation.qmd | 2 +- .../data_validation/IQROutliersBarPlot.qmd | 4 +-- .../data_validation/IQROutliersTable.qmd | 4 +-- .../IsolationForestOutliers.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 2 +- .../LaggedCorrelationHeatmap.qmd | 2 +- .../tests/data_validation/MissingValues.qmd | 2 +- .../data_validation/MissingValuesBarPlot.qmd | 2 +- .../data_validation/MutualInformation.qmd | 2 +- .../data_validation/PhillipsPerronArch.qmd | 2 +- .../ProtectedClassesCombination.qmd | 4 +-- .../ProtectedClassesDescription.qmd | 4 +-- .../ProtectedClassesDisparity.qmd | 4 +-- .../ProtectedClassesThresholdOptimizer.qmd | 12 ++++---- .../data_validation/RollingStatsPlot.qmd | 4 +-- .../data_validation/ScoreBandDefaultRates.qmd | 2 +- .../data_validation/SeasonalDecompose.qmd | 4 +-- .../tests/data_validation/Skewness.qmd | 2 +- .../TabularDescriptionTables.qmd | 6 ++-- .../data_validation/TimeSeriesHistogram.qmd | 4 +-- .../TimeSeriesMissingValues.qmd | 2 +- .../data_validation/TimeSeriesOutliers.qmd | 2 +- .../data_validation/TooManyZeroValues.qmd | 2 +- .../tests/data_validation/UniqueRows.qmd | 2 +- .../tests/data_validation/WOEBinPlots.qmd | 4 +-- .../tests/data_validation/WOEBinTable.qmd | 2 +- .../data_validation/ZivotAndrewsArch.qmd | 2 +- .../tests/data_validation/nlp/Hashtags.qmd | 2 +- .../tests/data_validation/nlp/Mentions.qmd | 2 +- .../nlp/PolarityAndSubjectivity.qmd | 2 +- .../data_validation/nlp/Punctuations.qmd | 2 +- .../tests/data_validation/nlp/StopWords.qmd | 2 +- .../data_validation/nlp/TextDescription.qmd | 4 +-- .../tests/model_validation/BertScore.qmd | 4 +-- .../tests/model_validation/BleuScore.qmd | 4 +-- .../ClusterSizeDistribution.qmd | 2 +- .../model_validation/ContextualRecall.qmd | 4 +-- .../tests/model_validation/FeaturesAUC.qmd | 4 +-- .../tests/model_validation/MeteorScore.qmd | 4 +-- .../ModelPredictionResiduals.qmd | 2 +- .../tests/model_validation/RegardScore.qmd | 4 +-- .../RegressionResidualsPlot.qmd | 2 +- .../tests/model_validation/RougeScore.qmd | 2 +- .../TimeSeriesPredictionWithCI.qmd | 2 +- .../TimeSeriesPredictionsPlot.qmd | 2 +- .../TimeSeriesR2SquareBySegments.qmd | 2 +- .../tests/model_validation/TokenDisparity.qmd | 2 +- .../tests/model_validation/ToxicityScore.qmd | 2 +- .../sklearn/AdjustedMutualInformation.qmd | 2 +- .../sklearn/AdjustedRandIndex.qmd | 2 +- .../sklearn/CalibrationCurve.qmd | 2 +- .../sklearn/ClassifierPerformance.qmd | 4 +-- .../ClassifierThresholdOptimization.qmd | 4 +-- .../sklearn/ClusterCosineSimilarity.qmd | 2 +- .../sklearn/ClusterPerformanceMetrics.qmd | 2 +- .../sklearn/CompletenessScore.qmd | 2 +- .../sklearn/ConfusionMatrix.qmd | 2 +- .../sklearn/FeatureImportance.qmd | 2 +- .../sklearn/FowlkesMallowsScore.qmd | 2 +- .../sklearn/HomogeneityScore.qmd | 2 +- .../sklearn/HyperParametersTuning.qmd | 4 +-- .../sklearn/KMeansClustersOptimization.qmd | 2 +- .../sklearn/MinimumAccuracy.qmd | 2 +- .../sklearn/MinimumF1Score.qmd | 2 +- .../sklearn/MinimumROCAUCScore.qmd | 2 +- .../sklearn/ModelParameters.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 4 +-- .../sklearn/OverfitDiagnosis.qmd | 4 +-- .../sklearn/PermutationFeatureImportance.qmd | 4 +-- .../sklearn/PopulationStabilityIndex.qmd | 6 ++-- .../sklearn/PrecisionRecallCurve.qmd | 2 +- .../model_validation/sklearn/ROCCurve.qmd | 2 +- .../sklearn/RegressionErrors.qmd | 2 +- .../sklearn/RegressionErrorsComparison.qmd | 4 +-- .../sklearn/RegressionPerformance.qmd | 4 +-- .../sklearn/RegressionR2Square.qmd | 4 +-- .../sklearn/RegressionR2SquareComparison.qmd | 4 +-- .../sklearn/RobustnessDiagnosis.qmd | 4 +-- .../sklearn/SHAPGlobalImportance.qmd | 8 ++--- .../sklearn/ScoreProbabilityAlignment.qmd | 2 +- .../sklearn/SilhouettePlot.qmd | 2 +- .../sklearn/TrainingTestDegradation.qmd | 2 +- .../model_validation/sklearn/VMeasure.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 2 +- .../statsmodels/AutoARIMA.qmd | 4 +-- .../CumulativePredictionProbabilities.qmd | 2 +- .../statsmodels/DurbinWatsonTest.qmd | 2 +- .../statsmodels/GINITable.qmd | 2 +- .../statsmodels/KolmogorovSmirnov.qmd | 2 +- .../PredictionProbabilitiesHistogram.qmd | 2 +- .../RegressionFeatureSignificance.qmd | 4 +-- .../RegressionModelForecastPlot.qmd | 4 +-- .../RegressionModelForecastPlotLevels.qmd | 4 +-- .../RegressionModelSensitivityPlot.qmd | 6 ++-- .../statsmodels/RegressionModelSummary.qmd | 4 +-- ...RegressionPermutationFeatureImportance.qmd | 4 +-- .../statsmodels/ScorecardHistogram.qmd | 2 +- .../statsmodels/statsutils.qmd | 2 +- .../tests/prompt_validation/Bias.qmd | 4 +-- .../tests/prompt_validation/Clarity.qmd | 4 +-- .../tests/prompt_validation/Conciseness.qmd | 4 +-- .../tests/prompt_validation/Delimitation.qmd | 4 +-- .../prompt_validation/NegativeInstruction.qmd | 4 +-- .../tests/prompt_validation/Robustness.qmd | 4 +-- .../tests/prompt_validation/Specificity.qmd | 4 +-- .../prompt_validation/ai_powered_test.qmd | 2 +- docs/validmind/unit_metrics.qmd | 4 +-- docs/validmind/vm_models.qmd | 30 +++++++++---------- 132 files changed, 239 insertions(+), 239 deletions(-) diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 01810fc65..90a4eb7ca 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -55,7 +55,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -defget_test_suite(test_suite_id:str=None,section:str=None,\*args,\*\*kwargs)validmind.vm_models.TestSuite: +defget_test_suite(test_suite_id:str=None,section:str=None,\*args,\*\*kwargs)validmind.vm_models.TestSuite: ::: @@ -78,7 +78,7 @@ This function provides an interface to retrieve the TestSuite instance for the c ::: {.signature} -definit(project:Optional\[str\]=None,api_key:Optional\[str\]=None,api_secret:Optional\[str\]=None,api_host:Optional\[str\]=None,model:Optional\[str\]=None,monitoring:bool=False,generate_descriptions:Optional\[bool\]=None): +definit(project:Optional\[str\]=None,api_key:Optional\[str\]=None,api_secret:Optional\[str\]=None,api_host:Optional\[str\]=None,model:Optional\[str\]=None,monitoring:bool=False,generate_descriptions:Optional\[bool\]=None): ::: @@ -108,7 +108,7 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True)validmind.vm_models.VMDataset: +definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True)validmind.vm_models.VMDataset: ::: @@ -149,7 +149,7 @@ The following dataset types are supported: ::: {.signature} -definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs)validmind.vm_models.VMModel: +definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs)validmind.vm_models.VMModel: ::: @@ -179,7 +179,7 @@ Initializes a VM Model, which can then be passed to other functions that can per ::: {.signature} -definit_r_model(model_path:str,input_id:str='model')validmind.vm_models.VMModel: +definit_r_model(model_path:str,input_id:str='model')validmind.vm_models.VMModel: ::: @@ -211,7 +211,7 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ::: {.signature} -deflog_metric(key:str,value:float,inputs:Optional\[List\[str\]\]=None,params:Optional\[Dict\[str, Any\]\]=None,recorded_at:Optional\[str\]=None,thresholds:Optional\[Dict\[str, Any\]\]=None): +deflog_metric(key:str,value:float,inputs:Optional\[List\[str\]\]=None,params:Optional\[Dict\[str, Any\]\]=None,recorded_at:Optional\[str\]=None,thresholds:Optional\[Dict\[str, Any\]\]=None): ::: @@ -286,7 +286,7 @@ Reconnect to the ValidMind API and reload the project configuration ::: {.signature} -defrun_documentation_tests(section=None,send=True,fail_fast=False,inputs=None,config=None,\*\*kwargs): +defrun_documentation_tests(section=None,send=True,fail_fast=False,inputs=None,config=None,\*\*kwargs): ::: @@ -319,7 +319,7 @@ This function will analyze the current project's documentation template and coll ::: {.signature} -defrun_test_suite(test_suite_id,send=True,fail_fast=False,config=None,inputs=None,\*\*kwargs): +defrun_test_suite(test_suite_id,send=True,fail_fast=False,config=None,inputs=None,\*\*kwargs): ::: diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index 7d83043dd..79d3ae119 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defsimple_preprocess_booleans(df,columns): +defsimple_preprocess_booleans(df,columns): ::: @@ -35,7 +35,7 @@ Preprocess boolean columns. ::: {.signature} -defsimple_preprocess_categoricals(df,columns): +defsimple_preprocess_categoricals(df,columns): ::: @@ -58,7 +58,7 @@ Preprocess categorical columns. ::: {.signature} -defsimple_preprocess_numericals(df,columns): +defsimple_preprocess_numericals(df,columns): ::: diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index 581e26dea..afb9a12f7 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defsimple_preprocess_booleans(df,columns): +defsimple_preprocess_booleans(df,columns): ::: @@ -35,7 +35,7 @@ Preprocess boolean columns. ::: {.signature} -defsimple_preprocess_categoricals(df,columns): +defsimple_preprocess_categoricals(df,columns): ::: @@ -58,7 +58,7 @@ Preprocess categorical columns. ::: {.signature} -defsimple_preprocess_numericals(df,columns): +defsimple_preprocess_numericals(df,columns): ::: diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index e663d7e5d..e8a938ce2 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -deffeature_engineering(df,verbose=True): +deffeature_engineering(df,verbose=True): ::: @@ -38,7 +38,7 @@ toc-expand: 4 ::: {.signature} -defget_demo_test_config(x_test=None,y_test=None): +defget_demo_test_config(x_test=None,y_test=None): ::: @@ -75,7 +75,7 @@ Get demo test configuration. ::: {.signature} -defload_data(source='online',verbose=True): +defload_data(source='online',verbose=True): ::: @@ -123,7 +123,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -defpreprocess(df,verbose=True): +defpreprocess(df,verbose=True): ::: @@ -135,7 +135,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -defsplit(df,validation_size=None,test_size=0.2,add_constant=False,verbose=True): +defsplit(df,validation_size=None,test_size=0.2,add_constant=False,verbose=True): ::: @@ -162,6 +162,6 @@ Split dataset into train, validation (optional), and test sets. ::: {.signature} -defwoe_encoding(df,verbose=True): +defwoe_encoding(df,verbose=True): ::: diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 04f692e65..482b3937b 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -56,6 +56,6 @@ Load data from the specified CSV file. ::: {.signature} -defsplit(df,test_size=0.3): +defsplit(df,test_size=0.3): ::: diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index 7750053cc..2f9937472 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defdisplay_nice(df,num_rows=None): +defdisplay_nice(df,num_rows=None): ::: @@ -30,7 +30,7 @@ Primary function to format and display a DataFrame. ::: {.signature} -defload_data(source='online',dataset_size=None): +defload_data(source='online',dataset_size=None): ::: diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index 2a82b0a51..c7633430a 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -86,7 +86,7 @@ toc-expand: 4 ::: {.signature} -defpreprocess(df,split_option='train_test_val',train_size=0.6,test_size=0.2): +defpreprocess(df,split_option='train_test_val',train_size=0.6,test_size=0.2): ::: @@ -113,6 +113,6 @@ Split a time series DataFrame into train, validation, and test sets. ::: {.signature} -deftransform(df,transform_func='diff'): +deftransform(df,transform_func='diff'): ::: diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 11abd25d7..3d35ecd0f 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defpreprocess(df,split_option='train_test_val',train_size=0.6,test_size=0.2): +defpreprocess(df,split_option='train_test_val',train_size=0.6,test_size=0.2): ::: @@ -53,6 +53,6 @@ Split a time series DataFrame into train, validation, and test sets. ::: {.signature} -deftransform(df,transform_func='diff'): +deftransform(df,transform_func='diff'): ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index fb041b696..c31a20f51 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -58,7 +58,7 @@ Generic error for API request errors that are not known. ::: {.signature} -defdescription(\*args,\*\*kwargs): +defdescription(\*args,\*\*kwargs): ::: @@ -127,7 +127,7 @@ When the test suite was found but could not be initialized. ::: {.signature} -defdescription(\*args,\*\*kwargs): +defdescription(\*args,\*\*kwargs): ::: @@ -217,7 +217,7 @@ When an invalid metric results object is sent to the API. ::: {.signature} -defdescription(\*args,\*\*kwargs): +defdescription(\*args,\*\*kwargs): ::: @@ -412,7 +412,7 @@ When the class labels found in the dataset don't match the provided target label ::: {.signature} -defdescription(\*args,\*\*kwargs): +defdescription(\*args,\*\*kwargs): ::: @@ -523,7 +523,7 @@ When the client config is missing the documentation template. ::: {.signature} -defdescription(\*args,\*\*kwargs): +defdescription(\*args,\*\*kwargs): ::: @@ -598,7 +598,7 @@ When the R extras have not been installed. ::: {.signature} -defdescription(\*args,\*\*kwargs): +defdescription(\*args,\*\*kwargs): ::: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 363bfd47c..6dec57923 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -43,7 +43,7 @@ Format a pandas DataFrame for display purposes ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -81,7 +81,7 @@ Convert a test ID to a human-readable name. ::: {.signature} -defdescribe_suite(test_suite_id:str,verbose=False): +defdescribe_suite(test_suite_id:str,verbose=False): ::: @@ -138,7 +138,7 @@ Returns a list of all available test suites ::: {.signature} -defregister_test_suite(suite_id:str,suite:TestSuite): +defregister_test_suite(suite_id:str,suite:TestSuite): ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index b5784c8d7..9ba67933e 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -20,7 +20,7 @@ ValidMind Tests Module ::: {.signature} -defdescribe_test(test_id:TestID=None,raw:bool=False,show:bool=True): +defdescribe_test(test_id:TestID=None,raw:bool=False,show:bool=True): ::: @@ -89,7 +89,7 @@ all tags for a task type in one row. ::: {.signature} -deflist_tests(filter=None,task=None,tags=None,pretty=True,truncate=True): +deflist_tests(filter=None,task=None,tags=None,pretty=True,truncate=True): ::: @@ -115,7 +115,7 @@ List all tests in the tests directory. ::: {.signature} -defload_test(test_id:str,test_func:callable=None,reload:bool=False): +defload_test(test_id:str,test_func:callable=None,reload:bool=False): ::: @@ -136,7 +136,7 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. ::: {.signature} -defrun_test(test_id:Union\[TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[Callable\[{'cls': 'ExprList', 'elements': [{'cls': 'ExprName', 'name': 'TestResult'}]}, None\], None\]=None,\*\*kwargs)validmind.vm_models.TestResult: +defrun_test(test_id:Union\[TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[Callable\[TestResult, None\], None\]=None,\*\*kwargs)validmind.vm_models.TestResult: ::: @@ -256,7 +256,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -defregister_test_provider(namespace:str,test_provider:TestProvider)None: +defregister_test_provider(namespace:str,test_provider:TestProvider)None: ::: @@ -357,7 +357,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str): +defload_test(test_id:str): ::: @@ -420,7 +420,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str)callable: +defload_test(test_id:str)callable: ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index dc852e678..9e187571c 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 095e941ec..645451cbb 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoAR(dataset:VMDataset,max_ar_order:int=3): +defAutoAR(dataset:VMDataset,max_ar_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index 9e5340bc2..9efe85776 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoMA(dataset:VMDataset,max_ma_order:int=3): +defAutoMA(dataset:VMDataset,max_ma_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index e8c80db1d..a918f4567 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): +defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 20f4abb0d..39a2a0418 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defChiSquaredFeaturesTable(dataset,p_threshold=0.05): +defChiSquaredFeaturesTable(dataset,p_threshold=0.05): ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index cf0a8c51b..32ab57f2b 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\]: +defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\]: ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index cf23415ca..527273846 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -74,7 +74,7 @@ The DatasetDescription class accomplishes the purpose as follows: firstly, the t ::: {.signature} -defdescribe_column(df,column): +defdescribe_column(df,column): ::: @@ -90,7 +90,7 @@ Gets descriptive statistics for a single column in a Pandas DataFrame. ::: {.signature} -defget_column_histograms(df,column,type\_): +defget_column_histograms(df,column,type\_): ::: @@ -110,7 +110,7 @@ Will be used in favor of \_get_histogram in the future ::: {.signature} -defget_numerical_histograms(df,column): +defget_numerical_histograms(df,column): ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 55beb8f62..4c08828ad 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -80,7 +80,7 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des ::: {.signature} -defget_summary_statistics_categorical(df,categorical_fields): +defget_summary_statistics_categorical(df,categorical_fields): ::: @@ -92,7 +92,7 @@ The testing mechanism utilizes two in-built functions of pandas dataframes: `des ::: {.signature} -defget_summary_statistics_numerical(df,numerical_fields): +defget_summary_statistics_numerical(df,numerical_fields): ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 2e6608bcf..b7602b4f7 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 159fcb044..fc3fd0159 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defDuplicates(dataset,min_threshold=1): +defDuplicates(dataset,min_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 0059abd55..7f2f08373 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): +defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index f3b7e1d73..7895fd0da 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defFeatureTargetCorrelationPlot(dataset,fig_height=600): +defFeatureTargetCorrelationPlot(dataset,fig_height=600): ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index a3304df17..4e6bb9551 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): +defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 4928ddb5d..6b7b613ec 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): +defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 35e28daf7..2f7c3bdd0 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcompute_outliers(series,threshold): +defcompute_outliers(series,threshold): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): +defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 4493ed1c2..a167fa0a7 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcompute_outliers(series,threshold=1.5): +defcompute_outliers(series,threshold=1.5): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): +defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index de07489f7..c6e6f2dba 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): +defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index e3a20b421..9fe999ffe 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index c36395305..34c228c62 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): +defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index d602dd961..2d918cadd 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMissingValues(dataset:VMDataset,min_threshold:int=1): +defMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 6e0ab2794..fb9089c87 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): +defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index fa38e2781..8a3401718 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): +defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index d01a0269e..747c04cea 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 0f3afd105..aa529f75f 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defProtectedClassesCombination(dataset,model,protected_classes=None): +defProtectedClassesCombination(dataset,model,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index fb4cc51b5..968322bfd 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defProtectedClassesDescription(dataset,protected_classes=None): +defProtectedClassesDescription(dataset,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index c58d155c1..95986bd17 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics={'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}): +defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics={'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index d91ebf2ec..24d6a4353 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defcalculate_fairness_metrics(test_df,target,y_pred_opt,protected_classes): +defcalculate_fairness_metrics(test_df,target,y_pred_opt,protected_classes): ::: @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -defcalculate_group_metrics(test_df,target,y_pred_opt,protected_classes): +defcalculate_group_metrics(test_df,target,y_pred_opt,protected_classes): ::: @@ -64,7 +64,7 @@ Get a logger for the given module name ::: {.signature} -definitialize_and_fit_optimizer(pipeline,X_train,y_train,protected_classes_df): +definitialize_and_fit_optimizer(pipeline,X_train,y_train,protected_classes_df): ::: @@ -76,7 +76,7 @@ Get a logger for the given module name ::: {.signature} -defmake_predictions(threshold_optimizer,test_df,protected_classes): +defmake_predictions(threshold_optimizer,test_df,protected_classes): ::: @@ -100,7 +100,7 @@ Get a logger for the given module name ::: {.signature} -defProtectedClassesThresholdOptimizer(dataset,pipeline=None,protected_classes=None,X_train=None,y_train=None): +defProtectedClassesThresholdOptimizer(dataset,pipeline=None,protected_classes=None,X_train=None,y_train=None): ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 6ff1a45e8..dd3215639 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defplot_rolling_statistics(df,col,window_size): +defplot_rolling_statistics(df,col,window_size): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defRollingStatsPlot(dataset:VMDataset,window_size:int=12): +defRollingStatsPlot(dataset:VMDataset,window_size:int=12): ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index bd2525068..d5f9c8b42 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): +defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index a3e82e808..e8e070f0b 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): +defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): ::: diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index 83f95626e..e9429ba54 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defSkewness(dataset,max_threshold=1): +defSkewness(dataset,max_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 28b99f2ee..04cf9333c 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -50,7 +50,7 @@ toc-expand: 4 ::: {.signature} -defget_summary_statistics_categorical(dataset,categorical_fields): +defget_summary_statistics_categorical(dataset,categorical_fields): ::: @@ -62,7 +62,7 @@ toc-expand: 4 ::: {.signature} -defget_summary_statistics_datetime(dataset,datetime_fields): +defget_summary_statistics_datetime(dataset,datetime_fields): ::: @@ -74,7 +74,7 @@ toc-expand: 4 ::: {.signature} -defget_summary_statistics_numerical(dataset,numerical_fields): +defget_summary_statistics_numerical(dataset,numerical_fields): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 9e5e608e5..5526602c3 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defTimeSeriesHistogram(dataset,nbins=30): +defTimeSeriesHistogram(dataset,nbins=30): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 0d37eb6b9..338624cb5 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): +defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 414258dcc..a8adf301e 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): +defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 83315dc3d..84d8a132c 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): +defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 0511a3102..7643e5cde 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): +defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 6e2a7b519..911313821 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): +defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 7b18b39f4..c46c0760e 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): +defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 495b502e9..d283f233f 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index fe3cb507c..aab86ccb1 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHashtags(dataset:VMDataset,top_hashtags:int=25): +defHashtags(dataset:VMDataset,top_hashtags:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 177d03281..ecc8e0dd0 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMentions(dataset:VMDataset,top_mentions:int=25): +defMentions(dataset:VMDataset,top_mentions:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index f3becb729..2ca6e7a71 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defPolarityAndSubjectivity(dataset,threshold_subjectivity=0.5,threshold_polarity=0): +defPolarityAndSubjectivity(dataset,threshold_subjectivity=0.5,threshold_polarity=0): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index acd915ae6..810478da0 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -18,7 +18,7 @@ Metrics functions for any Pandas-compatible datasets ::: {.signature} -defPunctuations(dataset,count_mode='token'): +defPunctuations(dataset,count_mode='token'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index 4ace17ddb..3dfd17a4c 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): +defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index f3c56c8a4..cf7e2d111 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcreate_metrics_df(df,text_column,unwanted_tokens,lang): +defcreate_metrics_df(df,text_column,unwanted_tokens,lang): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defTextDescription(dataset:VMDataset,unwanted_tokens:set={'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str='english'): +defTextDescription(dataset:VMDataset,unwanted_tokens:set={'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str='english'): ::: diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index a5ad8d242..d29c3062d 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id=None): +defvalidate_prediction(y_true,y_pred,dataset_id=None): ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -defBertScore(dataset,model,evaluation_model='distilbert-base-uncased'): +defBertScore(dataset,model,evaluation_model='distilbert-base-uncased'): ::: diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index eac059c9f..00abca1b9 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id=None): +defvalidate_prediction(y_true,y_pred,dataset_id=None): ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -defBleuScore(dataset,model): +defBleuScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index a64587235..40bc2d433 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterSizeDistribution(dataset:VMDataset,model:VMModel): +defClusterSizeDistribution(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 8e5d508a9..05f8e00ec 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id=None): +defvalidate_prediction(y_true,y_pred,dataset_id=None): ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -defContextualRecall(dataset,model): +defContextualRecall(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 943cc87bb..4efb83bf4 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): +defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 3f58f36ef..431440991 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id=None): +defvalidate_prediction(y_true,y_pred,dataset_id=None): ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -defMeteorScore(dataset,model): +defMeteorScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index e7969449b..52513c487 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defModelPredictionResiduals(dataset,model,nbins=100,p_value_threshold=0.05,start_date=None,end_date=None): +defModelPredictionResiduals(dataset,model,nbins=100,p_value_threshold=0.05,start_date=None,end_date=None): ::: diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index bf8e41dca..f92a95093 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id=None): +defvalidate_prediction(y_true,y_pred,dataset_id=None): ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -defRegardScore(dataset,model): +defRegardScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 2dbd893bd..7963b1dcf 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): +defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 4a82f7e14..aad1f1d6e 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defRougeScore(dataset,model,metric='rouge-1'): +defRougeScore(dataset,model,metric='rouge-1'): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index 3cdeb5609..a8a62ee79 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesPredictionWithCI(dataset,model,confidence=0.95): +defTimeSeriesPredictionWithCI(dataset,model,confidence=0.95): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index c5f83088e..7e4e27bcc 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesPredictionsPlot(dataset,model): +defTimeSeriesPredictionsPlot(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index f30adb86d..5e60257ee 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesR2SquareBySegments(dataset,model,segments=None): +defTimeSeriesR2SquareBySegments(dataset,model,segments=None): ::: diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index ce49ce453..d4026de41 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTokenDisparity(dataset,model): +defTokenDisparity(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index 627646981..a2f203c12 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defToxicityScore(dataset,model): +defToxicityScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index d607d18ad..a09cf9cb8 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): +defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index b71e174b3..af793d03c 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAdjustedRandIndex(model:VMModel,dataset:VMDataset): +defAdjustedRandIndex(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index aa9b73d81..a1f325cc3 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): +defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index 689d54aa3..a445ade9f 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): +defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): ::: @@ -58,6 +58,6 @@ The test produces a report that includes precision, recall, F1-Score, and accura ::: {.signature} -defmulticlass_roc_auc_score(y_test,y_pred,average='macro'): +defmulticlass_roc_auc_score(y_test,y_pred,average='macro'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 735cd0609..3ff0f94a7 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): +defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): ::: @@ -90,7 +90,7 @@ The test implements multiple threshold optimization methods: ::: {.signature} -deffind_optimal_threshold(y_true,y_prob,method='youden',target_recall=None): +deffind_optimal_threshold(y_true,y_prob,method='youden',target_recall=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index f2128f249..ebe73b169 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): +defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 2db4f79f6..2c4dd6d7e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): +defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 4f52240b1..848c65f17 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCompletenessScore(model:VMModel,dataset:VMDataset): +defCompletenessScore(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index d6c6ee008..5c5356704 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defConfusionMatrix(dataset:VMDataset,model:VMModel): +defConfusionMatrix(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 12f25da9d..1dd8265d9 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): +defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 11051be5c..eecc3fb1e 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): +defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 50c3bf33b..c2917454b 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHomogeneityScore(dataset:VMDataset,model:VMModel): +defHomogeneityScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 188e5ca20..4ea96b1d8 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcustom_recall(y_true,y_pred_proba,threshold=0.5): +defcustom_recall(y_true,y_pred_proba,threshold=0.5): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\]=None,thresholds:Union\[float, List\[float\]\]=None,fit_params:dict=None): +defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\]=None,thresholds:Union\[float, List\[float\]\]=None,fit_params:dict=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 4ab31817e..de910f47e 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union\[List\[int\], None\]=None): +defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union\[List\[int\], None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 8ff07afe6..3c74a2cc1 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): +defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 261b210e3..01267ba5e 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): +defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 169a022a1..119dd9364 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): +defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 9c11c96bd..a372d15a9 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defModelParameters(model,model_params=None): +defModelParameters(model,model_params=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 28a454055..dbc3a373f 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defmulticlass_roc_auc_score(y_test,y_pred,average='macro'): +defmulticlass_roc_auc_score(y_test,y_pred,average='macro'): ::: @@ -24,7 +24,7 @@ toc-expand: 4 ::: {.signature} -defModelsPerformanceComparison(dataset:VMDataset,models:list\[VMModel\]): +defModelsPerformanceComparison(dataset:VMDataset,models:list\[VMModel\]): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index b22216610..3f171e06b 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defOverfitDiagnosis(model:VMModel,datasets:List\[VMDataset\],metric:str=None,cut_off_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): +defOverfitDiagnosis(model:VMModel,datasets:List\[VMDataset\],metric:str=None,cut_off_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index d621f0f38..628eaa461 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union\[int, None\]=None,figure_height:Union\[int, None\]=None): +defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union\[int, None\]=None,figure_height:Union\[int, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 3aced64bf..39308bf26 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defcalculate_psi(score_initial,score_new,num_bins=10,mode='fixed'): +defcalculate_psi(score_initial,score_new,num_bins=10,mode='fixed'): ::: @@ -46,7 +46,7 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -defPopulationStabilityIndex(datasets:List\[VMDataset\],model:VMModel,num_bins:int=10,mode:str='fixed'): +defPopulationStabilityIndex(datasets:List\[VMDataset\],model:VMModel,num_bins:int=10,mode:str='fixed'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 8d3531cbf..ac34807d5 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): +defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 4fd62fc08..f8dff1fdf 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defROCCurve(model:VMModel,dataset:VMDataset): +defROCCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index 7d8044a2c..c82073976 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defRegressionErrors(model,dataset): +defRegressionErrors(model,dataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index deb586952..0be0fcf5b 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionErrorsComparison(datasets,models): +defRegressionErrorsComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index fe9a32a78..98d810e46 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionPerformance(model:VMModel,dataset:VMDataset): +defRegressionPerformance(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 7dd1f328c..27c6d4e55 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -defRegressionR2Square(dataset,model): +defRegressionR2Square(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 1676daa7e..854c9e87f 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -defRegressionR2SquareComparison(datasets,models): +defRegressionR2SquareComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 79cb0a1b4..0a25a24e3 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRobustnessDiagnosis(datasets:List\[VMDataset\],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List\[float\]={'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): +defRobustnessDiagnosis(datasets:List\[VMDataset\],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List\[float\]={'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 8fe221701..2474a7e0b 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defgenerate_shap_plot(type\_,shap_values,x_test): +defgenerate_shap_plot(type\_,shap_values,x_test): ::: @@ -54,7 +54,7 @@ Plots two types of SHAP global importance (SHAP). ::: {.signature} -defselect_shap_values(shap_values,class_of_interest): +defselect_shap_values(shap_values,class_of_interest): ::: @@ -85,7 +85,7 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): +defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 78d656620..fb70b1833 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): +defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index f88ba1098..31e42e65d 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defSilhouettePlot(model:VMModel,dataset:VMDataset): +defSilhouettePlot(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 5322f9b44..7bc7b199a 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTrainingTestDegradation(datasets:List\[VMDataset\],model:VMModel,max_threshold:float=0.1): +defTrainingTestDegradation(datasets:List\[VMDataset\],model:VMModel,max_threshold:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index b89ba4915..a0b3d7c24 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defVMeasure(dataset:VMDataset,model:VMModel): +defVMeasure(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 41a6cc7a2..174acb66c 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defWeakspotsDiagnosis(datasets:List\[VMDataset\],model:VMModel,features_columns:Union\[List\[str\], None\]=None,metrics:Union\[Dict\[str, Callable\], None\]=None,thresholds:Union\[Dict\[str, float\], None\]=None): +defWeakspotsDiagnosis(datasets:List\[VMDataset\],model:VMModel,features_columns:Union\[List\[str\], None\]=None,metrics:Union\[Dict\[str, Callable\], None\]=None,thresholds:Union\[Dict\[str, float\], None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index a95cf81aa..4bcb1a0d6 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoARIMA(model:VMModel,dataset:VMDataset): +defAutoARIMA(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index f54977e3c..10638c5ce 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCumulativePredictionProbabilities(dataset,model,title='Cumulative Probabilities'): +defCumulativePredictionProbabilities(dataset,model,title='Cumulative Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 3f3cd6df9..7aff2de0a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defDurbinWatsonTest(dataset,model,threshold={'cls': 'ExprList', 'elements': ['1.5', '2.5']}): +defDurbinWatsonTest(dataset,model,threshold={'cls': 'ExprList', 'elements': ['1.5', '2.5']}): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index ae9172cd4..94dd1da2d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defGINITable(dataset,model): +defGINITable(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 92ea234f1..2cca8909a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): +defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index 4931f51d7..fab0a69b2 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defPredictionProbabilitiesHistogram(dataset,model,title='Histogram of Predictive Probabilities'): +defPredictionProbabilitiesHistogram(dataset,model,title='Histogram of Predictive Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 284dba262..7304983fa 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): +defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index d87d56e72..86d84412a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union\[str, None\]=None,end_date:Union\[str, None\]=None): +defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union\[str, None\]=None,end_date:Union\[str, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 268cc0012..b174b15b0 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defintegrate_diff(series_diff,start_value): +defintegrate_diff(series_diff,start_value): ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): +defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index dd1ac9a35..281b43ac2 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defintegrate_diff(series_diff,start_value): +defintegrate_diff(series_diff,start_value): ::: @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List\[float\]={'cls': 'ExprList', 'elements': ['0.1']},transformation:Union\[str, None\]=None): +defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List\[float\]={'cls': 'ExprList', 'elements': ['0.1']},transformation:Union\[str, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index cbf22a5b8..e987886a3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -defRegressionModelSummary(dataset:VMDataset,model:VMModel): +defRegressionModelSummary(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 9c71a3761..9575ef1cd 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name='validmind',log_level=None): ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): +defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index 8d4c0c684..215ae3660 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScorecardHistogram(dataset,title='Histogram of Scores',score_column='score'): +defScorecardHistogram(dataset,title='Histogram of Scores',score_column='score'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index d832a323c..5f3aa2bc3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index da1466d2f..462bf1e1d 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defBias(model,min_threshold=7): +defBias(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 367151a97..d8dc4413c 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defClarity(model,min_threshold=7): +defClarity(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 2ddabb727..030e5b71a 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defConciseness(model,min_threshold=7): +defConciseness(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 37b38853c..8d21bd868 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defDelimitation(model,min_threshold=7): +defDelimitation(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index ccc1cb9ab..fe098b018 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defNegativeInstruction(model,min_threshold=7): +defNegativeInstruction(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index d80b08c6c..09bf36d39 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -28,7 +28,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defRobustness(model,dataset,num_tests=10): +defRobustness(model,dataset,num_tests=10): ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index bd92930c6..63c5366d2 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -defSpecificity(model,min_threshold=7): +defSpecificity(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index ab5e96565..5b00384f1 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 3a6ce7c1e..72c0cdd2d 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defdescribe_metric(metric_id:str,\*\*kwargs): +defdescribe_metric(metric_id:str,\*\*kwargs): ::: @@ -46,7 +46,7 @@ List all metrics ::: {.signature} -defrun_metric(metric_id:str,\*\*kwargs): +defrun_metric(metric_id:str,\*\*kwargs): ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 658913602..2566f8c5e 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -92,7 +92,7 @@ Model attributes definition ::: {.signature} -deffrom_dict(cls,data): +deffrom_dict(cls,data): ::: @@ -206,7 +206,7 @@ This method will be called after the test suite has been run and all results hav ::: {.signature} -defrun(send:bool=True,fail_fast:bool=False): +defrun(send:bool=True,fail_fast:bool=False): ::: @@ -225,7 +225,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -defsummarize(show_link:bool=True): +defsummarize(show_link:bool=True): ::: @@ -272,7 +272,7 @@ This way we can support multiple dataset types but under the hood we only need t ::: {.signature} -defadd_extra_column(column_name,column_values=None): +defadd_extra_column(column_name,column_values=None): ::: @@ -291,7 +291,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -defassign_predictions(model:VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): +defassign_predictions(model:VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): ::: @@ -315,7 +315,7 @@ Assign predictions and probabilities to the dataset. ::: {.signature} -defprediction_column(model:VMModel,column_name:str=None)str: +defprediction_column(model:VMModel,column_name:str=None)str: ::: @@ -329,7 +329,7 @@ Get or set the prediction column for a model. ::: {.signature} -defprobability_column(model:VMModel,column_name:str=None)str: +defprobability_column(model:VMModel,column_name:str=None)str: ::: @@ -357,7 +357,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMDataset: +defwith_options(\*\*kwargs)validmind.vm_models.VMDataset: ::: @@ -408,7 +408,7 @@ Returns a dataframe containing the target column ::: {.signature} -defy_pred(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: +defy_pred(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: ::: @@ -432,7 +432,7 @@ Attempts to stack complex prediction types (e.g., embeddings) into a single, mul ::: {.signature} -defy_pred_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +defy_pred_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: @@ -446,7 +446,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -defy_prob(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: +defy_prob(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: ::: @@ -468,7 +468,7 @@ Returns the probabilities for a given model. ::: {.signature} -defy_prob_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +defy_prob_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: @@ -500,7 +500,7 @@ Base class for ValidMind Input types ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMInput: +defwith_options(\*\*kwargs)validmind.vm_models.VMInput: ::: @@ -549,7 +549,7 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -defpredict(\*args,\*\*kwargs): +defpredict(\*args,\*\*kwargs): ::: @@ -563,7 +563,7 @@ Predict method for the model. This is a wrapper around the model's ::: {.signature} -defpredict_proba(\*args,\*\*kwargs): +defpredict_proba(\*args,\*\*kwargs): ::: From fa42eb37d8c79b8e14d76880c4b30428bd2bb989 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Wed, 19 Feb 2025 09:08:58 -0800 Subject: [PATCH 085/207] Save point with debug comments in types.jinja2 --- docs/templates/macros/types.jinja2 | 39 +++++++++++++++++-- docs/validmind.qmd | 16 ++++---- docs/validmind/errors.qmd | 2 +- docs/validmind/test_suites.qmd | 12 +++--- docs/validmind/tests.qmd | 14 +++---- .../tests/data_validation/ACFandPACFPlot.qmd | 2 +- docs/validmind/tests/data_validation/ADF.qmd | 2 +- .../tests/data_validation/AutoAR.qmd | 2 +- .../tests/data_validation/AutoMA.qmd | 2 +- .../data_validation/AutoStationarity.qmd | 2 +- .../tests/data_validation/ClassImbalance.qmd | 2 +- .../data_validation/DatasetDescription.qmd | 2 +- .../tests/data_validation/DatasetSplit.qmd | 2 +- .../data_validation/DescriptiveStatistics.qmd | 4 +- .../tests/data_validation/DickeyFullerGLS.qmd | 2 +- .../data_validation/EngleGrangerCoint.qmd | 2 +- .../tests/data_validation/HighCardinality.qmd | 2 +- .../HighPearsonCorrelation.qmd | 2 +- .../data_validation/IQROutliersBarPlot.qmd | 2 +- .../data_validation/IQROutliersTable.qmd | 2 +- .../IsolationForestOutliers.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 2 +- .../LaggedCorrelationHeatmap.qmd | 2 +- .../tests/data_validation/MissingValues.qmd | 2 +- .../data_validation/MissingValuesBarPlot.qmd | 2 +- .../data_validation/MutualInformation.qmd | 2 +- .../data_validation/PhillipsPerronArch.qmd | 2 +- .../data_validation/RollingStatsPlot.qmd | 2 +- .../data_validation/ScoreBandDefaultRates.qmd | 2 +- .../data_validation/SeasonalDecompose.qmd | 2 +- .../tests/data_validation/SpreadPlot.qmd | 2 +- .../TabularCategoricalBarPlots.qmd | 2 +- .../TabularDateTimeHistograms.qmd | 2 +- .../TabularNumericalHistograms.qmd | 2 +- .../data_validation/TargetRateBarPlots.qmd | 2 +- .../data_validation/TimeSeriesFrequency.qmd | 2 +- .../data_validation/TimeSeriesLinePlot.qmd | 2 +- .../TimeSeriesMissingValues.qmd | 2 +- .../data_validation/TimeSeriesOutliers.qmd | 2 +- .../data_validation/TooManyZeroValues.qmd | 2 +- .../tests/data_validation/UniqueRows.qmd | 2 +- .../tests/data_validation/WOEBinPlots.qmd | 2 +- .../tests/data_validation/WOEBinTable.qmd | 2 +- .../data_validation/ZivotAndrewsArch.qmd | 2 +- .../tests/data_validation/nlp/CommonWords.qmd | 2 +- .../tests/data_validation/nlp/Hashtags.qmd | 2 +- .../tests/data_validation/nlp/Mentions.qmd | 2 +- .../tests/data_validation/nlp/StopWords.qmd | 2 +- .../data_validation/nlp/TextDescription.qmd | 2 +- .../ClusterSizeDistribution.qmd | 2 +- .../tests/model_validation/FeaturesAUC.qmd | 2 +- .../RegressionResidualsPlot.qmd | 2 +- .../sklearn/AdjustedMutualInformation.qmd | 2 +- .../sklearn/AdjustedRandIndex.qmd | 2 +- .../sklearn/CalibrationCurve.qmd | 2 +- .../sklearn/ClassifierPerformance.qmd | 2 +- .../ClassifierThresholdOptimization.qmd | 2 +- .../sklearn/ClusterCosineSimilarity.qmd | 2 +- .../sklearn/ClusterPerformanceMetrics.qmd | 2 +- .../sklearn/CompletenessScore.qmd | 2 +- .../sklearn/ConfusionMatrix.qmd | 2 +- .../sklearn/FeatureImportance.qmd | 2 +- .../sklearn/FowlkesMallowsScore.qmd | 2 +- .../sklearn/HomogeneityScore.qmd | 2 +- .../sklearn/HyperParametersTuning.qmd | 2 +- .../sklearn/KMeansClustersOptimization.qmd | 2 +- .../sklearn/MinimumAccuracy.qmd | 2 +- .../sklearn/MinimumF1Score.qmd | 2 +- .../sklearn/MinimumROCAUCScore.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 2 +- .../sklearn/OverfitDiagnosis.qmd | 2 +- .../sklearn/PermutationFeatureImportance.qmd | 2 +- .../sklearn/PopulationStabilityIndex.qmd | 2 +- .../sklearn/PrecisionRecallCurve.qmd | 2 +- .../model_validation/sklearn/ROCCurve.qmd | 2 +- .../sklearn/RegressionPerformance.qmd | 2 +- .../sklearn/RegressionR2Square.qmd | 2 +- .../sklearn/RegressionR2SquareComparison.qmd | 2 +- .../sklearn/RobustnessDiagnosis.qmd | 2 +- .../sklearn/SHAPGlobalImportance.qmd | 2 +- .../sklearn/ScoreProbabilityAlignment.qmd | 2 +- .../sklearn/SilhouettePlot.qmd | 2 +- .../sklearn/TrainingTestDegradation.qmd | 2 +- .../model_validation/sklearn/VMeasure.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 2 +- .../statsmodels/AutoARIMA.qmd | 2 +- .../statsmodels/KolmogorovSmirnov.qmd | 2 +- .../statsmodels/Lilliefors.qmd | 2 +- .../RegressionFeatureSignificance.qmd | 2 +- .../RegressionModelForecastPlot.qmd | 2 +- .../RegressionModelForecastPlotLevels.qmd | 2 +- .../RegressionModelSensitivityPlot.qmd | 2 +- .../statsmodels/RegressionModelSummary.qmd | 4 +- ...RegressionPermutationFeatureImportance.qmd | 2 +- .../statsmodels/statsutils.qmd | 2 +- .../tests/prompt_validation/Bias.qmd | 6 +-- .../tests/prompt_validation/Clarity.qmd | 6 +-- .../tests/prompt_validation/Conciseness.qmd | 6 +-- .../tests/prompt_validation/Delimitation.qmd | 6 +-- .../prompt_validation/NegativeInstruction.qmd | 6 +-- .../tests/prompt_validation/Robustness.qmd | 2 +- .../tests/prompt_validation/Specificity.qmd | 6 +-- .../prompt_validation/ai_powered_test.qmd | 6 +-- docs/validmind/unit_metrics.qmd | 4 +- docs/validmind/vm_models.qmd | 30 +++++++------- 105 files changed, 189 insertions(+), 156 deletions(-) diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index 28312c3be..cf5a796b3 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -4,7 +4,9 @@ {% macro format_type(type, module=None, add_links=false) %} {%- if type is mapping -%} + {%- if type.kind == 'union' -%} + Union[ {%- for t in type.types -%} {{ format_type(t, module, add_links) }} @@ -12,20 +14,39 @@ {%- endfor -%} ] {%- elif type.kind == 'generic' -%} - {%- if type.base == 'Dict' -%} + {%- if type.base == 'Callable' -%} + + Callable[[ + {%- for arg in type.args[:-1] -%} + {{ format_type(arg, module, add_links) }} + {%- if not loop.last -%}, {%- endif -%} + {%- endfor -%} + ], {{ format_type(type.args[-1], module, add_links) }}] + {%- elif type.base == 'Dict' -%} + Dict[{{ format_type(type.args[0], module, add_links) }}, {{ format_type(type.args[1], module, add_links) }}] {%- elif type.base == 'List' -%} List[{{ format_type(type.args[0], module, add_links) }}] {%- else -%} {{ type.base }}[{{ type.args | map(attribute='format_type') | join(', ') }}] {%- endif -%} + {%- elif type.cls == "ExprAttribute" and type.values is sequence -%} {{ type.values | map(attribute='name') | join('.') }} - {%- elif type.cls == "ExprSubscript" and type.left is defined -%} + {%- elif type.cls == "ExprSubscript" -%} {{ format_type(type.left, module, add_links) }}[ {%- if type.slice.cls == "ExprTuple" -%} {%- for elem in type.slice.elements -%} - {{ format_type(elem, module, add_links) }} + {%- if elem.cls == "ExprSubscript" and elem.left.cls == "ExprName" and elem.left.name == "Callable" -%} + [ + {%- for arg in elem.slice.elements[0].elements -%} + {{ format_type(arg, module, add_links) }} + {%- if not loop.last -%}, {%- endif -%} + {%- endfor -%} + ], {{ format_type(elem.slice.elements[1], module, add_links) }} + {%- else -%} + {{ format_type(elem, module, add_links) }} + {%- endif -%} {%- if not loop.last -%}, {%- endif -%} {%- endfor -%} {%- else -%} @@ -33,6 +54,7 @@ {%- endif -%} ] {%- elif type.cls == "ExprName" -%} + {%- if module and type.name in module.members and module.members[type.name].kind == "alias" -%} {{ module.members[type.name].target_path }} {%- elif type.name in type_keywords -%} @@ -45,16 +67,19 @@ {{ type.name }} {%- endif -%} {%- elif type.cls == "ExprList" -%} + {%- for elem in type.elements -%} {{ format_type(elem, module, add_links) }} {%- if not loop.last -%}, {%- endif -%} {%- endfor -%} {%- elif type.cls == "ExprTuple" -%} + {%- for elem in type.elements -%} {{ format_type(elem, module, add_links) }} {%- if not loop.last -%}, {%- endif -%} {%- endfor -%} {%- elif type.cls == "ExprCall" -%} + {{ format_type(type.func, module, add_links) }}( {%- for arg in type.args -%} {{ format_type(arg, module, add_links) }} @@ -62,9 +87,17 @@ {%- endfor -%} ) {%- elif type.cls == "ExprBinOp" -%} + {{ format_type(type.left, module, add_links) }}{{ type.op }}{{ format_type(type.right, module, add_links) }} {%- elif type.name is defined and add_links and type.name not in ['str', 'dict', 'list', 'bool', 'int', 'float', 'Any', 'Union', 'Dict', 'List', 'Optional', 'Callable', 'Tuple'] -%} validmind.vm_models.{{ type.name }} + {%- elif type.cls == "ExprSubscript" and type.left.cls == "ExprName" and type.left.name == "Callable" -%} + Callable\[\[ + {%- for elem in type.slice.elements[0].elements -%} + {{ format_type(elem, module, add_links) }} + {%- if not loop.last -%}, {%- endif -%} + {%- endfor -%} + \], {{ format_type(type.slice.elements[1], module, add_links) }}\] {%- else -%} {%- if type.name in ['str', 'dict', 'list', 'bool', 'int', 'float'] -%} {{ type.name if 'name' in type else type|string }} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 90a4eb7ca..7ab8786a4 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -55,7 +55,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -defget_test_suite(test_suite_id:str=None,section:str=None,\*args,\*\*kwargs)validmind.vm_models.TestSuite: +defget_test_suite(test_suite_id:str=None,section:str=None,\*args,\*\*kwargs)validmind.vm_models.TestSuite: ::: @@ -78,7 +78,7 @@ This function provides an interface to retrieve the TestSuite instance for the c ::: {.signature} -definit(project:Optional\[str\]=None,api_key:Optional\[str\]=None,api_secret:Optional\[str\]=None,api_host:Optional\[str\]=None,model:Optional\[str\]=None,monitoring:bool=False,generate_descriptions:Optional\[bool\]=None): +definit(project:Optional\[str\]=None,api_key:Optional\[str\]=None,api_secret:Optional\[str\]=None,api_host:Optional\[str\]=None,model:Optional\[str\]=None,monitoring:bool=False,generate_descriptions:Optional\[bool\]=None): ::: @@ -108,7 +108,7 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True)validmind.vm_models.VMDataset: +definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True)validmind.vm_models.VMDataset: ::: @@ -149,7 +149,7 @@ The following dataset types are supported: ::: {.signature} -definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs)validmind.vm_models.VMModel: +definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs)validmind.vm_models.VMModel: ::: @@ -179,7 +179,7 @@ Initializes a VM Model, which can then be passed to other functions that can per ::: {.signature} -definit_r_model(model_path:str,input_id:str='model')validmind.vm_models.VMModel: +definit_r_model(model_path:str,input_id:str='model')validmind.vm_models.VMModel: ::: @@ -211,7 +211,7 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ::: {.signature} -deflog_metric(key:str,value:float,inputs:Optional\[List\[str\]\]=None,params:Optional\[Dict\[str, Any\]\]=None,recorded_at:Optional\[str\]=None,thresholds:Optional\[Dict\[str, Any\]\]=None): +deflog_metric(key:str,value:float,inputs:Optional\[List\[str\]\]=None,params:Optional\[Dict\[str, Any\]\]=None,recorded_at:Optional\[str\]=None,thresholds:Optional\[Dict\[str, Any\]\]=None): ::: @@ -445,7 +445,7 @@ Holds raw data for a test result ::: {.signature} -RawData(log:bool=False,\*\*kwargs) +RawData(log:bool=False,\*\*kwargs) ::: @@ -466,7 +466,7 @@ Create a new RawData object ::: {.signature} -definspect(self,show:bool=True): +definspect(self,show:bool=True): ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index c31a20f51..df4a1a88c 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -838,7 +838,7 @@ returns a non-JSON string or if the API returns a non-standard error ::: {.signature} -defshould_raise_on_fail_fast(error)bool: +defshould_raise_on_fail_fast(error)bool: ::: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 6dec57923..6beb85e42 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,7 +29,7 @@ Entrypoint for test suites. ::: {.signature} -defformat_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +defformat_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: @@ -57,7 +57,7 @@ Get a logger for the given module name ::: {.signature} -deftest_id_to_name(test_id:str)str: +deftest_id_to_name(test_id:str)str: ::: @@ -81,7 +81,7 @@ Convert a test ID to a human-readable name. ::: {.signature} -defdescribe_suite(test_suite_id:str,verbose=False): +defdescribe_suite(test_suite_id:str,verbose=False): ::: @@ -106,7 +106,7 @@ Describes a Test Suite by ID ::: {.signature} -defget_by_id(test_suite_id:str): +defget_by_id(test_suite_id:str): ::: @@ -122,7 +122,7 @@ Returns the test suite by ID ::: {.signature} -deflist_suites(pretty:bool=True): +deflist_suites(pretty:bool=True): ::: @@ -138,7 +138,7 @@ Returns a list of all available test suites ::: {.signature} -defregister_test_suite(suite_id:str,suite:TestSuite): +defregister_test_suite(suite_id:str,suite:TestSuite): ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 9ba67933e..2a750b4ad 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -20,7 +20,7 @@ ValidMind Tests Module ::: {.signature} -defdescribe_test(test_id:TestID=None,raw:bool=False,show:bool=True): +defdescribe_test(test_id:TestID=None,raw:bool=False,show:bool=True): ::: @@ -115,7 +115,7 @@ List all tests in the tests directory. ::: {.signature} -defload_test(test_id:str,test_func:callable=None,reload:bool=False): +defload_test(test_id:str,test_func:callable=None,reload:bool=False): ::: @@ -136,7 +136,7 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. ::: {.signature} -defrun_test(test_id:Union\[TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[Callable\[TestResult, None\], None\]=None,\*\*kwargs)validmind.vm_models.TestResult: +defrun_test(test_id:Union\[TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[\[TestResult\], None, None\]=None,\*\*kwargs)validmind.vm_models.TestResult: ::: @@ -256,7 +256,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -defregister_test_provider(namespace:str,test_provider:TestProvider)None: +defregister_test_provider(namespace:str,test_provider:TestProvider)None: ::: @@ -357,7 +357,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str): +defload_test(test_id:str): ::: @@ -402,7 +402,7 @@ Protocol for user-defined test providers ::: {.signature} -deflist_tests()List\[str\]: +deflist_tests()List\[str\]: ::: @@ -420,7 +420,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str)callable: +defload_test(test_id:str)callable: ::: diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 7babb1fdb..ca79aaffe 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defACFandPACFPlot(dataset:VMDataset): +defACFandPACFPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 9e187571c..ccd7f7026 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defADF(dataset:VMDataset): +defADF(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 645451cbb..4cac96f7f 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoAR(dataset:VMDataset,max_ar_order:int=3): +defAutoAR(dataset:VMDataset,max_ar_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index 9efe85776..344277dde 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoMA(dataset:VMDataset,max_ma_order:int=3): +defAutoMA(dataset:VMDataset,max_ma_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index a918f4567..cad3ad199 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): +defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 32ab57f2b..698252d9c 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\]: +defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\]: ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 527273846..f5213b8f6 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defDatasetDescription(dataset:VMDataset): +defDatasetDescription(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index f1d06a8a5..e1d33478d 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defDatasetSplit(datasets:List\[VMDataset\]): +defDatasetSplit(datasets:List\[VMDataset\]): ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 4c08828ad..87d22ea0c 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defformat_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict\[str, Any\]\]: +defformat_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict\[str, Any\]\]: ::: @@ -36,7 +36,7 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -defDescriptiveStatistics(dataset:VMDataset): +defDescriptiveStatistics(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index b7602b4f7..4471d5622 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defDickeyFullerGLS(dataset:VMDataset): +defDickeyFullerGLS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 7f2f08373..73933e575 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): +defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 4e6bb9551..355c735ac 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): +defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 6b7b613ec..b927b9f82 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): +defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 2f7c3bdd0..66c71ce50 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): +defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index a167fa0a7..9075f4908 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): +defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index c6e6f2dba..101794a5c 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): +defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 9fe999ffe..17bd0c331 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defKPSS(dataset:VMDataset): +defKPSS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index 34c228c62..fe5fb6cff 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): +defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 2d918cadd..93b154bc2 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMissingValues(dataset:VMDataset,min_threshold:int=1): +defMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index fb9089c87..ca3291ba5 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): +defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 8a3401718..3d2d50715 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): +defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 747c04cea..5d1f5fe9f 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defPhillipsPerronArch(dataset:VMDataset): +defPhillipsPerronArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index dd3215639..d4fa685c4 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defRollingStatsPlot(dataset:VMDataset,window_size:int=12): +defRollingStatsPlot(dataset:VMDataset,window_size:int=12): ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index d5f9c8b42..a83789c1e 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): +defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index e8e070f0b..5498238bd 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): +defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index b4f684106..51a875ce8 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defSpreadPlot(dataset:VMDataset): +defSpreadPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 2fd767803..3abcf1d8b 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTabularCategoricalBarPlots(dataset:VMDataset): +defTabularCategoricalBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index fc9013724..811ec0174 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTabularDateTimeHistograms(dataset:VMDataset): +defTabularDateTimeHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 8db60f1fe..7ee765c0a 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTabularNumericalHistograms(dataset:VMDataset): +defTabularNumericalHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 698633ff7..1ffc56f96 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTargetRateBarPlots(dataset:VMDataset): +defTargetRateBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index d950ea74b..8d832dd8f 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesFrequency(dataset:VMDataset): +defTimeSeriesFrequency(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 89c6f2c16..cbbd957dc 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesLinePlot(dataset:VMDataset): +defTimeSeriesLinePlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 338624cb5..e25586f12 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): +defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index a8adf301e..67c8bbade 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): +defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 84d8a132c..f1315baba 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): +defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 7643e5cde..aef365665 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): +defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 911313821..bde4f6b65 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): +defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index c46c0760e..b42ff30b4 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): +defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index d283f233f..f40003a53 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defZivotAndrewsArch(dataset:VMDataset): +defZivotAndrewsArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index 7f1815bfc..fde585b90 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCommonWords(dataset:VMDataset): +defCommonWords(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index aab86ccb1..01396b686 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHashtags(dataset:VMDataset,top_hashtags:int=25): +defHashtags(dataset:VMDataset,top_hashtags:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index ecc8e0dd0..196569964 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMentions(dataset:VMDataset,top_mentions:int=25): +defMentions(dataset:VMDataset,top_mentions:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index 3dfd17a4c..d722ece8d 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): +defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index cf7e2d111..d68b0d760 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defTextDescription(dataset:VMDataset,unwanted_tokens:set={'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str='english'): +defTextDescription(dataset:VMDataset,unwanted_tokens:set={'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str='english'): ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 40bc2d433..8c94b8863 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterSizeDistribution(dataset:VMDataset,model:VMModel): +defClusterSizeDistribution(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 4efb83bf4..a61cf85ee 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): +defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 7963b1dcf..7c45faa3a 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): +defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index a09cf9cb8..50ef40888 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): +defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index af793d03c..374537763 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAdjustedRandIndex(model:VMModel,dataset:VMDataset): +defAdjustedRandIndex(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index a1f325cc3..4c64c8fd8 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): +defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index a445ade9f..c337444b1 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): +defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 3ff0f94a7..bcd32f7c7 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): +defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index ebe73b169..06bb9c5f4 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): +defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 2c4dd6d7e..d5398ed28 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): +defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 848c65f17..417f69bea 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCompletenessScore(model:VMModel,dataset:VMDataset): +defCompletenessScore(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 5c5356704..202d27ff8 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defConfusionMatrix(dataset:VMDataset,model:VMModel): +defConfusionMatrix(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 1dd8265d9..68bdab66e 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): +defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index eecc3fb1e..708bf2702 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): +defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index c2917454b..1457001ff 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHomogeneityScore(dataset:VMDataset,model:VMModel): +defHomogeneityScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 4ea96b1d8..3dac3fbf5 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\]=None,thresholds:Union\[float, List\[float\]\]=None,fit_params:dict=None): +defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\]=None,thresholds:Union\[float, List\[float\]\]=None,fit_params:dict=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index de910f47e..1621564d8 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union\[List\[int\], None\]=None): +defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union\[List\[int\], None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 3c74a2cc1..309cf2afc 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): +defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 01267ba5e..5edb7ad93 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): +defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 119dd9364..c2d759710 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): +defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index dbc3a373f..17535af26 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -24,7 +24,7 @@ toc-expand: 4 ::: {.signature} -defModelsPerformanceComparison(dataset:VMDataset,models:list\[VMModel\]): +defModelsPerformanceComparison(dataset:VMDataset,models:list\[VMModel\]): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 3f171e06b..4641daa4e 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defOverfitDiagnosis(model:VMModel,datasets:List\[VMDataset\],metric:str=None,cut_off_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): +defOverfitDiagnosis(model:VMModel,datasets:List\[VMDataset\],metric:str=None,cut_off_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 628eaa461..bd49fd8b6 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union\[int, None\]=None,figure_height:Union\[int, None\]=None): +defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union\[int, None\]=None,figure_height:Union\[int, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 39308bf26..56f609a3b 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -46,7 +46,7 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -defPopulationStabilityIndex(datasets:List\[VMDataset\],model:VMModel,num_bins:int=10,mode:str='fixed'): +defPopulationStabilityIndex(datasets:List\[VMDataset\],model:VMModel,num_bins:int=10,mode:str='fixed'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index ac34807d5..cb9ee031b 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): +defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index f8dff1fdf..468650c56 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defROCCurve(model:VMModel,dataset:VMDataset): +defROCCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 98d810e46..3a60908a2 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionPerformance(model:VMModel,dataset:VMDataset): +defRegressionPerformance(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 27c6d4e55..d86b3f340 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 854c9e87f..65ea7f405 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 0a25a24e3..004ce8f57 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRobustnessDiagnosis(datasets:List\[VMDataset\],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List\[float\]={'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): +defRobustnessDiagnosis(datasets:List\[VMDataset\],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List\[float\]={'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 2474a7e0b..e91f0c05f 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -85,7 +85,7 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): +defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index fb70b1833..db9527386 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): +defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 31e42e65d..2b847a8ef 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defSilhouettePlot(model:VMModel,dataset:VMDataset): +defSilhouettePlot(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 7bc7b199a..950376da3 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTrainingTestDegradation(datasets:List\[VMDataset\],model:VMModel,max_threshold:float=0.1): +defTrainingTestDegradation(datasets:List\[VMDataset\],model:VMModel,max_threshold:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index a0b3d7c24..6c212c722 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defVMeasure(dataset:VMDataset,model:VMModel): +defVMeasure(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 174acb66c..65966e4e1 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defWeakspotsDiagnosis(datasets:List\[VMDataset\],model:VMModel,features_columns:Union\[List\[str\], None\]=None,metrics:Union\[Dict\[str, Callable\], None\]=None,thresholds:Union\[Dict\[str, float\], None\]=None): +defWeakspotsDiagnosis(datasets:List\[VMDataset\],model:VMModel,features_columns:Union\[List\[str\], None\]=None,metrics:Union\[Dict\[str, Callable\], None\]=None,thresholds:Union\[Dict\[str, float\], None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 4bcb1a0d6..9274ab1ce 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoARIMA(model:VMModel,dataset:VMDataset): +defAutoARIMA(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 2cca8909a..5aeb20426 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): +defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index cfdfa4af0..a1ba5e10d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defLilliefors(dataset:VMDataset): +defLilliefors(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 7304983fa..0415ffe67 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): +defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 86d84412a..8f0d68934 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union\[str, None\]=None,end_date:Union\[str, None\]=None): +defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union\[str, None\]=None,end_date:Union\[str, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index b174b15b0..a435d9a72 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): +defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 281b43ac2..3dfed8d9e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List\[float\]={'cls': 'ExprList', 'elements': ['0.1']},transformation:Union\[str, None\]=None): +defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List\[float\]={'cls': 'ExprList', 'elements': ['0.1']},transformation:Union\[str, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index e987886a3..f627a35ac 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -defRegressionModelSummary(dataset:VMDataset,model:VMModel): +defRegressionModelSummary(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 9575ef1cd..b284969d1 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): +defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 5f3aa2bc3..8391d76e0 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 462bf1e1d..5eb5c2a3e 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index d8dc4413c..c43a53a3c 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 030e5b71a..4ad08d7b2 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 8d21bd868..318381ac7 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index fe098b018..ef2a6b0dc 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 09bf36d39..276138b25 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 63c5366d2..add772a11 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index 5b00384f1..0c3286fa1 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -30,7 +30,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -54,7 +54,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 72c0cdd2d..b54009cdb 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defdescribe_metric(metric_id:str,\*\*kwargs): +defdescribe_metric(metric_id:str,\*\*kwargs): ::: @@ -46,7 +46,7 @@ List all metrics ::: {.signature} -defrun_metric(metric_id:str,\*\*kwargs): +defrun_metric(metric_id:str,\*\*kwargs): ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 2566f8c5e..e4bec51b2 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -126,7 +126,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -defget_default_config()dict: +defget_default_config()dict: ::: @@ -146,7 +146,7 @@ Each test in a test suite can accept parameters and those parameters can have de ::: {.signature} -defget_tests()List\[str\]: +defget_tests()List\[str\]: ::: @@ -160,7 +160,7 @@ Get all test suite test objects from all sections ::: {.signature} -defnum_tests()int: +defnum_tests()int: ::: @@ -206,7 +206,7 @@ This method will be called after the test suite has been run and all results hav ::: {.signature} -defrun(send:bool=True,fail_fast:bool=False): +defrun(send:bool=True,fail_fast:bool=False): ::: @@ -225,7 +225,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -defsummarize(show_link:bool=True): +defsummarize(show_link:bool=True): ::: @@ -291,7 +291,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -defassign_predictions(model:VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): +defassign_predictions(model:VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): ::: @@ -315,7 +315,7 @@ Assign predictions and probabilities to the dataset. ::: {.signature} -defprediction_column(model:VMModel,column_name:str=None)str: +defprediction_column(model:VMModel,column_name:str=None)str: ::: @@ -329,7 +329,7 @@ Get or set the prediction column for a model. ::: {.signature} -defprobability_column(model:VMModel,column_name:str=None)str: +defprobability_column(model:VMModel,column_name:str=None)str: ::: @@ -357,7 +357,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMDataset: +defwith_options(\*\*kwargs)validmind.vm_models.VMDataset: ::: @@ -394,7 +394,7 @@ Returns a dataframe containing only the feature columns ::: {.signature} -defy_df(){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +defy_df(){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: @@ -408,7 +408,7 @@ Returns a dataframe containing the target column ::: {.signature} -defy_pred(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: +defy_pred(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: ::: @@ -432,7 +432,7 @@ Attempts to stack complex prediction types (e.g., embeddings) into a single, mul ::: {.signature} -defy_pred_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +defy_pred_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: @@ -446,7 +446,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -defy_prob(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: +defy_prob(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: ::: @@ -468,7 +468,7 @@ Returns the probabilities for a given model. ::: {.signature} -defy_prob_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +defy_prob_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: @@ -500,7 +500,7 @@ Base class for ValidMind Input types ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMInput: +defwith_options(\*\*kwargs)validmind.vm_models.VMInput: ::: From 8bb20c76dd093cf7c63bd2f7b5bfbf493f7e5980 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Thu, 20 Feb 2025 14:24:34 -0800 Subject: [PATCH 086/207] Fixed final raw JSON output for Expr* types --- docs/templates/macros/signatures.jinja2 | 2 + docs/templates/macros/types.jinja2 | 166 ++++++++++-------- docs/validmind.qmd | 16 +- docs/validmind/errors.qmd | 2 +- docs/validmind/test_suites.qmd | 12 +- docs/validmind/tests.qmd | 14 +- .../tests/data_validation/ACFandPACFPlot.qmd | 2 +- docs/validmind/tests/data_validation/ADF.qmd | 2 +- .../tests/data_validation/AutoAR.qmd | 2 +- .../tests/data_validation/AutoMA.qmd | 2 +- .../data_validation/AutoStationarity.qmd | 2 +- .../tests/data_validation/ClassImbalance.qmd | 2 +- .../data_validation/DatasetDescription.qmd | 2 +- .../tests/data_validation/DatasetSplit.qmd | 2 +- .../data_validation/DescriptiveStatistics.qmd | 4 +- .../tests/data_validation/DickeyFullerGLS.qmd | 2 +- .../data_validation/EngleGrangerCoint.qmd | 2 +- .../tests/data_validation/HighCardinality.qmd | 2 +- .../HighPearsonCorrelation.qmd | 2 +- .../data_validation/IQROutliersBarPlot.qmd | 2 +- .../data_validation/IQROutliersTable.qmd | 2 +- .../IsolationForestOutliers.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 2 +- .../LaggedCorrelationHeatmap.qmd | 2 +- .../tests/data_validation/MissingValues.qmd | 2 +- .../data_validation/MissingValuesBarPlot.qmd | 2 +- .../data_validation/MutualInformation.qmd | 2 +- .../data_validation/PhillipsPerronArch.qmd | 2 +- .../ProtectedClassesDisparity.qmd | 2 +- .../data_validation/RollingStatsPlot.qmd | 2 +- .../data_validation/ScoreBandDefaultRates.qmd | 2 +- .../data_validation/SeasonalDecompose.qmd | 2 +- .../tests/data_validation/SpreadPlot.qmd | 2 +- .../TabularCategoricalBarPlots.qmd | 2 +- .../TabularDateTimeHistograms.qmd | 2 +- .../TabularNumericalHistograms.qmd | 2 +- .../data_validation/TargetRateBarPlots.qmd | 2 +- .../data_validation/TimeSeriesFrequency.qmd | 2 +- .../data_validation/TimeSeriesLinePlot.qmd | 2 +- .../TimeSeriesMissingValues.qmd | 2 +- .../data_validation/TimeSeriesOutliers.qmd | 2 +- .../data_validation/TooManyZeroValues.qmd | 2 +- .../tests/data_validation/UniqueRows.qmd | 2 +- .../tests/data_validation/WOEBinPlots.qmd | 2 +- .../tests/data_validation/WOEBinTable.qmd | 2 +- .../data_validation/ZivotAndrewsArch.qmd | 2 +- .../tests/data_validation/nlp/CommonWords.qmd | 2 +- .../tests/data_validation/nlp/Hashtags.qmd | 2 +- .../tests/data_validation/nlp/Mentions.qmd | 2 +- .../tests/data_validation/nlp/StopWords.qmd | 2 +- .../data_validation/nlp/TextDescription.qmd | 2 +- .../ClusterSizeDistribution.qmd | 2 +- .../tests/model_validation/FeaturesAUC.qmd | 2 +- .../RegressionResidualsPlot.qmd | 2 +- .../sklearn/AdjustedMutualInformation.qmd | 2 +- .../sklearn/AdjustedRandIndex.qmd | 2 +- .../sklearn/CalibrationCurve.qmd | 2 +- .../sklearn/ClassifierPerformance.qmd | 2 +- .../ClassifierThresholdOptimization.qmd | 2 +- .../sklearn/ClusterCosineSimilarity.qmd | 2 +- .../sklearn/ClusterPerformanceMetrics.qmd | 2 +- .../sklearn/CompletenessScore.qmd | 2 +- .../sklearn/ConfusionMatrix.qmd | 2 +- .../sklearn/FeatureImportance.qmd | 2 +- .../sklearn/FowlkesMallowsScore.qmd | 2 +- .../sklearn/HomogeneityScore.qmd | 2 +- .../sklearn/HyperParametersTuning.qmd | 2 +- .../sklearn/KMeansClustersOptimization.qmd | 2 +- .../sklearn/MinimumAccuracy.qmd | 2 +- .../sklearn/MinimumF1Score.qmd | 2 +- .../sklearn/MinimumROCAUCScore.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 2 +- .../sklearn/OverfitDiagnosis.qmd | 2 +- .../sklearn/PermutationFeatureImportance.qmd | 2 +- .../sklearn/PopulationStabilityIndex.qmd | 2 +- .../sklearn/PrecisionRecallCurve.qmd | 2 +- .../model_validation/sklearn/ROCCurve.qmd | 2 +- .../sklearn/RegressionPerformance.qmd | 2 +- .../sklearn/RegressionR2Square.qmd | 2 +- .../sklearn/RegressionR2SquareComparison.qmd | 2 +- .../sklearn/RobustnessDiagnosis.qmd | 2 +- .../sklearn/SHAPGlobalImportance.qmd | 2 +- .../sklearn/ScoreProbabilityAlignment.qmd | 2 +- .../sklearn/SilhouettePlot.qmd | 2 +- .../sklearn/TrainingTestDegradation.qmd | 2 +- .../model_validation/sklearn/VMeasure.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 2 +- .../statsmodels/AutoARIMA.qmd | 2 +- .../statsmodels/DurbinWatsonTest.qmd | 2 +- .../statsmodels/KolmogorovSmirnov.qmd | 2 +- .../statsmodels/Lilliefors.qmd | 2 +- .../RegressionFeatureSignificance.qmd | 2 +- .../RegressionModelForecastPlot.qmd | 2 +- .../RegressionModelForecastPlotLevels.qmd | 2 +- .../RegressionModelSensitivityPlot.qmd | 2 +- .../statsmodels/RegressionModelSummary.qmd | 4 +- ...RegressionPermutationFeatureImportance.qmd | 2 +- .../statsmodels/statsutils.qmd | 2 +- .../tests/prompt_validation/Bias.qmd | 6 +- .../tests/prompt_validation/Clarity.qmd | 6 +- .../tests/prompt_validation/Conciseness.qmd | 6 +- .../tests/prompt_validation/Delimitation.qmd | 6 +- .../prompt_validation/NegativeInstruction.qmd | 6 +- .../tests/prompt_validation/Robustness.qmd | 2 +- .../tests/prompt_validation/Specificity.qmd | 6 +- .../prompt_validation/ai_powered_test.qmd | 6 +- docs/validmind/unit_metrics.qmd | 4 +- docs/validmind/vm_models.qmd | 30 ++-- 108 files changed, 248 insertions(+), 230 deletions(-) diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index c9cc9ee14..6ec3c22e5 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -36,6 +36,8 @@ = {%- if param.default is string and param.default.startswith("'") and param.default.endswith("'") -%} {{ param.default }} + {%- elif param.default is mapping and param.default.cls is defined -%} + {{ format_type(param.default, module, add_links) }} {%- else -%} {{ param.default }} {%- endif -%} diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index cf5a796b3..fb5d64149 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -4,9 +4,30 @@ {% macro format_type(type, module=None, add_links=false) %} {%- if type is mapping -%} - - {%- if type.kind == 'union' -%} - + {%- if type.cls is defined -%} + {%- if type.cls == "ExprAttribute" and type.values is sequence -%} + {%- for value in type.values -%} + {{ format_type(value, module, add_links) }} + {%- if not loop.last -%}.{%- endif -%} + {%- endfor -%} + {%- elif type.cls == "ExprName" -%} + {{ type.name }} + {%- elif type.cls == "ExprList" -%} + [ + {%- for elem in type.elements -%} + {{ format_type(elem, module, add_links) }} + {%- if not loop.last -%}, {%- endif -%} + {%- endfor -%} + ] + {%- elif type.cls == "ExprSet" -%} + { + {%- for elem in type.elements -%} + {{ format_type(elem, module, add_links) }} + {%- if not loop.last -%}, {%- endif -%} + {%- endfor -%} + } + {%- endif -%} + {%- elif type.kind == 'union' -%} Union[ {%- for t in type.types -%} {{ format_type(t, module, add_links) }} @@ -15,7 +36,6 @@ ] {%- elif type.kind == 'generic' -%} {%- if type.base == 'Callable' -%} - Callable[[ {%- for arg in type.args[:-1] -%} {{ format_type(arg, module, add_links) }} @@ -23,88 +43,84 @@ {%- endfor -%} ], {{ format_type(type.args[-1], module, add_links) }}] {%- elif type.base == 'Dict' -%} - Dict[{{ format_type(type.args[0], module, add_links) }}, {{ format_type(type.args[1], module, add_links) }}] {%- elif type.base == 'List' -%} List[{{ format_type(type.args[0], module, add_links) }}] {%- else -%} {{ type.base }}[{{ type.args | map(attribute='format_type') | join(', ') }}] {%- endif -%} - - {%- elif type.cls == "ExprAttribute" and type.values is sequence -%} - {{ type.values | map(attribute='name') | join('.') }} - {%- elif type.cls == "ExprSubscript" -%} - {{ format_type(type.left, module, add_links) }}[ - {%- if type.slice.cls == "ExprTuple" -%} - {%- for elem in type.slice.elements -%} - {%- if elem.cls == "ExprSubscript" and elem.left.cls == "ExprName" and elem.left.name == "Callable" -%} - [ - {%- for arg in elem.slice.elements[0].elements -%} - {{ format_type(arg, module, add_links) }} - {%- if not loop.last -%}, {%- endif -%} - {%- endfor -%} - ], {{ format_type(elem.slice.elements[1], module, add_links) }} - {%- else -%} - {{ format_type(elem, module, add_links) }} - {%- endif -%} + {%- elif type.cls == "ExprAttribute" and type.values is sequence -%} + {%- for value in type.values -%} + {{ format_type(value, module, add_links) }} + {%- if not loop.last -%}.{%- endif -%} + {%- endfor -%} + {%- elif type.cls == "ExprSubscript" -%} + {{ format_type(type.left, module, add_links) }}[ + {%- if type.slice.cls == "ExprTuple" -%} + {%- for elem in type.slice.elements -%} + {%- if elem.cls == "ExprSubscript" and elem.left.cls == "ExprName" and elem.left.name == "Callable" -%} + [ + {%- for arg in elem.slice.elements[0].elements -%} + {{ format_type(arg, module, add_links) }} + {%- if not loop.last -%}, {%- endif -%} + {%- endfor -%} + ], {{ format_type(elem.slice.elements[1], module, add_links) }} + {%- else -%} + {{ format_type(elem, module, add_links) }} + {%- endif -%} + {%- if not loop.last -%}, {%- endif -%} + {%- endfor -%} + {%- else -%} + {{ format_type(type.slice, module, add_links) }} + {%- endif -%} + ] + {%- elif type.cls == "ExprName" -%} + {%- if module and type.name in module.members and module.members[type.name].kind == "alias" -%} + {{ module.members[type.name].target_path }} + {%- elif type.name in type_keywords -%} + {{ type.name }} + {%- elif type.name|lower in builtin_types -%} + {{ type.name }} + {%- elif add_links and type.name not in type_keywords -%} + validmind.vm_models.{{ type.name }} + {%- else -%} + {{ type.name }} + {%- endif -%} + {%- elif type.cls == "ExprList" -%} + {%- for elem in type.elements -%} + {{ format_type(elem, module, add_links) }} {%- if not loop.last -%}, {%- endif -%} {%- endfor -%} - {%- else -%} - {{ format_type(type.slice, module, add_links) }} - {%- endif -%} - ] - {%- elif type.cls == "ExprName" -%} - - {%- if module and type.name in module.members and module.members[type.name].kind == "alias" -%} - {{ module.members[type.name].target_path }} - {%- elif type.name in type_keywords -%} - {{ type.name }} - {%- elif type.name|lower in builtin_types -%} - {{ type.name }} - {%- elif add_links and type.name not in type_keywords -%} + {%- elif type.cls == "ExprTuple" -%} + {%- for elem in type.elements -%} + {{ format_type(elem, module, add_links) }} + {%- if not loop.last -%}, {%- endif -%} + {%- endfor -%} + {%- elif type.cls == "ExprCall" -%} + {{ format_type(type.func, module, add_links) }}( + {%- for arg in type.args -%} + {{ format_type(arg, module, add_links) }} + {%- if not loop.last -%}, {%- endif -%} + {%- endfor -%} + ) + {%- elif type.cls == "ExprBinOp" -%} + {{ format_type(type.left, module, add_links) }}{{ type.op }}{{ format_type(type.right, module, add_links) }} + {%- elif type.name is defined and add_links and type.name not in ['str', 'dict', 'list', 'bool', 'int', 'float', 'Any', 'Union', 'Dict', 'List', 'Optional', 'Callable', 'Tuple'] -%} validmind.vm_models.{{ type.name }} + {%- elif type.cls == "ExprSubscript" and type.left.cls == "ExprName" and type.left.name == "Callable" -%} + Callable\[\[ + {%- for elem in type.slice.elements[0].elements -%} + {{ format_type(elem, module, add_links) }} + {%- if not loop.last -%}, {%- endif -%} + {%- endfor -%} + \], {{ format_type(type.slice.elements[1], module, add_links) }}\] {%- else -%} - {{ type.name }} - {%- endif -%} - {%- elif type.cls == "ExprList" -%} - - {%- for elem in type.elements -%} - {{ format_type(elem, module, add_links) }} - {%- if not loop.last -%}, {%- endif -%} - {%- endfor -%} - {%- elif type.cls == "ExprTuple" -%} - - {%- for elem in type.elements -%} - {{ format_type(elem, module, add_links) }} - {%- if not loop.last -%}, {%- endif -%} - {%- endfor -%} - {%- elif type.cls == "ExprCall" -%} - - {{ format_type(type.func, module, add_links) }}( - {%- for arg in type.args -%} - {{ format_type(arg, module, add_links) }} - {%- if not loop.last -%}, {%- endif -%} - {%- endfor -%} - ) - {%- elif type.cls == "ExprBinOp" -%} - - {{ format_type(type.left, module, add_links) }}{{ type.op }}{{ format_type(type.right, module, add_links) }} - {%- elif type.name is defined and add_links and type.name not in ['str', 'dict', 'list', 'bool', 'int', 'float', 'Any', 'Union', 'Dict', 'List', 'Optional', 'Callable', 'Tuple'] -%} - validmind.vm_models.{{ type.name }} - {%- elif type.cls == "ExprSubscript" and type.left.cls == "ExprName" and type.left.name == "Callable" -%} - Callable\[\[ - {%- for elem in type.slice.elements[0].elements -%} - {{ format_type(elem, module, add_links) }} - {%- if not loop.last -%}, {%- endif -%} - {%- endfor -%} - \], {{ format_type(type.slice.elements[1], module, add_links) }}\] - {%- else -%} - {%- if type.name in ['str', 'dict', 'list', 'bool', 'int', 'float'] -%} - {{ type.name if 'name' in type else type|string }} - {%- else -%} - {{ type.name if 'name' in type else type|string }} + {%- if type.name in ['str', 'dict', 'list', 'bool', 'int', 'float'] -%} + {{ type.name if 'name' in type else type|string }} + {%- else -%} + {{ type.name if 'name' in type else type|string }} + {%- endif -%} {%- endif -%} - {%- endif -%} {% else %} {%- if type in type_keywords -%} {{ type }} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 7ab8786a4..53ed1b7fa 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -55,7 +55,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -defget_test_suite(test_suite_id:str=None,section:str=None,\*args,\*\*kwargs)validmind.vm_models.TestSuite: +defget_test_suite(test_suite_id:str=None,section:str=None,\*args,\*\*kwargs)TestSuite: ::: @@ -78,7 +78,7 @@ This function provides an interface to retrieve the TestSuite instance for the c ::: {.signature} -definit(project:Optional\[str\]=None,api_key:Optional\[str\]=None,api_secret:Optional\[str\]=None,api_host:Optional\[str\]=None,model:Optional\[str\]=None,monitoring:bool=False,generate_descriptions:Optional\[bool\]=None): +definit(project:=None,api_key:=None,api_secret:=None,api_host:=None,model:=None,monitoring:bool=False,generate_descriptions:=None): ::: @@ -108,7 +108,7 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True)validmind.vm_models.VMDataset: +definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True)VMDataset: ::: @@ -149,7 +149,7 @@ The following dataset types are supported: ::: {.signature} -definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs)validmind.vm_models.VMModel: +definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs)VMModel: ::: @@ -179,7 +179,7 @@ Initializes a VM Model, which can then be passed to other functions that can per ::: {.signature} -definit_r_model(model_path:str,input_id:str='model')validmind.vm_models.VMModel: +definit_r_model(model_path:str,input_id:str='model')VMModel: ::: @@ -211,7 +211,7 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ::: {.signature} -deflog_metric(key:str,value:float,inputs:Optional\[List\[str\]\]=None,params:Optional\[Dict\[str, Any\]\]=None,recorded_at:Optional\[str\]=None,thresholds:Optional\[Dict\[str, Any\]\]=None): +deflog_metric(key:str,value:float,inputs:=None,params:=None,recorded_at:=None,thresholds:=None): ::: @@ -445,7 +445,7 @@ Holds raw data for a test result ::: {.signature} -RawData(log:bool=False,\*\*kwargs) +RawData(log:bool=False,\*\*kwargs) ::: @@ -466,7 +466,7 @@ Create a new RawData object ::: {.signature} -definspect(self,show:bool=True): +definspect(self,show:bool=True): ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index df4a1a88c..a03a186e5 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -838,7 +838,7 @@ returns a non-JSON string or if the API returns a non-standard error ::: {.signature} -defshould_raise_on_fail_fast(error)bool: +defshould_raise_on_fail_fast(error)bool: ::: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 6beb85e42..f405ad64a 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,7 +29,7 @@ Entrypoint for test suites. ::: {.signature} -defformat_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +defformat_dataframe(df:): ::: @@ -57,7 +57,7 @@ Get a logger for the given module name ::: {.signature} -deftest_id_to_name(test_id:str)str: +deftest_id_to_name(test_id:str)str: ::: @@ -81,7 +81,7 @@ Convert a test ID to a human-readable name. ::: {.signature} -defdescribe_suite(test_suite_id:str,verbose=False): +defdescribe_suite(test_suite_id:str,verbose=False): ::: @@ -106,7 +106,7 @@ Describes a Test Suite by ID ::: {.signature} -defget_by_id(test_suite_id:str): +defget_by_id(test_suite_id:str): ::: @@ -122,7 +122,7 @@ Returns the test suite by ID ::: {.signature} -deflist_suites(pretty:bool=True): +deflist_suites(pretty:bool=True): ::: @@ -138,7 +138,7 @@ Returns a list of all available test suites ::: {.signature} -defregister_test_suite(suite_id:str,suite:TestSuite): +defregister_test_suite(suite_id:str,suite:TestSuite): ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 2a750b4ad..48181af11 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -20,7 +20,7 @@ ValidMind Tests Module ::: {.signature} -defdescribe_test(test_id:TestID=None,raw:bool=False,show:bool=True): +defdescribe_test(test_id:TestID=None,raw:bool=False,show:bool=True): ::: @@ -115,7 +115,7 @@ List all tests in the tests directory. ::: {.signature} -defload_test(test_id:str,test_func:callable=None,reload:bool=False): +defload_test(test_id:str,test_func:callable=None,reload:bool=False): ::: @@ -136,7 +136,7 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. ::: {.signature} -defrun_test(test_id:Union\[TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[\[TestResult\], None, None\]=None,\*\*kwargs)validmind.vm_models.TestResult: +defrun_test(test_id:=None,name:=None,unit_metrics:=None,inputs:=None,input_grid:=None,params:=None,param_grid:=None,show:bool=True,generate_description:bool=True,title:=None,post_process_fn:=None,\*\*kwargs)TestResult: ::: @@ -256,7 +256,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -defregister_test_provider(namespace:str,test_provider:TestProvider)None: +defregister_test_provider(namespace:str,test_provider:TestProvider)None: ::: @@ -357,7 +357,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str): +defload_test(test_id:str): ::: @@ -402,7 +402,7 @@ Protocol for user-defined test providers ::: {.signature} -deflist_tests()List\[str\]: +deflist_tests(): ::: @@ -420,7 +420,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str)callable: +defload_test(test_id:str)callable: ::: diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index ca79aaffe..7babb1fdb 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defACFandPACFPlot(dataset:VMDataset): +defACFandPACFPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index ccd7f7026..9e187571c 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defADF(dataset:VMDataset): +defADF(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 4cac96f7f..63ce1a588 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoAR(dataset:VMDataset,max_ar_order:int=3): +defAutoAR(dataset:VMDataset,max_ar_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index 344277dde..de791697f 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoMA(dataset:VMDataset,max_ma_order:int=3): +defAutoMA(dataset:VMDataset,max_ma_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index cad3ad199..e6eb9ccea 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): +defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 698252d9c..a74dd8892 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple\[Dict\[str, Any\], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool\]: +defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10): ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index f5213b8f6..527273846 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defDatasetDescription(dataset:VMDataset): +defDatasetDescription(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index e1d33478d..21d4b1b4c 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defDatasetSplit(datasets:List\[VMDataset\]): +defDatasetSplit(datasets:): ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 87d22ea0c..333c7e616 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defformat_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict\[str, Any\]\]: +defformat_records(df:): ::: @@ -36,7 +36,7 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -defDescriptiveStatistics(dataset:VMDataset): +defDescriptiveStatistics(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 4471d5622..b7602b4f7 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defDickeyFullerGLS(dataset:VMDataset): +defDickeyFullerGLS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 73933e575..84e8e9d00 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): +defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 355c735ac..a847bebb5 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): +defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index b927b9f82..3cc871bfe 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): +defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 66c71ce50..5d275c01b 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): +defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 9075f4908..9deb6dac9 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): +defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index 101794a5c..4c72c50a6 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): +defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 17bd0c331..9fe999ffe 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defKPSS(dataset:VMDataset): +defKPSS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index fe5fb6cff..d3cb6f962 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): +defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 93b154bc2..a9ff339a1 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMissingValues(dataset:VMDataset,min_threshold:int=1): +defMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index ca3291ba5..4b1fe6682 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): +defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 3d2d50715..9d6d95fd5 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): +defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 5d1f5fe9f..747c04cea 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defPhillipsPerronArch(dataset:VMDataset): +defPhillipsPerronArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 95986bd17..f8b9961d3 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics={'cls': 'ExprList', 'elements': ["'fnr'", "'fpr'", "'tpr'"]}): +defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=\['fnr', 'fpr', 'tpr'\]): ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index d4fa685c4..65c2d9376 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defRollingStatsPlot(dataset:VMDataset,window_size:int=12): +defRollingStatsPlot(dataset:VMDataset,window_size:int=12): ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index a83789c1e..18397c6bb 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): +defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 5498238bd..d58d720cf 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): +defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 51a875ce8..b4f684106 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defSpreadPlot(dataset:VMDataset): +defSpreadPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 3abcf1d8b..2fd767803 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTabularCategoricalBarPlots(dataset:VMDataset): +defTabularCategoricalBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 811ec0174..fc9013724 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTabularDateTimeHistograms(dataset:VMDataset): +defTabularDateTimeHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 7ee765c0a..8db60f1fe 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTabularNumericalHistograms(dataset:VMDataset): +defTabularNumericalHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 1ffc56f96..698633ff7 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTargetRateBarPlots(dataset:VMDataset): +defTargetRateBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 8d832dd8f..d950ea74b 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesFrequency(dataset:VMDataset): +defTimeSeriesFrequency(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index cbbd957dc..89c6f2c16 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesLinePlot(dataset:VMDataset): +defTimeSeriesLinePlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index e25586f12..0e7d10fd0 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): +defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 67c8bbade..0550e3a2f 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): +defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index f1315baba..eb9289e45 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): +defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index aef365665..6ee2e424b 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): +defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index bde4f6b65..75948ce2a 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): +defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index b42ff30b4..bcf87d249 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): +defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index f40003a53..d283f233f 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defZivotAndrewsArch(dataset:VMDataset): +defZivotAndrewsArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index fde585b90..7f1815bfc 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCommonWords(dataset:VMDataset): +defCommonWords(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 01396b686..d1ad73cba 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHashtags(dataset:VMDataset,top_hashtags:int=25): +defHashtags(dataset:VMDataset,top_hashtags:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 196569964..442bd37b5 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMentions(dataset:VMDataset,top_mentions:int=25): +defMentions(dataset:VMDataset,top_mentions:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index d722ece8d..d2f86b60d 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): +defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index d68b0d760..e11feac16 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defTextDescription(dataset:VMDataset,unwanted_tokens:set={'cls': 'ExprSet', 'elements': ["'s'", '"s'"', "'mr'", "'ms'", "'mrs'", "'dr'", '"'s"', "' '", '"''"', "'dollar'", "'us'", "'\`\`'"]},lang:str='english'): +defTextDescription(dataset:VMDataset,unwanted_tokens:set={'s', "s'", 'mr', 'ms', 'mrs', 'dr', "'s", ' ', "''", 'dollar', 'us', '\`\`'},lang:str='english'): ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 8c94b8863..40bc2d433 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterSizeDistribution(dataset:VMDataset,model:VMModel): +defClusterSizeDistribution(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index a61cf85ee..b409cfa21 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): +defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 7c45faa3a..ba8f35a43 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): +defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 50ef40888..a09cf9cb8 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): +defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 374537763..af793d03c 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defAdjustedRandIndex(model:VMModel,dataset:VMDataset): +defAdjustedRandIndex(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 4c64c8fd8..f242295e8 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): +defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index c337444b1..e9842dbab 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): +defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index bcd32f7c7..3ff0f94a7 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): +defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 06bb9c5f4..ebe73b169 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): +defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index d5398ed28..2c4dd6d7e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): +defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 417f69bea..848c65f17 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defCompletenessScore(model:VMModel,dataset:VMDataset): +defCompletenessScore(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 202d27ff8..5c5356704 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defConfusionMatrix(dataset:VMDataset,model:VMModel): +defConfusionMatrix(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 68bdab66e..72b8f576f 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): +defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 708bf2702..eecc3fb1e 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): +defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 1457001ff..c2917454b 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defHomogeneityScore(dataset:VMDataset,model:VMModel): +defHomogeneityScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 3dac3fbf5..cfb53657e 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\]=None,thresholds:Union\[float, List\[float\]\]=None,fit_params:dict=None): +defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:=None,thresholds:=None,fit_params:dict=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 1621564d8..3ec7df130 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union\[List\[int\], None\]=None): +defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 309cf2afc..e360ea825 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): +defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 5edb7ad93..2f71c5ecb 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): +defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index c2d759710..392a4250e 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): +defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 17535af26..7264d179c 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -24,7 +24,7 @@ toc-expand: 4 ::: {.signature} -defModelsPerformanceComparison(dataset:VMDataset,models:list\[VMModel\]): +defModelsPerformanceComparison(dataset:VMDataset,models:): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 4641daa4e..8df6153c9 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defOverfitDiagnosis(model:VMModel,datasets:List\[VMDataset\],metric:str=None,cut_off_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_THRESHOLD'}): +defOverfitDiagnosis(model:VMModel,datasets:,metric:str=None,cut_off_threshold:float=DEFAULT_THRESHOLD): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index bd49fd8b6..57a626fcc 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union\[int, None\]=None,figure_height:Union\[int, None\]=None): +defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:=None,figure_height:=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 56f609a3b..6d2579854 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -46,7 +46,7 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -defPopulationStabilityIndex(datasets:List\[VMDataset\],model:VMModel,num_bins:int=10,mode:str='fixed'): +defPopulationStabilityIndex(datasets:,model:VMModel,num_bins:int=10,mode:str='fixed'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index cb9ee031b..ac34807d5 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): +defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 468650c56..f8dff1fdf 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defROCCurve(model:VMModel,dataset:VMDataset): +defROCCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 3a60908a2..98d810e46 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionPerformance(model:VMModel,dataset:VMDataset): +defRegressionPerformance(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index d86b3f340..ea05c0c6c 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual:,predicted:,rowcount:int,featurecount:int): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 65ea7f405..d7b67f761 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual:,predicted:,rowcount:int,featurecount:int): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 004ce8f57..9fc0f18be 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRobustnessDiagnosis(datasets:List\[VMDataset\],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List\[float\]={'cls': 'ExprName', 'name': 'DEFAULT_STD_DEV_LIST'},performance_decay_threshold:float={'cls': 'ExprName', 'name': 'DEFAULT_DECAY_THRESHOLD'}): +defRobustnessDiagnosis(datasets:,model:VMModel,metric:str=None,scaling_factor_std_dev_list:=DEFAULT_STD_DEV_LIST,performance_decay_threshold:float=DEFAULT_DECAY_THRESHOLD): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index e91f0c05f..98ab56793 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -85,7 +85,7 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): +defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index db9527386..4c4c541c1 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): +defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 2b847a8ef..31e42e65d 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defSilhouettePlot(model:VMModel,dataset:VMDataset): +defSilhouettePlot(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 950376da3..72636b6a9 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defTrainingTestDegradation(datasets:List\[VMDataset\],model:VMModel,max_threshold:float=0.1): +defTrainingTestDegradation(datasets:,model:VMModel,max_threshold:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 6c212c722..a0b3d7c24 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defVMeasure(dataset:VMDataset,model:VMModel): +defVMeasure(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 65966e4e1..07f3e1431 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defWeakspotsDiagnosis(datasets:List\[VMDataset\],model:VMModel,features_columns:Union\[List\[str\], None\]=None,metrics:Union\[Dict\[str, Callable\], None\]=None,thresholds:Union\[Dict\[str, float\], None\]=None): +defWeakspotsDiagnosis(datasets:,model:VMModel,features_columns:=None,metrics:=None,thresholds:=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 9274ab1ce..4bcb1a0d6 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defAutoARIMA(model:VMModel,dataset:VMDataset): +defAutoARIMA(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 7aff2de0a..ab9bb5cbd 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defDurbinWatsonTest(dataset,model,threshold={'cls': 'ExprList', 'elements': ['1.5', '2.5']}): +defDurbinWatsonTest(dataset,model,threshold=\[1.5, 2.5\]): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 5aeb20426..e53c5d3fc 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): +defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index a1ba5e10d..cfdfa4af0 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defLilliefors(dataset:VMDataset): +defLilliefors(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 0415ffe67..0022b2435 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): +defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 8f0d68934..e22f9657d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union\[str, None\]=None,end_date:Union\[str, None\]=None): +defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:=None,end_date:=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index a435d9a72..b174b15b0 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): +defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 3dfed8d9e..5f6e90429 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List\[float\]={'cls': 'ExprList', 'elements': ['0.1']},transformation:Union\[str, None\]=None): +defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:=\[0.1\],transformation:=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index f627a35ac..184c64771 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual:,predicted:,rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -defRegressionModelSummary(dataset:VMDataset,model:VMModel): +defRegressionModelSummary(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index b284969d1..c2bd38976 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): +defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 8391d76e0..2f3c3480d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual:,predicted:,rowcount:int,featurecount:int): ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 5eb5c2a3e..db1c13e7c 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index c43a53a3c..45dfd8111 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 4ad08d7b2..76ab39fc9 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 318381ac7..0c1aa6ab2 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index ef2a6b0dc..a775c9790 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 276138b25..26b23edec 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index add772a11..0ea0665d5 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index 0c3286fa1..b0316eb68 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -30,7 +30,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -54,7 +54,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index b54009cdb..9e8375301 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defdescribe_metric(metric_id:str,\*\*kwargs): +defdescribe_metric(metric_id:str,\*\*kwargs): ::: @@ -46,7 +46,7 @@ List all metrics ::: {.signature} -defrun_metric(metric_id:str,\*\*kwargs): +defrun_metric(metric_id:str,\*\*kwargs): ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index e4bec51b2..c723ea641 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -126,7 +126,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -defget_default_config()dict: +defget_default_config()dict: ::: @@ -146,7 +146,7 @@ Each test in a test suite can accept parameters and those parameters can have de ::: {.signature} -defget_tests()List\[str\]: +defget_tests(): ::: @@ -160,7 +160,7 @@ Get all test suite test objects from all sections ::: {.signature} -defnum_tests()int: +defnum_tests()int: ::: @@ -206,7 +206,7 @@ This method will be called after the test suite has been run and all results hav ::: {.signature} -defrun(send:bool=True,fail_fast:bool=False): +defrun(send:bool=True,fail_fast:bool=False): ::: @@ -225,7 +225,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -defsummarize(show_link:bool=True): +defsummarize(show_link:bool=True): ::: @@ -291,7 +291,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -defassign_predictions(model:VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): +defassign_predictions(model:VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): ::: @@ -315,7 +315,7 @@ Assign predictions and probabilities to the dataset. ::: {.signature} -defprediction_column(model:VMModel,column_name:str=None)str: +defprediction_column(model:VMModel,column_name:str=None)str: ::: @@ -329,7 +329,7 @@ Get or set the prediction column for a model. ::: {.signature} -defprobability_column(model:VMModel,column_name:str=None)str: +defprobability_column(model:VMModel,column_name:str=None)str: ::: @@ -357,7 +357,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMDataset: +defwith_options(\*\*kwargs)VMDataset: ::: @@ -394,7 +394,7 @@ Returns a dataframe containing only the feature columns ::: {.signature} -defy_df(){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +defy_df(): ::: @@ -408,7 +408,7 @@ Returns a dataframe containing the target column ::: {.signature} -defy_pred(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: +defy_pred(model): ::: @@ -432,7 +432,7 @@ Attempts to stack complex prediction types (e.g., embeddings) into a single, mul ::: {.signature} -defy_pred_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +defy_pred_df(model): ::: @@ -446,7 +446,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -defy_prob(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: +defy_prob(model): ::: @@ -468,7 +468,7 @@ Returns the probabilities for a given model. ::: {.signature} -defy_prob_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +defy_prob_df(model): ::: @@ -500,7 +500,7 @@ Base class for ValidMind Input types ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMInput: +defwith_options(\*\*kwargs)VMInput: ::: From cf3dcc8c9b6c20aaea14277379eef3f23fdd66e6 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Thu, 20 Feb 2025 17:26:44 -0800 Subject: [PATCH 087/207] Save point before descending into experimental darkness --- docs/templates/macros/decorators.jinja2 | 9 ++ docs/templates/macros/signatures.jinja2 | 2 + docs/templates/macros/types.jinja2 | 125 ++++++++---------- .../tests/data_validation/ACFandPACFPlot.qmd | 1 + docs/validmind/tests/data_validation/ADF.qmd | 1 + .../tests/data_validation/AutoAR.qmd | 1 + .../tests/data_validation/AutoMA.qmd | 1 + .../data_validation/AutoStationarity.qmd | 1 + .../data_validation/BivariateScatterPlots.qmd | 1 + .../tests/data_validation/BoxPierce.qmd | 1 + .../ChiSquaredFeaturesTable.qmd | 1 + .../tests/data_validation/ClassImbalance.qmd | 1 + .../data_validation/DatasetDescription.qmd | 1 + .../tests/data_validation/DatasetSplit.qmd | 1 + .../data_validation/DescriptiveStatistics.qmd | 1 + .../tests/data_validation/DickeyFullerGLS.qmd | 1 + .../tests/data_validation/Duplicates.qmd | 1 + .../data_validation/EngleGrangerCoint.qmd | 1 + .../FeatureTargetCorrelationPlot.qmd | 1 + .../tests/data_validation/HighCardinality.qmd | 1 + .../HighPearsonCorrelation.qmd | 1 + .../data_validation/IQROutliersBarPlot.qmd | 1 + .../data_validation/IQROutliersTable.qmd | 1 + .../IsolationForestOutliers.qmd | 1 + .../tests/data_validation/JarqueBera.qmd | 1 + docs/validmind/tests/data_validation/KPSS.qmd | 1 + .../tests/data_validation/LJungBox.qmd | 1 + .../LaggedCorrelationHeatmap.qmd | 1 + .../tests/data_validation/MissingValues.qmd | 1 + .../data_validation/MissingValuesBarPlot.qmd | 1 + .../data_validation/MutualInformation.qmd | 1 + .../PearsonCorrelationMatrix.qmd | 1 + .../data_validation/PhillipsPerronArch.qmd | 1 + .../ProtectedClassesCombination.qmd | 1 + .../ProtectedClassesDescription.qmd | 1 + .../ProtectedClassesDisparity.qmd | 3 +- .../ProtectedClassesThresholdOptimizer.qmd | 1 + .../data_validation/RollingStatsPlot.qmd | 1 + .../tests/data_validation/RunsTest.qmd | 1 + .../tests/data_validation/ScatterPlot.qmd | 1 + .../data_validation/ScoreBandDefaultRates.qmd | 1 + .../data_validation/SeasonalDecompose.qmd | 1 + .../tests/data_validation/ShapiroWilk.qmd | 1 + .../tests/data_validation/Skewness.qmd | 1 + .../tests/data_validation/SpreadPlot.qmd | 1 + .../TabularCategoricalBarPlots.qmd | 1 + .../TabularDateTimeHistograms.qmd | 1 + .../TabularDescriptionTables.qmd | 1 + .../TabularNumericalHistograms.qmd | 1 + .../data_validation/TargetRateBarPlots.qmd | 1 + .../data_validation/TimeSeriesDescription.qmd | 1 + .../TimeSeriesDescriptiveStatistics.qmd | 1 + .../data_validation/TimeSeriesFrequency.qmd | 1 + .../data_validation/TimeSeriesHistogram.qmd | 1 + .../data_validation/TimeSeriesLinePlot.qmd | 1 + .../TimeSeriesMissingValues.qmd | 1 + .../data_validation/TimeSeriesOutliers.qmd | 1 + .../data_validation/TooManyZeroValues.qmd | 1 + .../tests/data_validation/UniqueRows.qmd | 1 + .../tests/data_validation/WOEBinPlots.qmd | 1 + .../tests/data_validation/WOEBinTable.qmd | 1 + .../data_validation/ZivotAndrewsArch.qmd | 1 + .../tests/data_validation/nlp/CommonWords.qmd | 1 + .../tests/data_validation/nlp/Hashtags.qmd | 1 + .../data_validation/nlp/LanguageDetection.qmd | 1 + .../tests/data_validation/nlp/Mentions.qmd | 1 + .../nlp/PolarityAndSubjectivity.qmd | 1 + .../data_validation/nlp/Punctuations.qmd | 1 + .../tests/data_validation/nlp/Sentiment.qmd | 1 + .../tests/data_validation/nlp/StopWords.qmd | 1 + .../data_validation/nlp/TextDescription.qmd | 3 +- .../tests/data_validation/nlp/Toxicity.qmd | 1 + .../tests/model_validation/BertScore.qmd | 1 + .../tests/model_validation/BleuScore.qmd | 1 + .../ClusterSizeDistribution.qmd | 1 + .../model_validation/ContextualRecall.qmd | 1 + .../tests/model_validation/FeaturesAUC.qmd | 1 + .../tests/model_validation/MeteorScore.qmd | 1 + .../tests/model_validation/ModelMetadata.qmd | 1 + .../ModelPredictionResiduals.qmd | 1 + .../tests/model_validation/RegardScore.qmd | 1 + .../RegressionResidualsPlot.qmd | 1 + .../tests/model_validation/RougeScore.qmd | 1 + .../TimeSeriesPredictionWithCI.qmd | 1 + .../TimeSeriesPredictionsPlot.qmd | 1 + .../TimeSeriesR2SquareBySegments.qmd | 1 + .../tests/model_validation/TokenDisparity.qmd | 1 + .../tests/model_validation/ToxicityScore.qmd | 1 + .../sklearn/AdjustedMutualInformation.qmd | 1 + .../sklearn/AdjustedRandIndex.qmd | 1 + .../sklearn/CalibrationCurve.qmd | 1 + .../sklearn/ClassifierPerformance.qmd | 1 + .../ClassifierThresholdOptimization.qmd | 1 + .../sklearn/ClusterCosineSimilarity.qmd | 1 + .../sklearn/ClusterPerformanceMetrics.qmd | 1 + .../sklearn/CompletenessScore.qmd | 1 + .../sklearn/ConfusionMatrix.qmd | 1 + .../sklearn/FeatureImportance.qmd | 1 + .../sklearn/FowlkesMallowsScore.qmd | 1 + .../sklearn/HomogeneityScore.qmd | 1 + .../sklearn/HyperParametersTuning.qmd | 2 + .../sklearn/KMeansClustersOptimization.qmd | 1 + .../sklearn/MinimumAccuracy.qmd | 1 + .../sklearn/MinimumF1Score.qmd | 1 + .../sklearn/MinimumROCAUCScore.qmd | 1 + .../sklearn/ModelParameters.qmd | 1 + .../sklearn/ModelsPerformanceComparison.qmd | 1 + .../sklearn/OverfitDiagnosis.qmd | 1 + .../sklearn/PermutationFeatureImportance.qmd | 1 + .../sklearn/PopulationStabilityIndex.qmd | 1 + .../sklearn/PrecisionRecallCurve.qmd | 1 + .../model_validation/sklearn/ROCCurve.qmd | 1 + .../sklearn/RegressionErrors.qmd | 1 + .../sklearn/RegressionErrorsComparison.qmd | 1 + .../sklearn/RegressionPerformance.qmd | 1 + .../sklearn/RegressionR2Square.qmd | 1 + .../sklearn/RegressionR2SquareComparison.qmd | 1 + .../sklearn/RobustnessDiagnosis.qmd | 1 + .../sklearn/SHAPGlobalImportance.qmd | 1 + .../sklearn/ScoreProbabilityAlignment.qmd | 1 + .../sklearn/SilhouettePlot.qmd | 1 + .../sklearn/TrainingTestDegradation.qmd | 1 + .../model_validation/sklearn/VMeasure.qmd | 1 + .../sklearn/WeakspotsDiagnosis.qmd | 1 + .../statsmodels/AutoARIMA.qmd | 1 + .../CumulativePredictionProbabilities.qmd | 1 + .../statsmodels/DurbinWatsonTest.qmd | 3 +- .../statsmodels/GINITable.qmd | 1 + .../statsmodels/KolmogorovSmirnov.qmd | 1 + .../statsmodels/Lilliefors.qmd | 1 + .../PredictionProbabilitiesHistogram.qmd | 1 + .../statsmodels/RegressionCoeffs.qmd | 1 + .../RegressionFeatureSignificance.qmd | 1 + .../RegressionModelForecastPlot.qmd | 1 + .../RegressionModelForecastPlotLevels.qmd | 1 + .../RegressionModelSensitivityPlot.qmd | 3 +- .../statsmodels/RegressionModelSummary.qmd | 1 + ...RegressionPermutationFeatureImportance.qmd | 1 + .../statsmodels/ScorecardHistogram.qmd | 1 + .../tests/prompt_validation/Bias.qmd | 1 + .../tests/prompt_validation/Clarity.qmd | 1 + .../tests/prompt_validation/Conciseness.qmd | 1 + .../tests/prompt_validation/Delimitation.qmd | 1 + .../prompt_validation/NegativeInstruction.qmd | 1 + .../tests/prompt_validation/Robustness.qmd | 1 + .../tests/prompt_validation/Specificity.qmd | 1 + docs/validmind/vm_models.qmd | 7 +- 147 files changed, 218 insertions(+), 77 deletions(-) create mode 100644 docs/templates/macros/decorators.jinja2 diff --git a/docs/templates/macros/decorators.jinja2 b/docs/templates/macros/decorators.jinja2 new file mode 100644 index 000000000..2ada2b965 --- /dev/null +++ b/docs/templates/macros/decorators.jinja2 @@ -0,0 +1,9 @@ +{%- from 'macros/types.jinja2' import format_type -%} + +{%- macro render_decorators(member) -%} +{%- if member.decorators -%} +{%- for decorator in member.decorators -%} +
@{%- if decorator is mapping -%}{{ format_type(decorator.value) }}{%- else -%}{{ decorator }}{%- endif -%}
+{%- endfor -%} +{%- endif -%} +{%- endmacro -%} \ No newline at end of file diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index 6ec3c22e5..796a74992 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -1,9 +1,11 @@ {%- from 'macros/types.jinja2' import format_type -%} +{%- from 'macros/decorators.jinja2' import render_decorators -%} {%- macro render_signature(member) -%} ::: {.signature} +{{ render_decorators(member) }} {# Skip 'def' for constructors #} {%- if not (member.name == "__init__" and member.kind in ["method", "function"]) -%} diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index fb5d64149..df1393d9b 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -3,7 +3,19 @@ {% macro format_type(type, module=None, add_links=false) %} -{%- if type is mapping -%} +{%- if type is string -%} + {%- if type.startswith('{') and type.endswith('}') -%} + {{ format_type(type|fromjson, module, add_links) }} + {%- elif type.startswith("'") or type.startswith('"') -%} + {{ type }} + {%- elif type in type_keywords -%} + {{ type }} + {%- elif type|lower in builtin_types -%} + {{ type }} + {%- else -%} + {{ type }} + {%- endif -%} +{%- elif type is mapping -%} {%- if type.cls is defined -%} {%- if type.cls == "ExprAttribute" and type.values is sequence -%} {%- for value in type.values -%} @@ -11,7 +23,17 @@ {%- if not loop.last -%}.{%- endif -%} {%- endfor -%} {%- elif type.cls == "ExprName" -%} - {{ type.name }} + {%- if module and type.name in module.members and module.members[type.name].kind == "alias" -%} + {{ module.members[type.name].target_path }} + {%- elif type.name in type_keywords -%} + {{ type.name }} + {%- elif type.name|lower in builtin_types -%} + {{ type.name }} + {%- elif add_links and type.name not in type_keywords -%} + validmind.vm_models.{{ type.name }} + {%- else -%} + {{ type.name }} + {%- endif -%} {%- elif type.cls == "ExprList" -%} [ {%- for elem in type.elements -%} @@ -26,34 +48,6 @@ {%- if not loop.last -%}, {%- endif -%} {%- endfor -%} } - {%- endif -%} - {%- elif type.kind == 'union' -%} - Union[ - {%- for t in type.types -%} - {{ format_type(t, module, add_links) }} - {%- if not loop.last -%}, {%- endif -%} - {%- endfor -%} - ] - {%- elif type.kind == 'generic' -%} - {%- if type.base == 'Callable' -%} - Callable[[ - {%- for arg in type.args[:-1] -%} - {{ format_type(arg, module, add_links) }} - {%- if not loop.last -%}, {%- endif -%} - {%- endfor -%} - ], {{ format_type(type.args[-1], module, add_links) }}] - {%- elif type.base == 'Dict' -%} - Dict[{{ format_type(type.args[0], module, add_links) }}, {{ format_type(type.args[1], module, add_links) }}] - {%- elif type.base == 'List' -%} - List[{{ format_type(type.args[0], module, add_links) }}] - {%- else -%} - {{ type.base }}[{{ type.args | map(attribute='format_type') | join(', ') }}] - {%- endif -%} - {%- elif type.cls == "ExprAttribute" and type.values is sequence -%} - {%- for value in type.values -%} - {{ format_type(value, module, add_links) }} - {%- if not loop.last -%}.{%- endif -%} - {%- endfor -%} {%- elif type.cls == "ExprSubscript" -%} {{ format_type(type.left, module, add_links) }}[ {%- if type.slice.cls == "ExprTuple" -%} @@ -74,28 +68,6 @@ {{ format_type(type.slice, module, add_links) }} {%- endif -%} ] - {%- elif type.cls == "ExprName" -%} - {%- if module and type.name in module.members and module.members[type.name].kind == "alias" -%} - {{ module.members[type.name].target_path }} - {%- elif type.name in type_keywords -%} - {{ type.name }} - {%- elif type.name|lower in builtin_types -%} - {{ type.name }} - {%- elif add_links and type.name not in type_keywords -%} - validmind.vm_models.{{ type.name }} - {%- else -%} - {{ type.name }} - {%- endif -%} - {%- elif type.cls == "ExprList" -%} - {%- for elem in type.elements -%} - {{ format_type(elem, module, add_links) }} - {%- if not loop.last -%}, {%- endif -%} - {%- endfor -%} - {%- elif type.cls == "ExprTuple" -%} - {%- for elem in type.elements -%} - {{ format_type(elem, module, add_links) }} - {%- if not loop.last -%}, {%- endif -%} - {%- endfor -%} {%- elif type.cls == "ExprCall" -%} {{ format_type(type.func, module, add_links) }}( {%- for arg in type.args -%} @@ -105,31 +77,40 @@ ) {%- elif type.cls == "ExprBinOp" -%} {{ format_type(type.left, module, add_links) }}{{ type.op }}{{ format_type(type.right, module, add_links) }} - {%- elif type.name is defined and add_links and type.name not in ['str', 'dict', 'list', 'bool', 'int', 'float', 'Any', 'Union', 'Dict', 'List', 'Optional', 'Callable', 'Tuple'] -%} - validmind.vm_models.{{ type.name }} - {%- elif type.cls == "ExprSubscript" and type.left.cls == "ExprName" and type.left.name == "Callable" -%} - Callable\[\[ - {%- for elem in type.slice.elements[0].elements -%} - {{ format_type(elem, module, add_links) }} - {%- if not loop.last -%}, {%- endif -%} + {%- elif type.cls == "ExprDecorator" -%} + @{{ format_type(type.value, module, add_links) }} + {%- elif type.cls == "ExprInit" -%} + def __init__( + {%- for param in type.params -%} + {{ format_type(param, module, add_links) }} + {%- if not loop.last -%}, {% endif -%} {%- endfor -%} - \], {{ format_type(type.slice.elements[1], module, add_links) }}\] + ): {%- else -%} - {%- if type.name in ['str', 'dict', 'list', 'bool', 'int', 'float'] -%} - {{ type.name if 'name' in type else type|string }} - {%- else -%} - {{ type.name if 'name' in type else type|string }} - {%- endif -%} + {{ format_type(type|string, module, add_links) }} + {%- endif -%} + {%- elif type.kind is defined -%} + {%- if type.kind == "union" -%} + Union[ + {%- for t in type.types -%} + {{ format_type(t, module, add_links) }} + {%- if not loop.last -%}, {%- endif -%} + {%- endfor -%} + ] + {%- elif type.kind == "generic" -%} + {{ type.base }}[ + {%- for arg in type.args -%} + {{ format_type(arg, module, add_links) }} + {%- if not loop.last -%}, {%- endif -%} + {%- endfor -%} + ] {%- endif -%} -{% else %} - {%- if type in type_keywords -%} - {{ type }} - {%- elif type|lower in builtin_types -%} - {{ type }} {%- else -%} - {{ type }} + {{ format_type(type|string, module, add_links) }} {%- endif -%} -{% endif %} +{%- else -%} + {{ format_type(type|string, module, add_links) }} +{%- endif -%} {% endmacro %} {%- macro format_return_type(returns) -%} diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 7babb1fdb..494b0edd7 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defACFandPACFPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 9e187571c..c97e0fbdf 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defADF(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 63ce1a588..322fba42d 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defAutoAR(dataset:VMDataset,max_ar_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index de791697f..fc491e57a 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defAutoMA(dataset:VMDataset,max_ma_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index e6eb9ccea..2dcee236a 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index a695c316a..8eac32516 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defBivariateScatterPlots(dataset): ::: diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index cd4f570d7..001ca57aa 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defBoxPierce(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 39a2a0418..dd194522a 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defChiSquaredFeaturesTable(dataset,p_threshold=0.05): ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index a74dd8892..45362e1f0 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,6 +18,7 @@ Threshold based tests ::: {.signature} +
@
@
defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10): ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 527273846..8cbf85501 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defDatasetDescription(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 21d4b1b4c..1b01a70b6 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defDatasetSplit(datasets:): ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 333c7e616..6936dc67d 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -36,6 +36,7 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} +
@
@
defDescriptiveStatistics(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index b7602b4f7..2bc67b6af 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defDickeyFullerGLS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index fc3fd0159..01d2ad5f3 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defDuplicates(dataset,min_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 84e8e9d00..53f1157cf 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 7895fd0da..435662eee 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defFeatureTargetCorrelationPlot(dataset,fig_height=600): ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index a847bebb5..d8bb257af 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 3cc871bfe..d1861c503 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 5d275c01b..e11f855b0 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -26,6 +26,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 9deb6dac9..6f1390428 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -26,6 +26,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index 4c72c50a6..ac460401e 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index a5a44ffd7..fe28a85c7 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defJarqueBera(dataset): ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 9fe999ffe..b6fca7a3a 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defKPSS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 1853a1abe..72754017e 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defLJungBox(dataset): ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index d3cb6f962..812016e2c 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index a9ff339a1..83879dd5b 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 4b1fe6682..8338368ca 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 9d6d95fd5..f1198bf41 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): ::: diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index ec3388ee2..d3b7af302 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defPearsonCorrelationMatrix(dataset): ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 747c04cea..021a6814b 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defPhillipsPerronArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index aa529f75f..0162aeaf4 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defProtectedClassesCombination(dataset,model,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index 968322bfd..ef74749a0 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defProtectedClassesDescription(dataset,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index f8b9961d3..143f7813b 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=\['fnr', 'fpr', 'tpr'\]): +
@
@
+defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=['fnr', 'fpr', 'tpr']): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 24d6a4353..6b4a05ce5 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -100,6 +100,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defProtectedClassesThresholdOptimizer(dataset,pipeline=None,protected_classes=None,X_train=None,y_train=None): ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 65c2d9376..9ed0d60ec 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -26,6 +26,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defRollingStatsPlot(dataset:VMDataset,window_size:int=12): ::: diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 08d1fbfd5..72ca3c13b 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defRunsTest(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 481253842..78eff3929 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defScatterPlot(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 18397c6bb..2378dcf31 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index d58d720cf..cb6f4cb42 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): ::: diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 12d9c69b0..da8f4d461 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defShapiroWilk(dataset): ::: diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index e9429ba54..8890ffc7e 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defSkewness(dataset,max_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index b4f684106..55bc284bf 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defSpreadPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 2fd767803..f600add46 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTabularCategoricalBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index fc9013724..21dfa2993 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTabularDateTimeHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 04cf9333c..0325edf86 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -86,6 +86,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTabularDescriptionTables(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 8db60f1fe..869e01c84 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTabularNumericalHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 698633ff7..e19ecae15 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTargetRateBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 83a43f730..64619a280 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTimeSeriesDescription(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 05e4946b0..e55c65ee5 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTimeSeriesDescriptiveStatistics(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index d950ea74b..2159eb800 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTimeSeriesFrequency(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 5526602c3..0aba01ed6 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defTimeSeriesHistogram(dataset,nbins=30): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 89c6f2c16..871e8d61d 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTimeSeriesLinePlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index 0e7d10fd0..c6804cd8f 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 0550e3a2f..bb5bcbddd 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index eb9289e45..6739e3b48 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 6ee2e424b..ca342272e 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 75948ce2a..ddb553359 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index bcf87d249..edcb6b184 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index d283f233f..829f92bef 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defZivotAndrewsArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index 7f1815bfc..06692472b 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defCommonWords(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index d1ad73cba..cf592143b 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defHashtags(dataset:VMDataset,top_hashtags:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 7a570787b..718c7cf70 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defLanguageDetection(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 442bd37b5..4bfcb245d 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defMentions(dataset:VMDataset,top_mentions:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index 2ca6e7a71..2cecf356f 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defPolarityAndSubjectivity(dataset,threshold_subjectivity=0.5,threshold_polarity=0): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index 810478da0..f83aa5c65 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -18,6 +18,7 @@ Metrics functions for any Pandas-compatible datasets ::: {.signature} +
@
@
defPunctuations(dataset,count_mode='token'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index a38229b76..906a8e337 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defSentiment(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index d2f86b60d..4f7237243 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,6 +18,7 @@ Threshold based tests ::: {.signature} +
@
@
defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index e11feac16..e3cfaa87f 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -26,7 +26,8 @@ toc-expand: 4 ::: {.signature} -defTextDescription(dataset:VMDataset,unwanted_tokens:set={'s', "s'", 'mr', 'ms', 'mrs', 'dr', "'s", ' ', "''", 'dollar', 'us', '\`\`'},lang:str='english'): +
@
@
+defTextDescription(dataset:VMDataset,unwanted_tokens:set={'s', "s'", 'mr', 'ms', 'mrs', 'dr', "'s", ' ', "''", 'dollar', 'us', '``'},lang:str='english'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index 258c757cf..2956af705 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defToxicity(dataset): ::: diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index d29c3062d..aa9732b9f 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -38,6 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} +
@
@
defBertScore(dataset,model,evaluation_model='distilbert-base-uncased'): ::: diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 00abca1b9..f6c0a6379 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -38,6 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} +
@
@
defBleuScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 40bc2d433..1ffbc4371 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defClusterSizeDistribution(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 05f8e00ec..b84e0bd19 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -38,6 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} +
@
@
defContextualRecall(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index b409cfa21..eaed7ff11 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 431440991..e2e807695 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -38,6 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} +
@
@
defMeteorScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index 93e336ef6..be163b225 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -28,6 +28,7 @@ Attempts to extract all model info from a model object instance ::: {.signature} +
@
@
defModelMetadata(model): ::: diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index 52513c487..e061c22d9 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defModelPredictionResiduals(dataset,model,nbins=100,p_value_threshold=0.05,start_date=None,end_date=None): ::: diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index f92a95093..03cc0d67a 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -38,6 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} +
@
@
defRegardScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index ba8f35a43..3a01af423 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index aad1f1d6e..0b8b2c3dc 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defRougeScore(dataset,model,metric='rouge-1'): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index a8a62ee79..690e23971 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTimeSeriesPredictionWithCI(dataset,model,confidence=0.95): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index 7e4e27bcc..374d92726 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTimeSeriesPredictionsPlot(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 5e60257ee..a4c642888 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTimeSeriesR2SquareBySegments(dataset,model,segments=None): ::: diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index d4026de41..e38c15a0d 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTokenDisparity(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index a2f203c12..eb82c6182 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defToxicityScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index a09cf9cb8..4cc06ca8f 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index af793d03c..a7970c3a4 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defAdjustedRandIndex(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index f242295e8..18c896896 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index e9842dbab..416cbe440 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 3ff0f94a7..bdae506d8 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index ebe73b169..922b8354c 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 2c4dd6d7e..6b9cd5a06 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 848c65f17..92402bab8 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defCompletenessScore(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 5c5356704..39dfca2e7 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defConfusionMatrix(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 72b8f576f..0ae36f10a 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index eecc3fb1e..a7cad5047 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index c2917454b..16bfb61a2 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defHomogeneityScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index cfb53657e..113b842fb 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defcustom_recall(y_true,y_pred_proba,threshold=0.5): ::: @@ -26,6 +27,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:=None,thresholds:=None,fit_params:dict=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 3ec7df130..d115b88ec 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index e360ea825..57b5e7d6c 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 2f71c5ecb..282ac88f9 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 392a4250e..8c20b674d 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index a372d15a9..ee6d4b404 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defModelParameters(model,model_params=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 7264d179c..b16de6697 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -24,6 +24,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defModelsPerformanceComparison(dataset:VMDataset,models:): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 8df6153c9..82c8432c6 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defOverfitDiagnosis(model:VMModel,datasets:,metric:str=None,cut_off_threshold:float=DEFAULT_THRESHOLD): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 57a626fcc..f830a0a01 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:=None,figure_height:=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 6d2579854..8834c72bf 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -46,6 +46,7 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} +
@
@
defPopulationStabilityIndex(datasets:,model:VMModel,num_bins:int=10,mode:str='fixed'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index ac34807d5..00eb3bba7 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index f8dff1fdf..0e2a9bcd6 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defROCCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index c82073976..00a7eef2d 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defRegressionErrors(model,dataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 0be0fcf5b..5852f90b8 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defRegressionErrorsComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 98d810e46..00eeb8462 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defRegressionPerformance(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index ea05c0c6c..5df703036 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -28,6 +28,7 @@ Adjusted R2 Score ::: {.signature} +
@
@
defRegressionR2Square(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index d7b67f761..56bf4cb6e 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -28,6 +28,7 @@ Adjusted R2 Score ::: {.signature} +
@
@
defRegressionR2SquareComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 9fc0f18be..2008d8c0d 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defRobustnessDiagnosis(datasets:,model:VMModel,metric:str=None,scaling_factor_std_dev_list:=DEFAULT_STD_DEV_LIST,performance_decay_threshold:float=DEFAULT_DECAY_THRESHOLD): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 98ab56793..0ff4135f7 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -85,6 +85,7 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} +
@
@
defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 4c4c541c1..964ebd079 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 31e42e65d..b4b0df115 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defSilhouettePlot(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 72636b6a9..15f241529 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defTrainingTestDegradation(datasets:,model:VMModel,max_threshold:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index a0b3d7c24..832233e8e 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defVMeasure(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 07f3e1431..b02ffce45 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defWeakspotsDiagnosis(datasets:,model:VMModel,features_columns:=None,metrics:=None,thresholds:=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 4bcb1a0d6..156d94409 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defAutoARIMA(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 10638c5ce..aae3a7871 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defCumulativePredictionProbabilities(dataset,model,title='Cumulative Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index ab9bb5cbd..257489405 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -defDurbinWatsonTest(dataset,model,threshold=\[1.5, 2.5\]): +
@
@
+defDurbinWatsonTest(dataset,model,threshold=[1.5, 2.5]): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index 94dd1da2d..7d4755f3c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defGINITable(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index e53c5d3fc..0fd37e5f3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index cfdfa4af0..20ac66fab 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defLilliefors(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index fab0a69b2..f4e8226e5 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defPredictionProbabilitiesHistogram(dataset,model,title='Histogram of Predictive Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index b006c9e14..c5917d33b 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defRegressionCoeffs(model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 0022b2435..74f9a9401 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index e22f9657d..e72bdc5ec 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:=None,end_date:=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index b174b15b0..40dbdc441 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -26,6 +26,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 5f6e90429..b49dfb7ac 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -40,7 +40,8 @@ Get a logger for the given module name ::: {.signature} -defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:=\[0.1\],transformation:=None): +
@
@
+defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:=[0.1],transformation:=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 184c64771..88ce5d62d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -28,6 +28,7 @@ Adjusted R2 Score ::: {.signature} +
@
@
defRegressionModelSummary(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index c2bd38976..677be7432 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -28,6 +28,7 @@ Get a logger for the given module name ::: {.signature} +
@
@
defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index 215ae3660..888e8fcd0 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -14,6 +14,7 @@ toc-expand: 4 ::: {.signature} +
@
@
defScorecardHistogram(dataset,title='Histogram of Scores',score_column='score'): ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index db1c13e7c..1aa333910 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -72,6 +72,7 @@ Explanation: " -> 8 ::: {.signature} +
@
@
defBias(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 45dfd8111..99ada4063 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -72,6 +72,7 @@ Explanation: " -> 8 ::: {.signature} +
@
@
defClarity(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 76ab39fc9..2f3f6296d 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -72,6 +72,7 @@ Explanation: " -> 8 ::: {.signature} +
@
@
defConciseness(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 0c1aa6ab2..945923940 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -72,6 +72,7 @@ Explanation: " -> 8 ::: {.signature} +
@
@
defDelimitation(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index a775c9790..b5b6a16e3 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -72,6 +72,7 @@ Explanation: " -> 8 ::: {.signature} +
@
@
defNegativeInstruction(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 26b23edec..119fa5973 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -28,6 +28,7 @@ Call LLM with the given prompts and return the response ::: {.signature} +
@
@
defRobustness(model,dataset,num_tests=10): ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 0ea0665d5..535dea452 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -72,6 +72,7 @@ Explanation: " -> 8 ::: {.signature} +
@
@
defSpecificity(model,min_threshold=7): ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index c723ea641..270234f49 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -18,6 +18,7 @@ Models entrypoint ::: {.signature} +
@dataclass
classFigure: ::: @@ -78,6 +79,7 @@ we would render images as-is, but Plotly FigureWidgets don't work well on Google ::: {.signature} +
@dataclass
classModelAttributes: ::: @@ -92,6 +94,7 @@ Model attributes definition ::: {.signature} +
@classmethod
deffrom_dict(cls,data): ::: @@ -108,6 +111,7 @@ Creates a ModelAttributes instance from a dictionary ::: {.signature} +
@dataclass
classTestSuite: ::: @@ -549,7 +553,8 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -defpredict(\*args,\*\*kwargs): +
@abstractmethod
+defpredict(*args,**kwargs): ::: From e75ce77f2f6006ac74d06589f34b74796c124926 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Thu, 20 Feb 2025 17:42:26 -0800 Subject: [PATCH 088/207] Minor type fix --- docs/templates/macros/types.jinja2 | 48 ++++++------------- docs/validmind.qmd | 16 +++---- docs/validmind/errors.qmd | 2 +- docs/validmind/test_suites.qmd | 12 ++--- docs/validmind/tests.qmd | 14 +++--- .../tests/data_validation/ACFandPACFPlot.qmd | 2 +- docs/validmind/tests/data_validation/ADF.qmd | 2 +- .../tests/data_validation/AutoAR.qmd | 4 +- .../tests/data_validation/AutoMA.qmd | 4 +- .../data_validation/AutoStationarity.qmd | 4 +- .../data_validation/BivariateScatterPlots.qmd | 2 +- .../tests/data_validation/BoxPierce.qmd | 2 +- .../ChiSquaredFeaturesTable.qmd | 2 +- .../tests/data_validation/ClassImbalance.qmd | 4 +- .../data_validation/DatasetDescription.qmd | 2 +- .../tests/data_validation/DatasetSplit.qmd | 4 +- .../data_validation/DescriptiveStatistics.qmd | 4 +- .../tests/data_validation/DickeyFullerGLS.qmd | 2 +- .../tests/data_validation/Duplicates.qmd | 2 +- .../data_validation/EngleGrangerCoint.qmd | 4 +- .../FeatureTargetCorrelationPlot.qmd | 2 +- .../tests/data_validation/HighCardinality.qmd | 4 +- .../HighPearsonCorrelation.qmd | 4 +- .../data_validation/IQROutliersBarPlot.qmd | 4 +- .../data_validation/IQROutliersTable.qmd | 4 +- .../IsolationForestOutliers.qmd | 4 +- .../tests/data_validation/JarqueBera.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 2 +- .../tests/data_validation/LJungBox.qmd | 2 +- .../LaggedCorrelationHeatmap.qmd | 4 +- .../tests/data_validation/MissingValues.qmd | 4 +- .../data_validation/MissingValuesBarPlot.qmd | 4 +- .../data_validation/MutualInformation.qmd | 4 +- .../PearsonCorrelationMatrix.qmd | 2 +- .../data_validation/PhillipsPerronArch.qmd | 2 +- .../ProtectedClassesCombination.qmd | 2 +- .../ProtectedClassesDescription.qmd | 2 +- .../ProtectedClassesDisparity.qmd | 4 +- .../ProtectedClassesThresholdOptimizer.qmd | 2 +- .../data_validation/RollingStatsPlot.qmd | 4 +- .../tests/data_validation/RunsTest.qmd | 2 +- .../tests/data_validation/ScatterPlot.qmd | 2 +- .../data_validation/ScoreBandDefaultRates.qmd | 4 +- .../data_validation/SeasonalDecompose.qmd | 4 +- .../tests/data_validation/ShapiroWilk.qmd | 2 +- .../tests/data_validation/Skewness.qmd | 2 +- .../tests/data_validation/SpreadPlot.qmd | 2 +- .../TabularCategoricalBarPlots.qmd | 2 +- .../TabularDateTimeHistograms.qmd | 2 +- .../TabularDescriptionTables.qmd | 2 +- .../TabularNumericalHistograms.qmd | 2 +- .../data_validation/TargetRateBarPlots.qmd | 2 +- .../data_validation/TimeSeriesDescription.qmd | 2 +- .../TimeSeriesDescriptiveStatistics.qmd | 2 +- .../data_validation/TimeSeriesFrequency.qmd | 2 +- .../data_validation/TimeSeriesHistogram.qmd | 2 +- .../data_validation/TimeSeriesLinePlot.qmd | 2 +- .../TimeSeriesMissingValues.qmd | 4 +- .../data_validation/TimeSeriesOutliers.qmd | 4 +- .../data_validation/TooManyZeroValues.qmd | 4 +- .../tests/data_validation/UniqueRows.qmd | 4 +- .../tests/data_validation/WOEBinPlots.qmd | 4 +- .../tests/data_validation/WOEBinTable.qmd | 4 +- .../data_validation/ZivotAndrewsArch.qmd | 2 +- .../tests/data_validation/nlp/CommonWords.qmd | 2 +- .../tests/data_validation/nlp/Hashtags.qmd | 4 +- .../data_validation/nlp/LanguageDetection.qmd | 2 +- .../tests/data_validation/nlp/Mentions.qmd | 4 +- .../nlp/PolarityAndSubjectivity.qmd | 2 +- .../data_validation/nlp/Punctuations.qmd | 2 +- .../tests/data_validation/nlp/Sentiment.qmd | 2 +- .../tests/data_validation/nlp/StopWords.qmd | 4 +- .../data_validation/nlp/TextDescription.qmd | 4 +- .../tests/data_validation/nlp/Toxicity.qmd | 2 +- .../tests/model_validation/BertScore.qmd | 2 +- .../tests/model_validation/BleuScore.qmd | 2 +- .../ClusterSizeDistribution.qmd | 2 +- .../model_validation/ContextualRecall.qmd | 2 +- .../tests/model_validation/FeaturesAUC.qmd | 4 +- .../tests/model_validation/MeteorScore.qmd | 2 +- .../tests/model_validation/ModelMetadata.qmd | 2 +- .../ModelPredictionResiduals.qmd | 2 +- .../tests/model_validation/RegardScore.qmd | 2 +- .../RegressionResidualsPlot.qmd | 4 +- .../tests/model_validation/RougeScore.qmd | 2 +- .../TimeSeriesPredictionWithCI.qmd | 2 +- .../TimeSeriesPredictionsPlot.qmd | 2 +- .../TimeSeriesR2SquareBySegments.qmd | 2 +- .../tests/model_validation/TokenDisparity.qmd | 2 +- .../tests/model_validation/ToxicityScore.qmd | 2 +- .../sklearn/AdjustedMutualInformation.qmd | 2 +- .../sklearn/AdjustedRandIndex.qmd | 2 +- .../sklearn/CalibrationCurve.qmd | 4 +- .../sklearn/ClassifierPerformance.qmd | 4 +- .../ClassifierThresholdOptimization.qmd | 2 +- .../sklearn/ClusterCosineSimilarity.qmd | 2 +- .../sklearn/ClusterPerformanceMetrics.qmd | 2 +- .../sklearn/CompletenessScore.qmd | 2 +- .../sklearn/ConfusionMatrix.qmd | 2 +- .../sklearn/FeatureImportance.qmd | 4 +- .../sklearn/FowlkesMallowsScore.qmd | 2 +- .../sklearn/HomogeneityScore.qmd | 2 +- .../sklearn/HyperParametersTuning.qmd | 6 +-- .../sklearn/KMeansClustersOptimization.qmd | 4 +- .../sklearn/MinimumAccuracy.qmd | 4 +- .../sklearn/MinimumF1Score.qmd | 4 +- .../sklearn/MinimumROCAUCScore.qmd | 4 +- .../sklearn/ModelParameters.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 4 +- .../sklearn/OverfitDiagnosis.qmd | 4 +- .../sklearn/PermutationFeatureImportance.qmd | 4 +- .../sklearn/PopulationStabilityIndex.qmd | 4 +- .../sklearn/PrecisionRecallCurve.qmd | 2 +- .../model_validation/sklearn/ROCCurve.qmd | 2 +- .../sklearn/RegressionErrors.qmd | 2 +- .../sklearn/RegressionErrorsComparison.qmd | 2 +- .../sklearn/RegressionPerformance.qmd | 2 +- .../sklearn/RegressionR2Square.qmd | 4 +- .../sklearn/RegressionR2SquareComparison.qmd | 4 +- .../sklearn/RobustnessDiagnosis.qmd | 4 +- .../sklearn/SHAPGlobalImportance.qmd | 4 +- .../sklearn/ScoreProbabilityAlignment.qmd | 4 +- .../sklearn/SilhouettePlot.qmd | 2 +- .../sklearn/TrainingTestDegradation.qmd | 4 +- .../model_validation/sklearn/VMeasure.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 4 +- .../statsmodels/AutoARIMA.qmd | 2 +- .../CumulativePredictionProbabilities.qmd | 2 +- .../statsmodels/DurbinWatsonTest.qmd | 2 +- .../statsmodels/GINITable.qmd | 2 +- .../statsmodels/KolmogorovSmirnov.qmd | 4 +- .../statsmodels/Lilliefors.qmd | 2 +- .../PredictionProbabilitiesHistogram.qmd | 2 +- .../statsmodels/RegressionCoeffs.qmd | 2 +- .../RegressionFeatureSignificance.qmd | 4 +- .../RegressionModelForecastPlot.qmd | 4 +- .../RegressionModelForecastPlotLevels.qmd | 2 +- .../RegressionModelSensitivityPlot.qmd | 4 +- .../statsmodels/RegressionModelSummary.qmd | 4 +- ...RegressionPermutationFeatureImportance.qmd | 4 +- .../statsmodels/ScorecardHistogram.qmd | 2 +- .../statsmodels/statsutils.qmd | 2 +- .../tests/prompt_validation/Bias.qmd | 8 ++-- .../tests/prompt_validation/Clarity.qmd | 8 ++-- .../tests/prompt_validation/Conciseness.qmd | 8 ++-- .../tests/prompt_validation/Delimitation.qmd | 8 ++-- .../prompt_validation/NegativeInstruction.qmd | 8 ++-- .../tests/prompt_validation/Robustness.qmd | 4 +- .../tests/prompt_validation/Specificity.qmd | 8 ++-- .../prompt_validation/ai_powered_test.qmd | 6 +-- docs/validmind/unit_metrics.qmd | 4 +- docs/validmind/vm_models.qmd | 40 ++++++++-------- 152 files changed, 282 insertions(+), 302 deletions(-) diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index df1393d9b..6c12f027b 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -3,19 +3,7 @@ {% macro format_type(type, module=None, add_links=false) %} -{%- if type is string -%} - {%- if type.startswith('{') and type.endswith('}') -%} - {{ format_type(type|fromjson, module, add_links) }} - {%- elif type.startswith("'") or type.startswith('"') -%} - {{ type }} - {%- elif type in type_keywords -%} - {{ type }} - {%- elif type|lower in builtin_types -%} - {{ type }} - {%- else -%} - {{ type }} - {%- endif -%} -{%- elif type is mapping -%} +{%- if type is mapping -%} {%- if type.cls is defined -%} {%- if type.cls == "ExprAttribute" and type.values is sequence -%} {%- for value in type.values -%} @@ -68,26 +56,8 @@ {{ format_type(type.slice, module, add_links) }} {%- endif -%} ] - {%- elif type.cls == "ExprCall" -%} - {{ format_type(type.func, module, add_links) }}( - {%- for arg in type.args -%} - {{ format_type(arg, module, add_links) }} - {%- if not loop.last -%}, {%- endif -%} - {%- endfor -%} - ) - {%- elif type.cls == "ExprBinOp" -%} - {{ format_type(type.left, module, add_links) }}{{ type.op }}{{ format_type(type.right, module, add_links) }} - {%- elif type.cls == "ExprDecorator" -%} - @{{ format_type(type.value, module, add_links) }} - {%- elif type.cls == "ExprInit" -%} - def __init__( - {%- for param in type.params -%} - {{ format_type(param, module, add_links) }} - {%- if not loop.last -%}, {% endif -%} - {%- endfor -%} - ): {%- else -%} - {{ format_type(type|string, module, add_links) }} + {{ type|string }} {%- endif -%} {%- elif type.kind is defined -%} {%- if type.kind == "union" -%} @@ -106,10 +76,20 @@ ] {%- endif -%} {%- else -%} - {{ format_type(type|string, module, add_links) }} + {{ type|string }} + {%- endif -%} +{%- elif type is string -%} + {%- if type.startswith("'") or type.startswith('"') -%} + {{ type }} + {%- elif type in type_keywords -%} + {{ type }} + {%- elif type|lower in builtin_types -%} + {{ type }} + {%- else -%} + {{ type }} {%- endif -%} {%- else -%} - {{ format_type(type|string, module, add_links) }} + {{ type|string }} {%- endif -%} {% endmacro %} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 53ed1b7fa..90a4eb7ca 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -55,7 +55,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -defget_test_suite(test_suite_id:str=None,section:str=None,\*args,\*\*kwargs)TestSuite: +defget_test_suite(test_suite_id:str=None,section:str=None,\*args,\*\*kwargs)validmind.vm_models.TestSuite: ::: @@ -78,7 +78,7 @@ This function provides an interface to retrieve the TestSuite instance for the c ::: {.signature} -definit(project:=None,api_key:=None,api_secret:=None,api_host:=None,model:=None,monitoring:bool=False,generate_descriptions:=None): +definit(project:Optional\[str\]=None,api_key:Optional\[str\]=None,api_secret:Optional\[str\]=None,api_host:Optional\[str\]=None,model:Optional\[str\]=None,monitoring:bool=False,generate_descriptions:Optional\[bool\]=None): ::: @@ -108,7 +108,7 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True)VMDataset: +definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True)validmind.vm_models.VMDataset: ::: @@ -149,7 +149,7 @@ The following dataset types are supported: ::: {.signature} -definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs)VMModel: +definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs)validmind.vm_models.VMModel: ::: @@ -179,7 +179,7 @@ Initializes a VM Model, which can then be passed to other functions that can per ::: {.signature} -definit_r_model(model_path:str,input_id:str='model')VMModel: +definit_r_model(model_path:str,input_id:str='model')validmind.vm_models.VMModel: ::: @@ -211,7 +211,7 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ::: {.signature} -deflog_metric(key:str,value:float,inputs:=None,params:=None,recorded_at:=None,thresholds:=None): +deflog_metric(key:str,value:float,inputs:Optional\[List\[str\]\]=None,params:Optional\[Dict\[str, Any\]\]=None,recorded_at:Optional\[str\]=None,thresholds:Optional\[Dict\[str, Any\]\]=None): ::: @@ -445,7 +445,7 @@ Holds raw data for a test result ::: {.signature} -RawData(log:bool=False,\*\*kwargs) +RawData(log:bool=False,\*\*kwargs) ::: @@ -466,7 +466,7 @@ Create a new RawData object ::: {.signature} -definspect(self,show:bool=True): +definspect(self,show:bool=True): ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index a03a186e5..c31a20f51 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -838,7 +838,7 @@ returns a non-JSON string or if the API returns a non-standard error ::: {.signature} -defshould_raise_on_fail_fast(error)bool: +defshould_raise_on_fail_fast(error)bool: ::: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index f405ad64a..0e5a3f38e 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,7 +29,7 @@ Entrypoint for test suites. ::: {.signature} -defformat_dataframe(df:): +defformat_dataframe(df:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027pd\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027DataFrame\\u0027}]}")"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027pd\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027DataFrame\\u0027}]}": ::: @@ -57,7 +57,7 @@ Get a logger for the given module name ::: {.signature} -deftest_id_to_name(test_id:str)str: +deftest_id_to_name(test_id:str)str: ::: @@ -81,7 +81,7 @@ Convert a test ID to a human-readable name. ::: {.signature} -defdescribe_suite(test_suite_id:str,verbose=False): +defdescribe_suite(test_suite_id:str,verbose=False): ::: @@ -106,7 +106,7 @@ Describes a Test Suite by ID ::: {.signature} -defget_by_id(test_suite_id:str): +defget_by_id(test_suite_id:str): ::: @@ -122,7 +122,7 @@ Returns the test suite by ID ::: {.signature} -deflist_suites(pretty:bool=True): +deflist_suites(pretty:bool=True): ::: @@ -138,7 +138,7 @@ Returns a list of all available test suites ::: {.signature} -defregister_test_suite(suite_id:str,suite:TestSuite): +defregister_test_suite(suite_id:str,suite:TestSuite): ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 48181af11..de406f2ce 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -20,7 +20,7 @@ ValidMind Tests Module ::: {.signature} -defdescribe_test(test_id:TestID=None,raw:bool=False,show:bool=True): +defdescribe_test(test_id:TestID=None,raw:bool=False,show:bool=True): ::: @@ -115,7 +115,7 @@ List all tests in the tests directory. ::: {.signature} -defload_test(test_id:str,test_func:callable=None,reload:bool=False): +defload_test(test_id:str,test_func:callable=None,reload:bool=False): ::: @@ -136,7 +136,7 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. ::: {.signature} -defrun_test(test_id:=None,name:=None,unit_metrics:=None,inputs:=None,input_grid:=None,params:=None,param_grid:=None,show:bool=True,generate_description:bool=True,title:=None,post_process_fn:=None,\*\*kwargs)TestResult: +defrun_test(test_id:Union\[TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[\[TestResult\], None, None\]=None,\*\*kwargs)validmind.vm_models.TestResult: ::: @@ -256,7 +256,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -defregister_test_provider(namespace:str,test_provider:TestProvider)None: +defregister_test_provider(namespace:str,test_provider:TestProvider)None: ::: @@ -357,7 +357,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str): +defload_test(test_id:str): ::: @@ -402,7 +402,7 @@ Protocol for user-defined test providers ::: {.signature} -deflist_tests(): +deflist_tests()List\[str\]: ::: @@ -420,7 +420,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str)callable: +defload_test(test_id:str)callable: ::: diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 494b0edd7..bc131605d 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defACFandPACFPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index c97e0fbdf..bcba58060 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@
@
+
@()
@()
defADF(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 322fba42d..78892b42b 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@
@
-defAutoAR(dataset:VMDataset,max_ar_order:int=3): +
@()
@()
+defAutoAR(dataset:VMDataset,max_ar_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index fc491e57a..65536b570 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@
@
-defAutoMA(dataset:VMDataset,max_ma_order:int=3): +
@()
@()
+defAutoMA(dataset:VMDataset,max_ma_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 2dcee236a..0672f6619 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): +
@()
@()
+defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 8eac32516..2501de3f8 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defBivariateScatterPlots(dataset): ::: diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index 001ca57aa..32466c8d5 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defBoxPierce(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index dd194522a..229eab351 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defChiSquaredFeaturesTable(dataset,p_threshold=0.05): ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 45362e1f0..79195ae73 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,8 +18,8 @@ Threshold based tests ::: {.signature} -
@
@
-defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10): +
@()
@()
+defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple[Dict[str, Any], "{\u0027cls\u0027: \u0027ExprAttribute\u0027, \u0027values\u0027: [{\u0027cls\u0027: \u0027ExprName\u0027, \u0027name\u0027: \u0027go\u0027}, {\u0027cls\u0027: \u0027ExprName\u0027, \u0027name\u0027: \u0027Figure\u0027}]}", bool]: ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 8cbf85501..cabd0fb9b 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@
@
+
@()
@()
defDatasetDescription(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 1b01a70b6..a3be3be78 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defDatasetSplit(datasets:): +
@()
@()
+defDatasetSplit(datasets:List[VMDataset]): ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 6936dc67d..cd202bd75 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defformat_records(df:): +defformat_records(df:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027pd\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027DataFrame\\u0027}]}")List\[Dict\[str, Any\]\]: ::: @@ -36,7 +36,7 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -
@
@
+
@()
@()
defDescriptiveStatistics(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 2bc67b6af..b4fb80aab 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@
@
+
@()
@()
defDickeyFullerGLS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 01d2ad5f3..2d505593a 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defDuplicates(dataset,min_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 53f1157cf..31881e9eb 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): +
@()
@()
+defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 435662eee..9e48bbf34 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defFeatureTargetCorrelationPlot(dataset,fig_height=600): ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index d8bb257af..ab9115e0a 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): +
@()
@()
+defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index d1861c503..5739e48bc 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): +
@()
@()
+defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index e11f855b0..ca8a50ebb 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -26,8 +26,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): +
@()
@()
+defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 6f1390428..3b0f762b5 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -26,8 +26,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): +
@()
@()
+defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index ac460401e..f725019ce 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): +
@()
@()
+defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index fe28a85c7..be18415ad 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defJarqueBera(dataset): ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index b6fca7a3a..90cf7e2fa 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@
@
+
@()
@()
defKPSS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 72754017e..95ac10831 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defLJungBox(dataset): ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index 812016e2c..4ae4ee065 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): +
@()
@()
+defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 83879dd5b..ccefb4f98 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defMissingValues(dataset:VMDataset,min_threshold:int=1): +
@()
@()
+defMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 8338368ca..2eb0aa96e 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): +
@()
@()
+defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index f1198bf41..6bb8ae6d0 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): +
@()
@()
+defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): ::: diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index d3b7af302..c4017a0e1 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defPearsonCorrelationMatrix(dataset): ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 021a6814b..be9032271 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@
@
+
@()
@()
defPhillipsPerronArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 0162aeaf4..dd96ccb7f 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@
@
+
@()
@()
defProtectedClassesCombination(dataset,model,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index ef74749a0..af60c926b 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@
@
+
@()
@()
defProtectedClassesDescription(dataset,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 143f7813b..39996b820 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@
@
-defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=['fnr', 'fpr', 'tpr']): +
@()
@()
+defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=['fnr', 'fpr', 'tpr']): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 6b4a05ce5..80c7151e5 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -100,7 +100,7 @@ Get a logger for the given module name ::: {.signature} -
@
@
+
@()
@()
defProtectedClassesThresholdOptimizer(dataset,pipeline=None,protected_classes=None,X_train=None,y_train=None): ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 9ed0d60ec..5686b1032 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -26,8 +26,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defRollingStatsPlot(dataset:VMDataset,window_size:int=12): +
@()
@()
+defRollingStatsPlot(dataset:VMDataset,window_size:int=12): ::: diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 72ca3c13b..3198e7dd9 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defRunsTest(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 78eff3929..5bba23317 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defScatterPlot(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 2378dcf31..3c4556ed6 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): +
@()
@()
+defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index cb6f4cb42..fd96d2ae7 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@
@
-defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): +
@()
@()
+defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): ::: diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index da8f4d461..2c1be0720 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defShapiroWilk(dataset): ::: diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index 8890ffc7e..3834587db 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defSkewness(dataset,max_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 55bc284bf..0fe8aea5d 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defSpreadPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index f600add46..834bf91bf 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defTabularCategoricalBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 21dfa2993..5ea647c57 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defTabularDateTimeHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 0325edf86..1ff1b4dab 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -86,7 +86,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defTabularDescriptionTables(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 869e01c84..799ff5bf2 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defTabularNumericalHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index e19ecae15..8d1ed41aa 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defTargetRateBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 64619a280..3f9e0c806 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defTimeSeriesDescription(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index e55c65ee5..9c19a1fa6 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defTimeSeriesDescriptiveStatistics(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 2159eb800..dfc08f42c 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defTimeSeriesFrequency(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 0aba01ed6..34914ddc2 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@
@
+
@()
@()
defTimeSeriesHistogram(dataset,nbins=30): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 871e8d61d..5640697fe 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defTimeSeriesLinePlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index c6804cd8f..d5dffbd01 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): +
@()
@()
+defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index bb5bcbddd..5b6f72759 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): +
@()
@()
+defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 6739e3b48..0cb9dfece 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): +
@()
@()
+defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index ca342272e..8ba68f1bb 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): +
@()
@()
+defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index ddb553359..f101bdb41 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@
@
-defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): +
@()
@()
+defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index edcb6b184..c7a02bd23 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): +
@()
@()
+defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 829f92bef..b9fa644ce 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@
@
+
@()
@()
defZivotAndrewsArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index 06692472b..f29ab5a89 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defCommonWords(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index cf592143b..1f9734121 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defHashtags(dataset:VMDataset,top_hashtags:int=25): +
@()
@()
+defHashtags(dataset:VMDataset,top_hashtags:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 718c7cf70..c9030ce5a 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defLanguageDetection(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 4bfcb245d..9352bdf61 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defMentions(dataset:VMDataset,top_mentions:int=25): +
@()
@()
+defMentions(dataset:VMDataset,top_mentions:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index 2cecf356f..70a3732bc 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defPolarityAndSubjectivity(dataset,threshold_subjectivity=0.5,threshold_polarity=0): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index f83aa5c65..968fe55b1 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -18,7 +18,7 @@ Metrics functions for any Pandas-compatible datasets ::: {.signature} -
@
@
+
@()
@()
defPunctuations(dataset,count_mode='token'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index 906a8e337..d2e575ef9 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defSentiment(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index 4f7237243..7a4fc49e5 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,8 +18,8 @@ Threshold based tests ::: {.signature} -
@
@
-defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): +
@()
@()
+defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index e3cfaa87f..12c55218f 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -26,8 +26,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defTextDescription(dataset:VMDataset,unwanted_tokens:set={'s', "s'", 'mr', 'ms', 'mrs', 'dr', "'s", ' ', "''", 'dollar', 'us', '``'},lang:str='english'): +
@()
@()
+defTextDescription(dataset:VMDataset,unwanted_tokens:set={'s', "s'", 'mr', 'ms', 'mrs', 'dr', "'s", ' ', "''", 'dollar', 'us', '``'},lang:str='english'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index 2956af705..ac73abe91 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defToxicity(dataset): ::: diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index aa9732b9f..0186ea265 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@
@
+
@()
@()
defBertScore(dataset,model,evaluation_model='distilbert-base-uncased'): ::: diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index f6c0a6379..8505556a5 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@
@
+
@()
@()
defBleuScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 1ffbc4371..c77caa9d4 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defClusterSizeDistribution(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index b84e0bd19..6225dfd5e 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@
@
+
@()
@()
defContextualRecall(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index eaed7ff11..d46c6a55f 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@
@
-defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): +
@()
@()
+defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index e2e807695..60508b936 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@
@
+
@()
@()
defMeteorScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index be163b225..d5472f9e8 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -28,7 +28,7 @@ Attempts to extract all model info from a model object instance ::: {.signature} -
@
@
+
@()
@()
defModelMetadata(model): ::: diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index e061c22d9..a17d3b4c6 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defModelPredictionResiduals(dataset,model,nbins=100,p_value_threshold=0.05,start_date=None,end_date=None): ::: diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 03cc0d67a..284d375c1 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@
@
+
@()
@()
defRegardScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 3a01af423..1bc02faa5 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): +
@()
@()
+defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 0b8b2c3dc..6793f6489 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defRougeScore(dataset,model,metric='rouge-1'): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index 690e23971..fdd4e1ac1 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defTimeSeriesPredictionWithCI(dataset,model,confidence=0.95): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index 374d92726..ee2936703 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defTimeSeriesPredictionsPlot(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index a4c642888..1b7fb13dd 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defTimeSeriesR2SquareBySegments(dataset,model,segments=None): ::: diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index e38c15a0d..c1bacb900 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defTokenDisparity(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index eb82c6182..f96efc3a3 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defToxicityScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 4cc06ca8f..c3a713e5b 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index a7970c3a4..64d12e592 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defAdjustedRandIndex(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 18c896896..93ab513ff 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): +
@()
@()
+defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index 416cbe440..01f1dfe89 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): +
@()
@()
+defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index bdae506d8..cb460986c 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 922b8354c..9fded75b1 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 6b9cd5a06..61b96caff 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 92402bab8..f29e7c0de 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defCompletenessScore(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 39dfca2e7..48f5b0739 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defConfusionMatrix(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 0ae36f10a..58c012e84 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): +
@()
@()
+defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index a7cad5047..eaf053c33 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 16bfb61a2..256395140 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defHomogeneityScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 113b842fb..72a8dab63 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defcustom_recall(y_true,y_pred_proba,threshold=0.5): ::: @@ -27,8 +27,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:=None,thresholds:=None,fit_params:dict=None): +
@()
@()
+defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union[str, List, Dict]=None,thresholds:Union[float, List[float]]=None,fit_params:dict=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index d115b88ec..00ef76738 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:=None): +
@()
@()
+defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union[List[int], None]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 57b5e7d6c..a9c514d71 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): +
@()
@()
+defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 282ac88f9..1fa33ce44 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): +
@()
@()
+defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 8c20b674d..e8154b94b 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): +
@()
@()
+defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index ee6d4b404..6904bd191 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defModelParameters(model,model_params=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index b16de6697..eedb6fa36 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -24,8 +24,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defModelsPerformanceComparison(dataset:VMDataset,models:): +
@()
@()
+defModelsPerformanceComparison(dataset:VMDataset,models:list[VMModel]): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 82c8432c6..c85b330eb 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@
@
-defOverfitDiagnosis(model:VMModel,datasets:,metric:str=None,cut_off_threshold:float=DEFAULT_THRESHOLD): +
@()
@()
+defOverfitDiagnosis(model:VMModel,datasets:List[VMDataset],metric:str=None,cut_off_threshold:float=DEFAULT_THRESHOLD): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index f830a0a01..869dfb709 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@
@
-defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:=None,figure_height:=None): +
@()
@()
+defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union[int, None]=None,figure_height:Union[int, None]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 8834c72bf..67dfbb8e7 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -46,8 +46,8 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -
@
@
-defPopulationStabilityIndex(datasets:,model:VMModel,num_bins:int=10,mode:str='fixed'): +
@()
@()
+defPopulationStabilityIndex(datasets:List[VMDataset],model:VMModel,num_bins:int=10,mode:str='fixed'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 00eb3bba7..9a0d9b7d9 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 0e2a9bcd6..2ce3750b7 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defROCCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index 00a7eef2d..0babbe6f9 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defRegressionErrors(model,dataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 5852f90b8..4e90f7c19 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@
@
+
@()
@()
defRegressionErrorsComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 00eeb8462..0b58c0a38 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@
@
+
@()
@()
defRegressionPerformance(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 5df703036..03c1b39c6 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:,predicted:,rowcount:int,featurecount:int): +defadj_r2_score(actual:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}",predicted:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}",rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -
@
@
+
@()
@()
defRegressionR2Square(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 56bf4cb6e..7195d5a90 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:,predicted:,rowcount:int,featurecount:int): +defadj_r2_score(actual:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}",predicted:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}",rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -
@
@
+
@()
@()
defRegressionR2SquareComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 2008d8c0d..ddbe782c9 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@
@
-defRobustnessDiagnosis(datasets:,model:VMModel,metric:str=None,scaling_factor_std_dev_list:=DEFAULT_STD_DEV_LIST,performance_decay_threshold:float=DEFAULT_DECAY_THRESHOLD): +
@()
@()
+defRobustnessDiagnosis(datasets:List[VMDataset],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List[float]=DEFAULT_STD_DEV_LIST,performance_decay_threshold:float=DEFAULT_DECAY_THRESHOLD): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 0ff4135f7..cb039403f 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -85,8 +85,8 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -
@
@
-defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): +
@()
@()
+defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 964ebd079..ed17e5481 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): +
@()
@()
+defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index b4b0df115..df1ad0ff5 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defSilhouettePlot(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 15f241529..7ccbfc547 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defTrainingTestDegradation(datasets:,model:VMModel,max_threshold:float=0.1): +
@()
@()
+defTrainingTestDegradation(datasets:List[VMDataset],model:VMModel,max_threshold:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 832233e8e..d0deb4879 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defVMeasure(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index b02ffce45..35fe81057 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defWeakspotsDiagnosis(datasets:,model:VMModel,features_columns:=None,metrics:=None,thresholds:=None): +
@()
@()
+defWeakspotsDiagnosis(datasets:List[VMDataset],model:VMModel,features_columns:Union[List[str], None]=None,metrics:Union[Dict[str, Callable], None]=None,thresholds:Union[Dict[str, float], None]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 156d94409..5be083cc7 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@
@
+
@()
@()
defAutoARIMA(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index aae3a7871..4f75691d6 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defCumulativePredictionProbabilities(dataset,model,title='Cumulative Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 257489405..da2630cd1 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defDurbinWatsonTest(dataset,model,threshold=[1.5, 2.5]): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index 7d4755f3c..016a9c4c8 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defGINITable(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 0fd37e5f3..ef85a431b 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@
@
-defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): +
@()
@()
+defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 20ac66fab..6bdb2f58e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defLilliefors(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index f4e8226e5..1b18a5357 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defPredictionProbabilitiesHistogram(dataset,model,title='Histogram of Predictive Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index c5917d33b..b41e9d600 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defRegressionCoeffs(model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 74f9a9401..d8c31a176 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@
@
-defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): +
@()
@()
+defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index e72bdc5ec..8b7b607ec 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@
@
-defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:=None,end_date:=None): +
@()
@()
+defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union[str, None]=None,end_date:Union[str, None]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 40dbdc441..6bc38a2ec 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index b49dfb7ac..e648137f2 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -40,8 +40,8 @@ Get a logger for the given module name ::: {.signature} -
@
@
-defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:=[0.1],transformation:=None): +
@()
@()
+defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List[float]=[0.1],transformation:Union[str, None]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 88ce5d62d..975462a2b 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:,predicted:,rowcount:int,featurecount:int): +defadj_r2_score(actual:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}",predicted:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}",rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -
@
@
+
@()
@()
defRegressionModelSummary(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 677be7432..3d7a70b0c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@
@
-defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): +
@()
@()
+defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index 888e8fcd0..854c5bf1e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@
@
+
@()
@()
defScorecardHistogram(dataset,title='Histogram of Scores',score_column='score'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 2f3c3480d..8252d1866 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:,predicted:,rowcount:int,featurecount:int): +defadj_r2_score(actual:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}",predicted:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}",rowcount:int,featurecount:int): ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 1aa333910..8ade29c84 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@
@
+
@()
@()
defBias(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 99ada4063..7174de0b3 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@
@
+
@()
@()
defClarity(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 2f3f6296d..01c271c83 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@
@
+
@()
@()
defConciseness(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 945923940..bcec22c85 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@
@
+
@()
@()
defDelimitation(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index b5b6a16e3..66057bbf7 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@
@
+
@()
@()
defNegativeInstruction(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 119fa5973..00f70be23 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -28,7 +28,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -
@
@
+
@()
@()
defRobustness(model,dataset,num_tests=10): ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 535dea452..ee8377d4c 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@
@
+
@()
@()
defSpecificity(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index b0316eb68..5b00384f1 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -30,7 +30,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -54,7 +54,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 9e8375301..72c0cdd2d 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defdescribe_metric(metric_id:str,\*\*kwargs): +defdescribe_metric(metric_id:str,\*\*kwargs): ::: @@ -46,7 +46,7 @@ List all metrics ::: {.signature} -defrun_metric(metric_id:str,\*\*kwargs): +defrun_metric(metric_id:str,\*\*kwargs): ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 270234f49..6352f7e93 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -18,7 +18,7 @@ Models entrypoint ::: {.signature} -
@dataclass
+
@dataclass
classFigure: ::: @@ -79,7 +79,7 @@ we would render images as-is, but Plotly FigureWidgets don't work well on Google ::: {.signature} -
@dataclass
+
@dataclass
classModelAttributes: ::: @@ -94,7 +94,7 @@ Model attributes definition ::: {.signature} -
@classmethod
+
@classmethod
deffrom_dict(cls,data): ::: @@ -111,7 +111,7 @@ Creates a ModelAttributes instance from a dictionary ::: {.signature} -
@dataclass
+
@dataclass
classTestSuite: ::: @@ -130,7 +130,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -defget_default_config()dict: +defget_default_config()dict: ::: @@ -150,7 +150,7 @@ Each test in a test suite can accept parameters and those parameters can have de ::: {.signature} -defget_tests(): +defget_tests()List\[str\]: ::: @@ -164,7 +164,7 @@ Get all test suite test objects from all sections ::: {.signature} -defnum_tests()int: +defnum_tests()int: ::: @@ -210,7 +210,7 @@ This method will be called after the test suite has been run and all results hav ::: {.signature} -defrun(send:bool=True,fail_fast:bool=False): +defrun(send:bool=True,fail_fast:bool=False): ::: @@ -229,7 +229,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -defsummarize(show_link:bool=True): +defsummarize(show_link:bool=True): ::: @@ -295,7 +295,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -defassign_predictions(model:VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): +defassign_predictions(model:VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): ::: @@ -319,7 +319,7 @@ Assign predictions and probabilities to the dataset. ::: {.signature} -defprediction_column(model:VMModel,column_name:str=None)str: +defprediction_column(model:VMModel,column_name:str=None)str: ::: @@ -333,7 +333,7 @@ Get or set the prediction column for a model. ::: {.signature} -defprobability_column(model:VMModel,column_name:str=None)str: +defprobability_column(model:VMModel,column_name:str=None)str: ::: @@ -361,7 +361,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -defwith_options(\*\*kwargs)VMDataset: +defwith_options(\*\*kwargs)validmind.vm_models.VMDataset: ::: @@ -398,7 +398,7 @@ Returns a dataframe containing only the feature columns ::: {.signature} -defy_df(): +defy_df()"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027pd\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027DataFrame\\u0027}]}": ::: @@ -412,7 +412,7 @@ Returns a dataframe containing the target column ::: {.signature} -defy_pred(model): +defy_pred(model)"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}": ::: @@ -436,7 +436,7 @@ Attempts to stack complex prediction types (e.g., embeddings) into a single, mul ::: {.signature} -defy_pred_df(model): +defy_pred_df(model)"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027pd\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027DataFrame\\u0027}]}": ::: @@ -450,7 +450,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -defy_prob(model): +defy_prob(model)"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}": ::: @@ -472,7 +472,7 @@ Returns the probabilities for a given model. ::: {.signature} -defy_prob_df(model): +defy_prob_df(model)"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027pd\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027DataFrame\\u0027}]}": ::: @@ -504,7 +504,7 @@ Base class for ValidMind Input types ::: {.signature} -defwith_options(\*\*kwargs)VMInput: +defwith_options(\*\*kwargs)validmind.vm_models.VMInput: ::: @@ -553,7 +553,7 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -
@abstractmethod
+
@abstractmethod
defpredict(*args,**kwargs): ::: From a571db7fb32822a6013856ecd7cc203323131544 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Thu, 20 Feb 2025 18:01:27 -0800 Subject: [PATCH 089/207] Interim save point --- docs/templates/class.qmd.jinja2 | 4 +- docs/templates/macros/types.jinja2 | 2 +- docs/validmind/errors.qmd | 34 +++++++ docs/validmind/test_suites.qmd | 2 +- docs/validmind/tests.qmd | 28 ++++++ .../tests/data_validation/ACFandPACFPlot.qmd | 2 +- docs/validmind/tests/data_validation/ADF.qmd | 2 +- .../tests/data_validation/AutoAR.qmd | 2 +- .../tests/data_validation/AutoMA.qmd | 2 +- .../data_validation/AutoStationarity.qmd | 2 +- .../data_validation/BivariateScatterPlots.qmd | 2 +- .../tests/data_validation/BoxPierce.qmd | 2 +- .../ChiSquaredFeaturesTable.qmd | 2 +- .../tests/data_validation/ClassImbalance.qmd | 4 +- .../data_validation/DatasetDescription.qmd | 2 +- .../tests/data_validation/DatasetSplit.qmd | 2 +- .../data_validation/DescriptiveStatistics.qmd | 4 +- .../tests/data_validation/DickeyFullerGLS.qmd | 2 +- .../tests/data_validation/Duplicates.qmd | 2 +- .../data_validation/EngleGrangerCoint.qmd | 2 +- .../FeatureTargetCorrelationPlot.qmd | 2 +- .../tests/data_validation/HighCardinality.qmd | 2 +- .../HighPearsonCorrelation.qmd | 2 +- .../data_validation/IQROutliersBarPlot.qmd | 2 +- .../data_validation/IQROutliersTable.qmd | 2 +- .../IsolationForestOutliers.qmd | 2 +- .../tests/data_validation/JarqueBera.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 2 +- .../tests/data_validation/LJungBox.qmd | 2 +- .../LaggedCorrelationHeatmap.qmd | 2 +- .../tests/data_validation/MissingValues.qmd | 2 +- .../data_validation/MissingValuesBarPlot.qmd | 2 +- .../data_validation/MutualInformation.qmd | 2 +- .../PearsonCorrelationMatrix.qmd | 2 +- .../data_validation/PhillipsPerronArch.qmd | 2 +- .../ProtectedClassesCombination.qmd | 16 +++- .../ProtectedClassesDescription.qmd | 2 +- .../ProtectedClassesDisparity.qmd | 16 +++- .../ProtectedClassesThresholdOptimizer.qmd | 16 +++- .../data_validation/RollingStatsPlot.qmd | 2 +- .../tests/data_validation/RunsTest.qmd | 2 +- .../tests/data_validation/ScatterPlot.qmd | 2 +- .../data_validation/ScoreBandDefaultRates.qmd | 2 +- .../data_validation/SeasonalDecompose.qmd | 2 +- .../tests/data_validation/ShapiroWilk.qmd | 2 +- .../tests/data_validation/Skewness.qmd | 2 +- .../tests/data_validation/SpreadPlot.qmd | 2 +- .../TabularCategoricalBarPlots.qmd | 2 +- .../TabularDateTimeHistograms.qmd | 2 +- .../TabularDescriptionTables.qmd | 2 +- .../TabularNumericalHistograms.qmd | 2 +- .../data_validation/TargetRateBarPlots.qmd | 2 +- .../data_validation/TimeSeriesDescription.qmd | 2 +- .../TimeSeriesDescriptiveStatistics.qmd | 2 +- .../data_validation/TimeSeriesFrequency.qmd | 2 +- .../data_validation/TimeSeriesHistogram.qmd | 2 +- .../data_validation/TimeSeriesLinePlot.qmd | 2 +- .../TimeSeriesMissingValues.qmd | 2 +- .../data_validation/TimeSeriesOutliers.qmd | 2 +- .../data_validation/TooManyZeroValues.qmd | 2 +- .../tests/data_validation/UniqueRows.qmd | 2 +- .../tests/data_validation/WOEBinPlots.qmd | 2 +- .../tests/data_validation/WOEBinTable.qmd | 2 +- .../data_validation/ZivotAndrewsArch.qmd | 2 +- .../tests/data_validation/nlp/CommonWords.qmd | 2 +- .../tests/data_validation/nlp/Hashtags.qmd | 2 +- .../data_validation/nlp/LanguageDetection.qmd | 2 +- .../tests/data_validation/nlp/Mentions.qmd | 2 +- .../nlp/PolarityAndSubjectivity.qmd | 2 +- .../data_validation/nlp/Punctuations.qmd | 2 +- .../tests/data_validation/nlp/Sentiment.qmd | 2 +- .../tests/data_validation/nlp/StopWords.qmd | 2 +- .../data_validation/nlp/TextDescription.qmd | 2 +- .../tests/data_validation/nlp/Toxicity.qmd | 2 +- .../tests/model_validation/BertScore.qmd | 2 +- .../tests/model_validation/BleuScore.qmd | 2 +- .../ClusterSizeDistribution.qmd | 2 +- .../model_validation/ContextualRecall.qmd | 2 +- .../tests/model_validation/FeaturesAUC.qmd | 2 +- .../tests/model_validation/MeteorScore.qmd | 2 +- .../tests/model_validation/ModelMetadata.qmd | 2 +- .../ModelPredictionResiduals.qmd | 2 +- .../tests/model_validation/RegardScore.qmd | 2 +- .../RegressionResidualsPlot.qmd | 2 +- .../tests/model_validation/RougeScore.qmd | 2 +- .../TimeSeriesPredictionWithCI.qmd | 2 +- .../TimeSeriesPredictionsPlot.qmd | 2 +- .../TimeSeriesR2SquareBySegments.qmd | 2 +- .../tests/model_validation/TokenDisparity.qmd | 2 +- .../tests/model_validation/ToxicityScore.qmd | 2 +- .../sklearn/AdjustedMutualInformation.qmd | 2 +- .../sklearn/AdjustedRandIndex.qmd | 2 +- .../sklearn/CalibrationCurve.qmd | 2 +- .../sklearn/ClassifierPerformance.qmd | 2 +- .../ClassifierThresholdOptimization.qmd | 2 +- .../sklearn/ClusterCosineSimilarity.qmd | 2 +- .../sklearn/ClusterPerformanceMetrics.qmd | 2 +- .../sklearn/CompletenessScore.qmd | 2 +- .../sklearn/ConfusionMatrix.qmd | 2 +- .../sklearn/FeatureImportance.qmd | 2 +- .../sklearn/FowlkesMallowsScore.qmd | 2 +- .../sklearn/HomogeneityScore.qmd | 2 +- .../sklearn/HyperParametersTuning.qmd | 4 +- .../sklearn/KMeansClustersOptimization.qmd | 2 +- .../sklearn/MinimumAccuracy.qmd | 2 +- .../sklearn/MinimumF1Score.qmd | 2 +- .../sklearn/MinimumROCAUCScore.qmd | 2 +- .../sklearn/ModelParameters.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 2 +- .../sklearn/OverfitDiagnosis.qmd | 2 +- .../sklearn/PermutationFeatureImportance.qmd | 2 +- .../sklearn/PopulationStabilityIndex.qmd | 2 +- .../sklearn/PrecisionRecallCurve.qmd | 2 +- .../model_validation/sklearn/ROCCurve.qmd | 2 +- .../sklearn/RegressionErrors.qmd | 2 +- .../sklearn/RegressionErrorsComparison.qmd | 2 +- .../sklearn/RegressionPerformance.qmd | 2 +- .../sklearn/RegressionR2Square.qmd | 4 +- .../sklearn/RegressionR2SquareComparison.qmd | 4 +- .../sklearn/RobustnessDiagnosis.qmd | 2 +- .../sklearn/SHAPGlobalImportance.qmd | 2 +- .../sklearn/ScoreProbabilityAlignment.qmd | 2 +- .../sklearn/SilhouettePlot.qmd | 2 +- .../sklearn/TrainingTestDegradation.qmd | 2 +- .../model_validation/sklearn/VMeasure.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 2 +- .../statsmodels/AutoARIMA.qmd | 2 +- .../CumulativePredictionProbabilities.qmd | 2 +- .../statsmodels/DurbinWatsonTest.qmd | 2 +- .../statsmodels/GINITable.qmd | 2 +- .../statsmodels/KolmogorovSmirnov.qmd | 2 +- .../statsmodels/Lilliefors.qmd | 2 +- .../PredictionProbabilitiesHistogram.qmd | 2 +- .../statsmodels/RegressionCoeffs.qmd | 2 +- .../RegressionFeatureSignificance.qmd | 2 +- .../RegressionModelForecastPlot.qmd | 2 +- .../RegressionModelForecastPlotLevels.qmd | 2 +- .../RegressionModelSensitivityPlot.qmd | 2 +- .../statsmodels/RegressionModelSummary.qmd | 4 +- ...RegressionPermutationFeatureImportance.qmd | 2 +- .../statsmodels/ScorecardHistogram.qmd | 2 +- .../statsmodels/statsutils.qmd | 2 +- .../tests/prompt_validation/Bias.qmd | 2 +- .../tests/prompt_validation/Clarity.qmd | 2 +- .../tests/prompt_validation/Conciseness.qmd | 2 +- .../tests/prompt_validation/Delimitation.qmd | 2 +- .../prompt_validation/NegativeInstruction.qmd | 2 +- .../tests/prompt_validation/Robustness.qmd | 2 +- .../tests/prompt_validation/Specificity.qmd | 2 +- docs/validmind/vm_models.qmd | 88 +++++++++++++++++-- 150 files changed, 341 insertions(+), 159 deletions(-) diff --git a/docs/templates/class.qmd.jinja2 b/docs/templates/class.qmd.jinja2 index f86aca76d..e0ff665b8 100644 --- a/docs/templates/class.qmd.jinja2 +++ b/docs/templates/class.qmd.jinja2 @@ -31,8 +31,8 @@ {% if resolved.members %} {% for member in resolved.members.values() | sort(attribute='name') %} -{% if member.kind in ['method', 'function'] and not member.name.startswith('_') %} -### [{{ member.name }}[()]{.muted}](#{{ member.name }}) +{% if member.kind in ['method', 'function'] and (not member.name.startswith('_') or member.name == '__init__') %} +### [{{ member.name if member.name != '__init__' else resolved.name }}[()]{.muted}](#{{ member.name }}) {{ signatures.render_signature(member) }} diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index 6c12f027b..d61b6d384 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -8,7 +8,7 @@ {%- if type.cls == "ExprAttribute" and type.values is sequence -%} {%- for value in type.values -%} {{ format_type(value, module, add_links) }} - {%- if not loop.last -%}.{%- endif -%} + {%- if not loop.last -%}.{%- endif -%} {%- endfor -%} {%- elif type.cls == "ExprName" -%} {%- if module and type.name in module.members and module.members[type.name].kind == "alias" -%} diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index c31a20f51..b26ef7543 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -52,6 +52,16 @@ Generic error for API request errors that are not known. - **From builtins.BaseException**: with_traceback, add_note +### [BaseError[()]{.muted}](#__init__) + + + +::: {.signature} + +__init__(message='') + +::: + ### [description[()]{.muted}](#description) @@ -368,6 +378,16 @@ Exception raised when an error occurs while loading a test - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note +### [LoadTestError[()]{.muted}](#__init__) + + + +::: {.signature} + +__init__(message:str,original_error:Optional\[Exception\]=None) + +::: + ## [class]{.muted} MismatchingClassLabelsError @@ -479,6 +499,20 @@ When a required dependency is missing. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note +### [MissingDependencyError[()]{.muted}](#__init__) + + + +::: {.signature} + +__init__(message='',required_dependencies=None,extra=None) + +::: + + + +Args: message (str): The error message. required_dependencies (list): A list of required dependencies. extra (str): The particular validmind `extra` that will install the missing dependencies. + ## [class]{.muted} MissingDocumentationTemplate diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 0e5a3f38e..6dec57923 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,7 +29,7 @@ Entrypoint for test suites. ::: {.signature} -defformat_dataframe(df:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027pd\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027DataFrame\\u0027}]}")"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027pd\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027DataFrame\\u0027}]}": +defformat_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index de406f2ce..960b32b0f 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -290,6 +290,16 @@ Exception raised when an error occurs while loading a test - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note +### [LoadTestError[()]{.muted}](#__init__) + + + +::: {.signature} + +__init__(message:str,original_error:Optional\[Exception\]=None) + +::: + ## [class]{.muted} LocalTestProvider @@ -333,6 +343,24 @@ test = test_provider.load_test("my_namespace.my_test_class") - `root_folder` (str): The root directory for local tests. +### [LocalTestProvider[()]{.muted}](#__init__) + + + +::: {.signature} + +__init__(root_folder:str) + +::: + + + +Initialize the LocalTestProvider with the given root_folder (see class docstring for details) + +**Arguments** + +- `root_folder` (str): The root directory for local tests. + ### [list_tests[()]{.muted}](#list_tests) diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index bc131605d..d2dd28845 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defACFandPACFPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index bcba58060..d22e2aac0 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'", "'stationarity'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defADF(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 78892b42b..8198f897f 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defAutoAR(dataset:VMDataset,max_ar_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index 65536b570..e5164d491 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defAutoMA(dataset:VMDataset,max_ma_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 0672f6619..b369d9f47 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 2501de3f8..d9ce3b621 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'numerical_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defBivariateScatterPlots(dataset): ::: diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index 32466c8d5..d90040bd4 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
defBoxPierce(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 229eab351..447f710d1 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'categorical_data'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defChiSquaredFeaturesTable(dataset,p_threshold=0.05): ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 79195ae73..03968cb51 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,8 +18,8 @@ Threshold based tests ::: {.signature} -
@()
@()
-defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple[Dict[str, Any], "{\u0027cls\u0027: \u0027ExprAttribute\u0027, \u0027values\u0027: [{\u0027cls\u0027: \u0027ExprName\u0027, \u0027name\u0027: \u0027go\u0027}, {\u0027cls\u0027: \u0027ExprName\u0027, \u0027name\u0027: \u0027Figure\u0027}]}", bool]: +
@{'arguments': ["'tabular_data'", "'binary_classification'", "'multiclass_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple[Dict[str, Any], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool]: ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index cabd0fb9b..d4e0c08fb 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'time_series_data'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'", "'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defDatasetDescription(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index a3be3be78..628cc6044 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'time_series_data'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'", "'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defDatasetSplit(datasets:List[VMDataset]): ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index cd202bd75..3dae3257d 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defformat_records(df:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027pd\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027DataFrame\\u0027}]}")List\[Dict\[str, Any\]\]: +defformat_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict\[str, Any\]\]: ::: @@ -36,7 +36,7 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defDescriptiveStatistics(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index b4fb80aab..ba5ef3b5c 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'forecasting'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defDickeyFullerGLS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 2d505593a..26d7d8feb 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'data_quality'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defDuplicates(dataset,min_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 31881e9eb..49a36345c 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'statistical_test'", "'forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 9e48bbf34..16ef85506 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'visualization'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defFeatureTargetCorrelationPlot(dataset,fig_height=600): ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index ab9115e0a..1ac497f07 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'data_quality'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 5739e48bc..274dcdf92 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'data_quality'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index ca8a50ebb..854f29588 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'visualization'", "'numerical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 3b0f762b5..0fefd7284 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'numerical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index f725019ce..d02565ad5 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'anomaly_detection'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index be18415ad..1512482f2 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
defJarqueBera(dataset): ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 90cf7e2fa..42a002434 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'stationarity'", "'unit_root_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defKPSS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 95ac10831..89c7af834 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
defLJungBox(dataset): ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index 4ae4ee065..c8f7816bc 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index ccefb4f98..a04bb4dab 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'data_quality'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 2eb0aa96e..14f3bc235 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'data_quality'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 6bb8ae6d0..1d40a85d4 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'feature_selection'", "'data_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): ::: diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index c4017a0e1..d2d570983 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'numerical_data'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defPearsonCorrelationMatrix(dataset): ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index be9032271..ed2e2eb5e 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defPhillipsPerronArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index dd96ccb7f..873f51493 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defProtectedClassesCombination(dataset,model,protected_classes=None): ::: @@ -87,3 +87,17 @@ When a required dependency is missing. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + +### [MissingDependencyError[()]{.muted}](#__init__) + + + +::: {.signature} + +__init__(message='',required_dependencies=None,extra=None) + +::: + + + +Args: message (str): The error message. required_dependencies (list): A list of required dependencies. extra (str): The particular validmind `extra` that will install the missing dependencies. diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index af60c926b..bc6512a64 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'bias_and_fairness'", "'descriptive_statistics'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defProtectedClassesDescription(dataset,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 39996b820..59c6d9c57 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=['fnr', 'fpr', 'tpr']): ::: @@ -89,3 +89,17 @@ When a required dependency is missing. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + +### [MissingDependencyError[()]{.muted}](#__init__) + + + +::: {.signature} + +__init__(message='',required_dependencies=None,extra=None) + +::: + + + +Args: message (str): The error message. required_dependencies (list): A list of required dependencies. extra (str): The particular validmind `extra` that will install the missing dependencies. diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 80c7151e5..9fabfb49f 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -100,7 +100,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defProtectedClassesThresholdOptimizer(dataset,pipeline=None,protected_classes=None,X_train=None,y_train=None): ::: @@ -160,3 +160,17 @@ When a required dependency is missing. - **From BaseError**: [class BaseError[()]{.muted}](#class-baseerror), [__init__[()]{.muted}](#__init__), [__str__[()]{.muted}](#__str__), [description[()]{.muted}](#description) - **From builtins.BaseException**: with_traceback, add_note + +### [MissingDependencyError[()]{.muted}](#__init__) + + + +::: {.signature} + +__init__(message='',required_dependencies=None,extra=None) + +::: + + + +Args: message (str): The error message. required_dependencies (list): A list of required dependencies. extra (str): The particular validmind `extra` that will install the missing dependencies. diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 5686b1032..1813232f4 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'visualization'", "'stationarity'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRollingStatsPlot(dataset:VMDataset,window_size:int=12): ::: diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 3198e7dd9..10f69524d 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'tabular_data'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
defRunsTest(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 5bba23317..4f8bd8d6a 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defScatterPlot(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 3c4556ed6..e21ac7890 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'visualization'", "'credit_risk'", "'scorecard'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index fd96d2ae7..58be58fb8 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'seasonality'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): ::: diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 2c1be0720..8abdae0f8 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
defShapiroWilk(dataset): ::: diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index 3834587db..86b0acbf6 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'data_quality'", "'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defSkewness(dataset,max_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 0fe8aea5d..589bf90c8 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defSpreadPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 834bf91bf..1b27b19a6 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTabularCategoricalBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 5ea647c57..19e75eed3 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTabularDateTimeHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 1ff1b4dab..376fe7dc9 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -86,7 +86,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTabularDescriptionTables(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 799ff5bf2..9d0604919 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTabularNumericalHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 8d1ed41aa..6255b653d 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'visualization'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTargetRateBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 3f9e0c806..a5edac2c3 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTimeSeriesDescription(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 9c19a1fa6..e468e92b2 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTimeSeriesDescriptiveStatistics(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index dfc08f42c..9c9801328 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTimeSeriesFrequency(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 34914ddc2..c2d966fc9 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'data_validation'", "'visualization'", "'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTimeSeriesHistogram(dataset,nbins=30): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 5640697fe..9e03f68fe 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTimeSeriesLinePlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index d5dffbd01..f392b3ab7 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 5b6f72759..d6e23f70d 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 0cb9dfece..461ac4c38 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 8ba68f1bb..dceef0bff 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index f101bdb41..4d0df7c0e 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'visualization'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index c7a02bd23..b83d01a26 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index b9fa644ce..3176304ae 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'stationarity'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defZivotAndrewsArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index f29ab5a89..62bcc9e1e 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defCommonWords(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 1f9734121..4bf4c19b6 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defHashtags(dataset:VMDataset,top_hashtags:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index c9030ce5a..02b678a12 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defLanguageDetection(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 9352bdf61..982146481 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defMentions(dataset:VMDataset,top_mentions:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index 70a3732bc..afeb67dd3 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defPolarityAndSubjectivity(dataset,threshold_subjectivity=0.5,threshold_polarity=0): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index 968fe55b1..e264bca3a 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -18,7 +18,7 @@ Metrics functions for any Pandas-compatible datasets ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'", "'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defPunctuations(dataset,count_mode='token'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index d2e575ef9..e81a3dc37 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defSentiment(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index 7a4fc49e5..78c3d7fbb 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'frequency_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 12c55218f..731ce56e7 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTextDescription(dataset:VMDataset,unwanted_tokens:set={'s', "s'", 'mr', 'ms', 'mrs', 'dr', "'s", ' ', "''", 'dollar', 'us', '``'},lang:str='english'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index ac73abe91..be39d188a 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defToxicity(dataset): ::: diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 0186ea265..3e573fb32 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defBertScore(dataset,model,evaluation_model='distilbert-base-uncased'): ::: diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 8505556a5..b56e3719a 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defBleuScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index c77caa9d4..e4c6634dd 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defClusterSizeDistribution(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 6225dfd5e..a8d946c8f 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defContextualRecall(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index d46c6a55f..b7bb22bca 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'feature_importance'", "'AUC'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 60508b936..5e6d353a5 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defMeteorScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index d5472f9e8..cf9ad50f9 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -28,7 +28,7 @@ Attempts to extract all model info from a model object instance ::: {.signature} -
@()
@()
+
@{'arguments': ["'model_training'", "'metadata'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defModelMetadata(model): ::: diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index a17d3b4c6..199639ca4 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'residual_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defModelPredictionResiduals(dataset,model,nbins=100,p_value_threshold=0.05,start_date=None,end_date=None): ::: diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 284d375c1..976bd8c63 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegardScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 1bc02faa5..fc506cc4d 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 6793f6489..f2ab200c6 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRougeScore(dataset,model,metric='rouge-1'): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index fdd4e1ac1..b430bf252 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'model_predictions'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTimeSeriesPredictionWithCI(dataset,model,confidence=0.95): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index ee2936703..e90fb607c 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'model_predictions'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTimeSeriesPredictionsPlot(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 1b7fb13dd..57d973d79 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTimeSeriesR2SquareBySegments(dataset,model,segments=None): ::: diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index c1bacb900..f75f74b1d 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTokenDisparity(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index f96efc3a3..4c0ae89dd 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defToxicityScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index c3a713e5b..2ded884b2 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 64d12e592..299bbc375 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defAdjustedRandIndex(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 93ab513ff..dd8074550 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index 01f1dfe89..bbf2b326d 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index cb460986c..586579b2e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'model_validation'", "'threshold_optimization'", "'classification_metrics'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 9fded75b1..5fbfd5ec3 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 61b96caff..fc0edb78c 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index f29e7c0de..f25671734 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defCompletenessScore(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 48f5b0739..7aa3ba21e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defConfusionMatrix(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 58c012e84..00e21d96c 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'model_explainability'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index eaf053c33..ce49ac028 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 256395140..1047cb048 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defHomogeneityScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 72a8dab63..76a8b363c 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defcustom_recall(y_true,y_pred_proba,threshold=0.5): ::: @@ -27,7 +27,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union[str, List, Dict]=None,thresholds:Union[float, List[float]]=None,fit_params:dict=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 00ef76738..b19c9270b 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'", "'kmeans'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union[List[int], None]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index a9c514d71..2a17f372b 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 1fa33ce44..28b73b249 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index e8154b94b..cdde04360 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 6904bd191..126af3249 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'model_training'", "'metadata'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defModelParameters(model,model_params=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index eedb6fa36..cc3220c71 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -24,7 +24,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'model_comparison'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defModelsPerformanceComparison(dataset:VMDataset,models:list[VMModel]): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index c85b330eb..a399fb98b 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'linear_regression'", "'model_diagnosis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defOverfitDiagnosis(model:VMModel,datasets:List[VMDataset],metric:str=None,cut_off_threshold:float=DEFAULT_THRESHOLD): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 869dfb709..a9479df1b 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union[int, None]=None,figure_height:Union[int, None]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 67dfbb8e7..5779904fc 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -46,7 +46,7 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defPopulationStabilityIndex(datasets:List[VMDataset],model:VMModel,num_bins:int=10,mode:str='fixed'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 9a0d9b7d9..9e177caa4 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'binary_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 2ce3750b7..9eaadb802 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defROCCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index 0babbe6f9..8332b3fd7 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionErrors(model,dataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 4e90f7c19..a520e9173 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionErrorsComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 0b58c0a38..fef59bf85 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionPerformance(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 03c1b39c6..e06d0eb7a 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}",predicted:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}",rowcount:int,featurecount:int): +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionR2Square(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 7195d5a90..3b60d9372 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}",predicted:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}",rowcount:int,featurecount:int): +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -
@()
@()
+
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionR2SquareComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index ddbe782c9..058f298e2 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_diagnosis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRobustnessDiagnosis(datasets:List[VMDataset],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List[float]=DEFAULT_STD_DEV_LIST,performance_decay_threshold:float=DEFAULT_DECAY_THRESHOLD): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index cb039403f..907c1a3fe 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -85,7 +85,7 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index ed17e5481..08a0dafd4 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'visualization'", "'credit_risk'", "'calibration'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index df1ad0ff5..a9817c45b 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defSilhouettePlot(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 7ccbfc547..be0b904ec 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTrainingTestDegradation(datasets:List[VMDataset],model:VMModel,max_threshold:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index d0deb4879..e06e89185 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defVMeasure(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 35fe81057..023d2b799 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_diagnosis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defWeakspotsDiagnosis(datasets:List[VMDataset],model:VMModel,features_columns:Union[List[str], None]=None,metrics:Union[Dict[str, Callable], None]=None,thresholds:Union[Dict[str, float], None]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 5be083cc7..4fa476617 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'forecasting'", "'model_selection'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defAutoARIMA(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 4f75691d6..9cb34d4f0 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'visualization'", "'credit_risk'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defCumulativePredictionProbabilities(dataset,model,title='Cumulative Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index da2630cd1..78799c033 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
defDurbinWatsonTest(dataset,model,threshold=[1.5, 2.5]): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index 016a9c4c8..afe9258ff 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defGINITable(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index ef85a431b..80417323a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 6bdb2f58e..d7cedeb99 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defLilliefors(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index 1b18a5357..dd419141e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'visualization'", "'credit_risk'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defPredictionProbabilitiesHistogram(dataset,model,title='Histogram of Predictive Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index b41e9d600..d7f00900a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'tabular_data'", "'visualization'", "'model_training'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionCoeffs(model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index d8c31a176..1a5d4e106 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'statistical_test'", "'model_interpretation'", "'visualization'", "'feature_importance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 8b7b607ec..8cad6095c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'forecasting'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union[str, None]=None,end_date:Union[str, None]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 6bc38a2ec..19968da6d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'time_series_data'", "'forecasting'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index e648137f2..7bd1ece7a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'senstivity_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List[float]=[0.1],transformation:Union[str, None]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 975462a2b..ac0df4321 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}",predicted:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}",rowcount:int,featurecount:int): +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -
@()
@()
+
@{'arguments': ["'model_performance'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionModelSummary(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 3d7a70b0c..279fac97d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@()
@()
+
@{'arguments': ["'statsmodels'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index 854c5bf1e..bb40c336e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@()
@()
+
@{'arguments': ["'visualization'", "'credit_risk'", "'logistic_regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defScorecardHistogram(dataset,title='Histogram of Scores',score_column='score'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 8252d1866..5f3aa2bc3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}",predicted:"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}",rowcount:int,featurecount:int): +defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 8ade29c84..789c79e6e 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@()
@()
+
@{'arguments': ["'llm'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defBias(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 7174de0b3..c8e9f26d1 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@()
@()
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defClarity(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 01c271c83..0d55cb6bb 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@()
@()
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defConciseness(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index bcec22c85..f296b9ce7 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@()
@()
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defDelimitation(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 66057bbf7..fea1a00db 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@()
@()
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defNegativeInstruction(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 00f70be23..850b83be4 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -28,7 +28,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -
@()
@()
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRobustness(model,dataset,num_tests=10): ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index ee8377d4c..e4d6dac55 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@()
@()
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defSpecificity(model,min_threshold=7): ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 6352f7e93..3e1893b80 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -27,6 +27,16 @@ Models entrypoint Figure objects track the schema supported by the ValidMind API +### [Figure[()]{.muted}](#__init__) + + + +::: {.signature} + +__init__(key:str,figure:Union\[{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'matplotlib'}, {'cls': 'ExprName', 'name': 'figure'}, {'cls': 'ExprName', 'name': 'Figure'}]}, {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'FigureWidget'}]}, bytes\],ref_id:str,\_type:str='plot')None + +::: + ### [serialize[()]{.muted}](#serialize) @@ -88,6 +98,16 @@ we would render images as-is, but Plotly FigureWidgets don't work well on Google Model attributes definition +### [ModelAttributes[()]{.muted}](#__init__) + + + +::: {.signature} + +__init__(architecture:str=None,framework:str=None,framework_version:str=None,language:str=None,task:ModelTask=None)None + +::: + ### [from_dict[()]{.muted}](#from_dict) @@ -124,6 +144,16 @@ can be run as a suite against datasets and models. Test Suites can be defined by Tests can be a flat list of strings or may be nested into sections by using a dict +### [TestSuite[()]{.muted}](#__init__) + + + +::: {.signature} + +__init__(sections:List\[TestSuiteSection\]=None)None + +::: + ### [get_default_config[()]{.muted}](#get_default_config) @@ -188,6 +218,16 @@ Returns the total number of tests in the test suite Runs a test suite +### [TestSuiteRunner[()]{.muted}](#__init__) + + + +::: {.signature} + +__init__(suite:TestSuite,config:dict=None,inputs:dict=None) + +::: + ### [log_results[()]{.muted}](#log_results) @@ -270,6 +310,34 @@ This way we can support multiple dataset types but under the hood we only need t **Inherited members** +### [VMDataset[()]{.muted}](#__init__) + + + +::: {.signature} + +__init__(raw_dataset:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},input_id:str=None,model:VMModel=None,index:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}=None,index_name:str=None,date_time_index:bool=False,columns:list=None,target_column:str=None,feature_columns:list=None,text_column:str=None,extra_columns:dict=None,target_class_labels:dict=None) + +::: + + + +Initializes a VMDataset instance. + +**Arguments** + +- `raw_dataset` (np.ndarray): The raw dataset as a NumPy array. +- `input_id` (str): Identifier for the dataset. +- `model` (VMModel): Model associated with the dataset. +- `index` (np.ndarray): The raw dataset index as a NumPy array. +- `index_name` (str): The raw dataset index name as a NumPy array. +- `date_time_index` (bool): Whether the index is a datetime index. +- `columns` (List[str], optional): The column names of the dataset. Defaults to None. +- `target_column` (str, optional): The target column name of the dataset. Defaults to None. +- `feature_columns` (str, optional): The feature column names of the dataset. Defaults to None. +- `text_column` (str, optional): The text column name of the dataset for nlp tasks. Defaults to None. +- `target_class_labels` (Dict, optional): The class labels for the target columns. Defaults to None. + ### [add_extra_column[()]{.muted}](#add_extra_column) @@ -398,7 +466,7 @@ Returns a dataframe containing only the feature columns ::: {.signature} -defy_df()"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027pd\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027DataFrame\\u0027}]}": +defy_df(){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: @@ -412,7 +480,7 @@ Returns a dataframe containing the target column ::: {.signature} -defy_pred(model)"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}": +defy_pred(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: ::: @@ -436,7 +504,7 @@ Attempts to stack complex prediction types (e.g., embeddings) into a single, mul ::: {.signature} -defy_pred_df(model)"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027pd\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027DataFrame\\u0027}]}": +defy_pred_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: @@ -450,7 +518,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -defy_prob(model)"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027np\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027ndarray\\u0027}]}": +defy_prob(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: ::: @@ -472,7 +540,7 @@ Returns the probabilities for a given model. ::: {.signature} -defy_prob_df(model)"{\\u0027cls\\u0027: \\u0027ExprAttribute\\u0027, \\u0027values\\u0027: [{\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027pd\\u0027}, {\\u0027cls\\u0027: \\u0027ExprName\\u0027, \\u0027name\\u0027: \\u0027DataFrame\\u0027}]}": +defy_prob_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: ::: @@ -547,6 +615,16 @@ An base class that wraps a trained model instance and its associated data. **Inherited members** +### [VMModel[()]{.muted}](#__init__) + + + +::: {.signature} + +__init__(input_id:str=None,model:object=None,attributes:ModelAttributes=None,name:str=None,\*\*kwargs) + +::: + ### [predict[()]{.muted}](#predict) From f530eb22097405ceeadca1d7fd8dc1dc7d95f0de Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 21 Feb 2025 07:13:25 -0800 Subject: [PATCH 090/207] Fixed ExprAttribute rendering for inherited members --- docs/templates/macros/types.jinja2 | 25 +- docs/validmind.qmd | 536 ++++++++++++- docs/validmind/errors.qmd | 44 +- docs/validmind/test_suites.qmd | 88 ++- docs/validmind/tests.qmd | 730 +++++++++++++++++- .../tests/data_validation/ACFandPACFPlot.qmd | 16 +- docs/validmind/tests/data_validation/ADF.qmd | 16 +- .../tests/data_validation/AutoAR.qmd | 20 +- .../tests/data_validation/AutoMA.qmd | 20 +- .../data_validation/AutoStationarity.qmd | 24 +- .../data_validation/BivariateScatterPlots.qmd | 10 +- .../tests/data_validation/BoxPierce.qmd | 10 +- .../ChiSquaredFeaturesTable.qmd | 10 +- .../tests/data_validation/ClassImbalance.qmd | 53 +- .../data_validation/DatasetDescription.qmd | 16 +- .../tests/data_validation/DatasetSplit.qmd | 24 +- .../data_validation/DescriptiveStatistics.qmd | 76 +- .../tests/data_validation/DickeyFullerGLS.qmd | 16 +- .../tests/data_validation/Duplicates.qmd | 10 +- .../data_validation/EngleGrangerCoint.qmd | 20 +- .../FeatureTargetCorrelationPlot.qmd | 10 +- .../tests/data_validation/HighCardinality.qmd | 28 +- .../HighPearsonCorrelation.qmd | 28 +- .../data_validation/IQROutliersBarPlot.qmd | 24 +- .../data_validation/IQROutliersTable.qmd | 20 +- .../IsolationForestOutliers.qmd | 28 +- .../tests/data_validation/JarqueBera.qmd | 10 +- docs/validmind/tests/data_validation/KPSS.qmd | 16 +- .../tests/data_validation/LJungBox.qmd | 10 +- .../LaggedCorrelationHeatmap.qmd | 20 +- .../tests/data_validation/MissingValues.qmd | 20 +- .../data_validation/MissingValuesBarPlot.qmd | 24 +- .../data_validation/MutualInformation.qmd | 24 +- .../PearsonCorrelationMatrix.qmd | 10 +- .../data_validation/PhillipsPerronArch.qmd | 16 +- .../ProtectedClassesCombination.qmd | 10 +- .../ProtectedClassesDescription.qmd | 10 +- .../ProtectedClassesDisparity.qmd | 28 +- .../ProtectedClassesThresholdOptimizer.qmd | 10 +- .../data_validation/RollingStatsPlot.qmd | 20 +- .../tests/data_validation/RunsTest.qmd | 10 +- .../tests/data_validation/ScatterPlot.qmd | 10 +- .../data_validation/ScoreBandDefaultRates.qmd | 28 +- .../data_validation/SeasonalDecompose.qmd | 20 +- .../tests/data_validation/ShapiroWilk.qmd | 10 +- .../tests/data_validation/Skewness.qmd | 10 +- .../tests/data_validation/SpreadPlot.qmd | 16 +- .../TabularCategoricalBarPlots.qmd | 16 +- .../TabularDateTimeHistograms.qmd | 16 +- .../TabularDescriptionTables.qmd | 10 +- .../TabularNumericalHistograms.qmd | 16 +- .../data_validation/TargetRateBarPlots.qmd | 16 +- .../data_validation/TimeSeriesDescription.qmd | 10 +- .../TimeSeriesDescriptiveStatistics.qmd | 10 +- .../data_validation/TimeSeriesFrequency.qmd | 16 +- .../data_validation/TimeSeriesHistogram.qmd | 10 +- .../data_validation/TimeSeriesLinePlot.qmd | 16 +- .../TimeSeriesMissingValues.qmd | 20 +- .../data_validation/TimeSeriesOutliers.qmd | 20 +- .../data_validation/TooManyZeroValues.qmd | 20 +- .../tests/data_validation/UniqueRows.qmd | 20 +- .../tests/data_validation/WOEBinPlots.qmd | 28 +- .../tests/data_validation/WOEBinTable.qmd | 20 +- .../data_validation/ZivotAndrewsArch.qmd | 16 +- .../tests/data_validation/nlp/CommonWords.qmd | 16 +- .../tests/data_validation/nlp/Hashtags.qmd | 20 +- .../data_validation/nlp/LanguageDetection.qmd | 10 +- .../tests/data_validation/nlp/Mentions.qmd | 20 +- .../nlp/PolarityAndSubjectivity.qmd | 10 +- .../data_validation/nlp/Punctuations.qmd | 10 +- .../tests/data_validation/nlp/Sentiment.qmd | 10 +- .../tests/data_validation/nlp/StopWords.qmd | 24 +- .../data_validation/nlp/TextDescription.qmd | 76 +- .../tests/data_validation/nlp/Toxicity.qmd | 10 +- .../tests/model_validation/BertScore.qmd | 10 +- .../tests/model_validation/BleuScore.qmd | 10 +- .../ClusterSizeDistribution.qmd | 20 +- .../model_validation/ContextualRecall.qmd | 10 +- .../tests/model_validation/FeaturesAUC.qmd | 24 +- .../tests/model_validation/MeteorScore.qmd | 10 +- .../tests/model_validation/ModelMetadata.qmd | 10 +- .../ModelPredictionResiduals.qmd | 10 +- .../tests/model_validation/RegardScore.qmd | 10 +- .../RegressionResidualsPlot.qmd | 24 +- .../tests/model_validation/RougeScore.qmd | 10 +- .../TimeSeriesPredictionWithCI.qmd | 10 +- .../TimeSeriesPredictionsPlot.qmd | 10 +- .../TimeSeriesR2SquareBySegments.qmd | 10 +- .../tests/model_validation/TokenDisparity.qmd | 10 +- .../tests/model_validation/ToxicityScore.qmd | 10 +- .../sklearn/AdjustedMutualInformation.qmd | 20 +- .../sklearn/AdjustedRandIndex.qmd | 20 +- .../sklearn/CalibrationCurve.qmd | 24 +- .../sklearn/ClassifierPerformance.qmd | 24 +- .../ClassifierThresholdOptimization.qmd | 20 +- .../sklearn/ClusterCosineSimilarity.qmd | 20 +- .../sklearn/ClusterPerformanceMetrics.qmd | 20 +- .../sklearn/CompletenessScore.qmd | 20 +- .../sklearn/ConfusionMatrix.qmd | 20 +- .../sklearn/FeatureImportance.qmd | 24 +- .../sklearn/FowlkesMallowsScore.qmd | 20 +- .../sklearn/HomogeneityScore.qmd | 20 +- .../sklearn/HyperParametersTuning.qmd | 82 +- .../sklearn/KMeansClustersOptimization.qmd | 44 +- .../sklearn/MinimumAccuracy.qmd | 24 +- .../sklearn/MinimumF1Score.qmd | 24 +- .../sklearn/MinimumROCAUCScore.qmd | 24 +- .../sklearn/ModelParameters.qmd | 10 +- .../sklearn/ModelsPerformanceComparison.qmd | 28 +- .../sklearn/OverfitDiagnosis.qmd | 40 +- .../sklearn/PermutationFeatureImportance.qmd | 52 +- .../sklearn/PopulationStabilityIndex.qmd | 36 +- .../sklearn/PrecisionRecallCurve.qmd | 20 +- .../model_validation/sklearn/ROCCurve.qmd | 20 +- .../sklearn/RegressionErrors.qmd | 10 +- .../sklearn/RegressionErrorsComparison.qmd | 10 +- .../sklearn/RegressionPerformance.qmd | 20 +- .../sklearn/RegressionR2Square.qmd | 48 +- .../sklearn/RegressionR2SquareComparison.qmd | 48 +- .../sklearn/RobustnessDiagnosis.qmd | 56 +- .../sklearn/SHAPGlobalImportance.qmd | 32 +- .../sklearn/ScoreProbabilityAlignment.qmd | 28 +- .../sklearn/SilhouettePlot.qmd | 20 +- .../sklearn/TrainingTestDegradation.qmd | 32 +- .../model_validation/sklearn/VMeasure.qmd | 20 +- .../sklearn/WeakspotsDiagnosis.qmd | 108 ++- .../statsmodels/AutoARIMA.qmd | 20 +- .../CumulativePredictionProbabilities.qmd | 10 +- .../statsmodels/DurbinWatsonTest.qmd | 24 +- .../statsmodels/GINITable.qmd | 10 +- .../statsmodels/KolmogorovSmirnov.qmd | 24 +- .../statsmodels/Lilliefors.qmd | 16 +- .../PredictionProbabilitiesHistogram.qmd | 10 +- .../statsmodels/RegressionCoeffs.qmd | 10 +- .../RegressionFeatureSignificance.qmd | 24 +- .../RegressionModelForecastPlot.qmd | 52 +- .../RegressionModelForecastPlotLevels.qmd | 20 +- .../RegressionModelSensitivityPlot.qmd | 56 +- .../statsmodels/RegressionModelSummary.qmd | 58 +- ...RegressionPermutationFeatureImportance.qmd | 28 +- .../statsmodels/ScorecardHistogram.qmd | 10 +- .../statsmodels/statsutils.qmd | 38 +- .../tests/prompt_validation/Bias.qmd | 64 +- .../tests/prompt_validation/Clarity.qmd | 64 +- .../tests/prompt_validation/Conciseness.qmd | 64 +- .../tests/prompt_validation/Delimitation.qmd | 64 +- .../prompt_validation/NegativeInstruction.qmd | 64 +- .../tests/prompt_validation/Robustness.qmd | 44 +- .../tests/prompt_validation/Specificity.qmd | 64 +- .../prompt_validation/ai_powered_test.qmd | 54 +- docs/validmind/unit_metrics.qmd | 20 +- docs/validmind/vm_models.qmd | 620 ++++++++++++++- 152 files changed, 5220 insertions(+), 318 deletions(-) diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index d61b6d384..cf682deda 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -5,11 +5,20 @@ {%- if type is mapping -%} {%- if type.cls is defined -%} - {%- if type.cls == "ExprAttribute" and type.values is sequence -%} - {%- for value in type.values -%} - {{ format_type(value, module, add_links) }} - {%- if not loop.last -%}.{%- endif -%} - {%- endfor -%} + + {%- if type.cls == "ExprAttribute" -%} + + + {%- if type.get('values') is sequence -%} + {%- for value in type.get('values') -%} + {%- if value.cls == "ExprName" -%} + {{ value.name }} + {%- endif -%} + {%- if not loop.last -%}.{%- endif -%} + {%- endfor -%} + {%- else -%} + {{ type|string }} + {%- endif -%} {%- elif type.cls == "ExprName" -%} {%- if module and type.name in module.members and module.members[type.name].kind == "alias" -%} {{ module.members[type.name].target_path }} @@ -85,12 +94,18 @@ {{ type }} {%- elif type|lower in builtin_types -%} {{ type }} + {%- elif type is string and type.startswith("{'cls'") -%} + {{ format_type(type|tojson|fromjson, module, add_links) }} {%- else -%} {{ type }} {%- endif -%} {%- else -%} {{ type|string }} {%- endif -%} + + + + {% endmacro %} {%- macro format_return_type(returns) -%} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 90a4eb7ca..b1290576e 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -55,7 +55,31 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -defget_test_suite(test_suite_id:str=None,section:str=None,\*args,\*\*kwargs)validmind.vm_models.TestSuite: +defget_test_suite(test_suite_id:str + + + + + + + +=None,section:str + + + + + + + +=None,\*args,\*\*kwargs)validmind.vm_models.TestSuite + + + + + + + +: ::: @@ -78,7 +102,159 @@ This function provides an interface to retrieve the TestSuite instance for the c ::: {.signature} -definit(project:Optional\[str\]=None,api_key:Optional\[str\]=None,api_secret:Optional\[str\]=None,api_host:Optional\[str\]=None,model:Optional\[str\]=None,monitoring:bool=False,generate_descriptions:Optional\[bool\]=None): +definit(project:Optional + + + + + + + +\[str + + + + + + + +\] + + + + + + + +=None,api_key:Optional + + + + + + + +\[str + + + + + + + +\] + + + + + + + +=None,api_secret:Optional + + + + + + + +\[str + + + + + + + +\] + + + + + + + +=None,api_host:Optional + + + + + + + +\[str + + + + + + + +\] + + + + + + + +=None,model:Optional + + + + + + + +\[str + + + + + + + +\] + + + + + + + +=None,monitoring:bool + + + + + + + +=False,generate_descriptions:Optional + + + + + + + +\[bool + + + + + + + +\] + + + + + + + +=None): ::: @@ -108,7 +284,95 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True)validmind.vm_models.VMDataset: +definit_dataset(dataset,model=None,index=None,index_name:str + + + + + + + +=None,date_time_index:bool + + + + + + + +=False,columns:list + + + + + + + +=None,text_column:str + + + + + + + +=None,target_column:str + + + + + + + +=None,feature_columns:list + + + + + + + +=None,extra_columns:dict + + + + + + + +=None,class_labels:dict + + + + + + + +=None,type:str + + + + + + + +=None,input_id:str + + + + + + + +=None,\_\_log=True)validmind.vm_models.VMDataset + + + + + + + +: ::: @@ -149,7 +413,47 @@ The following dataset types are supported: ::: {.signature} -definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs)validmind.vm_models.VMModel: +definit_model(model:object + + + + + + + +=None,input_id:str + + + + + + + +='model',attributes:dict + + + + + + + +=None,predict_fn:callable + + + + + + + +=None,\_\_log=True,\*\*kwargs)validmind.vm_models.VMModel + + + + + + + +: ::: @@ -179,7 +483,31 @@ Initializes a VM Model, which can then be passed to other functions that can per ::: {.signature} -definit_r_model(model_path:str,input_id:str='model')validmind.vm_models.VMModel: +definit_r_model(model_path:str + + + + + + + +,input_id:str + + + + + + + +='model')validmind.vm_models.VMModel + + + + + + + +: ::: @@ -211,7 +539,183 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ::: {.signature} -deflog_metric(key:str,value:float,inputs:Optional\[List\[str\]\]=None,params:Optional\[Dict\[str, Any\]\]=None,recorded_at:Optional\[str\]=None,thresholds:Optional\[Dict\[str, Any\]\]=None): +deflog_metric(key:str + + + + + + + +,value:float + + + + + + + +,inputs:Optional + + + + + + + +\[List + + + + + + + +\[str + + + + + + + +\] + + + + + + + +\] + + + + + + + +=None,params:Optional + + + + + + + +\[Dict + + + + + + + +\[str + + + + + + + +, Any + + + + + + + +\] + + + + + + + +\] + + + + + + + +=None,recorded_at:Optional + + + + + + + +\[str + + + + + + + +\] + + + + + + + +=None,thresholds:Optional + + + + + + + +\[Dict + + + + + + + +\[str + + + + + + + +, Any + + + + + + + +\] + + + + + + + +\] + + + + + + + +=None): ::: @@ -445,7 +949,15 @@ Holds raw data for a test result ::: {.signature} -RawData(log:bool=False,\*\*kwargs) +RawData(log:bool + + + + + + + +=False,\*\*kwargs) ::: @@ -466,7 +978,15 @@ Create a new RawData object ::: {.signature} -definspect(self,show:bool=True): +definspect(self,show:bool + + + + + + + +=True): ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index b26ef7543..bb34b9e71 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -384,7 +384,39 @@ Exception raised when an error occurs while loading a test ::: {.signature} -__init__(message:str,original_error:Optional\[Exception\]=None) +__init__(message:str + + + + + + + +,original_error:Optional + + + + + + + +\[Exception + + + + + + + +\] + + + + + + + +=None) ::: @@ -872,7 +904,15 @@ returns a non-JSON string or if the API returns a non-standard error ::: {.signature} -defshould_raise_on_fail_fast(error)bool: +defshould_raise_on_fail_fast(error)bool + + + + + + + +: ::: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 6dec57923..50cdb2bd3 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,7 +29,27 @@ Entrypoint for test suites. ::: {.signature} -defformat_dataframe(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +defformat_dataframe(df: + +pd.DataFrame + + + + + + + +) + +pd.DataFrame + + + + + + + +: ::: @@ -57,7 +77,23 @@ Get a logger for the given module name ::: {.signature} -deftest_id_to_name(test_id:str)str: +deftest_id_to_name(test_id:str + + + + + + + +)str + + + + + + + +: ::: @@ -81,7 +117,15 @@ Convert a test ID to a human-readable name. ::: {.signature} -defdescribe_suite(test_suite_id:str,verbose=False): +defdescribe_suite(test_suite_id:str + + + + + + + +,verbose=False): ::: @@ -106,7 +150,15 @@ Describes a Test Suite by ID ::: {.signature} -defget_by_id(test_suite_id:str): +defget_by_id(test_suite_id:str + + + + + + + +): ::: @@ -122,7 +174,15 @@ Returns the test suite by ID ::: {.signature} -deflist_suites(pretty:bool=True): +deflist_suites(pretty:bool + + + + + + + +=True): ::: @@ -138,7 +198,23 @@ Returns a list of all available test suites ::: {.signature} -defregister_test_suite(suite_id:str,suite:TestSuite): +defregister_test_suite(suite_id:str + + + + + + + +,suite:TestSuite + + + + + + + +): ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 960b32b0f..132fdf232 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -20,7 +20,31 @@ ValidMind Tests Module ::: {.signature} -defdescribe_test(test_id:TestID=None,raw:bool=False,show:bool=True): +defdescribe_test(test_id:TestID + + + + + + + +=None,raw:bool + + + + + + + +=False,show:bool + + + + + + + +=True): ::: @@ -115,7 +139,31 @@ List all tests in the tests directory. ::: {.signature} -defload_test(test_id:str,test_func:callable=None,reload:bool=False): +defload_test(test_id:str + + + + + + + +,test_func:callable + + + + + + + +=None,reload:bool + + + + + + + +=False): ::: @@ -136,7 +184,559 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. ::: {.signature} -defrun_test(test_id:Union\[TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[\[TestResult\], None, None\]=None,\*\*kwargs)validmind.vm_models.TestResult: +defrun_test(test_id:Union + + + + + + + +\[TestID + + + + + + + +, None + + + + + + + +\] + + + + + + + +=None,name:Union + + + + + + + +\[str + + + + + + + +, None + + + + + + + +\] + + + + + + + +=None,unit_metrics:Union + + + + + + + +\[List + + + + + + + +\[TestID + + + + + + + +\] + + + + + + + +, None + + + + + + + +\] + + + + + + + +=None,inputs:Union + + + + + + + +\[Dict + + + + + + + +\[str + + + + + + + +, Any + + + + + + + +\] + + + + + + + +, None + + + + + + + +\] + + + + + + + +=None,input_grid:Union + + + + + + + +\[Dict + + + + + + + +\[str + + + + + + + +, List + + + + + + + +\[Any + + + + + + + +\] + + + + + + + +\] + + + + + + + +, List + + + + + + + +\[Dict + + + + + + + +\[str + + + + + + + +, Any + + + + + + + +\] + + + + + + + +\] + + + + + + + +, None + + + + + + + +\] + + + + + + + +=None,params:Union + + + + + + + +\[Dict + + + + + + + +\[str + + + + + + + +, Any + + + + + + + +\] + + + + + + + +, None + + + + + + + +\] + + + + + + + +=None,param_grid:Union + + + + + + + +\[Dict + + + + + + + +\[str + + + + + + + +, List + + + + + + + +\[Any + + + + + + + +\] + + + + + + + +\] + + + + + + + +, List + + + + + + + +\[Dict + + + + + + + +\[str + + + + + + + +, Any + + + + + + + +\] + + + + + + + +\] + + + + + + + +, None + + + + + + + +\] + + + + + + + +=None,show:bool + + + + + + + +=True,generate_description:bool + + + + + + + +=True,title:Optional + + + + + + + +\[str + + + + + + + +\] + + + + + + + +=None,post_process_fn:Union + + + + + + + +\[\[TestResult + + + + + + + +\], None + + + + + + + +, None + + + + + + + +\] + + + + + + + +=None,\*\*kwargs)validmind.vm_models.TestResult + + + + + + + +: ::: @@ -256,7 +856,31 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -defregister_test_provider(namespace:str,test_provider:TestProvider)None: +defregister_test_provider(namespace:str + + + + + + + +,test_provider:TestProvider + + + + + + + +)None + + + + + + + +: ::: @@ -296,7 +920,39 @@ Exception raised when an error occurs while loading a test ::: {.signature} -__init__(message:str,original_error:Optional\[Exception\]=None) +__init__(message:str + + + + + + + +,original_error:Optional + + + + + + + +\[Exception + + + + + + + +\] + + + + + + + +=None) ::: @@ -349,7 +1005,15 @@ test = test_provider.load_test("my_namespace.my_test_class") ::: {.signature} -__init__(root_folder:str) +__init__(root_folder:str + + + + + + + +) ::: @@ -385,7 +1049,15 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str): +defload_test(test_id:str + + + + + + + +): ::: @@ -430,7 +1102,31 @@ Protocol for user-defined test providers ::: {.signature} -deflist_tests()List\[str\]: +deflist_tests()List + + + + + + + +\[str + + + + + + + +\] + + + + + + + +: ::: @@ -448,7 +1144,23 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str)callable: +defload_test(test_id:str + + + + + + + +)callable + + + + + + + +: ::: diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index d2dd28845..c5d1210e9 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,8 +14,20 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defACFandPACFPlot(dataset:VMDataset): +
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defACFandPACFPlot(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index d22e2aac0..57b8003f0 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -28,8 +28,20 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'", "'stationarity'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defADF(dataset:VMDataset): +
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'", "'stationarity'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defADF(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 8198f897f..b1a2af805 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -28,8 +28,24 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defAutoAR(dataset:VMDataset,max_ar_order:int=3): +
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defAutoAR(dataset:VMDataset + + + +,max_ar_order:int + + + +=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index e5164d491..c64982aa5 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -28,8 +28,24 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defAutoMA(dataset:VMDataset,max_ma_order:int=3): +
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defAutoMA(dataset:VMDataset + + + +,max_ma_order:int + + + +=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index b369d9f47..a3ace8965 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,8 +14,28 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): +
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defAutoStationarity(dataset:VMDataset + + + +,max_order:int + + + +=5,threshold:float + + + +=0.05): ::: diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index d9ce3b621..6e73ea659 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'numerical_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'tabular_data'", "'numerical_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defBivariateScatterPlots(dataset): ::: diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index d90040bd4..45fc9303d 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
+
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
defBoxPierce(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 447f710d1..6b05490eb 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'categorical_data'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'tabular_data'", "'categorical_data'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defChiSquaredFeaturesTable(dataset,p_threshold=0.05): ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 03968cb51..214549a38 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,8 +18,57 @@ Threshold based tests ::: {.signature} -
@{'arguments': ["'tabular_data'", "'binary_classification'", "'multiclass_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple[Dict[str, Any], {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, bool]: +
@{'arguments': ["'tabular_data'", "'binary_classification'", "'multiclass_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defClassImbalance(dataset:VMDataset + + + +,min_percent_threshold:int + + + +=10)Tuple + + + +[Dict + + + +[str + + + +, Any + + + +] + + + +, +go.Figure + + + +, bool + + + +] + + + +: ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index d4e0c08fb..5883d1c9f 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -28,8 +28,20 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'tabular_data'", "'time_series_data'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'", "'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defDatasetDescription(dataset:VMDataset): +
@{'arguments': ["'tabular_data'", "'time_series_data'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'", "'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defDatasetDescription(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 628cc6044..f4822bdaa 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,8 +14,28 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'time_series_data'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'", "'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defDatasetSplit(datasets:List[VMDataset]): +
@{'arguments': ["'tabular_data'", "'time_series_data'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'", "'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defDatasetSplit(datasets:List + + + +[VMDataset + + + +] + + + +): ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 3dae3257d..b19027bec 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,7 +12,65 @@ toc-expand: 4 ::: {.signature} -defformat_records(df:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]})List\[Dict\[str, Any\]\]: +defformat_records(df: + +pd.DataFrame + + + + + + + +)List + + + + + + + +\[Dict + + + + + + + +\[str + + + + + + + +, Any + + + + + + + +\] + + + + + + + +\] + + + + + + + +: ::: @@ -36,8 +94,20 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -
@{'arguments': ["'tabular_data'", "'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defDescriptiveStatistics(dataset:VMDataset): +
@{'arguments': ["'tabular_data'", "'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defDescriptiveStatistics(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index ba5ef3b5c..6b96887c0 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -28,8 +28,20 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defDickeyFullerGLS(dataset:VMDataset): +
@{'arguments': ["'time_series_data'", "'forecasting'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defDickeyFullerGLS(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 26d7d8feb..734a2a0ce 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_quality'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'tabular_data'", "'data_quality'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defDuplicates(dataset,min_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 49a36345c..623009daa 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'statistical_test'", "'forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): +
@{'arguments': ["'time_series_data'", "'statistical_test'", "'forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defEngleGrangerCoint(dataset:VMDataset + + + +,threshold:float + + + +=0.05): ::: diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 16ef85506..798ad5f51 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'tabular_data'", "'visualization'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defFeatureTargetCorrelationPlot(dataset,fig_height=600): ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 1ac497f07..7779fe9f8 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,8 +14,32 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_quality'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): +
@{'arguments': ["'tabular_data'", "'data_quality'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defHighCardinality(dataset:VMDataset + + + +,num_threshold:int + + + +=100,percent_threshold:float + + + +=0.1,threshold_type:str + + + +='percent'): ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 274dcdf92..3ff785e22 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,8 +14,32 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_quality'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): +
@{'arguments': ["'tabular_data'", "'data_quality'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defHighPearsonCorrelation(dataset:VMDataset + + + +,max_threshold:float + + + +=0.3,top_n_correlations:int + + + +=10,feature_columns:list + + + +=None): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 854f29588..ebf01b368 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -26,8 +26,28 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'", "'numerical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): +
@{'arguments': ["'tabular_data'", "'visualization'", "'numerical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defIQROutliersBarPlot(dataset:VMDataset + + + +,threshold:float + + + +=1.5,fig_width:int + + + +=800): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 0fefd7284..ff913aa14 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -26,8 +26,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'numerical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): +
@{'arguments': ["'tabular_data'", "'numerical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defIQROutliersTable(dataset:VMDataset + + + +,threshold:float + + + +=1.5): ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index d02565ad5..f3a2f1b52 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,8 +14,32 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'anomaly_detection'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): +
@{'arguments': ["'tabular_data'", "'anomaly_detection'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defIsolationForestOutliers(dataset:VMDataset + + + +,random_state:int + + + +=0,contamination:float + + + +=0.1,feature_columns:list + + + +=None): ::: diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index 1512482f2..b7ca9a5e8 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
+
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
defJarqueBera(dataset): ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 42a002434..afd4707fc 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -28,8 +28,20 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'stationarity'", "'unit_root_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defKPSS(dataset:VMDataset): +
@{'arguments': ["'time_series_data'", "'stationarity'", "'unit_root_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defKPSS(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 89c7af834..652435b0b 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
+
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
defLJungBox(dataset): ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index c8f7816bc..c1c493fb8 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): +
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defLaggedCorrelationHeatmap(dataset:VMDataset + + + +,num_lags:int + + + +=10): ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index a04bb4dab..05474a9ca 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_quality'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defMissingValues(dataset:VMDataset,min_threshold:int=1): +
@{'arguments': ["'tabular_data'", "'data_quality'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defMissingValues(dataset:VMDataset + + + +,min_threshold:int + + + +=1): ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 14f3bc235..57228ef0d 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,8 +14,28 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_quality'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): +
@{'arguments': ["'tabular_data'", "'data_quality'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defMissingValuesBarPlot(dataset:VMDataset + + + +,threshold:int + + + +=80,fig_height:int + + + +=600): ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 1d40a85d4..0c5cb93f8 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,8 +14,28 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'feature_selection'", "'data_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): +
@{'arguments': ["'feature_selection'", "'data_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defMutualInformation(dataset:VMDataset + + + +,min_threshold:float + + + +=0.01,task:str + + + +='classification'): ::: diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index d2d570983..ca0fd0652 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'numerical_data'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'tabular_data'", "'numerical_data'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defPearsonCorrelationMatrix(dataset): ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index ed2e2eb5e..e80070421 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -28,8 +28,20 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defPhillipsPerronArch(dataset:VMDataset): +
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defPhillipsPerronArch(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 873f51493..1c07fddbf 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -28,7 +28,15 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defProtectedClassesCombination(dataset,model,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index bc6512a64..f855b71f4 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -28,7 +28,15 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'bias_and_fairness'", "'descriptive_statistics'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'bias_and_fairness'", "'descriptive_statistics'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defProtectedClassesDescription(dataset,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 59c6d9c57..9d3acee92 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -28,8 +28,32 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=['fnr', 'fpr', 'tpr']): +
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=['fnr' + + + +, 'fpr' + + + +, 'tpr' + + + +] + + + +): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 9fabfb49f..f97935dac 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -100,7 +100,15 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defProtectedClassesThresholdOptimizer(dataset,pipeline=None,protected_classes=None,X_train=None,y_train=None): ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 1813232f4..af32006af 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -26,8 +26,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'visualization'", "'stationarity'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defRollingStatsPlot(dataset:VMDataset,window_size:int=12): +
@{'arguments': ["'time_series_data'", "'visualization'", "'stationarity'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defRollingStatsPlot(dataset:VMDataset + + + +,window_size:int + + + +=12): ::: diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 10f69524d..14f8e8d7e 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'tabular_data'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
+
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
@{'arguments': ["'tabular_data'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
defRunsTest(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 4f8bd8d6a..f7509cbcb 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defScatterPlot(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index e21ac7890..041a5f0a0 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,8 +14,32 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'visualization'", "'credit_risk'", "'scorecard'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): +
@{'arguments': ["'visualization'", "'credit_risk'", "'scorecard'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defScoreBandDefaultRates(dataset:VMDataset + + + +,model:VMModel + + + +,score_column:str + + + +='score',score_bands:list + + + +=None): ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 58be58fb8..9620635f1 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -28,8 +28,24 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'seasonality'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): +
@{'arguments': ["'time_series_data'", "'seasonality'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defSeasonalDecompose(dataset:VMDataset + + + +,seasonal_model:str + + + +='additive'): ::: diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 8abdae0f8..5e8f00ded 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
+
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
defShapiroWilk(dataset): ::: diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index 86b0acbf6..ee6f2c7ee 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'data_quality'", "'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'data_quality'", "'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defSkewness(dataset,max_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 589bf90c8..f347b53c5 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,8 +14,20 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defSpreadPlot(dataset:VMDataset): +
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defSpreadPlot(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 1b27b19a6..6ac40f754 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,8 +14,20 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defTabularCategoricalBarPlots(dataset:VMDataset): +
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defTabularCategoricalBarPlots(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 19e75eed3..02f458401 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,8 +14,20 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defTabularDateTimeHistograms(dataset:VMDataset): +
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defTabularDateTimeHistograms(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 376fe7dc9..a9aa9c053 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -86,7 +86,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defTabularDescriptionTables(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 9d0604919..bf7fa95fe 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,8 +14,20 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defTabularNumericalHistograms(dataset:VMDataset): +
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defTabularNumericalHistograms(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 6255b653d..9d17e36d4 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,8 +14,20 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defTargetRateBarPlots(dataset:VMDataset): +
@{'arguments': ["'tabular_data'", "'visualization'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defTargetRateBarPlots(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index a5edac2c3..4683bd792 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'time_series_data'", "'analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defTimeSeriesDescription(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index e468e92b2..db6f84d7d 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'time_series_data'", "'analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defTimeSeriesDescriptiveStatistics(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 9c9801328..ea1668d73 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,8 +14,20 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defTimeSeriesFrequency(dataset:VMDataset): +
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defTimeSeriesFrequency(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index c2d966fc9..1b36df203 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -28,7 +28,15 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'data_validation'", "'visualization'", "'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'data_validation'", "'visualization'", "'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defTimeSeriesHistogram(dataset,nbins=30): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 9e03f68fe..c105bd3d1 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,8 +14,20 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defTimeSeriesLinePlot(dataset:VMDataset): +
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defTimeSeriesLinePlot(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index f392b3ab7..aca52cf45 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): +
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defTimeSeriesMissingValues(dataset:VMDataset + + + +,min_threshold:int + + + +=1): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index d6e23f70d..463eb8fbb 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): +
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defTimeSeriesOutliers(dataset:VMDataset + + + +,zscore_threshold:int + + + +=3): ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 461ac4c38..39462d44d 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): +
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defTooManyZeroValues(dataset:VMDataset + + + +,max_percent_threshold:float + + + +=0.03): ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index dceef0bff..ea8071120 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): +
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defUniqueRows(dataset:VMDataset + + + +,min_percent_threshold:float + + + +=1): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 4d0df7c0e..99d66d046 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -28,8 +28,32 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): +
@{'arguments': ["'tabular_data'", "'visualization'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defWOEBinPlots(dataset:VMDataset + + + +,breaks_adj:list + + + +=None,fig_height:int + + + +=600,fig_width:int + + + +=500): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index b83d01a26..8b9cb55e8 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): +
@{'arguments': ["'tabular_data'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defWOEBinTable(dataset:VMDataset + + + +,breaks_adj:list + + + +=None): ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 3176304ae..17d411ecb 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -28,8 +28,20 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'stationarity'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defZivotAndrewsArch(dataset:VMDataset): +
@{'arguments': ["'time_series_data'", "'stationarity'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defZivotAndrewsArch(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index 62bcc9e1e..835a21aeb 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,8 +14,20 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defCommonWords(dataset:VMDataset): +
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defCommonWords(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 4bf4c19b6..c520bdbc6 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defHashtags(dataset:VMDataset,top_hashtags:int=25): +
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defHashtags(dataset:VMDataset + + + +,top_hashtags:int + + + +=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 02b678a12..26b2170a0 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defLanguageDetection(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 982146481..87572f29e 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defMentions(dataset:VMDataset,top_mentions:int=25): +
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defMentions(dataset:VMDataset + + + +,top_mentions:int + + + +=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index afeb67dd3..555fcefad 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defPolarityAndSubjectivity(dataset,threshold_subjectivity=0.5,threshold_polarity=0): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index e264bca3a..00867f670 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -18,7 +18,15 @@ Metrics functions for any Pandas-compatible datasets ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'", "'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'", "'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defPunctuations(dataset,count_mode='token'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index e81a3dc37..cc875601d 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defSentiment(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index 78c3d7fbb..8541bdb48 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,8 +18,28 @@ Threshold based tests ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'frequency_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): +
@{'arguments': ["'nlp'", "'text_data'", "'frequency_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defStopWords(dataset:VMDataset + + + +,min_percent_threshold:float + + + +=0.5,num_words:int + + + +=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 731ce56e7..665af1e9a 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -26,8 +26,80 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defTextDescription(dataset:VMDataset,unwanted_tokens:set={'s', "s'", 'mr', 'ms', 'mrs', 'dr', "'s", ' ', "''", 'dollar', 'us', '``'},lang:str='english'): +
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defTextDescription(dataset:VMDataset + + + +,unwanted_tokens:set + + + +={'s' + + + +, "s'" + + + +, 'mr' + + + +, 'ms' + + + +, 'mrs' + + + +, 'dr' + + + +, "'s" + + + +, ' ' + + + +, "''" + + + +, 'dollar' + + + +, 'us' + + + +, '``' + + + +} + + + +,lang:str + + + +='english'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index be39d188a..d03b4d10b 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defToxicity(dataset): ::: diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 3e573fb32..8a1a1999b 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -38,7 +38,15 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defBertScore(dataset,model,evaluation_model='distilbert-base-uncased'): ::: diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index b56e3719a..7b99781f6 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -38,7 +38,15 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defBleuScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index e4c6634dd..5b29e0662 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defClusterSizeDistribution(dataset:VMDataset,model:VMModel): +
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defClusterSizeDistribution(dataset:VMDataset + + + +,model:VMModel + + + +): ::: diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index a8d946c8f..8ae7b0c50 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -38,7 +38,15 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defContextualRecall(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index b7bb22bca..623cf523e 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -28,8 +28,28 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'feature_importance'", "'AUC'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): +
@{'arguments': ["'feature_importance'", "'AUC'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defFeaturesAUC(dataset:VMDataset + + + +,fontsize:int + + + +=12,figure_height:int + + + +=500): ::: diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 5e6d353a5..84ac6bf64 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -38,7 +38,15 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defMeteorScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index cf9ad50f9..3b1e2b3f8 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -28,7 +28,15 @@ Attempts to extract all model info from a model object instance ::: {.signature} -
@{'arguments': ["'model_training'", "'metadata'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'model_training'", "'metadata'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defModelMetadata(model): ::: diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index 199639ca4..cafe79c40 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'residual_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'residual_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defModelPredictionResiduals(dataset,model,nbins=100,p_value_threshold=0.05,start_date=None,end_date=None): ::: diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 976bd8c63..f8f3d6db8 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -38,7 +38,15 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defRegardScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index fc506cc4d..061c02e83 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,8 +14,28 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): +
@{'arguments': ["'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defRegressionResidualsPlot(model:VMModel + + + +,dataset:VMDataset + + + +,bin_size:float + + + +=0.1): ::: diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index f2ab200c6..c1142b616 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defRougeScore(dataset,model,metric='rouge-1'): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index b430bf252..c81253fc6 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_predictions'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'model_predictions'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defTimeSeriesPredictionWithCI(dataset,model,confidence=0.95): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index e90fb607c..972d74a1f 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_predictions'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'model_predictions'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defTimeSeriesPredictionsPlot(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 57d973d79..e038cb536 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defTimeSeriesR2SquareBySegments(dataset,model,segments=None): ::: diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index f75f74b1d..71fedacbc 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defTokenDisparity(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index 4c0ae89dd..89d36dd6e 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defToxicityScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 2ded884b2..75a0b6f1f 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): +
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defAdjustedMutualInformation(model:VMModel + + + +,dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 299bbc375..e869c5422 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defAdjustedRandIndex(model:VMModel,dataset:VMDataset): +
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defAdjustedRandIndex(model:VMModel + + + +,dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index dd8074550..004d41132 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,8 +14,28 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): +
@{'arguments': ["'sklearn'", "'model_performance'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defCalibrationCurve(model:VMModel + + + +,dataset:VMDataset + + + +,n_bins:int + + + +=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index bbf2b326d..6db71bbc0 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,8 +14,28 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defClassifierPerformance(dataset:VMDataset + + + +,model:VMModel + + + +,average:str + + + +='macro'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 586579b2e..10ca5b68d 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_validation'", "'threshold_optimization'", "'classification_metrics'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): +
@{'arguments': ["'model_validation'", "'threshold_optimization'", "'classification_metrics'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defClassifierThresholdOptimization(dataset:VMDataset + + + +,model:VMModel + + + +,methods=None,target_recall=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 5fbfd5ec3..4910b7165 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): +
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defClusterCosineSimilarity(model:VMModel + + + +,dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index fc0edb78c..ff1b7b5db 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): +
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defClusterPerformanceMetrics(model:VMModel + + + +,dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index f25671734..4655142f3 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defCompletenessScore(model:VMModel,dataset:VMDataset): +
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defCompletenessScore(model:VMModel + + + +,dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 7aa3ba21e..a7b3f2edc 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defConfusionMatrix(dataset:VMDataset,model:VMModel): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defConfusionMatrix(dataset:VMDataset + + + +,model:VMModel + + + +): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 00e21d96c..2fa419a1b 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,8 +14,28 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_explainability'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): +
@{'arguments': ["'model_explainability'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defFeatureImportance(dataset:VMDataset + + + +,model:VMModel + + + +,num_features:int + + + +=3): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index ce49ac028..be80a5a74 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): +
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defFowlkesMallowsScore(dataset:VMDataset + + + +,model:VMModel + + + +): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 1047cb048..b28a37cca 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defHomogeneityScore(dataset:VMDataset,model:VMModel): +
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defHomogeneityScore(dataset:VMDataset + + + +,model:VMModel + + + +): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 76a8b363c..d5a5b9f0e 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defcustom_recall(y_true,y_pred_proba,threshold=0.5): ::: @@ -27,8 +35,76 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union[str, List, Dict]=None,thresholds:Union[float, List[float]]=None,fit_params:dict=None): +
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'clustering'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defHyperParametersTuning(model:VMModel + + + +,dataset:VMDataset + + + +,param_grid:dict + + + +,scoring:Union + + + +[str + + + +, List + + + +, Dict + + + +] + + + +=None,thresholds:Union + + + +[float + + + +, List + + + +[float + + + +] + + + +] + + + +=None,fit_params:dict + + + +=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index b19c9270b..ba139b4c1 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,8 +14,48 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'kmeans'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union[List[int], None]=None): +
@{'arguments': ["'sklearn'", "'model_performance'", "'kmeans'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defKMeansClustersOptimization(model:VMModel + + + +,dataset:VMDataset + + + +,n_clusters:Union + + + +[List + + + +[int + + + +] + + + +, None + + + +] + + + +=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 2a17f372b..e199a5747 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,8 +14,28 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defMinimumAccuracy(dataset:VMDataset + + + +,model:VMModel + + + +,min_threshold:float + + + +=0.7): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 28b73b249..6d4df2363 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,8 +14,28 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defMinimumF1Score(dataset:VMDataset + + + +,model:VMModel + + + +,min_threshold:float + + + +=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index cdde04360..51701e69a 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,8 +14,28 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defMinimumROCAUCScore(dataset:VMDataset + + + +,model:VMModel + + + +,min_threshold:float + + + +=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 126af3249..7fec239dd 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_training'", "'metadata'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'model_training'", "'metadata'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defModelParameters(model,model_params=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index cc3220c71..acd05da2a 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -24,8 +24,32 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'model_comparison'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defModelsPerformanceComparison(dataset:VMDataset,models:list[VMModel]): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'model_comparison'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defModelsPerformanceComparison(dataset:VMDataset + + + +,models:list + + + +[VMModel + + + +] + + + +): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index a399fb98b..4bc667d3c 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -28,8 +28,44 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'linear_regression'", "'model_diagnosis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defOverfitDiagnosis(model:VMModel,datasets:List[VMDataset],metric:str=None,cut_off_threshold:float=DEFAULT_THRESHOLD): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'linear_regression'", "'model_diagnosis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defOverfitDiagnosis(model:VMModel + + + +,datasets:List + + + +[VMDataset + + + +] + + + +,metric:str + + + +=None,cut_off_threshold:float + + + +=DEFAULT_THRESHOLD + + + +): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index a9479df1b..c868cfa1b 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -28,8 +28,56 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union[int, None]=None,figure_height:Union[int, None]=None): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defPermutationFeatureImportance(model:VMModel + + + +,dataset:VMDataset + + + +,fontsize:Union + + + +[int + + + +, None + + + +] + + + +=None,figure_height:Union + + + +[int + + + +, None + + + +] + + + +=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 5779904fc..bdabb5400 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -46,8 +46,40 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defPopulationStabilityIndex(datasets:List[VMDataset],model:VMModel,num_bins:int=10,mode:str='fixed'): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defPopulationStabilityIndex(datasets:List + + + +[VMDataset + + + +] + + + +,model:VMModel + + + +,num_bins:int + + + +=10,mode:str + + + +='fixed'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 9e177caa4..9aad269a1 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defPrecisionRecallCurve(model:VMModel + + + +,dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 9eaadb802..25c0f0608 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defROCCurve(model:VMModel,dataset:VMDataset): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defROCCurve(model:VMModel + + + +,dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index 8332b3fd7..c8c6b04e7 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defRegressionErrors(model,dataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index a520e9173..578987191 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -28,7 +28,15 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defRegressionErrorsComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index fef59bf85..f82809021 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -28,8 +28,24 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defRegressionPerformance(model:VMModel,dataset:VMDataset): +
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defRegressionPerformance(model:VMModel + + + +,dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index e06d0eb7a..cfc229fe9 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -12,7 +12,43 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual: + +np.ndarray + + + + + + + +,predicted: + +np.ndarray + + + + + + + +,rowcount:int + + + + + + + +,featurecount:int + + + + + + + +): ::: @@ -28,7 +64,15 @@ Adjusted R2 Score ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defRegressionR2Square(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 3b60d9372..aab0159c3 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -12,7 +12,43 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual: + +np.ndarray + + + + + + + +,predicted: + +np.ndarray + + + + + + + +,rowcount:int + + + + + + + +,featurecount:int + + + + + + + +): ::: @@ -28,7 +64,15 @@ Adjusted R2 Score ::: {.signature} -
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defRegressionR2SquareComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 058f298e2..7f64debb0 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -28,8 +28,60 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_diagnosis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defRobustnessDiagnosis(datasets:List[VMDataset],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List[float]=DEFAULT_STD_DEV_LIST,performance_decay_threshold:float=DEFAULT_DECAY_THRESHOLD): +
@{'arguments': ["'sklearn'", "'model_diagnosis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defRobustnessDiagnosis(datasets:List + + + +[VMDataset + + + +] + + + +,model:VMModel + + + +,metric:str + + + +=None,scaling_factor_std_dev_list:List + + + +[float + + + +] + + + +=DEFAULT_STD_DEV_LIST + + + +,performance_decay_threshold:float + + + +=DEFAULT_DECAY_THRESHOLD + + + +): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 907c1a3fe..c97abd4be 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -85,8 +85,36 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defSHAPGlobalImportance(model:VMModel + + + +,dataset:VMDataset + + + +,kernel_explainer_samples:int + + + +=10,tree_or_linear_explainer_samples:int + + + +=200,class_of_interest:int + + + +=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 08a0dafd4..57be01f2d 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,8 +14,32 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'visualization'", "'credit_risk'", "'calibration'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): +
@{'arguments': ["'visualization'", "'credit_risk'", "'calibration'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defScoreProbabilityAlignment(model:VMModel + + + +,dataset:VMDataset + + + +,score_column:str + + + +='score',n_bins:int + + + +=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index a9817c45b..0320dcf97 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defSilhouettePlot(model:VMModel,dataset:VMDataset): +
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defSilhouettePlot(model:VMModel + + + +,dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index be0b904ec..c15476fc8 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,8 +14,36 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defTrainingTestDegradation(datasets:List[VMDataset],model:VMModel,max_threshold:float=0.1): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defTrainingTestDegradation(datasets:List + + + +[VMDataset + + + +] + + + +,model:VMModel + + + +,max_threshold:float + + + +=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index e06e89185..8e7eb1df0 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,8 +14,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defVMeasure(dataset:VMDataset,model:VMModel): +
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defVMeasure(dataset:VMDataset + + + +,model:VMModel + + + +): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 023d2b799..f79df9100 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,8 +14,112 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_diagnosis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defWeakspotsDiagnosis(datasets:List[VMDataset],model:VMModel,features_columns:Union[List[str], None]=None,metrics:Union[Dict[str, Callable], None]=None,thresholds:Union[Dict[str, float], None]=None): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_diagnosis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defWeakspotsDiagnosis(datasets:List + + + +[VMDataset + + + +] + + + +,model:VMModel + + + +,features_columns:Union + + + +[List + + + +[str + + + +] + + + +, None + + + +] + + + +=None,metrics:Union + + + +[Dict + + + +[str + + + +, Callable + + + +] + + + +, None + + + +] + + + +=None,thresholds:Union + + + +[Dict + + + +[str + + + +, float + + + +] + + + +, None + + + +] + + + +=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 4fa476617..433cb7b8d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -28,8 +28,24 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'model_selection'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defAutoARIMA(model:VMModel,dataset:VMDataset): +
@{'arguments': ["'time_series_data'", "'forecasting'", "'model_selection'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defAutoARIMA(model:VMModel + + + +,dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 9cb34d4f0..177f8b027 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'visualization'", "'credit_risk'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'visualization'", "'credit_risk'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defCumulativePredictionProbabilities(dataset,model,title='Cumulative Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 78799c033..1328802ab 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -14,8 +14,28 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
-defDurbinWatsonTest(dataset,model,threshold=[1.5, 2.5]): +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
+defDurbinWatsonTest(dataset,model,threshold=[1.5 + + + +, 2.5 + + + +] + + + +): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index afe9258ff..b6399b29c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defGINITable(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 80417323a..a083ecfa0 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,8 +14,28 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): +
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defKolmogorovSmirnov(model:VMModel + + + +,dataset:VMDataset + + + +,dist:str + + + +='norm'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index d7cedeb99..e3954468f 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,8 +14,20 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defLilliefors(dataset:VMDataset): +
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defLilliefors(dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index dd419141e..dcecaa646 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'visualization'", "'credit_risk'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'visualization'", "'credit_risk'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defPredictionProbabilitiesHistogram(dataset,model,title='Histogram of Predictive Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index d7f00900a..732d79c37 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'", "'model_training'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'tabular_data'", "'visualization'", "'model_training'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defRegressionCoeffs(model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 1a5d4e106..7067225cd 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -28,8 +28,28 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'statistical_test'", "'model_interpretation'", "'visualization'", "'feature_importance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): +
@{'arguments': ["'statistical_test'", "'model_interpretation'", "'visualization'", "'feature_importance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defRegressionFeatureSignificance(model:VMModel + + + +,fontsize:int + + + +=10,p_threshold:float + + + +=0.05): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 8cad6095c..0f12fe170 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -28,8 +28,56 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union[str, None]=None,end_date:Union[str, None]=None): +
@{'arguments': ["'time_series_data'", "'forecasting'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defRegressionModelForecastPlot(model:VMModel + + + +,dataset:VMDataset + + + +,start_date:Union + + + +[str + + + +, None + + + +] + + + +=None,end_date:Union + + + +[str + + + +, None + + + +] + + + +=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 19968da6d..c9824bb46 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -26,8 +26,24 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): +
@{'arguments': ["'time_series_data'", "'forecasting'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defRegressionModelForecastPlotLevels(model:VMModel + + + +,dataset:VMDataset + + + +): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 7bd1ece7a..9e3be05e7 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -40,8 +40,60 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'senstivity_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List[float]=[0.1],transformation:Union[str, None]=None): +
@{'arguments': ["'senstivity_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defRegressionModelSensitivityPlot(dataset:VMDataset + + + +,model:VMModel + + + +,shocks:List + + + +[float + + + +] + + + +=[0.1 + + + +] + + + +,transformation:Union + + + +[str + + + +, None + + + +] + + + +=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index ac0df4321..92810e129 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -12,7 +12,43 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual: + +np.ndarray + + + + + + + +,predicted: + +np.ndarray + + + + + + + +,rowcount:int + + + + + + + +,featurecount:int + + + + + + + +): ::: @@ -28,8 +64,24 @@ Adjusted R2 Score ::: {.signature} -
@{'arguments': ["'model_performance'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defRegressionModelSummary(dataset:VMDataset,model:VMModel): +
@{'arguments': ["'model_performance'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defRegressionModelSummary(dataset:VMDataset + + + +,model:VMModel + + + +): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 279fac97d..e04a39f0c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -28,8 +28,32 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'statsmodels'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
-defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): +
@{'arguments': ["'statsmodels'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
+defRegressionPermutationFeatureImportance(dataset:VMDataset + + + +,model:VMModel + + + +,fontsize:int + + + +=12,figure_height:int + + + +=500): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index bb40c336e..51762388d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'visualization'", "'credit_risk'", "'logistic_regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'visualization'", "'credit_risk'", "'logistic_regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defScorecardHistogram(dataset,title='Histogram of Scores',score_column='score'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 5f3aa2bc3..368aa04cb 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -14,7 +14,43 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},predicted:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},rowcount:int,featurecount:int): +defadj_r2_score(actual: + +np.ndarray + + + + + + + +,predicted: + +np.ndarray + + + + + + + +,rowcount:int + + + + + + + +,featurecount:int + + + + + + + +): ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 789c79e6e..bed689a65 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -12,7 +12,39 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str + + + + + + + +,user_prompt:str + + + + + + + +,temperature:float + + + + + + + +=0.0,seed:int + + + + + + + +=42): ::: @@ -26,7 +58,15 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str + + + + + + + +): ::: @@ -48,7 +88,15 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str + + + + + + + +): ::: @@ -72,7 +120,15 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'llm'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defBias(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index c8e9f26d1..34daf0259 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -12,7 +12,39 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str + + + + + + + +,user_prompt:str + + + + + + + +,temperature:float + + + + + + + +=0.0,seed:int + + + + + + + +=42): ::: @@ -26,7 +58,15 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str + + + + + + + +): ::: @@ -48,7 +88,15 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str + + + + + + + +): ::: @@ -72,7 +120,15 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defClarity(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 0d55cb6bb..499fb6263 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -12,7 +12,39 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str + + + + + + + +,user_prompt:str + + + + + + + +,temperature:float + + + + + + + +=0.0,seed:int + + + + + + + +=42): ::: @@ -26,7 +58,15 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str + + + + + + + +): ::: @@ -48,7 +88,15 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str + + + + + + + +): ::: @@ -72,7 +120,15 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defConciseness(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index f296b9ce7..62f74ac0a 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -12,7 +12,39 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str + + + + + + + +,user_prompt:str + + + + + + + +,temperature:float + + + + + + + +=0.0,seed:int + + + + + + + +=42): ::: @@ -26,7 +58,15 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str + + + + + + + +): ::: @@ -48,7 +88,15 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str + + + + + + + +): ::: @@ -72,7 +120,15 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defDelimitation(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index fea1a00db..b16c0a664 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -12,7 +12,39 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str + + + + + + + +,user_prompt:str + + + + + + + +,temperature:float + + + + + + + +=0.0,seed:int + + + + + + + +=42): ::: @@ -26,7 +58,15 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str + + + + + + + +): ::: @@ -48,7 +88,15 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str + + + + + + + +): ::: @@ -72,7 +120,15 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defNegativeInstruction(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 850b83be4..4ddf6885d 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -12,7 +12,39 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str + + + + + + + +,user_prompt:str + + + + + + + +,temperature:float + + + + + + + +=0.0,seed:int + + + + + + + +=42): ::: @@ -28,7 +60,15 @@ Call LLM with the given prompts and return the response ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defRobustness(model,dataset,num_tests=10): ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index e4d6dac55..a882afc94 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -12,7 +12,39 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str + + + + + + + +,user_prompt:str + + + + + + + +,temperature:float + + + + + + + +=0.0,seed:int + + + + + + + +=42): ::: @@ -26,7 +58,15 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str + + + + + + + +): ::: @@ -48,7 +88,15 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str + + + + + + + +): ::: @@ -72,7 +120,15 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} + + + +
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} + + + +
defSpecificity(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index 5b00384f1..640f73184 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -14,7 +14,39 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str + + + + + + + +,user_prompt:str + + + + + + + +,temperature:float + + + + + + + +=0.0,seed:int + + + + + + + +=42): ::: @@ -30,7 +62,15 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str + + + + + + + +): ::: @@ -54,7 +94,15 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str + + + + + + + +): ::: diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 72c0cdd2d..523bf3e8c 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -14,7 +14,15 @@ toc-expand: 4 ::: {.signature} -defdescribe_metric(metric_id:str,\*\*kwargs): +defdescribe_metric(metric_id:str + + + + + + + +,\*\*kwargs): ::: @@ -46,7 +54,15 @@ List all metrics ::: {.signature} -defrun_metric(metric_id:str,\*\*kwargs): +defrun_metric(metric_id:str + + + + + + + +,\*\*kwargs): ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 3e1893b80..021aa86d6 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -18,7 +18,11 @@ Models entrypoint ::: {.signature} -
@dataclass
+
@dataclass + + + +
classFigure: ::: @@ -33,7 +37,93 @@ Figure objects track the schema supported by the ValidMind API ::: {.signature} -__init__(key:str,figure:Union\[{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'matplotlib'}, {'cls': 'ExprName', 'name': 'figure'}, {'cls': 'ExprName', 'name': 'Figure'}]}, {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'Figure'}]}, {'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'go'}, {'cls': 'ExprName', 'name': 'FigureWidget'}]}, bytes\],ref_id:str,\_type:str='plot')None +__init__(key:str + + + + + + + +,figure:Union + + + + + + + +\[ + +matplotlib.figure.Figure + + + + + + + +, + +go.Figure + + + + + + + +, + +go.FigureWidget + + + + + + + +, bytes + + + + + + + +\] + + + + + + + +,ref_id:str + + + + + + + +,\_type:str + + + + + + + +='plot')None + + + + + + + + ::: @@ -89,7 +179,11 @@ we would render images as-is, but Plotly FigureWidgets don't work well on Google ::: {.signature} -
@dataclass
+
@dataclass + + + +
classModelAttributes: ::: @@ -104,7 +198,55 @@ Model attributes definition ::: {.signature} -__init__(architecture:str=None,framework:str=None,framework_version:str=None,language:str=None,task:ModelTask=None)None +__init__(architecture:str + + + + + + + +=None,framework:str + + + + + + + +=None,framework_version:str + + + + + + + +=None,language:str + + + + + + + +=None,task:ModelTask + + + + + + + +=None)None + + + + + + + + ::: @@ -114,7 +256,11 @@ Model attributes definition ::: {.signature} -
@classmethod
+
@classmethod + + + +
deffrom_dict(cls,data): ::: @@ -131,7 +277,11 @@ Creates a ModelAttributes instance from a dictionary ::: {.signature} -
@dataclass
+
@dataclass + + + +
classTestSuite: ::: @@ -150,7 +300,39 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -__init__(sections:List\[TestSuiteSection\]=None)None +__init__(sections:List + + + + + + + +\[TestSuiteSection + + + + + + + +\] + + + + + + + +=None)None + + + + + + + + ::: @@ -160,7 +342,15 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -defget_default_config()dict: +defget_default_config()dict + + + + + + + +: ::: @@ -180,7 +370,31 @@ Each test in a test suite can accept parameters and those parameters can have de ::: {.signature} -defget_tests()List\[str\]: +defget_tests()List + + + + + + + +\[str + + + + + + + +\] + + + + + + + +: ::: @@ -194,7 +408,15 @@ Get all test suite test objects from all sections ::: {.signature} -defnum_tests()int: +defnum_tests()int + + + + + + + +: ::: @@ -224,7 +446,31 @@ Runs a test suite ::: {.signature} -__init__(suite:TestSuite,config:dict=None,inputs:dict=None) +__init__(suite:TestSuite + + + + + + + +,config:dict + + + + + + + +=None,inputs:dict + + + + + + + +=None) ::: @@ -250,7 +496,23 @@ This method will be called after the test suite has been run and all results hav ::: {.signature} -defrun(send:bool=True,fail_fast:bool=False): +defrun(send:bool + + + + + + + +=True,fail_fast:bool + + + + + + + +=False): ::: @@ -269,7 +531,15 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -defsummarize(show_link:bool=True): +defsummarize(show_link:bool + + + + + + + +=True): ::: @@ -316,7 +586,107 @@ This way we can support multiple dataset types but under the hood we only need t ::: {.signature} -__init__(raw_dataset:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]},input_id:str=None,model:VMModel=None,index:{'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}=None,index_name:str=None,date_time_index:bool=False,columns:list=None,target_column:str=None,feature_columns:list=None,text_column:str=None,extra_columns:dict=None,target_class_labels:dict=None) +__init__(raw_dataset: + +np.ndarray + + + + + + + +,input_id:str + + + + + + + +=None,model:VMModel + + + + + + + +=None,index: + +np.ndarray + + + + + + + +=None,index_name:str + + + + + + + +=None,date_time_index:bool + + + + + + + +=False,columns:list + + + + + + + +=None,target_column:str + + + + + + + +=None,feature_columns:list + + + + + + + +=None,text_column:str + + + + + + + +=None,extra_columns:dict + + + + + + + +=None,target_class_labels:dict + + + + + + + +=None) ::: @@ -363,7 +733,55 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -defassign_predictions(model:VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): +defassign_predictions(model:VMModel + + + + + + + +,prediction_column:str + + + + + + + +=None,prediction_values:list + + + + + + + +=None,probability_column:str + + + + + + + +=None,probability_values:list + + + + + + + +=None,prediction_probabilities:list + + + + + + + +=None,\*\*kwargs): ::: @@ -387,7 +805,31 @@ Assign predictions and probabilities to the dataset. ::: {.signature} -defprediction_column(model:VMModel,column_name:str=None)str: +defprediction_column(model:VMModel + + + + + + + +,column_name:str + + + + + + + +=None)str + + + + + + + +: ::: @@ -401,7 +843,31 @@ Get or set the prediction column for a model. ::: {.signature} -defprobability_column(model:VMModel,column_name:str=None)str: +defprobability_column(model:VMModel + + + + + + + +,column_name:str + + + + + + + +=None)str + + + + + + + +: ::: @@ -429,7 +895,15 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMDataset: +defwith_options(\*\*kwargs)validmind.vm_models.VMDataset + + + + + + + +: ::: @@ -466,7 +940,17 @@ Returns a dataframe containing only the feature columns ::: {.signature} -defy_df(){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +defy_df() + +pd.DataFrame + + + + + + + +: ::: @@ -480,7 +964,17 @@ Returns a dataframe containing the target column ::: {.signature} -defy_pred(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: +defy_pred(model) + +np.ndarray + + + + + + + +: ::: @@ -504,7 +998,17 @@ Attempts to stack complex prediction types (e.g., embeddings) into a single, mul ::: {.signature} -defy_pred_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +defy_pred_df(model) + +pd.DataFrame + + + + + + + +: ::: @@ -518,7 +1022,17 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -defy_prob(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'np'}, {'cls': 'ExprName', 'name': 'ndarray'}]}: +defy_prob(model) + +np.ndarray + + + + + + + +: ::: @@ -540,7 +1054,17 @@ Returns the probabilities for a given model. ::: {.signature} -defy_prob_df(model){'cls': 'ExprAttribute', 'values': [{'cls': 'ExprName', 'name': 'pd'}, {'cls': 'ExprName', 'name': 'DataFrame'}]}: +defy_prob_df(model) + +pd.DataFrame + + + + + + + +: ::: @@ -572,7 +1096,15 @@ Base class for ValidMind Input types ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMInput: +defwith_options(\*\*kwargs)validmind.vm_models.VMInput + + + + + + + +: ::: @@ -621,7 +1153,39 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -__init__(input_id:str=None,model:object=None,attributes:ModelAttributes=None,name:str=None,\*\*kwargs) +__init__(input_id:str + + + + + + + +=None,model:object + + + + + + + +=None,attributes:ModelAttributes + + + + + + + +=None,name:str + + + + + + + +=None,\*\*kwargs) ::: @@ -631,7 +1195,11 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -
@abstractmethod
+
@abstractmethod + + + +
defpredict(*args,**kwargs): ::: From 20f4be191f79e407d046acfcc9a25be94a1e13a9 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 21 Feb 2025 07:18:06 -0800 Subject: [PATCH 091/207] Remove debug statements --- docs/templates/macros/types.jinja2 | 79 +- docs/validmind.qmd | 536 +------------ docs/validmind/errors.qmd | 44 +- docs/validmind/test_suites.qmd | 88 +-- docs/validmind/tests.qmd | 730 +----------------- .../tests/data_validation/ACFandPACFPlot.qmd | 16 +- docs/validmind/tests/data_validation/ADF.qmd | 16 +- .../tests/data_validation/AutoAR.qmd | 20 +- .../tests/data_validation/AutoMA.qmd | 20 +- .../data_validation/AutoStationarity.qmd | 24 +- .../data_validation/BivariateScatterPlots.qmd | 10 +- .../tests/data_validation/BoxPierce.qmd | 10 +- .../ChiSquaredFeaturesTable.qmd | 10 +- .../tests/data_validation/ClassImbalance.qmd | 53 +- .../data_validation/DatasetDescription.qmd | 16 +- .../tests/data_validation/DatasetSplit.qmd | 24 +- .../data_validation/DescriptiveStatistics.qmd | 76 +- .../tests/data_validation/DickeyFullerGLS.qmd | 16 +- .../tests/data_validation/Duplicates.qmd | 10 +- .../data_validation/EngleGrangerCoint.qmd | 20 +- .../FeatureTargetCorrelationPlot.qmd | 10 +- .../tests/data_validation/HighCardinality.qmd | 28 +- .../HighPearsonCorrelation.qmd | 28 +- .../data_validation/IQROutliersBarPlot.qmd | 24 +- .../data_validation/IQROutliersTable.qmd | 20 +- .../IsolationForestOutliers.qmd | 28 +- .../tests/data_validation/JarqueBera.qmd | 10 +- docs/validmind/tests/data_validation/KPSS.qmd | 16 +- .../tests/data_validation/LJungBox.qmd | 10 +- .../LaggedCorrelationHeatmap.qmd | 20 +- .../tests/data_validation/MissingValues.qmd | 20 +- .../data_validation/MissingValuesBarPlot.qmd | 24 +- .../data_validation/MutualInformation.qmd | 24 +- .../PearsonCorrelationMatrix.qmd | 10 +- .../data_validation/PhillipsPerronArch.qmd | 16 +- .../ProtectedClassesCombination.qmd | 10 +- .../ProtectedClassesDescription.qmd | 10 +- .../ProtectedClassesDisparity.qmd | 28 +- .../ProtectedClassesThresholdOptimizer.qmd | 10 +- .../data_validation/RollingStatsPlot.qmd | 20 +- .../tests/data_validation/RunsTest.qmd | 10 +- .../tests/data_validation/ScatterPlot.qmd | 10 +- .../data_validation/ScoreBandDefaultRates.qmd | 28 +- .../data_validation/SeasonalDecompose.qmd | 20 +- .../tests/data_validation/ShapiroWilk.qmd | 10 +- .../tests/data_validation/Skewness.qmd | 10 +- .../tests/data_validation/SpreadPlot.qmd | 16 +- .../TabularCategoricalBarPlots.qmd | 16 +- .../TabularDateTimeHistograms.qmd | 16 +- .../TabularDescriptionTables.qmd | 10 +- .../TabularNumericalHistograms.qmd | 16 +- .../data_validation/TargetRateBarPlots.qmd | 16 +- .../data_validation/TimeSeriesDescription.qmd | 10 +- .../TimeSeriesDescriptiveStatistics.qmd | 10 +- .../data_validation/TimeSeriesFrequency.qmd | 16 +- .../data_validation/TimeSeriesHistogram.qmd | 10 +- .../data_validation/TimeSeriesLinePlot.qmd | 16 +- .../TimeSeriesMissingValues.qmd | 20 +- .../data_validation/TimeSeriesOutliers.qmd | 20 +- .../data_validation/TooManyZeroValues.qmd | 20 +- .../tests/data_validation/UniqueRows.qmd | 20 +- .../tests/data_validation/WOEBinPlots.qmd | 28 +- .../tests/data_validation/WOEBinTable.qmd | 20 +- .../data_validation/ZivotAndrewsArch.qmd | 16 +- .../tests/data_validation/nlp/CommonWords.qmd | 16 +- .../tests/data_validation/nlp/Hashtags.qmd | 20 +- .../data_validation/nlp/LanguageDetection.qmd | 10 +- .../tests/data_validation/nlp/Mentions.qmd | 20 +- .../nlp/PolarityAndSubjectivity.qmd | 10 +- .../data_validation/nlp/Punctuations.qmd | 10 +- .../tests/data_validation/nlp/Sentiment.qmd | 10 +- .../tests/data_validation/nlp/StopWords.qmd | 24 +- .../data_validation/nlp/TextDescription.qmd | 76 +- .../tests/data_validation/nlp/Toxicity.qmd | 10 +- .../tests/model_validation/BertScore.qmd | 10 +- .../tests/model_validation/BleuScore.qmd | 10 +- .../ClusterSizeDistribution.qmd | 20 +- .../model_validation/ContextualRecall.qmd | 10 +- .../tests/model_validation/FeaturesAUC.qmd | 24 +- .../tests/model_validation/MeteorScore.qmd | 10 +- .../tests/model_validation/ModelMetadata.qmd | 10 +- .../ModelPredictionResiduals.qmd | 10 +- .../tests/model_validation/RegardScore.qmd | 10 +- .../RegressionResidualsPlot.qmd | 24 +- .../tests/model_validation/RougeScore.qmd | 10 +- .../TimeSeriesPredictionWithCI.qmd | 10 +- .../TimeSeriesPredictionsPlot.qmd | 10 +- .../TimeSeriesR2SquareBySegments.qmd | 10 +- .../tests/model_validation/TokenDisparity.qmd | 10 +- .../tests/model_validation/ToxicityScore.qmd | 10 +- .../sklearn/AdjustedMutualInformation.qmd | 20 +- .../sklearn/AdjustedRandIndex.qmd | 20 +- .../sklearn/CalibrationCurve.qmd | 24 +- .../sklearn/ClassifierPerformance.qmd | 24 +- .../ClassifierThresholdOptimization.qmd | 20 +- .../sklearn/ClusterCosineSimilarity.qmd | 20 +- .../sklearn/ClusterPerformanceMetrics.qmd | 20 +- .../sklearn/CompletenessScore.qmd | 20 +- .../sklearn/ConfusionMatrix.qmd | 20 +- .../sklearn/FeatureImportance.qmd | 24 +- .../sklearn/FowlkesMallowsScore.qmd | 20 +- .../sklearn/HomogeneityScore.qmd | 20 +- .../sklearn/HyperParametersTuning.qmd | 82 +- .../sklearn/KMeansClustersOptimization.qmd | 44 +- .../sklearn/MinimumAccuracy.qmd | 24 +- .../sklearn/MinimumF1Score.qmd | 24 +- .../sklearn/MinimumROCAUCScore.qmd | 24 +- .../sklearn/ModelParameters.qmd | 10 +- .../sklearn/ModelsPerformanceComparison.qmd | 28 +- .../sklearn/OverfitDiagnosis.qmd | 40 +- .../sklearn/PermutationFeatureImportance.qmd | 52 +- .../sklearn/PopulationStabilityIndex.qmd | 36 +- .../sklearn/PrecisionRecallCurve.qmd | 20 +- .../model_validation/sklearn/ROCCurve.qmd | 20 +- .../sklearn/RegressionErrors.qmd | 10 +- .../sklearn/RegressionErrorsComparison.qmd | 10 +- .../sklearn/RegressionPerformance.qmd | 20 +- .../sklearn/RegressionR2Square.qmd | 48 +- .../sklearn/RegressionR2SquareComparison.qmd | 48 +- .../sklearn/RobustnessDiagnosis.qmd | 56 +- .../sklearn/SHAPGlobalImportance.qmd | 32 +- .../sklearn/ScoreProbabilityAlignment.qmd | 28 +- .../sklearn/SilhouettePlot.qmd | 20 +- .../sklearn/TrainingTestDegradation.qmd | 32 +- .../model_validation/sklearn/VMeasure.qmd | 20 +- .../sklearn/WeakspotsDiagnosis.qmd | 108 +-- .../statsmodels/AutoARIMA.qmd | 20 +- .../CumulativePredictionProbabilities.qmd | 10 +- .../statsmodels/DurbinWatsonTest.qmd | 24 +- .../statsmodels/GINITable.qmd | 10 +- .../statsmodels/KolmogorovSmirnov.qmd | 24 +- .../statsmodels/Lilliefors.qmd | 16 +- .../PredictionProbabilitiesHistogram.qmd | 10 +- .../statsmodels/RegressionCoeffs.qmd | 10 +- .../RegressionFeatureSignificance.qmd | 24 +- .../RegressionModelForecastPlot.qmd | 52 +- .../RegressionModelForecastPlotLevels.qmd | 20 +- .../RegressionModelSensitivityPlot.qmd | 56 +- .../statsmodels/RegressionModelSummary.qmd | 58 +- ...RegressionPermutationFeatureImportance.qmd | 28 +- .../statsmodels/ScorecardHistogram.qmd | 10 +- .../statsmodels/statsutils.qmd | 38 +- .../tests/prompt_validation/Bias.qmd | 64 +- .../tests/prompt_validation/Clarity.qmd | 64 +- .../tests/prompt_validation/Conciseness.qmd | 64 +- .../tests/prompt_validation/Delimitation.qmd | 64 +- .../prompt_validation/NegativeInstruction.qmd | 64 +- .../tests/prompt_validation/Robustness.qmd | 44 +- .../tests/prompt_validation/Specificity.qmd | 64 +- .../prompt_validation/ai_powered_test.qmd | 54 +- docs/validmind/unit_metrics.qmd | 20 +- docs/validmind/vm_models.qmd | 620 +-------------- 152 files changed, 345 insertions(+), 5247 deletions(-) diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index cf682deda..952561b00 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -1,14 +1,38 @@ {%- set builtin_types = ['str', 'dict', 'list', 'bool', 'int', 'float', 'object', 'callable', 'tuple', 'type', 'None'] -%} {%- set type_keywords = ['Any', 'Union', 'Dict', 'List', 'Optional', 'Callable', 'Tuple'] -%} +{%- macro format_expr_name(name, module=None, add_links=false) -%} + {%- if module and name in module.members and module.members[name].kind == "alias" -%} + {{ module.members[name].target_path }} + {%- elif name in type_keywords -%} + {{ name }} + {%- elif name|lower in builtin_types -%} + {{ name }} + {%- elif add_links and name not in type_keywords -%} + validmind.vm_models.{{ name }} + {%- else -%} + {{ name }} + {%- endif -%} +{%- endmacro -%} + +{%- macro format_expr_subscript(expr, module=None, add_links=false) -%} + {{ format_type(expr.left, module, add_links) }}[ + {%- if expr.slice.cls == "ExprTuple" -%} + {%- for elem in expr.slice.elements -%} + {{ format_type(elem, module, add_links) }} + {%- if not loop.last -%}, {%- endif -%} + {%- endfor -%} + {%- else -%} + {{ format_type(expr.slice, module, add_links) }} + {%- endif -%} + ] +{%- endmacro -%} + {% macro format_type(type, module=None, add_links=false) %} {%- if type is mapping -%} {%- if type.cls is defined -%} - {%- if type.cls == "ExprAttribute" -%} - - {%- if type.get('values') is sequence -%} {%- for value in type.get('values') -%} {%- if value.cls == "ExprName" -%} @@ -20,51 +44,16 @@ {{ type|string }} {%- endif -%} {%- elif type.cls == "ExprName" -%} - {%- if module and type.name in module.members and module.members[type.name].kind == "alias" -%} - {{ module.members[type.name].target_path }} - {%- elif type.name in type_keywords -%} - {{ type.name }} - {%- elif type.name|lower in builtin_types -%} - {{ type.name }} - {%- elif add_links and type.name not in type_keywords -%} - validmind.vm_models.{{ type.name }} - {%- else -%} - {{ type.name }} - {%- endif -%} - {%- elif type.cls == "ExprList" -%} - [ - {%- for elem in type.elements -%} - {{ format_type(elem, module, add_links) }} - {%- if not loop.last -%}, {%- endif -%} - {%- endfor -%} - ] - {%- elif type.cls == "ExprSet" -%} - { + {{ format_expr_name(type.name, module, add_links) }} + {%- elif type.cls == "ExprList" or type.cls == "ExprSet" -%} + {{ '[' if type.cls == "ExprList" else '{' }} {%- for elem in type.elements -%} {{ format_type(elem, module, add_links) }} {%- if not loop.last -%}, {%- endif -%} {%- endfor -%} - } + {{ ']' if type.cls == "ExprList" else '}' }} {%- elif type.cls == "ExprSubscript" -%} - {{ format_type(type.left, module, add_links) }}[ - {%- if type.slice.cls == "ExprTuple" -%} - {%- for elem in type.slice.elements -%} - {%- if elem.cls == "ExprSubscript" and elem.left.cls == "ExprName" and elem.left.name == "Callable" -%} - [ - {%- for arg in elem.slice.elements[0].elements -%} - {{ format_type(arg, module, add_links) }} - {%- if not loop.last -%}, {%- endif -%} - {%- endfor -%} - ], {{ format_type(elem.slice.elements[1], module, add_links) }} - {%- else -%} - {{ format_type(elem, module, add_links) }} - {%- endif -%} - {%- if not loop.last -%}, {%- endif -%} - {%- endfor -%} - {%- else -%} - {{ format_type(type.slice, module, add_links) }} - {%- endif -%} - ] + {{ format_expr_subscript(type, module, add_links) }} {%- else -%} {{ type|string }} {%- endif -%} @@ -102,10 +91,6 @@ {%- else -%} {{ type|string }} {%- endif -%} - - - - {% endmacro %} {%- macro format_return_type(returns) -%} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index b1290576e..90a4eb7ca 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -55,31 +55,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -defget_test_suite(test_suite_id:str - - - - - - - -=None,section:str - - - - - - - -=None,\*args,\*\*kwargs)validmind.vm_models.TestSuite - - - - - - - -: +defget_test_suite(test_suite_id:str=None,section:str=None,\*args,\*\*kwargs)validmind.vm_models.TestSuite: ::: @@ -102,159 +78,7 @@ This function provides an interface to retrieve the TestSuite instance for the c ::: {.signature} -definit(project:Optional - - - - - - - -\[str - - - - - - - -\] - - - - - - - -=None,api_key:Optional - - - - - - - -\[str - - - - - - - -\] - - - - - - - -=None,api_secret:Optional - - - - - - - -\[str - - - - - - - -\] - - - - - - - -=None,api_host:Optional - - - - - - - -\[str - - - - - - - -\] - - - - - - - -=None,model:Optional - - - - - - - -\[str - - - - - - - -\] - - - - - - - -=None,monitoring:bool - - - - - - - -=False,generate_descriptions:Optional - - - - - - - -\[bool - - - - - - - -\] - - - - - - - -=None): +definit(project:Optional\[str\]=None,api_key:Optional\[str\]=None,api_secret:Optional\[str\]=None,api_host:Optional\[str\]=None,model:Optional\[str\]=None,monitoring:bool=False,generate_descriptions:Optional\[bool\]=None): ::: @@ -284,95 +108,7 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -definit_dataset(dataset,model=None,index=None,index_name:str - - - - - - - -=None,date_time_index:bool - - - - - - - -=False,columns:list - - - - - - - -=None,text_column:str - - - - - - - -=None,target_column:str - - - - - - - -=None,feature_columns:list - - - - - - - -=None,extra_columns:dict - - - - - - - -=None,class_labels:dict - - - - - - - -=None,type:str - - - - - - - -=None,input_id:str - - - - - - - -=None,\_\_log=True)validmind.vm_models.VMDataset - - - - - - - -: +definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True)validmind.vm_models.VMDataset: ::: @@ -413,47 +149,7 @@ The following dataset types are supported: ::: {.signature} -definit_model(model:object - - - - - - - -=None,input_id:str - - - - - - - -='model',attributes:dict - - - - - - - -=None,predict_fn:callable - - - - - - - -=None,\_\_log=True,\*\*kwargs)validmind.vm_models.VMModel - - - - - - - -: +definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs)validmind.vm_models.VMModel: ::: @@ -483,31 +179,7 @@ Initializes a VM Model, which can then be passed to other functions that can per ::: {.signature} -definit_r_model(model_path:str - - - - - - - -,input_id:str - - - - - - - -='model')validmind.vm_models.VMModel - - - - - - - -: +definit_r_model(model_path:str,input_id:str='model')validmind.vm_models.VMModel: ::: @@ -539,183 +211,7 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ::: {.signature} -deflog_metric(key:str - - - - - - - -,value:float - - - - - - - -,inputs:Optional - - - - - - - -\[List - - - - - - - -\[str - - - - - - - -\] - - - - - - - -\] - - - - - - - -=None,params:Optional - - - - - - - -\[Dict - - - - - - - -\[str - - - - - - - -, Any - - - - - - - -\] - - - - - - - -\] - - - - - - - -=None,recorded_at:Optional - - - - - - - -\[str - - - - - - - -\] - - - - - - - -=None,thresholds:Optional - - - - - - - -\[Dict - - - - - - - -\[str - - - - - - - -, Any - - - - - - - -\] - - - - - - - -\] - - - - - - - -=None): +deflog_metric(key:str,value:float,inputs:Optional\[List\[str\]\]=None,params:Optional\[Dict\[str, Any\]\]=None,recorded_at:Optional\[str\]=None,thresholds:Optional\[Dict\[str, Any\]\]=None): ::: @@ -949,15 +445,7 @@ Holds raw data for a test result ::: {.signature} -RawData(log:bool - - - - - - - -=False,\*\*kwargs) +RawData(log:bool=False,\*\*kwargs) ::: @@ -978,15 +466,7 @@ Create a new RawData object ::: {.signature} -definspect(self,show:bool - - - - - - - -=True): +definspect(self,show:bool=True): ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index bb34b9e71..b26ef7543 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -384,39 +384,7 @@ Exception raised when an error occurs while loading a test ::: {.signature} -__init__(message:str - - - - - - - -,original_error:Optional - - - - - - - -\[Exception - - - - - - - -\] - - - - - - - -=None) +__init__(message:str,original_error:Optional\[Exception\]=None) ::: @@ -904,15 +872,7 @@ returns a non-JSON string or if the API returns a non-standard error ::: {.signature} -defshould_raise_on_fail_fast(error)bool - - - - - - - -: +defshould_raise_on_fail_fast(error)bool: ::: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 50cdb2bd3..2243bdf39 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,27 +29,7 @@ Entrypoint for test suites. ::: {.signature} -defformat_dataframe(df: - -pd.DataFrame - - - - - - - -) - -pd.DataFrame - - - - - - - -: +defformat_dataframe(df:pd.DataFrame)pd.DataFrame: ::: @@ -77,23 +57,7 @@ Get a logger for the given module name ::: {.signature} -deftest_id_to_name(test_id:str - - - - - - - -)str - - - - - - - -: +deftest_id_to_name(test_id:str)str: ::: @@ -117,15 +81,7 @@ Convert a test ID to a human-readable name. ::: {.signature} -defdescribe_suite(test_suite_id:str - - - - - - - -,verbose=False): +defdescribe_suite(test_suite_id:str,verbose=False): ::: @@ -150,15 +106,7 @@ Describes a Test Suite by ID ::: {.signature} -defget_by_id(test_suite_id:str - - - - - - - -): +defget_by_id(test_suite_id:str): ::: @@ -174,15 +122,7 @@ Returns the test suite by ID ::: {.signature} -deflist_suites(pretty:bool - - - - - - - -=True): +deflist_suites(pretty:bool=True): ::: @@ -198,23 +138,7 @@ Returns a list of all available test suites ::: {.signature} -defregister_test_suite(suite_id:str - - - - - - - -,suite:TestSuite - - - - - - - -): +defregister_test_suite(suite_id:str,suite:TestSuite): ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 132fdf232..d4e60c39b 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -20,31 +20,7 @@ ValidMind Tests Module ::: {.signature} -defdescribe_test(test_id:TestID - - - - - - - -=None,raw:bool - - - - - - - -=False,show:bool - - - - - - - -=True): +defdescribe_test(test_id:TestID=None,raw:bool=False,show:bool=True): ::: @@ -139,31 +115,7 @@ List all tests in the tests directory. ::: {.signature} -defload_test(test_id:str - - - - - - - -,test_func:callable - - - - - - - -=None,reload:bool - - - - - - - -=False): +defload_test(test_id:str,test_func:callable=None,reload:bool=False): ::: @@ -184,559 +136,7 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. ::: {.signature} -defrun_test(test_id:Union - - - - - - - -\[TestID - - - - - - - -, None - - - - - - - -\] - - - - - - - -=None,name:Union - - - - - - - -\[str - - - - - - - -, None - - - - - - - -\] - - - - - - - -=None,unit_metrics:Union - - - - - - - -\[List - - - - - - - -\[TestID - - - - - - - -\] - - - - - - - -, None - - - - - - - -\] - - - - - - - -=None,inputs:Union - - - - - - - -\[Dict - - - - - - - -\[str - - - - - - - -, Any - - - - - - - -\] - - - - - - - -, None - - - - - - - -\] - - - - - - - -=None,input_grid:Union - - - - - - - -\[Dict - - - - - - - -\[str - - - - - - - -, List - - - - - - - -\[Any - - - - - - - -\] - - - - - - - -\] - - - - - - - -, List - - - - - - - -\[Dict - - - - - - - -\[str - - - - - - - -, Any - - - - - - - -\] - - - - - - - -\] - - - - - - - -, None - - - - - - - -\] - - - - - - - -=None,params:Union - - - - - - - -\[Dict - - - - - - - -\[str - - - - - - - -, Any - - - - - - - -\] - - - - - - - -, None - - - - - - - -\] - - - - - - - -=None,param_grid:Union - - - - - - - -\[Dict - - - - - - - -\[str - - - - - - - -, List - - - - - - - -\[Any - - - - - - - -\] - - - - - - - -\] - - - - - - - -, List - - - - - - - -\[Dict - - - - - - - -\[str - - - - - - - -, Any - - - - - - - -\] - - - - - - - -\] - - - - - - - -, None - - - - - - - -\] - - - - - - - -=None,show:bool - - - - - - - -=True,generate_description:bool - - - - - - - -=True,title:Optional - - - - - - - -\[str - - - - - - - -\] - - - - - - - -=None,post_process_fn:Union - - - - - - - -\[\[TestResult - - - - - - - -\], None - - - - - - - -, None - - - - - - - -\] - - - - - - - -=None,\*\*kwargs)validmind.vm_models.TestResult - - - - - - - -: +defrun_test(test_id:Union\[TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[Callable\[\[TestResult\], None\], None\]=None,\*\*kwargs)validmind.vm_models.TestResult: ::: @@ -856,31 +256,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -defregister_test_provider(namespace:str - - - - - - - -,test_provider:TestProvider - - - - - - - -)None - - - - - - - -: +defregister_test_provider(namespace:str,test_provider:TestProvider)None: ::: @@ -920,39 +296,7 @@ Exception raised when an error occurs while loading a test ::: {.signature} -__init__(message:str - - - - - - - -,original_error:Optional - - - - - - - -\[Exception - - - - - - - -\] - - - - - - - -=None) +__init__(message:str,original_error:Optional\[Exception\]=None) ::: @@ -1005,15 +349,7 @@ test = test_provider.load_test("my_namespace.my_test_class") ::: {.signature} -__init__(root_folder:str - - - - - - - -) +__init__(root_folder:str) ::: @@ -1049,15 +385,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str - - - - - - - -): +defload_test(test_id:str): ::: @@ -1102,31 +430,7 @@ Protocol for user-defined test providers ::: {.signature} -deflist_tests()List - - - - - - - -\[str - - - - - - - -\] - - - - - - - -: +deflist_tests()List\[str\]: ::: @@ -1144,23 +448,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str - - - - - - - -)callable - - - - - - - -: +defload_test(test_id:str)callable: ::: diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index c5d1210e9..d2dd28845 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,20 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defACFandPACFPlot(dataset:VMDataset - - - -): +
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defACFandPACFPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 57b8003f0..d22e2aac0 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -28,20 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'", "'stationarity'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defADF(dataset:VMDataset - - - -): +
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'", "'stationarity'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defADF(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index b1a2af805..8198f897f 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -28,24 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defAutoAR(dataset:VMDataset - - - -,max_ar_order:int - - - -=3): +
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defAutoAR(dataset:VMDataset,max_ar_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index c64982aa5..e5164d491 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -28,24 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defAutoMA(dataset:VMDataset - - - -,max_ma_order:int - - - -=3): +
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defAutoMA(dataset:VMDataset,max_ma_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index a3ace8965..b369d9f47 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,28 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defAutoStationarity(dataset:VMDataset - - - -,max_order:int - - - -=5,threshold:float - - - -=0.05): +
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 6e73ea659..d9ce3b621 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'numerical_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'tabular_data'", "'numerical_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defBivariateScatterPlots(dataset): ::: diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index 45fc9303d..d90040bd4 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
+
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
defBoxPierce(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 6b05490eb..447f710d1 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'categorical_data'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'tabular_data'", "'categorical_data'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defChiSquaredFeaturesTable(dataset,p_threshold=0.05): ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 214549a38..88b1a69f0 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,57 +18,8 @@ Threshold based tests ::: {.signature} -
@{'arguments': ["'tabular_data'", "'binary_classification'", "'multiclass_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defClassImbalance(dataset:VMDataset - - - -,min_percent_threshold:int - - - -=10)Tuple - - - -[Dict - - - -[str - - - -, Any - - - -] - - - -, -go.Figure - - - -, bool - - - -] - - - -: +
@{'arguments': ["'tabular_data'", "'binary_classification'", "'multiclass_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple[Dict[str, Any], go.Figure, bool]: ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 5883d1c9f..d4e0c08fb 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -28,20 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'tabular_data'", "'time_series_data'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'", "'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defDatasetDescription(dataset:VMDataset - - - -): +
@{'arguments': ["'tabular_data'", "'time_series_data'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'", "'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defDatasetDescription(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index f4822bdaa..628cc6044 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,28 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'time_series_data'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'", "'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defDatasetSplit(datasets:List - - - -[VMDataset - - - -] - - - -): +
@{'arguments': ["'tabular_data'", "'time_series_data'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'", "'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defDatasetSplit(datasets:List[VMDataset]): ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index b19027bec..4ebc1433b 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,65 +12,7 @@ toc-expand: 4 ::: {.signature} -defformat_records(df: - -pd.DataFrame - - - - - - - -)List - - - - - - - -\[Dict - - - - - - - -\[str - - - - - - - -, Any - - - - - - - -\] - - - - - - - -\] - - - - - - - -: +defformat_records(df:pd.DataFrame)List\[Dict\[str, Any\]\]: ::: @@ -94,20 +36,8 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -
@{'arguments': ["'tabular_data'", "'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defDescriptiveStatistics(dataset:VMDataset - - - -): +
@{'arguments': ["'tabular_data'", "'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defDescriptiveStatistics(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 6b96887c0..ba5ef3b5c 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -28,20 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defDickeyFullerGLS(dataset:VMDataset - - - -): +
@{'arguments': ["'time_series_data'", "'forecasting'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defDickeyFullerGLS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 734a2a0ce..26d7d8feb 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_quality'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'tabular_data'", "'data_quality'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defDuplicates(dataset,min_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 623009daa..49a36345c 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'statistical_test'", "'forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defEngleGrangerCoint(dataset:VMDataset - - - -,threshold:float - - - -=0.05): +
@{'arguments': ["'time_series_data'", "'statistical_test'", "'forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 798ad5f51..16ef85506 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'tabular_data'", "'visualization'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defFeatureTargetCorrelationPlot(dataset,fig_height=600): ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 7779fe9f8..1ac497f07 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,32 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_quality'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defHighCardinality(dataset:VMDataset - - - -,num_threshold:int - - - -=100,percent_threshold:float - - - -=0.1,threshold_type:str - - - -='percent'): +
@{'arguments': ["'tabular_data'", "'data_quality'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 3ff785e22..274dcdf92 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,32 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_quality'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defHighPearsonCorrelation(dataset:VMDataset - - - -,max_threshold:float - - - -=0.3,top_n_correlations:int - - - -=10,feature_columns:list - - - -=None): +
@{'arguments': ["'tabular_data'", "'data_quality'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index ebf01b368..854f29588 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -26,28 +26,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'", "'numerical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defIQROutliersBarPlot(dataset:VMDataset - - - -,threshold:float - - - -=1.5,fig_width:int - - - -=800): +
@{'arguments': ["'tabular_data'", "'visualization'", "'numerical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index ff913aa14..0fefd7284 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -26,24 +26,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'numerical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defIQROutliersTable(dataset:VMDataset - - - -,threshold:float - - - -=1.5): +
@{'arguments': ["'tabular_data'", "'numerical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index f3a2f1b52..d02565ad5 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,32 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'anomaly_detection'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defIsolationForestOutliers(dataset:VMDataset - - - -,random_state:int - - - -=0,contamination:float - - - -=0.1,feature_columns:list - - - -=None): +
@{'arguments': ["'tabular_data'", "'anomaly_detection'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index b7ca9a5e8..1512482f2 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
+
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
defJarqueBera(dataset): ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index afd4707fc..42a002434 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -28,20 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'stationarity'", "'unit_root_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defKPSS(dataset:VMDataset - - - -): +
@{'arguments': ["'time_series_data'", "'stationarity'", "'unit_root_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defKPSS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 652435b0b..89c7af834 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
+
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
defLJungBox(dataset): ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index c1c493fb8..c8f7816bc 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defLaggedCorrelationHeatmap(dataset:VMDataset - - - -,num_lags:int - - - -=10): +
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 05474a9ca..a04bb4dab 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_quality'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defMissingValues(dataset:VMDataset - - - -,min_threshold:int - - - -=1): +
@{'arguments': ["'tabular_data'", "'data_quality'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 57228ef0d..14f3bc235 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,28 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_quality'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defMissingValuesBarPlot(dataset:VMDataset - - - -,threshold:int - - - -=80,fig_height:int - - - -=600): +
@{'arguments': ["'tabular_data'", "'data_quality'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 0c5cb93f8..1d40a85d4 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,28 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'feature_selection'", "'data_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defMutualInformation(dataset:VMDataset - - - -,min_threshold:float - - - -=0.01,task:str - - - -='classification'): +
@{'arguments': ["'feature_selection'", "'data_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): ::: diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index ca0fd0652..d2d570983 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'numerical_data'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'tabular_data'", "'numerical_data'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defPearsonCorrelationMatrix(dataset): ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index e80070421..ed2e2eb5e 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -28,20 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defPhillipsPerronArch(dataset:VMDataset - - - -): +
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defPhillipsPerronArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 1c07fddbf..873f51493 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -28,15 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defProtectedClassesCombination(dataset,model,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index f855b71f4..bc6512a64 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -28,15 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'bias_and_fairness'", "'descriptive_statistics'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'bias_and_fairness'", "'descriptive_statistics'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defProtectedClassesDescription(dataset,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 9d3acee92..59c6d9c57 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -28,32 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=['fnr' - - - -, 'fpr' - - - -, 'tpr' - - - -] - - - -): +
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=['fnr', 'fpr', 'tpr']): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index f97935dac..9fabfb49f 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -100,15 +100,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defProtectedClassesThresholdOptimizer(dataset,pipeline=None,protected_classes=None,X_train=None,y_train=None): ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index af32006af..1813232f4 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -26,24 +26,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'visualization'", "'stationarity'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defRollingStatsPlot(dataset:VMDataset - - - -,window_size:int - - - -=12): +
@{'arguments': ["'time_series_data'", "'visualization'", "'stationarity'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defRollingStatsPlot(dataset:VMDataset,window_size:int=12): ::: diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 14f8e8d7e..10f69524d 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
@{'arguments': ["'tabular_data'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
+
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'tabular_data'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
defRunsTest(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index f7509cbcb..4f8bd8d6a 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defScatterPlot(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 041a5f0a0..e21ac7890 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,32 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'visualization'", "'credit_risk'", "'scorecard'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defScoreBandDefaultRates(dataset:VMDataset - - - -,model:VMModel - - - -,score_column:str - - - -='score',score_bands:list - - - -=None): +
@{'arguments': ["'visualization'", "'credit_risk'", "'scorecard'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 9620635f1..58be58fb8 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -28,24 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'seasonality'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defSeasonalDecompose(dataset:VMDataset - - - -,seasonal_model:str - - - -='additive'): +
@{'arguments': ["'time_series_data'", "'seasonality'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): ::: diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 5e8f00ded..8abdae0f8 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
+
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
defShapiroWilk(dataset): ::: diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index ee6f2c7ee..86b0acbf6 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'data_quality'", "'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'data_quality'", "'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defSkewness(dataset,max_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index f347b53c5..589bf90c8 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,20 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defSpreadPlot(dataset:VMDataset - - - -): +
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defSpreadPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 6ac40f754..1b27b19a6 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,20 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defTabularCategoricalBarPlots(dataset:VMDataset - - - -): +
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defTabularCategoricalBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 02f458401..19e75eed3 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,20 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defTabularDateTimeHistograms(dataset:VMDataset - - - -): +
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defTabularDateTimeHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index a9aa9c053..376fe7dc9 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -86,15 +86,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTabularDescriptionTables(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index bf7fa95fe..9d0604919 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,20 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defTabularNumericalHistograms(dataset:VMDataset - - - -): +
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defTabularNumericalHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 9d17e36d4..6255b653d 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,20 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defTargetRateBarPlots(dataset:VMDataset - - - -): +
@{'arguments': ["'tabular_data'", "'visualization'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defTargetRateBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 4683bd792..a5edac2c3 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'time_series_data'", "'analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTimeSeriesDescription(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index db6f84d7d..e468e92b2 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'time_series_data'", "'analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTimeSeriesDescriptiveStatistics(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index ea1668d73..9c9801328 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,20 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defTimeSeriesFrequency(dataset:VMDataset - - - -): +
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defTimeSeriesFrequency(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 1b36df203..c2d966fc9 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -28,15 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'data_validation'", "'visualization'", "'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'data_validation'", "'visualization'", "'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTimeSeriesHistogram(dataset,nbins=30): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index c105bd3d1..9e03f68fe 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,20 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defTimeSeriesLinePlot(dataset:VMDataset - - - -): +
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defTimeSeriesLinePlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index aca52cf45..f392b3ab7 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defTimeSeriesMissingValues(dataset:VMDataset - - - -,min_threshold:int - - - -=1): +
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 463eb8fbb..d6e23f70d 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defTimeSeriesOutliers(dataset:VMDataset - - - -,zscore_threshold:int - - - -=3): +
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 39462d44d..461ac4c38 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defTooManyZeroValues(dataset:VMDataset - - - -,max_percent_threshold:float - - - -=0.03): +
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index ea8071120..dceef0bff 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defUniqueRows(dataset:VMDataset - - - -,min_percent_threshold:float - - - -=1): +
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 99d66d046..4d0df7c0e 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -28,32 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defWOEBinPlots(dataset:VMDataset - - - -,breaks_adj:list - - - -=None,fig_height:int - - - -=600,fig_width:int - - - -=500): +
@{'arguments': ["'tabular_data'", "'visualization'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 8b9cb55e8..b83d01a26 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defWOEBinTable(dataset:VMDataset - - - -,breaks_adj:list - - - -=None): +
@{'arguments': ["'tabular_data'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 17d411ecb..3176304ae 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -28,20 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'stationarity'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defZivotAndrewsArch(dataset:VMDataset - - - -): +
@{'arguments': ["'time_series_data'", "'stationarity'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defZivotAndrewsArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index 835a21aeb..62bcc9e1e 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,20 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defCommonWords(dataset:VMDataset - - - -): +
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defCommonWords(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index c520bdbc6..4bf4c19b6 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defHashtags(dataset:VMDataset - - - -,top_hashtags:int - - - -=25): +
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defHashtags(dataset:VMDataset,top_hashtags:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 26b2170a0..02b678a12 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defLanguageDetection(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 87572f29e..982146481 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defMentions(dataset:VMDataset - - - -,top_mentions:int - - - -=25): +
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defMentions(dataset:VMDataset,top_mentions:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index 555fcefad..afeb67dd3 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defPolarityAndSubjectivity(dataset,threshold_subjectivity=0.5,threshold_polarity=0): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index 00867f670..e264bca3a 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -18,15 +18,7 @@ Metrics functions for any Pandas-compatible datasets ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'", "'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'", "'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defPunctuations(dataset,count_mode='token'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index cc875601d..e81a3dc37 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defSentiment(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index 8541bdb48..78c3d7fbb 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,28 +18,8 @@ Threshold based tests ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'frequency_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defStopWords(dataset:VMDataset - - - -,min_percent_threshold:float - - - -=0.5,num_words:int - - - -=25): +
@{'arguments': ["'nlp'", "'text_data'", "'frequency_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 665af1e9a..731ce56e7 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -26,80 +26,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defTextDescription(dataset:VMDataset - - - -,unwanted_tokens:set - - - -={'s' - - - -, "s'" - - - -, 'mr' - - - -, 'ms' - - - -, 'mrs' - - - -, 'dr' - - - -, "'s" - - - -, ' ' - - - -, "''" - - - -, 'dollar' - - - -, 'us' - - - -, '``' - - - -} - - - -,lang:str - - - -='english'): +
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defTextDescription(dataset:VMDataset,unwanted_tokens:set={'s', "s'", 'mr', 'ms', 'mrs', 'dr', "'s", ' ', "''", 'dollar', 'us', '``'},lang:str='english'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index d03b4d10b..be39d188a 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defToxicity(dataset): ::: diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 8a1a1999b..3e573fb32 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -38,15 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defBertScore(dataset,model,evaluation_model='distilbert-base-uncased'): ::: diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 7b99781f6..b56e3719a 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -38,15 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defBleuScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 5b29e0662..e4c6634dd 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defClusterSizeDistribution(dataset:VMDataset - - - -,model:VMModel - - - -): +
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defClusterSizeDistribution(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 8ae7b0c50..a8d946c8f 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -38,15 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defContextualRecall(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 623cf523e..b7bb22bca 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -28,28 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'feature_importance'", "'AUC'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defFeaturesAUC(dataset:VMDataset - - - -,fontsize:int - - - -=12,figure_height:int - - - -=500): +
@{'arguments': ["'feature_importance'", "'AUC'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 84ac6bf64..5e6d353a5 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -38,15 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defMeteorScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index 3b1e2b3f8..cf9ad50f9 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -28,15 +28,7 @@ Attempts to extract all model info from a model object instance ::: {.signature} -
@{'arguments': ["'model_training'", "'metadata'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'model_training'", "'metadata'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defModelMetadata(model): ::: diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index cafe79c40..199639ca4 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'residual_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'residual_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defModelPredictionResiduals(dataset,model,nbins=100,p_value_threshold=0.05,start_date=None,end_date=None): ::: diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index f8f3d6db8..976bd8c63 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -38,15 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegardScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 061c02e83..fc506cc4d 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,28 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defRegressionResidualsPlot(model:VMModel - - - -,dataset:VMDataset - - - -,bin_size:float - - - -=0.1): +
@{'arguments': ["'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index c1142b616..f2ab200c6 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRougeScore(dataset,model,metric='rouge-1'): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index c81253fc6..b430bf252 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_predictions'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'model_predictions'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTimeSeriesPredictionWithCI(dataset,model,confidence=0.95): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index 972d74a1f..e90fb607c 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_predictions'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'model_predictions'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTimeSeriesPredictionsPlot(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index e038cb536..57d973d79 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTimeSeriesR2SquareBySegments(dataset,model,segments=None): ::: diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index 71fedacbc..f75f74b1d 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defTokenDisparity(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index 89d36dd6e..4c0ae89dd 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defToxicityScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 75a0b6f1f..2ded884b2 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defAdjustedMutualInformation(model:VMModel - - - -,dataset:VMDataset - - - -): +
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index e869c5422..299bbc375 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defAdjustedRandIndex(model:VMModel - - - -,dataset:VMDataset - - - -): +
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defAdjustedRandIndex(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 004d41132..dd8074550 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,28 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defCalibrationCurve(model:VMModel - - - -,dataset:VMDataset - - - -,n_bins:int - - - -=10): +
@{'arguments': ["'sklearn'", "'model_performance'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index 6db71bbc0..bbf2b326d 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,28 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defClassifierPerformance(dataset:VMDataset - - - -,model:VMModel - - - -,average:str - - - -='macro'): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 10ca5b68d..586579b2e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_validation'", "'threshold_optimization'", "'classification_metrics'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defClassifierThresholdOptimization(dataset:VMDataset - - - -,model:VMModel - - - -,methods=None,target_recall=None): +
@{'arguments': ["'model_validation'", "'threshold_optimization'", "'classification_metrics'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 4910b7165..5fbfd5ec3 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defClusterCosineSimilarity(model:VMModel - - - -,dataset:VMDataset - - - -): +
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index ff1b7b5db..fc0edb78c 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defClusterPerformanceMetrics(model:VMModel - - - -,dataset:VMDataset - - - -): +
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 4655142f3..f25671734 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defCompletenessScore(model:VMModel - - - -,dataset:VMDataset - - - -): +
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defCompletenessScore(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index a7b3f2edc..7aa3ba21e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defConfusionMatrix(dataset:VMDataset - - - -,model:VMModel - - - -): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defConfusionMatrix(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 2fa419a1b..00e21d96c 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,28 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_explainability'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defFeatureImportance(dataset:VMDataset - - - -,model:VMModel - - - -,num_features:int - - - -=3): +
@{'arguments': ["'model_explainability'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index be80a5a74..ce49ac028 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defFowlkesMallowsScore(dataset:VMDataset - - - -,model:VMModel - - - -): +
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index b28a37cca..1047cb048 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defHomogeneityScore(dataset:VMDataset - - - -,model:VMModel - - - -): +
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defHomogeneityScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index d5a5b9f0e..76a8b363c 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defcustom_recall(y_true,y_pred_proba,threshold=0.5): ::: @@ -35,76 +27,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'clustering'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defHyperParametersTuning(model:VMModel - - - -,dataset:VMDataset - - - -,param_grid:dict - - - -,scoring:Union - - - -[str - - - -, List - - - -, Dict - - - -] - - - -=None,thresholds:Union - - - -[float - - - -, List - - - -[float - - - -] - - - -] - - - -=None,fit_params:dict - - - -=None): +
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union[str, List, Dict]=None,thresholds:Union[float, List[float]]=None,fit_params:dict=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index ba139b4c1..b19c9270b 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,48 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'kmeans'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defKMeansClustersOptimization(model:VMModel - - - -,dataset:VMDataset - - - -,n_clusters:Union - - - -[List - - - -[int - - - -] - - - -, None - - - -] - - - -=None): +
@{'arguments': ["'sklearn'", "'model_performance'", "'kmeans'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union[List[int], None]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index e199a5747..2a17f372b 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,28 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defMinimumAccuracy(dataset:VMDataset - - - -,model:VMModel - - - -,min_threshold:float - - - -=0.7): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 6d4df2363..28b73b249 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,28 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defMinimumF1Score(dataset:VMDataset - - - -,model:VMModel - - - -,min_threshold:float - - - -=0.5): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 51701e69a..cdde04360 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,28 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defMinimumROCAUCScore(dataset:VMDataset - - - -,model:VMModel - - - -,min_threshold:float - - - -=0.5): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 7fec239dd..126af3249 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_training'", "'metadata'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'model_training'", "'metadata'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defModelParameters(model,model_params=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index acd05da2a..cc3220c71 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -24,32 +24,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'model_comparison'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defModelsPerformanceComparison(dataset:VMDataset - - - -,models:list - - - -[VMModel - - - -] - - - -): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'model_comparison'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defModelsPerformanceComparison(dataset:VMDataset,models:list[VMModel]): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 4bc667d3c..a399fb98b 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -28,44 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'linear_regression'", "'model_diagnosis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defOverfitDiagnosis(model:VMModel - - - -,datasets:List - - - -[VMDataset - - - -] - - - -,metric:str - - - -=None,cut_off_threshold:float - - - -=DEFAULT_THRESHOLD - - - -): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'linear_regression'", "'model_diagnosis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defOverfitDiagnosis(model:VMModel,datasets:List[VMDataset],metric:str=None,cut_off_threshold:float=DEFAULT_THRESHOLD): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index c868cfa1b..a9479df1b 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -28,56 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defPermutationFeatureImportance(model:VMModel - - - -,dataset:VMDataset - - - -,fontsize:Union - - - -[int - - - -, None - - - -] - - - -=None,figure_height:Union - - - -[int - - - -, None - - - -] - - - -=None): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union[int, None]=None,figure_height:Union[int, None]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index bdabb5400..5779904fc 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -46,40 +46,8 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defPopulationStabilityIndex(datasets:List - - - -[VMDataset - - - -] - - - -,model:VMModel - - - -,num_bins:int - - - -=10,mode:str - - - -='fixed'): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defPopulationStabilityIndex(datasets:List[VMDataset],model:VMModel,num_bins:int=10,mode:str='fixed'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 9aad269a1..9e177caa4 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defPrecisionRecallCurve(model:VMModel - - - -,dataset:VMDataset - - - -): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 25c0f0608..9eaadb802 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defROCCurve(model:VMModel - - - -,dataset:VMDataset - - - -): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defROCCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index c8c6b04e7..8332b3fd7 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionErrors(model,dataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 578987191..a520e9173 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -28,15 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionErrorsComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index f82809021..fef59bf85 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -28,24 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defRegressionPerformance(model:VMModel - - - -,dataset:VMDataset - - - -): +
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defRegressionPerformance(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index cfc229fe9..4ba2e3701 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -12,43 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual: - -np.ndarray - - - - - - - -,predicted: - -np.ndarray - - - - - - - -,rowcount:int - - - - - - - -,featurecount:int - - - - - - - -): +defadj_r2_score(actual:np.ndarray,predicted:np.ndarray,rowcount:int,featurecount:int): ::: @@ -64,15 +28,7 @@ Adjusted R2 Score ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionR2Square(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index aab0159c3..7dd6d7a21 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -12,43 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual: - -np.ndarray - - - - - - - -,predicted: - -np.ndarray - - - - - - - -,rowcount:int - - - - - - - -,featurecount:int - - - - - - - -): +defadj_r2_score(actual:np.ndarray,predicted:np.ndarray,rowcount:int,featurecount:int): ::: @@ -64,15 +28,7 @@ Adjusted R2 Score ::: {.signature} -
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionR2SquareComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 7f64debb0..058f298e2 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -28,60 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_diagnosis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defRobustnessDiagnosis(datasets:List - - - -[VMDataset - - - -] - - - -,model:VMModel - - - -,metric:str - - - -=None,scaling_factor_std_dev_list:List - - - -[float - - - -] - - - -=DEFAULT_STD_DEV_LIST - - - -,performance_decay_threshold:float - - - -=DEFAULT_DECAY_THRESHOLD - - - -): +
@{'arguments': ["'sklearn'", "'model_diagnosis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defRobustnessDiagnosis(datasets:List[VMDataset],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List[float]=DEFAULT_STD_DEV_LIST,performance_decay_threshold:float=DEFAULT_DECAY_THRESHOLD): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index c97abd4be..907c1a3fe 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -85,36 +85,8 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defSHAPGlobalImportance(model:VMModel - - - -,dataset:VMDataset - - - -,kernel_explainer_samples:int - - - -=10,tree_or_linear_explainer_samples:int - - - -=200,class_of_interest:int - - - -=None): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 57be01f2d..08a0dafd4 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,32 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'visualization'", "'credit_risk'", "'calibration'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defScoreProbabilityAlignment(model:VMModel - - - -,dataset:VMDataset - - - -,score_column:str - - - -='score',n_bins:int - - - -=10): +
@{'arguments': ["'visualization'", "'credit_risk'", "'calibration'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 0320dcf97..a9817c45b 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defSilhouettePlot(model:VMModel - - - -,dataset:VMDataset - - - -): +
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defSilhouettePlot(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index c15476fc8..be0b904ec 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,36 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defTrainingTestDegradation(datasets:List - - - -[VMDataset - - - -] - - - -,model:VMModel - - - -,max_threshold:float - - - -=0.1): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defTrainingTestDegradation(datasets:List[VMDataset],model:VMModel,max_threshold:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 8e7eb1df0..e06e89185 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,24 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defVMeasure(dataset:VMDataset - - - -,model:VMModel - - - -): +
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defVMeasure(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index f79df9100..023d2b799 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,112 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_diagnosis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defWeakspotsDiagnosis(datasets:List - - - -[VMDataset - - - -] - - - -,model:VMModel - - - -,features_columns:Union - - - -[List - - - -[str - - - -] - - - -, None - - - -] - - - -=None,metrics:Union - - - -[Dict - - - -[str - - - -, Callable - - - -] - - - -, None - - - -] - - - -=None,thresholds:Union - - - -[Dict - - - -[str - - - -, float - - - -] - - - -, None - - - -] - - - -=None): +
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_diagnosis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defWeakspotsDiagnosis(datasets:List[VMDataset],model:VMModel,features_columns:Union[List[str], None]=None,metrics:Union[Dict[str, Callable], None]=None,thresholds:Union[Dict[str, float], None]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 433cb7b8d..4fa476617 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -28,24 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'model_selection'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defAutoARIMA(model:VMModel - - - -,dataset:VMDataset - - - -): +
@{'arguments': ["'time_series_data'", "'forecasting'", "'model_selection'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defAutoARIMA(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 177f8b027..9cb34d4f0 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'visualization'", "'credit_risk'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'visualization'", "'credit_risk'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defCumulativePredictionProbabilities(dataset,model,title='Cumulative Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 1328802ab..78799c033 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -14,28 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
-defDurbinWatsonTest(dataset,model,threshold=[1.5 - - - -, 2.5 - - - -] - - - -): +
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
+defDurbinWatsonTest(dataset,model,threshold=[1.5, 2.5]): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index b6399b29c..afe9258ff 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defGINITable(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index a083ecfa0..80417323a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,28 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defKolmogorovSmirnov(model:VMModel - - - -,dataset:VMDataset - - - -,dist:str - - - -='norm'): +
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index e3954468f..d7cedeb99 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,20 +14,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defLilliefors(dataset:VMDataset - - - -): +
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defLilliefors(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index dcecaa646..dd419141e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'visualization'", "'credit_risk'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'visualization'", "'credit_risk'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defPredictionProbabilitiesHistogram(dataset,model,title='Histogram of Predictive Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 732d79c37..d7f00900a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'", "'model_training'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'tabular_data'", "'visualization'", "'model_training'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRegressionCoeffs(model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 7067225cd..1a5d4e106 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -28,28 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'statistical_test'", "'model_interpretation'", "'visualization'", "'feature_importance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defRegressionFeatureSignificance(model:VMModel - - - -,fontsize:int - - - -=10,p_threshold:float - - - -=0.05): +
@{'arguments': ["'statistical_test'", "'model_interpretation'", "'visualization'", "'feature_importance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 0f12fe170..8cad6095c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -28,56 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defRegressionModelForecastPlot(model:VMModel - - - -,dataset:VMDataset - - - -,start_date:Union - - - -[str - - - -, None - - - -] - - - -=None,end_date:Union - - - -[str - - - -, None - - - -] - - - -=None): +
@{'arguments': ["'time_series_data'", "'forecasting'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union[str, None]=None,end_date:Union[str, None]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index c9824bb46..19968da6d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -26,24 +26,8 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defRegressionModelForecastPlotLevels(model:VMModel - - - -,dataset:VMDataset - - - -): +
@{'arguments': ["'time_series_data'", "'forecasting'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 9e3be05e7..7bd1ece7a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -40,60 +40,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'senstivity_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defRegressionModelSensitivityPlot(dataset:VMDataset - - - -,model:VMModel - - - -,shocks:List - - - -[float - - - -] - - - -=[0.1 - - - -] - - - -,transformation:Union - - - -[str - - - -, None - - - -] - - - -=None): +
@{'arguments': ["'senstivity_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List[float]=[0.1],transformation:Union[str, None]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 92810e129..c1f6b4da2 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -12,43 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual: - -np.ndarray - - - - - - - -,predicted: - -np.ndarray - - - - - - - -,rowcount:int - - - - - - - -,featurecount:int - - - - - - - -): +defadj_r2_score(actual:np.ndarray,predicted:np.ndarray,rowcount:int,featurecount:int): ::: @@ -64,24 +28,8 @@ Adjusted R2 Score ::: {.signature} -
@{'arguments': ["'model_performance'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defRegressionModelSummary(dataset:VMDataset - - - -,model:VMModel - - - -): +
@{'arguments': ["'model_performance'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defRegressionModelSummary(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index e04a39f0c..279fac97d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -28,32 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'statsmodels'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
-defRegressionPermutationFeatureImportance(dataset:VMDataset - - - -,model:VMModel - - - -,fontsize:int - - - -=12,figure_height:int - - - -=500): +
@{'arguments': ["'statsmodels'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index 51762388d..bb40c336e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'visualization'", "'credit_risk'", "'logistic_regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'visualization'", "'credit_risk'", "'logistic_regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defScorecardHistogram(dataset,title='Histogram of Scores',score_column='score'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 368aa04cb..4af06b540 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -14,43 +14,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual: - -np.ndarray - - - - - - - -,predicted: - -np.ndarray - - - - - - - -,rowcount:int - - - - - - - -,featurecount:int - - - - - - - -): +defadj_r2_score(actual:np.ndarray,predicted:np.ndarray,rowcount:int,featurecount:int): ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index bed689a65..789c79e6e 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -12,39 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str - - - - - - - -,user_prompt:str - - - - - - - -,temperature:float - - - - - - - -=0.0,seed:int - - - - - - - -=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -58,15 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str - - - - - - - -): +defget_explanation(response:str): ::: @@ -88,15 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str - - - - - - - -): +defget_score(response:str): ::: @@ -120,15 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'llm'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defBias(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 34daf0259..c8e9f26d1 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -12,39 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str - - - - - - - -,user_prompt:str - - - - - - - -,temperature:float - - - - - - - -=0.0,seed:int - - - - - - - -=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -58,15 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str - - - - - - - -): +defget_explanation(response:str): ::: @@ -88,15 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str - - - - - - - -): +defget_score(response:str): ::: @@ -120,15 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defClarity(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 499fb6263..0d55cb6bb 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -12,39 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str - - - - - - - -,user_prompt:str - - - - - - - -,temperature:float - - - - - - - -=0.0,seed:int - - - - - - - -=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -58,15 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str - - - - - - - -): +defget_explanation(response:str): ::: @@ -88,15 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str - - - - - - - -): +defget_score(response:str): ::: @@ -120,15 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defConciseness(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 62f74ac0a..f296b9ce7 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -12,39 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str - - - - - - - -,user_prompt:str - - - - - - - -,temperature:float - - - - - - - -=0.0,seed:int - - - - - - - -=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -58,15 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str - - - - - - - -): +defget_explanation(response:str): ::: @@ -88,15 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str - - - - - - - -): +defget_score(response:str): ::: @@ -120,15 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defDelimitation(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index b16c0a664..fea1a00db 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -12,39 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str - - - - - - - -,user_prompt:str - - - - - - - -,temperature:float - - - - - - - -=0.0,seed:int - - - - - - - -=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -58,15 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str - - - - - - - -): +defget_explanation(response:str): ::: @@ -88,15 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str - - - - - - - -): +defget_score(response:str): ::: @@ -120,15 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defNegativeInstruction(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 4ddf6885d..850b83be4 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -12,39 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str - - - - - - - -,user_prompt:str - - - - - - - -,temperature:float - - - - - - - -=0.0,seed:int - - - - - - - -=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -60,15 +28,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defRobustness(model,dataset,num_tests=10): ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index a882afc94..e4d6dac55 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -12,39 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str - - - - - - - -,user_prompt:str - - - - - - - -,temperature:float - - - - - - - -=0.0,seed:int - - - - - - - -=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -58,15 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str - - - - - - - -): +defget_explanation(response:str): ::: @@ -88,15 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str - - - - - - - -): +defget_score(response:str): ::: @@ -120,15 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}} - - - -
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}} - - - -
+
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
defSpecificity(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index 640f73184..5b00384f1 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -14,39 +14,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str - - - - - - - -,user_prompt:str - - - - - - - -,temperature:float - - - - - - - -=0.0,seed:int - - - - - - - -=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -62,15 +30,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str - - - - - - - -): +defget_explanation(response:str): ::: @@ -94,15 +54,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str - - - - - - - -): +defget_score(response:str): ::: diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 523bf3e8c..72c0cdd2d 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -14,15 +14,7 @@ toc-expand: 4 ::: {.signature} -defdescribe_metric(metric_id:str - - - - - - - -,\*\*kwargs): +defdescribe_metric(metric_id:str,\*\*kwargs): ::: @@ -54,15 +46,7 @@ List all metrics ::: {.signature} -defrun_metric(metric_id:str - - - - - - - -,\*\*kwargs): +defrun_metric(metric_id:str,\*\*kwargs): ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 021aa86d6..cfdcdc34f 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -18,11 +18,7 @@ Models entrypoint ::: {.signature} -
@dataclass - - - -
+
@dataclass
classFigure: ::: @@ -37,93 +33,7 @@ Figure objects track the schema supported by the ValidMind API ::: {.signature} -__init__(key:str - - - - - - - -,figure:Union - - - - - - - -\[ - -matplotlib.figure.Figure - - - - - - - -, - -go.Figure - - - - - - - -, - -go.FigureWidget - - - - - - - -, bytes - - - - - - - -\] - - - - - - - -,ref_id:str - - - - - - - -,\_type:str - - - - - - - -='plot')None - - - - - - - - +__init__(key:str,figure:Union\[matplotlib.figure.Figure, go.Figure, go.FigureWidget, bytes\],ref_id:str,\_type:str='plot')None ::: @@ -179,11 +89,7 @@ we would render images as-is, but Plotly FigureWidgets don't work well on Google ::: {.signature} -
@dataclass - - - -
+
@dataclass
classModelAttributes: ::: @@ -198,55 +104,7 @@ Model attributes definition ::: {.signature} -__init__(architecture:str - - - - - - - -=None,framework:str - - - - - - - -=None,framework_version:str - - - - - - - -=None,language:str - - - - - - - -=None,task:ModelTask - - - - - - - -=None)None - - - - - - - - +__init__(architecture:str=None,framework:str=None,framework_version:str=None,language:str=None,task:ModelTask=None)None ::: @@ -256,11 +114,7 @@ Model attributes definition ::: {.signature} -
@classmethod - - - -
+
@classmethod
deffrom_dict(cls,data): ::: @@ -277,11 +131,7 @@ Creates a ModelAttributes instance from a dictionary ::: {.signature} -
@dataclass - - - -
+
@dataclass
classTestSuite: ::: @@ -300,39 +150,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -__init__(sections:List - - - - - - - -\[TestSuiteSection - - - - - - - -\] - - - - - - - -=None)None - - - - - - - - +__init__(sections:List\[TestSuiteSection\]=None)None ::: @@ -342,15 +160,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -defget_default_config()dict - - - - - - - -: +defget_default_config()dict: ::: @@ -370,31 +180,7 @@ Each test in a test suite can accept parameters and those parameters can have de ::: {.signature} -defget_tests()List - - - - - - - -\[str - - - - - - - -\] - - - - - - - -: +defget_tests()List\[str\]: ::: @@ -408,15 +194,7 @@ Get all test suite test objects from all sections ::: {.signature} -defnum_tests()int - - - - - - - -: +defnum_tests()int: ::: @@ -446,31 +224,7 @@ Runs a test suite ::: {.signature} -__init__(suite:TestSuite - - - - - - - -,config:dict - - - - - - - -=None,inputs:dict - - - - - - - -=None) +__init__(suite:TestSuite,config:dict=None,inputs:dict=None) ::: @@ -496,23 +250,7 @@ This method will be called after the test suite has been run and all results hav ::: {.signature} -defrun(send:bool - - - - - - - -=True,fail_fast:bool - - - - - - - -=False): +defrun(send:bool=True,fail_fast:bool=False): ::: @@ -531,15 +269,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -defsummarize(show_link:bool - - - - - - - -=True): +defsummarize(show_link:bool=True): ::: @@ -586,107 +316,7 @@ This way we can support multiple dataset types but under the hood we only need t ::: {.signature} -__init__(raw_dataset: - -np.ndarray - - - - - - - -,input_id:str - - - - - - - -=None,model:VMModel - - - - - - - -=None,index: - -np.ndarray - - - - - - - -=None,index_name:str - - - - - - - -=None,date_time_index:bool - - - - - - - -=False,columns:list - - - - - - - -=None,target_column:str - - - - - - - -=None,feature_columns:list - - - - - - - -=None,text_column:str - - - - - - - -=None,extra_columns:dict - - - - - - - -=None,target_class_labels:dict - - - - - - - -=None) +__init__(raw_dataset:np.ndarray,input_id:str=None,model:VMModel=None,index:np.ndarray=None,index_name:str=None,date_time_index:bool=False,columns:list=None,target_column:str=None,feature_columns:list=None,text_column:str=None,extra_columns:dict=None,target_class_labels:dict=None) ::: @@ -733,55 +363,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -defassign_predictions(model:VMModel - - - - - - - -,prediction_column:str - - - - - - - -=None,prediction_values:list - - - - - - - -=None,probability_column:str - - - - - - - -=None,probability_values:list - - - - - - - -=None,prediction_probabilities:list - - - - - - - -=None,\*\*kwargs): +defassign_predictions(model:VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): ::: @@ -805,31 +387,7 @@ Assign predictions and probabilities to the dataset. ::: {.signature} -defprediction_column(model:VMModel - - - - - - - -,column_name:str - - - - - - - -=None)str - - - - - - - -: +defprediction_column(model:VMModel,column_name:str=None)str: ::: @@ -843,31 +401,7 @@ Get or set the prediction column for a model. ::: {.signature} -defprobability_column(model:VMModel - - - - - - - -,column_name:str - - - - - - - -=None)str - - - - - - - -: +defprobability_column(model:VMModel,column_name:str=None)str: ::: @@ -895,15 +429,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMDataset - - - - - - - -: +defwith_options(\*\*kwargs)validmind.vm_models.VMDataset: ::: @@ -940,17 +466,7 @@ Returns a dataframe containing only the feature columns ::: {.signature} -defy_df() - -pd.DataFrame - - - - - - - -: +defy_df()pd.DataFrame: ::: @@ -964,17 +480,7 @@ Returns a dataframe containing the target column ::: {.signature} -defy_pred(model) - -np.ndarray - - - - - - - -: +defy_pred(model)np.ndarray: ::: @@ -998,17 +504,7 @@ Attempts to stack complex prediction types (e.g., embeddings) into a single, mul ::: {.signature} -defy_pred_df(model) - -pd.DataFrame - - - - - - - -: +defy_pred_df(model)pd.DataFrame: ::: @@ -1022,17 +518,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -defy_prob(model) - -np.ndarray - - - - - - - -: +defy_prob(model)np.ndarray: ::: @@ -1054,17 +540,7 @@ Returns the probabilities for a given model. ::: {.signature} -defy_prob_df(model) - -pd.DataFrame - - - - - - - -: +defy_prob_df(model)pd.DataFrame: ::: @@ -1096,15 +572,7 @@ Base class for ValidMind Input types ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMInput - - - - - - - -: +defwith_options(\*\*kwargs)validmind.vm_models.VMInput: ::: @@ -1153,39 +621,7 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -__init__(input_id:str - - - - - - - -=None,model:object - - - - - - - -=None,attributes:ModelAttributes - - - - - - - -=None,name:str - - - - - - - -=None,\*\*kwargs) +__init__(input_id:str=None,model:object=None,attributes:ModelAttributes=None,name:str=None,\*\*kwargs) ::: @@ -1195,11 +631,7 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -
@abstractmethod - - - -
+
@abstractmethod
defpredict(*args,**kwargs): ::: From 6fff53b146bba491fe0b1fd6ef33f435c42fb9fe Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 21 Feb 2025 07:41:02 -0800 Subject: [PATCH 092/207] Save point for class names in signatures for inherited members --- docs/templates/class.qmd.jinja2 | 6 ++++++ docs/validmind/errors.qmd | 6 +++--- docs/validmind/tests.qmd | 4 ++-- .../data_validation/ProtectedClassesCombination.qmd | 2 +- .../data_validation/ProtectedClassesDisparity.qmd | 2 +- .../ProtectedClassesThresholdOptimizer.qmd | 2 +- docs/validmind/vm_models.qmd | 12 ++++++------ 7 files changed, 20 insertions(+), 14 deletions(-) diff --git a/docs/templates/class.qmd.jinja2 b/docs/templates/class.qmd.jinja2 index e0ff665b8..8023e951f 100644 --- a/docs/templates/class.qmd.jinja2 +++ b/docs/templates/class.qmd.jinja2 @@ -34,7 +34,13 @@ {% if member.kind in ['method', 'function'] and (not member.name.startswith('_') or member.name == '__init__') %} ### [{{ member.name if member.name != '__init__' else resolved.name }}[()]{.muted}](#{{ member.name }}) +{% if member.name == '__init__' %} +{% set member_with_parent = member.copy() %} +{% set _ = member_with_parent.update({'parent': {'name': resolved.name}}) %} +{{ signatures.render_signature(member_with_parent) }} +{% else %} {{ signatures.render_signature(member) }} +{% endif %} {% if member.docstring %} {{ doc.format_docstring(member.docstring) }} diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index b26ef7543..e3fc68aa9 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -58,7 +58,7 @@ Generic error for API request errors that are not known. ::: {.signature} -__init__(message='') +BaseError(message='') ::: @@ -384,7 +384,7 @@ Exception raised when an error occurs while loading a test ::: {.signature} -__init__(message:str,original_error:Optional\[Exception\]=None) +LoadTestError(message:str,original_error:Optional\[Exception\]=None) ::: @@ -505,7 +505,7 @@ When a required dependency is missing. ::: {.signature} -__init__(message='',required_dependencies=None,extra=None) +MissingDependencyError(message='',required_dependencies=None,extra=None) ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index d4e60c39b..65d889a85 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -296,7 +296,7 @@ Exception raised when an error occurs while loading a test ::: {.signature} -__init__(message:str,original_error:Optional\[Exception\]=None) +LoadTestError(message:str,original_error:Optional\[Exception\]=None) ::: @@ -349,7 +349,7 @@ test = test_provider.load_test("my_namespace.my_test_class") ::: {.signature} -__init__(root_folder:str) +LocalTestProvider(root_folder:str) ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 873f51493..b6e6e98ba 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -94,7 +94,7 @@ When a required dependency is missing. ::: {.signature} -__init__(message='',required_dependencies=None,extra=None) +MissingDependencyError(message='',required_dependencies=None,extra=None) ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 59c6d9c57..f6f96ea4e 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -96,7 +96,7 @@ When a required dependency is missing. ::: {.signature} -__init__(message='',required_dependencies=None,extra=None) +MissingDependencyError(message='',required_dependencies=None,extra=None) ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 9fabfb49f..355227a29 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -167,7 +167,7 @@ When a required dependency is missing. ::: {.signature} -__init__(message='',required_dependencies=None,extra=None) +MissingDependencyError(message='',required_dependencies=None,extra=None) ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index cfdcdc34f..c3030b0c1 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -33,7 +33,7 @@ Figure objects track the schema supported by the ValidMind API ::: {.signature} -__init__(key:str,figure:Union\[matplotlib.figure.Figure, go.Figure, go.FigureWidget, bytes\],ref_id:str,\_type:str='plot')None +Figure(key:str,figure:Union\[matplotlib.figure.Figure, go.Figure, go.FigureWidget, bytes\],ref_id:str,\_type:str='plot')None ::: @@ -104,7 +104,7 @@ Model attributes definition ::: {.signature} -__init__(architecture:str=None,framework:str=None,framework_version:str=None,language:str=None,task:ModelTask=None)None +ModelAttributes(architecture:str=None,framework:str=None,framework_version:str=None,language:str=None,task:ModelTask=None)None ::: @@ -150,7 +150,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -__init__(sections:List\[TestSuiteSection\]=None)None +TestSuite(sections:List\[TestSuiteSection\]=None)None ::: @@ -224,7 +224,7 @@ Runs a test suite ::: {.signature} -__init__(suite:TestSuite,config:dict=None,inputs:dict=None) +TestSuiteRunner(suite:TestSuite,config:dict=None,inputs:dict=None) ::: @@ -316,7 +316,7 @@ This way we can support multiple dataset types but under the hood we only need t ::: {.signature} -__init__(raw_dataset:np.ndarray,input_id:str=None,model:VMModel=None,index:np.ndarray=None,index_name:str=None,date_time_index:bool=False,columns:list=None,target_column:str=None,feature_columns:list=None,text_column:str=None,extra_columns:dict=None,target_class_labels:dict=None) +VMDataset(raw_dataset:np.ndarray,input_id:str=None,model:VMModel=None,index:np.ndarray=None,index_name:str=None,date_time_index:bool=False,columns:list=None,target_column:str=None,feature_columns:list=None,text_column:str=None,extra_columns:dict=None,target_class_labels:dict=None) ::: @@ -621,7 +621,7 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -__init__(input_id:str=None,model:object=None,attributes:ModelAttributes=None,name:str=None,\*\*kwargs) +VMModel(input_id:str=None,model:object=None,attributes:ModelAttributes=None,name:str=None,\*\*kwargs) ::: From 869d5ad9e258a215ad71e792c6a1e4c9aafca1b5 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 21 Feb 2025 07:50:16 -0800 Subject: [PATCH 093/207] Fix class for constructors that have multiple parameters --- docs/templates/macros/signatures.jinja2 | 5 ++++- docs/validmind.qmd | 2 +- docs/validmind/errors.qmd | 6 +++--- docs/validmind/tests.qmd | 4 ++-- .../data_validation/ProtectedClassesCombination.qmd | 2 +- .../data_validation/ProtectedClassesDisparity.qmd | 2 +- .../ProtectedClassesThresholdOptimizer.qmd | 2 +- docs/validmind/vm_models.qmd | 12 ++++++------ 8 files changed, 19 insertions(+), 16 deletions(-) diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index 796a74992..0245a8ef0 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -25,7 +25,10 @@ {%- endif -%} {%- endfor -%} {%- for param in params -%} - + {%- if param.name == "self" -%} self {%- else -%} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 90a4eb7ca..72959b570 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -445,7 +445,7 @@ Holds raw data for a test result ::: {.signature} -RawData(log:bool=False,\*\*kwargs) +RawData(log:bool=False,\*\*kwargs) ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index e3fc68aa9..99efd35ae 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -58,7 +58,7 @@ Generic error for API request errors that are not known. ::: {.signature} -BaseError(message='') +BaseError(message='') ::: @@ -384,7 +384,7 @@ Exception raised when an error occurs while loading a test ::: {.signature} -LoadTestError(message:str,original_error:Optional\[Exception\]=None) +LoadTestError(message:str,original_error:Optional\[Exception\]=None) ::: @@ -505,7 +505,7 @@ When a required dependency is missing. ::: {.signature} -MissingDependencyError(message='',required_dependencies=None,extra=None) +MissingDependencyError(message='',required_dependencies=None,extra=None) ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 65d889a85..5c69d3ed3 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -296,7 +296,7 @@ Exception raised when an error occurs while loading a test ::: {.signature} -LoadTestError(message:str,original_error:Optional\[Exception\]=None) +LoadTestError(message:str,original_error:Optional\[Exception\]=None) ::: @@ -349,7 +349,7 @@ test = test_provider.load_test("my_namespace.my_test_class") ::: {.signature} -LocalTestProvider(root_folder:str) +LocalTestProvider(root_folder:str) ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index b6e6e98ba..bd149ebce 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -94,7 +94,7 @@ When a required dependency is missing. ::: {.signature} -MissingDependencyError(message='',required_dependencies=None,extra=None) +MissingDependencyError(message='',required_dependencies=None,extra=None) ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index f6f96ea4e..60394d9f3 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -96,7 +96,7 @@ When a required dependency is missing. ::: {.signature} -MissingDependencyError(message='',required_dependencies=None,extra=None) +MissingDependencyError(message='',required_dependencies=None,extra=None) ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 355227a29..8e9b0d612 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -167,7 +167,7 @@ When a required dependency is missing. ::: {.signature} -MissingDependencyError(message='',required_dependencies=None,extra=None) +MissingDependencyError(message='',required_dependencies=None,extra=None) ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index c3030b0c1..0d5b88893 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -33,7 +33,7 @@ Figure objects track the schema supported by the ValidMind API ::: {.signature} -Figure(key:str,figure:Union\[matplotlib.figure.Figure, go.Figure, go.FigureWidget, bytes\],ref_id:str,\_type:str='plot')None +Figure(key:str,figure:Union\[matplotlib.figure.Figure, go.Figure, go.FigureWidget, bytes\],ref_id:str,\_type:str='plot')None ::: @@ -104,7 +104,7 @@ Model attributes definition ::: {.signature} -ModelAttributes(architecture:str=None,framework:str=None,framework_version:str=None,language:str=None,task:ModelTask=None)None +ModelAttributes(architecture:str=None,framework:str=None,framework_version:str=None,language:str=None,task:ModelTask=None)None ::: @@ -150,7 +150,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -TestSuite(sections:List\[TestSuiteSection\]=None)None +TestSuite(sections:List\[TestSuiteSection\]=None)None ::: @@ -224,7 +224,7 @@ Runs a test suite ::: {.signature} -TestSuiteRunner(suite:TestSuite,config:dict=None,inputs:dict=None) +TestSuiteRunner(suite:TestSuite,config:dict=None,inputs:dict=None) ::: @@ -316,7 +316,7 @@ This way we can support multiple dataset types but under the hood we only need t ::: {.signature} -VMDataset(raw_dataset:np.ndarray,input_id:str=None,model:VMModel=None,index:np.ndarray=None,index_name:str=None,date_time_index:bool=False,columns:list=None,target_column:str=None,feature_columns:list=None,text_column:str=None,extra_columns:dict=None,target_class_labels:dict=None) +VMDataset(raw_dataset:np.ndarray,input_id:str=None,model:VMModel=None,index:np.ndarray=None,index_name:str=None,date_time_index:bool=False,columns:list=None,target_column:str=None,feature_columns:list=None,text_column:str=None,extra_columns:dict=None,target_class_labels:dict=None) ::: @@ -621,7 +621,7 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -VMModel(input_id:str=None,model:object=None,attributes:ModelAttributes=None,name:str=None,\*\*kwargs) +VMModel(input_id:str=None,model:object=None,attributes:ModelAttributes=None,name:str=None,\*\*kwargs) ::: From a503405b653116c7d2a69293b1377f35559cb650 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 21 Feb 2025 08:01:57 -0800 Subject: [PATCH 094/207] Fix raw JSON issue with ExprCall --- docs/templates/macros/types.jinja2 | 17 ++++++++++++----- .../tests/data_validation/ACFandPACFPlot.qmd | 2 +- docs/validmind/tests/data_validation/ADF.qmd | 2 +- docs/validmind/tests/data_validation/AutoAR.qmd | 2 +- docs/validmind/tests/data_validation/AutoMA.qmd | 2 +- .../tests/data_validation/AutoStationarity.qmd | 2 +- .../data_validation/BivariateScatterPlots.qmd | 2 +- .../tests/data_validation/BoxPierce.qmd | 2 +- .../data_validation/ChiSquaredFeaturesTable.qmd | 2 +- .../tests/data_validation/ClassImbalance.qmd | 2 +- .../data_validation/DatasetDescription.qmd | 2 +- .../tests/data_validation/DatasetSplit.qmd | 2 +- .../data_validation/DescriptiveStatistics.qmd | 2 +- .../tests/data_validation/DickeyFullerGLS.qmd | 2 +- .../tests/data_validation/Duplicates.qmd | 2 +- .../tests/data_validation/EngleGrangerCoint.qmd | 2 +- .../FeatureTargetCorrelationPlot.qmd | 2 +- .../tests/data_validation/HighCardinality.qmd | 2 +- .../data_validation/HighPearsonCorrelation.qmd | 2 +- .../data_validation/IQROutliersBarPlot.qmd | 2 +- .../tests/data_validation/IQROutliersTable.qmd | 2 +- .../data_validation/IsolationForestOutliers.qmd | 2 +- .../tests/data_validation/JarqueBera.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 2 +- .../tests/data_validation/LJungBox.qmd | 2 +- .../LaggedCorrelationHeatmap.qmd | 2 +- .../tests/data_validation/MissingValues.qmd | 2 +- .../data_validation/MissingValuesBarPlot.qmd | 2 +- .../tests/data_validation/MutualInformation.qmd | 2 +- .../PearsonCorrelationMatrix.qmd | 2 +- .../data_validation/PhillipsPerronArch.qmd | 2 +- .../ProtectedClassesCombination.qmd | 2 +- .../ProtectedClassesDescription.qmd | 2 +- .../ProtectedClassesDisparity.qmd | 2 +- .../ProtectedClassesThresholdOptimizer.qmd | 2 +- .../tests/data_validation/RollingStatsPlot.qmd | 2 +- .../tests/data_validation/RunsTest.qmd | 2 +- .../tests/data_validation/ScatterPlot.qmd | 2 +- .../data_validation/ScoreBandDefaultRates.qmd | 2 +- .../tests/data_validation/SeasonalDecompose.qmd | 2 +- .../tests/data_validation/ShapiroWilk.qmd | 2 +- .../tests/data_validation/Skewness.qmd | 2 +- .../tests/data_validation/SpreadPlot.qmd | 2 +- .../TabularCategoricalBarPlots.qmd | 2 +- .../TabularDateTimeHistograms.qmd | 2 +- .../TabularDescriptionTables.qmd | 2 +- .../TabularNumericalHistograms.qmd | 2 +- .../data_validation/TargetRateBarPlots.qmd | 2 +- .../data_validation/TimeSeriesDescription.qmd | 2 +- .../TimeSeriesDescriptiveStatistics.qmd | 2 +- .../data_validation/TimeSeriesFrequency.qmd | 2 +- .../data_validation/TimeSeriesHistogram.qmd | 2 +- .../data_validation/TimeSeriesLinePlot.qmd | 2 +- .../data_validation/TimeSeriesMissingValues.qmd | 2 +- .../data_validation/TimeSeriesOutliers.qmd | 2 +- .../tests/data_validation/TooManyZeroValues.qmd | 2 +- .../tests/data_validation/UniqueRows.qmd | 2 +- .../tests/data_validation/WOEBinPlots.qmd | 2 +- .../tests/data_validation/WOEBinTable.qmd | 2 +- .../tests/data_validation/ZivotAndrewsArch.qmd | 2 +- .../tests/data_validation/nlp/CommonWords.qmd | 2 +- .../tests/data_validation/nlp/Hashtags.qmd | 2 +- .../data_validation/nlp/LanguageDetection.qmd | 2 +- .../tests/data_validation/nlp/Mentions.qmd | 2 +- .../nlp/PolarityAndSubjectivity.qmd | 2 +- .../tests/data_validation/nlp/Punctuations.qmd | 2 +- .../tests/data_validation/nlp/Sentiment.qmd | 2 +- .../tests/data_validation/nlp/StopWords.qmd | 2 +- .../data_validation/nlp/TextDescription.qmd | 2 +- .../tests/data_validation/nlp/Toxicity.qmd | 2 +- .../tests/model_validation/BertScore.qmd | 2 +- .../tests/model_validation/BleuScore.qmd | 2 +- .../ClusterSizeDistribution.qmd | 2 +- .../tests/model_validation/ContextualRecall.qmd | 2 +- .../tests/model_validation/FeaturesAUC.qmd | 2 +- .../tests/model_validation/MeteorScore.qmd | 2 +- .../tests/model_validation/ModelMetadata.qmd | 2 +- .../ModelPredictionResiduals.qmd | 2 +- .../tests/model_validation/RegardScore.qmd | 2 +- .../RegressionResidualsPlot.qmd | 2 +- .../tests/model_validation/RougeScore.qmd | 2 +- .../TimeSeriesPredictionWithCI.qmd | 2 +- .../TimeSeriesPredictionsPlot.qmd | 2 +- .../TimeSeriesR2SquareBySegments.qmd | 2 +- .../tests/model_validation/TokenDisparity.qmd | 2 +- .../tests/model_validation/ToxicityScore.qmd | 2 +- .../sklearn/AdjustedMutualInformation.qmd | 2 +- .../sklearn/AdjustedRandIndex.qmd | 2 +- .../sklearn/CalibrationCurve.qmd | 2 +- .../sklearn/ClassifierPerformance.qmd | 2 +- .../sklearn/ClassifierThresholdOptimization.qmd | 2 +- .../sklearn/ClusterCosineSimilarity.qmd | 2 +- .../sklearn/ClusterPerformanceMetrics.qmd | 2 +- .../sklearn/CompletenessScore.qmd | 2 +- .../sklearn/ConfusionMatrix.qmd | 2 +- .../sklearn/FeatureImportance.qmd | 2 +- .../sklearn/FowlkesMallowsScore.qmd | 2 +- .../sklearn/HomogeneityScore.qmd | 2 +- .../sklearn/HyperParametersTuning.qmd | 4 ++-- .../sklearn/KMeansClustersOptimization.qmd | 2 +- .../sklearn/MinimumAccuracy.qmd | 2 +- .../model_validation/sklearn/MinimumF1Score.qmd | 2 +- .../sklearn/MinimumROCAUCScore.qmd | 2 +- .../sklearn/ModelParameters.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 2 +- .../sklearn/OverfitDiagnosis.qmd | 2 +- .../sklearn/PermutationFeatureImportance.qmd | 2 +- .../sklearn/PopulationStabilityIndex.qmd | 2 +- .../sklearn/PrecisionRecallCurve.qmd | 2 +- .../tests/model_validation/sklearn/ROCCurve.qmd | 2 +- .../sklearn/RegressionErrors.qmd | 2 +- .../sklearn/RegressionErrorsComparison.qmd | 2 +- .../sklearn/RegressionPerformance.qmd | 2 +- .../sklearn/RegressionR2Square.qmd | 2 +- .../sklearn/RegressionR2SquareComparison.qmd | 2 +- .../sklearn/RobustnessDiagnosis.qmd | 2 +- .../sklearn/SHAPGlobalImportance.qmd | 2 +- .../sklearn/ScoreProbabilityAlignment.qmd | 2 +- .../model_validation/sklearn/SilhouettePlot.qmd | 2 +- .../sklearn/TrainingTestDegradation.qmd | 2 +- .../tests/model_validation/sklearn/VMeasure.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 2 +- .../model_validation/statsmodels/AutoARIMA.qmd | 2 +- .../CumulativePredictionProbabilities.qmd | 2 +- .../statsmodels/DurbinWatsonTest.qmd | 2 +- .../model_validation/statsmodels/GINITable.qmd | 2 +- .../statsmodels/KolmogorovSmirnov.qmd | 2 +- .../model_validation/statsmodels/Lilliefors.qmd | 2 +- .../PredictionProbabilitiesHistogram.qmd | 2 +- .../statsmodels/RegressionCoeffs.qmd | 2 +- .../RegressionFeatureSignificance.qmd | 2 +- .../statsmodels/RegressionModelForecastPlot.qmd | 2 +- .../RegressionModelForecastPlotLevels.qmd | 2 +- .../RegressionModelSensitivityPlot.qmd | 2 +- .../statsmodels/RegressionModelSummary.qmd | 2 +- .../RegressionPermutationFeatureImportance.qmd | 2 +- .../statsmodels/ScorecardHistogram.qmd | 2 +- docs/validmind/tests/prompt_validation/Bias.qmd | 2 +- .../tests/prompt_validation/Clarity.qmd | 2 +- .../tests/prompt_validation/Conciseness.qmd | 2 +- .../tests/prompt_validation/Delimitation.qmd | 2 +- .../prompt_validation/NegativeInstruction.qmd | 2 +- .../tests/prompt_validation/Robustness.qmd | 2 +- .../tests/prompt_validation/Specificity.qmd | 2 +- 144 files changed, 156 insertions(+), 149 deletions(-) diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index 952561b00..3cf94e4b1 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -28,11 +28,20 @@ ] {%- endmacro -%} -{% macro format_type(type, module=None, add_links=false) %} +{%- macro format_type(type, module=None, add_links=false) -%} {%- if type is mapping -%} {%- if type.cls is defined -%} - {%- if type.cls == "ExprAttribute" -%} + {%- if type.cls == "ExprCall" -%} + {%- if type.function and type.function.name in ["tags", "tasks"] -%} + @{{ type.function.name }}( + {%- for arg in type.arguments -%} + {{ arg }} + {%- if not loop.last -%}, {% endif -%} + {%- endfor -%} + ) + {%- endif -%} + {%- elif type.cls == "ExprAttribute" -%} {%- if type.get('values') is sequence -%} {%- for value in type.get('values') -%} {%- if value.cls == "ExprName" -%} @@ -83,15 +92,13 @@ {{ type }} {%- elif type|lower in builtin_types -%} {{ type }} - {%- elif type is string and type.startswith("{'cls'") -%} - {{ format_type(type|tojson|fromjson, module, add_links) }} {%- else -%} {{ type }} {%- endif -%} {%- else -%} {{ type|string }} {%- endif -%} -{% endmacro %} +{%- endmacro -%} {%- macro format_return_type(returns) -%} diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index d2dd28845..14b06e38c 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'forecasting', 'statistical_test', 'visualization')
@@tasks('regression')
defACFandPACFPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index d22e2aac0..a1f5c5ca4 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'", "'stationarity'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test', 'stationarity')
@@tasks('regression')
defADF(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 8198f897f..0c4f3f35e 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')
@@tasks('regression')
defAutoAR(dataset:VMDataset,max_ar_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index e5164d491..e08f2a087 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')
@@tasks('regression')
defAutoMA(dataset:VMDataset,max_ma_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index b369d9f47..2941c300f 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'statsmodels'", "'forecasting'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')
@@tasks('regression')
defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index d9ce3b621..51ceda824 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'numerical_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'numerical_data', 'visualization')
@@tasks('classification')
defBivariateScatterPlots(dataset): ::: diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index d90040bd4..997b41b6a 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
+
@@tasks('regression')
@@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels')
defBoxPierce(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 447f710d1..69788f57a 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'categorical_data'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'categorical_data', 'statistical_test')
@@tasks('classification')
defChiSquaredFeaturesTable(dataset,p_threshold=0.05): ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 88b1a69f0..fd7fc43e7 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -
@{'arguments': ["'tabular_data'", "'binary_classification'", "'multiclass_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'binary_classification', 'multiclass_classification')
@@tasks('classification')
defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple[Dict[str, Any], go.Figure, bool]: ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index d4e0c08fb..8c4f2a272 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'tabular_data'", "'time_series_data'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'", "'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'time_series_data', 'text_data')
@@tasks('classification', 'regression', 'text_classification', 'text_summarization')
defDatasetDescription(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 628cc6044..b51e8a090 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'time_series_data'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'", "'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'time_series_data', 'text_data')
@@tasks('classification', 'regression', 'text_classification', 'text_summarization')
defDatasetSplit(datasets:List[VMDataset]): ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 4ebc1433b..c83750c50 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -36,7 +36,7 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -
@{'arguments': ["'tabular_data'", "'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'time_series_data')
@@tasks('classification', 'regression')
defDescriptiveStatistics(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index ba5ef3b5c..56e64da5f 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'forecasting', 'unit_root_test')
@@tasks('regression')
defDickeyFullerGLS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 26d7d8feb..c6e14a294 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_quality'", "'text_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'data_quality', 'text_data')
@@tasks('classification', 'regression')
defDuplicates(dataset,min_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 49a36345c..ff07ffe71 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'statistical_test'", "'forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'statistical_test', 'forecasting')
@@tasks('regression')
defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 16ef85506..740bddc97 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'visualization', 'correlation')
@@tasks('classification', 'regression')
defFeatureTargetCorrelationPlot(dataset,fig_height=600): ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 1ac497f07..d23375596 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_quality'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'data_quality', 'categorical_data')
@@tasks('classification', 'regression')
defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 274dcdf92..7082d9b5d 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_quality'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'data_quality', 'correlation')
@@tasks('classification', 'regression')
defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 854f29588..c6a03bfc4 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'", "'numerical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'visualization', 'numerical_data')
@@tasks('classification', 'regression')
defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 0fefd7284..a2dc2bc2e 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'numerical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'numerical_data')
@@tasks('classification', 'regression')
defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index d02565ad5..2867bf51a 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'anomaly_detection'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'anomaly_detection')
@@tasks('classification')
defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index 1512482f2..09a4bb642 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
+
@@tasks('classification', 'regression')
@@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')
defJarqueBera(dataset): ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 42a002434..49459f578 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'stationarity'", "'unit_root_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'stationarity', 'unit_root_test', 'statsmodels')
@@tasks('data_validation')
defKPSS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 89c7af834..ee6651f17 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
+
@@tasks('regression')
@@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels')
defLJungBox(dataset): ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index c8f7816bc..44e7cf684 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'visualization')
@@tasks('regression')
defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index a04bb4dab..9adf76be7 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_quality'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'data_quality')
@@tasks('classification', 'regression')
defMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 14f3bc235..186c88f2d 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_quality'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'data_quality', 'visualization')
@@tasks('classification', 'regression')
defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 1d40a85d4..c2f05379e 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'feature_selection'", "'data_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('feature_selection', 'data_analysis')
@@tasks('classification', 'regression')
defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): ::: diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index d2d570983..b7bc3750d 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'numerical_data'", "'correlation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'numerical_data', 'correlation')
@@tasks('classification', 'regression')
defPearsonCorrelationMatrix(dataset): ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index ed2e2eb5e..b9bf4991c 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'forecasting', 'statistical_test', 'unit_root_test')
@@tasks('regression')
defPhillipsPerronArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index bd149ebce..9ed6d18f1 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('bias_and_fairness')
@@tasks('classification', 'regression')
defProtectedClassesCombination(dataset,model,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index bc6512a64..b3df0d9cc 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'bias_and_fairness'", "'descriptive_statistics'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('bias_and_fairness', 'descriptive_statistics')
@@tasks('classification', 'regression')
defProtectedClassesDescription(dataset,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index 60394d9f3..c74ee68f5 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('bias_and_fairness')
@@tasks('classification', 'regression')
defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=['fnr', 'fpr', 'tpr']): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 8e9b0d612..012c3e16a 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -100,7 +100,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'bias_and_fairness'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('bias_and_fairness')
@@tasks('classification', 'regression')
defProtectedClassesThresholdOptimizer(dataset,pipeline=None,protected_classes=None,X_train=None,y_train=None): ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 1813232f4..2b17deedf 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'visualization'", "'stationarity'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'visualization', 'stationarity')
@@tasks('regression')
defRollingStatsPlot(dataset:VMDataset,window_size:int=12): ::: diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 10f69524d..98caadce7 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'tabular_data'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
+
@@tasks('classification', 'regression')
@@tags('tabular_data', 'statistical_test', 'statsmodels')
defRunsTest(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 4f8bd8d6a..c0084a1fc 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'visualization')
@@tasks('classification', 'regression')
defScatterPlot(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index e21ac7890..65fdf2672 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'visualization'", "'credit_risk'", "'scorecard'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('visualization', 'credit_risk', 'scorecard')
@@tasks('classification')
defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 58be58fb8..21ca0846c 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'seasonality'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'seasonality', 'statsmodels')
@@tasks('regression')
defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): ::: diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 8abdae0f8..3084974be 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
+
@@tasks('classification', 'regression')
@@tags('tabular_data', 'data_distribution', 'statistical_test')
defShapiroWilk(dataset): ::: diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index 86b0acbf6..ddb4c2248 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'data_quality'", "'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('data_quality', 'tabular_data')
@@tasks('classification', 'regression')
defSkewness(dataset,max_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 589bf90c8..05b213108 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'visualization')
@@tasks('regression')
defSpreadPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 1b27b19a6..5bdf21701 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'visualization')
@@tasks('classification', 'regression')
defTabularCategoricalBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 19e75eed3..a833ed237 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'visualization')
@@tasks('classification', 'regression')
defTabularDateTimeHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 376fe7dc9..0ee91b168 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -86,7 +86,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data')
@@tasks('classification', 'regression')
defTabularDescriptionTables(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 9d0604919..9fe264142 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'visualization')
@@tasks('classification', 'regression')
defTabularNumericalHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 6255b653d..9da466857 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'visualization', 'categorical_data')
@@tasks('classification')
defTargetRateBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index a5edac2c3..26fb90978 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'analysis')
@@tasks('regression')
defTimeSeriesDescription(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index e468e92b2..5425bc2c0 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'analysis')
@@tasks('regression')
defTimeSeriesDescriptiveStatistics(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 9c9801328..7837e6f74 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data')
@@tasks('regression')
defTimeSeriesFrequency(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index c2d966fc9..7fdf18cc6 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'data_validation'", "'visualization'", "'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('data_validation', 'visualization', 'time_series_data')
@@tasks('regression', 'time_series_forecasting')
defTimeSeriesHistogram(dataset,nbins=30): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 9e03f68fe..4af17e7be 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'visualization')
@@tasks('regression')
defTimeSeriesLinePlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index f392b3ab7..f717c9ad0 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data')
@@tasks('regression')
defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index d6e23f70d..b22cf4552 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data')
@@tasks('regression')
defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 461ac4c38..b6b52ce11 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data')
@@tasks('regression', 'classification')
defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index dceef0bff..199003ea7 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data')
@@tasks('regression', 'classification')
defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 4d0df7c0e..fbcd4a4a3 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'visualization', 'categorical_data')
@@tasks('classification')
defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index b83d01a26..fcb239ec3 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'categorical_data'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'categorical_data')
@@tasks('classification')
defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 3176304ae..5bcda0c3e 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'stationarity'", "'unit_root_test'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'stationarity', 'unit_root_test')
@@tasks('regression')
defZivotAndrewsArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index 62bcc9e1e..9523723e6 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')
@@tasks('text_classification', 'text_summarization')
defCommonWords(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 4bf4c19b6..d3140286e 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')
@@tasks('text_classification', 'text_summarization')
defHashtags(dataset:VMDataset,top_hashtags:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 02b678a12..ae3be5865 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
defLanguageDetection(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 982146481..74a385d74 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')
@@tasks('text_classification', 'text_summarization')
defMentions(dataset:VMDataset,top_mentions:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index afeb67dd3..dc5aa3942 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'data_validation')
@@tasks('nlp')
defPolarityAndSubjectivity(dataset,threshold_subjectivity=0.5,threshold_polarity=0): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index e264bca3a..9ab73cc84 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -18,7 +18,7 @@ Metrics functions for any Pandas-compatible datasets ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'", "'frequency_analysis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'", "'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')
@@tasks('text_classification', 'text_summarization', 'nlp')
defPunctuations(dataset,count_mode='token'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index e81a3dc37..c75b2d2ae 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'data_validation')
@@tasks('nlp')
defSentiment(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index 78c3d7fbb..ad7313160 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'frequency_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'frequency_analysis', 'visualization')
@@tasks('text_classification', 'text_summarization')
defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 731ce56e7..78b2f2c69 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
defTextDescription(dataset:VMDataset,unwanted_tokens:set={'s', "s'", 'mr', 'ms', 'mrs', 'dr', "'s", ' ', "''", 'dollar', 'us', '``'},lang:str='english'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index be39d188a..a57b99195 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'data_validation'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'nlp'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'data_validation')
@@tasks('nlp')
defToxicity(dataset): ::: diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 3e573fb32..6d969a52f 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
defBertScore(dataset,model,evaluation_model='distilbert-base-uncased'): ::: diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index b56e3719a..9df9ac26a 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
defBleuScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index e4c6634dd..91b5ebdb5 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance')
@@tasks('clustering')
defClusterSizeDistribution(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index a8d946c8f..67506854c 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
defContextualRecall(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index b7bb22bca..31e052ab6 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'feature_importance'", "'AUC'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('feature_importance', 'AUC', 'visualization')
@@tasks('classification')
defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 5e6d353a5..ec901abfe 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
defMeteorScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index cf9ad50f9..b69c8ad6d 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -28,7 +28,7 @@ Attempts to extract all model info from a model object instance ::: {.signature} -
@{'arguments': ["'model_training'", "'metadata'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('model_training', 'metadata')
@@tasks('regression', 'time_series_forecasting')
defModelMetadata(model): ::: diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index 199639ca4..cfa80baaf 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'residual_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('regression')
@@tasks('residual_analysis', 'visualization')
defModelPredictionResiduals(dataset,model,nbins=100,p_value_threshold=0.05,start_date=None,end_date=None): ::: diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 976bd8c63..8f90ca855 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
defRegardScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index fc506cc4d..7ca68d429 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('model_performance', 'visualization')
@@tasks('regression')
defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index f2ab200c6..163ac00c6 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
defRougeScore(dataset,model,metric='rouge-1'): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index b430bf252..36e69d53c 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_predictions'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('model_predictions', 'visualization')
@@tasks('regression', 'time_series_forecasting')
defTimeSeriesPredictionWithCI(dataset,model,confidence=0.95): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index e90fb607c..3d79488da 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_predictions'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('model_predictions', 'visualization')
@@tasks('regression', 'time_series_forecasting')
defTimeSeriesPredictionsPlot(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 57d973d79..0101e2766 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('model_performance', 'sklearn')
@@tasks('regression', 'time_series_forecasting')
defTimeSeriesR2SquareBySegments(dataset,model,segments=None): ::: diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index f75f74b1d..ead48a48f 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
defTokenDisparity(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index 4c0ae89dd..3bcf7fdf7 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'nlp'", "'text_data'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
defToxicityScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 2ded884b2..130a7dd02 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance', 'clustering')
@@tasks('clustering')
defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 299bbc375..301837cdd 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance', 'clustering')
@@tasks('clustering')
defAdjustedRandIndex(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index dd8074550..8b4695d29 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance', 'classification')
@@tasks('classification')
defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index bbf2b326d..6021b704d 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@@tasks('classification', 'text_classification')
defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 586579b2e..36856d109 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_validation'", "'threshold_optimization'", "'classification_metrics'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('model_validation', 'threshold_optimization', 'classification_metrics')
@@tasks('classification')
defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 5fbfd5ec3..dc523d437 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance', 'clustering')
@@tasks('clustering')
defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index fc0edb78c..bf74e704e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance', 'clustering')
@@tasks('clustering')
defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index f25671734..df81ae788 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance', 'clustering')
@@tasks('clustering')
defCompletenessScore(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 7aa3ba21e..5fb020d50 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')
@@tasks('classification', 'text_classification')
defConfusionMatrix(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 00e21d96c..605e87b55 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_explainability'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('model_explainability', 'sklearn')
@@tasks('regression', 'time_series_forecasting')
defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index ce49ac028..6d4c5f401 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance')
@@tasks('clustering')
defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 1047cb048..fe01aed9c 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance')
@@tasks('clustering')
defHomogeneityScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 76a8b363c..abf32c773 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance')
@@tasks('classification', 'clustering')
defcustom_recall(y_true,y_pred_proba,threshold=0.5): ::: @@ -27,7 +27,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance')
@@tasks('clustering', 'classification')
defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union[str, List, Dict]=None,thresholds:Union[float, List[float]]=None,fit_params:dict=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index b19c9270b..0fb3ed95e 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'", "'kmeans'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance', 'kmeans')
@@tasks('clustering')
defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union[List[int], None]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 2a17f372b..988d3a8f2 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@@tasks('classification', 'text_classification')
defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 28b73b249..5ab755d64 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@@tasks('classification', 'text_classification')
defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index cdde04360..52d096166 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@@tasks('classification', 'text_classification')
defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 126af3249..cf22d46d5 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_training'", "'metadata'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('model_training', 'metadata')
@@tasks('classification', 'regression')
defModelParameters(model,model_params=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index cc3220c71..dd65e9bb8 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -24,7 +24,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'model_comparison'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'model_comparison')
@@tasks('classification', 'text_classification')
defModelsPerformanceComparison(dataset:VMDataset,models:list[VMModel]): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index a399fb98b..73f294d70 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'linear_regression'", "'model_diagnosis'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'linear_regression', 'model_diagnosis')
@@tasks('classification', 'regression')
defOverfitDiagnosis(model:VMModel,datasets:List[VMDataset],metric:str=None,cut_off_threshold:float=DEFAULT_THRESHOLD): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index a9479df1b..5690ee4fb 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')
@@tasks('classification', 'text_classification')
defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union[int, None]=None,figure_height:Union[int, None]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 5779904fc..8ddbbffb9 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -46,7 +46,7 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@@tasks('classification', 'text_classification')
defPopulationStabilityIndex(datasets:List[VMDataset],model:VMModel,num_bins:int=10,mode:str='fixed'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 9e177caa4..1c6b18387 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'binary_classification', 'model_performance', 'visualization')
@@tasks('classification', 'text_classification')
defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 9eaadb802..f78519f90 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')
@@tasks('classification', 'text_classification')
defROCCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index 8332b3fd7..9d18d49f9 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance')
@@tasks('regression', 'classification')
defRegressionErrors(model,dataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index a520e9173..74e2d979b 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('model_performance', 'sklearn')
@@tasks('regression', 'time_series_forecasting')
defRegressionErrorsComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index fef59bf85..5fd834141 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance')
@@tasks('regression')
defRegressionPerformance(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 4ba2e3701..e05203c83 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance')
@@tasks('regression')
defRegressionR2Square(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 7dd6d7a21..0d9b49f00 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -
@{'arguments': ["'model_performance'", "'sklearn'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'", "'time_series_forecasting'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('model_performance', 'sklearn')
@@tasks('regression', 'time_series_forecasting')
defRegressionR2SquareComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 058f298e2..9f6a30d3f 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_diagnosis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_diagnosis', 'visualization')
@@tasks('classification', 'regression')
defRobustnessDiagnosis(datasets:List[VMDataset],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List[float]=DEFAULT_STD_DEV_LIST,performance_decay_threshold:float=DEFAULT_DECAY_THRESHOLD): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 907c1a3fe..6e0e0f669 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -85,7 +85,7 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')
@@tasks('classification', 'text_classification')
defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 08a0dafd4..2f1d56fbc 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'visualization'", "'credit_risk'", "'calibration'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('visualization', 'credit_risk', 'calibration')
@@tasks('classification')
defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index a9817c45b..bc56cd935 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance')
@@tasks('clustering')
defSilhouettePlot(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index be0b904ec..93d6054a1 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_performance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')
@@tasks('classification', 'text_classification')
defTrainingTestDegradation(datasets:List[VMDataset],model:VMModel,max_threshold:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index e06e89185..b4cd0c0fd 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'clustering'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'model_performance')
@@tasks('clustering')
defVMeasure(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 023d2b799..10bc43a73 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'sklearn'", "'binary_classification'", "'multiclass_classification'", "'model_diagnosis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'text_classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_diagnosis', 'visualization')
@@tasks('classification', 'text_classification')
defWeakspotsDiagnosis(datasets:List[VMDataset],model:VMModel,features_columns:Union[List[str], None]=None,metrics:Union[Dict[str, Callable], None]=None,thresholds:Union[Dict[str, float], None]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 4fa476617..d0329fe05 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'model_selection'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'forecasting', 'model_selection', 'statsmodels')
@@tasks('regression')
defAutoARIMA(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 9cb34d4f0..e9608935a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'visualization'", "'credit_risk'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('visualization', 'credit_risk')
@@tasks('classification')
defCumulativePredictionProbabilities(dataset,model,title='Cumulative Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 78799c033..392b07d23 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
@{'arguments': ["'time_series_data'", "'forecasting'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
+
@@tasks('regression')
@@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels')
defDurbinWatsonTest(dataset,model,threshold=[1.5, 2.5]): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index afe9258ff..3a647b10d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'model_performance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('model_performance')
@@tasks('classification')
defGINITable(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 80417323a..53bc9f50a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')
@@tasks('classification', 'regression')
defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index d7cedeb99..49837bfe5 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'data_distribution'", "'statistical_test'", "'statsmodels'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')
@@tasks('classification', 'regression')
defLilliefors(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index dd419141e..de5b3bc6e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'visualization'", "'credit_risk'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('visualization', 'credit_risk')
@@tasks('classification')
defPredictionProbabilitiesHistogram(dataset,model,title='Histogram of Predictive Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index d7f00900a..75984c578 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'tabular_data'", "'visualization'", "'model_training'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('tabular_data', 'visualization', 'model_training')
@@tasks('regression')
defRegressionCoeffs(model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 1a5d4e106..7f224ef95 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'statistical_test'", "'model_interpretation'", "'visualization'", "'feature_importance'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('statistical_test', 'model_interpretation', 'visualization', 'feature_importance')
@@tasks('regression')
defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 8cad6095c..6b5ec486e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'forecasting', 'visualization')
@@tasks('regression')
defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union[str, None]=None,end_date:Union[str, None]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 19968da6d..44be500fb 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'time_series_data'", "'forecasting'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('time_series_data', 'forecasting', 'visualization')
@@tasks('regression')
defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 7bd1ece7a..1b822862d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'senstivity_analysis'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('senstivity_analysis', 'visualization')
@@tasks('regression')
defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List[float]=[0.1],transformation:Union[str, None]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index c1f6b4da2..e5fb54b5f 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -
@{'arguments': ["'model_performance'", "'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('model_performance', 'regression')
@@tasks('regression')
defRegressionModelSummary(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 279fac97d..36edca25c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@{'arguments': ["'statsmodels'", "'feature_importance'", "'visualization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('statsmodels', 'feature_importance', 'visualization')
@@tasks('regression')
defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index bb40c336e..8e57188c2 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@{'arguments': ["'visualization'", "'credit_risk'", "'logistic_regression'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'classification'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('visualization', 'credit_risk', 'logistic_regression')
@@tasks('classification')
defScorecardHistogram(dataset,title='Histogram of Scores',score_column='score'): ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 789c79e6e..62137758e 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('llm', 'few_shot')
@@tasks('text_classification', 'text_summarization')
defBias(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index c8e9f26d1..5abe7edaa 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('llm', 'zero_shot', 'few_shot')
@@tasks('text_classification', 'text_summarization')
defClarity(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 0d55cb6bb..349946fde 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('llm', 'zero_shot', 'few_shot')
@@tasks('text_classification', 'text_summarization')
defConciseness(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index f296b9ce7..0acb0aa4d 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('llm', 'zero_shot', 'few_shot')
@@tasks('text_classification', 'text_summarization')
defDelimitation(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index fea1a00db..a5457f3c7 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('llm', 'zero_shot', 'few_shot')
@@tasks('text_classification', 'text_summarization')
defNegativeInstruction(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 850b83be4..fde739e21 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -28,7 +28,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('llm', 'zero_shot', 'few_shot')
@@tasks('text_classification', 'text_summarization')
defRobustness(model,dataset,num_tests=10): ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index e4d6dac55..9ba2dc6c5 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@{'arguments': ["'llm'", "'zero_shot'", "'few_shot'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tags'}}
@{'arguments': ["'text_classification'", "'text_summarization'"], 'cls': 'ExprCall', 'function': {'cls': 'ExprName', 'name': 'tasks'}}
+
@@tags('llm', 'zero_shot', 'few_shot')
@@tasks('text_classification', 'text_summarization')
defSpecificity(model,min_threshold=7): ::: From ab0485abe4d2377d6c6b0cd2bbad23f57518e538 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 21 Feb 2025 08:13:12 -0800 Subject: [PATCH 095/207] Generalize Expr* type handling further --- docs/templates/macros/decorators.jinja2 | 2 +- docs/templates/macros/types.jinja2 | 43 +++++++++++++-- docs/validmind.qmd | 16 +++--- docs/validmind/errors.qmd | 4 +- docs/validmind/test_suites.qmd | 12 ++--- docs/validmind/tests.qmd | 18 +++---- .../tests/data_validation/ACFandPACFPlot.qmd | 4 +- docs/validmind/tests/data_validation/ADF.qmd | 4 +- .../tests/data_validation/AutoAR.qmd | 4 +- .../tests/data_validation/AutoMA.qmd | 4 +- .../data_validation/AutoStationarity.qmd | 4 +- .../data_validation/BivariateScatterPlots.qmd | 2 +- .../tests/data_validation/BoxPierce.qmd | 2 +- .../ChiSquaredFeaturesTable.qmd | 2 +- .../tests/data_validation/ClassImbalance.qmd | 4 +- .../data_validation/DatasetDescription.qmd | 4 +- .../tests/data_validation/DatasetSplit.qmd | 4 +- .../data_validation/DescriptiveStatistics.qmd | 6 +-- .../tests/data_validation/DickeyFullerGLS.qmd | 4 +- .../tests/data_validation/Duplicates.qmd | 2 +- .../data_validation/EngleGrangerCoint.qmd | 4 +- .../FeatureTargetCorrelationPlot.qmd | 2 +- .../tests/data_validation/HighCardinality.qmd | 4 +- .../HighPearsonCorrelation.qmd | 4 +- .../data_validation/IQROutliersBarPlot.qmd | 4 +- .../data_validation/IQROutliersTable.qmd | 4 +- .../IsolationForestOutliers.qmd | 4 +- .../tests/data_validation/JarqueBera.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 4 +- .../tests/data_validation/LJungBox.qmd | 2 +- .../LaggedCorrelationHeatmap.qmd | 4 +- .../tests/data_validation/MissingValues.qmd | 4 +- .../data_validation/MissingValuesBarPlot.qmd | 4 +- .../data_validation/MutualInformation.qmd | 4 +- .../PearsonCorrelationMatrix.qmd | 2 +- .../data_validation/PhillipsPerronArch.qmd | 4 +- .../ProtectedClassesCombination.qmd | 2 +- .../ProtectedClassesDescription.qmd | 2 +- .../ProtectedClassesDisparity.qmd | 4 +- .../ProtectedClassesThresholdOptimizer.qmd | 2 +- .../data_validation/RollingStatsPlot.qmd | 4 +- .../tests/data_validation/RunsTest.qmd | 2 +- .../tests/data_validation/ScatterPlot.qmd | 2 +- .../data_validation/ScoreBandDefaultRates.qmd | 4 +- .../data_validation/SeasonalDecompose.qmd | 4 +- .../tests/data_validation/ShapiroWilk.qmd | 2 +- .../tests/data_validation/Skewness.qmd | 2 +- .../tests/data_validation/SpreadPlot.qmd | 4 +- .../TabularCategoricalBarPlots.qmd | 4 +- .../TabularDateTimeHistograms.qmd | 4 +- .../TabularDescriptionTables.qmd | 2 +- .../TabularNumericalHistograms.qmd | 4 +- .../data_validation/TargetRateBarPlots.qmd | 4 +- .../data_validation/TimeSeriesDescription.qmd | 2 +- .../TimeSeriesDescriptiveStatistics.qmd | 2 +- .../data_validation/TimeSeriesFrequency.qmd | 4 +- .../data_validation/TimeSeriesHistogram.qmd | 2 +- .../data_validation/TimeSeriesLinePlot.qmd | 4 +- .../TimeSeriesMissingValues.qmd | 4 +- .../data_validation/TimeSeriesOutliers.qmd | 4 +- .../data_validation/TooManyZeroValues.qmd | 4 +- .../tests/data_validation/UniqueRows.qmd | 4 +- .../tests/data_validation/WOEBinPlots.qmd | 4 +- .../tests/data_validation/WOEBinTable.qmd | 4 +- .../data_validation/ZivotAndrewsArch.qmd | 4 +- .../tests/data_validation/nlp/CommonWords.qmd | 4 +- .../tests/data_validation/nlp/Hashtags.qmd | 4 +- .../data_validation/nlp/LanguageDetection.qmd | 2 +- .../tests/data_validation/nlp/Mentions.qmd | 4 +- .../nlp/PolarityAndSubjectivity.qmd | 2 +- .../data_validation/nlp/Punctuations.qmd | 2 +- .../tests/data_validation/nlp/Sentiment.qmd | 2 +- .../tests/data_validation/nlp/StopWords.qmd | 4 +- .../data_validation/nlp/TextDescription.qmd | 4 +- .../tests/data_validation/nlp/Toxicity.qmd | 2 +- .../tests/model_validation/BertScore.qmd | 2 +- .../tests/model_validation/BleuScore.qmd | 2 +- .../ClusterSizeDistribution.qmd | 4 +- .../model_validation/ContextualRecall.qmd | 2 +- .../tests/model_validation/FeaturesAUC.qmd | 4 +- .../tests/model_validation/MeteorScore.qmd | 2 +- .../tests/model_validation/ModelMetadata.qmd | 2 +- .../ModelPredictionResiduals.qmd | 2 +- .../tests/model_validation/RegardScore.qmd | 2 +- .../RegressionResidualsPlot.qmd | 4 +- .../tests/model_validation/RougeScore.qmd | 2 +- .../TimeSeriesPredictionWithCI.qmd | 2 +- .../TimeSeriesPredictionsPlot.qmd | 2 +- .../TimeSeriesR2SquareBySegments.qmd | 2 +- .../tests/model_validation/TokenDisparity.qmd | 2 +- .../tests/model_validation/ToxicityScore.qmd | 2 +- .../sklearn/AdjustedMutualInformation.qmd | 4 +- .../sklearn/AdjustedRandIndex.qmd | 4 +- .../sklearn/CalibrationCurve.qmd | 4 +- .../sklearn/ClassifierPerformance.qmd | 4 +- .../ClassifierThresholdOptimization.qmd | 4 +- .../sklearn/ClusterCosineSimilarity.qmd | 4 +- .../sklearn/ClusterPerformanceMetrics.qmd | 4 +- .../sklearn/CompletenessScore.qmd | 4 +- .../sklearn/ConfusionMatrix.qmd | 4 +- .../sklearn/FeatureImportance.qmd | 4 +- .../sklearn/FowlkesMallowsScore.qmd | 4 +- .../sklearn/HomogeneityScore.qmd | 4 +- .../sklearn/HyperParametersTuning.qmd | 6 +-- .../sklearn/KMeansClustersOptimization.qmd | 4 +- .../sklearn/MinimumAccuracy.qmd | 4 +- .../sklearn/MinimumF1Score.qmd | 4 +- .../sklearn/MinimumROCAUCScore.qmd | 4 +- .../sklearn/ModelParameters.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 4 +- .../sklearn/OverfitDiagnosis.qmd | 4 +- .../sklearn/PermutationFeatureImportance.qmd | 4 +- .../sklearn/PopulationStabilityIndex.qmd | 4 +- .../sklearn/PrecisionRecallCurve.qmd | 4 +- .../model_validation/sklearn/ROCCurve.qmd | 4 +- .../sklearn/RegressionErrors.qmd | 2 +- .../sklearn/RegressionErrorsComparison.qmd | 2 +- .../sklearn/RegressionPerformance.qmd | 4 +- .../sklearn/RegressionR2Square.qmd | 4 +- .../sklearn/RegressionR2SquareComparison.qmd | 4 +- .../sklearn/RobustnessDiagnosis.qmd | 4 +- .../sklearn/SHAPGlobalImportance.qmd | 4 +- .../sklearn/ScoreProbabilityAlignment.qmd | 4 +- .../sklearn/SilhouettePlot.qmd | 4 +- .../sklearn/TrainingTestDegradation.qmd | 4 +- .../model_validation/sklearn/VMeasure.qmd | 4 +- .../sklearn/WeakspotsDiagnosis.qmd | 4 +- .../statsmodels/AutoARIMA.qmd | 4 +- .../CumulativePredictionProbabilities.qmd | 2 +- .../statsmodels/DurbinWatsonTest.qmd | 4 +- .../statsmodels/GINITable.qmd | 2 +- .../statsmodels/KolmogorovSmirnov.qmd | 4 +- .../statsmodels/Lilliefors.qmd | 4 +- .../PredictionProbabilitiesHistogram.qmd | 2 +- .../statsmodels/RegressionCoeffs.qmd | 2 +- .../RegressionFeatureSignificance.qmd | 4 +- .../RegressionModelForecastPlot.qmd | 4 +- .../RegressionModelForecastPlotLevels.qmd | 4 +- .../RegressionModelSensitivityPlot.qmd | 4 +- .../statsmodels/RegressionModelSummary.qmd | 6 +-- ...RegressionPermutationFeatureImportance.qmd | 4 +- .../statsmodels/ScorecardHistogram.qmd | 2 +- .../statsmodels/statsutils.qmd | 2 +- .../tests/prompt_validation/Bias.qmd | 8 +-- .../tests/prompt_validation/Clarity.qmd | 8 +-- .../tests/prompt_validation/Conciseness.qmd | 8 +-- .../tests/prompt_validation/Delimitation.qmd | 8 +-- .../prompt_validation/NegativeInstruction.qmd | 8 +-- .../tests/prompt_validation/Robustness.qmd | 4 +- .../tests/prompt_validation/Specificity.qmd | 8 +-- .../prompt_validation/ai_powered_test.qmd | 6 +-- docs/validmind/unit_metrics.qmd | 4 +- docs/validmind/vm_models.qmd | 52 +++++++++---------- 153 files changed, 352 insertions(+), 319 deletions(-) diff --git a/docs/templates/macros/decorators.jinja2 b/docs/templates/macros/decorators.jinja2 index 2ada2b965..b65101957 100644 --- a/docs/templates/macros/decorators.jinja2 +++ b/docs/templates/macros/decorators.jinja2 @@ -3,7 +3,7 @@ {%- macro render_decorators(member) -%} {%- if member.decorators -%} {%- for decorator in member.decorators -%} -
@{%- if decorator is mapping -%}{{ format_type(decorator.value) }}{%- else -%}{{ decorator }}{%- endif -%}
+
{%- if decorator is mapping -%}{{ format_type(decorator.value) }}{%- else -%}{{ decorator }}{%- endif -%}
{%- endfor -%} {%- endif -%} {%- endmacro -%} \ No newline at end of file diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index 3cf94e4b1..a83040279 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -29,26 +29,33 @@ {%- endmacro -%} {%- macro format_type(type, module=None, add_links=false) -%} - {%- if type is mapping -%} {%- if type.cls is defined -%} {%- if type.cls == "ExprCall" -%} {%- if type.function and type.function.name in ["tags", "tasks"] -%} @{{ type.function.name }}( {%- for arg in type.arguments -%} - {{ arg }} + {{ format_type(arg, module, add_links) }} {%- if not loop.last -%}, {% endif -%} {%- endfor -%} ) + {%- else -%} + {# General ExprCall handling #} + {{ format_type(type.function, module, add_links) }}( + {%- for arg in type.arguments -%} + {{ format_type(arg, module, add_links) }} + {%- if not loop.last -%}, {% endif -%} + {%- endfor -%} + ) {%- endif -%} {%- elif type.cls == "ExprAttribute" -%} {%- if type.get('values') is sequence -%} {%- for value in type.get('values') -%} - {%- if value.cls == "ExprName" -%} - {{ value.name }} - {%- endif -%} + {{ format_type(value, module, add_links) }} {%- if not loop.last -%}.{%- endif -%} {%- endfor -%} + {%- elif type.value is defined and type.attr is defined -%} + {{ format_type(type.value, module, add_links) }}.{{ format_type(type.attr, module, add_links) }} {%- else -%} {{ type|string }} {%- endif -%} @@ -63,6 +70,32 @@ {{ ']' if type.cls == "ExprList" else '}' }} {%- elif type.cls == "ExprSubscript" -%} {{ format_expr_subscript(type, module, add_links) }} + {%- elif type.cls == "ExprConstant" -%} + {%- if type.value is string -%} + {{ type.value }} + {%- elif type.value is number -%} + {{ type.value }} + {%- else -%} + {{ type.value }} + {%- endif -%} + {%- elif type.cls == "ExprDict" -%} + { + {%- for key, value in type.items -%} + {{ format_type(key, module, add_links) }}: {{ format_type(value, module, add_links) }} + {%- if not loop.last -%}, {% endif -%} + {%- endfor -%} + } + {%- elif type.cls == "ExprTuple" -%} + ( + {%- for elem in type.elements -%} + {{ format_type(elem, module, add_links) }} + {%- if not loop.last -%}, {% endif -%} + {%- endfor -%} + ) + {%- elif type.cls == "ExprUnary" -%} + {{ type.op }}{{ format_type(type.operand, module, add_links) }} + {%- elif type.cls == "ExprBinary" -%} + {{ format_type(type.left, module, add_links) }} {{ type.op }} {{ format_type(type.right, module, add_links) }} {%- else -%} {{ type|string }} {%- endif -%} diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 72959b570..966a8d7e6 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -55,7 +55,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -defget_test_suite(test_suite_id:str=None,section:str=None,\*args,\*\*kwargs)validmind.vm_models.TestSuite: +defget_test_suite(test_suite_id:str=None,section:str=None,\*args,\*\*kwargs)validmind.vm_models.TestSuite: ::: @@ -78,7 +78,7 @@ This function provides an interface to retrieve the TestSuite instance for the c ::: {.signature} -definit(project:Optional\[str\]=None,api_key:Optional\[str\]=None,api_secret:Optional\[str\]=None,api_host:Optional\[str\]=None,model:Optional\[str\]=None,monitoring:bool=False,generate_descriptions:Optional\[bool\]=None): +definit(project:Optional\[str\]=None,api_key:Optional\[str\]=None,api_secret:Optional\[str\]=None,api_host:Optional\[str\]=None,model:Optional\[str\]=None,monitoring:bool=False,generate_descriptions:Optional\[bool\]=None): ::: @@ -108,7 +108,7 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True)validmind.vm_models.VMDataset: +definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True)validmind.vm_models.VMDataset: ::: @@ -149,7 +149,7 @@ The following dataset types are supported: ::: {.signature} -definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs)validmind.vm_models.VMModel: +definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs)validmind.vm_models.VMModel: ::: @@ -179,7 +179,7 @@ Initializes a VM Model, which can then be passed to other functions that can per ::: {.signature} -definit_r_model(model_path:str,input_id:str='model')validmind.vm_models.VMModel: +definit_r_model(model_path:str,input_id:str='model')validmind.vm_models.VMModel: ::: @@ -211,7 +211,7 @@ LogisticRegression and LinearRegression models are converted to sklearn models b ::: {.signature} -deflog_metric(key:str,value:float,inputs:Optional\[List\[str\]\]=None,params:Optional\[Dict\[str, Any\]\]=None,recorded_at:Optional\[str\]=None,thresholds:Optional\[Dict\[str, Any\]\]=None): +deflog_metric(key:str,value:float,inputs:Optional\[List\[str\]\]=None,params:Optional\[Dict\[str, Any\]\]=None,recorded_at:Optional\[str\]=None,thresholds:Optional\[Dict\[str, Any\]\]=None): ::: @@ -445,7 +445,7 @@ Holds raw data for a test result ::: {.signature} -RawData(log:bool=False,\*\*kwargs) +RawData(log:bool=False,\*\*kwargs) ::: @@ -466,7 +466,7 @@ Create a new RawData object ::: {.signature} -definspect(self,show:bool=True): +definspect(self,show:bool=True): ::: diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index 99efd35ae..393cace19 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -384,7 +384,7 @@ Exception raised when an error occurs while loading a test ::: {.signature} -LoadTestError(message:str,original_error:Optional\[Exception\]=None) +LoadTestError(message:str,original_error:Optional\[Exception\]=None) ::: @@ -872,7 +872,7 @@ returns a non-JSON string or if the API returns a non-standard error ::: {.signature} -defshould_raise_on_fail_fast(error)bool: +defshould_raise_on_fail_fast(error)bool: ::: diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 2243bdf39..7ef7572c8 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -29,7 +29,7 @@ Entrypoint for test suites. ::: {.signature} -defformat_dataframe(df:pd.DataFrame)pd.DataFrame: +defformat_dataframe(df:pd.DataFrame)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -57,7 +57,7 @@ Get a logger for the given module name ::: {.signature} -deftest_id_to_name(test_id:str)str: +deftest_id_to_name(test_id:str)str: ::: @@ -81,7 +81,7 @@ Convert a test ID to a human-readable name. ::: {.signature} -defdescribe_suite(test_suite_id:str,verbose=False): +defdescribe_suite(test_suite_id:str,verbose=False): ::: @@ -106,7 +106,7 @@ Describes a Test Suite by ID ::: {.signature} -defget_by_id(test_suite_id:str): +defget_by_id(test_suite_id:str): ::: @@ -122,7 +122,7 @@ Returns the test suite by ID ::: {.signature} -deflist_suites(pretty:bool=True): +deflist_suites(pretty:bool=True): ::: @@ -138,7 +138,7 @@ Returns a list of all available test suites ::: {.signature} -defregister_test_suite(suite_id:str,suite:TestSuite): +defregister_test_suite(suite_id:str,suite:TestSuite): ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 5c69d3ed3..b933e204f 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -20,7 +20,7 @@ ValidMind Tests Module ::: {.signature} -defdescribe_test(test_id:TestID=None,raw:bool=False,show:bool=True): +defdescribe_test(test_id:TestID=None,raw:bool=False,show:bool=True): ::: @@ -115,7 +115,7 @@ List all tests in the tests directory. ::: {.signature} -defload_test(test_id:str,test_func:callable=None,reload:bool=False): +defload_test(test_id:str,test_func:callable=None,reload:bool=False): ::: @@ -136,7 +136,7 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. ::: {.signature} -defrun_test(test_id:Union\[TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[Callable\[\[TestResult\], None\], None\]=None,\*\*kwargs)validmind.vm_models.TestResult: +defrun_test(test_id:Union\[TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[Callable\[\[TestResult\], None\], None\]=None,\*\*kwargs)validmind.vm_models.TestResult: ::: @@ -256,7 +256,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -defregister_test_provider(namespace:str,test_provider:TestProvider)None: +defregister_test_provider(namespace:str,test_provider:TestProvider)None: ::: @@ -296,7 +296,7 @@ Exception raised when an error occurs while loading a test ::: {.signature} -LoadTestError(message:str,original_error:Optional\[Exception\]=None) +LoadTestError(message:str,original_error:Optional\[Exception\]=None) ::: @@ -349,7 +349,7 @@ test = test_provider.load_test("my_namespace.my_test_class") ::: {.signature} -LocalTestProvider(root_folder:str) +LocalTestProvider(root_folder:str) ::: @@ -385,7 +385,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str): +defload_test(test_id:str): ::: @@ -430,7 +430,7 @@ Protocol for user-defined test providers ::: {.signature} -deflist_tests()List\[str\]: +deflist_tests()List\[str\]: ::: @@ -448,7 +448,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str)callable: +defload_test(test_id:str)callable: ::: diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 14b06e38c..4bede5c20 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('time_series_data', 'forecasting', 'statistical_test', 'visualization')
@@tasks('regression')
-defACFandPACFPlot(dataset:VMDataset): +
@tags('time_series_data', 'forecasting', 'statistical_test', 'visualization')
@tasks('regression')
+defACFandPACFPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index a1f5c5ca4..40bac4142 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test', 'stationarity')
@@tasks('regression')
-defADF(dataset:VMDataset): +
@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test', 'stationarity')
@tasks('regression')
+defADF(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 0c4f3f35e..6755d9137 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')
@@tasks('regression')
-defAutoAR(dataset:VMDataset,max_ar_order:int=3): +
@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')
@tasks('regression')
+defAutoAR(dataset:VMDataset,max_ar_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index e08f2a087..ae3cdae7a 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')
@@tasks('regression')
-defAutoMA(dataset:VMDataset,max_ma_order:int=3): +
@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')
@tasks('regression')
+defAutoMA(dataset:VMDataset,max_ma_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 2941c300f..281532945 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')
@@tasks('regression')
-defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): +
@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')
@tasks('regression')
+defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 51ceda824..2101fc5f6 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'numerical_data', 'visualization')
@@tasks('classification')
+
@tags('tabular_data', 'numerical_data', 'visualization')
@tasks('classification')
defBivariateScatterPlots(dataset): ::: diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index 997b41b6a..14b89e3df 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tasks('regression')
@@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels')
+
@tasks('regression')
@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels')
defBoxPierce(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 69788f57a..d9e0f9a27 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'categorical_data', 'statistical_test')
@@tasks('classification')
+
@tags('tabular_data', 'categorical_data', 'statistical_test')
@tasks('classification')
defChiSquaredFeaturesTable(dataset,p_threshold=0.05): ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index fd7fc43e7..0c3500394 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,8 +18,8 @@ Threshold based tests ::: {.signature} -
@@tags('tabular_data', 'binary_classification', 'multiclass_classification')
@@tasks('classification')
-defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple[Dict[str, Any], go.Figure, bool]: +
@tags('tabular_data', 'binary_classification', 'multiclass_classification')
@tasks('classification')
+defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple[Dict[str, Any], validmind.vm_models.go.validmind.vm_models.Figure, bool]: ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 8c4f2a272..bf1a51505 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('tabular_data', 'time_series_data', 'text_data')
@@tasks('classification', 'regression', 'text_classification', 'text_summarization')
-defDatasetDescription(dataset:VMDataset): +
@tags('tabular_data', 'time_series_data', 'text_data')
@tasks('classification', 'regression', 'text_classification', 'text_summarization')
+defDatasetDescription(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index b51e8a090..5b0707cc9 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'time_series_data', 'text_data')
@@tasks('classification', 'regression', 'text_classification', 'text_summarization')
-defDatasetSplit(datasets:List[VMDataset]): +
@tags('tabular_data', 'time_series_data', 'text_data')
@tasks('classification', 'regression', 'text_classification', 'text_summarization')
+defDatasetSplit(datasets:List[VMDataset]): ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index c83750c50..9f06dcd7d 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defformat_records(df:pd.DataFrame)List\[Dict\[str, Any\]\]: +defformat_records(df:pd.DataFrame)List\[Dict\[str, Any\]\]: ::: @@ -36,8 +36,8 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -
@@tags('tabular_data', 'time_series_data')
@@tasks('classification', 'regression')
-defDescriptiveStatistics(dataset:VMDataset): +
@tags('tabular_data', 'time_series_data')
@tasks('classification', 'regression')
+defDescriptiveStatistics(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 56e64da5f..1a2386508 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('time_series_data', 'forecasting', 'unit_root_test')
@@tasks('regression')
-defDickeyFullerGLS(dataset:VMDataset): +
@tags('time_series_data', 'forecasting', 'unit_root_test')
@tasks('regression')
+defDickeyFullerGLS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index c6e14a294..d093a20d0 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'data_quality', 'text_data')
@@tasks('classification', 'regression')
+
@tags('tabular_data', 'data_quality', 'text_data')
@tasks('classification', 'regression')
defDuplicates(dataset,min_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index ff07ffe71..423a38543 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('time_series_data', 'statistical_test', 'forecasting')
@@tasks('regression')
-defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): +
@tags('time_series_data', 'statistical_test', 'forecasting')
@tasks('regression')
+defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 740bddc97..419c12e90 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'visualization', 'correlation')
@@tasks('classification', 'regression')
+
@tags('tabular_data', 'visualization', 'correlation')
@tasks('classification', 'regression')
defFeatureTargetCorrelationPlot(dataset,fig_height=600): ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index d23375596..a911e7aa0 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'data_quality', 'categorical_data')
@@tasks('classification', 'regression')
-defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): +
@tags('tabular_data', 'data_quality', 'categorical_data')
@tasks('classification', 'regression')
+defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 7082d9b5d..50debff26 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'data_quality', 'correlation')
@@tasks('classification', 'regression')
-defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): +
@tags('tabular_data', 'data_quality', 'correlation')
@tasks('classification', 'regression')
+defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index c6a03bfc4..82dd5c751 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -26,8 +26,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'visualization', 'numerical_data')
@@tasks('classification', 'regression')
-defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): +
@tags('tabular_data', 'visualization', 'numerical_data')
@tasks('classification', 'regression')
+defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index a2dc2bc2e..ab01d2d73 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -26,8 +26,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'numerical_data')
@@tasks('classification', 'regression')
-defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): +
@tags('tabular_data', 'numerical_data')
@tasks('classification', 'regression')
+defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index 2867bf51a..ad5ec89f4 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'anomaly_detection')
@@tasks('classification')
-defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): +
@tags('tabular_data', 'anomaly_detection')
@tasks('classification')
+defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index 09a4bb642..57673b4a8 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tasks('classification', 'regression')
@@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')
+
@tasks('classification', 'regression')
@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')
defJarqueBera(dataset): ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 49459f578..e2fb0aa20 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('time_series_data', 'stationarity', 'unit_root_test', 'statsmodels')
@@tasks('data_validation')
-defKPSS(dataset:VMDataset): +
@tags('time_series_data', 'stationarity', 'unit_root_test', 'statsmodels')
@tasks('data_validation')
+defKPSS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index ee6651f17..033fc276a 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tasks('regression')
@@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels')
+
@tasks('regression')
@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels')
defLJungBox(dataset): ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index 44e7cf684..d0358c16b 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('time_series_data', 'visualization')
@@tasks('regression')
-defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): +
@tags('time_series_data', 'visualization')
@tasks('regression')
+defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 9adf76be7..eccd5b413 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'data_quality')
@@tasks('classification', 'regression')
-defMissingValues(dataset:VMDataset,min_threshold:int=1): +
@tags('tabular_data', 'data_quality')
@tasks('classification', 'regression')
+defMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 186c88f2d..62e969c9f 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'data_quality', 'visualization')
@@tasks('classification', 'regression')
-defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): +
@tags('tabular_data', 'data_quality', 'visualization')
@tasks('classification', 'regression')
+defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index c2f05379e..7a1b81e35 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('feature_selection', 'data_analysis')
@@tasks('classification', 'regression')
-defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): +
@tags('feature_selection', 'data_analysis')
@tasks('classification', 'regression')
+defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): ::: diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index b7bc3750d..d1049d9b0 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'numerical_data', 'correlation')
@@tasks('classification', 'regression')
+
@tags('tabular_data', 'numerical_data', 'correlation')
@tasks('classification', 'regression')
defPearsonCorrelationMatrix(dataset): ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index b9bf4991c..67ecd65c8 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('time_series_data', 'forecasting', 'statistical_test', 'unit_root_test')
@@tasks('regression')
-defPhillipsPerronArch(dataset:VMDataset): +
@tags('time_series_data', 'forecasting', 'statistical_test', 'unit_root_test')
@tasks('regression')
+defPhillipsPerronArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index 9ed6d18f1..ffcda046d 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@@tags('bias_and_fairness')
@@tasks('classification', 'regression')
+
@tags('bias_and_fairness')
@tasks('classification', 'regression')
defProtectedClassesCombination(dataset,model,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index b3df0d9cc..f6dc9c589 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@@tags('bias_and_fairness', 'descriptive_statistics')
@@tasks('classification', 'regression')
+
@tags('bias_and_fairness', 'descriptive_statistics')
@tasks('classification', 'regression')
defProtectedClassesDescription(dataset,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index c74ee68f5..a8f3b6d80 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('bias_and_fairness')
@@tasks('classification', 'regression')
-defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=['fnr', 'fpr', 'tpr']): +
@tags('bias_and_fairness')
@tasks('classification', 'regression')
+defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=['fnr', 'fpr', 'tpr']): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 012c3e16a..c282dfeae 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -100,7 +100,7 @@ Get a logger for the given module name ::: {.signature} -
@@tags('bias_and_fairness')
@@tasks('classification', 'regression')
+
@tags('bias_and_fairness')
@tasks('classification', 'regression')
defProtectedClassesThresholdOptimizer(dataset,pipeline=None,protected_classes=None,X_train=None,y_train=None): ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 2b17deedf..b5c769ad1 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -26,8 +26,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('time_series_data', 'visualization', 'stationarity')
@@tasks('regression')
-defRollingStatsPlot(dataset:VMDataset,window_size:int=12): +
@tags('time_series_data', 'visualization', 'stationarity')
@tasks('regression')
+defRollingStatsPlot(dataset:VMDataset,window_size:int=12): ::: diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 98caadce7..7f95c1a9e 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tasks('classification', 'regression')
@@tags('tabular_data', 'statistical_test', 'statsmodels')
+
@tasks('classification', 'regression')
@tags('tabular_data', 'statistical_test', 'statsmodels')
defRunsTest(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index c0084a1fc..c9f6f9166 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'visualization')
@@tasks('classification', 'regression')
+
@tags('tabular_data', 'visualization')
@tasks('classification', 'regression')
defScatterPlot(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 65fdf2672..5397ebf8d 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('visualization', 'credit_risk', 'scorecard')
@@tasks('classification')
-defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): +
@tags('visualization', 'credit_risk', 'scorecard')
@tasks('classification')
+defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 21ca0846c..39d6428ff 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('time_series_data', 'seasonality', 'statsmodels')
@@tasks('regression')
-defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): +
@tags('time_series_data', 'seasonality', 'statsmodels')
@tasks('regression')
+defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): ::: diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 3084974be..e88027cb4 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tasks('classification', 'regression')
@@tags('tabular_data', 'data_distribution', 'statistical_test')
+
@tasks('classification', 'regression')
@tags('tabular_data', 'data_distribution', 'statistical_test')
defShapiroWilk(dataset): ::: diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index ddb4c2248..0bda129cc 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('data_quality', 'tabular_data')
@@tasks('classification', 'regression')
+
@tags('data_quality', 'tabular_data')
@tasks('classification', 'regression')
defSkewness(dataset,max_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 05b213108..d8f4f706b 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('time_series_data', 'visualization')
@@tasks('regression')
-defSpreadPlot(dataset:VMDataset): +
@tags('time_series_data', 'visualization')
@tasks('regression')
+defSpreadPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 5bdf21701..72cb31b11 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'visualization')
@@tasks('classification', 'regression')
-defTabularCategoricalBarPlots(dataset:VMDataset): +
@tags('tabular_data', 'visualization')
@tasks('classification', 'regression')
+defTabularCategoricalBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index a833ed237..4857d2c66 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('time_series_data', 'visualization')
@@tasks('classification', 'regression')
-defTabularDateTimeHistograms(dataset:VMDataset): +
@tags('time_series_data', 'visualization')
@tasks('classification', 'regression')
+defTabularDateTimeHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 0ee91b168..8df08c4cd 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -86,7 +86,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data')
@@tasks('classification', 'regression')
+
@tags('tabular_data')
@tasks('classification', 'regression')
defTabularDescriptionTables(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 9fe264142..a424bf83f 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'visualization')
@@tasks('classification', 'regression')
-defTabularNumericalHistograms(dataset:VMDataset): +
@tags('tabular_data', 'visualization')
@tasks('classification', 'regression')
+defTabularNumericalHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 9da466857..efdff9c16 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'visualization', 'categorical_data')
@@tasks('classification')
-defTargetRateBarPlots(dataset:VMDataset): +
@tags('tabular_data', 'visualization', 'categorical_data')
@tasks('classification')
+defTargetRateBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 26fb90978..2d1ce1508 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('time_series_data', 'analysis')
@@tasks('regression')
+
@tags('time_series_data', 'analysis')
@tasks('regression')
defTimeSeriesDescription(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 5425bc2c0..609c830a8 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('time_series_data', 'analysis')
@@tasks('regression')
+
@tags('time_series_data', 'analysis')
@tasks('regression')
defTimeSeriesDescriptiveStatistics(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 7837e6f74..6af071a9e 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('time_series_data')
@@tasks('regression')
-defTimeSeriesFrequency(dataset:VMDataset): +
@tags('time_series_data')
@tasks('regression')
+defTimeSeriesFrequency(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 7fdf18cc6..497b7baf3 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@@tags('data_validation', 'visualization', 'time_series_data')
@@tasks('regression', 'time_series_forecasting')
+
@tags('data_validation', 'visualization', 'time_series_data')
@tasks('regression', 'time_series_forecasting')
defTimeSeriesHistogram(dataset,nbins=30): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 4af17e7be..bcdefa806 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('time_series_data', 'visualization')
@@tasks('regression')
-defTimeSeriesLinePlot(dataset:VMDataset): +
@tags('time_series_data', 'visualization')
@tasks('regression')
+defTimeSeriesLinePlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index f717c9ad0..a277538cb 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('time_series_data')
@@tasks('regression')
-defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): +
@tags('time_series_data')
@tasks('regression')
+defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index b22cf4552..fd898ac39 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('time_series_data')
@@tasks('regression')
-defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): +
@tags('time_series_data')
@tasks('regression')
+defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index b6b52ce11..231f52de9 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data')
@@tasks('regression', 'classification')
-defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): +
@tags('tabular_data')
@tasks('regression', 'classification')
+defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 199003ea7..5e4ceebf9 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data')
@@tasks('regression', 'classification')
-defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): +
@tags('tabular_data')
@tasks('regression', 'classification')
+defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index fbcd4a4a3..3d9765d0c 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('tabular_data', 'visualization', 'categorical_data')
@@tasks('classification')
-defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): +
@tags('tabular_data', 'visualization', 'categorical_data')
@tasks('classification')
+defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index fcb239ec3..bd380591c 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'categorical_data')
@@tasks('classification')
-defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): +
@tags('tabular_data', 'categorical_data')
@tasks('classification')
+defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 5bcda0c3e..d2c02eb62 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('time_series_data', 'stationarity', 'unit_root_test')
@@tasks('regression')
-defZivotAndrewsArch(dataset:VMDataset): +
@tags('time_series_data', 'stationarity', 'unit_root_test')
@tasks('regression')
+defZivotAndrewsArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index 9523723e6..adce4d980 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')
@@tasks('text_classification', 'text_summarization')
-defCommonWords(dataset:VMDataset): +
@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')
@tasks('text_classification', 'text_summarization')
+defCommonWords(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index d3140286e..e5e03fe7b 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')
@@tasks('text_classification', 'text_summarization')
-defHashtags(dataset:VMDataset,top_hashtags:int=25): +
@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')
@tasks('text_classification', 'text_summarization')
+defHashtags(dataset:VMDataset,top_hashtags:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index ae3be5865..7c768fd60 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
+
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
defLanguageDetection(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 74a385d74..f4b18746a 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')
@@tasks('text_classification', 'text_summarization')
-defMentions(dataset:VMDataset,top_mentions:int=25): +
@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')
@tasks('text_classification', 'text_summarization')
+defMentions(dataset:VMDataset,top_mentions:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index dc5aa3942..737135a87 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('nlp', 'text_data', 'data_validation')
@@tasks('nlp')
+
@tags('nlp', 'text_data', 'data_validation')
@tasks('nlp')
defPolarityAndSubjectivity(dataset,threshold_subjectivity=0.5,threshold_polarity=0): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index 9ab73cc84..7d2344dc5 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -18,7 +18,7 @@ Metrics functions for any Pandas-compatible datasets ::: {.signature} -
@@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')
@@tasks('text_classification', 'text_summarization', 'nlp')
+
@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')
@tasks('text_classification', 'text_summarization', 'nlp')
defPunctuations(dataset,count_mode='token'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index c75b2d2ae..a28fc788f 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('nlp', 'text_data', 'data_validation')
@@tasks('nlp')
+
@tags('nlp', 'text_data', 'data_validation')
@tasks('nlp')
defSentiment(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index ad7313160..61034a6ad 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,8 +18,8 @@ Threshold based tests ::: {.signature} -
@@tags('nlp', 'text_data', 'frequency_analysis', 'visualization')
@@tasks('text_classification', 'text_summarization')
-defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): +
@tags('nlp', 'text_data', 'frequency_analysis', 'visualization')
@tasks('text_classification', 'text_summarization')
+defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 78b2f2c69..e56708e00 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -26,8 +26,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
-defTextDescription(dataset:VMDataset,unwanted_tokens:set={'s', "s'", 'mr', 'ms', 'mrs', 'dr', "'s", ' ', "''", 'dollar', 'us', '``'},lang:str='english'): +
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
+defTextDescription(dataset:VMDataset,unwanted_tokens:set={'s', "s'", 'mr', 'ms', 'mrs', 'dr', "'s", ' ', "''", 'dollar', 'us', '``'},lang:str='english'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index a57b99195..c60f3e256 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('nlp', 'text_data', 'data_validation')
@@tasks('nlp')
+
@tags('nlp', 'text_data', 'data_validation')
@tasks('nlp')
defToxicity(dataset): ::: diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 6d969a52f..bebca1611 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
+
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
defBertScore(dataset,model,evaluation_model='distilbert-base-uncased'): ::: diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 9df9ac26a..bd30f2286 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
+
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
defBleuScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 91b5ebdb5..c7da073d2 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'model_performance')
@@tasks('clustering')
-defClusterSizeDistribution(dataset:VMDataset,model:VMModel): +
@tags('sklearn', 'model_performance')
@tasks('clustering')
+defClusterSizeDistribution(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 67506854c..29687ed23 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
+
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
defContextualRecall(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 31e052ab6..363146893 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('feature_importance', 'AUC', 'visualization')
@@tasks('classification')
-defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): +
@tags('feature_importance', 'AUC', 'visualization')
@tasks('classification')
+defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index ec901abfe..47c6be80a 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
+
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
defMeteorScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index b69c8ad6d..6d40bd30d 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -28,7 +28,7 @@ Attempts to extract all model info from a model object instance ::: {.signature} -
@@tags('model_training', 'metadata')
@@tasks('regression', 'time_series_forecasting')
+
@tags('model_training', 'metadata')
@tasks('regression', 'time_series_forecasting')
defModelMetadata(model): ::: diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index cfa80baaf..3953e7f0d 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('regression')
@@tasks('residual_analysis', 'visualization')
+
@tags('regression')
@tasks('residual_analysis', 'visualization')
defModelPredictionResiduals(dataset,model,nbins=100,p_value_threshold=0.05,start_date=None,end_date=None): ::: diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 8f90ca855..33ac6a049 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
+
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
defRegardScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 7ca68d429..912d1947a 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('model_performance', 'visualization')
@@tasks('regression')
-defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): +
@tags('model_performance', 'visualization')
@tasks('regression')
+defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 163ac00c6..1a90fac45 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
+
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
defRougeScore(dataset,model,metric='rouge-1'): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index 36e69d53c..216d6559a 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('model_predictions', 'visualization')
@@tasks('regression', 'time_series_forecasting')
+
@tags('model_predictions', 'visualization')
@tasks('regression', 'time_series_forecasting')
defTimeSeriesPredictionWithCI(dataset,model,confidence=0.95): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index 3d79488da..99d821eb9 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('model_predictions', 'visualization')
@@tasks('regression', 'time_series_forecasting')
+
@tags('model_predictions', 'visualization')
@tasks('regression', 'time_series_forecasting')
defTimeSeriesPredictionsPlot(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 0101e2766..497023c9d 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('model_performance', 'sklearn')
@@tasks('regression', 'time_series_forecasting')
+
@tags('model_performance', 'sklearn')
@tasks('regression', 'time_series_forecasting')
defTimeSeriesR2SquareBySegments(dataset,model,segments=None): ::: diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index ead48a48f..02e95f893 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
+
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
defTokenDisparity(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index 3bcf7fdf7..c748d042a 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('nlp', 'text_data', 'visualization')
@@tasks('text_classification', 'text_summarization')
+
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
defToxicityScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 130a7dd02..c77ca6b9b 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'model_performance', 'clustering')
@@tasks('clustering')
-defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): +
@tags('sklearn', 'model_performance', 'clustering')
@tasks('clustering')
+defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 301837cdd..d921c1907 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'model_performance', 'clustering')
@@tasks('clustering')
-defAdjustedRandIndex(model:VMModel,dataset:VMDataset): +
@tags('sklearn', 'model_performance', 'clustering')
@tasks('clustering')
+defAdjustedRandIndex(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 8b4695d29..a1b30f105 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'model_performance', 'classification')
@@tasks('classification')
-defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): +
@tags('sklearn', 'model_performance', 'classification')
@tasks('classification')
+defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index 6021b704d..d17ce169d 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@@tasks('classification', 'text_classification')
-defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): +
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@tasks('classification', 'text_classification')
+defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 36856d109..d72651158 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('model_validation', 'threshold_optimization', 'classification_metrics')
@@tasks('classification')
-defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): +
@tags('model_validation', 'threshold_optimization', 'classification_metrics')
@tasks('classification')
+defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index dc523d437..426fb41bc 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'model_performance', 'clustering')
@@tasks('clustering')
-defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): +
@tags('sklearn', 'model_performance', 'clustering')
@tasks('clustering')
+defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index bf74e704e..8ba1c2d0a 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'model_performance', 'clustering')
@@tasks('clustering')
-defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): +
@tags('sklearn', 'model_performance', 'clustering')
@tasks('clustering')
+defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index df81ae788..04391ff1e 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'model_performance', 'clustering')
@@tasks('clustering')
-defCompletenessScore(model:VMModel,dataset:VMDataset): +
@tags('sklearn', 'model_performance', 'clustering')
@tasks('clustering')
+defCompletenessScore(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 5fb020d50..da0b25259 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')
@@tasks('classification', 'text_classification')
-defConfusionMatrix(dataset:VMDataset,model:VMModel): +
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')
@tasks('classification', 'text_classification')
+defConfusionMatrix(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 605e87b55..afe717796 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('model_explainability', 'sklearn')
@@tasks('regression', 'time_series_forecasting')
-defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): +
@tags('model_explainability', 'sklearn')
@tasks('regression', 'time_series_forecasting')
+defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 6d4c5f401..f9e36bacb 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'model_performance')
@@tasks('clustering')
-defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): +
@tags('sklearn', 'model_performance')
@tasks('clustering')
+defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index fe01aed9c..1313ff1cd 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'model_performance')
@@tasks('clustering')
-defHomogeneityScore(dataset:VMDataset,model:VMModel): +
@tags('sklearn', 'model_performance')
@tasks('clustering')
+defHomogeneityScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index abf32c773..2fc73652e 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'model_performance')
@@tasks('classification', 'clustering')
+
@tags('sklearn', 'model_performance')
@tasks('classification', 'clustering')
defcustom_recall(y_true,y_pred_proba,threshold=0.5): ::: @@ -27,8 +27,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'model_performance')
@@tasks('clustering', 'classification')
-defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union[str, List, Dict]=None,thresholds:Union[float, List[float]]=None,fit_params:dict=None): +
@tags('sklearn', 'model_performance')
@tasks('clustering', 'classification')
+defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union[str, List, Dict]=None,thresholds:Union[float, List[float]]=None,fit_params:dict=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 0fb3ed95e..dd95391a4 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'model_performance', 'kmeans')
@@tasks('clustering')
-defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union[List[int], None]=None): +
@tags('sklearn', 'model_performance', 'kmeans')
@tasks('clustering')
+defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union[List[int], None]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 988d3a8f2..d8b9ffe0a 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@@tasks('classification', 'text_classification')
-defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): +
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@tasks('classification', 'text_classification')
+defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 5ab755d64..44fa3591f 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@@tasks('classification', 'text_classification')
-defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): +
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@tasks('classification', 'text_classification')
+defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 52d096166..ab0253557 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@@tasks('classification', 'text_classification')
-defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): +
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@tasks('classification', 'text_classification')
+defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index cf22d46d5..2e9fe14cd 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('model_training', 'metadata')
@@tasks('classification', 'regression')
+
@tags('model_training', 'metadata')
@tasks('classification', 'regression')
defModelParameters(model,model_params=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index dd65e9bb8..ed93b4b2a 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -24,8 +24,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'model_comparison')
@@tasks('classification', 'text_classification')
-defModelsPerformanceComparison(dataset:VMDataset,models:list[VMModel]): +
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'model_comparison')
@tasks('classification', 'text_classification')
+defModelsPerformanceComparison(dataset:VMDataset,models:list[VMModel]): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 73f294d70..f8f9e3b3c 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'linear_regression', 'model_diagnosis')
@@tasks('classification', 'regression')
-defOverfitDiagnosis(model:VMModel,datasets:List[VMDataset],metric:str=None,cut_off_threshold:float=DEFAULT_THRESHOLD): +
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'linear_regression', 'model_diagnosis')
@tasks('classification', 'regression')
+defOverfitDiagnosis(model:VMModel,datasets:List[VMDataset],metric:str=None,cut_off_threshold:float=DEFAULT_THRESHOLD): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 5690ee4fb..666b96e6f 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')
@@tasks('classification', 'text_classification')
-defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union[int, None]=None,figure_height:Union[int, None]=None): +
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')
@tasks('classification', 'text_classification')
+defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union[int, None]=None,figure_height:Union[int, None]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 8ddbbffb9..581ad7ddc 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -46,8 +46,8 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@@tasks('classification', 'text_classification')
-defPopulationStabilityIndex(datasets:List[VMDataset],model:VMModel,num_bins:int=10,mode:str='fixed'): +
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@tasks('classification', 'text_classification')
+defPopulationStabilityIndex(datasets:List[VMDataset],model:VMModel,num_bins:int=10,mode:str='fixed'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 1c6b18387..e857fb011 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'binary_classification', 'model_performance', 'visualization')
@@tasks('classification', 'text_classification')
-defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): +
@tags('sklearn', 'binary_classification', 'model_performance', 'visualization')
@tasks('classification', 'text_classification')
+defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index f78519f90..e487c1550 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')
@@tasks('classification', 'text_classification')
-defROCCurve(model:VMModel,dataset:VMDataset): +
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')
@tasks('classification', 'text_classification')
+defROCCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index 9d18d49f9..d7d9938f4 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'model_performance')
@@tasks('regression', 'classification')
+
@tags('sklearn', 'model_performance')
@tasks('regression', 'classification')
defRegressionErrors(model,dataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 74e2d979b..06beb4451 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -
@@tags('model_performance', 'sklearn')
@@tasks('regression', 'time_series_forecasting')
+
@tags('model_performance', 'sklearn')
@tasks('regression', 'time_series_forecasting')
defRegressionErrorsComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 5fd834141..cbdf6bff4 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('sklearn', 'model_performance')
@@tasks('regression')
-defRegressionPerformance(model:VMModel,dataset:VMDataset): +
@tags('sklearn', 'model_performance')
@tasks('regression')
+defRegressionPerformance(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index e05203c83..d6a765e57 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:np.ndarray,predicted:np.ndarray,rowcount:int,featurecount:int): +defadj_r2_score(actual:np.ndarray,predicted:np.ndarray,rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -
@@tags('sklearn', 'model_performance')
@@tasks('regression')
+
@tags('sklearn', 'model_performance')
@tasks('regression')
defRegressionR2Square(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 0d9b49f00..8af7bb4c7 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:np.ndarray,predicted:np.ndarray,rowcount:int,featurecount:int): +defadj_r2_score(actual:np.ndarray,predicted:np.ndarray,rowcount:int,featurecount:int): ::: @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -
@@tags('model_performance', 'sklearn')
@@tasks('regression', 'time_series_forecasting')
+
@tags('model_performance', 'sklearn')
@tasks('regression', 'time_series_forecasting')
defRegressionR2SquareComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 9f6a30d3f..d82d581df 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('sklearn', 'model_diagnosis', 'visualization')
@@tasks('classification', 'regression')
-defRobustnessDiagnosis(datasets:List[VMDataset],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List[float]=DEFAULT_STD_DEV_LIST,performance_decay_threshold:float=DEFAULT_DECAY_THRESHOLD): +
@tags('sklearn', 'model_diagnosis', 'visualization')
@tasks('classification', 'regression')
+defRobustnessDiagnosis(datasets:List[VMDataset],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List[float]=DEFAULT_STD_DEV_LIST,performance_decay_threshold:float=DEFAULT_DECAY_THRESHOLD): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 6e0e0f669..993174e45 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -85,8 +85,8 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')
@@tasks('classification', 'text_classification')
-defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): +
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')
@tasks('classification', 'text_classification')
+defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 2f1d56fbc..dfc961545 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('visualization', 'credit_risk', 'calibration')
@@tasks('classification')
-defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): +
@tags('visualization', 'credit_risk', 'calibration')
@tasks('classification')
+defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index bc56cd935..c86f5e4c7 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'model_performance')
@@tasks('clustering')
-defSilhouettePlot(model:VMModel,dataset:VMDataset): +
@tags('sklearn', 'model_performance')
@tasks('clustering')
+defSilhouettePlot(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 93d6054a1..05ea9a15d 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')
@@tasks('classification', 'text_classification')
-defTrainingTestDegradation(datasets:List[VMDataset],model:VMModel,max_threshold:float=0.1): +
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')
@tasks('classification', 'text_classification')
+defTrainingTestDegradation(datasets:List[VMDataset],model:VMModel,max_threshold:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index b4cd0c0fd..6e9f4b634 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'model_performance')
@@tasks('clustering')
-defVMeasure(dataset:VMDataset,model:VMModel): +
@tags('sklearn', 'model_performance')
@tasks('clustering')
+defVMeasure(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 10bc43a73..a573cdb05 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_diagnosis', 'visualization')
@@tasks('classification', 'text_classification')
-defWeakspotsDiagnosis(datasets:List[VMDataset],model:VMModel,features_columns:Union[List[str], None]=None,metrics:Union[Dict[str, Callable], None]=None,thresholds:Union[Dict[str, float], None]=None): +
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_diagnosis', 'visualization')
@tasks('classification', 'text_classification')
+defWeakspotsDiagnosis(datasets:List[VMDataset],model:VMModel,features_columns:Union[List[str], None]=None,metrics:Union[Dict[str, Callable], None]=None,thresholds:Union[Dict[str, float], None]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index d0329fe05..8629f78c1 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('time_series_data', 'forecasting', 'model_selection', 'statsmodels')
@@tasks('regression')
-defAutoARIMA(model:VMModel,dataset:VMDataset): +
@tags('time_series_data', 'forecasting', 'model_selection', 'statsmodels')
@tasks('regression')
+defAutoARIMA(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index e9608935a..b5c230895 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('visualization', 'credit_risk')
@@tasks('classification')
+
@tags('visualization', 'credit_risk')
@tasks('classification')
defCumulativePredictionProbabilities(dataset,model,title='Cumulative Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index 392b07d23..d8bd3fc1d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tasks('regression')
@@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels')
-defDurbinWatsonTest(dataset,model,threshold=[1.5, 2.5]): +
@tasks('regression')
@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels')
+defDurbinWatsonTest(dataset,model,threshold=[1.5, 2.5]): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index 3a647b10d..7288c5241 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('model_performance')
@@tasks('classification')
+
@tags('model_performance')
@tasks('classification')
defGINITable(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 53bc9f50a..43144a0cf 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')
@@tasks('classification', 'regression')
-defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): +
@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')
@tasks('classification', 'regression')
+defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 49837bfe5..83693fa1c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,8 +14,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')
@@tasks('classification', 'regression')
-defLilliefors(dataset:VMDataset): +
@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')
@tasks('classification', 'regression')
+defLilliefors(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index de5b3bc6e..d46471908 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('visualization', 'credit_risk')
@@tasks('classification')
+
@tags('visualization', 'credit_risk')
@tasks('classification')
defPredictionProbabilitiesHistogram(dataset,model,title='Histogram of Predictive Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 75984c578..83bc45f53 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('tabular_data', 'visualization', 'model_training')
@@tasks('regression')
+
@tags('tabular_data', 'visualization', 'model_training')
@tasks('regression')
defRegressionCoeffs(model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 7f224ef95..201e562a2 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('statistical_test', 'model_interpretation', 'visualization', 'feature_importance')
@@tasks('regression')
-defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): +
@tags('statistical_test', 'model_interpretation', 'visualization', 'feature_importance')
@tasks('regression')
+defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 6b5ec486e..e653718af 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('time_series_data', 'forecasting', 'visualization')
@@tasks('regression')
-defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union[str, None]=None,end_date:Union[str, None]=None): +
@tags('time_series_data', 'forecasting', 'visualization')
@tasks('regression')
+defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union[str, None]=None,end_date:Union[str, None]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 44be500fb..307491150 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -26,8 +26,8 @@ toc-expand: 4 ::: {.signature} -
@@tags('time_series_data', 'forecasting', 'visualization')
@@tasks('regression')
-defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): +
@tags('time_series_data', 'forecasting', 'visualization')
@tasks('regression')
+defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 1b822862d..f13763845 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -40,8 +40,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('senstivity_analysis', 'visualization')
@@tasks('regression')
-defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List[float]=[0.1],transformation:Union[str, None]=None): +
@tags('senstivity_analysis', 'visualization')
@tasks('regression')
+defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List[float]=[0.1],transformation:Union[str, None]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index e5fb54b5f..166dd6e2a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:np.ndarray,predicted:np.ndarray,rowcount:int,featurecount:int): +defadj_r2_score(actual:np.ndarray,predicted:np.ndarray,rowcount:int,featurecount:int): ::: @@ -28,8 +28,8 @@ Adjusted R2 Score ::: {.signature} -
@@tags('model_performance', 'regression')
@@tasks('regression')
-defRegressionModelSummary(dataset:VMDataset,model:VMModel): +
@tags('model_performance', 'regression')
@tasks('regression')
+defRegressionModelSummary(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 36edca25c..ac4d1e15e 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -28,8 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@@tags('statsmodels', 'feature_importance', 'visualization')
@@tasks('regression')
-defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): +
@tags('statsmodels', 'feature_importance', 'visualization')
@tasks('regression')
+defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index 8e57188c2..de25abd21 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -
@@tags('visualization', 'credit_risk', 'logistic_regression')
@@tasks('classification')
+
@tags('visualization', 'credit_risk', 'logistic_regression')
@tasks('classification')
defScorecardHistogram(dataset,title='Histogram of Scores',score_column='score'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 4af06b540..4d692eba3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defadj_r2_score(actual:np.ndarray,predicted:np.ndarray,rowcount:int,featurecount:int): +defadj_r2_score(actual:np.ndarray,predicted:np.ndarray,rowcount:int,featurecount:int): ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 62137758e..202d69237 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@@tags('llm', 'few_shot')
@@tasks('text_classification', 'text_summarization')
+
@tags('llm', 'few_shot')
@tasks('text_classification', 'text_summarization')
defBias(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 5abe7edaa..5d2201bac 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@@tags('llm', 'zero_shot', 'few_shot')
@@tasks('text_classification', 'text_summarization')
+
@tags('llm', 'zero_shot', 'few_shot')
@tasks('text_classification', 'text_summarization')
defClarity(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 349946fde..4c796dce2 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@@tags('llm', 'zero_shot', 'few_shot')
@@tasks('text_classification', 'text_summarization')
+
@tags('llm', 'zero_shot', 'few_shot')
@tasks('text_classification', 'text_summarization')
defConciseness(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 0acb0aa4d..be4368ef3 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@@tags('llm', 'zero_shot', 'few_shot')
@@tasks('text_classification', 'text_summarization')
+
@tags('llm', 'zero_shot', 'few_shot')
@tasks('text_classification', 'text_summarization')
defDelimitation(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index a5457f3c7..b06af04df 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@@tags('llm', 'zero_shot', 'few_shot')
@@tasks('text_classification', 'text_summarization')
+
@tags('llm', 'zero_shot', 'few_shot')
@tasks('text_classification', 'text_summarization')
defNegativeInstruction(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index fde739e21..12f0facb0 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -28,7 +28,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -
@@tags('llm', 'zero_shot', 'few_shot')
@@tasks('text_classification', 'text_summarization')
+
@tags('llm', 'zero_shot', 'few_shot')
@tasks('text_classification', 'text_summarization')
defRobustness(model,dataset,num_tests=10): ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 9ba2dc6c5..3c6ed08ac 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -26,7 +26,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -48,7 +48,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -
@@tags('llm', 'zero_shot', 'few_shot')
@@tasks('text_classification', 'text_summarization')
+
@tags('llm', 'zero_shot', 'few_shot')
@tasks('text_classification', 'text_summarization')
defSpecificity(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index 5b00384f1..df0037d63 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): +defcall_model(system_prompt:str,user_prompt:str,temperature:float=0.0,seed:int=42): ::: @@ -30,7 +30,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -defget_explanation(response:str): +defget_explanation(response:str): ::: @@ -54,7 +54,7 @@ Explanation: " -> "" ::: {.signature} -defget_score(response:str): +defget_score(response:str): ::: diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 72c0cdd2d..3ef8c7058 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defdescribe_metric(metric_id:str,\*\*kwargs): +defdescribe_metric(metric_id:str,\*\*kwargs): ::: @@ -46,7 +46,7 @@ List all metrics ::: {.signature} -defrun_metric(metric_id:str,\*\*kwargs): +defrun_metric(metric_id:str,\*\*kwargs): ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 0d5b88893..ca0170246 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -18,7 +18,7 @@ Models entrypoint ::: {.signature} -
@dataclass
+
dataclass
classFigure: ::: @@ -33,7 +33,7 @@ Figure objects track the schema supported by the ValidMind API ::: {.signature} -Figure(key:str,figure:Union\[matplotlib.figure.Figure, go.Figure, go.FigureWidget, bytes\],ref_id:str,\_type:str='plot')None +Figure(key:str,figure:Union\[matplotlib.figure.Figure, go.Figure, go.FigureWidget, bytes\],ref_id:str,\_type:str='plot')None ::: @@ -89,7 +89,7 @@ we would render images as-is, but Plotly FigureWidgets don't work well on Google ::: {.signature} -
@dataclass
+
dataclass
classModelAttributes: ::: @@ -104,7 +104,7 @@ Model attributes definition ::: {.signature} -ModelAttributes(architecture:str=None,framework:str=None,framework_version:str=None,language:str=None,task:ModelTask=None)None +ModelAttributes(architecture:str=None,framework:str=None,framework_version:str=None,language:str=None,task:ModelTask=None)None ::: @@ -114,7 +114,7 @@ Model attributes definition ::: {.signature} -
@classmethod
+
classmethod
deffrom_dict(cls,data): ::: @@ -131,7 +131,7 @@ Creates a ModelAttributes instance from a dictionary ::: {.signature} -
@dataclass
+
dataclass
classTestSuite: ::: @@ -150,7 +150,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -TestSuite(sections:List\[TestSuiteSection\]=None)None +TestSuite(sections:List\[TestSuiteSection\]=None)None ::: @@ -160,7 +160,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -defget_default_config()dict: +defget_default_config()dict: ::: @@ -180,7 +180,7 @@ Each test in a test suite can accept parameters and those parameters can have de ::: {.signature} -defget_tests()List\[str\]: +defget_tests()List\[str\]: ::: @@ -194,7 +194,7 @@ Get all test suite test objects from all sections ::: {.signature} -defnum_tests()int: +defnum_tests()int: ::: @@ -224,7 +224,7 @@ Runs a test suite ::: {.signature} -TestSuiteRunner(suite:TestSuite,config:dict=None,inputs:dict=None) +TestSuiteRunner(suite:TestSuite,config:dict=None,inputs:dict=None) ::: @@ -250,7 +250,7 @@ This method will be called after the test suite has been run and all results hav ::: {.signature} -defrun(send:bool=True,fail_fast:bool=False): +defrun(send:bool=True,fail_fast:bool=False): ::: @@ -269,7 +269,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -defsummarize(show_link:bool=True): +defsummarize(show_link:bool=True): ::: @@ -316,7 +316,7 @@ This way we can support multiple dataset types but under the hood we only need t ::: {.signature} -VMDataset(raw_dataset:np.ndarray,input_id:str=None,model:VMModel=None,index:np.ndarray=None,index_name:str=None,date_time_index:bool=False,columns:list=None,target_column:str=None,feature_columns:list=None,text_column:str=None,extra_columns:dict=None,target_class_labels:dict=None) +VMDataset(raw_dataset:np.ndarray,input_id:str=None,model:VMModel=None,index:np.ndarray=None,index_name:str=None,date_time_index:bool=False,columns:list=None,target_column:str=None,feature_columns:list=None,text_column:str=None,extra_columns:dict=None,target_class_labels:dict=None) ::: @@ -363,7 +363,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -defassign_predictions(model:VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): +defassign_predictions(model:VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): ::: @@ -387,7 +387,7 @@ Assign predictions and probabilities to the dataset. ::: {.signature} -defprediction_column(model:VMModel,column_name:str=None)str: +defprediction_column(model:VMModel,column_name:str=None)str: ::: @@ -401,7 +401,7 @@ Get or set the prediction column for a model. ::: {.signature} -defprobability_column(model:VMModel,column_name:str=None)str: +defprobability_column(model:VMModel,column_name:str=None)str: ::: @@ -429,7 +429,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMDataset: +defwith_options(\*\*kwargs)validmind.vm_models.VMDataset: ::: @@ -466,7 +466,7 @@ Returns a dataframe containing only the feature columns ::: {.signature} -defy_df()pd.DataFrame: +defy_df()validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -480,7 +480,7 @@ Returns a dataframe containing the target column ::: {.signature} -defy_pred(model)np.ndarray: +defy_pred(model)validmind.vm_models.np.validmind.vm_models.ndarray: ::: @@ -504,7 +504,7 @@ Attempts to stack complex prediction types (e.g., embeddings) into a single, mul ::: {.signature} -defy_pred_df(model)pd.DataFrame: +defy_pred_df(model)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -518,7 +518,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -defy_prob(model)np.ndarray: +defy_prob(model)validmind.vm_models.np.validmind.vm_models.ndarray: ::: @@ -540,7 +540,7 @@ Returns the probabilities for a given model. ::: {.signature} -defy_prob_df(model)pd.DataFrame: +defy_prob_df(model)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -572,7 +572,7 @@ Base class for ValidMind Input types ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMInput: +defwith_options(\*\*kwargs)validmind.vm_models.VMInput: ::: @@ -621,7 +621,7 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -VMModel(input_id:str=None,model:object=None,attributes:ModelAttributes=None,name:str=None,\*\*kwargs) +VMModel(input_id:str=None,model:object=None,attributes:ModelAttributes=None,name:str=None,\*\*kwargs) ::: @@ -631,7 +631,7 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -
@abstractmethod
+
abstractmethod
defpredict(*args,**kwargs): ::: From 6e1544b8ad596bd6bf1b2010d3ab1e0061f91294 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 21 Feb 2025 08:40:08 -0800 Subject: [PATCH 096/207] Better decorator formatting when >1 decorator --- docs/styles.css | 1 + docs/templates/macros/decorators.jinja2 | 9 ++++++--- .../tests/data_validation/ACFandPACFPlot.qmd | 3 ++- docs/validmind/tests/data_validation/ADF.qmd | 3 ++- docs/validmind/tests/data_validation/AutoAR.qmd | 3 ++- docs/validmind/tests/data_validation/AutoMA.qmd | 3 ++- .../tests/data_validation/AutoStationarity.qmd | 3 ++- .../data_validation/BivariateScatterPlots.qmd | 3 ++- .../tests/data_validation/BoxPierce.qmd | 3 ++- .../data_validation/ChiSquaredFeaturesTable.qmd | 3 ++- .../tests/data_validation/ClassImbalance.qmd | 5 +++-- .../data_validation/DatasetDescription.qmd | 3 ++- .../tests/data_validation/DatasetSplit.qmd | 5 +++-- .../data_validation/DescriptiveStatistics.qmd | 3 ++- .../tests/data_validation/DickeyFullerGLS.qmd | 3 ++- .../tests/data_validation/Duplicates.qmd | 3 ++- .../tests/data_validation/EngleGrangerCoint.qmd | 3 ++- .../FeatureTargetCorrelationPlot.qmd | 3 ++- .../tests/data_validation/HighCardinality.qmd | 3 ++- .../data_validation/HighPearsonCorrelation.qmd | 3 ++- .../data_validation/IQROutliersBarPlot.qmd | 3 ++- .../tests/data_validation/IQROutliersTable.qmd | 3 ++- .../data_validation/IsolationForestOutliers.qmd | 3 ++- .../tests/data_validation/JarqueBera.qmd | 3 ++- docs/validmind/tests/data_validation/KPSS.qmd | 3 ++- .../tests/data_validation/LJungBox.qmd | 3 ++- .../LaggedCorrelationHeatmap.qmd | 3 ++- .../tests/data_validation/MissingValues.qmd | 3 ++- .../data_validation/MissingValuesBarPlot.qmd | 3 ++- .../tests/data_validation/MutualInformation.qmd | 3 ++- .../PearsonCorrelationMatrix.qmd | 3 ++- .../data_validation/PhillipsPerronArch.qmd | 3 ++- .../ProtectedClassesCombination.qmd | 3 ++- .../ProtectedClassesDescription.qmd | 3 ++- .../ProtectedClassesDisparity.qmd | 5 +++-- .../ProtectedClassesThresholdOptimizer.qmd | 3 ++- .../tests/data_validation/RollingStatsPlot.qmd | 3 ++- .../tests/data_validation/RunsTest.qmd | 3 ++- .../tests/data_validation/ScatterPlot.qmd | 3 ++- .../data_validation/ScoreBandDefaultRates.qmd | 3 ++- .../tests/data_validation/SeasonalDecompose.qmd | 3 ++- .../tests/data_validation/ShapiroWilk.qmd | 3 ++- .../tests/data_validation/Skewness.qmd | 3 ++- .../tests/data_validation/SpreadPlot.qmd | 3 ++- .../TabularCategoricalBarPlots.qmd | 3 ++- .../TabularDateTimeHistograms.qmd | 3 ++- .../TabularDescriptionTables.qmd | 3 ++- .../TabularNumericalHistograms.qmd | 3 ++- .../data_validation/TargetRateBarPlots.qmd | 3 ++- .../data_validation/TimeSeriesDescription.qmd | 3 ++- .../TimeSeriesDescriptiveStatistics.qmd | 3 ++- .../data_validation/TimeSeriesFrequency.qmd | 3 ++- .../data_validation/TimeSeriesHistogram.qmd | 3 ++- .../data_validation/TimeSeriesLinePlot.qmd | 3 ++- .../data_validation/TimeSeriesMissingValues.qmd | 3 ++- .../data_validation/TimeSeriesOutliers.qmd | 3 ++- .../tests/data_validation/TooManyZeroValues.qmd | 3 ++- .../tests/data_validation/UniqueRows.qmd | 3 ++- .../tests/data_validation/WOEBinPlots.qmd | 3 ++- .../tests/data_validation/WOEBinTable.qmd | 3 ++- .../tests/data_validation/ZivotAndrewsArch.qmd | 3 ++- .../tests/data_validation/nlp/CommonWords.qmd | 3 ++- .../tests/data_validation/nlp/Hashtags.qmd | 3 ++- .../data_validation/nlp/LanguageDetection.qmd | 3 ++- .../tests/data_validation/nlp/Mentions.qmd | 3 ++- .../nlp/PolarityAndSubjectivity.qmd | 3 ++- .../tests/data_validation/nlp/Punctuations.qmd | 3 ++- .../tests/data_validation/nlp/Sentiment.qmd | 3 ++- .../tests/data_validation/nlp/StopWords.qmd | 3 ++- .../data_validation/nlp/TextDescription.qmd | 5 +++-- .../tests/data_validation/nlp/Toxicity.qmd | 3 ++- .../tests/model_validation/BertScore.qmd | 3 ++- .../tests/model_validation/BleuScore.qmd | 3 ++- .../ClusterSizeDistribution.qmd | 3 ++- .../tests/model_validation/ContextualRecall.qmd | 3 ++- .../tests/model_validation/FeaturesAUC.qmd | 3 ++- .../tests/model_validation/MeteorScore.qmd | 3 ++- .../tests/model_validation/ModelMetadata.qmd | 3 ++- .../ModelPredictionResiduals.qmd | 3 ++- .../tests/model_validation/RegardScore.qmd | 3 ++- .../RegressionResidualsPlot.qmd | 3 ++- .../tests/model_validation/RougeScore.qmd | 3 ++- .../TimeSeriesPredictionWithCI.qmd | 3 ++- .../TimeSeriesPredictionsPlot.qmd | 3 ++- .../TimeSeriesR2SquareBySegments.qmd | 3 ++- .../tests/model_validation/TokenDisparity.qmd | 3 ++- .../tests/model_validation/ToxicityScore.qmd | 3 ++- .../sklearn/AdjustedMutualInformation.qmd | 3 ++- .../sklearn/AdjustedRandIndex.qmd | 3 ++- .../sklearn/CalibrationCurve.qmd | 3 ++- .../sklearn/ClassifierPerformance.qmd | 3 ++- .../sklearn/ClassifierThresholdOptimization.qmd | 3 ++- .../sklearn/ClusterCosineSimilarity.qmd | 3 ++- .../sklearn/ClusterPerformanceMetrics.qmd | 3 ++- .../sklearn/CompletenessScore.qmd | 3 ++- .../sklearn/ConfusionMatrix.qmd | 3 ++- .../sklearn/FeatureImportance.qmd | 3 ++- .../sklearn/FowlkesMallowsScore.qmd | 3 ++- .../sklearn/HomogeneityScore.qmd | 3 ++- .../sklearn/HyperParametersTuning.qmd | 8 +++++--- .../sklearn/KMeansClustersOptimization.qmd | 5 +++-- .../sklearn/MinimumAccuracy.qmd | 3 ++- .../model_validation/sklearn/MinimumF1Score.qmd | 3 ++- .../sklearn/MinimumROCAUCScore.qmd | 3 ++- .../sklearn/ModelParameters.qmd | 3 ++- .../sklearn/ModelsPerformanceComparison.qmd | 5 +++-- .../sklearn/OverfitDiagnosis.qmd | 5 +++-- .../sklearn/PermutationFeatureImportance.qmd | 5 +++-- .../sklearn/PopulationStabilityIndex.qmd | 5 +++-- .../sklearn/PrecisionRecallCurve.qmd | 3 ++- .../tests/model_validation/sklearn/ROCCurve.qmd | 3 ++- .../sklearn/RegressionErrors.qmd | 3 ++- .../sklearn/RegressionErrorsComparison.qmd | 3 ++- .../sklearn/RegressionPerformance.qmd | 3 ++- .../sklearn/RegressionR2Square.qmd | 3 ++- .../sklearn/RegressionR2SquareComparison.qmd | 3 ++- .../sklearn/RobustnessDiagnosis.qmd | 5 +++-- .../sklearn/SHAPGlobalImportance.qmd | 3 ++- .../sklearn/ScoreProbabilityAlignment.qmd | 3 ++- .../model_validation/sklearn/SilhouettePlot.qmd | 3 ++- .../sklearn/TrainingTestDegradation.qmd | 5 +++-- .../tests/model_validation/sklearn/VMeasure.qmd | 3 ++- .../sklearn/WeakspotsDiagnosis.qmd | 5 +++-- .../model_validation/statsmodels/AutoARIMA.qmd | 3 ++- .../CumulativePredictionProbabilities.qmd | 3 ++- .../statsmodels/DurbinWatsonTest.qmd | 5 +++-- .../model_validation/statsmodels/GINITable.qmd | 3 ++- .../statsmodels/KolmogorovSmirnov.qmd | 3 ++- .../model_validation/statsmodels/Lilliefors.qmd | 3 ++- .../PredictionProbabilitiesHistogram.qmd | 3 ++- .../statsmodels/RegressionCoeffs.qmd | 3 ++- .../RegressionFeatureSignificance.qmd | 3 ++- .../statsmodels/RegressionModelForecastPlot.qmd | 5 +++-- .../RegressionModelForecastPlotLevels.qmd | 3 ++- .../RegressionModelSensitivityPlot.qmd | 5 +++-- .../statsmodels/RegressionModelSummary.qmd | 3 ++- .../RegressionPermutationFeatureImportance.qmd | 3 ++- .../statsmodels/ScorecardHistogram.qmd | 3 ++- docs/validmind/tests/prompt_validation/Bias.qmd | 3 ++- .../tests/prompt_validation/Clarity.qmd | 3 ++- .../tests/prompt_validation/Conciseness.qmd | 3 ++- .../tests/prompt_validation/Delimitation.qmd | 3 ++- .../prompt_validation/NegativeInstruction.qmd | 3 ++- .../tests/prompt_validation/Robustness.qmd | 3 ++- .../tests/prompt_validation/Specificity.qmd | 3 ++- docs/validmind/vm_models.qmd | 17 +++++++++++------ 146 files changed, 322 insertions(+), 169 deletions(-) create mode 100644 docs/styles.css diff --git a/docs/styles.css b/docs/styles.css new file mode 100644 index 000000000..0519ecba6 --- /dev/null +++ b/docs/styles.css @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/templates/macros/decorators.jinja2 b/docs/templates/macros/decorators.jinja2 index b65101957..1ec5b1fa9 100644 --- a/docs/templates/macros/decorators.jinja2 +++ b/docs/templates/macros/decorators.jinja2 @@ -2,8 +2,11 @@ {%- macro render_decorators(member) -%} {%- if member.decorators -%} + {%- for decorator in member.decorators -%} -
{%- if decorator is mapping -%}{{ format_type(decorator.value) }}{%- else -%}{{ decorator }}{%- endif -%}
+{%- if decorator is mapping -%}{{ format_type(decorator.value) }}{%- else -%}{{ decorator }}{%- endif -%} {%- endfor -%} -{%- endif -%} -{%- endmacro -%} \ No newline at end of file +
+ +{%+ endif +%} +{%+ endmacro +%} \ No newline at end of file diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 4bede5c20..0c7e6cf02 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('time_series_data', 'forecasting', 'statistical_test', 'visualization')
@tasks('regression')
+@tags('time_series_data', 'forecasting', 'statistical_test', 'visualization')@tasks('regression') + defACFandPACFPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 40bac4142..ca58b9533 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test', 'stationarity')
@tasks('regression')
+@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test', 'stationarity')@tasks('regression') + defADF(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 6755d9137..bd1b2b44c 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')
@tasks('regression')
+@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')@tasks('regression') + defAutoAR(dataset:VMDataset,max_ar_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index ae3cdae7a..db6b5a8cb 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')
@tasks('regression')
+@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')@tasks('regression') + defAutoMA(dataset:VMDataset,max_ma_order:int=3): ::: diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 281532945..7f6cbe969 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')
@tasks('regression')
+@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')@tasks('regression') + defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 2101fc5f6..a83d2b016 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'numerical_data', 'visualization')
@tasks('classification')
+@tags('tabular_data', 'numerical_data', 'visualization')@tasks('classification') + defBivariateScatterPlots(dataset): ::: diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index 14b89e3df..5824dcaf6 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tasks('regression')
@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels')
+@tasks('regression')@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels') + defBoxPierce(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index d9e0f9a27..2ad394a56 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'categorical_data', 'statistical_test')
@tasks('classification')
+@tags('tabular_data', 'categorical_data', 'statistical_test')@tasks('classification') + defChiSquaredFeaturesTable(dataset,p_threshold=0.05): ::: diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 0c3500394..575f41b91 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,8 +18,9 @@ Threshold based tests ::: {.signature} -
@tags('tabular_data', 'binary_classification', 'multiclass_classification')
@tasks('classification')
-defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple[Dict[str, Any], validmind.vm_models.go.validmind.vm_models.Figure, bool]: +@tags('tabular_data', 'binary_classification', 'multiclass_classification')@tasks('classification') + +defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple\[Dict\[str, Any\], validmind.vm_models.go.validmind.vm_models.Figure, bool\]: ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index bf1a51505..ec934ec3a 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('tabular_data', 'time_series_data', 'text_data')
@tasks('classification', 'regression', 'text_classification', 'text_summarization')
+@tags('tabular_data', 'time_series_data', 'text_data')@tasks('classification', 'regression', 'text_classification', 'text_summarization') + defDatasetDescription(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 5b0707cc9..abc996ee7 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,8 +14,9 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'time_series_data', 'text_data')
@tasks('classification', 'regression', 'text_classification', 'text_summarization')
-defDatasetSplit(datasets:List[VMDataset]): +@tags('tabular_data', 'time_series_data', 'text_data')@tasks('classification', 'regression', 'text_classification', 'text_summarization') + +defDatasetSplit(datasets:List\[VMDataset\]): ::: diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index 9f06dcd7d..cd13dbe20 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -36,7 +36,8 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -
@tags('tabular_data', 'time_series_data')
@tasks('classification', 'regression')
+@tags('tabular_data', 'time_series_data')@tasks('classification', 'regression') + defDescriptiveStatistics(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 1a2386508..935fc6cba 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('time_series_data', 'forecasting', 'unit_root_test')
@tasks('regression')
+@tags('time_series_data', 'forecasting', 'unit_root_test')@tasks('regression') + defDickeyFullerGLS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index d093a20d0..6f5da8b4f 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'data_quality', 'text_data')
@tasks('classification', 'regression')
+@tags('tabular_data', 'data_quality', 'text_data')@tasks('classification', 'regression') + defDuplicates(dataset,min_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 423a38543..3dc98d02d 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('time_series_data', 'statistical_test', 'forecasting')
@tasks('regression')
+@tags('time_series_data', 'statistical_test', 'forecasting')@tasks('regression') + defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): ::: diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 419c12e90..d960d4776 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'visualization', 'correlation')
@tasks('classification', 'regression')
+@tags('tabular_data', 'visualization', 'correlation')@tasks('classification', 'regression') + defFeatureTargetCorrelationPlot(dataset,fig_height=600): ::: diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index a911e7aa0..5ce945f7e 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'data_quality', 'categorical_data')
@tasks('classification', 'regression')
+@tags('tabular_data', 'data_quality', 'categorical_data')@tasks('classification', 'regression') + defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): ::: diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 50debff26..982de23be 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'data_quality', 'correlation')
@tasks('classification', 'regression')
+@tags('tabular_data', 'data_quality', 'correlation')@tasks('classification', 'regression') + defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 82dd5c751..413215fbf 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -26,7 +26,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'visualization', 'numerical_data')
@tasks('classification', 'regression')
+@tags('tabular_data', 'visualization', 'numerical_data')@tasks('classification', 'regression') + defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): ::: diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index ab01d2d73..af2239325 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -26,7 +26,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'numerical_data')
@tasks('classification', 'regression')
+@tags('tabular_data', 'numerical_data')@tasks('classification', 'regression') + defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): ::: diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index ad5ec89f4..7b268e7dd 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'anomaly_detection')
@tasks('classification')
+@tags('tabular_data', 'anomaly_detection')@tasks('classification') + defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): ::: diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index 57673b4a8..becb77f99 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tasks('classification', 'regression')
@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')
+@tasks('classification', 'regression')@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels') + defJarqueBera(dataset): ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index e2fb0aa20..ea12dc414 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('time_series_data', 'stationarity', 'unit_root_test', 'statsmodels')
@tasks('data_validation')
+@tags('time_series_data', 'stationarity', 'unit_root_test', 'statsmodels')@tasks('data_validation') + defKPSS(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index 033fc276a..d1869436e 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tasks('regression')
@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels')
+@tasks('regression')@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels') + defLJungBox(dataset): ::: diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index d0358c16b..eaa32c63d 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('time_series_data', 'visualization')
@tasks('regression')
+@tags('time_series_data', 'visualization')@tasks('regression') + defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): ::: diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index eccd5b413..d2a076209 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'data_quality')
@tasks('classification', 'regression')
+@tags('tabular_data', 'data_quality')@tasks('classification', 'regression') + defMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 62e969c9f..f7190aa0f 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'data_quality', 'visualization')
@tasks('classification', 'regression')
+@tags('tabular_data', 'data_quality', 'visualization')@tasks('classification', 'regression') + defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): ::: diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index 7a1b81e35..acbe2a9cb 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('feature_selection', 'data_analysis')
@tasks('classification', 'regression')
+@tags('feature_selection', 'data_analysis')@tasks('classification', 'regression') + defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): ::: diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index d1049d9b0..de8a41efc 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'numerical_data', 'correlation')
@tasks('classification', 'regression')
+@tags('tabular_data', 'numerical_data', 'correlation')@tasks('classification', 'regression') + defPearsonCorrelationMatrix(dataset): ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 67ecd65c8..9cee3b67c 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('time_series_data', 'forecasting', 'statistical_test', 'unit_root_test')
@tasks('regression')
+@tags('time_series_data', 'forecasting', 'statistical_test', 'unit_root_test')@tasks('regression') + defPhillipsPerronArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index ffcda046d..f0036fc38 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('bias_and_fairness')
@tasks('classification', 'regression')
+@tags('bias_and_fairness')@tasks('classification', 'regression') + defProtectedClassesCombination(dataset,model,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index f6dc9c589..46ee03370 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('bias_and_fairness', 'descriptive_statistics')
@tasks('classification', 'regression')
+@tags('bias_and_fairness', 'descriptive_statistics')@tasks('classification', 'regression') + defProtectedClassesDescription(dataset,protected_classes=None): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index a8f3b6d80..c25ea70b7 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -28,8 +28,9 @@ Get a logger for the given module name ::: {.signature} -
@tags('bias_and_fairness')
@tasks('classification', 'regression')
-defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=['fnr', 'fpr', 'tpr']): +@tags('bias_and_fairness')@tasks('classification', 'regression') + +defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=\['fnr', 'fpr', 'tpr'\]): ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index c282dfeae..1a0388612 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -100,7 +100,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('bias_and_fairness')
@tasks('classification', 'regression')
+@tags('bias_and_fairness')@tasks('classification', 'regression') + defProtectedClassesThresholdOptimizer(dataset,pipeline=None,protected_classes=None,X_train=None,y_train=None): ::: diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index b5c769ad1..4352de24c 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -26,7 +26,8 @@ toc-expand: 4 ::: {.signature} -
@tags('time_series_data', 'visualization', 'stationarity')
@tasks('regression')
+@tags('time_series_data', 'visualization', 'stationarity')@tasks('regression') + defRollingStatsPlot(dataset:VMDataset,window_size:int=12): ::: diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index 7f95c1a9e..f11e25f95 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tasks('classification', 'regression')
@tags('tabular_data', 'statistical_test', 'statsmodels')
+@tasks('classification', 'regression')@tags('tabular_data', 'statistical_test', 'statsmodels') + defRunsTest(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index c9f6f9166..28794f5fe 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'visualization')
@tasks('classification', 'regression')
+@tags('tabular_data', 'visualization')@tasks('classification', 'regression') + defScatterPlot(dataset): ::: diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 5397ebf8d..8c11b9949 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('visualization', 'credit_risk', 'scorecard')
@tasks('classification')
+@tags('visualization', 'credit_risk', 'scorecard')@tasks('classification') + defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 39d6428ff..93ff5c4d3 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('time_series_data', 'seasonality', 'statsmodels')
@tasks('regression')
+@tags('time_series_data', 'seasonality', 'statsmodels')@tasks('regression') + defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): ::: diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index e88027cb4..29089a6d3 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tasks('classification', 'regression')
@tags('tabular_data', 'data_distribution', 'statistical_test')
+@tasks('classification', 'regression')@tags('tabular_data', 'data_distribution', 'statistical_test') + defShapiroWilk(dataset): ::: diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index 0bda129cc..5d14b9eb1 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('data_quality', 'tabular_data')
@tasks('classification', 'regression')
+@tags('data_quality', 'tabular_data')@tasks('classification', 'regression') + defSkewness(dataset,max_threshold=1): ::: diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index d8f4f706b..568a9b77a 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('time_series_data', 'visualization')
@tasks('regression')
+@tags('time_series_data', 'visualization')@tasks('regression') + defSpreadPlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 72cb31b11..32534d580 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'visualization')
@tasks('classification', 'regression')
+@tags('tabular_data', 'visualization')@tasks('classification', 'regression') + defTabularCategoricalBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 4857d2c66..95e71ea78 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('time_series_data', 'visualization')
@tasks('classification', 'regression')
+@tags('time_series_data', 'visualization')@tasks('classification', 'regression') + defTabularDateTimeHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 8df08c4cd..76bbb4c2d 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -86,7 +86,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data')
@tasks('classification', 'regression')
+@tags('tabular_data')@tasks('classification', 'regression') + defTabularDescriptionTables(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index a424bf83f..cf4c19d03 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'visualization')
@tasks('classification', 'regression')
+@tags('tabular_data', 'visualization')@tasks('classification', 'regression') + defTabularNumericalHistograms(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index efdff9c16..4131c6995 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'visualization', 'categorical_data')
@tasks('classification')
+@tags('tabular_data', 'visualization', 'categorical_data')@tasks('classification') + defTargetRateBarPlots(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index 2d1ce1508..a17368818 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('time_series_data', 'analysis')
@tasks('regression')
+@tags('time_series_data', 'analysis')@tasks('regression') + defTimeSeriesDescription(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 609c830a8..73bb157b1 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('time_series_data', 'analysis')
@tasks('regression')
+@tags('time_series_data', 'analysis')@tasks('regression') + defTimeSeriesDescriptiveStatistics(dataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 6af071a9e..95779deb1 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('time_series_data')
@tasks('regression')
+@tags('time_series_data')@tasks('regression') + defTimeSeriesFrequency(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 497b7baf3..9a5ed38cd 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('data_validation', 'visualization', 'time_series_data')
@tasks('regression', 'time_series_forecasting')
+@tags('data_validation', 'visualization', 'time_series_data')@tasks('regression', 'time_series_forecasting') + defTimeSeriesHistogram(dataset,nbins=30): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index bcdefa806..92becd1f7 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('time_series_data', 'visualization')
@tasks('regression')
+@tags('time_series_data', 'visualization')@tasks('regression') + defTimeSeriesLinePlot(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index a277538cb..ad3a3911e 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('time_series_data')
@tasks('regression')
+@tags('time_series_data')@tasks('regression') + defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index fd898ac39..90325cb97 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('time_series_data')
@tasks('regression')
+@tags('time_series_data')@tasks('regression') + defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): ::: diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 231f52de9..725151304 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data')
@tasks('regression', 'classification')
+@tags('tabular_data')@tasks('regression', 'classification') + defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): ::: diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 5e4ceebf9..e615d3b30 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data')
@tasks('regression', 'classification')
+@tags('tabular_data')@tasks('regression', 'classification') + defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 3d9765d0c..30d5c3623 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('tabular_data', 'visualization', 'categorical_data')
@tasks('classification')
+@tags('tabular_data', 'visualization', 'categorical_data')@tasks('classification') + defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): ::: diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index bd380591c..6476f5abd 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'categorical_data')
@tasks('classification')
+@tags('tabular_data', 'categorical_data')@tasks('classification') + defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index d2c02eb62..2f4f77b1c 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('time_series_data', 'stationarity', 'unit_root_test')
@tasks('regression')
+@tags('time_series_data', 'stationarity', 'unit_root_test')@tasks('regression') + defZivotAndrewsArch(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index adce4d980..4f6380574 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')
@tasks('text_classification', 'text_summarization')
+@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@tasks('text_classification', 'text_summarization') + defCommonWords(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index e5e03fe7b..186c0ace5 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')
@tasks('text_classification', 'text_summarization')
+@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@tasks('text_classification', 'text_summarization') + defHashtags(dataset:VMDataset,top_hashtags:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 7c768fd60..7977568d2 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
+@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') + defLanguageDetection(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index f4b18746a..095c6daeb 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')
@tasks('text_classification', 'text_summarization')
+@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@tasks('text_classification', 'text_summarization') + defMentions(dataset:VMDataset,top_mentions:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index 737135a87..5aa227406 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('nlp', 'text_data', 'data_validation')
@tasks('nlp')
+@tags('nlp', 'text_data', 'data_validation')@tasks('nlp') + defPolarityAndSubjectivity(dataset,threshold_subjectivity=0.5,threshold_polarity=0): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index 7d2344dc5..e71e943c7 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -18,7 +18,8 @@ Metrics functions for any Pandas-compatible datasets ::: {.signature} -
@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')
@tasks('text_classification', 'text_summarization', 'nlp')
+@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@tasks('text_classification', 'text_summarization', 'nlp') + defPunctuations(dataset,count_mode='token'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index a28fc788f..6b86f0d40 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('nlp', 'text_data', 'data_validation')
@tasks('nlp')
+@tags('nlp', 'text_data', 'data_validation')@tasks('nlp') + defSentiment(dataset): ::: diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index 61034a6ad..b23e9c6c7 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,7 +18,8 @@ Threshold based tests ::: {.signature} -
@tags('nlp', 'text_data', 'frequency_analysis', 'visualization')
@tasks('text_classification', 'text_summarization')
+@tags('nlp', 'text_data', 'frequency_analysis', 'visualization')@tasks('text_classification', 'text_summarization') + defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): ::: diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index e56708e00..8a02e8432 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -26,8 +26,9 @@ toc-expand: 4 ::: {.signature} -
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
-defTextDescription(dataset:VMDataset,unwanted_tokens:set={'s', "s'", 'mr', 'ms', 'mrs', 'dr', "'s", ' ', "''", 'dollar', 'us', '``'},lang:str='english'): +@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') + +defTextDescription(dataset:VMDataset,unwanted_tokens:set={'s', "s'", 'mr', 'ms', 'mrs', 'dr', "'s", ' ', "''", 'dollar', 'us', '\`\`'},lang:str='english'): ::: diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index c60f3e256..cfd6e1695 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('nlp', 'text_data', 'data_validation')
@tasks('nlp')
+@tags('nlp', 'text_data', 'data_validation')@tasks('nlp') + defToxicity(dataset): ::: diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index bebca1611..83fcda026 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -38,7 +38,8 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
+@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') + defBertScore(dataset,model,evaluation_model='distilbert-base-uncased'): ::: diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index bd30f2286..35ec6c27d 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -38,7 +38,8 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
+@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') + defBleuScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index c7da073d2..32e70f9b4 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'model_performance')
@tasks('clustering')
+@tags('sklearn', 'model_performance')@tasks('clustering') + defClusterSizeDistribution(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 29687ed23..e64208c75 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -38,7 +38,8 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
+@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') + defContextualRecall(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 363146893..7bfa986a9 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('feature_importance', 'AUC', 'visualization')
@tasks('classification')
+@tags('feature_importance', 'AUC', 'visualization')@tasks('classification') + defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 47c6be80a..d8e1a4561 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -38,7 +38,8 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
+@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') + defMeteorScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index 6d40bd30d..8cf507e33 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -28,7 +28,8 @@ Attempts to extract all model info from a model object instance ::: {.signature} -
@tags('model_training', 'metadata')
@tasks('regression', 'time_series_forecasting')
+@tags('model_training', 'metadata')@tasks('regression', 'time_series_forecasting') + defModelMetadata(model): ::: diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index 3953e7f0d..cdf06ed54 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('regression')
@tasks('residual_analysis', 'visualization')
+@tags('regression')@tasks('residual_analysis', 'visualization') + defModelPredictionResiduals(dataset,model,nbins=100,p_value_threshold=0.05,start_date=None,end_date=None): ::: diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 33ac6a049..3f45b4134 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -38,7 +38,8 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
+@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') + defRegardScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 912d1947a..46f4e1b30 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('model_performance', 'visualization')
@tasks('regression')
+@tags('model_performance', 'visualization')@tasks('regression') + defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 1a90fac45..2dea63a7f 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
+@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') + defRougeScore(dataset,model,metric='rouge-1'): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index 216d6559a..cb8f97e89 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('model_predictions', 'visualization')
@tasks('regression', 'time_series_forecasting')
+@tags('model_predictions', 'visualization')@tasks('regression', 'time_series_forecasting') + defTimeSeriesPredictionWithCI(dataset,model,confidence=0.95): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index 99d821eb9..10fae37f6 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('model_predictions', 'visualization')
@tasks('regression', 'time_series_forecasting')
+@tags('model_predictions', 'visualization')@tasks('regression', 'time_series_forecasting') + defTimeSeriesPredictionsPlot(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 497023c9d..496f03184 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('model_performance', 'sklearn')
@tasks('regression', 'time_series_forecasting')
+@tags('model_performance', 'sklearn')@tasks('regression', 'time_series_forecasting') + defTimeSeriesR2SquareBySegments(dataset,model,segments=None): ::: diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index 02e95f893..405c3c97f 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
+@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') + defTokenDisparity(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index c748d042a..b9d86a75b 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('nlp', 'text_data', 'visualization')
@tasks('text_classification', 'text_summarization')
+@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') + defToxicityScore(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index c77ca6b9b..8e24adc9e 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'model_performance', 'clustering')
@tasks('clustering')
+@tags('sklearn', 'model_performance', 'clustering')@tasks('clustering') + defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index d921c1907..136816005 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'model_performance', 'clustering')
@tasks('clustering')
+@tags('sklearn', 'model_performance', 'clustering')@tasks('clustering') + defAdjustedRandIndex(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index a1b30f105..067640b0a 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'model_performance', 'classification')
@tasks('classification')
+@tags('sklearn', 'model_performance', 'classification')@tasks('classification') + defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index d17ce169d..1cfb21313 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@tasks('classification', 'text_classification')
+@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@tasks('classification', 'text_classification') + defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index d72651158..e6e0cff78 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('model_validation', 'threshold_optimization', 'classification_metrics')
@tasks('classification')
+@tags('model_validation', 'threshold_optimization', 'classification_metrics')@tasks('classification') + defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 426fb41bc..9f130e139 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'model_performance', 'clustering')
@tasks('clustering')
+@tags('sklearn', 'model_performance', 'clustering')@tasks('clustering') + defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 8ba1c2d0a..d4aa092ef 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'model_performance', 'clustering')
@tasks('clustering')
+@tags('sklearn', 'model_performance', 'clustering')@tasks('clustering') + defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 04391ff1e..8e79a39ef 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'model_performance', 'clustering')
@tasks('clustering')
+@tags('sklearn', 'model_performance', 'clustering')@tasks('clustering') + defCompletenessScore(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index da0b25259..9e0253d07 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')
@tasks('classification', 'text_classification')
+@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')@tasks('classification', 'text_classification') + defConfusionMatrix(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index afe717796..4c98da141 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('model_explainability', 'sklearn')
@tasks('regression', 'time_series_forecasting')
+@tags('model_explainability', 'sklearn')@tasks('regression', 'time_series_forecasting') + defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index f9e36bacb..15ac41eb0 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'model_performance')
@tasks('clustering')
+@tags('sklearn', 'model_performance')@tasks('clustering') + defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 1313ff1cd..3190c8124 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'model_performance')
@tasks('clustering')
+@tags('sklearn', 'model_performance')@tasks('clustering') + defHomogeneityScore(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index 2fc73652e..a3d0b97ec 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'model_performance')
@tasks('classification', 'clustering')
+@tags('sklearn', 'model_performance')@tasks('classification', 'clustering') + defcustom_recall(y_true,y_pred_proba,threshold=0.5): ::: @@ -27,8 +28,9 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'model_performance')
@tasks('clustering', 'classification')
-defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union[str, List, Dict]=None,thresholds:Union[float, List[float]]=None,fit_params:dict=None): +@tags('sklearn', 'model_performance')@tasks('clustering', 'classification') + +defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\]=None,thresholds:Union\[float, List\[float\]\]=None,fit_params:dict=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index dd95391a4..9ea08eb21 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,8 +14,9 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'model_performance', 'kmeans')
@tasks('clustering')
-defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union[List[int], None]=None): +@tags('sklearn', 'model_performance', 'kmeans')@tasks('clustering') + +defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union\[List\[int\], None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index d8b9ffe0a..075802ea8 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@tasks('classification', 'text_classification')
+@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@tasks('classification', 'text_classification') + defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 44fa3591f..ff42bfed0 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@tasks('classification', 'text_classification')
+@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@tasks('classification', 'text_classification') + defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index ab0253557..aa3779177 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@tasks('classification', 'text_classification')
+@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@tasks('classification', 'text_classification') + defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 2e9fe14cd..94882ae25 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('model_training', 'metadata')
@tasks('classification', 'regression')
+@tags('model_training', 'metadata')@tasks('classification', 'regression') + defModelParameters(model,model_params=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index ed93b4b2a..14177706c 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -24,8 +24,9 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'model_comparison')
@tasks('classification', 'text_classification')
-defModelsPerformanceComparison(dataset:VMDataset,models:list[VMModel]): +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'model_comparison')@tasks('classification', 'text_classification') + +defModelsPerformanceComparison(dataset:VMDataset,models:list\[VMModel\]): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index f8f9e3b3c..355959da2 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -28,8 +28,9 @@ Get a logger for the given module name ::: {.signature} -
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'linear_regression', 'model_diagnosis')
@tasks('classification', 'regression')
-defOverfitDiagnosis(model:VMModel,datasets:List[VMDataset],metric:str=None,cut_off_threshold:float=DEFAULT_THRESHOLD): +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'linear_regression', 'model_diagnosis')@tasks('classification', 'regression') + +defOverfitDiagnosis(model:VMModel,datasets:List\[VMDataset\],metric:str=None,cut_off_threshold:float=DEFAULT_THRESHOLD): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 666b96e6f..14ab44107 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -28,8 +28,9 @@ Get a logger for the given module name ::: {.signature} -
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')
@tasks('classification', 'text_classification')
-defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union[int, None]=None,figure_height:Union[int, None]=None): +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')@tasks('classification', 'text_classification') + +defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union\[int, None\]=None,figure_height:Union\[int, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 581ad7ddc..5b46b4768 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -46,8 +46,9 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')
@tasks('classification', 'text_classification')
-defPopulationStabilityIndex(datasets:List[VMDataset],model:VMModel,num_bins:int=10,mode:str='fixed'): +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@tasks('classification', 'text_classification') + +defPopulationStabilityIndex(datasets:List\[VMDataset\],model:VMModel,num_bins:int=10,mode:str='fixed'): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index e857fb011..b1cc9864e 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'binary_classification', 'model_performance', 'visualization')
@tasks('classification', 'text_classification')
+@tags('sklearn', 'binary_classification', 'model_performance', 'visualization')@tasks('classification', 'text_classification') + defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index e487c1550..3f2dad412 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')
@tasks('classification', 'text_classification')
+@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')@tasks('classification', 'text_classification') + defROCCurve(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index d7d9938f4..639728ec0 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'model_performance')
@tasks('regression', 'classification')
+@tags('sklearn', 'model_performance')@tasks('regression', 'classification') + defRegressionErrors(model,dataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 06beb4451..65b3daf52 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('model_performance', 'sklearn')
@tasks('regression', 'time_series_forecasting')
+@tags('model_performance', 'sklearn')@tasks('regression', 'time_series_forecasting') + defRegressionErrorsComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index cbdf6bff4..064e3003b 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('sklearn', 'model_performance')
@tasks('regression')
+@tags('sklearn', 'model_performance')@tasks('regression') + defRegressionPerformance(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index d6a765e57..066936572 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -28,7 +28,8 @@ Adjusted R2 Score ::: {.signature} -
@tags('sklearn', 'model_performance')
@tasks('regression')
+@tags('sklearn', 'model_performance')@tasks('regression') + defRegressionR2Square(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 8af7bb4c7..1fb37099a 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -28,7 +28,8 @@ Adjusted R2 Score ::: {.signature} -
@tags('model_performance', 'sklearn')
@tasks('regression', 'time_series_forecasting')
+@tags('model_performance', 'sklearn')@tasks('regression', 'time_series_forecasting') + defRegressionR2SquareComparison(datasets,models): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index d82d581df..a8f7ea386 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -28,8 +28,9 @@ Get a logger for the given module name ::: {.signature} -
@tags('sklearn', 'model_diagnosis', 'visualization')
@tasks('classification', 'regression')
-defRobustnessDiagnosis(datasets:List[VMDataset],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List[float]=DEFAULT_STD_DEV_LIST,performance_decay_threshold:float=DEFAULT_DECAY_THRESHOLD): +@tags('sklearn', 'model_diagnosis', 'visualization')@tasks('classification', 'regression') + +defRobustnessDiagnosis(datasets:List\[VMDataset\],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List\[float\]=DEFAULT_STD_DEV_LIST,performance_decay_threshold:float=DEFAULT_DECAY_THRESHOLD): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 993174e45..f12600232 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -85,7 +85,8 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')
@tasks('classification', 'text_classification')
+@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')@tasks('classification', 'text_classification') + defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index dfc961545..8090543ad 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('visualization', 'credit_risk', 'calibration')
@tasks('classification')
+@tags('visualization', 'credit_risk', 'calibration')@tasks('classification') + defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index c86f5e4c7..6ae107153 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'model_performance')
@tasks('clustering')
+@tags('sklearn', 'model_performance')@tasks('clustering') + defSilhouettePlot(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 05ea9a15d..952485e4c 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,8 +14,9 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')
@tasks('classification', 'text_classification')
-defTrainingTestDegradation(datasets:List[VMDataset],model:VMModel,max_threshold:float=0.1): +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')@tasks('classification', 'text_classification') + +defTrainingTestDegradation(datasets:List\[VMDataset\],model:VMModel,max_threshold:float=0.1): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 6e9f4b634..0c537aa9e 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'model_performance')
@tasks('clustering')
+@tags('sklearn', 'model_performance')@tasks('clustering') + defVMeasure(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index a573cdb05..01f276040 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,8 +14,9 @@ toc-expand: 4 ::: {.signature} -
@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_diagnosis', 'visualization')
@tasks('classification', 'text_classification')
-defWeakspotsDiagnosis(datasets:List[VMDataset],model:VMModel,features_columns:Union[List[str], None]=None,metrics:Union[Dict[str, Callable], None]=None,thresholds:Union[Dict[str, float], None]=None): +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_diagnosis', 'visualization')@tasks('classification', 'text_classification') + +defWeakspotsDiagnosis(datasets:List\[VMDataset\],model:VMModel,features_columns:Union\[List\[str\], None\]=None,metrics:Union\[Dict\[str, Callable\], None\]=None,thresholds:Union\[Dict\[str, float\], None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 8629f78c1..14568bf4f 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('time_series_data', 'forecasting', 'model_selection', 'statsmodels')
@tasks('regression')
+@tags('time_series_data', 'forecasting', 'model_selection', 'statsmodels')@tasks('regression') + defAutoARIMA(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index b5c230895..7dae5f0b8 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('visualization', 'credit_risk')
@tasks('classification')
+@tags('visualization', 'credit_risk')@tasks('classification') + defCumulativePredictionProbabilities(dataset,model,title='Cumulative Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index d8bd3fc1d..cd199430a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -14,8 +14,9 @@ toc-expand: 4 ::: {.signature} -
@tasks('regression')
@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels')
-defDurbinWatsonTest(dataset,model,threshold=[1.5, 2.5]): +@tasks('regression')@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels') + +defDurbinWatsonTest(dataset,model,threshold=\[1.5, 2.5\]): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index 7288c5241..e7469d7ab 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('model_performance')
@tasks('classification')
+@tags('model_performance')@tasks('classification') + defGINITable(dataset,model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 43144a0cf..119755606 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')
@tasks('classification', 'regression')
+@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')@tasks('classification', 'regression') + defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 83693fa1c..576dff80d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')
@tasks('classification', 'regression')
+@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')@tasks('classification', 'regression') + defLilliefors(dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index d46471908..271c32865 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('visualization', 'credit_risk')
@tasks('classification')
+@tags('visualization', 'credit_risk')@tasks('classification') + defPredictionProbabilitiesHistogram(dataset,model,title='Histogram of Predictive Probabilities'): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 83bc45f53..1ce2586c9 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('tabular_data', 'visualization', 'model_training')
@tasks('regression')
+@tags('tabular_data', 'visualization', 'model_training')@tasks('regression') + defRegressionCoeffs(model): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 201e562a2..d3cc11d02 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('statistical_test', 'model_interpretation', 'visualization', 'feature_importance')
@tasks('regression')
+@tags('statistical_test', 'model_interpretation', 'visualization', 'feature_importance')@tasks('regression') + defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index e653718af..e57583f5c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -28,8 +28,9 @@ Get a logger for the given module name ::: {.signature} -
@tags('time_series_data', 'forecasting', 'visualization')
@tasks('regression')
-defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union[str, None]=None,end_date:Union[str, None]=None): +@tags('time_series_data', 'forecasting', 'visualization')@tasks('regression') + +defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union\[str, None\]=None,end_date:Union\[str, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 307491150..2548ad1a9 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -26,7 +26,8 @@ toc-expand: 4 ::: {.signature} -
@tags('time_series_data', 'forecasting', 'visualization')
@tasks('regression')
+@tags('time_series_data', 'forecasting', 'visualization')@tasks('regression') + defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index f13763845..818ee57d4 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -40,8 +40,9 @@ Get a logger for the given module name ::: {.signature} -
@tags('senstivity_analysis', 'visualization')
@tasks('regression')
-defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List[float]=[0.1],transformation:Union[str, None]=None): +@tags('senstivity_analysis', 'visualization')@tasks('regression') + +defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List\[float\]=\[0.1\],transformation:Union\[str, None\]=None): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 166dd6e2a..75322203d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -28,7 +28,8 @@ Adjusted R2 Score ::: {.signature} -
@tags('model_performance', 'regression')
@tasks('regression')
+@tags('model_performance', 'regression')@tasks('regression') + defRegressionModelSummary(dataset:VMDataset,model:VMModel): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index ac4d1e15e..3a09b88eb 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -28,7 +28,8 @@ Get a logger for the given module name ::: {.signature} -
@tags('statsmodels', 'feature_importance', 'visualization')
@tasks('regression')
+@tags('statsmodels', 'feature_importance', 'visualization')@tasks('regression') + defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index de25abd21..ef8b635e2 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -14,7 +14,8 @@ toc-expand: 4 ::: {.signature} -
@tags('visualization', 'credit_risk', 'logistic_regression')
@tasks('classification')
+@tags('visualization', 'credit_risk', 'logistic_regression')@tasks('classification') + defScorecardHistogram(dataset,title='Histogram of Scores',score_column='score'): ::: diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 202d69237..169cb933e 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -72,7 +72,8 @@ Explanation: " -> 8 ::: {.signature} -
@tags('llm', 'few_shot')
@tasks('text_classification', 'text_summarization')
+@tags('llm', 'few_shot')@tasks('text_classification', 'text_summarization') + defBias(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 5d2201bac..313024280 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -72,7 +72,8 @@ Explanation: " -> 8 ::: {.signature} -
@tags('llm', 'zero_shot', 'few_shot')
@tasks('text_classification', 'text_summarization')
+@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') + defClarity(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 4c796dce2..45c2272fa 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -72,7 +72,8 @@ Explanation: " -> 8 ::: {.signature} -
@tags('llm', 'zero_shot', 'few_shot')
@tasks('text_classification', 'text_summarization')
+@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') + defConciseness(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index be4368ef3..1fe41e62f 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -72,7 +72,8 @@ Explanation: " -> 8 ::: {.signature} -
@tags('llm', 'zero_shot', 'few_shot')
@tasks('text_classification', 'text_summarization')
+@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') + defDelimitation(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index b06af04df..d8b15a24f 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -72,7 +72,8 @@ Explanation: " -> 8 ::: {.signature} -
@tags('llm', 'zero_shot', 'few_shot')
@tasks('text_classification', 'text_summarization')
+@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') + defNegativeInstruction(model,min_threshold=7): ::: diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 12f0facb0..0c89b5724 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -28,7 +28,8 @@ Call LLM with the given prompts and return the response ::: {.signature} -
@tags('llm', 'zero_shot', 'few_shot')
@tasks('text_classification', 'text_summarization')
+@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') + defRobustness(model,dataset,num_tests=10): ::: diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index 3c6ed08ac..a06da9ef6 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -72,7 +72,8 @@ Explanation: " -> 8 ::: {.signature} -
@tags('llm', 'zero_shot', 'few_shot')
@tasks('text_classification', 'text_summarization')
+@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') + defSpecificity(model,min_threshold=7): ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index ca0170246..318aaea61 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -18,7 +18,8 @@ Models entrypoint ::: {.signature} -
dataclass
+dataclass + classFigure: ::: @@ -89,7 +90,8 @@ we would render images as-is, but Plotly FigureWidgets don't work well on Google ::: {.signature} -
dataclass
+dataclass + classModelAttributes: ::: @@ -114,7 +116,8 @@ Model attributes definition ::: {.signature} -
classmethod
+classmethod + deffrom_dict(cls,data): ::: @@ -131,7 +134,8 @@ Creates a ModelAttributes instance from a dictionary ::: {.signature} -
dataclass
+dataclass + classTestSuite: ::: @@ -631,8 +635,9 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -
abstractmethod
-defpredict(*args,**kwargs): +abstractmethod + +defpredict(\*args,\*\*kwargs): ::: From 281af1da3d582f6c3a3f3f2c4d4b9171cb191b20 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 21 Feb 2025 10:17:03 -0800 Subject: [PATCH 097/207] Add metadata and CSS files --- _quarto.yml | 7 ++ docs/_metadata.yml | 4 ++ docs/reference.css | 98 ++++++++++++++++++++++++++ docs/styles.css | 1 - docs/templates/styles.css | 143 ++++++++++++++++++++++++++------------ 5 files changed, 206 insertions(+), 47 deletions(-) create mode 100644 _quarto.yml create mode 100644 docs/_metadata.yml create mode 100644 docs/reference.css delete mode 100644 docs/styles.css diff --git a/_quarto.yml b/_quarto.yml new file mode 100644 index 000000000..4e49e6f87 --- /dev/null +++ b/_quarto.yml @@ -0,0 +1,7 @@ +project: + type: website + +format: + html: + css: docs/templates/styles.css + theme: default \ No newline at end of file diff --git a/docs/_metadata.yml b/docs/_metadata.yml new file mode 100644 index 000000000..f2688fef5 --- /dev/null +++ b/docs/_metadata.yml @@ -0,0 +1,4 @@ +format: + html: + page-layout: full + css: reference.css \ No newline at end of file diff --git a/docs/reference.css b/docs/reference.css new file mode 100644 index 000000000..24215b9d7 --- /dev/null +++ b/docs/reference.css @@ -0,0 +1,98 @@ +.muted { + opacity: 0.6; +} + +p code:not(.sourceCode), li code:not(.sourceCode), td code:not(.sourceCode) { + font-size: 0.9em; +} + +.signature { + font-family: 'JetBrains Mono', 'Fira Code', Menlo, Monaco, 'Courier New', monospace; + background-color: #083E4420; + padding: 0 25px; + border-radius: 5px; + margin: 1em 0; + white-space: pre-wrap; + overflow-x: auto; + font-size: 0.9em; + line-height: 1.5; +} + +.signature .param { + margin-bottom: 0px; +} + +.signature .params { + display: block; + margin-left: 20px; + margin-bottom: 0px; +} + +.signature .muted { + display: inline; + white-space: nowrap; +} + +.signature p { + margin-bottom: 0; +} + +.signature .kw { + color: #008080; + font-weight: bold; + padding-right: 4px; +} + +.signature .name { + color: #de257e; + font-weight: bold; + padding-right: 2px; +} + +.signature .n { + color: #003B4F; +} + +.signature .o { + color: #5E5E5E; + padding-left: 2px; + padding-right: 2px; +} + +.signature .p { + padding-right: 2px; +} + +.signature .kc { + color: #008080; + font-weight: bold; +} + +.signature .bp { + color: #008080; + font-weight: bold; +} + +.signature .nb { + color: #008080; + font-weight: bold; +} + +.signature .s1 { + color: #8225de; +} + +.signature .ann { + color: #20794D; +} + +.signature .decorators { + display: block; + margin-bottom: -10px; +} + +.signature .decorator { + display: inline-block; + color: #5E5E5E; + font-size: 0.9em; +} diff --git a/docs/styles.css b/docs/styles.css deleted file mode 100644 index 0519ecba6..000000000 --- a/docs/styles.css +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/templates/styles.css b/docs/templates/styles.css index 5ac105c62..24215b9d7 100644 --- a/docs/templates/styles.css +++ b/docs/templates/styles.css @@ -1,47 +1,98 @@ - .muted { - color: #747678; - } - - .signature { - font-family: 'JetBrains Mono', 'Fira Code', Menlo, Monaco, 'Courier New', monospace; - background-color: #083E4420; - padding: 15px; - border-radius: 5px; - margin: 1em 0; - white-space: pre; - overflow-x: auto; - font-size: 0.9em; - line-height: 1.5; - width: 100%; - max-width: 100%; - box-sizing: border-box; - display: block; - position: relative; - left: 0; - right: 0; - margin-left: 0; - margin-right: 0; - } - - .signature .kw { - color: #0000FF; - font-weight: bold; - } - - .signature .name { - color: #de257e; - font-weight: bold; - } - - .signature .n { - color: #0550AE; - } - - .signature .ann { - color: #267F99; - } - - .signature .default { - color: #098658; - } \ No newline at end of file + opacity: 0.6; +} + +p code:not(.sourceCode), li code:not(.sourceCode), td code:not(.sourceCode) { + font-size: 0.9em; +} + +.signature { + font-family: 'JetBrains Mono', 'Fira Code', Menlo, Monaco, 'Courier New', monospace; + background-color: #083E4420; + padding: 0 25px; + border-radius: 5px; + margin: 1em 0; + white-space: pre-wrap; + overflow-x: auto; + font-size: 0.9em; + line-height: 1.5; +} + +.signature .param { + margin-bottom: 0px; +} + +.signature .params { + display: block; + margin-left: 20px; + margin-bottom: 0px; +} + +.signature .muted { + display: inline; + white-space: nowrap; +} + +.signature p { + margin-bottom: 0; +} + +.signature .kw { + color: #008080; + font-weight: bold; + padding-right: 4px; +} + +.signature .name { + color: #de257e; + font-weight: bold; + padding-right: 2px; +} + +.signature .n { + color: #003B4F; +} + +.signature .o { + color: #5E5E5E; + padding-left: 2px; + padding-right: 2px; +} + +.signature .p { + padding-right: 2px; +} + +.signature .kc { + color: #008080; + font-weight: bold; +} + +.signature .bp { + color: #008080; + font-weight: bold; +} + +.signature .nb { + color: #008080; + font-weight: bold; +} + +.signature .s1 { + color: #8225de; +} + +.signature .ann { + color: #20794D; +} + +.signature .decorators { + display: block; + margin-bottom: -10px; +} + +.signature .decorator { + display: inline-block; + color: #5E5E5E; + font-size: 0.9em; +} From 51568b78f6b9a97581ee69190bd8cba2aa52fd4d Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 21 Feb 2025 11:20:35 -0800 Subject: [PATCH 098/207] Fix return annotation None and improve handling of @ in decorators --- docs/templates/macros/decorators.jinja2 | 2 +- docs/templates/macros/signatures.jinja2 | 2 +- docs/validmind/tests.qmd | 2 +- .../tests/data_validation/ACFandPACFPlot.qmd | 2 +- docs/validmind/tests/data_validation/ADF.qmd | 2 +- docs/validmind/tests/data_validation/AutoAR.qmd | 2 +- docs/validmind/tests/data_validation/AutoMA.qmd | 2 +- .../tests/data_validation/AutoStationarity.qmd | 2 +- .../data_validation/BivariateScatterPlots.qmd | 2 +- .../tests/data_validation/BoxPierce.qmd | 2 +- .../data_validation/ChiSquaredFeaturesTable.qmd | 2 +- .../tests/data_validation/ClassImbalance.qmd | 2 +- .../tests/data_validation/DatasetDescription.qmd | 2 +- .../tests/data_validation/DatasetSplit.qmd | 2 +- .../data_validation/DescriptiveStatistics.qmd | 2 +- .../tests/data_validation/DickeyFullerGLS.qmd | 2 +- .../tests/data_validation/Duplicates.qmd | 2 +- .../tests/data_validation/EngleGrangerCoint.qmd | 2 +- .../FeatureTargetCorrelationPlot.qmd | 2 +- .../tests/data_validation/HighCardinality.qmd | 2 +- .../data_validation/HighPearsonCorrelation.qmd | 2 +- .../tests/data_validation/IQROutliersBarPlot.qmd | 2 +- .../tests/data_validation/IQROutliersTable.qmd | 2 +- .../data_validation/IsolationForestOutliers.qmd | 2 +- .../tests/data_validation/JarqueBera.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 2 +- .../validmind/tests/data_validation/LJungBox.qmd | 2 +- .../data_validation/LaggedCorrelationHeatmap.qmd | 2 +- .../tests/data_validation/MissingValues.qmd | 2 +- .../data_validation/MissingValuesBarPlot.qmd | 2 +- .../tests/data_validation/MutualInformation.qmd | 2 +- .../data_validation/PearsonCorrelationMatrix.qmd | 2 +- .../tests/data_validation/PhillipsPerronArch.qmd | 2 +- .../ProtectedClassesCombination.qmd | 2 +- .../ProtectedClassesDescription.qmd | 2 +- .../ProtectedClassesDisparity.qmd | 2 +- .../ProtectedClassesThresholdOptimizer.qmd | 2 +- .../tests/data_validation/RollingStatsPlot.qmd | 2 +- .../validmind/tests/data_validation/RunsTest.qmd | 2 +- .../tests/data_validation/ScatterPlot.qmd | 2 +- .../data_validation/ScoreBandDefaultRates.qmd | 2 +- .../tests/data_validation/SeasonalDecompose.qmd | 2 +- .../tests/data_validation/ShapiroWilk.qmd | 2 +- .../validmind/tests/data_validation/Skewness.qmd | 2 +- .../tests/data_validation/SpreadPlot.qmd | 2 +- .../TabularCategoricalBarPlots.qmd | 2 +- .../TabularDateTimeHistograms.qmd | 2 +- .../data_validation/TabularDescriptionTables.qmd | 2 +- .../TabularNumericalHistograms.qmd | 2 +- .../tests/data_validation/TargetRateBarPlots.qmd | 2 +- .../data_validation/TimeSeriesDescription.qmd | 2 +- .../TimeSeriesDescriptiveStatistics.qmd | 2 +- .../data_validation/TimeSeriesFrequency.qmd | 2 +- .../data_validation/TimeSeriesHistogram.qmd | 2 +- .../tests/data_validation/TimeSeriesLinePlot.qmd | 2 +- .../data_validation/TimeSeriesMissingValues.qmd | 2 +- .../tests/data_validation/TimeSeriesOutliers.qmd | 2 +- .../tests/data_validation/TooManyZeroValues.qmd | 2 +- .../tests/data_validation/UniqueRows.qmd | 2 +- .../tests/data_validation/WOEBinPlots.qmd | 2 +- .../tests/data_validation/WOEBinTable.qmd | 2 +- .../tests/data_validation/ZivotAndrewsArch.qmd | 2 +- .../tests/data_validation/nlp/CommonWords.qmd | 2 +- .../tests/data_validation/nlp/Hashtags.qmd | 2 +- .../data_validation/nlp/LanguageDetection.qmd | 2 +- .../tests/data_validation/nlp/Mentions.qmd | 2 +- .../nlp/PolarityAndSubjectivity.qmd | 2 +- .../tests/data_validation/nlp/Punctuations.qmd | 2 +- .../tests/data_validation/nlp/Sentiment.qmd | 2 +- .../tests/data_validation/nlp/StopWords.qmd | 2 +- .../data_validation/nlp/TextDescription.qmd | 2 +- .../tests/data_validation/nlp/Toxicity.qmd | 2 +- .../tests/model_validation/BertScore.qmd | 2 +- .../tests/model_validation/BleuScore.qmd | 2 +- .../model_validation/ClusterSizeDistribution.qmd | 2 +- .../tests/model_validation/ContextualRecall.qmd | 2 +- .../tests/model_validation/FeaturesAUC.qmd | 2 +- .../tests/model_validation/MeteorScore.qmd | 2 +- .../tests/model_validation/ModelMetadata.qmd | 2 +- .../ModelPredictionResiduals.qmd | 2 +- .../tests/model_validation/RegardScore.qmd | 2 +- .../model_validation/RegressionResidualsPlot.qmd | 2 +- .../tests/model_validation/RougeScore.qmd | 2 +- .../TimeSeriesPredictionWithCI.qmd | 2 +- .../TimeSeriesPredictionsPlot.qmd | 2 +- .../TimeSeriesR2SquareBySegments.qmd | 2 +- .../tests/model_validation/TokenDisparity.qmd | 2 +- .../tests/model_validation/ToxicityScore.qmd | 2 +- .../sklearn/AdjustedMutualInformation.qmd | 2 +- .../sklearn/AdjustedRandIndex.qmd | 2 +- .../sklearn/CalibrationCurve.qmd | 2 +- .../sklearn/ClassifierPerformance.qmd | 2 +- .../sklearn/ClassifierThresholdOptimization.qmd | 2 +- .../sklearn/ClusterCosineSimilarity.qmd | 2 +- .../sklearn/ClusterPerformanceMetrics.qmd | 2 +- .../sklearn/CompletenessScore.qmd | 2 +- .../model_validation/sklearn/ConfusionMatrix.qmd | 2 +- .../sklearn/FeatureImportance.qmd | 2 +- .../sklearn/FowlkesMallowsScore.qmd | 2 +- .../sklearn/HomogeneityScore.qmd | 2 +- .../sklearn/HyperParametersTuning.qmd | 4 ++-- .../sklearn/KMeansClustersOptimization.qmd | 2 +- .../model_validation/sklearn/MinimumAccuracy.qmd | 2 +- .../model_validation/sklearn/MinimumF1Score.qmd | 2 +- .../sklearn/MinimumROCAUCScore.qmd | 2 +- .../model_validation/sklearn/ModelParameters.qmd | 2 +- .../sklearn/ModelsPerformanceComparison.qmd | 2 +- .../sklearn/OverfitDiagnosis.qmd | 2 +- .../sklearn/PermutationFeatureImportance.qmd | 2 +- .../sklearn/PopulationStabilityIndex.qmd | 2 +- .../sklearn/PrecisionRecallCurve.qmd | 2 +- .../tests/model_validation/sklearn/ROCCurve.qmd | 2 +- .../sklearn/RegressionErrors.qmd | 2 +- .../sklearn/RegressionErrorsComparison.qmd | 2 +- .../sklearn/RegressionPerformance.qmd | 2 +- .../sklearn/RegressionR2Square.qmd | 2 +- .../sklearn/RegressionR2SquareComparison.qmd | 2 +- .../sklearn/RobustnessDiagnosis.qmd | 2 +- .../sklearn/SHAPGlobalImportance.qmd | 2 +- .../sklearn/ScoreProbabilityAlignment.qmd | 2 +- .../model_validation/sklearn/SilhouettePlot.qmd | 2 +- .../sklearn/TrainingTestDegradation.qmd | 2 +- .../tests/model_validation/sklearn/VMeasure.qmd | 2 +- .../sklearn/WeakspotsDiagnosis.qmd | 2 +- .../model_validation/statsmodels/AutoARIMA.qmd | 2 +- .../CumulativePredictionProbabilities.qmd | 2 +- .../statsmodels/DurbinWatsonTest.qmd | 2 +- .../model_validation/statsmodels/GINITable.qmd | 2 +- .../statsmodels/KolmogorovSmirnov.qmd | 2 +- .../model_validation/statsmodels/Lilliefors.qmd | 2 +- .../PredictionProbabilitiesHistogram.qmd | 2 +- .../statsmodels/RegressionCoeffs.qmd | 2 +- .../RegressionFeatureSignificance.qmd | 2 +- .../statsmodels/RegressionModelForecastPlot.qmd | 2 +- .../RegressionModelForecastPlotLevels.qmd | 2 +- .../RegressionModelSensitivityPlot.qmd | 2 +- .../statsmodels/RegressionModelSummary.qmd | 2 +- .../RegressionPermutationFeatureImportance.qmd | 2 +- .../statsmodels/ScorecardHistogram.qmd | 2 +- docs/validmind/tests/prompt_validation/Bias.qmd | 2 +- .../tests/prompt_validation/Clarity.qmd | 2 +- .../tests/prompt_validation/Conciseness.qmd | 2 +- .../tests/prompt_validation/Delimitation.qmd | 2 +- .../prompt_validation/NegativeInstruction.qmd | 2 +- .../tests/prompt_validation/Robustness.qmd | 2 +- .../tests/prompt_validation/Specificity.qmd | 2 +- docs/validmind/vm_models.qmd | 16 ++++++++-------- 147 files changed, 155 insertions(+), 155 deletions(-) diff --git a/docs/templates/macros/decorators.jinja2 b/docs/templates/macros/decorators.jinja2 index 1ec5b1fa9..c3856e20a 100644 --- a/docs/templates/macros/decorators.jinja2 +++ b/docs/templates/macros/decorators.jinja2 @@ -4,7 +4,7 @@ {%- if member.decorators -%} {%- for decorator in member.decorators -%} -{%- if decorator is mapping -%}{{ format_type(decorator.value) }}{%- else -%}{{ decorator }}{%- endif -%} +{%- if decorator is mapping -%}@{{ format_type(decorator.value) }}{%- else -%}{{ '@' if not decorator.startswith('@') }}{{ decorator }}{%- endif -%} {%- endfor -%} diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index 0245a8ef0..b3453c209 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -52,7 +52,7 @@ {%- endfor -%}) {%- else -%}() {%- endif -%} -{%- if member.returns -%} +{%- if member.returns and member.returns != "None" -%} {{- format_type(member.returns, add_links=true) if member.returns else 'Any' -}} diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index b933e204f..e72bace62 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -256,7 +256,7 @@ The function may also include a docstring. This docstring will be used and logge ::: {.signature} -defregister_test_provider(namespace:str,test_provider:TestProvider)None: +defregister_test_provider(namespace:str,test_provider:TestProvider): ::: diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 0c7e6cf02..0fb0030cd 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('time_series_data', 'forecasting', 'statistical_test', 'visualization')@tasks('regression') +@@tags('time_series_data', 'forecasting', 'statistical_test', 'visualization')@@tasks('regression') defACFandPACFPlot(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index ca58b9533..79f636f04 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test', 'stationarity')@tasks('regression') +@@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test', 'stationarity')@@tasks('regression') defADF(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index bd1b2b44c..5ac9d3bf6 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')@tasks('regression') +@@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')@@tasks('regression') defAutoAR(dataset:VMDataset,max_ar_order:int=3): diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index db6b5a8cb..53d6ea0f2 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')@tasks('regression') +@@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')@@tasks('regression') defAutoMA(dataset:VMDataset,max_ma_order:int=3): diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 7f6cbe969..0039b9ab9 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')@tasks('regression') +@@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')@@tasks('regression') defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index a83d2b016..4e0e7aabf 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'numerical_data', 'visualization')@tasks('classification') +@@tags('tabular_data', 'numerical_data', 'visualization')@@tasks('classification') defBivariateScatterPlots(dataset): diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index 5824dcaf6..c8e053c97 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tasks('regression')@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels') +@@tasks('regression')@@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels') defBoxPierce(dataset): diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 2ad394a56..7eb8db9ff 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'categorical_data', 'statistical_test')@tasks('classification') +@@tags('tabular_data', 'categorical_data', 'statistical_test')@@tasks('classification') defChiSquaredFeaturesTable(dataset,p_threshold=0.05): diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 575f41b91..8509dcda0 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -@tags('tabular_data', 'binary_classification', 'multiclass_classification')@tasks('classification') +@@tags('tabular_data', 'binary_classification', 'multiclass_classification')@@tasks('classification') defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple\[Dict\[str, Any\], validmind.vm_models.go.validmind.vm_models.Figure, bool\]: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index ec934ec3a..01e1d89da 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('tabular_data', 'time_series_data', 'text_data')@tasks('classification', 'regression', 'text_classification', 'text_summarization') +@@tags('tabular_data', 'time_series_data', 'text_data')@@tasks('classification', 'regression', 'text_classification', 'text_summarization') defDatasetDescription(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index abc996ee7..305b7b918 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'time_series_data', 'text_data')@tasks('classification', 'regression', 'text_classification', 'text_summarization') +@@tags('tabular_data', 'time_series_data', 'text_data')@@tasks('classification', 'regression', 'text_classification', 'text_summarization') defDatasetSplit(datasets:List\[VMDataset\]): diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index cd13dbe20..faff029d6 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -36,7 +36,7 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -@tags('tabular_data', 'time_series_data')@tasks('classification', 'regression') +@@tags('tabular_data', 'time_series_data')@@tasks('classification', 'regression') defDescriptiveStatistics(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 935fc6cba..15333b98e 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('time_series_data', 'forecasting', 'unit_root_test')@tasks('regression') +@@tags('time_series_data', 'forecasting', 'unit_root_test')@@tasks('regression') defDickeyFullerGLS(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 6f5da8b4f..548870fc4 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'data_quality', 'text_data')@tasks('classification', 'regression') +@@tags('tabular_data', 'data_quality', 'text_data')@@tasks('classification', 'regression') defDuplicates(dataset,min_threshold=1): diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 3dc98d02d..5cb6af1d8 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('time_series_data', 'statistical_test', 'forecasting')@tasks('regression') +@@tags('time_series_data', 'statistical_test', 'forecasting')@@tasks('regression') defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index d960d4776..80637b1fa 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'visualization', 'correlation')@tasks('classification', 'regression') +@@tags('tabular_data', 'visualization', 'correlation')@@tasks('classification', 'regression') defFeatureTargetCorrelationPlot(dataset,fig_height=600): diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index 5ce945f7e..d901f1622 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'data_quality', 'categorical_data')@tasks('classification', 'regression') +@@tags('tabular_data', 'data_quality', 'categorical_data')@@tasks('classification', 'regression') defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 982de23be..50fe3cf85 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'data_quality', 'correlation')@tasks('classification', 'regression') +@@tags('tabular_data', 'data_quality', 'correlation')@@tasks('classification', 'regression') defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 413215fbf..65856c2c4 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'visualization', 'numerical_data')@tasks('classification', 'regression') +@@tags('tabular_data', 'visualization', 'numerical_data')@@tasks('classification', 'regression') defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index af2239325..981537628 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'numerical_data')@tasks('classification', 'regression') +@@tags('tabular_data', 'numerical_data')@@tasks('classification', 'regression') defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index 7b268e7dd..ce1c16943 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'anomaly_detection')@tasks('classification') +@@tags('tabular_data', 'anomaly_detection')@@tasks('classification') defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index becb77f99..843b7244e 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tasks('classification', 'regression')@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels') +@@tasks('classification', 'regression')@@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels') defJarqueBera(dataset): diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index ea12dc414..36c6de220 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('time_series_data', 'stationarity', 'unit_root_test', 'statsmodels')@tasks('data_validation') +@@tags('time_series_data', 'stationarity', 'unit_root_test', 'statsmodels')@@tasks('data_validation') defKPSS(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index d1869436e..e953f7d02 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tasks('regression')@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels') +@@tasks('regression')@@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels') defLJungBox(dataset): diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index eaa32c63d..b33fbe422 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('time_series_data', 'visualization')@tasks('regression') +@@tags('time_series_data', 'visualization')@@tasks('regression') defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index d2a076209..92ca5dd63 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'data_quality')@tasks('classification', 'regression') +@@tags('tabular_data', 'data_quality')@@tasks('classification', 'regression') defMissingValues(dataset:VMDataset,min_threshold:int=1): diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index f7190aa0f..8368bbcc0 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'data_quality', 'visualization')@tasks('classification', 'regression') +@@tags('tabular_data', 'data_quality', 'visualization')@@tasks('classification', 'regression') defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index acbe2a9cb..d8777db99 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('feature_selection', 'data_analysis')@tasks('classification', 'regression') +@@tags('feature_selection', 'data_analysis')@@tasks('classification', 'regression') defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index de8a41efc..c50d59aa8 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'numerical_data', 'correlation')@tasks('classification', 'regression') +@@tags('tabular_data', 'numerical_data', 'correlation')@@tasks('classification', 'regression') defPearsonCorrelationMatrix(dataset): diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index 9cee3b67c..bb7a17dfa 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('time_series_data', 'forecasting', 'statistical_test', 'unit_root_test')@tasks('regression') +@@tags('time_series_data', 'forecasting', 'statistical_test', 'unit_root_test')@@tasks('regression') defPhillipsPerronArch(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index f0036fc38..c800e83c2 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('bias_and_fairness')@tasks('classification', 'regression') +@@tags('bias_and_fairness')@@tasks('classification', 'regression') defProtectedClassesCombination(dataset,model,protected_classes=None): diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index 46ee03370..e075c961d 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('bias_and_fairness', 'descriptive_statistics')@tasks('classification', 'regression') +@@tags('bias_and_fairness', 'descriptive_statistics')@@tasks('classification', 'regression') defProtectedClassesDescription(dataset,protected_classes=None): diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index c25ea70b7..f8b73f0b0 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('bias_and_fairness')@tasks('classification', 'regression') +@@tags('bias_and_fairness')@@tasks('classification', 'regression') defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=\['fnr', 'fpr', 'tpr'\]): diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 1a0388612..c10a2c139 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -100,7 +100,7 @@ Get a logger for the given module name ::: {.signature} -@tags('bias_and_fairness')@tasks('classification', 'regression') +@@tags('bias_and_fairness')@@tasks('classification', 'regression') defProtectedClassesThresholdOptimizer(dataset,pipeline=None,protected_classes=None,X_train=None,y_train=None): diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 4352de24c..89082d1ba 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -@tags('time_series_data', 'visualization', 'stationarity')@tasks('regression') +@@tags('time_series_data', 'visualization', 'stationarity')@@tasks('regression') defRollingStatsPlot(dataset:VMDataset,window_size:int=12): diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index f11e25f95..e6674fe87 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tasks('classification', 'regression')@tags('tabular_data', 'statistical_test', 'statsmodels') +@@tasks('classification', 'regression')@@tags('tabular_data', 'statistical_test', 'statsmodels') defRunsTest(dataset): diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 28794f5fe..5001f4558 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'visualization')@tasks('classification', 'regression') +@@tags('tabular_data', 'visualization')@@tasks('classification', 'regression') defScatterPlot(dataset): diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 8c11b9949..9a4f39a87 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('visualization', 'credit_risk', 'scorecard')@tasks('classification') +@@tags('visualization', 'credit_risk', 'scorecard')@@tasks('classification') defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 93ff5c4d3..2de9457c8 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('time_series_data', 'seasonality', 'statsmodels')@tasks('regression') +@@tags('time_series_data', 'seasonality', 'statsmodels')@@tasks('regression') defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 29089a6d3..3f038e96a 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tasks('classification', 'regression')@tags('tabular_data', 'data_distribution', 'statistical_test') +@@tasks('classification', 'regression')@@tags('tabular_data', 'data_distribution', 'statistical_test') defShapiroWilk(dataset): diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index 5d14b9eb1..5693cb818 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('data_quality', 'tabular_data')@tasks('classification', 'regression') +@@tags('data_quality', 'tabular_data')@@tasks('classification', 'regression') defSkewness(dataset,max_threshold=1): diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 568a9b77a..9e5283a60 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('time_series_data', 'visualization')@tasks('regression') +@@tags('time_series_data', 'visualization')@@tasks('regression') defSpreadPlot(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 32534d580..673637a90 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'visualization')@tasks('classification', 'regression') +@@tags('tabular_data', 'visualization')@@tasks('classification', 'regression') defTabularCategoricalBarPlots(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index 95e71ea78..f3082d19f 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('time_series_data', 'visualization')@tasks('classification', 'regression') +@@tags('time_series_data', 'visualization')@@tasks('classification', 'regression') defTabularDateTimeHistograms(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index 76bbb4c2d..f302ed3d4 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -86,7 +86,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data')@tasks('classification', 'regression') +@@tags('tabular_data')@@tasks('classification', 'regression') defTabularDescriptionTables(dataset): diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index cf4c19d03..88f48eceb 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'visualization')@tasks('classification', 'regression') +@@tags('tabular_data', 'visualization')@@tasks('classification', 'regression') defTabularNumericalHistograms(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index 4131c6995..e9a644517 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'visualization', 'categorical_data')@tasks('classification') +@@tags('tabular_data', 'visualization', 'categorical_data')@@tasks('classification') defTargetRateBarPlots(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index a17368818..e0c299178 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('time_series_data', 'analysis')@tasks('regression') +@@tags('time_series_data', 'analysis')@@tasks('regression') defTimeSeriesDescription(dataset): diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 73bb157b1..0f6c7d801 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('time_series_data', 'analysis')@tasks('regression') +@@tags('time_series_data', 'analysis')@@tasks('regression') defTimeSeriesDescriptiveStatistics(dataset): diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index 95779deb1..d3047fe8b 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('time_series_data')@tasks('regression') +@@tags('time_series_data')@@tasks('regression') defTimeSeriesFrequency(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 9a5ed38cd..dc1a75575 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('data_validation', 'visualization', 'time_series_data')@tasks('regression', 'time_series_forecasting') +@@tags('data_validation', 'visualization', 'time_series_data')@@tasks('regression', 'time_series_forecasting') defTimeSeriesHistogram(dataset,nbins=30): diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 92becd1f7..111ddba26 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('time_series_data', 'visualization')@tasks('regression') +@@tags('time_series_data', 'visualization')@@tasks('regression') defTimeSeriesLinePlot(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index ad3a3911e..f0f8e30b2 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('time_series_data')@tasks('regression') +@@tags('time_series_data')@@tasks('regression') defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 90325cb97..096afd31a 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('time_series_data')@tasks('regression') +@@tags('time_series_data')@@tasks('regression') defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index 725151304..deb53fdae 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data')@tasks('regression', 'classification') +@@tags('tabular_data')@@tasks('regression', 'classification') defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index e615d3b30..5bf0187df 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data')@tasks('regression', 'classification') +@@tags('tabular_data')@@tasks('regression', 'classification') defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index 30d5c3623..c2334fbcc 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('tabular_data', 'visualization', 'categorical_data')@tasks('classification') +@@tags('tabular_data', 'visualization', 'categorical_data')@@tasks('classification') defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index 6476f5abd..b928f9d42 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'categorical_data')@tasks('classification') +@@tags('tabular_data', 'categorical_data')@@tasks('classification') defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 2f4f77b1c..1fdb9fc28 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('time_series_data', 'stationarity', 'unit_root_test')@tasks('regression') +@@tags('time_series_data', 'stationarity', 'unit_root_test')@@tasks('regression') defZivotAndrewsArch(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index 4f6380574..e01bea9f0 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@tasks('text_classification', 'text_summarization') +@@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@@tasks('text_classification', 'text_summarization') defCommonWords(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index 186c0ace5..a916ec583 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@tasks('text_classification', 'text_summarization') +@@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@@tasks('text_classification', 'text_summarization') defHashtags(dataset:VMDataset,top_hashtags:int=25): diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 7977568d2..6b289f960 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') +@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') defLanguageDetection(dataset): diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 095c6daeb..2dd521680 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@tasks('text_classification', 'text_summarization') +@@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@@tasks('text_classification', 'text_summarization') defMentions(dataset:VMDataset,top_mentions:int=25): diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index 5aa227406..7579cc7cd 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('nlp', 'text_data', 'data_validation')@tasks('nlp') +@@tags('nlp', 'text_data', 'data_validation')@@tasks('nlp') defPolarityAndSubjectivity(dataset,threshold_subjectivity=0.5,threshold_polarity=0): diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index e71e943c7..800aa1f12 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -18,7 +18,7 @@ Metrics functions for any Pandas-compatible datasets ::: {.signature} -@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@tasks('text_classification', 'text_summarization', 'nlp') +@@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@@tasks('text_classification', 'text_summarization', 'nlp') defPunctuations(dataset,count_mode='token'): diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index 6b86f0d40..005c8b1b5 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('nlp', 'text_data', 'data_validation')@tasks('nlp') +@@tags('nlp', 'text_data', 'data_validation')@@tasks('nlp') defSentiment(dataset): diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index b23e9c6c7..5e098b863 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -@tags('nlp', 'text_data', 'frequency_analysis', 'visualization')@tasks('text_classification', 'text_summarization') +@@tags('nlp', 'text_data', 'frequency_analysis', 'visualization')@@tasks('text_classification', 'text_summarization') defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 8a02e8432..3f1708eb7 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') +@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') defTextDescription(dataset:VMDataset,unwanted_tokens:set={'s', "s'", 'mr', 'ms', 'mrs', 'dr', "'s", ' ', "''", 'dollar', 'us', '\`\`'},lang:str='english'): diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index cfd6e1695..791b8b664 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('nlp', 'text_data', 'data_validation')@tasks('nlp') +@@tags('nlp', 'text_data', 'data_validation')@@tasks('nlp') defToxicity(dataset): diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 83fcda026..7b6ac47b5 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') +@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') defBertScore(dataset,model,evaluation_model='distilbert-base-uncased'): diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 35ec6c27d..ddade0702 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') +@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') defBleuScore(dataset,model): diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 32e70f9b4..9b3d2f85e 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'model_performance')@tasks('clustering') +@@tags('sklearn', 'model_performance')@@tasks('clustering') defClusterSizeDistribution(dataset:VMDataset,model:VMModel): diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index e64208c75..1449f242a 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') +@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') defContextualRecall(dataset,model): diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 7bfa986a9..9008390de 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('feature_importance', 'AUC', 'visualization')@tasks('classification') +@@tags('feature_importance', 'AUC', 'visualization')@@tasks('classification') defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index d8e1a4561..bd5a9b7d2 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') +@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') defMeteorScore(dataset,model): diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index 8cf507e33..d8e6ec0a7 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -28,7 +28,7 @@ Attempts to extract all model info from a model object instance ::: {.signature} -@tags('model_training', 'metadata')@tasks('regression', 'time_series_forecasting') +@@tags('model_training', 'metadata')@@tasks('regression', 'time_series_forecasting') defModelMetadata(model): diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index cdf06ed54..f47313d2b 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('regression')@tasks('residual_analysis', 'visualization') +@@tags('regression')@@tasks('residual_analysis', 'visualization') defModelPredictionResiduals(dataset,model,nbins=100,p_value_threshold=0.05,start_date=None,end_date=None): diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 3f45b4134..286b608fc 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') +@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') defRegardScore(dataset,model): diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index 46f4e1b30..ba181de44 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('model_performance', 'visualization')@tasks('regression') +@@tags('model_performance', 'visualization')@@tasks('regression') defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 2dea63a7f..01fb79ea3 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') +@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') defRougeScore(dataset,model,metric='rouge-1'): diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index cb8f97e89..22d460f72 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('model_predictions', 'visualization')@tasks('regression', 'time_series_forecasting') +@@tags('model_predictions', 'visualization')@@tasks('regression', 'time_series_forecasting') defTimeSeriesPredictionWithCI(dataset,model,confidence=0.95): diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index 10fae37f6..a59dcd2bf 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('model_predictions', 'visualization')@tasks('regression', 'time_series_forecasting') +@@tags('model_predictions', 'visualization')@@tasks('regression', 'time_series_forecasting') defTimeSeriesPredictionsPlot(dataset,model): diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 496f03184..847ebc997 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('model_performance', 'sklearn')@tasks('regression', 'time_series_forecasting') +@@tags('model_performance', 'sklearn')@@tasks('regression', 'time_series_forecasting') defTimeSeriesR2SquareBySegments(dataset,model,segments=None): diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index 405c3c97f..de59080c0 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') +@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') defTokenDisparity(dataset,model): diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index b9d86a75b..db38b6b9a 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') +@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') defToxicityScore(dataset,model): diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 8e24adc9e..8a9964c0d 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'model_performance', 'clustering')@tasks('clustering') +@@tags('sklearn', 'model_performance', 'clustering')@@tasks('clustering') defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 136816005..11932b7f9 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'model_performance', 'clustering')@tasks('clustering') +@@tags('sklearn', 'model_performance', 'clustering')@@tasks('clustering') defAdjustedRandIndex(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 067640b0a..53b47ed48 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'model_performance', 'classification')@tasks('classification') +@@tags('sklearn', 'model_performance', 'classification')@@tasks('classification') defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index 1cfb21313..b93b83006 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@tasks('classification', 'text_classification') +@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@@tasks('classification', 'text_classification') defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index e6e0cff78..a02071e8e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('model_validation', 'threshold_optimization', 'classification_metrics')@tasks('classification') +@@tags('model_validation', 'threshold_optimization', 'classification_metrics')@@tasks('classification') defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 9f130e139..139700d47 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'model_performance', 'clustering')@tasks('clustering') +@@tags('sklearn', 'model_performance', 'clustering')@@tasks('clustering') defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index d4aa092ef..6930db98e 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'model_performance', 'clustering')@tasks('clustering') +@@tags('sklearn', 'model_performance', 'clustering')@@tasks('clustering') defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 8e79a39ef..87192dc89 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'model_performance', 'clustering')@tasks('clustering') +@@tags('sklearn', 'model_performance', 'clustering')@@tasks('clustering') defCompletenessScore(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 9e0253d07..0ab425249 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')@tasks('classification', 'text_classification') +@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')@@tasks('classification', 'text_classification') defConfusionMatrix(dataset:VMDataset,model:VMModel): diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index 4c98da141..c941c8461 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('model_explainability', 'sklearn')@tasks('regression', 'time_series_forecasting') +@@tags('model_explainability', 'sklearn')@@tasks('regression', 'time_series_forecasting') defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index 15ac41eb0..bf2ec453a 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'model_performance')@tasks('clustering') +@@tags('sklearn', 'model_performance')@@tasks('clustering') defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 3190c8124..937a5219c 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'model_performance')@tasks('clustering') +@@tags('sklearn', 'model_performance')@@tasks('clustering') defHomogeneityScore(dataset:VMDataset,model:VMModel): diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index a3d0b97ec..fb20abe2a 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'model_performance')@tasks('classification', 'clustering') +@@tags('sklearn', 'model_performance')@@tasks('classification', 'clustering') defcustom_recall(y_true,y_pred_proba,threshold=0.5): @@ -28,7 +28,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'model_performance')@tasks('clustering', 'classification') +@@tags('sklearn', 'model_performance')@@tasks('clustering', 'classification') defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\]=None,thresholds:Union\[float, List\[float\]\]=None,fit_params:dict=None): diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index 9ea08eb21..e90bee33a 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'model_performance', 'kmeans')@tasks('clustering') +@@tags('sklearn', 'model_performance', 'kmeans')@@tasks('clustering') defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union\[List\[int\], None\]=None): diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index 075802ea8..a1dba195d 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@tasks('classification', 'text_classification') +@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@@tasks('classification', 'text_classification') defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index ff42bfed0..271da865d 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@tasks('classification', 'text_classification') +@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@@tasks('classification', 'text_classification') defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index aa3779177..93cc6211f 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@tasks('classification', 'text_classification') +@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@@tasks('classification', 'text_classification') defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 94882ae25..286d50803 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('model_training', 'metadata')@tasks('classification', 'regression') +@@tags('model_training', 'metadata')@@tasks('classification', 'regression') defModelParameters(model,model_params=None): diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 14177706c..471a5bf45 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -24,7 +24,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'model_comparison')@tasks('classification', 'text_classification') +@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'model_comparison')@@tasks('classification', 'text_classification') defModelsPerformanceComparison(dataset:VMDataset,models:list\[VMModel\]): diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index 355959da2..f6b06c0a7 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('sklearn', 'binary_classification', 'multiclass_classification', 'linear_regression', 'model_diagnosis')@tasks('classification', 'regression') +@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'linear_regression', 'model_diagnosis')@@tasks('classification', 'regression') defOverfitDiagnosis(model:VMModel,datasets:List\[VMDataset\],metric:str=None,cut_off_threshold:float=DEFAULT_THRESHOLD): diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 14ab44107..a724fa8ff 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')@tasks('classification', 'text_classification') +@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')@@tasks('classification', 'text_classification') defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union\[int, None\]=None,figure_height:Union\[int, None\]=None): diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 5b46b4768..fc205b9ae 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -46,7 +46,7 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@tasks('classification', 'text_classification') +@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@@tasks('classification', 'text_classification') defPopulationStabilityIndex(datasets:List\[VMDataset\],model:VMModel,num_bins:int=10,mode:str='fixed'): diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index b1cc9864e..9e892263b 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'binary_classification', 'model_performance', 'visualization')@tasks('classification', 'text_classification') +@@tags('sklearn', 'binary_classification', 'model_performance', 'visualization')@@tasks('classification', 'text_classification') defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 3f2dad412..24af70b9b 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')@tasks('classification', 'text_classification') +@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')@@tasks('classification', 'text_classification') defROCCurve(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index 639728ec0..cd0995824 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'model_performance')@tasks('regression', 'classification') +@@tags('sklearn', 'model_performance')@@tasks('regression', 'classification') defRegressionErrors(model,dataset): diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 65b3daf52..868d2769b 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('model_performance', 'sklearn')@tasks('regression', 'time_series_forecasting') +@@tags('model_performance', 'sklearn')@@tasks('regression', 'time_series_forecasting') defRegressionErrorsComparison(datasets,models): diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 064e3003b..e20c9f145 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('sklearn', 'model_performance')@tasks('regression') +@@tags('sklearn', 'model_performance')@@tasks('regression') defRegressionPerformance(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 066936572..3e83fe896 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -@tags('sklearn', 'model_performance')@tasks('regression') +@@tags('sklearn', 'model_performance')@@tasks('regression') defRegressionR2Square(dataset,model): diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index 1fb37099a..eff9b48b1 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -@tags('model_performance', 'sklearn')@tasks('regression', 'time_series_forecasting') +@@tags('model_performance', 'sklearn')@@tasks('regression', 'time_series_forecasting') defRegressionR2SquareComparison(datasets,models): diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index a8f7ea386..d1e9f4727 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('sklearn', 'model_diagnosis', 'visualization')@tasks('classification', 'regression') +@@tags('sklearn', 'model_diagnosis', 'visualization')@@tasks('classification', 'regression') defRobustnessDiagnosis(datasets:List\[VMDataset\],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List\[float\]=DEFAULT_STD_DEV_LIST,performance_decay_threshold:float=DEFAULT_DECAY_THRESHOLD): diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index f12600232..50141e23c 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -85,7 +85,7 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')@tasks('classification', 'text_classification') +@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')@@tasks('classification', 'text_classification') defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 8090543ad..50eae83bd 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('visualization', 'credit_risk', 'calibration')@tasks('classification') +@@tags('visualization', 'credit_risk', 'calibration')@@tasks('classification') defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 6ae107153..9d1da2888 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'model_performance')@tasks('clustering') +@@tags('sklearn', 'model_performance')@@tasks('clustering') defSilhouettePlot(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 952485e4c..8615c4fe2 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')@tasks('classification', 'text_classification') +@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')@@tasks('classification', 'text_classification') defTrainingTestDegradation(datasets:List\[VMDataset\],model:VMModel,max_threshold:float=0.1): diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 0c537aa9e..92677bdf2 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'model_performance')@tasks('clustering') +@@tags('sklearn', 'model_performance')@@tasks('clustering') defVMeasure(dataset:VMDataset,model:VMModel): diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index 01f276040..ee424da56 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_diagnosis', 'visualization')@tasks('classification', 'text_classification') +@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_diagnosis', 'visualization')@@tasks('classification', 'text_classification') defWeakspotsDiagnosis(datasets:List\[VMDataset\],model:VMModel,features_columns:Union\[List\[str\], None\]=None,metrics:Union\[Dict\[str, Callable\], None\]=None,thresholds:Union\[Dict\[str, float\], None\]=None): diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index 14568bf4f..bdd107db0 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('time_series_data', 'forecasting', 'model_selection', 'statsmodels')@tasks('regression') +@@tags('time_series_data', 'forecasting', 'model_selection', 'statsmodels')@@tasks('regression') defAutoARIMA(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index 7dae5f0b8..fa782d44a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('visualization', 'credit_risk')@tasks('classification') +@@tags('visualization', 'credit_risk')@@tasks('classification') defCumulativePredictionProbabilities(dataset,model,title='Cumulative Probabilities'): diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index cd199430a..b98374e56 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tasks('regression')@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels') +@@tasks('regression')@@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels') defDurbinWatsonTest(dataset,model,threshold=\[1.5, 2.5\]): diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index e7469d7ab..f7b28fb2d 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('model_performance')@tasks('classification') +@@tags('model_performance')@@tasks('classification') defGINITable(dataset,model): diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index 119755606..b75676855 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')@tasks('classification', 'regression') +@@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')@@tasks('classification', 'regression') defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 576dff80d..7db1d650a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')@tasks('classification', 'regression') +@@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')@@tasks('classification', 'regression') defLilliefors(dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index 271c32865..c326605a9 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('visualization', 'credit_risk')@tasks('classification') +@@tags('visualization', 'credit_risk')@@tasks('classification') defPredictionProbabilitiesHistogram(dataset,model,title='Histogram of Predictive Probabilities'): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 1ce2586c9..0e2771d70 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('tabular_data', 'visualization', 'model_training')@tasks('regression') +@@tags('tabular_data', 'visualization', 'model_training')@@tasks('regression') defRegressionCoeffs(model): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index d3cc11d02..58d2346c3 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('statistical_test', 'model_interpretation', 'visualization', 'feature_importance')@tasks('regression') +@@tags('statistical_test', 'model_interpretation', 'visualization', 'feature_importance')@@tasks('regression') defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index e57583f5c..042ae4ee9 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('time_series_data', 'forecasting', 'visualization')@tasks('regression') +@@tags('time_series_data', 'forecasting', 'visualization')@@tasks('regression') defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union\[str, None\]=None,end_date:Union\[str, None\]=None): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 2548ad1a9..1815838ea 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -@tags('time_series_data', 'forecasting', 'visualization')@tasks('regression') +@@tags('time_series_data', 'forecasting', 'visualization')@@tasks('regression') defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index 818ee57d4..b0e29be78 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -@tags('senstivity_analysis', 'visualization')@tasks('regression') +@@tags('senstivity_analysis', 'visualization')@@tasks('regression') defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List\[float\]=\[0.1\],transformation:Union\[str, None\]=None): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 75322203d..077cc5aba 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -@tags('model_performance', 'regression')@tasks('regression') +@@tags('model_performance', 'regression')@@tasks('regression') defRegressionModelSummary(dataset:VMDataset,model:VMModel): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index 3a09b88eb..ec8cf6acb 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@tags('statsmodels', 'feature_importance', 'visualization')@tasks('regression') +@@tags('statsmodels', 'feature_importance', 'visualization')@@tasks('regression') defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index ef8b635e2..df9875301 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@tags('visualization', 'credit_risk', 'logistic_regression')@tasks('classification') +@@tags('visualization', 'credit_risk', 'logistic_regression')@@tasks('classification') defScorecardHistogram(dataset,title='Histogram of Scores',score_column='score'): diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 169cb933e..2091f9b5e 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -@tags('llm', 'few_shot')@tasks('text_classification', 'text_summarization') +@@tags('llm', 'few_shot')@@tasks('text_classification', 'text_summarization') defBias(model,min_threshold=7): diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 313024280..0d6d9a9e6 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') +@@tags('llm', 'zero_shot', 'few_shot')@@tasks('text_classification', 'text_summarization') defClarity(model,min_threshold=7): diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index 45c2272fa..d942e0f95 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') +@@tags('llm', 'zero_shot', 'few_shot')@@tasks('text_classification', 'text_summarization') defConciseness(model,min_threshold=7): diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 1fe41e62f..23e63c7ff 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') +@@tags('llm', 'zero_shot', 'few_shot')@@tasks('text_classification', 'text_summarization') defDelimitation(model,min_threshold=7): diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index d8b15a24f..8059bdeb9 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') +@@tags('llm', 'zero_shot', 'few_shot')@@tasks('text_classification', 'text_summarization') defNegativeInstruction(model,min_threshold=7): diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 0c89b5724..29d575a72 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -28,7 +28,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') +@@tags('llm', 'zero_shot', 'few_shot')@@tasks('text_classification', 'text_summarization') defRobustness(model,dataset,num_tests=10): diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index a06da9ef6..a8f6ca338 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') +@@tags('llm', 'zero_shot', 'few_shot')@@tasks('text_classification', 'text_summarization') defSpecificity(model,min_threshold=7): diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 318aaea61..be104d2b1 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -18,7 +18,7 @@ Models entrypoint ::: {.signature} -dataclass +@dataclass classFigure: @@ -34,7 +34,7 @@ Figure objects track the schema supported by the ValidMind API ::: {.signature} -Figure(key:str,figure:Union\[matplotlib.figure.Figure, go.Figure, go.FigureWidget, bytes\],ref_id:str,\_type:str='plot')None +Figure(key:str,figure:Union\[matplotlib.figure.Figure, go.Figure, go.FigureWidget, bytes\],ref_id:str,\_type:str='plot') ::: @@ -90,7 +90,7 @@ we would render images as-is, but Plotly FigureWidgets don't work well on Google ::: {.signature} -dataclass +@dataclass classModelAttributes: @@ -106,7 +106,7 @@ Model attributes definition ::: {.signature} -ModelAttributes(architecture:str=None,framework:str=None,framework_version:str=None,language:str=None,task:ModelTask=None)None +ModelAttributes(architecture:str=None,framework:str=None,framework_version:str=None,language:str=None,task:ModelTask=None) ::: @@ -116,7 +116,7 @@ Model attributes definition ::: {.signature} -classmethod +@classmethod deffrom_dict(cls,data): @@ -134,7 +134,7 @@ Creates a ModelAttributes instance from a dictionary ::: {.signature} -dataclass +@dataclass classTestSuite: @@ -154,7 +154,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -TestSuite(sections:List\[TestSuiteSection\]=None)None +TestSuite(sections:List\[TestSuiteSection\]=None) ::: @@ -635,7 +635,7 @@ An base class that wraps a trained model instance and its associated data. ::: {.signature} -abstractmethod +@abstractmethod defpredict(\*args,\*\*kwargs): From 88479514fee03d34ae4271d00b58412a32a8399f Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 21 Feb 2025 14:20:35 -0800 Subject: [PATCH 099/207] Fixed display of self in methods --- docs/reference.css | 4 +- docs/templates/macros/signatures.jinja2 | 17 ++++- docs/templates/styles.css | 98 ------------------------- docs/validmind/errors.qmd | 12 +-- docs/validmind/tests.qmd | 8 +- docs/validmind/vm_models.qmd | 50 ++++++------- 6 files changed, 53 insertions(+), 136 deletions(-) delete mode 100644 docs/templates/styles.css diff --git a/docs/reference.css b/docs/reference.css index 24215b9d7..b538e2fdf 100644 --- a/docs/reference.css +++ b/docs/reference.css @@ -56,7 +56,7 @@ p code:not(.sourceCode), li code:not(.sourceCode), td code:not(.sourceCode) { .signature .o { color: #5E5E5E; padding-left: 2px; - padding-right: 2px; + padding-right: 4px; } .signature .p { @@ -88,7 +88,7 @@ p code:not(.sourceCode), li code:not(.sourceCode), td code:not(.sourceCode) { .signature .decorators { display: block; - margin-bottom: -10px; + margin-bottom: -20px; } .signature .decorator { diff --git a/docs/templates/macros/signatures.jinja2 b/docs/templates/macros/signatures.jinja2 index b3453c209..438a644d8 100644 --- a/docs/templates/macros/signatures.jinja2 +++ b/docs/templates/macros/signatures.jinja2 @@ -19,8 +19,23 @@ {%- if member.kind == "class" -%} {%- elif member.parameters -%}({{- '' -}} {%- set params = [] -%} + {# Add self parameter for methods that aren't __init__ #} + {%- if member.kind == "method" and member.name != "__init__" -%} + {%- set has_self = false -%} + {%- for param in member.parameters -%} + {%- if param.name == "self" -%} + {%- set has_self = true -%} + {%- endif -%} + {%- endfor -%} + {%- if not has_self -%} + {%- set self_param = {'name': 'self'} -%} + {%- set _ = params.append(self_param) -%} + {%- endif -%} + {%- endif -%} {%- for param in member.parameters -%} - {%- if (param.name != "self" or member.parent is defined) and not (param.name == "self" and member.name == "__init__") -%} + {%- if param.name == "self" and member.name != "__init__" -%} + {%- set _ = params.append(param) -%} + {%- elif param.name != "self" -%} {%- set _ = params.append(param) -%} {%- endif -%} {%- endfor -%} diff --git a/docs/templates/styles.css b/docs/templates/styles.css deleted file mode 100644 index 24215b9d7..000000000 --- a/docs/templates/styles.css +++ /dev/null @@ -1,98 +0,0 @@ -.muted { - opacity: 0.6; -} - -p code:not(.sourceCode), li code:not(.sourceCode), td code:not(.sourceCode) { - font-size: 0.9em; -} - -.signature { - font-family: 'JetBrains Mono', 'Fira Code', Menlo, Monaco, 'Courier New', monospace; - background-color: #083E4420; - padding: 0 25px; - border-radius: 5px; - margin: 1em 0; - white-space: pre-wrap; - overflow-x: auto; - font-size: 0.9em; - line-height: 1.5; -} - -.signature .param { - margin-bottom: 0px; -} - -.signature .params { - display: block; - margin-left: 20px; - margin-bottom: 0px; -} - -.signature .muted { - display: inline; - white-space: nowrap; -} - -.signature p { - margin-bottom: 0; -} - -.signature .kw { - color: #008080; - font-weight: bold; - padding-right: 4px; -} - -.signature .name { - color: #de257e; - font-weight: bold; - padding-right: 2px; -} - -.signature .n { - color: #003B4F; -} - -.signature .o { - color: #5E5E5E; - padding-left: 2px; - padding-right: 2px; -} - -.signature .p { - padding-right: 2px; -} - -.signature .kc { - color: #008080; - font-weight: bold; -} - -.signature .bp { - color: #008080; - font-weight: bold; -} - -.signature .nb { - color: #008080; - font-weight: bold; -} - -.signature .s1 { - color: #8225de; -} - -.signature .ann { - color: #20794D; -} - -.signature .decorators { - display: block; - margin-bottom: -10px; -} - -.signature .decorator { - display: inline-block; - color: #5E5E5E; - font-size: 0.9em; -} diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index 393cace19..fc2229eab 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -68,7 +68,7 @@ Generic error for API request errors that are not known. ::: {.signature} -defdescription(\*args,\*\*kwargs): +defdescription(self,\*args,\*\*kwargs): ::: @@ -137,7 +137,7 @@ When the test suite was found but could not be initialized. ::: {.signature} -defdescription(\*args,\*\*kwargs): +defdescription(self,\*args,\*\*kwargs): ::: @@ -227,7 +227,7 @@ When an invalid metric results object is sent to the API. ::: {.signature} -defdescription(\*args,\*\*kwargs): +defdescription(self,\*args,\*\*kwargs): ::: @@ -432,7 +432,7 @@ When the class labels found in the dataset don't match the provided target label ::: {.signature} -defdescription(\*args,\*\*kwargs): +defdescription(self,\*args,\*\*kwargs): ::: @@ -557,7 +557,7 @@ When the client config is missing the documentation template. ::: {.signature} -defdescription(\*args,\*\*kwargs): +defdescription(self,\*args,\*\*kwargs): ::: @@ -632,7 +632,7 @@ When the R extras have not been installed. ::: {.signature} -defdescription(\*args,\*\*kwargs): +defdescription(self,\*args,\*\*kwargs): ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index e72bace62..8ae15f9e2 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -367,7 +367,7 @@ Initialize the LocalTestProvider with the given root_folder (see class docstring ::: {.signature} -deflist_tests(): +deflist_tests(self): ::: @@ -385,7 +385,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str): +defload_test(self,test_id:str): ::: @@ -430,7 +430,7 @@ Protocol for user-defined test providers ::: {.signature} -deflist_tests()List\[str\]: +deflist_tests(self)List\[str\]: ::: @@ -448,7 +448,7 @@ List all tests in the given namespace ::: {.signature} -defload_test(test_id:str)callable: +defload_test(self,test_id:str)callable: ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index be104d2b1..a83fbda7f 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -44,7 +44,7 @@ Figure objects track the schema supported by the ValidMind API ::: {.signature} -defserialize(): +defserialize(self): ::: @@ -58,7 +58,7 @@ Serializes the Figure to a dictionary so it can be sent to the API ::: {.signature} -defserialize_files(): +defserialize_files(self): ::: @@ -72,7 +72,7 @@ Creates a `requests`-compatible files object to be sent to the API ::: {.signature} -defto_widget(): +defto_widget(self): ::: @@ -164,7 +164,7 @@ Tests can be a flat list of strings or may be nested into sections by using a di ::: {.signature} -defget_default_config()dict: +defget_default_config(self)dict: ::: @@ -184,7 +184,7 @@ Each test in a test suite can accept parameters and those parameters can have de ::: {.signature} -defget_tests()List\[str\]: +defget_tests(self)List\[str\]: ::: @@ -198,7 +198,7 @@ Get all test suite test objects from all sections ::: {.signature} -defnum_tests()int: +defnum_tests(self)int: ::: @@ -238,7 +238,7 @@ Runs a test suite ::: {.signature} -deflog_results(): +deflog_results(self): ::: @@ -254,7 +254,7 @@ This method will be called after the test suite has been run and all results hav ::: {.signature} -defrun(send:bool=True,fail_fast:bool=False): +defrun(self,send:bool=True,fail_fast:bool=False): ::: @@ -273,7 +273,7 @@ Runs the test suite, renders the summary and sends the results to ValidMind ::: {.signature} -defsummarize(show_link:bool=True): +defsummarize(self,show_link:bool=True): ::: @@ -348,7 +348,7 @@ Initializes a VMDataset instance. ::: {.signature} -defadd_extra_column(column_name,column_values=None): +defadd_extra_column(self,column_name,column_values=None): ::: @@ -367,7 +367,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -defassign_predictions(model:VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): +defassign_predictions(self,model:VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): ::: @@ -391,7 +391,7 @@ Assign predictions and probabilities to the dataset. ::: {.signature} -defprediction_column(model:VMModel,column_name:str=None)str: +defprediction_column(self,model:VMModel,column_name:str=None)str: ::: @@ -405,7 +405,7 @@ Get or set the prediction column for a model. ::: {.signature} -defprobability_column(model:VMModel,column_name:str=None)str: +defprobability_column(self,model:VMModel,column_name:str=None)str: ::: @@ -419,7 +419,7 @@ Get or set the probability column for a model. ::: {.signature} -deftarget_classes(): +deftarget_classes(self): ::: @@ -433,7 +433,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMDataset: +defwith_options(self,\*\*kwargs)validmind.vm_models.VMDataset: ::: @@ -456,7 +456,7 @@ Support options provided when passing an input to run_test or run_test_suite ::: {.signature} -defx_df(): +defx_df(self): ::: @@ -470,7 +470,7 @@ Returns a dataframe containing only the feature columns ::: {.signature} -defy_df()validmind.vm_models.pd.validmind.vm_models.DataFrame: +defy_df(self)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -484,7 +484,7 @@ Returns a dataframe containing the target column ::: {.signature} -defy_pred(model)validmind.vm_models.np.validmind.vm_models.ndarray: +defy_pred(self,model)validmind.vm_models.np.validmind.vm_models.ndarray: ::: @@ -508,7 +508,7 @@ Attempts to stack complex prediction types (e.g., embeddings) into a single, mul ::: {.signature} -defy_pred_df(model)validmind.vm_models.pd.validmind.vm_models.DataFrame: +defy_pred_df(self,model)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -522,7 +522,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -defy_prob(model)validmind.vm_models.np.validmind.vm_models.ndarray: +defy_prob(self,model)validmind.vm_models.np.validmind.vm_models.ndarray: ::: @@ -544,7 +544,7 @@ Returns the probabilities for a given model. ::: {.signature} -defy_prob_df(model)validmind.vm_models.pd.validmind.vm_models.DataFrame: +defy_prob_df(self,model)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -576,7 +576,7 @@ Base class for ValidMind Input types ::: {.signature} -defwith_options(\*\*kwargs)validmind.vm_models.VMInput: +defwith_options(self,\*\*kwargs)validmind.vm_models.VMInput: ::: @@ -637,7 +637,7 @@ An base class that wraps a trained model instance and its associated data. @abstractmethod -defpredict(\*args,\*\*kwargs): +defpredict(self,\*args,\*\*kwargs): ::: @@ -651,7 +651,7 @@ Predict method for the model. This is a wrapper around the model's ::: {.signature} -defpredict_proba(\*args,\*\*kwargs): +defpredict_proba(self,\*args,\*\*kwargs): ::: @@ -665,7 +665,7 @@ Predict probabilties - must be implemented by subclass if needed ::: {.signature} -defserialize(): +defserialize(self): ::: From 1a72190db8174715fa0f1ee3ab4fcb7d3304059a Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 21 Feb 2025 14:45:51 -0800 Subject: [PATCH 100/207] Fix Python API warnings --- validmind/client.py | 100 +++++--- validmind/datasets/classification/__init__.py | 7 +- .../datasets/credit_risk/lending_club.py | 38 +-- validmind/datasets/nlp/cnn_dailymail.py | 5 +- validmind/datasets/regression/__init__.py | 17 +- validmind/logging.py | 55 +++-- validmind/models/foundation.py | 4 +- validmind/models/function.py | 12 +- validmind/template.py | 33 ++- validmind/test_suites/__init__.py | 4 +- validmind/tests/_store.py | 14 +- validmind/tests/decorator.py | 25 +- validmind/tests/load.py | 227 ++++++------------ .../ClassifierThresholdOptimization.py | 15 +- .../sklearn/SHAPGlobalImportance.py | 27 ++- validmind/tests/run.py | 4 +- validmind/tests/test_providers.py | 66 +++-- validmind/tests/utils.py | 21 +- validmind/utils.py | 34 ++- validmind/vm_models/dataset/dataset.py | 29 +-- validmind/vm_models/input.py | 3 +- validmind/vm_models/result/result.py | 38 ++- 22 files changed, 425 insertions(+), 353 deletions(-) diff --git a/validmind/client.py b/validmind/client.py index 0dee309c6..d48c53a80 100644 --- a/validmind/client.py +++ b/validmind/client.py @@ -8,6 +8,7 @@ import pandas as pd import polars as pl +from typing import Any, Callable, Dict, List, Optional, Union from .api_client import log_input as log_input from .client_config import client_config @@ -42,20 +43,20 @@ def init_dataset( - dataset, - model=None, - index=None, - index_name: str = None, + dataset: Union[pd.DataFrame, pl.DataFrame, "np.ndarray", "torch.utils.data.Dataset"], + model: Optional[VMModel] = None, + index: Optional[Any] = None, + index_name: Optional[str] = None, date_time_index: bool = False, - columns: list = None, - text_column: str = None, - target_column: str = None, - feature_columns: list = None, - extra_columns: dict = None, - class_labels: dict = None, - type: str = None, - input_id: str = None, - __log=True, + columns: Optional[List[str]] = None, + text_column: Optional[str] = None, + target_column: Optional[str] = None, + feature_columns: Optional[List[str]] = None, + extra_columns: Optional[Dict[str, Any]] = None, + class_labels: Optional[Dict[str, Any]] = None, + type: Optional[str] = None, + input_id: Optional[str] = None, + __log: bool = True, ) -> VMDataset: """ Initializes a VM Dataset, which can then be passed to other functions @@ -71,23 +72,28 @@ def init_dataset( Args: dataset: Dataset from various Python libraries model (VMModel): ValidMind model object - targets (vm.vm.DatasetTargets): A list of target variables - target_column (str): The name of the target column in the dataset - feature_columns (list): A list of names of feature columns in the dataset - extra_columns (dictionary): A dictionary containing the names of the + index (Any, optional): Index for the dataset + index_name (str, optional): Name of the index column + date_time_index (bool): Whether the index is a datetime index + columns (List[str], optional): List of column names + text_column (str, optional): Name of the text column + target_column (str, optional): The name of the target column in the dataset + feature_columns (List[str], optional): A list of names of feature columns in the dataset + extra_columns (Dict[str, Any], optional): A dictionary containing the names of the prediction_column and group_by_columns in the dataset - class_labels (dict): A list of class labels for classification problems - type (str): The type of dataset (one of DATASET_TYPES) - input_id (str): The input ID for the dataset (e.g. "my_dataset"). By default, + class_labels (Dict[str, Any], optional): A list of class labels for classification problems + type (str, optional): The type of dataset (one of DATASET_TYPES) - DEPRECATED + input_id (str, optional): The input ID for the dataset (e.g. "my_dataset"). By default, this will be set to `dataset` but if you are passing this dataset as a test input using some other key than `dataset`, then you should set this to the same key. + __log (bool): Whether to log the input. Defaults to True. Raises: ValueError: If the dataset type is not supported Returns: - vm.vm.Dataset: A VM Dataset instance + VMDataset: A VM Dataset instance """ # Show deprecation notice if type is passed if type is not None: @@ -171,12 +177,12 @@ def init_dataset( def init_model( - model: object = None, + model: Optional[object] = None, input_id: str = "model", - attributes: dict = None, - predict_fn: callable = None, - __log=True, - **kwargs, + attributes: Optional[Dict[str, Any]] = None, + predict_fn: Optional[Callable] = None, + __log: bool = True, + **kwargs: Any, ) -> VMModel: """ Initializes a VM Model, which can then be passed to other functions @@ -292,10 +298,10 @@ def init_r_model( Args: model_path (str): The path to the R model saved as an RDS or XGB file - model_type (str): The type of the model (one of R_MODEL_TYPES) + input_id (str): The input ID for the model. Defaults to "model". Returns: - vm.vm.Model: A VM Model instance + VMModel: A VM Model instance """ # TODO: proper check for supported models @@ -329,10 +335,10 @@ def init_r_model( def get_test_suite( - test_suite_id: str = None, - section: str = None, - *args, - **kwargs, + test_suite_id: Optional[str] = None, + section: Optional[str] = None, + *args: Any, + **kwargs: Any, ) -> TestSuite: """Gets a TestSuite object for the current project or a specific test suite @@ -365,8 +371,13 @@ def get_test_suite( def run_test_suite( - test_suite_id, send=True, fail_fast=False, config=None, inputs=None, **kwargs -): + test_suite_id: str, + send: bool = True, + fail_fast: bool = False, + config: Optional[Dict[str, Any]] = None, + inputs: Optional[Dict[str, Any]] = None, + **kwargs: Any, +) -> Dict[str, Any]: """High Level function for running a test suite This function provides a high level interface for running a test suite. A test suite is @@ -414,7 +425,7 @@ class based on the test_suite_id, initialize each of the tests, and run them. return suite -def preview_template(): +def preview_template() -> None: """Preview the documentation template for the current project This function will display the documentation template for the current project. If @@ -432,8 +443,13 @@ def preview_template(): def run_documentation_tests( - section=None, send=True, fail_fast=False, inputs=None, config=None, **kwargs -): + section: Optional[str] = None, + send: bool = True, + fail_fast: bool = False, + inputs: Optional[Dict[str, Any]] = None, + config: Optional[Dict[str, Any]] = None, + **kwargs: Any, +) -> Dict[str, Any]: """Collect and run all the tests associated with a template This function will analyze the current project's documentation template and collect @@ -487,8 +503,14 @@ def run_documentation_tests( def _run_documentation_section( - template, section, send=True, fail_fast=False, config=None, inputs=None, **kwargs -): + template: str, + section: str, + send: bool = True, + fail_fast: bool = False, + config: Optional[Dict[str, Any]] = None, + inputs: Optional[Dict[str, Any]] = None, + **kwargs: Any, +) -> Dict[str, Any]: """Run all tests in a template section This function will collect all tests used in a template section into a TestSuite and then diff --git a/validmind/datasets/classification/__init__.py b/validmind/datasets/classification/__init__.py index bea25dd83..94df363af 100644 --- a/validmind/datasets/classification/__init__.py +++ b/validmind/datasets/classification/__init__.py @@ -5,6 +5,7 @@ """ Entrypoint for classification datasets. """ +from typing import List import pandas as pd __all__ = [ @@ -13,7 +14,7 @@ ] -def simple_preprocess_booleans(df, columns): +def simple_preprocess_booleans(df: pd.DataFrame, columns: List[str]) -> pd.DataFrame: """ Preprocess boolean columns. @@ -36,7 +37,7 @@ def simple_preprocess_booleans(df, columns): return df -def simple_preprocess_categoricals(df, columns): +def simple_preprocess_categoricals(df: pd.DataFrame, columns: List[str]) -> pd.DataFrame: """ Preprocess categorical columns. @@ -56,7 +57,7 @@ def simple_preprocess_categoricals(df, columns): return df -def simple_preprocess_numericals(df, columns): +def simple_preprocess_numericals(df: pd.DataFrame, columns: List[str]) -> pd.DataFrame: """ Preprocess numerical columns. diff --git a/validmind/datasets/credit_risk/lending_club.py b/validmind/datasets/credit_risk/lending_club.py index f28892c72..a2f53d7b9 100644 --- a/validmind/datasets/credit_risk/lending_club.py +++ b/validmind/datasets/credit_risk/lending_club.py @@ -5,6 +5,7 @@ import logging import os import warnings +from typing import Dict, List, Optional, Tuple, Union, Any import numpy as np import pandas as pd @@ -101,7 +102,7 @@ } -def load_data(source="online", verbose=True): +def load_data(source: str = "online", verbose: bool = True) -> pd.DataFrame: """ Load data from either an online source or offline files, automatically dropping specified columns for offline data. @@ -139,7 +140,7 @@ def load_data(source="online", verbose=True): return df -def _clean_data(df, verbose=True): +def _clean_data(df: pd.DataFrame, verbose: bool = True) -> pd.DataFrame: df = df.copy() # Drop columns not relevant for application scorecards @@ -185,7 +186,7 @@ def _clean_data(df, verbose=True): return df -def preprocess(df, verbose=True): +def preprocess(df: pd.DataFrame, verbose: bool = True) -> pd.DataFrame: df = df.copy() # Convert the target variable to integer type for modeling. @@ -248,7 +249,7 @@ def preprocess(df, verbose=True): return df -def _preprocess_term(df): +def _preprocess_term(df: pd.DataFrame) -> pd.DataFrame: df = df.copy() # Remove ' months' and convert to integer @@ -257,7 +258,7 @@ def _preprocess_term(df): return df -def _preprocess_emp_length(df): +def _preprocess_emp_length(df: pd.DataFrame) -> pd.DataFrame: df = df.copy() # Mapping string values to numbers @@ -284,7 +285,7 @@ def _preprocess_emp_length(df): return df -def feature_engineering(df, verbose=True): +def feature_engineering(df: pd.DataFrame, verbose: bool = True) -> pd.DataFrame: df = df.copy() # WoE encoding of numerical and categorical features @@ -298,7 +299,7 @@ def feature_engineering(df, verbose=True): return df -def woe_encoding(df, verbose=True): +def woe_encoding(df: pd.DataFrame, verbose: bool = True) -> pd.DataFrame: df = df.copy() woe = _woebin(df, verbose=verbose) @@ -319,7 +320,7 @@ def woe_encoding(df, verbose=True): return df -def _woe_to_bins(woe): +def _woe_to_bins(woe: Dict[str, Any]) -> Dict[str, Any]: # Select and rename columns transformed_df = woe[ [ @@ -353,7 +354,7 @@ def _woe_to_bins(woe): return bins -def _woebin(df, verbose=True): +def _woebin(df: pd.DataFrame, verbose: bool = True) -> Dict[str, Any]: """ This function performs automatic binning using WoE. df: A pandas dataframe @@ -383,7 +384,13 @@ def _woebin(df, verbose=True): return bins_df -def split(df, validation_size=None, test_size=0.2, add_constant=False, verbose=True): +def split( + df: pd.DataFrame, + validation_split: Optional[float] = None, + test_size: float = 0.2, + add_constant: bool = False, + verbose: bool = True +) -> Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]: """ Split dataset into train, validation (optional), and test sets. @@ -407,7 +414,7 @@ def split(df, validation_size=None, test_size=0.2, add_constant=False, verbose=T if add_constant: test_df = sm.add_constant(test_df) - if validation_size is None: + if validation_split is None: if add_constant: train_val_df = sm.add_constant(train_val_df) @@ -426,7 +433,7 @@ def split(df, validation_size=None, test_size=0.2, add_constant=False, verbose=T return train_val_df, test_df # Calculate validation size as proportion of remaining data - val_size = validation_size / (1 - test_size) + val_size = validation_split / (1 - test_size) train_df, validation_df = train_test_split( train_val_df, test_size=val_size, random_state=42 ) @@ -454,7 +461,7 @@ def split(df, validation_size=None, test_size=0.2, add_constant=False, verbose=T return train_df, validation_df, test_df -def compute_scores(probabilities): +def compute_scores(probabilities: np.ndarray) -> np.ndarray: target_score = score_params["target_score"] target_odds = score_params["target_odds"] pdo = score_params["pdo"] @@ -468,7 +475,10 @@ def compute_scores(probabilities): return scores -def get_demo_test_config(x_test=None, y_test=None): +def get_demo_test_config( + x_test: Optional[np.ndarray] = None, + y_test: Optional[np.ndarray] = None +) -> Dict[str, Any]: """Get demo test configuration. Args: diff --git a/validmind/datasets/nlp/cnn_dailymail.py b/validmind/datasets/nlp/cnn_dailymail.py index e856dc4f5..4f47c3b74 100644 --- a/validmind/datasets/nlp/cnn_dailymail.py +++ b/validmind/datasets/nlp/cnn_dailymail.py @@ -4,6 +4,7 @@ import os import textwrap +from typing import Tuple, Optional import pandas as pd from datasets import load_dataset @@ -22,7 +23,7 @@ dataset_path = os.path.join(current_path, "datasets") -def load_data(source="online", dataset_size=None): +def load_data(source: str = "online", dataset_size: Optional[str] = None) -> Tuple[pd.DataFrame, pd.DataFrame]: """ Load data from either online source or offline files. @@ -31,7 +32,7 @@ def load_data(source="online", dataset_size=None): dataset_size: Applicable if source is 'offline'. '300k' or '500k' for dataset size. Defaults to None. Returns: - DataFrame containing the loaded data. + Tuple containing (train_df, test_df) DataFrames with the loaded data. """ if source == "online": # Load online data without predictions diff --git a/validmind/datasets/regression/__init__.py b/validmind/datasets/regression/__init__.py index 649b225c8..045e201c8 100644 --- a/validmind/datasets/regression/__init__.py +++ b/validmind/datasets/regression/__init__.py @@ -6,14 +6,15 @@ Entrypoint for regression datasets """ import pandas as pd +from typing import List -__all__ = [ +__all__: List[str] = [ "fred", "lending_club", ] -def identify_frequencies(df): +def identify_frequencies(df: pd.DataFrame) -> pd.DataFrame: """ Identify the frequency of each series in the DataFrame. @@ -39,7 +40,17 @@ def identify_frequencies(df): return freq_df -def resample_to_common_frequency(df, common_frequency="MS"): +def resample_to_common_frequency(df: pd.DataFrame, common_frequency: str = "MS") -> pd.DataFrame: + """ + Resample time series data to a common frequency. + + Args: + df: Time-series DataFrame. + common_frequency: Target frequency for resampling. Defaults to "MS" (month start). + + Returns: + DataFrame with data resampled to the common frequency. + """ # Make sure the index is a datetime index if not isinstance(df.index, pd.DatetimeIndex): df.index = pd.to_datetime(df.index) diff --git a/validmind/logging.py b/validmind/logging.py index 15c16c936..0da16e880 100644 --- a/validmind/logging.py +++ b/validmind/logging.py @@ -7,6 +7,7 @@ import logging import os import time +from typing import Any, Callable, Dict, Optional, TypeVar, Union, Awaitable import sentry_sdk from sentry_sdk.utils import event_from_exception, exc_info_from_error @@ -16,7 +17,7 @@ __dsn = "https://48f446843657444aa1e2c0d716ef864b@o1241367.ingest.sentry.io/4505239625465856" -def _get_log_level(): +def _get_log_level() -> int: """Get the log level from the environment variable""" log_level_str = os.getenv("LOG_LEVEL", "INFO").upper() @@ -26,7 +27,10 @@ def _get_log_level(): return logging.getLevelName(log_level_str) -def get_logger(name="validmind", log_level=None): +def get_logger( + name: str = "validmind", + log_level: Optional[int] = None +) -> logging.Logger: """Get a logger for the given module name""" formatter = logging.Formatter( fmt="%(asctime)s - %(levelname)s(%(name)s): %(message)s" @@ -52,7 +56,7 @@ def get_logger(name="validmind", log_level=None): return logger -def init_sentry(server_config): +def init_sentry(server_config: Dict[str, Any]) -> None: """Initialize Sentry SDK for sending logs back to ValidMind This will usually only be called by the api_client module to initialize the @@ -60,10 +64,13 @@ def init_sentry(server_config): and other config options will be returned by the API. Args: - config (dict): The config dictionary returned by the API + server_config (Dict[str, Any]): The config dictionary returned by the API - send_logs (bool): Whether to send logs to Sentry (gets removed) - dsn (str): The Sentry DSN ...: Other config options for Sentry + + Returns: + None """ if os.getenv("VM_NO_TELEMETRY", False): return @@ -88,7 +95,14 @@ def init_sentry(server_config): logger.debug(f"Sentry error: {str(e)}") -def log_performance(name=None, logger=None, force=False): +F = TypeVar('F', bound=Callable[..., Any]) +AF = TypeVar('AF', bound=Callable[..., Awaitable[Any]]) + +def log_performance( + name: Optional[str] = None, + logger: Optional[logging.Logger] = None, + force: bool = False +) -> Callable[[F], F]: """Decorator to log the time it takes to run a function Args: @@ -97,10 +111,9 @@ def log_performance(name=None, logger=None, force=False): force (bool, optional): Whether to force logging even if env var is off Returns: - function: The decorated function + Callable: The decorated function """ - - def decorator(func): + def decorator(func: F) -> F: # check if log level is set to debug if _get_log_level() != logging.DEBUG and not force: return func @@ -113,7 +126,7 @@ def decorator(func): if name is None: name = func.__name__ - def wrapped(*args, **kwargs): + def wrapped(*args: Any, **kwargs: Any) -> Any: time1 = time.perf_counter() return_val = func(*args, **kwargs) time2 = time.perf_counter() @@ -123,22 +136,16 @@ def wrapped(*args, **kwargs): return return_val return wrapped - return decorator -async def log_performance_async(func, name=None, logger=None, force=False): - """Decorator to log the time it takes to run an async function - - Args: - func (function): The function to decorate - name (str, optional): The name of the function. Defaults to None. - logger (logging.Logger, optional): The logger to use. Defaults to None. - force (bool, optional): Whether to force logging even if env var is off - - Returns: - function: The decorated function - """ +async def log_performance_async( + func: AF, + name: Optional[str] = None, + logger: Optional[logging.Logger] = None, + force: bool = False +) -> AF: + """Async version of log_performance decorator""" # check if log level is set to debug if _get_log_level() != logging.DEBUG and not force: return func @@ -149,7 +156,7 @@ async def log_performance_async(func, name=None, logger=None, force=False): if name is None: name = func.__name__ - async def wrap(*args, **kwargs): + async def wrap(*args: Any, **kwargs: Any) -> Any: time1 = time.perf_counter() return_val = await func(*args, **kwargs) time2 = time.perf_counter() @@ -161,7 +168,7 @@ async def wrap(*args, **kwargs): return wrap -def send_single_error(error: Exception): +def send_single_error(error: Exception) -> None: """Send a single error to Sentry Args: diff --git a/validmind/models/foundation.py b/validmind/models/foundation.py index 7ef694887..2b4979ecc 100644 --- a/validmind/models/foundation.py +++ b/validmind/models/foundation.py @@ -26,9 +26,9 @@ class FoundationModel(FunctionModel): Attributes: predict_fn (callable): The predict function that should take a prompt as input - and return the result from the model + and return the result from the model prompt (Prompt): The prompt object that defines the prompt template and the - variables (if any) + variables (if any) name (str, optional): The name of the model. Defaults to name of the predict_fn """ diff --git a/validmind/models/function.py b/validmind/models/function.py index d373b3b16..730325653 100644 --- a/validmind/models/function.py +++ b/validmind/models/function.py @@ -3,6 +3,7 @@ # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial from validmind.vm_models.model import VMModel +from typing import Dict, Any, List # semi-immutable dict @@ -18,7 +19,12 @@ def __setitem__(self, key, value): def __delitem__(self, _): raise TypeError("Cannot delete keys from Input") - def get_new(self): + def get_new(self) -> Dict[str, Any]: + """Get the newly added key-value pairs. + + Returns: + Dict[str, Any]: Dictionary containing only the newly added key-value pairs. + """ return {k: self[k] for k in self._new} @@ -41,13 +47,13 @@ def __post_init__(self): self.name = self.name or self.predict_fn.__name__ - def predict(self, X): + def predict(self, X) -> List[Any]: """Compute predictions for the input (X) Args: X (pandas.DataFrame): The input features to predict on Returns: - list: The predictions + List[Any]: The predictions """ return [self.predict_fn(x) for x in X.to_dict(orient="records")] diff --git a/validmind/template.py b/validmind/template.py index 757c9e962..758bfa986 100644 --- a/validmind/template.py +++ b/validmind/template.py @@ -3,6 +3,8 @@ # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial from ipywidgets import HTML, Accordion, VBox +from typing import Any, Dict, List, Optional, Union +from ipywidgets import Widget from .html_templates.content_blocks import ( failed_content_block_html, @@ -29,8 +31,10 @@ def _convert_sections_to_section_tree( - sections, parent_id="_root_", start_section_id=None -): + sections: List[Dict[str, Any]], + parent_id: str = "_root_", + start_section_id: Optional[str] = None +) -> List[Dict[str, Any]]: section_tree = [] for section in sections: @@ -53,7 +57,7 @@ def _convert_sections_to_section_tree( return sorted(section_tree, key=lambda x: x.get("order", 0)) -def _create_content_widget(content): +def _create_content_widget(content: Dict[str, Any]) -> Widget: content_type = CONTENT_TYPE_MAP[content["content_type"]] if content["content_type"] not in ["metric", "test"]: @@ -75,7 +79,10 @@ def _create_content_widget(content): ) -def _create_sub_section_widget(sub_sections, section_number): +def _create_sub_section_widget( + sub_sections: List[Dict[str, Any]], + section_number: str +) -> Union[HTML, Accordion]: if not sub_sections: return HTML("

Empty Section

") @@ -111,7 +118,7 @@ def _create_sub_section_widget(sub_sections, section_number): return accordion -def _create_section_widget(tree): +def _create_section_widget(tree: List[Dict[str, Any]]) -> Accordion: widget = Accordion() for i, section in enumerate(tree): sub_widget = None @@ -139,7 +146,7 @@ def _create_section_widget(tree): return widget -def preview_template(template): +def preview_template(template: str) -> None: """Preview a template in Jupyter Notebook Args: @@ -154,7 +161,7 @@ def preview_template(template): ) -def _get_section_tests(section): +def _get_section_tests(section: Dict[str, Any]) -> List[str]: """ Get all the tests in a section and its subsections. @@ -179,7 +186,7 @@ def _get_section_tests(section): return tests -def _create_test_suite_section(section): +def _create_test_suite_section(section: Dict[str, Any]) -> Dict[str, Any]: """Create a section object for a test suite that contains the tests in a section in the template @@ -197,7 +204,10 @@ def _create_test_suite_section(section): } -def _create_template_test_suite(template, section=None): +def _create_template_test_suite( + template: str, + section: Optional[str] = None +) -> Dict[str, Any]: """ Create and run a test suite from a template. @@ -229,7 +239,10 @@ def _create_template_test_suite(template, section=None): ) -def get_template_test_suite(template, section=None): +def get_template_test_suite( + template: str, + section: Optional[str] = None +) -> TestSuite: """Get a TestSuite instance containing all tests in a template This function will collect all tests used in a template into a dynamically-created diff --git a/validmind/test_suites/__init__.py b/validmind/test_suites/__init__.py index 0c4b3adae..cd09d3968 100644 --- a/validmind/test_suites/__init__.py +++ b/validmind/test_suites/__init__.py @@ -141,7 +141,7 @@ def list_suites(pretty: bool = True): return format_dataframe(pd.DataFrame(table)) -def describe_suite(test_suite_id: str, verbose=False): +def describe_suite(test_suite_id: str, verbose: bool = False) -> pd.DataFrame: """ Describes a Test Suite by ID @@ -150,7 +150,7 @@ def describe_suite(test_suite_id: str, verbose=False): verbose: If True, describe all plans and tests in the Test Suite Returns: - pandas.DataFrame: A formatted table with the Test Suite description + pd.DataFrame: A formatted table with the Test Suite description """ test_suite = get_by_id(test_suite_id) diff --git a/validmind/tests/_store.py b/validmind/tests/_store.py index c0da5179e..9103bff47 100644 --- a/validmind/tests/_store.py +++ b/validmind/tests/_store.py @@ -6,6 +6,7 @@ from .test_providers import TestProvider, ValidMindTestProvider +from typing import Any, Callable, Optional def singleton(cls): @@ -65,19 +66,24 @@ class TestStore: def __init__(self): self.tests = {} - def get_test(self, test_id: str): + def get_test(self, test_id: str) -> Optional[Callable[..., Any]]: """Get a test by test ID Args: test_id (str): The test ID Returns: - object: The test class or function + Optional[Callable[..., Any]]: The test function if found, None otherwise """ return self.tests.get(test_id) - def register_test(self, test_id: str, test: object = None): - """Register a test""" + def register_test(self, test_id: str, test: Optional[Callable[..., Any]] = None) -> None: + """Register a test + + Args: + test_id (str): The test ID + test (Optional[Callable[..., Any]], optional): The test function. Defaults to None. + """ self.tests[test_id] = test diff --git a/validmind/tests/decorator.py b/validmind/tests/decorator.py index 9ca1af087..4abb71c5c 100644 --- a/validmind/tests/decorator.py +++ b/validmind/tests/decorator.py @@ -7,6 +7,7 @@ import inspect import os from functools import wraps +from typing import Any, Callable, List, Optional, Union, TypeVar from validmind.logging import get_logger @@ -15,8 +16,10 @@ logger = get_logger(__name__) +F = TypeVar('F', bound=Callable[..., Any]) -def _get_save_func(func, test_id): + +def _get_save_func(func: Callable[..., Any], test_id: str) -> Callable[..., None]: """Helper function to save a decorated function to a file Useful when a custom test function has been created inline in a notebook or @@ -29,7 +32,7 @@ def _get_save_func(func, test_id): # remove decorator line source = source.split("\n", 1)[1] - def save(root_folder=".", imports=None): + def save(root_folder: str = ".", imports: Optional[List[str]] = None) -> None: parts = test_id.split(".") if len(parts) > 1: @@ -84,7 +87,7 @@ def save(root_folder=".", imports=None): return save -def test(func_or_id): +def test(func_or_id: Union[Callable[..., Any], str, None]) -> Callable[[F], F]: """Decorator for creating and registering custom tests This decorator registers the function it wraps as a test function within ValidMind @@ -109,14 +112,14 @@ def test(func_or_id): as the metric's description. Args: - func: The function to decorate - test_id: The identifier for the metric. If not provided, the function name is used. + func_or_id (Union[Callable[..., Any], str, None]): Either the function to decorate + or the test ID. If None, the function name is used. Returns: - The decorated function. + Callable[[F], F]: The decorated function. """ - def decorator(func): + def decorator(func: F) -> F: test_id = func_or_id or f"validmind.custom_metrics.{func.__name__}" test_func = load_test(test_id, func, reload=True) test_store.register_test(test_id, test_func) @@ -136,28 +139,28 @@ def decorator(func): return decorator -def tasks(*tasks): +def tasks(*tasks: str) -> Callable[[F], F]: """Decorator for specifying the task types that a test is designed for. Args: *tasks: The task types that the test is designed for. """ - def decorator(func): + def decorator(func: F) -> F: func.__tasks__ = list(tasks) return func return decorator -def tags(*tags): +def tags(*tags: str) -> Callable[[F], F]: """Decorator for specifying tags for a test. Args: *tags: The tags to apply to the test. """ - def decorator(func): + def decorator(func: F) -> F: func.__tags__ = list(tags) return func diff --git a/validmind/tests/load.py b/validmind/tests/load.py index a1731f27d..4a09c9160 100644 --- a/validmind/tests/load.py +++ b/validmind/tests/load.py @@ -7,7 +7,7 @@ import inspect import json from pprint import pformat -from typing import List +from typing import Any, Callable, Dict, List, Optional, Set, Tuple, Union from uuid import uuid4 import pandas as pd @@ -32,7 +32,8 @@ } -def _inspect_signature(test_func: callable): +def _inspect_signature(test_func: Callable[..., Any]) -> Tuple[Dict[str, Dict[str, Any]], Dict[str, Dict[str, Any]]]: + """Inspect a test function's signature to get inputs and parameters""" inputs = {} params = {} @@ -56,7 +57,11 @@ def _inspect_signature(test_func: callable): return inputs, params -def load_test(test_id: str, test_func: callable = None, reload: bool = False): +def load_test( + test_id: str, + test_func: Optional[Callable[..., Any]] = None, + reload: bool = False +) -> Callable[..., Any]: """Load a test by test ID Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. @@ -109,7 +114,8 @@ def load_test(test_id: str, test_func: callable = None, reload: bool = False): return test_store.get_test(test_id) -def _list_test_ids(): +def _list_test_ids() -> List[str]: + """List all available test IDs""" test_ids = [] for namespace, test_provider in test_provider_store.test_providers.items(): @@ -120,184 +126,111 @@ def _list_test_ids(): return test_ids -def _load_tests(test_ids): +def _load_tests(test_ids: List[str]) -> Dict[str, Callable[..., Any]]: """Load a set of tests, handling missing dependencies.""" tests = {} - for test_id in test_ids: try: tests[test_id] = load_test(test_id) - except LoadTestError as e: - if not e.original_error or not isinstance( - e.original_error, MissingDependencyError - ): - raise e - - e = e.original_error - - logger.debug(str(e)) - - if e.extra: - logger.info( - f"Skipping `{test_id}` as it requires extra dependencies: {e.required_dependencies}." - f" Please run `pip install validmind[{e.extra}]` to view and run this test." - ) - else: - logger.info( - f"Skipping `{test_id}` as it requires missing dependencies: {e.required_dependencies}." - " Please install the missing dependencies to view and run this test." - ) - + except MissingDependencyError as e: + logger.debug(f"Skipping test {test_id} due to missing dependency: {str(e)}") return tests -def _test_description(test_description: str, num_lines: int = 5): - description = test_description.strip("\n").strip() - - if len(description.split("\n")) > num_lines: - return description.strip().split("\n")[0] + "..." +def _test_description(test_description: str, num_lines: int = 5) -> str: + """Format a test description""" + if len(test_description.split("\n")) > num_lines: + return test_description.strip().split("\n")[0] + "..." + return test_description - return description +def _pretty_list_tests(tests: Dict[str, Callable[..., Any]], truncate: bool = True) -> None: + """Pretty print a list of tests""" + for test_id, test_func in sorted(tests.items()): + print(f"\n{test_id_to_name(test_id)}") + if test_func.__doc__: + print(_test_description(test_func.__doc__, 5 if truncate else None)) -def _pretty_list_tests(tests, truncate=True): - table = [ - { - "ID": test_id, - "Name": test_id_to_name(test_id), - "Description": _test_description( - inspect.getdoc(test), - num_lines=(5 if truncate else 999999), - ), - "Required Inputs": list(test.inputs.keys()), - "Params": test.params, - } - for test_id, test in tests.items() - ] - return format_dataframe(pd.DataFrame(table)) +def list_tags() -> Set[str]: + """List all available tags""" + tags = set() + for test_func in test_store.tests.values(): + if hasattr(test_func, "__tags__"): + tags.update(test_func.__tags__) + return tags -def list_tags(): - """ - List unique tags from all test classes. - """ - - unique_tags = set() - - for test in _load_tests(list_tests(pretty=False)).values(): - unique_tags.update(test.__tags__) - - return list(unique_tags) - - -def list_tasks_and_tags(as_json=False): - """ - List all task types and their associated tags, with one row per task type and - all tags for a task type in one row. - - Returns: - pandas.DataFrame: A DataFrame with 'Task Type' and concatenated 'Tags'. - """ - task_tags_dict = {} - - for test in _load_tests(list_tests(pretty=False)).values(): - for task in test.__tasks__: - task_tags_dict.setdefault(task, set()).update(test.__tags__) +def list_tasks_and_tags(as_json: bool = False) -> Union[str, Dict[str, List[str]]]: + """List all available tasks and tags""" + tasks = list(list_tasks()) + tags = list(list_tags()) if as_json: - return task_tags_dict + return json.dumps({"tasks": tasks, "tags": tags}, indent=2) - return format_dataframe( - pd.DataFrame( - [ - {"Task": task, "Tags": ", ".join(tags)} - for task, tags in task_tags_dict.items() - ] - ) - ) - - -def list_tasks(): - """ - List unique tasks from all test classes. - """ - - unique_tasks = set() - - for test in _load_tests(list_tests(pretty=False)).values(): - unique_tasks.update(test.__tasks__) + return { + "tasks": tasks, + "tags": tags, + } - return list(unique_tasks) +def list_tasks() -> Set[str]: + """List all available tasks""" + tasks = set() + for test_func in test_store.tests.values(): + if hasattr(test_func, "__tasks__"): + tasks.update(test_func.__tasks__) + return tasks -def list_tests(filter=None, task=None, tags=None, pretty=True, truncate=True): - """List all tests in the tests directory. - Args: - filter (str, optional): Find tests where the ID, tasks or tags match the - filter string. Defaults to None. - task (str, optional): Find tests that match the task. Can be used to - narrow down matches from the filter string. Defaults to None. - tags (list, optional): Find tests that match list of tags. Can be used to - narrow down matches from the filter string. Defaults to None. - pretty (bool, optional): If True, returns a pandas DataFrame with a - formatted table. Defaults to True. - truncate (bool, optional): If True, truncates the test description to the first - line. Defaults to True. (only used if pretty=True) - - Returns: - list or pandas.DataFrame: A list of all tests or a formatted table. - """ +def list_tests( + filter: Optional[str] = None, + task: Optional[str] = None, + tags: Optional[List[str]] = None, + pretty: bool = True, + truncate: bool = True +) -> Union[Dict[str, Callable[..., Any]], None]: + """List all available tests with optional filtering""" test_ids = _list_test_ids() - # no need to load test funcs (takes a while) if we're just returning the test ids - if not filter and not task and not tags and not pretty: - return test_ids + if filter: + test_ids = [ + test_id + for test_id in test_ids + if fuzzy_match(filter, test_id_to_name(test_id)) + ] tests = _load_tests(test_ids) - # first search by the filter string since it's the most general search - if filter is not None: - tests = { - test_id: test - for test_id, test in tests.items() - if filter.lower() in test_id.lower() - or any(filter.lower() in task.lower() for task in test.__tasks__) - or any(fuzzy_match(tag, filter.lower()) for tag in test.__tags__) - } - - # then filter by task type and tags since they are more specific - if task is not None: + if task: tests = { - test_id: test for test_id, test in tests.items() if task in test.__tasks__ + test_id: test_func + for test_id, test_func in tests.items() + if hasattr(test_func, "__tasks__") and task in test_func.__tasks__ } - if tags is not None: + if tags: tests = { - test_id: test - for test_id, test in tests.items() - if all(tag in test.__tags__ for tag in tags) + test_id: test_func + for test_id, test_func in tests.items() + if hasattr(test_func, "__tags__") + and all(tag in test_func.__tags__ for tag in tags) } - if not pretty: - return list(tests.keys()) + if pretty: + _pretty_list_tests(tests, truncate=truncate) + return None - return _pretty_list_tests(tests, truncate=truncate) - - -def describe_test(test_id: TestID = None, raw: bool = False, show: bool = True): - """Get or show details about the test + return tests - This function can be used to see test details including the test name, description, - required inputs and default params. It can also be used to get a dictionary of the - above information for programmatic use. - Args: - test_id (str, optional): The test ID. Defaults to None. - raw (bool, optional): If True, returns a dictionary with the test details. - Defaults to False. - """ +def describe_test( + test_id: Optional[TestID] = None, + raw: bool = False, + show: bool = True +) -> Union[str, HTML, Dict[str, Any]]: + """Describe a test's functionality and parameters""" test = load_test(test_id) details = { diff --git a/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py b/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py index 0a4d4f442..f8693990e 100644 --- a/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py +++ b/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.py @@ -7,12 +7,18 @@ import plotly.graph_objects as go from plotly.subplots import make_subplots from sklearn.metrics import confusion_matrix, precision_recall_curve, roc_curve +from typing import Dict, List, Optional, Union, Any from validmind import tags, tasks from validmind.vm_models import VMDataset, VMModel -def find_optimal_threshold(y_true, y_prob, method="youden", target_recall=None): +def find_optimal_threshold( + y_true: np.ndarray, + y_prob: np.ndarray, + method: str = "youden", + target_recall: Optional[float] = None +) -> Dict[str, Union[str, float]]: """ Find the optimal classification threshold using various methods. @@ -80,8 +86,11 @@ def find_optimal_threshold(y_true, y_prob, method="youden", target_recall=None): @tags("model_validation", "threshold_optimization", "classification_metrics") @tasks("classification") def ClassifierThresholdOptimization( - dataset: VMDataset, model: VMModel, methods=None, target_recall=None -): + dataset: VMDataset, + model: VMModel, + methods: Optional[List[str]] = None, + target_recall: Optional[float] = None +) -> Dict[str, Union[pd.DataFrame, go.Figure]]: """ Analyzes and visualizes different threshold optimization methods for binary classification models. diff --git a/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py b/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py index a7e162b83..f2c25cbdd 100644 --- a/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py +++ b/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.py @@ -4,10 +4,12 @@ import warnings from warnings import filters as _warnings_filters +from typing import Dict, List, Optional, Union, Any import matplotlib.pyplot as plt import numpy as np import shap +import pandas as pd from validmind import RawData, tags, tasks from validmind.errors import UnsupportedModelForSHAPError @@ -18,7 +20,10 @@ logger = get_logger(__name__) -def select_shap_values(shap_values, class_of_interest): +def select_shap_values( + shap_values: Union[np.ndarray, List[np.ndarray]], + class_of_interest: Optional[int] = None +) -> np.ndarray: """Selects SHAP values for binary or multiclass classification. For regression models, returns the SHAP values directly as there are no classes. @@ -66,7 +71,11 @@ def select_shap_values(shap_values, class_of_interest): return shap_values[class_of_interest] -def generate_shap_plot(type_, shap_values, x_test): +def generate_shap_plot( + type_: str, + shap_values: np.ndarray, + x_test: Union[np.ndarray, pd.DataFrame] +) -> plt.Figure: """Plots two types of SHAP global importance (SHAP). Args: @@ -117,8 +126,8 @@ def SHAPGlobalImportance( dataset: VMDataset, kernel_explainer_samples: int = 10, tree_or_linear_explainer_samples: int = 200, - class_of_interest: int = None, -): + class_of_interest: Optional[int] = None +) -> Dict[str, Union[plt.Figure, Dict[str, float]]]: """ Evaluates and visualizes global feature importance using SHAP values for model explanation and risk identification. @@ -226,8 +235,8 @@ def SHAPGlobalImportance( # restore warnings _warnings_filters.pop(0) - return ( - generate_shap_plot("mean", shap_values, shap_sample), - generate_shap_plot("summary", shap_values, shap_sample), - RawData(shap_values=shap_values, shap_sample=shap_sample), - ) + return { + "mean_importance_plot": generate_shap_plot("mean", shap_values, shap_sample), + "summary_plot": generate_shap_plot("summary", shap_values, shap_sample), + "shap_values": RawData(shap_values=shap_values, shap_sample=shap_sample), + } diff --git a/validmind/tests/run.py b/validmind/tests/run.py index 66dd40e7d..161021150 100644 --- a/validmind/tests/run.py +++ b/validmind/tests/run.py @@ -76,7 +76,7 @@ def _get_run_metadata(**metadata: Dict[str, Any]) -> Dict[str, Any]: def _get_test_kwargs( test_func: callable, inputs: Dict[str, Any], params: Dict[str, Any] -): +) -> Tuple[Dict[str, Any], Dict[str, Any]]: """Insepect function signature to build kwargs to pass the inputs and params that the test function expects @@ -93,7 +93,7 @@ def _get_test_kwargs( params (dict): Test parameters e.g. {"param1": 1, "param2": 2} Returns: - tuple: Tuple of input and param kwargs + Tuple[Dict[str, Any], Dict[str, Any]]: Tuple of input and param kwargs """ input_kwargs = {} # map function inputs (`dataset` etc) to actual objects diff --git a/validmind/tests/test_providers.py b/validmind/tests/test_providers.py index 43064f5f7..44d8746b0 100644 --- a/validmind/tests/test_providers.py +++ b/validmind/tests/test_providers.py @@ -7,7 +7,7 @@ import re import sys from pathlib import Path -from typing import List, Protocol +from typing import List, Protocol, Callable, Any from validmind.logging import get_logger @@ -95,45 +95,38 @@ def __init__(self, root_folder: str): """ self.root_folder = os.path.abspath(root_folder) - def list_tests(self): + def list_tests(self) -> List[str]: """List all tests in the given namespace Returns: list: A list of test IDs """ - test_ids = [] - + test_files = [] for root, _, files in os.walk(self.root_folder): - for filename in files: - if not filename.endswith(".py") or filename.startswith("__"): - continue - - path = Path(root) / filename - if not _is_test_file(path): + for file in files: + if not file.endswith(".py"): continue - rel_path = path.relative_to(self.root_folder) + path = Path(os.path.join(root, file)) + if _is_test_file(path): + rel_path = os.path.relpath(path, self.root_folder) + test_id = os.path.splitext(rel_path)[0].replace(os.sep, ".") + test_files.append(test_id) - test_id_parts = [p.stem for p in rel_path.parents if p.stem][::-1] - test_id_parts.append(path.stem) - test_ids.append(".".join(test_id_parts)) + return test_files - return sorted(test_ids) - - def load_test(self, test_id: str): - """ - Load the test identified by the given test_id. + def load_test(self, test_id: str) -> Callable[..., Any]: + """Load the test function identified by the given test_id Args: - test_id (str): The identifier of the test. This corresponds to the relative - path of the python file from the root folder, with slashes replaced by dots + test_id (str): The test ID (does not contain the namespace under which + the test is registered) Returns: - The test class that matches the last part of the test_id. + callable: The test function Raises: - LocalTestProviderLoadModuleError: If the test module cannot be imported - LocalTestProviderLoadTestError: If the test class cannot be found in the module + FileNotFoundError: If the test is not found """ # Convert test_id to file path file_path = os.path.join(self.root_folder, f"{test_id.replace('.', '/')}.py") @@ -162,28 +155,23 @@ def load_test(self, test_id: str): class ValidMindTestProvider: - """Test provider for ValidMind tests""" + """Provider for built-in ValidMind tests""" - def __init__(self): + def __init__(self) -> None: # two subproviders: unit_metrics and normal tests - self.metrics_provider = LocalTestProvider( + self.unit_metrics_provider = LocalTestProvider( os.path.join(os.path.dirname(__file__), "..", "unit_metrics") ) - self.tests_provider = LocalTestProvider(os.path.dirname(__file__)) + self.test_provider = LocalTestProvider(os.path.dirname(__file__)) def list_tests(self) -> List[str]: - """List all tests in the ValidMind test provider""" - metric_ids = [ - f"unit_metrics.{test}" for test in self.metrics_provider.list_tests() - ] - test_ids = self.tests_provider.list_tests() - - return metric_ids + test_ids + """List all tests in the given namespace""" + return self.unit_metrics_provider.list_tests() + self.test_provider.list_tests() - def load_test(self, test_id: str) -> callable: - """Load a ValidMind test or unit metric""" + def load_test(self, test_id: str) -> Callable[..., Any]: + """Load the test function identified by the given test_id""" return ( - self.metrics_provider.load_test(test_id.replace("unit_metrics.", "")) + self.unit_metrics_provider.load_test(test_id.replace("unit_metrics.", "")) if test_id.startswith("unit_metrics.") - else self.tests_provider.load_test(test_id) + else self.test_provider.load_test(test_id) ) diff --git a/validmind/tests/utils.py b/validmind/tests/utils.py index fa12c1a84..e2fdce465 100644 --- a/validmind/tests/utils.py +++ b/validmind/tests/utils.py @@ -5,6 +5,7 @@ """Test Module Utils""" import inspect +from typing import Any, Optional, Tuple, Union, Type import numpy as np import pandas as pd @@ -14,7 +15,7 @@ logger = get_logger(__name__) -def test_description(test_class, truncate=True): +def test_description(test_class: Type[Any], truncate: bool = True) -> str: description = inspect.getdoc(test_class).strip() if truncate and len(description.split("\n")) > 5: @@ -23,7 +24,11 @@ def test_description(test_class, truncate=True): return description -def remove_nan_pairs(y_true, y_pred, dataset_id=None): +def remove_nan_pairs( + y_true: Union[np.ndarray, list], + y_pred: Union[np.ndarray, list], + dataset_id: Optional[str] = None +) -> Tuple[np.ndarray, np.ndarray]: """ Remove pairs where either true or predicted values are NaN/None. Args: @@ -52,7 +57,11 @@ def remove_nan_pairs(y_true, y_pred, dataset_id=None): return y_true, y_pred -def ensure_equal_lengths(y_true, y_pred, dataset_id=None): +def ensure_equal_lengths( + y_true: Union[np.ndarray, list], + y_pred: Union[np.ndarray, list], + dataset_id: Optional[str] = None +) -> Tuple[np.ndarray, np.ndarray]: """ Check if true and predicted values have matching lengths, log warning if they don't, and truncate to the shorter length if necessary. Also removes any NaN/None values. @@ -82,7 +91,11 @@ def ensure_equal_lengths(y_true, y_pred, dataset_id=None): return y_true, y_pred -def validate_prediction(y_true, y_pred, dataset_id=None): +def validate_prediction( + y_true: Union[np.ndarray, list], + y_pred: Union[np.ndarray, list], + dataset_id: Optional[str] = None +) -> Tuple[np.ndarray, np.ndarray]: """ Comprehensive validation of true and predicted value pairs. Handles NaN/None values and length mismatches. diff --git a/validmind/utils.py b/validmind/utils.py index 77c448983..f0de30c60 100644 --- a/validmind/utils.py +++ b/validmind/utils.py @@ -12,7 +12,7 @@ import warnings from datetime import date, datetime, time from platform import python_version -from typing import Any, Dict, List +from typing import Any, Dict, List, Optional, TypeVar, Union, Callable, Awaitable import matplotlib.pylab as pylab import mistune @@ -59,6 +59,7 @@ logger = get_logger(__name__) +T = TypeVar('T') def parse_version(version: str) -> tuple[int, ...]: """ @@ -355,7 +356,12 @@ def format_dataframe(df: pd.DataFrame) -> pd.DataFrame: return df.set_table_styles([dict(selector="th", props=[("text-align", "left")])]) -def run_async(func, *args, name=None, **kwargs): +def run_async( + func: Callable[..., Awaitable[T]], + *args: Any, + name: Optional[str] = None, + **kwargs: Any +) -> T: """Helper function to run functions asynchronously This takes care of the complexity of running the logging functions asynchronously. It will @@ -363,8 +369,9 @@ def run_async(func, *args, name=None, **kwargs): function accordingly. Args: - func (function): The function to run asynchronously + func: The function to run asynchronously *args: The arguments to pass to the function + name: Optional name for the task **kwargs: The keyword arguments to pass to the function Returns: @@ -386,8 +393,21 @@ def run_async(func, *args, name=None, **kwargs): return asyncio.get_event_loop().run_until_complete(func(*args, **kwargs)) -def run_async_check(func, *args, **kwargs): - """Helper function to run functions asynchronously if the task doesn't already exist""" +def run_async_check( + func: Callable[..., Awaitable[T]], + *args: Any, + **kwargs: Any +) -> Optional[asyncio.Task[T]]: + """Helper function to run functions asynchronously if the task doesn't already exist + + Args: + func: The function to run asynchronously + *args: The arguments to pass to the function + **kwargs: The keyword arguments to pass to the function + + Returns: + Optional[asyncio.Task[T]]: The task if created or found, None otherwise + """ if __loop: return # we don't need this if we are using our own loop @@ -404,7 +424,7 @@ def run_async_check(func, *args, **kwargs): pass -def fuzzy_match(string: str, search_string: str, threshold=0.7): +def fuzzy_match(string: str, search_string: str, threshold: float = 0.7) -> bool: """Check if a string matches another string using fuzzy matching Args: @@ -413,7 +433,7 @@ def fuzzy_match(string: str, search_string: str, threshold=0.7): threshold (float): The similarity threshold to use (Default: 0.7) Returns: - True if the string matches the search string, False otherwise + bool: True if the string matches the search string, False otherwise """ score = difflib.SequenceMatcher(None, string, search_string).ratio() diff --git a/validmind/vm_models/dataset/dataset.py b/validmind/vm_models/dataset/dataset.py index 25b65f70d..d04d9235d 100644 --- a/validmind/vm_models/dataset/dataset.py +++ b/validmind/vm_models/dataset/dataset.py @@ -8,6 +8,7 @@ import warnings from copy import deepcopy +from typing import Any, Dict, List, Optional, Union import numpy as np import pandas as pd @@ -200,7 +201,7 @@ def _validate_assign_predictions( "Cannot use precomputed probabilities without precomputed predictions" ) - def with_options(self, **kwargs) -> "VMDataset": + def with_options(self, **kwargs: Dict[str, Any]) -> "VMDataset": """Support options provided when passing an input to run_test or run_test_suite Example: @@ -253,23 +254,23 @@ def with_options(self, **kwargs) -> "VMDataset": def assign_predictions( self, model: VMModel, - prediction_column: str = None, - prediction_values: list = None, - probability_column: str = None, - probability_values: list = None, - prediction_probabilities: list = None, # DEPRECATED: use probability_values - **kwargs, - ): + prediction_column: Optional[str] = None, + prediction_values: Optional[List[Any]] = None, + probability_column: Optional[str] = None, + probability_values: Optional[List[float]] = None, + prediction_probabilities: Optional[List[float]] = None, # DEPRECATED: use probability_values + **kwargs: Dict[str, Any] + ) -> None: """Assign predictions and probabilities to the dataset. Args: model (VMModel): The model used to generate the predictions. - prediction_column (str, optional): The name of the column containing the predictions. Defaults to None. - prediction_values (list, optional): The values of the predictions. Defaults to None. - probability_column (str, optional): The name of the column containing the probabilities. Defaults to None. - probability_values (list, optional): The values of the probabilities. Defaults to None. - prediction_probabilities (list, optional): DEPRECATED: The values of the probabilities. Defaults to None. - kwargs: Additional keyword arguments that will get passed through to the model's `predict` method. + prediction_column (Optional[str]): The name of the column containing the predictions. + prediction_values (Optional[List[Any]]): The values of the predictions. + probability_column (Optional[str]): The name of the column containing the probabilities. + probability_values (Optional[List[float]]): The values of the probabilities. + prediction_probabilities (Optional[List[float]]): DEPRECATED: The values of the probabilities. + **kwargs: Additional keyword arguments that will get passed through to the model's `predict` method. """ if prediction_probabilities is not None: warnings.warn( diff --git a/validmind/vm_models/input.py b/validmind/vm_models/input.py index bebd74219..399f2cf17 100644 --- a/validmind/vm_models/input.py +++ b/validmind/vm_models/input.py @@ -5,6 +5,7 @@ """Base class for ValidMind Input types""" from abc import ABC +from typing import Any, Dict class VMInput(ABC): @@ -12,7 +13,7 @@ class VMInput(ABC): Base class for ValidMind Input types """ - def with_options(self, **kwargs) -> "VMInput": + def with_options(self, **kwargs: Dict[str, Any]) -> "VMInput": """ Allows for setting options on the input object that are passed by the user when using the input to run a test or set of tests diff --git a/validmind/vm_models/result/result.py b/validmind/vm_models/result/result.py index 9016c6bb0..37b2783b2 100644 --- a/validmind/vm_models/result/result.py +++ b/validmind/vm_models/result/result.py @@ -45,7 +45,7 @@ class RawData: """Holds raw data for a test result""" - def __init__(self, log: bool = False, **kwargs): + def __init__(self, log: bool = False, **kwargs: Any) -> None: """Create a new RawData object Args: @@ -61,8 +61,15 @@ def __init__(self, log: bool = False, **kwargs): def __repr__(self) -> str: return f"RawData({', '.join(self.__dict__.keys())})" - def inspect(self, show: bool = True): - """Inspect the raw data""" + def inspect(self, show: bool = True) -> Optional[Dict[str, Any]]: + """Inspect the raw data + + Args: + show (bool): If True, print the raw data. If False, return it. + + Returns: + Optional[Dict[str, Any]]: The raw data if show is False, None otherwise + """ raw_data = { key: getattr(self, key) for key in self.__dict__ @@ -73,8 +80,14 @@ def inspect(self, show: bool = True): return raw_data print(json.dumps(raw_data, indent=2, cls=HumanReadableEncoder)) + return None - def serialize(self): + def serialize(self) -> Dict[str, Any]: + """Serialize the raw data to a dictionary + + Returns: + Dict[str, Any]: The serialized raw data + """ return {key: getattr(self, key) for key in self.__dict__} @@ -266,14 +279,19 @@ def add_figure( bytes, Figure, ], - ): - """Add a new figure to the result + ) -> None: + """Add a new figure to the result. Args: - figure (Union[matplotlib.figure.Figure, go.Figure, go.FigureWidget, - bytes, Figure]): The figure to add (can be either a VM Figure object, - a raw figure object from the supported libraries, or a png image as - raw bytes) + figure: The figure to add. Can be one of: + - matplotlib.figure.Figure: A matplotlib figure + - plotly.graph_objs.Figure: A plotly figure + - plotly.graph_objs.FigureWidget: A plotly figure widget + - bytes: A PNG image as raw bytes + - validmind.vm_models.figure.Figure: A ValidMind figure object + + Returns: + None """ if self.figures is None: self.figures = [] From 5da00f08f47a4888b0193ff9d474bdd5b39675c8 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 21 Feb 2025 14:55:51 -0800 Subject: [PATCH 101/207] Save point after fixing Python API, did it work? --- docs/validmind.qmd | 58 +++++++++++----- .../classification/customer_churn.qmd | 6 +- .../datasets/classification/taiwan_credit.qmd | 6 +- .../datasets/credit_risk/lending_club.qmd | 14 ++-- docs/validmind/datasets/nlp/cnn_dailymail.qmd | 4 +- docs/validmind/test_suites.qmd | 4 +- docs/validmind/tests.qmd | 69 ++++++------------- docs/validmind/tests/data_validation/ADF.qmd | 2 +- .../tests/data_validation/AutoAR.qmd | 2 +- .../tests/data_validation/AutoMA.qmd | 2 +- .../data_validation/DatasetDescription.qmd | 2 +- .../tests/data_validation/DickeyFullerGLS.qmd | 2 +- docs/validmind/tests/data_validation/KPSS.qmd | 2 +- .../data_validation/PhillipsPerronArch.qmd | 2 +- .../ProtectedClassesCombination.qmd | 2 +- .../ProtectedClassesDescription.qmd | 2 +- .../ProtectedClassesDisparity.qmd | 2 +- .../ProtectedClassesThresholdOptimizer.qmd | 2 +- .../data_validation/SeasonalDecompose.qmd | 2 +- .../data_validation/TimeSeriesHistogram.qmd | 2 +- .../tests/data_validation/WOEBinPlots.qmd | 2 +- .../data_validation/ZivotAndrewsArch.qmd | 2 +- .../tests/model_validation/BertScore.qmd | 2 +- .../tests/model_validation/BleuScore.qmd | 2 +- .../model_validation/ContextualRecall.qmd | 2 +- .../tests/model_validation/FeaturesAUC.qmd | 2 +- .../tests/model_validation/MeteorScore.qmd | 2 +- .../tests/model_validation/RegardScore.qmd | 2 +- .../ClassifierThresholdOptimization.qmd | 4 +- .../sklearn/OverfitDiagnosis.qmd | 2 +- .../sklearn/PermutationFeatureImportance.qmd | 2 +- .../sklearn/PopulationStabilityIndex.qmd | 2 +- .../sklearn/RegressionErrorsComparison.qmd | 2 +- .../sklearn/RegressionPerformance.qmd | 2 +- .../sklearn/RobustnessDiagnosis.qmd | 2 +- .../sklearn/SHAPGlobalImportance.qmd | 8 +-- .../statsmodels/AutoARIMA.qmd | 2 +- .../RegressionFeatureSignificance.qmd | 2 +- .../RegressionModelForecastPlot.qmd | 2 +- .../RegressionModelSensitivityPlot.qmd | 2 +- ...RegressionPermutationFeatureImportance.qmd | 2 +- docs/validmind/vm_models.qmd | 18 ++--- 42 files changed, 124 insertions(+), 131 deletions(-) diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 966a8d7e6..4120abb74 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -55,7 +55,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -defget_test_suite(test_suite_id:str=None,section:str=None,\*args,\*\*kwargs)validmind.vm_models.TestSuite: +defget_test_suite(test_suite_id:Optional\[str\]=None,section:Optional\[str\]=None,\*args:Any,\*\*kwargs:Any)validmind.vm_models.TestSuite: ::: @@ -108,7 +108,7 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -definit_dataset(dataset,model=None,index=None,index_name:str=None,date_time_index:bool=False,columns:list=None,text_column:str=None,target_column:str=None,feature_columns:list=None,extra_columns:dict=None,class_labels:dict=None,type:str=None,input_id:str=None,\_\_log=True)validmind.vm_models.VMDataset: +definit_dataset(dataset:Union\[pd.DataFrame, pl.DataFrame, np.ndarray, torch.utils.data.Dataset\],model:Optional\[VMModel\]=None,index:Optional\[Any\]=None,index_name:Optional\[str\]=None,date_time_index:bool=False,columns:Optional\[List\[str\]\]=None,text_column:Optional\[str\]=None,target_column:Optional\[str\]=None,feature_columns:Optional\[List\[str\]\]=None,extra_columns:Optional\[Dict\[str, Any\]\]=None,class_labels:Optional\[Dict\[str, Any\]\]=None,type:Optional\[str\]=None,input_id:Optional\[str\]=None,\_\_log:bool=True)validmind.vm_models.VMDataset: ::: @@ -127,13 +127,18 @@ The following dataset types are supported: - `dataset`: Dataset from various Python libraries - `model` (VMModel): ValidMind model object -- `targets` (vm.vm.DatasetTargets): A list of target variables +- `index` (Any): Index for the dataset +- `index_name` (str): Name of the index column +- `date_time_index` (bool): Whether the index is a datetime index +- `columns` (List[str]): List of column names +- `text_column` (str): Name of the text column - `target_column` (str): The name of the target column in the dataset -- `feature_columns` (list): A list of names of feature columns in the dataset -- `extra_columns` (dictionary): A dictionary containing the names of the prediction_column and group_by_columns in the dataset -- `class_labels` (dict): A list of class labels for classification problems -- `type` (str): The type of dataset (one of DATASET_TYPES) +- `feature_columns` (List[str]): A list of names of feature columns in the dataset +- `extra_columns` (Dict[str, Any]): A dictionary containing the names of the prediction_column and group_by_columns in the dataset +- `class_labels` (Dict[str, Any]): A list of class labels for classification problems +- `type` (str): The type of dataset (one of DATASET_TYPES) - DEPRECATED - `input_id` (str): The input ID for the dataset (e.g. "my_dataset"). By default, this will be set to `dataset` but if you are passing this dataset as a test input using some other key than `dataset`, then you should set this to the same key. +- `__log` (bool, optional): Whether to log the input. Defaults to True. **Returns** @@ -149,7 +154,7 @@ The following dataset types are supported: ::: {.signature} -definit_model(model:object=None,input_id:str='model',attributes:dict=None,predict_fn:callable=None,\_\_log=True,\*\*kwargs)validmind.vm_models.VMModel: +definit_model(model:Optional\[object\]=None,input_id:str='model',attributes:Optional\[Dict\[str, Any\]\]=None,predict_fn:Optional\[Callable\]=None,\_\_log:bool=True,\*\*kwargs:Any)validmind.vm_models.VMModel: ::: @@ -199,7 +204,7 @@ LogisticRegression and LinearRegression models are converted to sklearn models b **Arguments** - `model_path` (str): The path to the R model saved as an RDS or XGB file -- `model_type` (str): The type of the model (one of R_MODEL_TYPES) +- `input_id` (str, optional): The input ID for the model. Defaults to "model". **Returns** @@ -286,7 +291,7 @@ Reconnect to the ValidMind API and reload the project configuration ::: {.signature} -defrun_documentation_tests(section=None,send=True,fail_fast=False,inputs=None,config=None,\*\*kwargs): +defrun_documentation_tests(section:Optional\[str\]=None,send:bool=True,fail_fast:bool=False,inputs:Optional\[Dict\[str, Any\]\]=None,config:Optional\[Dict\[str, Any\]\]=None,\*\*kwargs:Any)Dict\[str, Any\]: ::: @@ -319,7 +324,7 @@ This function will analyze the current project's documentation template and coll ::: {.signature} -defrun_test_suite(test_suite_id,send=True,fail_fast=False,config=None,inputs=None,\*\*kwargs): +defrun_test_suite(test_suite_id:str,send:bool=True,fail_fast:bool=False,config:Optional\[Dict\[str, Any\]\]=None,inputs:Optional\[Dict\[str, Any\]\]=None,\*\*kwargs:Any)Dict\[str, Any\]: ::: @@ -352,7 +357,7 @@ This function provides a high level interface for running a test suite. A test s ::: {.signature} -deftags(\*tags): +deftags(\*tags:str)Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: ::: @@ -370,7 +375,7 @@ Decorator for specifying tags for a test. ::: {.signature} -deftasks(\*tasks): +deftasks(\*tasks:str)Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: ::: @@ -388,7 +393,7 @@ Decorator for specifying the task types that a test is designed for. ::: {.signature} -deftest(func_or_id): +deftest(func_or_id:Union\[Callable\[..., Any\], str, None\])Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: ::: @@ -414,8 +419,7 @@ The function may also include a docstring. This docstring will be used and logge **Arguments** -- `func`: The function to decorate -- `test_id`: The identifier for the metric. If not provided, the function name is used. +- `func_or_id` (Union\[Callable[..., Any], str, None\]): Either the function to decorate or the test ID. If None, the function name is used. **Returns** @@ -445,7 +449,7 @@ Holds raw data for a test result ::: {.signature} -RawData(log:bool=False,\*\*kwargs) +RawData(log:bool=False,\*\*kwargs:Any) ::: @@ -466,7 +470,7 @@ Create a new RawData object ::: {.signature} -definspect(self,show:bool=True): +definspect(self,show:bool=True)Optional\[Dict\[str, Any\]\]: ::: @@ -474,6 +478,14 @@ Create a new RawData object Inspect the raw data +**Arguments** + +- `show` (bool): If True, print the raw data. If False, return it. + +**Returns** + +- The raw data if show is False, None otherwise + ### serialize() @@ -482,6 +494,14 @@ Inspect the raw data ::: {.signature} -defserialize(self): +defserialize(self)Dict\[str, Any\]: ::: + + + +Serialize the raw data to a dictionary + +**Returns** + +- The serialized raw data diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index 79d3ae119..192137515 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defsimple_preprocess_booleans(df,columns): +defsimple_preprocess_booleans(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -35,7 +35,7 @@ Preprocess boolean columns. ::: {.signature} -defsimple_preprocess_categoricals(df,columns): +defsimple_preprocess_categoricals(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -58,7 +58,7 @@ Preprocess categorical columns. ::: {.signature} -defsimple_preprocess_numericals(df,columns): +defsimple_preprocess_numericals(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index afb9a12f7..ef0af4457 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defsimple_preprocess_booleans(df,columns): +defsimple_preprocess_booleans(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -35,7 +35,7 @@ Preprocess boolean columns. ::: {.signature} -defsimple_preprocess_categoricals(df,columns): +defsimple_preprocess_categoricals(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -58,7 +58,7 @@ Preprocess categorical columns. ::: {.signature} -defsimple_preprocess_numericals(df,columns): +defsimple_preprocess_numericals(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index e8a938ce2..389bd6dbd 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcompute_scores(probabilities): +defcompute_scores(probabilities:np.ndarray)validmind.vm_models.np.validmind.vm_models.ndarray: ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -deffeature_engineering(df,verbose=True): +deffeature_engineering(df:pd.DataFrame,verbose:bool=True)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -38,7 +38,7 @@ toc-expand: 4 ::: {.signature} -defget_demo_test_config(x_test=None,y_test=None): +defget_demo_test_config(x_test:Optional\[np.ndarray\]=None,y_test:Optional\[np.ndarray\]=None)Dict\[str, Any\]: ::: @@ -75,7 +75,7 @@ Get demo test configuration. ::: {.signature} -defload_data(source='online',verbose=True): +defload_data(source:str='online',verbose:bool=True)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -123,7 +123,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -defpreprocess(df,verbose=True): +defpreprocess(df:pd.DataFrame,verbose:bool=True)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -135,7 +135,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -defsplit(df,validation_size=None,test_size=0.2,add_constant=False,verbose=True): +defsplit(df:pd.DataFrame,validation_split:Optional\[float\]=None,test_size:float=0.2,add_constant:bool=False,verbose:bool=True)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: ::: @@ -162,6 +162,6 @@ Split dataset into train, validation (optional), and test sets. ::: {.signature} -defwoe_encoding(df,verbose=True): +defwoe_encoding(df:pd.DataFrame,verbose:bool=True)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index 2f9937472..a2e16fdd5 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -30,7 +30,7 @@ Primary function to format and display a DataFrame. ::: {.signature} -defload_data(source='online',dataset_size=None): +defload_data(source:str='online',dataset_size:Optional\[str\]=None)Tuple\[validmind.vm_models.pd.validmind.vm_models.DataFrame, validmind.vm_models.pd.validmind.vm_models.DataFrame\]: ::: @@ -45,4 +45,4 @@ Load data from either online source or offline files. **Returns** -- DataFrame containing the loaded data. +- Tuple containing (train_df, test_df) DataFrames with the loaded data. diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 7ef7572c8..471d6861d 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -43,7 +43,7 @@ Format a pandas DataFrame for display purposes ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -81,7 +81,7 @@ Convert a test ID to a human-readable name. ::: {.signature} -defdescribe_suite(test_suite_id:str,verbose=False): +defdescribe_suite(test_suite_id:str,verbose:bool=False)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 8ae15f9e2..8dd8295f1 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -20,20 +20,13 @@ ValidMind Tests Module ::: {.signature} -defdescribe_test(test_id:TestID=None,raw:bool=False,show:bool=True): +defdescribe_test(test_id:Optional\[TestID\]=None,raw:bool=False,show:bool=True)Union\[str, validmind.vm_models.HTML, Dict\[str, Any\]\]: ::: -Get or show details about the test - -This function can be used to see test details including the test name, description, required inputs and default params. It can also be used to get a dictionary of the above information for programmatic use. - -**Arguments** - -- `test_id` (str, optional): The test ID. Defaults to None. -- `raw` (bool, optional): If True, returns a dictionary with the test details. Defaults to False. +Describe a test's functionality and parameters ## list_tags() @@ -41,13 +34,13 @@ This function can be used to see test details including the test name, descripti ::: {.signature} -deflist_tags(): +deflist_tags()validmind.vm_models.Set\[str\]: ::: -List unique tags from all test classes. +List all available tags ## list_tasks() @@ -55,13 +48,13 @@ List unique tags from all test classes. ::: {.signature} -deflist_tasks(): +deflist_tasks()validmind.vm_models.Set\[str\]: ::: -List unique tasks from all test classes. +List all available tasks ## list_tasks_and_tags() @@ -69,19 +62,13 @@ List unique tasks from all test classes. ::: {.signature} -deflist_tasks_and_tags(as_json=False): +deflist_tasks_and_tags(as_json:bool=False)Union\[str, Dict\[str, List\[str\]\]\]: ::: -List all task types and their associated tags, with one row per task type and - -all tags for a task type in one row. - -**Returns** - -- A DataFrame with 'Task Type' and concatenated 'Tags'. +List all available tasks and tags ## list_tests() @@ -89,25 +76,13 @@ all tags for a task type in one row. ::: {.signature} -deflist_tests(filter=None,task=None,tags=None,pretty=True,truncate=True): +deflist_tests(filter:Optional\[str\]=None,task:Optional\[str\]=None,tags:Optional\[List\[str\]\]=None,pretty:bool=True,truncate:bool=True)Union\[Dict\[str, Callable\[..., Any\]\], None\]: ::: -List all tests in the tests directory. - -**Arguments** - -- `filter` (str, optional): Find tests where the ID, tasks or tags match the filter string. Defaults to None. -- `task` (str, optional): Find tests that match the task. Can be used to narrow down matches from the filter string. Defaults to None. -- `tags` (list, optional): Find tests that match list of tags. Can be used to narrow down matches from the filter string. Defaults to None. -- `pretty` (bool, optional): If True, returns a pandas DataFrame with a formatted table. Defaults to True. -- `truncate` (bool, optional): If True, truncates the test description to the first line. Defaults to True. (only used if pretty=True) - -**Returns** - -- list or pandas.DataFrame: A list of all tests or a formatted table. +List all available tests with optional filtering ## load_test() @@ -115,7 +90,7 @@ List all tests in the tests directory. ::: {.signature} -defload_test(test_id:str,test_func:callable=None,reload:bool=False): +defload_test(test_id:str,test_func:Optional\[Callable\[..., Any\]\]=None,reload:bool=False)Callable\[..., Any\]: ::: @@ -179,7 +154,7 @@ This function is the main entry point for running tests. It can run simple unit ::: {.signature} -deftags(\*tags): +deftags(\*tags:str)Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: ::: @@ -197,7 +172,7 @@ Decorator for specifying tags for a test. ::: {.signature} -deftasks(\*tasks): +deftasks(\*tasks:str)Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: ::: @@ -215,7 +190,7 @@ Decorator for specifying the task types that a test is designed for. ::: {.signature} -deftest(func_or_id): +deftest(func_or_id:Union\[Callable\[..., Any\], str, None\])Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: ::: @@ -241,8 +216,7 @@ The function may also include a docstring. This docstring will be used and logge **Arguments** -- `func`: The function to decorate -- `test_id`: The identifier for the metric. If not provided, the function name is used. +- `func_or_id` (Union\[Callable[..., Any], str, None\]): Either the function to decorate or the test ID. If None, the function name is used. **Returns** @@ -367,7 +341,7 @@ Initialize the LocalTestProvider with the given root_folder (see class docstring ::: {.signature} -deflist_tests(self): +deflist_tests(self)List\[str\]: ::: @@ -385,26 +359,25 @@ List all tests in the given namespace ::: {.signature} -defload_test(self,test_id:str): +defload_test(self,test_id:str)Callable\[..., Any\]: ::: -Load the test identified by the given test_id. +Load the test function identified by the given test_id **Arguments** -- `test_id` (str): The identifier of the test. This corresponds to the relative path of the python file from the root folder, with slashes replaced by dots +- `test_id` (str): The test ID (does not contain the namespace under which the test is registered) **Returns** -- The test class that matches the last part of the test_id. +- The test function **Raises** -- `LocalTestProviderLoadModuleError`: If the test module cannot be imported -- `LocalTestProviderLoadTestError`: If the test class cannot be found in the module +- `FileNotFoundError`: If the test is not found diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 79f636f04..88556931c 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 5ac9d3bf6..2a04c8219 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index 53d6ea0f2..e30370fe6 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index 01e1d89da..da5163786 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index 15333b98e..d878909d7 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index 36c6de220..b3642262c 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index bb7a17dfa..d78d2ca8f 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index c800e83c2..c9e09c4ce 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index e075c961d..4b81152ed 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index f8b73f0b0..dfd2ec842 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index c10a2c139..802fc87c8 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 2de9457c8..9779a040f 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index dc1a75575..1a1f4c0ad 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index c2334fbcc..c87b7ebed 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 1fdb9fc28..6f32ad336 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 7b6ac47b5..8281786e4 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id=None): +defvalidate_prediction(y_true:Union\[np.ndarray, list\],y_pred:Union\[np.ndarray, list\],dataset_id:Optional\[str\]=None)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: ::: diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index ddade0702..1539a6201 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id=None): +defvalidate_prediction(y_true:Union\[np.ndarray, list\],y_pred:Union\[np.ndarray, list\],dataset_id:Optional\[str\]=None)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: ::: diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 1449f242a..7b053ee9d 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id=None): +defvalidate_prediction(y_true:Union\[np.ndarray, list\],y_pred:Union\[np.ndarray, list\],dataset_id:Optional\[str\]=None)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: ::: diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 9008390de..24320a897 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index bd5a9b7d2..4a67f09b1 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id=None): +defvalidate_prediction(y_true:Union\[np.ndarray, list\],y_pred:Union\[np.ndarray, list\],dataset_id:Optional\[str\]=None)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: ::: diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 286b608fc..754556911 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true,y_pred,dataset_id=None): +defvalidate_prediction(y_true:Union\[np.ndarray, list\],y_pred:Union\[np.ndarray, list\],dataset_id:Optional\[str\]=None)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index a02071e8e..83ec9309c 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -16,7 +16,7 @@ toc-expand: 4 @@tags('model_validation', 'threshold_optimization', 'classification_metrics')@@tasks('classification') -defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods=None,target_recall=None): +defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods:Optional\[List\[str\]\]=None,target_recall:Optional\[float\]=None)Dict\[str, Union\[validmind.vm_models.pd.validmind.vm_models.DataFrame, validmind.vm_models.go.validmind.vm_models.Figure\]\]: ::: @@ -92,7 +92,7 @@ The test implements multiple threshold optimization methods: ::: {.signature} -deffind_optimal_threshold(y_true,y_prob,method='youden',target_recall=None): +deffind_optimal_threshold(y_true:np.ndarray,y_prob:np.ndarray,method:str='youden',target_recall:Optional\[float\]=None)Dict\[str, Union\[str, float\]\]: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index f6b06c0a7..dc5172ea0 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index a724fa8ff..678bbb496 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index fc205b9ae..93ce7dfcc 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index 868d2769b..fe5a7eda9 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index e20c9f145..071acfb4f 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index d1e9f4727..786b3ac5d 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index 50141e23c..bac90205c 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defgenerate_shap_plot(type\_,shap_values,x_test): +defgenerate_shap_plot(type\_:str,shap_values:np.ndarray,x_test:Union\[np.ndarray, pd.DataFrame\])validmind.vm_models.plt.validmind.vm_models.Figure: ::: @@ -54,7 +54,7 @@ Plots two types of SHAP global importance (SHAP). ::: {.signature} -defselect_shap_values(shap_values,class_of_interest): +defselect_shap_values(shap_values:Union\[np.ndarray, List\[np.ndarray\]\],class_of_interest:Optional\[int\]=None)validmind.vm_models.np.validmind.vm_models.ndarray: ::: @@ -87,7 +87,7 @@ For regression models, returns the SHAP values directly as there are no classes. @@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')@@tasks('classification', 'text_classification') -defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:int=None): +defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:Optional\[int\]=None)Dict\[str, Union\[validmind.vm_models.plt.validmind.vm_models.Figure, Dict\[str, float\]\]\]: ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index bdd107db0..a2d8f15cf 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index 58d2346c3..a82b75fe9 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 042ae4ee9..0d3880783 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index b0e29be78..e21e3c9da 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index ec8cf6acb..c2fad2075 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name='validmind',log_level=None): +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index a83fbda7f..8de24140b 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -367,7 +367,7 @@ Adds an extra column to the dataset without modifying the dataset `features` and ::: {.signature} -defassign_predictions(self,model:VMModel,prediction_column:str=None,prediction_values:list=None,probability_column:str=None,probability_values:list=None,prediction_probabilities:list=None,\*\*kwargs): +defassign_predictions(self,model:VMModel,prediction_column:Optional\[str\]=None,prediction_values:Optional\[List\[Any\]\]=None,probability_column:Optional\[str\]=None,probability_values:Optional\[List\[float\]\]=None,prediction_probabilities:Optional\[List\[float\]\]=None,\*\*kwargs:Dict\[str, Any\]): ::: @@ -378,12 +378,12 @@ Assign predictions and probabilities to the dataset. **Arguments** - `model` (VMModel): The model used to generate the predictions. -- `prediction_column` (str, optional): The name of the column containing the predictions. Defaults to None. -- `prediction_values` (list, optional): The values of the predictions. Defaults to None. -- `probability_column` (str, optional): The name of the column containing the probabilities. Defaults to None. -- `probability_values` (list, optional): The values of the probabilities. Defaults to None. -- `prediction_probabilities` (list, optional): DEPRECATED: The values of the probabilities. Defaults to None. -- `kwargs`: Additional keyword arguments that will get passed through to the model's `predict` method. +- `prediction_column` (Optional[str]): The name of the column containing the predictions. +- `prediction_values` (Optional\[List[Any]\]): The values of the predictions. +- `probability_column` (Optional[str]): The name of the column containing the probabilities. +- `probability_values` (Optional\[List[float]\]): The values of the probabilities. +- `prediction_probabilities` (Optional\[List[float]\]): DEPRECATED: The values of the probabilities. +- `**kwargs`: Additional keyword arguments that will get passed through to the model's `predict` method. ### [prediction_column[()]{.muted}](#prediction_column) @@ -433,7 +433,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -defwith_options(self,\*\*kwargs)validmind.vm_models.VMDataset: +defwith_options(self,\*\*kwargs:Dict\[str, Any\])validmind.vm_models.VMDataset: ::: @@ -576,7 +576,7 @@ Base class for ValidMind Input types ::: {.signature} -defwith_options(self,\*\*kwargs)validmind.vm_models.VMInput: +defwith_options(self,\*\*kwargs:Dict\[str, Any\])validmind.vm_models.VMInput: ::: From e6e7804e8cf39bdc498797a9c626355944e7e771 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 21 Feb 2025 16:32:50 -0800 Subject: [PATCH 102/207] Switch from reference/ to validmind/ path to avoid breaking links --- docs/_sidebar.yml | 398 +++++++++--------- docs/templates/macros/decorators.jinja2 | 9 +- docs/templates/macros/types.jinja2 | 2 +- docs/templates/module.qmd.jinja2 | 2 +- docs/templates/sidebar.qmd.jinja2 | 8 +- docs/templates/version.qmd.jinja2 | 2 +- docs/validmind.qmd | 14 +- docs/validmind/datasets.qmd | 2 +- docs/validmind/datasets/classification.qmd | 2 +- .../classification/customer_churn.qmd | 8 +- .../datasets/classification/taiwan_credit.qmd | 8 +- docs/validmind/datasets/credit_risk.qmd | 2 +- .../datasets/credit_risk/lending_club.qmd | 14 +- .../credit_risk/lending_club_bias.qmd | 2 +- docs/validmind/datasets/nlp.qmd | 2 +- docs/validmind/datasets/nlp/cnn_dailymail.qmd | 4 +- .../datasets/nlp/twitter_covid_19.qmd | 2 +- docs/validmind/datasets/regression.qmd | 2 +- docs/validmind/datasets/regression/fred.qmd | 2 +- .../datasets/regression/lending_club.qmd | 2 +- docs/validmind/errors.qmd | 2 +- docs/validmind/test_suites.qmd | 8 +- docs/validmind/test_suites/classifier.qmd | 2 +- docs/validmind/test_suites/cluster.qmd | 2 +- docs/validmind/test_suites/embeddings.qmd | 2 +- docs/validmind/test_suites/llm.qmd | 2 +- docs/validmind/test_suites/nlp.qmd | 2 +- .../test_suites/parameters_optimization.qmd | 2 +- docs/validmind/test_suites/regression.qmd | 2 +- .../test_suites/statsmodels_timeseries.qmd | 2 +- docs/validmind/test_suites/summarization.qmd | 2 +- .../test_suites/tabular_datasets.qmd | 2 +- docs/validmind/test_suites/text_data.qmd | 2 +- docs/validmind/test_suites/time_series.qmd | 2 +- docs/validmind/tests.qmd | 16 +- docs/validmind/tests/data_validation.qmd | 2 +- .../tests/data_validation/ACFandPACFPlot.qmd | 4 +- docs/validmind/tests/data_validation/ADF.qmd | 6 +- .../tests/data_validation/AutoAR.qmd | 6 +- .../tests/data_validation/AutoMA.qmd | 6 +- .../data_validation/AutoStationarity.qmd | 4 +- .../data_validation/BivariateScatterPlots.qmd | 4 +- .../tests/data_validation/BoxPierce.qmd | 4 +- .../ChiSquaredFeaturesTable.qmd | 4 +- .../tests/data_validation/ClassImbalance.qmd | 6 +- .../data_validation/DatasetDescription.qmd | 6 +- .../tests/data_validation/DatasetSplit.qmd | 4 +- .../data_validation/DescriptiveStatistics.qmd | 4 +- .../tests/data_validation/DickeyFullerGLS.qmd | 6 +- .../tests/data_validation/Duplicates.qmd | 4 +- .../data_validation/EngleGrangerCoint.qmd | 4 +- .../FeatureTargetCorrelationPlot.qmd | 4 +- .../tests/data_validation/HighCardinality.qmd | 4 +- .../HighPearsonCorrelation.qmd | 4 +- .../data_validation/IQROutliersBarPlot.qmd | 4 +- .../data_validation/IQROutliersTable.qmd | 4 +- .../IsolationForestOutliers.qmd | 4 +- .../tests/data_validation/JarqueBera.qmd | 4 +- docs/validmind/tests/data_validation/KPSS.qmd | 6 +- .../tests/data_validation/LJungBox.qmd | 4 +- .../LaggedCorrelationHeatmap.qmd | 4 +- .../tests/data_validation/MissingValues.qmd | 4 +- .../data_validation/MissingValuesBarPlot.qmd | 4 +- .../data_validation/MutualInformation.qmd | 4 +- .../PearsonCorrelationMatrix.qmd | 4 +- .../data_validation/PhillipsPerronArch.qmd | 6 +- .../ProtectedClassesCombination.qmd | 6 +- .../ProtectedClassesDescription.qmd | 6 +- .../ProtectedClassesDisparity.qmd | 6 +- .../ProtectedClassesThresholdOptimizer.qmd | 6 +- .../data_validation/RollingStatsPlot.qmd | 4 +- .../tests/data_validation/RunsTest.qmd | 4 +- .../tests/data_validation/ScatterPlot.qmd | 4 +- .../data_validation/ScoreBandDefaultRates.qmd | 4 +- .../data_validation/SeasonalDecompose.qmd | 6 +- .../tests/data_validation/ShapiroWilk.qmd | 4 +- .../tests/data_validation/Skewness.qmd | 4 +- .../tests/data_validation/SpreadPlot.qmd | 4 +- .../TabularCategoricalBarPlots.qmd | 4 +- .../TabularDateTimeHistograms.qmd | 4 +- .../TabularDescriptionTables.qmd | 4 +- .../TabularNumericalHistograms.qmd | 4 +- .../data_validation/TargetRateBarPlots.qmd | 4 +- .../data_validation/TimeSeriesDescription.qmd | 4 +- .../TimeSeriesDescriptiveStatistics.qmd | 4 +- .../data_validation/TimeSeriesFrequency.qmd | 4 +- .../data_validation/TimeSeriesHistogram.qmd | 6 +- .../data_validation/TimeSeriesLinePlot.qmd | 4 +- .../TimeSeriesMissingValues.qmd | 4 +- .../data_validation/TimeSeriesOutliers.qmd | 4 +- .../data_validation/TooManyZeroValues.qmd | 4 +- .../tests/data_validation/UniqueRows.qmd | 4 +- .../tests/data_validation/WOEBinPlots.qmd | 6 +- .../tests/data_validation/WOEBinTable.qmd | 4 +- .../data_validation/ZivotAndrewsArch.qmd | 6 +- docs/validmind/tests/data_validation/nlp.qmd | 2 +- .../tests/data_validation/nlp/CommonWords.qmd | 4 +- .../tests/data_validation/nlp/Hashtags.qmd | 4 +- .../data_validation/nlp/LanguageDetection.qmd | 4 +- .../tests/data_validation/nlp/Mentions.qmd | 4 +- .../nlp/PolarityAndSubjectivity.qmd | 4 +- .../data_validation/nlp/Punctuations.qmd | 4 +- .../tests/data_validation/nlp/Sentiment.qmd | 4 +- .../tests/data_validation/nlp/StopWords.qmd | 4 +- .../data_validation/nlp/TextDescription.qmd | 4 +- .../tests/data_validation/nlp/Toxicity.qmd | 4 +- docs/validmind/tests/model_validation.qmd | 2 +- .../tests/model_validation/BertScore.qmd | 6 +- .../tests/model_validation/BleuScore.qmd | 6 +- .../ClusterSizeDistribution.qmd | 4 +- .../model_validation/ContextualRecall.qmd | 6 +- .../tests/model_validation/FeaturesAUC.qmd | 6 +- .../tests/model_validation/MeteorScore.qmd | 6 +- .../tests/model_validation/ModelMetadata.qmd | 4 +- .../ModelPredictionResiduals.qmd | 4 +- .../tests/model_validation/RegardScore.qmd | 6 +- .../RegressionResidualsPlot.qmd | 4 +- .../tests/model_validation/RougeScore.qmd | 4 +- .../TimeSeriesPredictionWithCI.qmd | 4 +- .../TimeSeriesPredictionsPlot.qmd | 4 +- .../TimeSeriesR2SquareBySegments.qmd | 4 +- .../tests/model_validation/TokenDisparity.qmd | 4 +- .../tests/model_validation/ToxicityScore.qmd | 4 +- .../tests/model_validation/sklearn.qmd | 2 +- .../sklearn/AdjustedMutualInformation.qmd | 4 +- .../sklearn/AdjustedRandIndex.qmd | 4 +- .../sklearn/CalibrationCurve.qmd | 4 +- .../sklearn/ClassifierPerformance.qmd | 4 +- .../ClassifierThresholdOptimization.qmd | 6 +- .../sklearn/ClusterCosineSimilarity.qmd | 4 +- .../sklearn/ClusterPerformanceMetrics.qmd | 4 +- .../sklearn/CompletenessScore.qmd | 4 +- .../sklearn/ConfusionMatrix.qmd | 4 +- .../sklearn/FeatureImportance.qmd | 4 +- .../sklearn/FowlkesMallowsScore.qmd | 4 +- .../sklearn/HomogeneityScore.qmd | 4 +- .../sklearn/HyperParametersTuning.qmd | 6 +- .../sklearn/KMeansClustersOptimization.qmd | 4 +- .../sklearn/MinimumAccuracy.qmd | 4 +- .../sklearn/MinimumF1Score.qmd | 4 +- .../sklearn/MinimumROCAUCScore.qmd | 4 +- .../sklearn/ModelParameters.qmd | 4 +- .../sklearn/ModelsPerformanceComparison.qmd | 4 +- .../sklearn/OverfitDiagnosis.qmd | 6 +- .../sklearn/PermutationFeatureImportance.qmd | 6 +- .../sklearn/PopulationStabilityIndex.qmd | 6 +- .../sklearn/PrecisionRecallCurve.qmd | 4 +- .../model_validation/sklearn/ROCCurve.qmd | 4 +- .../sklearn/RegressionErrors.qmd | 4 +- .../sklearn/RegressionErrorsComparison.qmd | 6 +- .../sklearn/RegressionPerformance.qmd | 6 +- .../sklearn/RegressionR2Square.qmd | 4 +- .../sklearn/RegressionR2SquareComparison.qmd | 4 +- .../sklearn/RobustnessDiagnosis.qmd | 6 +- .../sklearn/SHAPGlobalImportance.qmd | 12 +- .../sklearn/ScoreProbabilityAlignment.qmd | 4 +- .../sklearn/SilhouettePlot.qmd | 4 +- .../sklearn/TrainingTestDegradation.qmd | 4 +- .../model_validation/sklearn/VMeasure.qmd | 4 +- .../sklearn/WeakspotsDiagnosis.qmd | 4 +- .../tests/model_validation/statsmodels.qmd | 2 +- .../statsmodels/AutoARIMA.qmd | 6 +- .../CumulativePredictionProbabilities.qmd | 4 +- .../statsmodels/DurbinWatsonTest.qmd | 4 +- .../statsmodels/GINITable.qmd | 4 +- .../statsmodels/KolmogorovSmirnov.qmd | 4 +- .../statsmodels/Lilliefors.qmd | 4 +- .../PredictionProbabilitiesHistogram.qmd | 4 +- .../statsmodels/RegressionCoeffs.qmd | 4 +- .../RegressionFeatureSignificance.qmd | 6 +- .../RegressionModelForecastPlot.qmd | 6 +- .../RegressionModelForecastPlotLevels.qmd | 4 +- .../RegressionModelSensitivityPlot.qmd | 6 +- .../statsmodels/RegressionModelSummary.qmd | 4 +- ...RegressionPermutationFeatureImportance.qmd | 6 +- .../statsmodels/ScorecardHistogram.qmd | 4 +- .../statsmodels/statsutils.qmd | 2 +- docs/validmind/tests/prompt_validation.qmd | 2 +- .../tests/prompt_validation/Bias.qmd | 4 +- .../tests/prompt_validation/Clarity.qmd | 4 +- .../tests/prompt_validation/Conciseness.qmd | 4 +- .../tests/prompt_validation/Delimitation.qmd | 4 +- .../prompt_validation/NegativeInstruction.qmd | 4 +- .../tests/prompt_validation/Robustness.qmd | 4 +- .../tests/prompt_validation/Specificity.qmd | 4 +- .../prompt_validation/ai_powered_test.qmd | 2 +- docs/validmind/unit_metrics.qmd | 2 +- docs/validmind/version.qmd | 2 +- docs/validmind/vm_models.qmd | 16 +- scripts/generate_quarto_docs.py | 10 +- 190 files changed, 619 insertions(+), 614 deletions(-) diff --git a/docs/_sidebar.yml b/docs/_sidebar.yml index fba48f76c..a5409942c 100644 --- a/docs/_sidebar.yml +++ b/docs/_sidebar.yml @@ -6,417 +6,417 @@ website: collapsed: false collapse-level: 2 contents: - - reference/validmind.qmd + - validmind/validmind.qmd - text: "---" - text: "Python API" # Root level items from validmind.qmd - text: "__version__" - file: reference/validmind.qmd#__version__ + file: validmind/validmind.qmd#__version__ - text: "get_test_suite()" - file: reference/validmind.qmd#get_test_suite + file: validmind/validmind.qmd#get_test_suite - text: "init()" - file: reference/validmind.qmd#init + file: validmind/validmind.qmd#init - text: "init_dataset()" - file: reference/validmind.qmd#init_dataset + file: validmind/validmind.qmd#init_dataset - text: "init_model()" - file: reference/validmind.qmd#init_model + file: validmind/validmind.qmd#init_model - text: "init_r_model()" - file: reference/validmind.qmd#init_r_model + file: validmind/validmind.qmd#init_r_model - text: "log_metric()" - file: reference/validmind.qmd#log_metric + file: validmind/validmind.qmd#log_metric - text: "preview_template()" - file: reference/validmind.qmd#preview_template + file: validmind/validmind.qmd#preview_template - text: "print_env()" - file: reference/validmind.qmd#print_env + file: validmind/validmind.qmd#print_env - text: "reload()" - file: reference/validmind.qmd#reload + file: validmind/validmind.qmd#reload - text: "run_documentation_tests()" - file: reference/validmind.qmd#run_documentation_tests + file: validmind/validmind.qmd#run_documentation_tests - text: "run_test_suite()" - file: reference/validmind.qmd#run_test_suite + file: validmind/validmind.qmd#run_test_suite - text: "tags()" - file: reference/validmind.qmd#tags + file: validmind/validmind.qmd#tags - text: "tasks()" - file: reference/validmind.qmd#tasks + file: validmind/validmind.qmd#tasks - text: "test()" - file: reference/validmind.qmd#test + file: validmind/validmind.qmd#test - text: "class RawData" - file: reference/validmind.qmd#class-rawdata + file: validmind/validmind.qmd#class-rawdata # All module documentation pages - text: "---" - text: "Submodules" - text: "__version__" - file: reference/validmind/version.qmd + file: validmind/validmind/version.qmd - text: "datasets" - file: reference/validmind/datasets.qmd + file: validmind/validmind/datasets.qmd contents: - text: "classification" - file: reference/validmind/datasets/classification.qmd + file: validmind/validmind/datasets/classification.qmd contents: - text: "customer_churn" - file: reference/validmind/datasets/classification/customer_churn.qmd + file: validmind/validmind/datasets/classification/customer_churn.qmd - text: "taiwan_credit" - file: reference/validmind/datasets/classification/taiwan_credit.qmd + file: validmind/validmind/datasets/classification/taiwan_credit.qmd - text: "credit_risk" - file: reference/validmind/datasets/credit_risk.qmd + file: validmind/validmind/datasets/credit_risk.qmd contents: - text: "lending_club" - file: reference/validmind/datasets/credit_risk/lending_club.qmd + file: validmind/validmind/datasets/credit_risk/lending_club.qmd - text: "lending_club_bias" - file: reference/validmind/datasets/credit_risk/lending_club_bias.qmd + file: validmind/validmind/datasets/credit_risk/lending_club_bias.qmd - text: "nlp" - file: reference/validmind/datasets/nlp.qmd + file: validmind/validmind/datasets/nlp.qmd contents: - text: "cnn_dailymail" - file: reference/validmind/datasets/nlp/cnn_dailymail.qmd + file: validmind/validmind/datasets/nlp/cnn_dailymail.qmd - text: "twitter_covid_19" - file: reference/validmind/datasets/nlp/twitter_covid_19.qmd + file: validmind/validmind/datasets/nlp/twitter_covid_19.qmd - text: "regression" - file: reference/validmind/datasets/regression.qmd + file: validmind/validmind/datasets/regression.qmd contents: - text: "fred" - file: reference/validmind/datasets/regression/fred.qmd + file: validmind/validmind/datasets/regression/fred.qmd - text: "lending_club" - file: reference/validmind/datasets/regression/lending_club.qmd + file: validmind/validmind/datasets/regression/lending_club.qmd - text: "errors" - file: reference/validmind/errors.qmd + file: validmind/validmind/errors.qmd - text: "test_suites" - file: reference/validmind/test_suites.qmd + file: validmind/validmind/test_suites.qmd contents: - text: "classifier" - file: reference/validmind/test_suites/classifier.qmd + file: validmind/validmind/test_suites/classifier.qmd - text: "cluster" - file: reference/validmind/test_suites/cluster.qmd + file: validmind/validmind/test_suites/cluster.qmd - text: "embeddings" - file: reference/validmind/test_suites/embeddings.qmd + file: validmind/validmind/test_suites/embeddings.qmd - text: "llm" - file: reference/validmind/test_suites/llm.qmd + file: validmind/validmind/test_suites/llm.qmd - text: "nlp" - file: reference/validmind/test_suites/nlp.qmd + file: validmind/validmind/test_suites/nlp.qmd - text: "parameters_optimization" - file: reference/validmind/test_suites/parameters_optimization.qmd + file: validmind/validmind/test_suites/parameters_optimization.qmd - text: "regression" - file: reference/validmind/test_suites/regression.qmd + file: validmind/validmind/test_suites/regression.qmd - text: "statsmodels_timeseries" - file: reference/validmind/test_suites/statsmodels_timeseries.qmd + file: validmind/validmind/test_suites/statsmodels_timeseries.qmd - text: "summarization" - file: reference/validmind/test_suites/summarization.qmd + file: validmind/validmind/test_suites/summarization.qmd - text: "tabular_datasets" - file: reference/validmind/test_suites/tabular_datasets.qmd + file: validmind/validmind/test_suites/tabular_datasets.qmd - text: "text_data" - file: reference/validmind/test_suites/text_data.qmd + file: validmind/validmind/test_suites/text_data.qmd - text: "time_series" - file: reference/validmind/test_suites/time_series.qmd + file: validmind/validmind/test_suites/time_series.qmd - text: "tests" - file: reference/validmind/tests.qmd + file: validmind/validmind/tests.qmd contents: - text: "data_validation" - file: reference/validmind/tests/data_validation.qmd + file: validmind/validmind/tests/data_validation.qmd contents: - text: "ACFandPACFPlot" - file: reference/validmind/tests/data_validation/ACFandPACFPlot.qmd + file: validmind/validmind/tests/data_validation/ACFandPACFPlot.qmd - text: "ADF" - file: reference/validmind/tests/data_validation/ADF.qmd + file: validmind/validmind/tests/data_validation/ADF.qmd - text: "AutoAR" - file: reference/validmind/tests/data_validation/AutoAR.qmd + file: validmind/validmind/tests/data_validation/AutoAR.qmd - text: "AutoMA" - file: reference/validmind/tests/data_validation/AutoMA.qmd + file: validmind/validmind/tests/data_validation/AutoMA.qmd - text: "AutoStationarity" - file: reference/validmind/tests/data_validation/AutoStationarity.qmd + file: validmind/validmind/tests/data_validation/AutoStationarity.qmd - text: "BivariateScatterPlots" - file: reference/validmind/tests/data_validation/BivariateScatterPlots.qmd + file: validmind/validmind/tests/data_validation/BivariateScatterPlots.qmd - text: "BoxPierce" - file: reference/validmind/tests/data_validation/BoxPierce.qmd + file: validmind/validmind/tests/data_validation/BoxPierce.qmd - text: "ChiSquaredFeaturesTable" - file: reference/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd + file: validmind/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd - text: "ClassImbalance" - file: reference/validmind/tests/data_validation/ClassImbalance.qmd + file: validmind/validmind/tests/data_validation/ClassImbalance.qmd - text: "CommonWords" - file: reference/validmind/tests/data_validation/nlp/CommonWords.qmd + file: validmind/validmind/tests/data_validation/nlp/CommonWords.qmd - text: "DatasetDescription" - file: reference/validmind/tests/data_validation/DatasetDescription.qmd + file: validmind/validmind/tests/data_validation/DatasetDescription.qmd - text: "DatasetSplit" - file: reference/validmind/tests/data_validation/DatasetSplit.qmd + file: validmind/validmind/tests/data_validation/DatasetSplit.qmd - text: "DescriptiveStatistics" - file: reference/validmind/tests/data_validation/DescriptiveStatistics.qmd + file: validmind/validmind/tests/data_validation/DescriptiveStatistics.qmd - text: "DickeyFullerGLS" - file: reference/validmind/tests/data_validation/DickeyFullerGLS.qmd + file: validmind/validmind/tests/data_validation/DickeyFullerGLS.qmd - text: "Duplicates" - file: reference/validmind/tests/data_validation/Duplicates.qmd + file: validmind/validmind/tests/data_validation/Duplicates.qmd - text: "EngleGrangerCoint" - file: reference/validmind/tests/data_validation/EngleGrangerCoint.qmd + file: validmind/validmind/tests/data_validation/EngleGrangerCoint.qmd - text: "FeatureTargetCorrelationPlot" - file: reference/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd + file: validmind/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd - text: "Hashtags" - file: reference/validmind/tests/data_validation/nlp/Hashtags.qmd + file: validmind/validmind/tests/data_validation/nlp/Hashtags.qmd - text: "HighCardinality" - file: reference/validmind/tests/data_validation/HighCardinality.qmd + file: validmind/validmind/tests/data_validation/HighCardinality.qmd - text: "HighPearsonCorrelation" - file: reference/validmind/tests/data_validation/HighPearsonCorrelation.qmd + file: validmind/validmind/tests/data_validation/HighPearsonCorrelation.qmd - text: "IQROutliersBarPlot" - file: reference/validmind/tests/data_validation/IQROutliersBarPlot.qmd + file: validmind/validmind/tests/data_validation/IQROutliersBarPlot.qmd - text: "IQROutliersTable" - file: reference/validmind/tests/data_validation/IQROutliersTable.qmd + file: validmind/validmind/tests/data_validation/IQROutliersTable.qmd - text: "IsolationForestOutliers" - file: reference/validmind/tests/data_validation/IsolationForestOutliers.qmd + file: validmind/validmind/tests/data_validation/IsolationForestOutliers.qmd - text: "JarqueBera" - file: reference/validmind/tests/data_validation/JarqueBera.qmd + file: validmind/validmind/tests/data_validation/JarqueBera.qmd - text: "KPSS" - file: reference/validmind/tests/data_validation/KPSS.qmd + file: validmind/validmind/tests/data_validation/KPSS.qmd - text: "LJungBox" - file: reference/validmind/tests/data_validation/LJungBox.qmd + file: validmind/validmind/tests/data_validation/LJungBox.qmd - text: "LaggedCorrelationHeatmap" - file: reference/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd + file: validmind/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd - text: "LanguageDetection" - file: reference/validmind/tests/data_validation/nlp/LanguageDetection.qmd + file: validmind/validmind/tests/data_validation/nlp/LanguageDetection.qmd - text: "Mentions" - file: reference/validmind/tests/data_validation/nlp/Mentions.qmd + file: validmind/validmind/tests/data_validation/nlp/Mentions.qmd - text: "MissingValues" - file: reference/validmind/tests/data_validation/MissingValues.qmd + file: validmind/validmind/tests/data_validation/MissingValues.qmd - text: "MissingValuesBarPlot" - file: reference/validmind/tests/data_validation/MissingValuesBarPlot.qmd + file: validmind/validmind/tests/data_validation/MissingValuesBarPlot.qmd - text: "MutualInformation" - file: reference/validmind/tests/data_validation/MutualInformation.qmd + file: validmind/validmind/tests/data_validation/MutualInformation.qmd - text: "PearsonCorrelationMatrix" - file: reference/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd + file: validmind/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd - text: "PhillipsPerronArch" - file: reference/validmind/tests/data_validation/PhillipsPerronArch.qmd + file: validmind/validmind/tests/data_validation/PhillipsPerronArch.qmd - text: "PolarityAndSubjectivity" - file: reference/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd + file: validmind/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd - text: "ProtectedClassesCombination" - file: reference/validmind/tests/data_validation/ProtectedClassesCombination.qmd + file: validmind/validmind/tests/data_validation/ProtectedClassesCombination.qmd - text: "ProtectedClassesDescription" - file: reference/validmind/tests/data_validation/ProtectedClassesDescription.qmd + file: validmind/validmind/tests/data_validation/ProtectedClassesDescription.qmd - text: "ProtectedClassesDisparity" - file: reference/validmind/tests/data_validation/ProtectedClassesDisparity.qmd + file: validmind/validmind/tests/data_validation/ProtectedClassesDisparity.qmd - text: "ProtectedClassesThresholdOptimizer" - file: reference/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd + file: validmind/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd - text: "Punctuations" - file: reference/validmind/tests/data_validation/nlp/Punctuations.qmd + file: validmind/validmind/tests/data_validation/nlp/Punctuations.qmd - text: "RollingStatsPlot" - file: reference/validmind/tests/data_validation/RollingStatsPlot.qmd + file: validmind/validmind/tests/data_validation/RollingStatsPlot.qmd - text: "RunsTest" - file: reference/validmind/tests/data_validation/RunsTest.qmd + file: validmind/validmind/tests/data_validation/RunsTest.qmd - text: "ScatterPlot" - file: reference/validmind/tests/data_validation/ScatterPlot.qmd + file: validmind/validmind/tests/data_validation/ScatterPlot.qmd - text: "ScoreBandDefaultRates" - file: reference/validmind/tests/data_validation/ScoreBandDefaultRates.qmd + file: validmind/validmind/tests/data_validation/ScoreBandDefaultRates.qmd - text: "SeasonalDecompose" - file: reference/validmind/tests/data_validation/SeasonalDecompose.qmd + file: validmind/validmind/tests/data_validation/SeasonalDecompose.qmd - text: "Sentiment" - file: reference/validmind/tests/data_validation/nlp/Sentiment.qmd + file: validmind/validmind/tests/data_validation/nlp/Sentiment.qmd - text: "ShapiroWilk" - file: reference/validmind/tests/data_validation/ShapiroWilk.qmd + file: validmind/validmind/tests/data_validation/ShapiroWilk.qmd - text: "Skewness" - file: reference/validmind/tests/data_validation/Skewness.qmd + file: validmind/validmind/tests/data_validation/Skewness.qmd - text: "SpreadPlot" - file: reference/validmind/tests/data_validation/SpreadPlot.qmd + file: validmind/validmind/tests/data_validation/SpreadPlot.qmd - text: "StopWords" - file: reference/validmind/tests/data_validation/nlp/StopWords.qmd + file: validmind/validmind/tests/data_validation/nlp/StopWords.qmd - text: "TabularCategoricalBarPlots" - file: reference/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd + file: validmind/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd - text: "TabularDateTimeHistograms" - file: reference/validmind/tests/data_validation/TabularDateTimeHistograms.qmd + file: validmind/validmind/tests/data_validation/TabularDateTimeHistograms.qmd - text: "TabularDescriptionTables" - file: reference/validmind/tests/data_validation/TabularDescriptionTables.qmd + file: validmind/validmind/tests/data_validation/TabularDescriptionTables.qmd - text: "TabularNumericalHistograms" - file: reference/validmind/tests/data_validation/TabularNumericalHistograms.qmd + file: validmind/validmind/tests/data_validation/TabularNumericalHistograms.qmd - text: "TargetRateBarPlots" - file: reference/validmind/tests/data_validation/TargetRateBarPlots.qmd + file: validmind/validmind/tests/data_validation/TargetRateBarPlots.qmd - text: "TextDescription" - file: reference/validmind/tests/data_validation/nlp/TextDescription.qmd + file: validmind/validmind/tests/data_validation/nlp/TextDescription.qmd - text: "TimeSeriesDescription" - file: reference/validmind/tests/data_validation/TimeSeriesDescription.qmd + file: validmind/validmind/tests/data_validation/TimeSeriesDescription.qmd - text: "TimeSeriesDescriptiveStatistics" - file: reference/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd + file: validmind/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd - text: "TimeSeriesFrequency" - file: reference/validmind/tests/data_validation/TimeSeriesFrequency.qmd + file: validmind/validmind/tests/data_validation/TimeSeriesFrequency.qmd - text: "TimeSeriesHistogram" - file: reference/validmind/tests/data_validation/TimeSeriesHistogram.qmd + file: validmind/validmind/tests/data_validation/TimeSeriesHistogram.qmd - text: "TimeSeriesLinePlot" - file: reference/validmind/tests/data_validation/TimeSeriesLinePlot.qmd + file: validmind/validmind/tests/data_validation/TimeSeriesLinePlot.qmd - text: "TimeSeriesMissingValues" - file: reference/validmind/tests/data_validation/TimeSeriesMissingValues.qmd + file: validmind/validmind/tests/data_validation/TimeSeriesMissingValues.qmd - text: "TimeSeriesOutliers" - file: reference/validmind/tests/data_validation/TimeSeriesOutliers.qmd + file: validmind/validmind/tests/data_validation/TimeSeriesOutliers.qmd - text: "TooManyZeroValues" - file: reference/validmind/tests/data_validation/TooManyZeroValues.qmd + file: validmind/validmind/tests/data_validation/TooManyZeroValues.qmd - text: "Toxicity" - file: reference/validmind/tests/data_validation/nlp/Toxicity.qmd + file: validmind/validmind/tests/data_validation/nlp/Toxicity.qmd - text: "UniqueRows" - file: reference/validmind/tests/data_validation/UniqueRows.qmd + file: validmind/validmind/tests/data_validation/UniqueRows.qmd - text: "WOEBinPlots" - file: reference/validmind/tests/data_validation/WOEBinPlots.qmd + file: validmind/validmind/tests/data_validation/WOEBinPlots.qmd - text: "WOEBinTable" - file: reference/validmind/tests/data_validation/WOEBinTable.qmd + file: validmind/validmind/tests/data_validation/WOEBinTable.qmd - text: "ZivotAndrewsArch" - file: reference/validmind/tests/data_validation/ZivotAndrewsArch.qmd + file: validmind/validmind/tests/data_validation/ZivotAndrewsArch.qmd - text: "nlp" - file: reference/validmind/tests/data_validation/nlp.qmd + file: validmind/validmind/tests/data_validation/nlp.qmd - text: "model_validation" - file: reference/validmind/tests/model_validation.qmd + file: validmind/validmind/tests/model_validation.qmd contents: - text: "AdjustedMutualInformation" - file: reference/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd + file: validmind/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd - text: "AdjustedRandIndex" - file: reference/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd + file: validmind/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd - text: "AutoARIMA" - file: reference/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd + file: validmind/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd - text: "BertScore" - file: reference/validmind/tests/model_validation/BertScore.qmd + file: validmind/validmind/tests/model_validation/BertScore.qmd - text: "BleuScore" - file: reference/validmind/tests/model_validation/BleuScore.qmd + file: validmind/validmind/tests/model_validation/BleuScore.qmd - text: "CalibrationCurve" - file: reference/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd + file: validmind/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd - text: "ClassifierPerformance" - file: reference/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd + file: validmind/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd - text: "ClassifierThresholdOptimization" - file: reference/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd + file: validmind/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd - text: "ClusterCosineSimilarity" - file: reference/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd + file: validmind/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd - text: "ClusterPerformanceMetrics" - file: reference/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd + file: validmind/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd - text: "ClusterSizeDistribution" - file: reference/validmind/tests/model_validation/ClusterSizeDistribution.qmd + file: validmind/validmind/tests/model_validation/ClusterSizeDistribution.qmd - text: "CompletenessScore" - file: reference/validmind/tests/model_validation/sklearn/CompletenessScore.qmd + file: validmind/validmind/tests/model_validation/sklearn/CompletenessScore.qmd - text: "ConfusionMatrix" - file: reference/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd + file: validmind/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd - text: "ContextualRecall" - file: reference/validmind/tests/model_validation/ContextualRecall.qmd + file: validmind/validmind/tests/model_validation/ContextualRecall.qmd - text: "CumulativePredictionProbabilities" - file: reference/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd + file: validmind/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd - text: "DurbinWatsonTest" - file: reference/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd + file: validmind/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd - text: "FeatureImportance" - file: reference/validmind/tests/model_validation/sklearn/FeatureImportance.qmd + file: validmind/validmind/tests/model_validation/sklearn/FeatureImportance.qmd - text: "FeaturesAUC" - file: reference/validmind/tests/model_validation/FeaturesAUC.qmd + file: validmind/validmind/tests/model_validation/FeaturesAUC.qmd - text: "FowlkesMallowsScore" - file: reference/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd + file: validmind/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd - text: "GINITable" - file: reference/validmind/tests/model_validation/statsmodels/GINITable.qmd + file: validmind/validmind/tests/model_validation/statsmodels/GINITable.qmd - text: "HomogeneityScore" - file: reference/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd + file: validmind/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd - text: "HyperParametersTuning" - file: reference/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd + file: validmind/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd - text: "KMeansClustersOptimization" - file: reference/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd + file: validmind/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd - text: "KolmogorovSmirnov" - file: reference/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd + file: validmind/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd - text: "Lilliefors" - file: reference/validmind/tests/model_validation/statsmodels/Lilliefors.qmd + file: validmind/validmind/tests/model_validation/statsmodels/Lilliefors.qmd - text: "MeteorScore" - file: reference/validmind/tests/model_validation/MeteorScore.qmd + file: validmind/validmind/tests/model_validation/MeteorScore.qmd - text: "MinimumAccuracy" - file: reference/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd + file: validmind/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd - text: "MinimumF1Score" - file: reference/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd + file: validmind/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd - text: "MinimumROCAUCScore" - file: reference/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd + file: validmind/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd - text: "ModelMetadata" - file: reference/validmind/tests/model_validation/ModelMetadata.qmd + file: validmind/validmind/tests/model_validation/ModelMetadata.qmd - text: "ModelParameters" - file: reference/validmind/tests/model_validation/sklearn/ModelParameters.qmd + file: validmind/validmind/tests/model_validation/sklearn/ModelParameters.qmd - text: "ModelPredictionResiduals" - file: reference/validmind/tests/model_validation/ModelPredictionResiduals.qmd + file: validmind/validmind/tests/model_validation/ModelPredictionResiduals.qmd - text: "ModelsPerformanceComparison" - file: reference/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd + file: validmind/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd - text: "OverfitDiagnosis" - file: reference/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd + file: validmind/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd - text: "PermutationFeatureImportance" - file: reference/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd + file: validmind/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd - text: "PopulationStabilityIndex" - file: reference/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd + file: validmind/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd - text: "PrecisionRecallCurve" - file: reference/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd + file: validmind/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd - text: "PredictionProbabilitiesHistogram" - file: reference/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd + file: validmind/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd - text: "ROCCurve" - file: reference/validmind/tests/model_validation/sklearn/ROCCurve.qmd + file: validmind/validmind/tests/model_validation/sklearn/ROCCurve.qmd - text: "RegardScore" - file: reference/validmind/tests/model_validation/RegardScore.qmd + file: validmind/validmind/tests/model_validation/RegardScore.qmd - text: "RegressionCoeffs" - file: reference/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd + file: validmind/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd - text: "RegressionErrors" - file: reference/validmind/tests/model_validation/sklearn/RegressionErrors.qmd + file: validmind/validmind/tests/model_validation/sklearn/RegressionErrors.qmd - text: "RegressionErrorsComparison" - file: reference/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd + file: validmind/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd - text: "RegressionFeatureSignificance" - file: reference/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd + file: validmind/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd - text: "RegressionModelForecastPlot" - file: reference/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd + file: validmind/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd - text: "RegressionModelForecastPlotLevels" - file: reference/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd + file: validmind/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd - text: "RegressionModelSensitivityPlot" - file: reference/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd + file: validmind/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd - text: "RegressionModelSummary" - file: reference/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd + file: validmind/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd - text: "RegressionPerformance" - file: reference/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd + file: validmind/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd - text: "RegressionPermutationFeatureImportance" - file: reference/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd + file: validmind/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd - text: "RegressionR2Square" - file: reference/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd + file: validmind/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd - text: "RegressionR2SquareComparison" - file: reference/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd + file: validmind/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd - text: "RegressionResidualsPlot" - file: reference/validmind/tests/model_validation/RegressionResidualsPlot.qmd + file: validmind/validmind/tests/model_validation/RegressionResidualsPlot.qmd - text: "RobustnessDiagnosis" - file: reference/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd + file: validmind/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd - text: "RougeScore" - file: reference/validmind/tests/model_validation/RougeScore.qmd + file: validmind/validmind/tests/model_validation/RougeScore.qmd - text: "SHAPGlobalImportance" - file: reference/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd + file: validmind/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd - text: "ScoreProbabilityAlignment" - file: reference/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd + file: validmind/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd - text: "ScorecardHistogram" - file: reference/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd + file: validmind/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd - text: "SilhouettePlot" - file: reference/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd + file: validmind/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd - text: "TimeSeriesPredictionWithCI" - file: reference/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd + file: validmind/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd - text: "TimeSeriesPredictionsPlot" - file: reference/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd + file: validmind/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd - text: "TimeSeriesR2SquareBySegments" - file: reference/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd + file: validmind/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd - text: "TokenDisparity" - file: reference/validmind/tests/model_validation/TokenDisparity.qmd + file: validmind/validmind/tests/model_validation/TokenDisparity.qmd - text: "ToxicityScore" - file: reference/validmind/tests/model_validation/ToxicityScore.qmd + file: validmind/validmind/tests/model_validation/ToxicityScore.qmd - text: "TrainingTestDegradation" - file: reference/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd + file: validmind/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd - text: "VMeasure" - file: reference/validmind/tests/model_validation/sklearn/VMeasure.qmd + file: validmind/validmind/tests/model_validation/sklearn/VMeasure.qmd - text: "WeakspotsDiagnosis" - file: reference/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd + file: validmind/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd - text: "sklearn" - file: reference/validmind/tests/model_validation/sklearn.qmd + file: validmind/validmind/tests/model_validation/sklearn.qmd - text: "statsmodels" - file: reference/validmind/tests/model_validation/statsmodels.qmd + file: validmind/validmind/tests/model_validation/statsmodels.qmd - text: "statsutils" - file: reference/validmind/tests/model_validation/statsmodels/statsutils.qmd + file: validmind/validmind/tests/model_validation/statsmodels/statsutils.qmd - text: "prompt_validation" - file: reference/validmind/tests/prompt_validation.qmd + file: validmind/validmind/tests/prompt_validation.qmd contents: - text: "Bias" - file: reference/validmind/tests/prompt_validation/Bias.qmd + file: validmind/validmind/tests/prompt_validation/Bias.qmd - text: "Clarity" - file: reference/validmind/tests/prompt_validation/Clarity.qmd + file: validmind/validmind/tests/prompt_validation/Clarity.qmd - text: "Conciseness" - file: reference/validmind/tests/prompt_validation/Conciseness.qmd + file: validmind/validmind/tests/prompt_validation/Conciseness.qmd - text: "Delimitation" - file: reference/validmind/tests/prompt_validation/Delimitation.qmd + file: validmind/validmind/tests/prompt_validation/Delimitation.qmd - text: "NegativeInstruction" - file: reference/validmind/tests/prompt_validation/NegativeInstruction.qmd + file: validmind/validmind/tests/prompt_validation/NegativeInstruction.qmd - text: "Robustness" - file: reference/validmind/tests/prompt_validation/Robustness.qmd + file: validmind/validmind/tests/prompt_validation/Robustness.qmd - text: "Specificity" - file: reference/validmind/tests/prompt_validation/Specificity.qmd + file: validmind/validmind/tests/prompt_validation/Specificity.qmd - text: "ai_powered_test" - file: reference/validmind/tests/prompt_validation/ai_powered_test.qmd + file: validmind/validmind/tests/prompt_validation/ai_powered_test.qmd - text: "unit_metrics" - file: reference/validmind/unit_metrics.qmd + file: validmind/validmind/unit_metrics.qmd - text: "vm_models" - file: reference/validmind/vm_models.qmd + file: validmind/validmind/vm_models.qmd \ No newline at end of file diff --git a/docs/templates/macros/decorators.jinja2 b/docs/templates/macros/decorators.jinja2 index c3856e20a..40dc7c5ee 100644 --- a/docs/templates/macros/decorators.jinja2 +++ b/docs/templates/macros/decorators.jinja2 @@ -4,9 +4,14 @@ {%- if member.decorators -%} {%- for decorator in member.decorators -%} -{%- if decorator is mapping -%}@{{ format_type(decorator.value) }}{%- else -%}{{ '@' if not decorator.startswith('@') }}{{ decorator }}{%- endif -%} + +{%- if decorator is mapping -%} +@{{ format_type(decorator.value) | replace('@', '') }} +{%- else -%} +{%- if not decorator.startswith('@') -%}@{%- endif -%}{{ decorator | replace('@', '') }} +{%- endif -%} + {%- endfor -%} - {%+ endif +%} {%+ endmacro +%} \ No newline at end of file diff --git a/docs/templates/macros/types.jinja2 b/docs/templates/macros/types.jinja2 index a83040279..9ccb05cc9 100644 --- a/docs/templates/macros/types.jinja2 +++ b/docs/templates/macros/types.jinja2 @@ -9,7 +9,7 @@ {%- elif name|lower in builtin_types -%} {{ name }} {%- elif add_links and name not in type_keywords -%} - validmind.vm_models.{{ name }} + validmind.vm_models.{{ name }} {%- else -%} {{ name }} {%- endif -%} diff --git a/docs/templates/module.qmd.jinja2 b/docs/templates/module.qmd.jinja2 index 2970fa89c..b46fcc505 100644 --- a/docs/templates/module.qmd.jinja2 +++ b/docs/templates/module.qmd.jinja2 @@ -3,7 +3,7 @@ {% import "macros/navigation.jinja2" as nav %} {% import "macros/signatures.jinja2" as signatures %} --- -title: "{% if module.name == "validmind" %}ValidMind Library{% else %}[validmind](/reference/validmind.html).{{ module.name }}{% endif +%}" +title: "{% if module.name == "validmind" %}ValidMind Library{% else %}[validmind](/validmind/validmind.html).{{ module.name }}{% endif +%}" {% if module.name == "validmind" %} aliases: - index.html diff --git a/docs/templates/sidebar.qmd.jinja2 b/docs/templates/sidebar.qmd.jinja2 index 7646615fe..2ef7c87d2 100644 --- a/docs/templates/sidebar.qmd.jinja2 +++ b/docs/templates/sidebar.qmd.jinja2 @@ -6,7 +6,7 @@ website: collapsed: false collapse-level: 2 contents: - - reference/validmind.qmd + - validmind/validmind.qmd - text: "---" - text: "Python API" # Root level items from validmind.qmd @@ -28,7 +28,7 @@ website: - text: "Submodules" {% if module.members.__version__ %} - text: "__version__" - file: reference/validmind/version.qmd + file: validmind/validmind/version.qmd {% endif %} {% for member in module.members | sort_members %} {% if is_public(member, module, full_data, is_root) and member.kind == "module" %} @@ -36,7 +36,7 @@ website: {% set has_children = qmd_files | has_subfiles(module_name) %} {% if has_children %} - text: "{{ module_name }}" - file: reference/validmind/{{ module_name }}.qmd + file: validmind/validmind/{{ module_name }}.qmd contents: {% for item in qmd_files | get_child_files(module_name) %} {% if item.contents is defined %} @@ -54,7 +54,7 @@ website: {% endfor %} {% else %} - text: "{{ module_name }}" - file: reference/validmind/{{ module_name }}.qmd + file: validmind/validmind/{{ module_name }}.qmd {% endif %} {% endif %} {% endfor %} \ No newline at end of file diff --git a/docs/templates/version.qmd.jinja2 b/docs/templates/version.qmd.jinja2 index 6c98589e5..39c8d43ce 100644 --- a/docs/templates/version.qmd.jinja2 +++ b/docs/templates/version.qmd.jinja2 @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).__version__" +title: "[validmind](/validmind/validmind.html).__version__" sidebar: validmind-reference --- diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 4120abb74..906079671 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -55,7 +55,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -defget_test_suite(test_suite_id:Optional\[str\]=None,section:Optional\[str\]=None,\*args:Any,\*\*kwargs:Any)validmind.vm_models.TestSuite: +defget_test_suite(test_suite_id:Optional\[str\]=None,section:Optional\[str\]=None,\*args:Any,\*\*kwargs:Any)validmind.vm_models.TestSuite: ::: @@ -108,7 +108,7 @@ If the API key and secret are not provided, the client will attempt to retrieve ::: {.signature} -definit_dataset(dataset:Union\[pd.DataFrame, pl.DataFrame, np.ndarray, torch.utils.data.Dataset\],model:Optional\[VMModel\]=None,index:Optional\[Any\]=None,index_name:Optional\[str\]=None,date_time_index:bool=False,columns:Optional\[List\[str\]\]=None,text_column:Optional\[str\]=None,target_column:Optional\[str\]=None,feature_columns:Optional\[List\[str\]\]=None,extra_columns:Optional\[Dict\[str, Any\]\]=None,class_labels:Optional\[Dict\[str, Any\]\]=None,type:Optional\[str\]=None,input_id:Optional\[str\]=None,\_\_log:bool=True)validmind.vm_models.VMDataset: +definit_dataset(dataset:Union\[pd.DataFrame, pl.DataFrame, np.ndarray, torch.utils.data.Dataset\],model:Optional\[VMModel\]=None,index:Optional\[Any\]=None,index_name:Optional\[str\]=None,date_time_index:bool=False,columns:Optional\[List\[str\]\]=None,text_column:Optional\[str\]=None,target_column:Optional\[str\]=None,feature_columns:Optional\[List\[str\]\]=None,extra_columns:Optional\[Dict\[str, Any\]\]=None,class_labels:Optional\[Dict\[str, Any\]\]=None,type:Optional\[str\]=None,input_id:Optional\[str\]=None,\_\_log:bool=True)validmind.vm_models.VMDataset: ::: @@ -154,7 +154,7 @@ The following dataset types are supported: ::: {.signature} -definit_model(model:Optional\[object\]=None,input_id:str='model',attributes:Optional\[Dict\[str, Any\]\]=None,predict_fn:Optional\[Callable\]=None,\_\_log:bool=True,\*\*kwargs:Any)validmind.vm_models.VMModel: +definit_model(model:Optional\[object\]=None,input_id:str='model',attributes:Optional\[Dict\[str, Any\]\]=None,predict_fn:Optional\[Callable\]=None,\_\_log:bool=True,\*\*kwargs:Any)validmind.vm_models.VMModel: ::: @@ -184,7 +184,7 @@ Initializes a VM Model, which can then be passed to other functions that can per ::: {.signature} -definit_r_model(model_path:str,input_id:str='model')validmind.vm_models.VMModel: +definit_r_model(model_path:str,input_id:str='model')validmind.vm_models.VMModel: ::: @@ -357,7 +357,7 @@ This function provides a high level interface for running a test suite. A test s ::: {.signature} -deftags(\*tags:str)Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: +deftags(\*tags:str)Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: ::: @@ -375,7 +375,7 @@ Decorator for specifying tags for a test. ::: {.signature} -deftasks(\*tasks:str)Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: +deftasks(\*tasks:str)Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: ::: @@ -393,7 +393,7 @@ Decorator for specifying the task types that a test is designed for. ::: {.signature} -deftest(func_or_id:Union\[Callable\[..., Any\], str, None\])Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: +deftest(func_or_id:Union\[Callable\[..., Any\], str, None\])Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: ::: diff --git a/docs/validmind/datasets.qmd b/docs/validmind/datasets.qmd index f84f71ef9..0a92a0cbc 100644 --- a/docs/validmind/datasets.qmd +++ b/docs/validmind/datasets.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).datasets" +title: "[validmind](/validmind/validmind.html).datasets" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/datasets/classification.qmd b/docs/validmind/datasets/classification.qmd index 67899abfe..b59e8ffea 100644 --- a/docs/validmind/datasets/classification.qmd +++ b/docs/validmind/datasets/classification.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).classification" +title: "[validmind](/validmind/validmind.html).classification" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/datasets/classification/customer_churn.qmd b/docs/validmind/datasets/classification/customer_churn.qmd index 192137515..66892ba20 100644 --- a/docs/validmind/datasets/classification/customer_churn.qmd +++ b/docs/validmind/datasets/classification/customer_churn.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).customer_churn" +title: "[validmind](/validmind/validmind.html).customer_churn" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defsimple_preprocess_booleans(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: +defsimple_preprocess_booleans(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -35,7 +35,7 @@ Preprocess boolean columns. ::: {.signature} -defsimple_preprocess_categoricals(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: +defsimple_preprocess_categoricals(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -58,7 +58,7 @@ Preprocess categorical columns. ::: {.signature} -defsimple_preprocess_numericals(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: +defsimple_preprocess_numericals(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: diff --git a/docs/validmind/datasets/classification/taiwan_credit.qmd b/docs/validmind/datasets/classification/taiwan_credit.qmd index ef0af4457..c5215e6a6 100644 --- a/docs/validmind/datasets/classification/taiwan_credit.qmd +++ b/docs/validmind/datasets/classification/taiwan_credit.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).taiwan_credit" +title: "[validmind](/validmind/validmind.html).taiwan_credit" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defsimple_preprocess_booleans(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: +defsimple_preprocess_booleans(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -35,7 +35,7 @@ Preprocess boolean columns. ::: {.signature} -defsimple_preprocess_categoricals(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: +defsimple_preprocess_categoricals(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -58,7 +58,7 @@ Preprocess categorical columns. ::: {.signature} -defsimple_preprocess_numericals(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: +defsimple_preprocess_numericals(df:pd.DataFrame,columns:List\[str\])validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: diff --git a/docs/validmind/datasets/credit_risk.qmd b/docs/validmind/datasets/credit_risk.qmd index 1e4d758d5..1710dbd7c 100644 --- a/docs/validmind/datasets/credit_risk.qmd +++ b/docs/validmind/datasets/credit_risk.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).credit_risk" +title: "[validmind](/validmind/validmind.html).credit_risk" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/datasets/credit_risk/lending_club.qmd b/docs/validmind/datasets/credit_risk/lending_club.qmd index 389bd6dbd..75eff7817 100644 --- a/docs/validmind/datasets/credit_risk/lending_club.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).lending_club" +title: "[validmind](/validmind/validmind.html).lending_club" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -defcompute_scores(probabilities:np.ndarray)validmind.vm_models.np.validmind.vm_models.ndarray: +defcompute_scores(probabilities:np.ndarray)validmind.vm_models.np.validmind.vm_models.ndarray: ::: @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -deffeature_engineering(df:pd.DataFrame,verbose:bool=True)validmind.vm_models.pd.validmind.vm_models.DataFrame: +deffeature_engineering(df:pd.DataFrame,verbose:bool=True)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -75,7 +75,7 @@ Get demo test configuration. ::: {.signature} -defload_data(source:str='online',verbose:bool=True)validmind.vm_models.pd.validmind.vm_models.DataFrame: +defload_data(source:str='online',verbose:bool=True)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -123,7 +123,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -defpreprocess(df:pd.DataFrame,verbose:bool=True)validmind.vm_models.pd.validmind.vm_models.DataFrame: +defpreprocess(df:pd.DataFrame,verbose:bool=True)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -135,7 +135,7 @@ Load data from either an online source or offline files, automatically dropping ::: {.signature} -defsplit(df:pd.DataFrame,validation_split:Optional\[float\]=None,test_size:float=0.2,add_constant:bool=False,verbose:bool=True)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: +defsplit(df:pd.DataFrame,validation_split:Optional\[float\]=None,test_size:float=0.2,add_constant:bool=False,verbose:bool=True)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: ::: @@ -162,6 +162,6 @@ Split dataset into train, validation (optional), and test sets. ::: {.signature} -defwoe_encoding(df:pd.DataFrame,verbose:bool=True)validmind.vm_models.pd.validmind.vm_models.DataFrame: +defwoe_encoding(df:pd.DataFrame,verbose:bool=True)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: diff --git a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd index 482b3937b..fef153b3e 100644 --- a/docs/validmind/datasets/credit_risk/lending_club_bias.qmd +++ b/docs/validmind/datasets/credit_risk/lending_club_bias.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).lending_club_bias" +title: "[validmind](/validmind/validmind.html).lending_club_bias" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/datasets/nlp.qmd b/docs/validmind/datasets/nlp.qmd index f6a5b00a5..5fbd99df3 100644 --- a/docs/validmind/datasets/nlp.qmd +++ b/docs/validmind/datasets/nlp.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).nlp" +title: "[validmind](/validmind/validmind.html).nlp" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/datasets/nlp/cnn_dailymail.qmd b/docs/validmind/datasets/nlp/cnn_dailymail.qmd index a2e16fdd5..73069f2b6 100644 --- a/docs/validmind/datasets/nlp/cnn_dailymail.qmd +++ b/docs/validmind/datasets/nlp/cnn_dailymail.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).cnn_dailymail" +title: "[validmind](/validmind/validmind.html).cnn_dailymail" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -30,7 +30,7 @@ Primary function to format and display a DataFrame. ::: {.signature} -defload_data(source:str='online',dataset_size:Optional\[str\]=None)Tuple\[validmind.vm_models.pd.validmind.vm_models.DataFrame, validmind.vm_models.pd.validmind.vm_models.DataFrame\]: +defload_data(source:str='online',dataset_size:Optional\[str\]=None)Tuple\[validmind.vm_models.pd.validmind.vm_models.DataFrame, validmind.vm_models.pd.validmind.vm_models.DataFrame\]: ::: diff --git a/docs/validmind/datasets/nlp/twitter_covid_19.qmd b/docs/validmind/datasets/nlp/twitter_covid_19.qmd index d84be5a06..ad6245dca 100644 --- a/docs/validmind/datasets/nlp/twitter_covid_19.qmd +++ b/docs/validmind/datasets/nlp/twitter_covid_19.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).twitter_covid_19" +title: "[validmind](/validmind/validmind.html).twitter_covid_19" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/datasets/regression.qmd b/docs/validmind/datasets/regression.qmd index db10919c5..ce157ccb1 100644 --- a/docs/validmind/datasets/regression.qmd +++ b/docs/validmind/datasets/regression.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).regression" +title: "[validmind](/validmind/validmind.html).regression" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/datasets/regression/fred.qmd b/docs/validmind/datasets/regression/fred.qmd index c7633430a..4cf84434f 100644 --- a/docs/validmind/datasets/regression/fred.qmd +++ b/docs/validmind/datasets/regression/fred.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).fred" +title: "[validmind](/validmind/validmind.html).fred" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/datasets/regression/lending_club.qmd b/docs/validmind/datasets/regression/lending_club.qmd index 3d35ecd0f..1bbf20f0a 100644 --- a/docs/validmind/datasets/regression/lending_club.qmd +++ b/docs/validmind/datasets/regression/lending_club.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).lending_club" +title: "[validmind](/validmind/validmind.html).lending_club" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/errors.qmd b/docs/validmind/errors.qmd index fc2229eab..473912517 100644 --- a/docs/validmind/errors.qmd +++ b/docs/validmind/errors.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).errors" +title: "[validmind](/validmind/validmind.html).errors" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/test_suites.qmd b/docs/validmind/test_suites.qmd index 471d6861d..a92c29f74 100644 --- a/docs/validmind/test_suites.qmd +++ b/docs/validmind/test_suites.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).test_suites" +title: "[validmind](/validmind/validmind.html).test_suites" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -29,7 +29,7 @@ Entrypoint for test suites. ::: {.signature} -defformat_dataframe(df:pd.DataFrame)validmind.vm_models.pd.validmind.vm_models.DataFrame: +defformat_dataframe(df:pd.DataFrame)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -43,7 +43,7 @@ Format a pandas DataFrame for display purposes ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -81,7 +81,7 @@ Convert a test ID to a human-readable name. ::: {.signature} -defdescribe_suite(test_suite_id:str,verbose:bool=False)validmind.vm_models.pd.validmind.vm_models.DataFrame: +defdescribe_suite(test_suite_id:str,verbose:bool=False)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: diff --git a/docs/validmind/test_suites/classifier.qmd b/docs/validmind/test_suites/classifier.qmd index 0e7b53d78..9aae98a26 100644 --- a/docs/validmind/test_suites/classifier.qmd +++ b/docs/validmind/test_suites/classifier.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).classifier" +title: "[validmind](/validmind/validmind.html).classifier" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/test_suites/cluster.qmd b/docs/validmind/test_suites/cluster.qmd index 9fd44338e..fe9618ab0 100644 --- a/docs/validmind/test_suites/cluster.qmd +++ b/docs/validmind/test_suites/cluster.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).cluster" +title: "[validmind](/validmind/validmind.html).cluster" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/test_suites/embeddings.qmd b/docs/validmind/test_suites/embeddings.qmd index 60da2366d..cee5f9a70 100644 --- a/docs/validmind/test_suites/embeddings.qmd +++ b/docs/validmind/test_suites/embeddings.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).embeddings" +title: "[validmind](/validmind/validmind.html).embeddings" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/test_suites/llm.qmd b/docs/validmind/test_suites/llm.qmd index 0befde5b1..a33c2a7eb 100644 --- a/docs/validmind/test_suites/llm.qmd +++ b/docs/validmind/test_suites/llm.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).llm" +title: "[validmind](/validmind/validmind.html).llm" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/test_suites/nlp.qmd b/docs/validmind/test_suites/nlp.qmd index a1da5da9f..1f8af676a 100644 --- a/docs/validmind/test_suites/nlp.qmd +++ b/docs/validmind/test_suites/nlp.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).nlp" +title: "[validmind](/validmind/validmind.html).nlp" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/test_suites/parameters_optimization.qmd b/docs/validmind/test_suites/parameters_optimization.qmd index 2b33fedec..83a7ee3a5 100644 --- a/docs/validmind/test_suites/parameters_optimization.qmd +++ b/docs/validmind/test_suites/parameters_optimization.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).parameters_optimization" +title: "[validmind](/validmind/validmind.html).parameters_optimization" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/test_suites/regression.qmd b/docs/validmind/test_suites/regression.qmd index b9c34a705..1873bb0e6 100644 --- a/docs/validmind/test_suites/regression.qmd +++ b/docs/validmind/test_suites/regression.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).regression" +title: "[validmind](/validmind/validmind.html).regression" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/test_suites/statsmodels_timeseries.qmd b/docs/validmind/test_suites/statsmodels_timeseries.qmd index 98723f820..853c16bd9 100644 --- a/docs/validmind/test_suites/statsmodels_timeseries.qmd +++ b/docs/validmind/test_suites/statsmodels_timeseries.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).statsmodels_timeseries" +title: "[validmind](/validmind/validmind.html).statsmodels_timeseries" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/test_suites/summarization.qmd b/docs/validmind/test_suites/summarization.qmd index f1af93644..2b6a66d4a 100644 --- a/docs/validmind/test_suites/summarization.qmd +++ b/docs/validmind/test_suites/summarization.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).summarization" +title: "[validmind](/validmind/validmind.html).summarization" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/test_suites/tabular_datasets.qmd b/docs/validmind/test_suites/tabular_datasets.qmd index 750765ead..34ac944ad 100644 --- a/docs/validmind/test_suites/tabular_datasets.qmd +++ b/docs/validmind/test_suites/tabular_datasets.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).tabular_datasets" +title: "[validmind](/validmind/validmind.html).tabular_datasets" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/test_suites/text_data.qmd b/docs/validmind/test_suites/text_data.qmd index 281e99870..aa83e4ea6 100644 --- a/docs/validmind/test_suites/text_data.qmd +++ b/docs/validmind/test_suites/text_data.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).text_data" +title: "[validmind](/validmind/validmind.html).text_data" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/test_suites/time_series.qmd b/docs/validmind/test_suites/time_series.qmd index a32c62b27..d53cd4257 100644 --- a/docs/validmind/test_suites/time_series.qmd +++ b/docs/validmind/test_suites/time_series.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).time_series" +title: "[validmind](/validmind/validmind.html).time_series" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/tests.qmd b/docs/validmind/tests.qmd index 8dd8295f1..378ca965e 100644 --- a/docs/validmind/tests.qmd +++ b/docs/validmind/tests.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).tests" +title: "[validmind](/validmind/validmind.html).tests" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -20,7 +20,7 @@ ValidMind Tests Module ::: {.signature} -defdescribe_test(test_id:Optional\[TestID\]=None,raw:bool=False,show:bool=True)Union\[str, validmind.vm_models.HTML, Dict\[str, Any\]\]: +defdescribe_test(test_id:Optional\[TestID\]=None,raw:bool=False,show:bool=True)Union\[str, validmind.vm_models.HTML, Dict\[str, Any\]\]: ::: @@ -34,7 +34,7 @@ Describe a test's functionality and parameters ::: {.signature} -deflist_tags()validmind.vm_models.Set\[str\]: +deflist_tags()validmind.vm_models.Set\[str\]: ::: @@ -48,7 +48,7 @@ List all available tags ::: {.signature} -deflist_tasks()validmind.vm_models.Set\[str\]: +deflist_tasks()validmind.vm_models.Set\[str\]: ::: @@ -111,7 +111,7 @@ Test IDs are in the format `namespace.path_to_module.TestClassOrFuncName[:tag]`. ::: {.signature} -defrun_test(test_id:Union\[TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[Callable\[\[TestResult\], None\], None\]=None,\*\*kwargs)validmind.vm_models.TestResult: +defrun_test(test_id:Union\[TestID, None\]=None,name:Union\[str, None\]=None,unit_metrics:Union\[List\[TestID\], None\]=None,inputs:Union\[Dict\[str, Any\], None\]=None,input_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,params:Union\[Dict\[str, Any\], None\]=None,param_grid:Union\[Dict\[str, List\[Any\]\], List\[Dict\[str, Any\]\], None\]=None,show:bool=True,generate_description:bool=True,title:Optional\[str\]=None,post_process_fn:Union\[Callable\[\[TestResult\], None\], None\]=None,\*\*kwargs)validmind.vm_models.TestResult: ::: @@ -154,7 +154,7 @@ This function is the main entry point for running tests. It can run simple unit ::: {.signature} -deftags(\*tags:str)Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: +deftags(\*tags:str)Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: ::: @@ -172,7 +172,7 @@ Decorator for specifying tags for a test. ::: {.signature} -deftasks(\*tasks:str)Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: +deftasks(\*tasks:str)Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: ::: @@ -190,7 +190,7 @@ Decorator for specifying the task types that a test is designed for. ::: {.signature} -deftest(func_or_id:Union\[Callable\[..., Any\], str, None\])Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: +deftest(func_or_id:Union\[Callable\[..., Any\], str, None\])Callable\[\[validmind.vm_models.F\], validmind.vm_models.F\]: ::: diff --git a/docs/validmind/tests/data_validation.qmd b/docs/validmind/tests/data_validation.qmd index 8f1c044fb..5987a7a43 100644 --- a/docs/validmind/tests/data_validation.qmd +++ b/docs/validmind/tests/data_validation.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).data_validation" +title: "[validmind](/validmind/validmind.html).data_validation" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd index 0fb0030cd..84ce0c46b 100644 --- a/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd +++ b/docs/validmind/tests/data_validation/ACFandPACFPlot.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ACFandPACFPlot" +title: "[validmind](/validmind/validmind.html).ACFandPACFPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('time_series_data', 'forecasting', 'statistical_test', 'visualization')@@tasks('regression') +@tags('time_series_data', 'forecasting', 'statistical_test', 'visualization')@tasks('regression') defACFandPACFPlot(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/ADF.qmd b/docs/validmind/tests/data_validation/ADF.qmd index 88556931c..7e1696f54 100644 --- a/docs/validmind/tests/data_validation/ADF.qmd +++ b/docs/validmind/tests/data_validation/ADF.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ADF" +title: "[validmind](/validmind/validmind.html).ADF" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test', 'stationarity')@@tasks('regression') +@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test', 'stationarity')@tasks('regression') defADF(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/AutoAR.qmd b/docs/validmind/tests/data_validation/AutoAR.qmd index 2a04c8219..f130826f8 100644 --- a/docs/validmind/tests/data_validation/AutoAR.qmd +++ b/docs/validmind/tests/data_validation/AutoAR.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).AutoAR" +title: "[validmind](/validmind/validmind.html).AutoAR" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')@@tasks('regression') +@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')@tasks('regression') defAutoAR(dataset:VMDataset,max_ar_order:int=3): diff --git a/docs/validmind/tests/data_validation/AutoMA.qmd b/docs/validmind/tests/data_validation/AutoMA.qmd index e30370fe6..5cf6f3607 100644 --- a/docs/validmind/tests/data_validation/AutoMA.qmd +++ b/docs/validmind/tests/data_validation/AutoMA.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).AutoMA" +title: "[validmind](/validmind/validmind.html).AutoMA" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')@@tasks('regression') +@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')@tasks('regression') defAutoMA(dataset:VMDataset,max_ma_order:int=3): diff --git a/docs/validmind/tests/data_validation/AutoStationarity.qmd b/docs/validmind/tests/data_validation/AutoStationarity.qmd index 0039b9ab9..0c203601c 100644 --- a/docs/validmind/tests/data_validation/AutoStationarity.qmd +++ b/docs/validmind/tests/data_validation/AutoStationarity.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).AutoStationarity" +title: "[validmind](/validmind/validmind.html).AutoStationarity" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')@@tasks('regression') +@tags('time_series_data', 'statsmodels', 'forecasting', 'statistical_test')@tasks('regression') defAutoStationarity(dataset:VMDataset,max_order:int=5,threshold:float=0.05): diff --git a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd index 4e0e7aabf..598f5da0b 100644 --- a/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd +++ b/docs/validmind/tests/data_validation/BivariateScatterPlots.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).BivariateScatterPlots" +title: "[validmind](/validmind/validmind.html).BivariateScatterPlots" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'numerical_data', 'visualization')@@tasks('classification') +@tags('tabular_data', 'numerical_data', 'visualization')@tasks('classification') defBivariateScatterPlots(dataset): diff --git a/docs/validmind/tests/data_validation/BoxPierce.qmd b/docs/validmind/tests/data_validation/BoxPierce.qmd index c8e053c97..fbbf6c3eb 100644 --- a/docs/validmind/tests/data_validation/BoxPierce.qmd +++ b/docs/validmind/tests/data_validation/BoxPierce.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).BoxPierce" +title: "[validmind](/validmind/validmind.html).BoxPierce" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tasks('regression')@@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels') +@tasks('regression')@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels') defBoxPierce(dataset): diff --git a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd index 7eb8db9ff..25fb931da 100644 --- a/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd +++ b/docs/validmind/tests/data_validation/ChiSquaredFeaturesTable.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ChiSquaredFeaturesTable" +title: "[validmind](/validmind/validmind.html).ChiSquaredFeaturesTable" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'categorical_data', 'statistical_test')@@tasks('classification') +@tags('tabular_data', 'categorical_data', 'statistical_test')@tasks('classification') defChiSquaredFeaturesTable(dataset,p_threshold=0.05): diff --git a/docs/validmind/tests/data_validation/ClassImbalance.qmd b/docs/validmind/tests/data_validation/ClassImbalance.qmd index 8509dcda0..2c10e6fdc 100644 --- a/docs/validmind/tests/data_validation/ClassImbalance.qmd +++ b/docs/validmind/tests/data_validation/ClassImbalance.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ClassImbalance" +title: "[validmind](/validmind/validmind.html).ClassImbalance" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -18,9 +18,9 @@ Threshold based tests ::: {.signature} -@@tags('tabular_data', 'binary_classification', 'multiclass_classification')@@tasks('classification') +@tags('tabular_data', 'binary_classification', 'multiclass_classification')@tasks('classification') -defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple\[Dict\[str, Any\], validmind.vm_models.go.validmind.vm_models.Figure, bool\]: +defClassImbalance(dataset:VMDataset,min_percent_threshold:int=10)Tuple\[Dict\[str, Any\], validmind.vm_models.go.validmind.vm_models.Figure, bool\]: ::: diff --git a/docs/validmind/tests/data_validation/DatasetDescription.qmd b/docs/validmind/tests/data_validation/DatasetDescription.qmd index da5163786..7d1d27d64 100644 --- a/docs/validmind/tests/data_validation/DatasetDescription.qmd +++ b/docs/validmind/tests/data_validation/DatasetDescription.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).DatasetDescription" +title: "[validmind](/validmind/validmind.html).DatasetDescription" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('tabular_data', 'time_series_data', 'text_data')@@tasks('classification', 'regression', 'text_classification', 'text_summarization') +@tags('tabular_data', 'time_series_data', 'text_data')@tasks('classification', 'regression', 'text_classification', 'text_summarization') defDatasetDescription(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/DatasetSplit.qmd b/docs/validmind/tests/data_validation/DatasetSplit.qmd index 305b7b918..5d7d57f1f 100644 --- a/docs/validmind/tests/data_validation/DatasetSplit.qmd +++ b/docs/validmind/tests/data_validation/DatasetSplit.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).DatasetSplit" +title: "[validmind](/validmind/validmind.html).DatasetSplit" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'time_series_data', 'text_data')@@tasks('classification', 'regression', 'text_classification', 'text_summarization') +@tags('tabular_data', 'time_series_data', 'text_data')@tasks('classification', 'regression', 'text_classification', 'text_summarization') defDatasetSplit(datasets:List\[VMDataset\]): diff --git a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd index faff029d6..e6c7150e2 100644 --- a/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/DescriptiveStatistics.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).DescriptiveStatistics" +title: "[validmind](/validmind/validmind.html).DescriptiveStatistics" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -36,7 +36,7 @@ We do this for display purposes before sending data to ValidMind. Rules: ::: {.signature} -@@tags('tabular_data', 'time_series_data')@@tasks('classification', 'regression') +@tags('tabular_data', 'time_series_data')@tasks('classification', 'regression') defDescriptiveStatistics(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd index d878909d7..5b065aeda 100644 --- a/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd +++ b/docs/validmind/tests/data_validation/DickeyFullerGLS.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).DickeyFullerGLS" +title: "[validmind](/validmind/validmind.html).DickeyFullerGLS" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('time_series_data', 'forecasting', 'unit_root_test')@@tasks('regression') +@tags('time_series_data', 'forecasting', 'unit_root_test')@tasks('regression') defDickeyFullerGLS(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/Duplicates.qmd b/docs/validmind/tests/data_validation/Duplicates.qmd index 548870fc4..c2b4bbdb6 100644 --- a/docs/validmind/tests/data_validation/Duplicates.qmd +++ b/docs/validmind/tests/data_validation/Duplicates.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).Duplicates" +title: "[validmind](/validmind/validmind.html).Duplicates" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'data_quality', 'text_data')@@tasks('classification', 'regression') +@tags('tabular_data', 'data_quality', 'text_data')@tasks('classification', 'regression') defDuplicates(dataset,min_threshold=1): diff --git a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd index 5cb6af1d8..bc02635c5 100644 --- a/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd +++ b/docs/validmind/tests/data_validation/EngleGrangerCoint.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).EngleGrangerCoint" +title: "[validmind](/validmind/validmind.html).EngleGrangerCoint" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('time_series_data', 'statistical_test', 'forecasting')@@tasks('regression') +@tags('time_series_data', 'statistical_test', 'forecasting')@tasks('regression') defEngleGrangerCoint(dataset:VMDataset,threshold:float=0.05): diff --git a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd index 80637b1fa..42d9c22aa 100644 --- a/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd +++ b/docs/validmind/tests/data_validation/FeatureTargetCorrelationPlot.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).FeatureTargetCorrelationPlot" +title: "[validmind](/validmind/validmind.html).FeatureTargetCorrelationPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'visualization', 'correlation')@@tasks('classification', 'regression') +@tags('tabular_data', 'visualization', 'correlation')@tasks('classification', 'regression') defFeatureTargetCorrelationPlot(dataset,fig_height=600): diff --git a/docs/validmind/tests/data_validation/HighCardinality.qmd b/docs/validmind/tests/data_validation/HighCardinality.qmd index d901f1622..4810cc35a 100644 --- a/docs/validmind/tests/data_validation/HighCardinality.qmd +++ b/docs/validmind/tests/data_validation/HighCardinality.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).HighCardinality" +title: "[validmind](/validmind/validmind.html).HighCardinality" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'data_quality', 'categorical_data')@@tasks('classification', 'regression') +@tags('tabular_data', 'data_quality', 'categorical_data')@tasks('classification', 'regression') defHighCardinality(dataset:VMDataset,num_threshold:int=100,percent_threshold:float=0.1,threshold_type:str='percent'): diff --git a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd index 50fe3cf85..7f2fb69e7 100644 --- a/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd +++ b/docs/validmind/tests/data_validation/HighPearsonCorrelation.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).HighPearsonCorrelation" +title: "[validmind](/validmind/validmind.html).HighPearsonCorrelation" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'data_quality', 'correlation')@@tasks('classification', 'regression') +@tags('tabular_data', 'data_quality', 'correlation')@tasks('classification', 'regression') defHighPearsonCorrelation(dataset:VMDataset,max_threshold:float=0.3,top_n_correlations:int=10,feature_columns:list=None): diff --git a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd index 65856c2c4..c697c2a2e 100644 --- a/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersBarPlot.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).IQROutliersBarPlot" +title: "[validmind](/validmind/validmind.html).IQROutliersBarPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'visualization', 'numerical_data')@@tasks('classification', 'regression') +@tags('tabular_data', 'visualization', 'numerical_data')@tasks('classification', 'regression') defIQROutliersBarPlot(dataset:VMDataset,threshold:float=1.5,fig_width:int=800): diff --git a/docs/validmind/tests/data_validation/IQROutliersTable.qmd b/docs/validmind/tests/data_validation/IQROutliersTable.qmd index 981537628..2badb2a5a 100644 --- a/docs/validmind/tests/data_validation/IQROutliersTable.qmd +++ b/docs/validmind/tests/data_validation/IQROutliersTable.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).IQROutliersTable" +title: "[validmind](/validmind/validmind.html).IQROutliersTable" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'numerical_data')@@tasks('classification', 'regression') +@tags('tabular_data', 'numerical_data')@tasks('classification', 'regression') defIQROutliersTable(dataset:VMDataset,threshold:float=1.5): diff --git a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd index ce1c16943..9f4794d32 100644 --- a/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd +++ b/docs/validmind/tests/data_validation/IsolationForestOutliers.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).IsolationForestOutliers" +title: "[validmind](/validmind/validmind.html).IsolationForestOutliers" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'anomaly_detection')@@tasks('classification') +@tags('tabular_data', 'anomaly_detection')@tasks('classification') defIsolationForestOutliers(dataset:VMDataset,random_state:int=0,contamination:float=0.1,feature_columns:list=None): diff --git a/docs/validmind/tests/data_validation/JarqueBera.qmd b/docs/validmind/tests/data_validation/JarqueBera.qmd index 843b7244e..6b4bf8509 100644 --- a/docs/validmind/tests/data_validation/JarqueBera.qmd +++ b/docs/validmind/tests/data_validation/JarqueBera.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).JarqueBera" +title: "[validmind](/validmind/validmind.html).JarqueBera" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tasks('classification', 'regression')@@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels') +@tasks('classification', 'regression')@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels') defJarqueBera(dataset): diff --git a/docs/validmind/tests/data_validation/KPSS.qmd b/docs/validmind/tests/data_validation/KPSS.qmd index b3642262c..660fd00ea 100644 --- a/docs/validmind/tests/data_validation/KPSS.qmd +++ b/docs/validmind/tests/data_validation/KPSS.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).KPSS" +title: "[validmind](/validmind/validmind.html).KPSS" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('time_series_data', 'stationarity', 'unit_root_test', 'statsmodels')@@tasks('data_validation') +@tags('time_series_data', 'stationarity', 'unit_root_test', 'statsmodels')@tasks('data_validation') defKPSS(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/LJungBox.qmd b/docs/validmind/tests/data_validation/LJungBox.qmd index e953f7d02..b9991a52a 100644 --- a/docs/validmind/tests/data_validation/LJungBox.qmd +++ b/docs/validmind/tests/data_validation/LJungBox.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).LJungBox" +title: "[validmind](/validmind/validmind.html).LJungBox" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tasks('regression')@@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels') +@tasks('regression')@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels') defLJungBox(dataset): diff --git a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd index b33fbe422..b24552c0e 100644 --- a/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd +++ b/docs/validmind/tests/data_validation/LaggedCorrelationHeatmap.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).LaggedCorrelationHeatmap" +title: "[validmind](/validmind/validmind.html).LaggedCorrelationHeatmap" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('time_series_data', 'visualization')@@tasks('regression') +@tags('time_series_data', 'visualization')@tasks('regression') defLaggedCorrelationHeatmap(dataset:VMDataset,num_lags:int=10): diff --git a/docs/validmind/tests/data_validation/MissingValues.qmd b/docs/validmind/tests/data_validation/MissingValues.qmd index 92ca5dd63..19b8ff7ba 100644 --- a/docs/validmind/tests/data_validation/MissingValues.qmd +++ b/docs/validmind/tests/data_validation/MissingValues.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).MissingValues" +title: "[validmind](/validmind/validmind.html).MissingValues" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'data_quality')@@tasks('classification', 'regression') +@tags('tabular_data', 'data_quality')@tasks('classification', 'regression') defMissingValues(dataset:VMDataset,min_threshold:int=1): diff --git a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd index 8368bbcc0..b489c2dd7 100644 --- a/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd +++ b/docs/validmind/tests/data_validation/MissingValuesBarPlot.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).MissingValuesBarPlot" +title: "[validmind](/validmind/validmind.html).MissingValuesBarPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'data_quality', 'visualization')@@tasks('classification', 'regression') +@tags('tabular_data', 'data_quality', 'visualization')@tasks('classification', 'regression') defMissingValuesBarPlot(dataset:VMDataset,threshold:int=80,fig_height:int=600): diff --git a/docs/validmind/tests/data_validation/MutualInformation.qmd b/docs/validmind/tests/data_validation/MutualInformation.qmd index d8777db99..db9a1a86d 100644 --- a/docs/validmind/tests/data_validation/MutualInformation.qmd +++ b/docs/validmind/tests/data_validation/MutualInformation.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).MutualInformation" +title: "[validmind](/validmind/validmind.html).MutualInformation" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('feature_selection', 'data_analysis')@@tasks('classification', 'regression') +@tags('feature_selection', 'data_analysis')@tasks('classification', 'regression') defMutualInformation(dataset:VMDataset,min_threshold:float=0.01,task:str='classification'): diff --git a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd index c50d59aa8..dfdf08208 100644 --- a/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd +++ b/docs/validmind/tests/data_validation/PearsonCorrelationMatrix.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).PearsonCorrelationMatrix" +title: "[validmind](/validmind/validmind.html).PearsonCorrelationMatrix" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'numerical_data', 'correlation')@@tasks('classification', 'regression') +@tags('tabular_data', 'numerical_data', 'correlation')@tasks('classification', 'regression') defPearsonCorrelationMatrix(dataset): diff --git a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd index d78d2ca8f..77138d63d 100644 --- a/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd +++ b/docs/validmind/tests/data_validation/PhillipsPerronArch.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).PhillipsPerronArch" +title: "[validmind](/validmind/validmind.html).PhillipsPerronArch" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('time_series_data', 'forecasting', 'statistical_test', 'unit_root_test')@@tasks('regression') +@tags('time_series_data', 'forecasting', 'statistical_test', 'unit_root_test')@tasks('regression') defPhillipsPerronArch(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd index c9e09c4ce..524f8b87d 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesCombination.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ProtectedClassesCombination" +title: "[validmind](/validmind/validmind.html).ProtectedClassesCombination" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('bias_and_fairness')@@tasks('classification', 'regression') +@tags('bias_and_fairness')@tasks('classification', 'regression') defProtectedClassesCombination(dataset,model,protected_classes=None): diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd index 4b81152ed..663f2801a 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDescription.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ProtectedClassesDescription" +title: "[validmind](/validmind/validmind.html).ProtectedClassesDescription" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('bias_and_fairness', 'descriptive_statistics')@@tasks('classification', 'regression') +@tags('bias_and_fairness', 'descriptive_statistics')@tasks('classification', 'regression') defProtectedClassesDescription(dataset,protected_classes=None): diff --git a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd index dfd2ec842..874fe2425 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesDisparity.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ProtectedClassesDisparity" +title: "[validmind](/validmind/validmind.html).ProtectedClassesDisparity" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('bias_and_fairness')@@tasks('classification', 'regression') +@tags('bias_and_fairness')@tasks('classification', 'regression') defProtectedClassesDisparity(dataset,model,protected_classes=None,disparity_tolerance=1.25,metrics=\['fnr', 'fpr', 'tpr'\]): diff --git a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd index 802fc87c8..39e13b78f 100644 --- a/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd +++ b/docs/validmind/tests/data_validation/ProtectedClassesThresholdOptimizer.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ProtectedClassesThresholdOptimizer" +title: "[validmind](/validmind/validmind.html).ProtectedClassesThresholdOptimizer" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -100,7 +100,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('bias_and_fairness')@@tasks('classification', 'regression') +@tags('bias_and_fairness')@tasks('classification', 'regression') defProtectedClassesThresholdOptimizer(dataset,pipeline=None,protected_classes=None,X_train=None,y_train=None): diff --git a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd index 89082d1ba..3d92007e3 100644 --- a/docs/validmind/tests/data_validation/RollingStatsPlot.qmd +++ b/docs/validmind/tests/data_validation/RollingStatsPlot.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RollingStatsPlot" +title: "[validmind](/validmind/validmind.html).RollingStatsPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -@@tags('time_series_data', 'visualization', 'stationarity')@@tasks('regression') +@tags('time_series_data', 'visualization', 'stationarity')@tasks('regression') defRollingStatsPlot(dataset:VMDataset,window_size:int=12): diff --git a/docs/validmind/tests/data_validation/RunsTest.qmd b/docs/validmind/tests/data_validation/RunsTest.qmd index e6674fe87..b93ab2581 100644 --- a/docs/validmind/tests/data_validation/RunsTest.qmd +++ b/docs/validmind/tests/data_validation/RunsTest.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RunsTest" +title: "[validmind](/validmind/validmind.html).RunsTest" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tasks('classification', 'regression')@@tags('tabular_data', 'statistical_test', 'statsmodels') +@tasks('classification', 'regression')@tags('tabular_data', 'statistical_test', 'statsmodels') defRunsTest(dataset): diff --git a/docs/validmind/tests/data_validation/ScatterPlot.qmd b/docs/validmind/tests/data_validation/ScatterPlot.qmd index 5001f4558..328050551 100644 --- a/docs/validmind/tests/data_validation/ScatterPlot.qmd +++ b/docs/validmind/tests/data_validation/ScatterPlot.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ScatterPlot" +title: "[validmind](/validmind/validmind.html).ScatterPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'visualization')@@tasks('classification', 'regression') +@tags('tabular_data', 'visualization')@tasks('classification', 'regression') defScatterPlot(dataset): diff --git a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd index 9a4f39a87..f11e66486 100644 --- a/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd +++ b/docs/validmind/tests/data_validation/ScoreBandDefaultRates.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ScoreBandDefaultRates" +title: "[validmind](/validmind/validmind.html).ScoreBandDefaultRates" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('visualization', 'credit_risk', 'scorecard')@@tasks('classification') +@tags('visualization', 'credit_risk', 'scorecard')@tasks('classification') defScoreBandDefaultRates(dataset:VMDataset,model:VMModel,score_column:str='score',score_bands:list=None): diff --git a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd index 9779a040f..87d3a3c0f 100644 --- a/docs/validmind/tests/data_validation/SeasonalDecompose.qmd +++ b/docs/validmind/tests/data_validation/SeasonalDecompose.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).SeasonalDecompose" +title: "[validmind](/validmind/validmind.html).SeasonalDecompose" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('time_series_data', 'seasonality', 'statsmodels')@@tasks('regression') +@tags('time_series_data', 'seasonality', 'statsmodels')@tasks('regression') defSeasonalDecompose(dataset:VMDataset,seasonal_model:str='additive'): diff --git a/docs/validmind/tests/data_validation/ShapiroWilk.qmd b/docs/validmind/tests/data_validation/ShapiroWilk.qmd index 3f038e96a..ef175856d 100644 --- a/docs/validmind/tests/data_validation/ShapiroWilk.qmd +++ b/docs/validmind/tests/data_validation/ShapiroWilk.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ShapiroWilk" +title: "[validmind](/validmind/validmind.html).ShapiroWilk" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tasks('classification', 'regression')@@tags('tabular_data', 'data_distribution', 'statistical_test') +@tasks('classification', 'regression')@tags('tabular_data', 'data_distribution', 'statistical_test') defShapiroWilk(dataset): diff --git a/docs/validmind/tests/data_validation/Skewness.qmd b/docs/validmind/tests/data_validation/Skewness.qmd index 5693cb818..32d89216c 100644 --- a/docs/validmind/tests/data_validation/Skewness.qmd +++ b/docs/validmind/tests/data_validation/Skewness.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).Skewness" +title: "[validmind](/validmind/validmind.html).Skewness" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('data_quality', 'tabular_data')@@tasks('classification', 'regression') +@tags('data_quality', 'tabular_data')@tasks('classification', 'regression') defSkewness(dataset,max_threshold=1): diff --git a/docs/validmind/tests/data_validation/SpreadPlot.qmd b/docs/validmind/tests/data_validation/SpreadPlot.qmd index 9e5283a60..79bfdb3dd 100644 --- a/docs/validmind/tests/data_validation/SpreadPlot.qmd +++ b/docs/validmind/tests/data_validation/SpreadPlot.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).SpreadPlot" +title: "[validmind](/validmind/validmind.html).SpreadPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('time_series_data', 'visualization')@@tasks('regression') +@tags('time_series_data', 'visualization')@tasks('regression') defSpreadPlot(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd index 673637a90..33d1ae1a7 100644 --- a/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TabularCategoricalBarPlots.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TabularCategoricalBarPlots" +title: "[validmind](/validmind/validmind.html).TabularCategoricalBarPlots" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'visualization')@@tasks('classification', 'regression') +@tags('tabular_data', 'visualization')@tasks('classification', 'regression') defTabularCategoricalBarPlots(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd index f3082d19f..ade381f18 100644 --- a/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularDateTimeHistograms.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TabularDateTimeHistograms" +title: "[validmind](/validmind/validmind.html).TabularDateTimeHistograms" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('time_series_data', 'visualization')@@tasks('classification', 'regression') +@tags('time_series_data', 'visualization')@tasks('classification', 'regression') defTabularDateTimeHistograms(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd index f302ed3d4..30b5888bd 100644 --- a/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd +++ b/docs/validmind/tests/data_validation/TabularDescriptionTables.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TabularDescriptionTables" +title: "[validmind](/validmind/validmind.html).TabularDescriptionTables" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -86,7 +86,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data')@@tasks('classification', 'regression') +@tags('tabular_data')@tasks('classification', 'regression') defTabularDescriptionTables(dataset): diff --git a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd index 88f48eceb..6c6b431ae 100644 --- a/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd +++ b/docs/validmind/tests/data_validation/TabularNumericalHistograms.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TabularNumericalHistograms" +title: "[validmind](/validmind/validmind.html).TabularNumericalHistograms" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'visualization')@@tasks('classification', 'regression') +@tags('tabular_data', 'visualization')@tasks('classification', 'regression') defTabularNumericalHistograms(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd index e9a644517..691f08e19 100644 --- a/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd +++ b/docs/validmind/tests/data_validation/TargetRateBarPlots.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TargetRateBarPlots" +title: "[validmind](/validmind/validmind.html).TargetRateBarPlots" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'visualization', 'categorical_data')@@tasks('classification') +@tags('tabular_data', 'visualization', 'categorical_data')@tasks('classification') defTargetRateBarPlots(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd index e0c299178..e19ffb5fb 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescription.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TimeSeriesDescription" +title: "[validmind](/validmind/validmind.html).TimeSeriesDescription" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('time_series_data', 'analysis')@@tasks('regression') +@tags('time_series_data', 'analysis')@tasks('regression') defTimeSeriesDescription(dataset): diff --git a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd index 0f6c7d801..450465ee0 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesDescriptiveStatistics.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TimeSeriesDescriptiveStatistics" +title: "[validmind](/validmind/validmind.html).TimeSeriesDescriptiveStatistics" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('time_series_data', 'analysis')@@tasks('regression') +@tags('time_series_data', 'analysis')@tasks('regression') defTimeSeriesDescriptiveStatistics(dataset): diff --git a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd index d3047fe8b..6d9c26ea0 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesFrequency.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TimeSeriesFrequency" +title: "[validmind](/validmind/validmind.html).TimeSeriesFrequency" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('time_series_data')@@tasks('regression') +@tags('time_series_data')@tasks('regression') defTimeSeriesFrequency(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd index 1a1f4c0ad..75615434b 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesHistogram.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TimeSeriesHistogram" +title: "[validmind](/validmind/validmind.html).TimeSeriesHistogram" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('data_validation', 'visualization', 'time_series_data')@@tasks('regression', 'time_series_forecasting') +@tags('data_validation', 'visualization', 'time_series_data')@tasks('regression', 'time_series_forecasting') defTimeSeriesHistogram(dataset,nbins=30): diff --git a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd index 111ddba26..e12d61b89 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesLinePlot.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TimeSeriesLinePlot" +title: "[validmind](/validmind/validmind.html).TimeSeriesLinePlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('time_series_data', 'visualization')@@tasks('regression') +@tags('time_series_data', 'visualization')@tasks('regression') defTimeSeriesLinePlot(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd index f0f8e30b2..7fb13e358 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesMissingValues.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TimeSeriesMissingValues" +title: "[validmind](/validmind/validmind.html).TimeSeriesMissingValues" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('time_series_data')@@tasks('regression') +@tags('time_series_data')@tasks('regression') defTimeSeriesMissingValues(dataset:VMDataset,min_threshold:int=1): diff --git a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd index 096afd31a..6b887652e 100644 --- a/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd +++ b/docs/validmind/tests/data_validation/TimeSeriesOutliers.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TimeSeriesOutliers" +title: "[validmind](/validmind/validmind.html).TimeSeriesOutliers" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('time_series_data')@@tasks('regression') +@tags('time_series_data')@tasks('regression') defTimeSeriesOutliers(dataset:VMDataset,zscore_threshold:int=3): diff --git a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd index deb53fdae..c4310e202 100644 --- a/docs/validmind/tests/data_validation/TooManyZeroValues.qmd +++ b/docs/validmind/tests/data_validation/TooManyZeroValues.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TooManyZeroValues" +title: "[validmind](/validmind/validmind.html).TooManyZeroValues" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data')@@tasks('regression', 'classification') +@tags('tabular_data')@tasks('regression', 'classification') defTooManyZeroValues(dataset:VMDataset,max_percent_threshold:float=0.03): diff --git a/docs/validmind/tests/data_validation/UniqueRows.qmd b/docs/validmind/tests/data_validation/UniqueRows.qmd index 5bf0187df..5aede8c49 100644 --- a/docs/validmind/tests/data_validation/UniqueRows.qmd +++ b/docs/validmind/tests/data_validation/UniqueRows.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).UniqueRows" +title: "[validmind](/validmind/validmind.html).UniqueRows" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data')@@tasks('regression', 'classification') +@tags('tabular_data')@tasks('regression', 'classification') defUniqueRows(dataset:VMDataset,min_percent_threshold:float=1): diff --git a/docs/validmind/tests/data_validation/WOEBinPlots.qmd b/docs/validmind/tests/data_validation/WOEBinPlots.qmd index c87b7ebed..c05dc44a1 100644 --- a/docs/validmind/tests/data_validation/WOEBinPlots.qmd +++ b/docs/validmind/tests/data_validation/WOEBinPlots.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).WOEBinPlots" +title: "[validmind](/validmind/validmind.html).WOEBinPlots" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('tabular_data', 'visualization', 'categorical_data')@@tasks('classification') +@tags('tabular_data', 'visualization', 'categorical_data')@tasks('classification') defWOEBinPlots(dataset:VMDataset,breaks_adj:list=None,fig_height:int=600,fig_width:int=500): diff --git a/docs/validmind/tests/data_validation/WOEBinTable.qmd b/docs/validmind/tests/data_validation/WOEBinTable.qmd index b928f9d42..996c07803 100644 --- a/docs/validmind/tests/data_validation/WOEBinTable.qmd +++ b/docs/validmind/tests/data_validation/WOEBinTable.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).WOEBinTable" +title: "[validmind](/validmind/validmind.html).WOEBinTable" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'categorical_data')@@tasks('classification') +@tags('tabular_data', 'categorical_data')@tasks('classification') defWOEBinTable(dataset:VMDataset,breaks_adj:list=None): diff --git a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd index 6f32ad336..e14a895a5 100644 --- a/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd +++ b/docs/validmind/tests/data_validation/ZivotAndrewsArch.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ZivotAndrewsArch" +title: "[validmind](/validmind/validmind.html).ZivotAndrewsArch" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('time_series_data', 'stationarity', 'unit_root_test')@@tasks('regression') +@tags('time_series_data', 'stationarity', 'unit_root_test')@tasks('regression') defZivotAndrewsArch(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/nlp.qmd b/docs/validmind/tests/data_validation/nlp.qmd index c27846e97..a8d25256a 100644 --- a/docs/validmind/tests/data_validation/nlp.qmd +++ b/docs/validmind/tests/data_validation/nlp.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).nlp" +title: "[validmind](/validmind/validmind.html).nlp" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd index e01bea9f0..8f53de6f4 100644 --- a/docs/validmind/tests/data_validation/nlp/CommonWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/CommonWords.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).CommonWords" +title: "[validmind](/validmind/validmind.html).CommonWords" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@@tasks('text_classification', 'text_summarization') +@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@tasks('text_classification', 'text_summarization') defCommonWords(dataset:VMDataset): diff --git a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd index a916ec583..19abded35 100644 --- a/docs/validmind/tests/data_validation/nlp/Hashtags.qmd +++ b/docs/validmind/tests/data_validation/nlp/Hashtags.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).Hashtags" +title: "[validmind](/validmind/validmind.html).Hashtags" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@@tasks('text_classification', 'text_summarization') +@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@tasks('text_classification', 'text_summarization') defHashtags(dataset:VMDataset,top_hashtags:int=25): diff --git a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd index 6b289f960..5c201de54 100644 --- a/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd +++ b/docs/validmind/tests/data_validation/nlp/LanguageDetection.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).LanguageDetection" +title: "[validmind](/validmind/validmind.html).LanguageDetection" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') +@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') defLanguageDetection(dataset): diff --git a/docs/validmind/tests/data_validation/nlp/Mentions.qmd b/docs/validmind/tests/data_validation/nlp/Mentions.qmd index 2dd521680..a60d7cb94 100644 --- a/docs/validmind/tests/data_validation/nlp/Mentions.qmd +++ b/docs/validmind/tests/data_validation/nlp/Mentions.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).Mentions" +title: "[validmind](/validmind/validmind.html).Mentions" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@@tasks('text_classification', 'text_summarization') +@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@tasks('text_classification', 'text_summarization') defMentions(dataset:VMDataset,top_mentions:int=25): diff --git a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd index 7579cc7cd..b9daa00f7 100644 --- a/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd +++ b/docs/validmind/tests/data_validation/nlp/PolarityAndSubjectivity.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).PolarityAndSubjectivity" +title: "[validmind](/validmind/validmind.html).PolarityAndSubjectivity" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('nlp', 'text_data', 'data_validation')@@tasks('nlp') +@tags('nlp', 'text_data', 'data_validation')@tasks('nlp') defPolarityAndSubjectivity(dataset,threshold_subjectivity=0.5,threshold_polarity=0): diff --git a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd index 800aa1f12..313e6578b 100644 --- a/docs/validmind/tests/data_validation/nlp/Punctuations.qmd +++ b/docs/validmind/tests/data_validation/nlp/Punctuations.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).Punctuations" +title: "[validmind](/validmind/validmind.html).Punctuations" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -18,7 +18,7 @@ Metrics functions for any Pandas-compatible datasets ::: {.signature} -@@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@@tasks('text_classification', 'text_summarization', 'nlp') +@tags('nlp', 'text_data', 'visualization', 'frequency_analysis')@tasks('text_classification', 'text_summarization', 'nlp') defPunctuations(dataset,count_mode='token'): diff --git a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd index 005c8b1b5..5be1148df 100644 --- a/docs/validmind/tests/data_validation/nlp/Sentiment.qmd +++ b/docs/validmind/tests/data_validation/nlp/Sentiment.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).Sentiment" +title: "[validmind](/validmind/validmind.html).Sentiment" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('nlp', 'text_data', 'data_validation')@@tasks('nlp') +@tags('nlp', 'text_data', 'data_validation')@tasks('nlp') defSentiment(dataset): diff --git a/docs/validmind/tests/data_validation/nlp/StopWords.qmd b/docs/validmind/tests/data_validation/nlp/StopWords.qmd index 5e098b863..ef79bea28 100644 --- a/docs/validmind/tests/data_validation/nlp/StopWords.qmd +++ b/docs/validmind/tests/data_validation/nlp/StopWords.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).StopWords" +title: "[validmind](/validmind/validmind.html).StopWords" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -18,7 +18,7 @@ Threshold based tests ::: {.signature} -@@tags('nlp', 'text_data', 'frequency_analysis', 'visualization')@@tasks('text_classification', 'text_summarization') +@tags('nlp', 'text_data', 'frequency_analysis', 'visualization')@tasks('text_classification', 'text_summarization') defStopWords(dataset:VMDataset,min_percent_threshold:float=0.5,num_words:int=25): diff --git a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd index 3f1708eb7..c2d32846c 100644 --- a/docs/validmind/tests/data_validation/nlp/TextDescription.qmd +++ b/docs/validmind/tests/data_validation/nlp/TextDescription.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TextDescription" +title: "[validmind](/validmind/validmind.html).TextDescription" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') +@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') defTextDescription(dataset:VMDataset,unwanted_tokens:set={'s', "s'", 'mr', 'ms', 'mrs', 'dr', "'s", ' ', "''", 'dollar', 'us', '\`\`'},lang:str='english'): diff --git a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd index 791b8b664..46438e5fa 100644 --- a/docs/validmind/tests/data_validation/nlp/Toxicity.qmd +++ b/docs/validmind/tests/data_validation/nlp/Toxicity.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).Toxicity" +title: "[validmind](/validmind/validmind.html).Toxicity" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('nlp', 'text_data', 'data_validation')@@tasks('nlp') +@tags('nlp', 'text_data', 'data_validation')@tasks('nlp') defToxicity(dataset): diff --git a/docs/validmind/tests/model_validation.qmd b/docs/validmind/tests/model_validation.qmd index 41ddcf516..240a747c8 100644 --- a/docs/validmind/tests/model_validation.qmd +++ b/docs/validmind/tests/model_validation.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).model_validation" +title: "[validmind](/validmind/validmind.html).model_validation" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/tests/model_validation/BertScore.qmd b/docs/validmind/tests/model_validation/BertScore.qmd index 8281786e4..cd2d68ec6 100644 --- a/docs/validmind/tests/model_validation/BertScore.qmd +++ b/docs/validmind/tests/model_validation/BertScore.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).BertScore" +title: "[validmind](/validmind/validmind.html).BertScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true:Union\[np.ndarray, list\],y_pred:Union\[np.ndarray, list\],dataset_id:Optional\[str\]=None)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: +defvalidate_prediction(y_true:Union\[np.ndarray, list\],y_pred:Union\[np.ndarray, list\],dataset_id:Optional\[str\]=None)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') +@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') defBertScore(dataset,model,evaluation_model='distilbert-base-uncased'): diff --git a/docs/validmind/tests/model_validation/BleuScore.qmd b/docs/validmind/tests/model_validation/BleuScore.qmd index 1539a6201..a7427a59f 100644 --- a/docs/validmind/tests/model_validation/BleuScore.qmd +++ b/docs/validmind/tests/model_validation/BleuScore.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).BleuScore" +title: "[validmind](/validmind/validmind.html).BleuScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true:Union\[np.ndarray, list\],y_pred:Union\[np.ndarray, list\],dataset_id:Optional\[str\]=None)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: +defvalidate_prediction(y_true:Union\[np.ndarray, list\],y_pred:Union\[np.ndarray, list\],dataset_id:Optional\[str\]=None)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') +@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') defBleuScore(dataset,model): diff --git a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd index 9b3d2f85e..02a53e0d2 100644 --- a/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd +++ b/docs/validmind/tests/model_validation/ClusterSizeDistribution.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ClusterSizeDistribution" +title: "[validmind](/validmind/validmind.html).ClusterSizeDistribution" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'model_performance')@@tasks('clustering') +@tags('sklearn', 'model_performance')@tasks('clustering') defClusterSizeDistribution(dataset:VMDataset,model:VMModel): diff --git a/docs/validmind/tests/model_validation/ContextualRecall.qmd b/docs/validmind/tests/model_validation/ContextualRecall.qmd index 7b053ee9d..25336261b 100644 --- a/docs/validmind/tests/model_validation/ContextualRecall.qmd +++ b/docs/validmind/tests/model_validation/ContextualRecall.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ContextualRecall" +title: "[validmind](/validmind/validmind.html).ContextualRecall" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true:Union\[np.ndarray, list\],y_pred:Union\[np.ndarray, list\],dataset_id:Optional\[str\]=None)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: +defvalidate_prediction(y_true:Union\[np.ndarray, list\],y_pred:Union\[np.ndarray, list\],dataset_id:Optional\[str\]=None)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') +@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') defContextualRecall(dataset,model): diff --git a/docs/validmind/tests/model_validation/FeaturesAUC.qmd b/docs/validmind/tests/model_validation/FeaturesAUC.qmd index 24320a897..c3e0dc4db 100644 --- a/docs/validmind/tests/model_validation/FeaturesAUC.qmd +++ b/docs/validmind/tests/model_validation/FeaturesAUC.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).FeaturesAUC" +title: "[validmind](/validmind/validmind.html).FeaturesAUC" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('feature_importance', 'AUC', 'visualization')@@tasks('classification') +@tags('feature_importance', 'AUC', 'visualization')@tasks('classification') defFeaturesAUC(dataset:VMDataset,fontsize:int=12,figure_height:int=500): diff --git a/docs/validmind/tests/model_validation/MeteorScore.qmd b/docs/validmind/tests/model_validation/MeteorScore.qmd index 4a67f09b1..b3f65cc5c 100644 --- a/docs/validmind/tests/model_validation/MeteorScore.qmd +++ b/docs/validmind/tests/model_validation/MeteorScore.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).MeteorScore" +title: "[validmind](/validmind/validmind.html).MeteorScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true:Union\[np.ndarray, list\],y_pred:Union\[np.ndarray, list\],dataset_id:Optional\[str\]=None)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: +defvalidate_prediction(y_true:Union\[np.ndarray, list\],y_pred:Union\[np.ndarray, list\],dataset_id:Optional\[str\]=None)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') +@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') defMeteorScore(dataset,model): diff --git a/docs/validmind/tests/model_validation/ModelMetadata.qmd b/docs/validmind/tests/model_validation/ModelMetadata.qmd index d8e6ec0a7..673a0943e 100644 --- a/docs/validmind/tests/model_validation/ModelMetadata.qmd +++ b/docs/validmind/tests/model_validation/ModelMetadata.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ModelMetadata" +title: "[validmind](/validmind/validmind.html).ModelMetadata" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -28,7 +28,7 @@ Attempts to extract all model info from a model object instance ::: {.signature} -@@tags('model_training', 'metadata')@@tasks('regression', 'time_series_forecasting') +@tags('model_training', 'metadata')@tasks('regression', 'time_series_forecasting') defModelMetadata(model): diff --git a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd index f47313d2b..86faa8d90 100644 --- a/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd +++ b/docs/validmind/tests/model_validation/ModelPredictionResiduals.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ModelPredictionResiduals" +title: "[validmind](/validmind/validmind.html).ModelPredictionResiduals" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('regression')@@tasks('residual_analysis', 'visualization') +@tags('regression')@tasks('residual_analysis', 'visualization') defModelPredictionResiduals(dataset,model,nbins=100,p_value_threshold=0.05,start_date=None,end_date=None): diff --git a/docs/validmind/tests/model_validation/RegardScore.qmd b/docs/validmind/tests/model_validation/RegardScore.qmd index 754556911..b73a86529 100644 --- a/docs/validmind/tests/model_validation/RegardScore.qmd +++ b/docs/validmind/tests/model_validation/RegardScore.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RegardScore" +title: "[validmind](/validmind/validmind.html).RegardScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defvalidate_prediction(y_true:Union\[np.ndarray, list\],y_pred:Union\[np.ndarray, list\],dataset_id:Optional\[str\]=None)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: +defvalidate_prediction(y_true:Union\[np.ndarray, list\],y_pred:Union\[np.ndarray, list\],dataset_id:Optional\[str\]=None)Tuple\[validmind.vm_models.np.validmind.vm_models.ndarray, validmind.vm_models.np.validmind.vm_models.ndarray\]: ::: @@ -38,7 +38,7 @@ Comprehensive validation of true and predicted value pairs. Handles NaN/None val ::: {.signature} -@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') +@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') defRegardScore(dataset,model): diff --git a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd index ba181de44..1b75bb684 100644 --- a/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd +++ b/docs/validmind/tests/model_validation/RegressionResidualsPlot.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RegressionResidualsPlot" +title: "[validmind](/validmind/validmind.html).RegressionResidualsPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('model_performance', 'visualization')@@tasks('regression') +@tags('model_performance', 'visualization')@tasks('regression') defRegressionResidualsPlot(model:VMModel,dataset:VMDataset,bin_size:float=0.1): diff --git a/docs/validmind/tests/model_validation/RougeScore.qmd b/docs/validmind/tests/model_validation/RougeScore.qmd index 01fb79ea3..34a38a3ee 100644 --- a/docs/validmind/tests/model_validation/RougeScore.qmd +++ b/docs/validmind/tests/model_validation/RougeScore.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RougeScore" +title: "[validmind](/validmind/validmind.html).RougeScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') +@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') defRougeScore(dataset,model,metric='rouge-1'): diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd index 22d460f72..857ca2fe1 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionWithCI.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TimeSeriesPredictionWithCI" +title: "[validmind](/validmind/validmind.html).TimeSeriesPredictionWithCI" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('model_predictions', 'visualization')@@tasks('regression', 'time_series_forecasting') +@tags('model_predictions', 'visualization')@tasks('regression', 'time_series_forecasting') defTimeSeriesPredictionWithCI(dataset,model,confidence=0.95): diff --git a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd index a59dcd2bf..244f7a82a 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesPredictionsPlot.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TimeSeriesPredictionsPlot" +title: "[validmind](/validmind/validmind.html).TimeSeriesPredictionsPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('model_predictions', 'visualization')@@tasks('regression', 'time_series_forecasting') +@tags('model_predictions', 'visualization')@tasks('regression', 'time_series_forecasting') defTimeSeriesPredictionsPlot(dataset,model): diff --git a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd index 847ebc997..126181714 100644 --- a/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd +++ b/docs/validmind/tests/model_validation/TimeSeriesR2SquareBySegments.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TimeSeriesR2SquareBySegments" +title: "[validmind](/validmind/validmind.html).TimeSeriesR2SquareBySegments" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('model_performance', 'sklearn')@@tasks('regression', 'time_series_forecasting') +@tags('model_performance', 'sklearn')@tasks('regression', 'time_series_forecasting') defTimeSeriesR2SquareBySegments(dataset,model,segments=None): diff --git a/docs/validmind/tests/model_validation/TokenDisparity.qmd b/docs/validmind/tests/model_validation/TokenDisparity.qmd index de59080c0..7f65f8533 100644 --- a/docs/validmind/tests/model_validation/TokenDisparity.qmd +++ b/docs/validmind/tests/model_validation/TokenDisparity.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TokenDisparity" +title: "[validmind](/validmind/validmind.html).TokenDisparity" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') +@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') defTokenDisparity(dataset,model): diff --git a/docs/validmind/tests/model_validation/ToxicityScore.qmd b/docs/validmind/tests/model_validation/ToxicityScore.qmd index db38b6b9a..be91aead2 100644 --- a/docs/validmind/tests/model_validation/ToxicityScore.qmd +++ b/docs/validmind/tests/model_validation/ToxicityScore.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ToxicityScore" +title: "[validmind](/validmind/validmind.html).ToxicityScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('nlp', 'text_data', 'visualization')@@tasks('text_classification', 'text_summarization') +@tags('nlp', 'text_data', 'visualization')@tasks('text_classification', 'text_summarization') defToxicityScore(dataset,model): diff --git a/docs/validmind/tests/model_validation/sklearn.qmd b/docs/validmind/tests/model_validation/sklearn.qmd index 3f05429dd..5d41fc374 100644 --- a/docs/validmind/tests/model_validation/sklearn.qmd +++ b/docs/validmind/tests/model_validation/sklearn.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).sklearn" +title: "[validmind](/validmind/validmind.html).sklearn" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd index 8a9964c0d..6202b6ad3 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedMutualInformation.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).AdjustedMutualInformation" +title: "[validmind](/validmind/validmind.html).AdjustedMutualInformation" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'model_performance', 'clustering')@@tasks('clustering') +@tags('sklearn', 'model_performance', 'clustering')@tasks('clustering') defAdjustedMutualInformation(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd index 11932b7f9..fc43cfc8e 100644 --- a/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/AdjustedRandIndex.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).AdjustedRandIndex" +title: "[validmind](/validmind/validmind.html).AdjustedRandIndex" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'model_performance', 'clustering')@@tasks('clustering') +@tags('sklearn', 'model_performance', 'clustering')@tasks('clustering') defAdjustedRandIndex(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd index 53b47ed48..37e9ae6b8 100644 --- a/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CalibrationCurve.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).CalibrationCurve" +title: "[validmind](/validmind/validmind.html).CalibrationCurve" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'model_performance', 'classification')@@tasks('classification') +@tags('sklearn', 'model_performance', 'classification')@tasks('classification') defCalibrationCurve(model:VMModel,dataset:VMDataset,n_bins:int=10): diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd index b93b83006..2f927356f 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierPerformance.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ClassifierPerformance" +title: "[validmind](/validmind/validmind.html).ClassifierPerformance" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@@tasks('classification', 'text_classification') +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@tasks('classification', 'text_classification') defClassifierPerformance(dataset:VMDataset,model:VMModel,average:str='macro'): diff --git a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd index 83ec9309c..c0316325d 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClassifierThresholdOptimization.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ClassifierThresholdOptimization" +title: "[validmind](/validmind/validmind.html).ClassifierThresholdOptimization" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,9 +14,9 @@ toc-expand: 4 ::: {.signature} -@@tags('model_validation', 'threshold_optimization', 'classification_metrics')@@tasks('classification') +@tags('model_validation', 'threshold_optimization', 'classification_metrics')@tasks('classification') -defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods:Optional\[List\[str\]\]=None,target_recall:Optional\[float\]=None)Dict\[str, Union\[validmind.vm_models.pd.validmind.vm_models.DataFrame, validmind.vm_models.go.validmind.vm_models.Figure\]\]: +defClassifierThresholdOptimization(dataset:VMDataset,model:VMModel,methods:Optional\[List\[str\]\]=None,target_recall:Optional\[float\]=None)Dict\[str, Union\[validmind.vm_models.pd.validmind.vm_models.DataFrame, validmind.vm_models.go.validmind.vm_models.Figure\]\]: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd index 139700d47..ddba60827 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterCosineSimilarity.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ClusterCosineSimilarity" +title: "[validmind](/validmind/validmind.html).ClusterCosineSimilarity" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'model_performance', 'clustering')@@tasks('clustering') +@tags('sklearn', 'model_performance', 'clustering')@tasks('clustering') defClusterCosineSimilarity(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd index 6930db98e..cab8b5c28 100644 --- a/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ClusterPerformanceMetrics.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ClusterPerformanceMetrics" +title: "[validmind](/validmind/validmind.html).ClusterPerformanceMetrics" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'model_performance', 'clustering')@@tasks('clustering') +@tags('sklearn', 'model_performance', 'clustering')@tasks('clustering') defClusterPerformanceMetrics(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd index 87192dc89..f9d2e3f79 100644 --- a/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/CompletenessScore.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).CompletenessScore" +title: "[validmind](/validmind/validmind.html).CompletenessScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'model_performance', 'clustering')@@tasks('clustering') +@tags('sklearn', 'model_performance', 'clustering')@tasks('clustering') defCompletenessScore(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd index 0ab425249..3fff0568c 100644 --- a/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ConfusionMatrix.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ConfusionMatrix" +title: "[validmind](/validmind/validmind.html).ConfusionMatrix" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')@@tasks('classification', 'text_classification') +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')@tasks('classification', 'text_classification') defConfusionMatrix(dataset:VMDataset,model:VMModel): diff --git a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd index c941c8461..f96e22e83 100644 --- a/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FeatureImportance.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).FeatureImportance" +title: "[validmind](/validmind/validmind.html).FeatureImportance" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('model_explainability', 'sklearn')@@tasks('regression', 'time_series_forecasting') +@tags('model_explainability', 'sklearn')@tasks('regression', 'time_series_forecasting') defFeatureImportance(dataset:VMDataset,model:VMModel,num_features:int=3): diff --git a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd index bf2ec453a..44da10a22 100644 --- a/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/FowlkesMallowsScore.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).FowlkesMallowsScore" +title: "[validmind](/validmind/validmind.html).FowlkesMallowsScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'model_performance')@@tasks('clustering') +@tags('sklearn', 'model_performance')@tasks('clustering') defFowlkesMallowsScore(dataset:VMDataset,model:VMModel): diff --git a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd index 937a5219c..a3db2a04a 100644 --- a/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HomogeneityScore.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).HomogeneityScore" +title: "[validmind](/validmind/validmind.html).HomogeneityScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'model_performance')@@tasks('clustering') +@tags('sklearn', 'model_performance')@tasks('clustering') defHomogeneityScore(dataset:VMDataset,model:VMModel): diff --git a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd index fb20abe2a..0b59fa3e7 100644 --- a/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd +++ b/docs/validmind/tests/model_validation/sklearn/HyperParametersTuning.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).HyperParametersTuning" +title: "[validmind](/validmind/validmind.html).HyperParametersTuning" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'model_performance')@@tasks('classification', 'clustering') +@tags('sklearn', 'model_performance')@tasks('classification', 'clustering') defcustom_recall(y_true,y_pred_proba,threshold=0.5): @@ -28,7 +28,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'model_performance')@@tasks('clustering', 'classification') +@tags('sklearn', 'model_performance')@tasks('clustering', 'classification') defHyperParametersTuning(model:VMModel,dataset:VMDataset,param_grid:dict,scoring:Union\[str, List, Dict\]=None,thresholds:Union\[float, List\[float\]\]=None,fit_params:dict=None): diff --git a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd index e90bee33a..d50b05121 100644 --- a/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd +++ b/docs/validmind/tests/model_validation/sklearn/KMeansClustersOptimization.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).KMeansClustersOptimization" +title: "[validmind](/validmind/validmind.html).KMeansClustersOptimization" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'model_performance', 'kmeans')@@tasks('clustering') +@tags('sklearn', 'model_performance', 'kmeans')@tasks('clustering') defKMeansClustersOptimization(model:VMModel,dataset:VMDataset,n_clusters:Union\[List\[int\], None\]=None): diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd index a1dba195d..f0cfb9933 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumAccuracy.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).MinimumAccuracy" +title: "[validmind](/validmind/validmind.html).MinimumAccuracy" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@@tasks('classification', 'text_classification') +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@tasks('classification', 'text_classification') defMinimumAccuracy(dataset:VMDataset,model:VMModel,min_threshold:float=0.7): diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd index 271da865d..2705247ad 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumF1Score.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).MinimumF1Score" +title: "[validmind](/validmind/validmind.html).MinimumF1Score" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@@tasks('classification', 'text_classification') +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@tasks('classification', 'text_classification') defMinimumF1Score(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): diff --git a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd index 93cc6211f..ccf6af255 100644 --- a/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd +++ b/docs/validmind/tests/model_validation/sklearn/MinimumROCAUCScore.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).MinimumROCAUCScore" +title: "[validmind](/validmind/validmind.html).MinimumROCAUCScore" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@@tasks('classification', 'text_classification') +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@tasks('classification', 'text_classification') defMinimumROCAUCScore(dataset:VMDataset,model:VMModel,min_threshold:float=0.5): diff --git a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd index 286d50803..8c05288ad 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelParameters.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ModelParameters" +title: "[validmind](/validmind/validmind.html).ModelParameters" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('model_training', 'metadata')@@tasks('classification', 'regression') +@tags('model_training', 'metadata')@tasks('classification', 'regression') defModelParameters(model,model_params=None): diff --git a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd index 471a5bf45..c1bc54586 100644 --- a/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ModelsPerformanceComparison.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ModelsPerformanceComparison" +title: "[validmind](/validmind/validmind.html).ModelsPerformanceComparison" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -24,7 +24,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'model_comparison')@@tasks('classification', 'text_classification') +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'model_comparison')@tasks('classification', 'text_classification') defModelsPerformanceComparison(dataset:VMDataset,models:list\[VMModel\]): diff --git a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd index dc5172ea0..ce4b95858 100644 --- a/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/OverfitDiagnosis.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).OverfitDiagnosis" +title: "[validmind](/validmind/validmind.html).OverfitDiagnosis" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'linear_regression', 'model_diagnosis')@@tasks('classification', 'regression') +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'linear_regression', 'model_diagnosis')@tasks('classification', 'regression') defOverfitDiagnosis(model:VMModel,datasets:List\[VMDataset\],metric:str=None,cut_off_threshold:float=DEFAULT_THRESHOLD): diff --git a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd index 678bbb496..a2ec62c21 100644 --- a/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PermutationFeatureImportance.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).PermutationFeatureImportance" +title: "[validmind](/validmind/validmind.html).PermutationFeatureImportance" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')@@tasks('classification', 'text_classification') +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')@tasks('classification', 'text_classification') defPermutationFeatureImportance(model:VMModel,dataset:VMDataset,fontsize:Union\[int, None\]=None,figure_height:Union\[int, None\]=None): diff --git a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd index 93ce7dfcc..b9f18b23a 100644 --- a/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PopulationStabilityIndex.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).PopulationStabilityIndex" +title: "[validmind](/validmind/validmind.html).PopulationStabilityIndex" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -46,7 +46,7 @@ https://towardsdatascience.com/checking-model-stability-and-population-shift-wit ::: {.signature} -@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@@tasks('classification', 'text_classification') +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance')@tasks('classification', 'text_classification') defPopulationStabilityIndex(datasets:List\[VMDataset\],model:VMModel,num_bins:int=10,mode:str='fixed'): diff --git a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd index 9e892263b..7f0c50317 100644 --- a/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/PrecisionRecallCurve.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).PrecisionRecallCurve" +title: "[validmind](/validmind/validmind.html).PrecisionRecallCurve" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'binary_classification', 'model_performance', 'visualization')@@tasks('classification', 'text_classification') +@tags('sklearn', 'binary_classification', 'model_performance', 'visualization')@tasks('classification', 'text_classification') defPrecisionRecallCurve(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd index 24af70b9b..fd7d9d8be 100644 --- a/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ROCCurve.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ROCCurve" +title: "[validmind](/validmind/validmind.html).ROCCurve" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')@@tasks('classification', 'text_classification') +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')@tasks('classification', 'text_classification') defROCCurve(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd index cd0995824..d1499688d 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrors.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RegressionErrors" +title: "[validmind](/validmind/validmind.html).RegressionErrors" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'model_performance')@@tasks('regression', 'classification') +@tags('sklearn', 'model_performance')@tasks('regression', 'classification') defRegressionErrors(model,dataset): diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd index fe5a7eda9..2d04cb601 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionErrorsComparison.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RegressionErrorsComparison" +title: "[validmind](/validmind/validmind.html).RegressionErrorsComparison" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('model_performance', 'sklearn')@@tasks('regression', 'time_series_forecasting') +@tags('model_performance', 'sklearn')@tasks('regression', 'time_series_forecasting') defRegressionErrorsComparison(datasets,models): diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd index 071acfb4f..c37d96319 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionPerformance.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RegressionPerformance" +title: "[validmind](/validmind/validmind.html).RegressionPerformance" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('sklearn', 'model_performance')@@tasks('regression') +@tags('sklearn', 'model_performance')@tasks('regression') defRegressionPerformance(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd index 3e83fe896..0becb1067 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2Square.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RegressionR2Square" +title: "[validmind](/validmind/validmind.html).RegressionR2Square" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -@@tags('sklearn', 'model_performance')@@tasks('regression') +@tags('sklearn', 'model_performance')@tasks('regression') defRegressionR2Square(dataset,model): diff --git a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd index eff9b48b1..b3a11eb96 100644 --- a/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RegressionR2SquareComparison.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RegressionR2SquareComparison" +title: "[validmind](/validmind/validmind.html).RegressionR2SquareComparison" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -@@tags('model_performance', 'sklearn')@@tasks('regression', 'time_series_forecasting') +@tags('model_performance', 'sklearn')@tasks('regression', 'time_series_forecasting') defRegressionR2SquareComparison(datasets,models): diff --git a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd index 786b3ac5d..a100bbf1d 100644 --- a/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/RobustnessDiagnosis.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RobustnessDiagnosis" +title: "[validmind](/validmind/validmind.html).RobustnessDiagnosis" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('sklearn', 'model_diagnosis', 'visualization')@@tasks('classification', 'regression') +@tags('sklearn', 'model_diagnosis', 'visualization')@tasks('classification', 'regression') defRobustnessDiagnosis(datasets:List\[VMDataset\],model:VMModel,metric:str=None,scaling_factor_std_dev_list:List\[float\]=DEFAULT_STD_DEV_LIST,performance_decay_threshold:float=DEFAULT_DECAY_THRESHOLD): diff --git a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd index bac90205c..f07f26c2c 100644 --- a/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SHAPGlobalImportance.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).SHAPGlobalImportance" +title: "[validmind](/validmind/validmind.html).SHAPGlobalImportance" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -defgenerate_shap_plot(type\_:str,shap_values:np.ndarray,x_test:Union\[np.ndarray, pd.DataFrame\])validmind.vm_models.plt.validmind.vm_models.Figure: +defgenerate_shap_plot(type\_:str,shap_values:np.ndarray,x_test:Union\[np.ndarray, pd.DataFrame\])validmind.vm_models.plt.validmind.vm_models.Figure: ::: @@ -54,7 +54,7 @@ Plots two types of SHAP global importance (SHAP). ::: {.signature} -defselect_shap_values(shap_values:Union\[np.ndarray, List\[np.ndarray\]\],class_of_interest:Optional\[int\]=None)validmind.vm_models.np.validmind.vm_models.ndarray: +defselect_shap_values(shap_values:Union\[np.ndarray, List\[np.ndarray\]\],class_of_interest:Optional\[int\]=None)validmind.vm_models.np.validmind.vm_models.ndarray: ::: @@ -85,9 +85,9 @@ For regression models, returns the SHAP values directly as there are no classes. ::: {.signature} -@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')@@tasks('classification', 'text_classification') +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'feature_importance', 'visualization')@tasks('classification', 'text_classification') -defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:Optional\[int\]=None)Dict\[str, Union\[validmind.vm_models.plt.validmind.vm_models.Figure, Dict\[str, float\]\]\]: +defSHAPGlobalImportance(model:VMModel,dataset:VMDataset,kernel_explainer_samples:int=10,tree_or_linear_explainer_samples:int=200,class_of_interest:Optional\[int\]=None)Dict\[str, Union\[validmind.vm_models.plt.validmind.vm_models.Figure, Dict\[str, float\]\]\]: ::: diff --git a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd index 50eae83bd..7174d262b 100644 --- a/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd +++ b/docs/validmind/tests/model_validation/sklearn/ScoreProbabilityAlignment.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ScoreProbabilityAlignment" +title: "[validmind](/validmind/validmind.html).ScoreProbabilityAlignment" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('visualization', 'credit_risk', 'calibration')@@tasks('classification') +@tags('visualization', 'credit_risk', 'calibration')@tasks('classification') defScoreProbabilityAlignment(model:VMModel,dataset:VMDataset,score_column:str='score',n_bins:int=10): diff --git a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd index 9d1da2888..701c43835 100644 --- a/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd +++ b/docs/validmind/tests/model_validation/sklearn/SilhouettePlot.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).SilhouettePlot" +title: "[validmind](/validmind/validmind.html).SilhouettePlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'model_performance')@@tasks('clustering') +@tags('sklearn', 'model_performance')@tasks('clustering') defSilhouettePlot(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd index 8615c4fe2..185307292 100644 --- a/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd +++ b/docs/validmind/tests/model_validation/sklearn/TrainingTestDegradation.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).TrainingTestDegradation" +title: "[validmind](/validmind/validmind.html).TrainingTestDegradation" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')@@tasks('classification', 'text_classification') +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_performance', 'visualization')@tasks('classification', 'text_classification') defTrainingTestDegradation(datasets:List\[VMDataset\],model:VMModel,max_threshold:float=0.1): diff --git a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd index 92677bdf2..849c7ffef 100644 --- a/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd +++ b/docs/validmind/tests/model_validation/sklearn/VMeasure.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).VMeasure" +title: "[validmind](/validmind/validmind.html).VMeasure" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'model_performance')@@tasks('clustering') +@tags('sklearn', 'model_performance')@tasks('clustering') defVMeasure(dataset:VMDataset,model:VMModel): diff --git a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd index ee424da56..dce9e8df2 100644 --- a/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd +++ b/docs/validmind/tests/model_validation/sklearn/WeakspotsDiagnosis.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).WeakspotsDiagnosis" +title: "[validmind](/validmind/validmind.html).WeakspotsDiagnosis" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_diagnosis', 'visualization')@@tasks('classification', 'text_classification') +@tags('sklearn', 'binary_classification', 'multiclass_classification', 'model_diagnosis', 'visualization')@tasks('classification', 'text_classification') defWeakspotsDiagnosis(datasets:List\[VMDataset\],model:VMModel,features_columns:Union\[List\[str\], None\]=None,metrics:Union\[Dict\[str, Callable\], None\]=None,thresholds:Union\[Dict\[str, float\], None\]=None): diff --git a/docs/validmind/tests/model_validation/statsmodels.qmd b/docs/validmind/tests/model_validation/statsmodels.qmd index 8c3d3a3c6..2df5d7b45 100644 --- a/docs/validmind/tests/model_validation/statsmodels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).statsmodels" +title: "[validmind](/validmind/validmind.html).statsmodels" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd index a2d8f15cf..b659b3c37 100644 --- a/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/AutoARIMA.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).AutoARIMA" +title: "[validmind](/validmind/validmind.html).AutoARIMA" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('time_series_data', 'forecasting', 'model_selection', 'statsmodels')@@tasks('regression') +@tags('time_series_data', 'forecasting', 'model_selection', 'statsmodels')@tasks('regression') defAutoARIMA(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd index fa782d44a..55e5d2a8c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/CumulativePredictionProbabilities.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).CumulativePredictionProbabilities" +title: "[validmind](/validmind/validmind.html).CumulativePredictionProbabilities" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('visualization', 'credit_risk')@@tasks('classification') +@tags('visualization', 'credit_risk')@tasks('classification') defCumulativePredictionProbabilities(dataset,model,title='Cumulative Probabilities'): diff --git a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd index b98374e56..b4b28e6b5 100644 --- a/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/DurbinWatsonTest.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).DurbinWatsonTest" +title: "[validmind](/validmind/validmind.html).DurbinWatsonTest" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tasks('regression')@@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels') +@tasks('regression')@tags('time_series_data', 'forecasting', 'statistical_test', 'statsmodels') defDurbinWatsonTest(dataset,model,threshold=\[1.5, 2.5\]): diff --git a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd index f7b28fb2d..3736c4d05 100644 --- a/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/GINITable.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).GINITable" +title: "[validmind](/validmind/validmind.html).GINITable" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('model_performance')@@tasks('classification') +@tags('model_performance')@tasks('classification') defGINITable(dataset,model): diff --git a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd index b75676855..8c1e42828 100644 --- a/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/KolmogorovSmirnov.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).KolmogorovSmirnov" +title: "[validmind](/validmind/validmind.html).KolmogorovSmirnov" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')@@tasks('classification', 'regression') +@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')@tasks('classification', 'regression') defKolmogorovSmirnov(model:VMModel,dataset:VMDataset,dist:str='norm'): diff --git a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd index 7db1d650a..077c6b5ef 100644 --- a/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/Lilliefors.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).Lilliefors" +title: "[validmind](/validmind/validmind.html).Lilliefors" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')@@tasks('classification', 'regression') +@tags('tabular_data', 'data_distribution', 'statistical_test', 'statsmodels')@tasks('classification', 'regression') defLilliefors(dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd index c326605a9..d691f42a1 100644 --- a/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/PredictionProbabilitiesHistogram.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).PredictionProbabilitiesHistogram" +title: "[validmind](/validmind/validmind.html).PredictionProbabilitiesHistogram" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('visualization', 'credit_risk')@@tasks('classification') +@tags('visualization', 'credit_risk')@tasks('classification') defPredictionProbabilitiesHistogram(dataset,model,title='Histogram of Predictive Probabilities'): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd index 0e2771d70..341bac44c 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionCoeffs.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RegressionCoeffs" +title: "[validmind](/validmind/validmind.html).RegressionCoeffs" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('tabular_data', 'visualization', 'model_training')@@tasks('regression') +@tags('tabular_data', 'visualization', 'model_training')@tasks('regression') defRegressionCoeffs(model): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd index a82b75fe9..9f426d806 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionFeatureSignificance.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RegressionFeatureSignificance" +title: "[validmind](/validmind/validmind.html).RegressionFeatureSignificance" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('statistical_test', 'model_interpretation', 'visualization', 'feature_importance')@@tasks('regression') +@tags('statistical_test', 'model_interpretation', 'visualization', 'feature_importance')@tasks('regression') defRegressionFeatureSignificance(model:VMModel,fontsize:int=10,p_threshold:float=0.05): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd index 0d3880783..5c3142b08 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlot.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RegressionModelForecastPlot" +title: "[validmind](/validmind/validmind.html).RegressionModelForecastPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('time_series_data', 'forecasting', 'visualization')@@tasks('regression') +@tags('time_series_data', 'forecasting', 'visualization')@tasks('regression') defRegressionModelForecastPlot(model:VMModel,dataset:VMDataset,start_date:Union\[str, None\]=None,end_date:Union\[str, None\]=None): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd index 1815838ea..be8b2d4a8 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelForecastPlotLevels.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RegressionModelForecastPlotLevels" +title: "[validmind](/validmind/validmind.html).RegressionModelForecastPlotLevels" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -26,7 +26,7 @@ toc-expand: 4 ::: {.signature} -@@tags('time_series_data', 'forecasting', 'visualization')@@tasks('regression') +@tags('time_series_data', 'forecasting', 'visualization')@tasks('regression') defRegressionModelForecastPlotLevels(model:VMModel,dataset:VMDataset): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd index e21e3c9da..b1a4fa79a 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSensitivityPlot.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RegressionModelSensitivityPlot" +title: "[validmind](/validmind/validmind.html).RegressionModelSensitivityPlot" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -40,7 +40,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('senstivity_analysis', 'visualization')@@tasks('regression') +@tags('senstivity_analysis', 'visualization')@tasks('regression') defRegressionModelSensitivityPlot(dataset:VMDataset,model:VMModel,shocks:List\[float\]=\[0.1\],transformation:Union\[str, None\]=None): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd index 077cc5aba..ff657b766 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionModelSummary.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RegressionModelSummary" +title: "[validmind](/validmind/validmind.html).RegressionModelSummary" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -28,7 +28,7 @@ Adjusted R2 Score ::: {.signature} -@@tags('model_performance', 'regression')@@tasks('regression') +@tags('model_performance', 'regression')@tasks('regression') defRegressionModelSummary(dataset:VMDataset,model:VMModel): diff --git a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd index c2fad2075..e59b3d5c7 100644 --- a/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/RegressionPermutationFeatureImportance.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).RegressionPermutationFeatureImportance" +title: "[validmind](/validmind/validmind.html).RegressionPermutationFeatureImportance" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -12,7 +12,7 @@ toc-expand: 4 ::: {.signature} -defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: +defget_logger(name:str='validmind',log_level:Optional\[int\]=None)validmind.vm_models.logging.validmind.vm_models.Logger: ::: @@ -28,7 +28,7 @@ Get a logger for the given module name ::: {.signature} -@@tags('statsmodels', 'feature_importance', 'visualization')@@tasks('regression') +@tags('statsmodels', 'feature_importance', 'visualization')@tasks('regression') defRegressionPermutationFeatureImportance(dataset:VMDataset,model:VMModel,fontsize:int=12,figure_height:int=500): diff --git a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd index df9875301..5e9792e15 100644 --- a/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/ScorecardHistogram.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ScorecardHistogram" +title: "[validmind](/validmind/validmind.html).ScorecardHistogram" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -14,7 +14,7 @@ toc-expand: 4 ::: {.signature} -@@tags('visualization', 'credit_risk', 'logistic_regression')@@tasks('classification') +@tags('visualization', 'credit_risk', 'logistic_regression')@tasks('classification') defScorecardHistogram(dataset,title='Histogram of Scores',score_column='score'): diff --git a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd index 4d692eba3..2c6c67142 100644 --- a/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd +++ b/docs/validmind/tests/model_validation/statsmodels/statsutils.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).statsutils" +title: "[validmind](/validmind/validmind.html).statsutils" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/tests/prompt_validation.qmd b/docs/validmind/tests/prompt_validation.qmd index a3b348303..1183cda98 100644 --- a/docs/validmind/tests/prompt_validation.qmd +++ b/docs/validmind/tests/prompt_validation.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).prompt_validation" +title: "[validmind](/validmind/validmind.html).prompt_validation" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/tests/prompt_validation/Bias.qmd b/docs/validmind/tests/prompt_validation/Bias.qmd index 2091f9b5e..9dc573bb8 100644 --- a/docs/validmind/tests/prompt_validation/Bias.qmd +++ b/docs/validmind/tests/prompt_validation/Bias.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).Bias" +title: "[validmind](/validmind/validmind.html).Bias" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -@@tags('llm', 'few_shot')@@tasks('text_classification', 'text_summarization') +@tags('llm', 'few_shot')@tasks('text_classification', 'text_summarization') defBias(model,min_threshold=7): diff --git a/docs/validmind/tests/prompt_validation/Clarity.qmd b/docs/validmind/tests/prompt_validation/Clarity.qmd index 0d6d9a9e6..982cb1728 100644 --- a/docs/validmind/tests/prompt_validation/Clarity.qmd +++ b/docs/validmind/tests/prompt_validation/Clarity.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).Clarity" +title: "[validmind](/validmind/validmind.html).Clarity" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -@@tags('llm', 'zero_shot', 'few_shot')@@tasks('text_classification', 'text_summarization') +@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') defClarity(model,min_threshold=7): diff --git a/docs/validmind/tests/prompt_validation/Conciseness.qmd b/docs/validmind/tests/prompt_validation/Conciseness.qmd index d942e0f95..73e79c3a0 100644 --- a/docs/validmind/tests/prompt_validation/Conciseness.qmd +++ b/docs/validmind/tests/prompt_validation/Conciseness.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).Conciseness" +title: "[validmind](/validmind/validmind.html).Conciseness" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -@@tags('llm', 'zero_shot', 'few_shot')@@tasks('text_classification', 'text_summarization') +@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') defConciseness(model,min_threshold=7): diff --git a/docs/validmind/tests/prompt_validation/Delimitation.qmd b/docs/validmind/tests/prompt_validation/Delimitation.qmd index 23e63c7ff..1f7ac00ae 100644 --- a/docs/validmind/tests/prompt_validation/Delimitation.qmd +++ b/docs/validmind/tests/prompt_validation/Delimitation.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).Delimitation" +title: "[validmind](/validmind/validmind.html).Delimitation" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -@@tags('llm', 'zero_shot', 'few_shot')@@tasks('text_classification', 'text_summarization') +@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') defDelimitation(model,min_threshold=7): diff --git a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd index 8059bdeb9..373ffb637 100644 --- a/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd +++ b/docs/validmind/tests/prompt_validation/NegativeInstruction.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).NegativeInstruction" +title: "[validmind](/validmind/validmind.html).NegativeInstruction" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -@@tags('llm', 'zero_shot', 'few_shot')@@tasks('text_classification', 'text_summarization') +@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') defNegativeInstruction(model,min_threshold=7): diff --git a/docs/validmind/tests/prompt_validation/Robustness.qmd b/docs/validmind/tests/prompt_validation/Robustness.qmd index 29d575a72..f8adb2992 100644 --- a/docs/validmind/tests/prompt_validation/Robustness.qmd +++ b/docs/validmind/tests/prompt_validation/Robustness.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).Robustness" +title: "[validmind](/validmind/validmind.html).Robustness" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -28,7 +28,7 @@ Call LLM with the given prompts and return the response ::: {.signature} -@@tags('llm', 'zero_shot', 'few_shot')@@tasks('text_classification', 'text_summarization') +@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') defRobustness(model,dataset,num_tests=10): diff --git a/docs/validmind/tests/prompt_validation/Specificity.qmd b/docs/validmind/tests/prompt_validation/Specificity.qmd index a8f6ca338..87dd0b387 100644 --- a/docs/validmind/tests/prompt_validation/Specificity.qmd +++ b/docs/validmind/tests/prompt_validation/Specificity.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).Specificity" +title: "[validmind](/validmind/validmind.html).Specificity" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -72,7 +72,7 @@ Explanation: " -> 8 ::: {.signature} -@@tags('llm', 'zero_shot', 'few_shot')@@tasks('text_classification', 'text_summarization') +@tags('llm', 'zero_shot', 'few_shot')@tasks('text_classification', 'text_summarization') defSpecificity(model,min_threshold=7): diff --git a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd index df0037d63..447bfe17d 100644 --- a/docs/validmind/tests/prompt_validation/ai_powered_test.qmd +++ b/docs/validmind/tests/prompt_validation/ai_powered_test.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).ai_powered_test" +title: "[validmind](/validmind/validmind.html).ai_powered_test" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/unit_metrics.qmd b/docs/validmind/unit_metrics.qmd index 3ef8c7058..178e1f9fa 100644 --- a/docs/validmind/unit_metrics.qmd +++ b/docs/validmind/unit_metrics.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).unit_metrics" +title: "[validmind](/validmind/validmind.html).unit_metrics" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 diff --git a/docs/validmind/version.qmd b/docs/validmind/version.qmd index ade61f919..7195dc126 100644 --- a/docs/validmind/version.qmd +++ b/docs/validmind/version.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).__version__" +title: "[validmind](/validmind/validmind.html).__version__" sidebar: validmind-reference --- diff --git a/docs/validmind/vm_models.qmd b/docs/validmind/vm_models.qmd index 8de24140b..0142d9b0d 100644 --- a/docs/validmind/vm_models.qmd +++ b/docs/validmind/vm_models.qmd @@ -1,5 +1,5 @@ --- -title: "[validmind](/reference/validmind.html).vm_models" +title: "[validmind](/validmind/validmind.html).vm_models" sidebar: validmind-reference toc-depth: 4 toc-expand: 4 @@ -433,7 +433,7 @@ Returns the target class labels or unique values of the target column. ::: {.signature} -defwith_options(self,\*\*kwargs:Dict\[str, Any\])validmind.vm_models.VMDataset: +defwith_options(self,\*\*kwargs:Dict\[str, Any\])validmind.vm_models.VMDataset: ::: @@ -470,7 +470,7 @@ Returns a dataframe containing only the feature columns ::: {.signature} -defy_df(self)validmind.vm_models.pd.validmind.vm_models.DataFrame: +defy_df(self)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -484,7 +484,7 @@ Returns a dataframe containing the target column ::: {.signature} -defy_pred(self,model)validmind.vm_models.np.validmind.vm_models.ndarray: +defy_pred(self,model)validmind.vm_models.np.validmind.vm_models.ndarray: ::: @@ -508,7 +508,7 @@ Attempts to stack complex prediction types (e.g., embeddings) into a single, mul ::: {.signature} -defy_pred_df(self,model)validmind.vm_models.pd.validmind.vm_models.DataFrame: +defy_pred_df(self,model)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -522,7 +522,7 @@ Returns a dataframe containing the predictions for a given model ::: {.signature} -defy_prob(self,model)validmind.vm_models.np.validmind.vm_models.ndarray: +defy_prob(self,model)validmind.vm_models.np.validmind.vm_models.ndarray: ::: @@ -544,7 +544,7 @@ Returns the probabilities for a given model. ::: {.signature} -defy_prob_df(self,model)validmind.vm_models.pd.validmind.vm_models.DataFrame: +defy_prob_df(self,model)validmind.vm_models.pd.validmind.vm_models.DataFrame: ::: @@ -576,7 +576,7 @@ Base class for ValidMind Input types ::: {.signature} -defwith_options(self,\*\*kwargs:Dict\[str, Any\])validmind.vm_models.VMInput: +defwith_options(self,\*\*kwargs:Dict\[str, Any\])validmind.vm_models.VMInput: ::: diff --git a/scripts/generate_quarto_docs.py b/scripts/generate_quarto_docs.py index 4d5c3f79d..502809601 100644 --- a/scripts/generate_quarto_docs.py +++ b/scripts/generate_quarto_docs.py @@ -164,7 +164,7 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: anchor = clean_anchor_text(heading) item = { 'text': heading, - 'file': f"reference/validmind.qmd#{anchor}" + 'file': f"validmind/validmind.qmd#{anchor}" } if 'class' in heading: item['contents'] = [] @@ -175,7 +175,7 @@ def collect_documented_items(module: Dict[str, Any], path: List[str], full_data: anchor = clean_anchor_text(heading) method_item = { 'text': heading, - 'file': f"reference/validmind.qmd#{anchor}" + 'file': f"validmind/validmind.qmd#{anchor}" } current_class['contents'].append(method_item) @@ -398,14 +398,14 @@ def get_child_files(files_dict: Dict[str, str], module_name: str) -> List[Dict[s if dir_name not in directory_structure: directory_structure[dir_name] = { 'text': dir_name, - 'file': f'reference/{rel_path}' # Add reference/ prefix + 'file': f'validmind/{rel_path}' # Add validmind/ prefix } else: # Nested file dir_name = parts[0] if dir_name not in directory_structure: directory_structure[dir_name] = { 'text': dir_name, - 'file': f'reference/validmind/{module_name}/{dir_name}.qmd' # Add reference/ prefix + 'file': f'validmind/validmind/{module_name}/{dir_name}.qmd' # Add validmind/ prefix } # Add to contents if it's a child file @@ -414,7 +414,7 @@ def get_child_files(files_dict: Dict[str, str], module_name: str) -> List[Dict[s directory_structure[dir_name]['contents'].append({ 'text': Path(parts[-1]).stem, - 'file': f'reference/{rel_path}' # Add reference/ prefix + 'file': f'validmind/{rel_path}' # Add validmind/ prefix }) # Sort children within each directory From d1a4eb352de0fcbb209b1ba53a4ceffd2a0bea93 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Fri, 21 Feb 2025 17:25:10 -0800 Subject: [PATCH 103/207] CSS rename, latest version --- docs/_metadata.yml | 2 +- docs/{reference.css => validmind.css} | 0 docs/validmind.qmd | 2 +- docs/validmind/version.qmd | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename docs/{reference.css => validmind.css} (100%) diff --git a/docs/_metadata.yml b/docs/_metadata.yml index f2688fef5..d1eaf129b 100644 --- a/docs/_metadata.yml +++ b/docs/_metadata.yml @@ -1,4 +1,4 @@ format: html: page-layout: full - css: reference.css \ No newline at end of file + css: validmind.css, /developer/developer.css \ No newline at end of file diff --git a/docs/reference.css b/docs/validmind.css similarity index 100% rename from docs/reference.css rename to docs/validmind.css diff --git a/docs/validmind.qmd b/docs/validmind.qmd index 906079671..4c8b73da3 100644 --- a/docs/validmind.qmd +++ b/docs/validmind.qmd @@ -45,7 +45,7 @@ After you have pasted the code snippet into your development source code and exe ::: {.signature} -2.8.9 +2.8.11 ::: diff --git a/docs/validmind/version.qmd b/docs/validmind/version.qmd index 7195dc126..60df6e33d 100644 --- a/docs/validmind/version.qmd +++ b/docs/validmind/version.qmd @@ -7,6 +7,6 @@ sidebar: validmind-reference ::: {.signature} -2.8.9 +2.8.11 ::: From f403c65cb864e457b9b36ac0eed6cd47bf7bf786 Mon Sep 17 00:00:00 2001 From: Nik Richers Date: Sat, 22 Feb 2025 08:33:30 -0800 Subject: [PATCH 104/207] Docstring edits --- validmind/ai/test_descriptions.py | 18 +-- validmind/ai/utils.py | 4 +- validmind/api_client.py | 46 +++---- validmind/client.py | 119 ++++++++----------- validmind/client_config.py | 6 +- validmind/errors.py | 14 +-- validmind/input_registry.py | 2 +- validmind/logging.py | 32 ++--- validmind/template.py | 22 ++-- validmind/utils.py | 62 +++++----- validmind/vm_models/dataset/dataset.py | 4 +- validmind/vm_models/dataset/utils.py | 8 +- validmind/vm_models/figure.py | 12 +- validmind/vm_models/input.py | 8 +- validmind/vm_models/model.py | 10 +- validmind/vm_models/result/result.py | 60 +++++----- validmind/vm_models/result/utils.py | 10 +- validmind/vm_models/test_suite/runner.py | 10 +- validmind/vm_models/test_suite/summary.py | 22 +++- validmind/vm_models/test_suite/test.py | 12 +- validmind/vm_models/test_suite/test_suite.py | 20 ++-- 21 files changed, 250 insertions(+), 251 deletions(-) diff --git a/validmind/ai/test_descriptions.py b/validmind/ai/test_descriptions.py index 2f57270a1..39cbd5967 100644 --- a/validmind/ai/test_descriptions.py +++ b/validmind/ai/test_descriptions.py @@ -70,7 +70,7 @@ def generate_description( figures: List[Figure] = None, title: Optional[str] = None, ): - """Generate the description for the test results""" + """Generate the description for the test results.""" from validmind.api_client import generate_test_result_description if not tables and not figures and not metric: @@ -156,7 +156,7 @@ def get_result_description( should_generate: bool = True, title: Optional[str] = None, ): - """Get Metadata Dictionary for a Test or Metric Result + """Get the metadata dictionary for a test or metric result. Generates an LLM interpretation of the test results or uses the default description and returns a metadata object that can be logged with the test results. @@ -170,15 +170,15 @@ def get_result_description( Note: Either the tables or figures must be provided to generate the description. Args: - test_id (str): The test ID - test_description (str): The default description for the test - tables (Any): The test tables or results to interpret - figures (List[Figure]): The figures to attach to the test suite result - metric (Union[int, float]): Unit metrics attached to the test result - should_generate (bool): Whether to generate the description or not (Default: True) + test_id (str): The test ID. + test_description (str): The default description for the test. + tables (Any): The test tables or results to interpret. + figures (List[Figure]): The figures to attach to the test suite result. + metric (Union[int, float]): Unit metrics attached to the test result. + should_generate (bool): Whether to generate the description or not. Defaults to True. Returns: - str: The description to be logged with the test results + str: The description to be logged with the test results. """ # Check the feature flag first, then the environment variable llm_descriptions_enabled = ( diff --git a/validmind/ai/utils.py b/validmind/ai/utils.py index 6f39604c1..648d26076 100644 --- a/validmind/ai/utils.py +++ b/validmind/ai/utils.py @@ -24,7 +24,7 @@ class DescriptionFuture: the tests can continue to be run in parallel while the description is retrieved asynchronously. - The value will be retrieved later and if its not ready yet, it should + The value will be retrieved later and, if it is not ready yet, it should block until it is. """ @@ -42,7 +42,7 @@ def get_description(self): def get_client_and_model(): - """Get model and client to use for generating interpretations + """Get model and client to use for generating interpretations. On first call, it will look in the environment for the API key endpoint, model etc. and store them in a global variable to avoid loading them up again. diff --git a/validmind/api_client.py b/validmind/api_client.py index cb6228616..97419d677 100644 --- a/validmind/api_client.py +++ b/validmind/api_client.py @@ -38,7 +38,7 @@ @atexit.register def _close_session(): - """Closes the async client session at exit""" + """Closes the async client session at exit.""" global __api_session if __api_session and not __api_session.closed: @@ -78,7 +78,7 @@ def _get_api_headers() -> Dict[str, str]: def _get_session() -> aiohttp.ClientSession: - """Initializes the async client session""" + """Initializes the async client session.""" global __api_session if not __api_session or __api_session.closed: @@ -156,7 +156,7 @@ async def _post( def _ping() -> Dict[str, Any]: - """Validates that we can connect to the ValidMind API (does not use the async session)""" + """Validates that we can connect to the ValidMind API (does not use the async session).""" r = requests.get( url=_get_url("ping"), headers=_get_api_headers(), @@ -243,7 +243,7 @@ def init( def reload(): - """Reconnect to the ValidMind API and reload the project configuration""" + """Reconnect to the ValidMind API and reload the project configuration.""" try: _ping() @@ -258,13 +258,13 @@ async def aget_metadata(content_id: str) -> Dict[str, Any]: """Gets a metadata object from ValidMind API. Args: - content_id (str): Unique content identifier for the metadata + content_id (str): Unique content identifier for the metadata. Raises: - Exception: If the API call fails + Exception: If the API call fails. Returns: - dict: Metadata object + dict: Metadata object. """ return await _get(f"get_metadata/{content_id}") @@ -277,15 +277,15 @@ async def alog_metadata( """Logs free-form metadata to ValidMind API. Args: - content_id (str): Unique content identifier for the metadata + content_id (str): Unique content identifier for the metadata. text (str, optional): Free-form text to assign to the metadata. Defaults to None. _json (dict, optional): Free-form key-value pairs to assign to the metadata. Defaults to None. Raises: - Exception: If the API call fails + Exception: If the API call fails. Returns: - dict: The response from the API + dict: The response from the API. """ metadata_dict = {"content_id": content_id} if text is not None: @@ -304,16 +304,16 @@ async def alog_metadata( async def alog_figure(figure: Figure) -> Dict[str, Any]: - """Logs a figure + """Logs a figure. Args: - figure (Figure): The Figure object wrapper + figure (Figure): The Figure object wrapper. Raises: - Exception: If the API call fails + Exception: If the API call fails. Returns: - dict: The response from the API + dict: The response from the API. """ try: return await _post( @@ -331,21 +331,21 @@ async def alog_test_result( section_id: str = None, position: int = None, ) -> Dict[str, Any]: - """Logs test results information + """Logs test results information. This method will be called automatically from any function running tests but can also be called directly if the user wants to run tests on their own. Args: - result (dict): A dictionary representing the test result - section_id (str, optional): The section ID add a test driven block to the documentation - position (int): The position in the section to add the test driven block + result (dict): A dictionary representing the test result. + section_id (str, optional): The section ID add a test driven block to the documentation. + position (int): The position in the section to add the test driven block. Raises: - Exception: If the API call fails + Exception: If the API call fails. Returns: - dict: The response from the API + dict: The response from the API. """ request_params = {} if section_id: @@ -413,7 +413,7 @@ async def alog_metric( recorded_at: Optional[str] = None, thresholds: Optional[Dict[str, Any]] = None, ): - """See log_metric for details""" + """See log_metric for details.""" if not key or not isinstance(key, str): raise ValueError("`key` must be a non-empty string") @@ -458,7 +458,7 @@ def log_metric( recorded_at: Optional[str] = None, thresholds: Optional[Dict[str, Any]] = None, ): - """Logs a unit metric + """Logs a unit metric. Unit metrics are key-value pairs where the key is the metric name and the value is a scalar (int or float). These key-value pairs are associated with the currently @@ -479,7 +479,7 @@ def log_metric( def get_ai_key() -> Dict[str, Any]: - """Calls the api to get an api key for our LLM proxy""" + """Calls the API to get an API key for our LLM proxy.""" r = requests.get( url=_get_url("ai/key"), headers=_get_api_headers(), diff --git a/validmind/client.py b/validmind/client.py index d48c53a80..6229bcbae 100644 --- a/validmind/client.py +++ b/validmind/client.py @@ -70,19 +70,19 @@ def init_dataset( - Torch TensorDataset Args: - dataset: Dataset from various Python libraries - model (VMModel): ValidMind model object - index (Any, optional): Index for the dataset - index_name (str, optional): Name of the index column - date_time_index (bool): Whether the index is a datetime index - columns (List[str], optional): List of column names - text_column (str, optional): Name of the text column - target_column (str, optional): The name of the target column in the dataset - feature_columns (List[str], optional): A list of names of feature columns in the dataset + dataset: Dataset from various Python libraries. + model (VMModel): ValidMind model object. + index (Any, optional): Index for the dataset. + index_name (str, optional): Name of the index column. + date_time_index (bool): Whether the index is a datetime index. + columns (List[str], optional): List of column names. + text_column (str, optional): Name of the text column. + target_column (str, optional): The name of the target column in the dataset. + feature_columns (List[str], optional): A list of names of feature columns in the dataset. extra_columns (Dict[str, Any], optional): A dictionary containing the names of the - prediction_column and group_by_columns in the dataset - class_labels (Dict[str, Any], optional): A list of class labels for classification problems - type (str, optional): The type of dataset (one of DATASET_TYPES) - DEPRECATED + prediction_column and group_by_columns in the dataset. + class_labels (Dict[str, Any], optional): A list of class labels for classification problems. + type (str, optional): The type of dataset (one of DATASET_TYPES) - DEPRECATED. input_id (str, optional): The input ID for the dataset (e.g. "my_dataset"). By default, this will be set to `dataset` but if you are passing this dataset as a test input using some other key than `dataset`, then you should set @@ -90,10 +90,10 @@ def init_dataset( __log (bool): Whether to log the input. Defaults to True. Raises: - ValueError: If the dataset type is not supported + ValueError: If the dataset type is not supported. Returns: - VMDataset: A VM Dataset instance + vm.vm.Dataset: A VM Dataset instance. """ # Show deprecation notice if type is passed if type is not None: @@ -190,35 +190,21 @@ def init_model( also ensures we are creating a model supported libraries. Args: - model: A trained model or VMModel instance + model: A trained model or VMModel instance. input_id (str): The input ID for the model (e.g. "my_model"). By default, this will be set to `model` but if you are passing this model as a test input using some other key than `model`, then you should set this to the same key. - attributes (dict): A dictionary of model attributes - predict_fn (callable): A function that takes an input and returns a prediction - **kwargs: Additional arguments to pass to the model + attributes (dict): A dictionary of model attributes. + predict_fn (callable): A function that takes an input and returns a prediction. + **kwargs: Additional arguments to pass to the model. Raises: - ValueError: If the model type is not supported + ValueError: If the model type is not supported. Returns: - vm.VMModel: A VM Model instance + vm.VMModel: A VM Model instance. """ - # vm_model = model if isinstance(model, VMModel) else None - # metadata = None - - # if not vm_model: - # class_obj = get_model_class(model=model, predict_fn=predict_fn) - # if not class_obj: - # if not attributes: - # raise UnsupportedModelError( - # f"Model class {str(model.__class__)} is not supported at the moment." - # ) - # elif not is_model_metadata(attributes): - # raise UnsupportedModelError( - # f"Model attributes {str(attributes)} are missing required keys 'architecture' and 'language'." - # ) vm_model = model if isinstance(model, VMModel) else None class_obj = get_model_class(model=model, predict_fn=predict_fn) @@ -282,26 +268,18 @@ def init_r_model( input_id: str = "model", ) -> VMModel: """ - Initializes a VM Model for an R model - - R models must be saved to disk and the filetype depends on the model type. - Currently we support the following model types: - - - LogisticRegression `glm` model in R: saved as an RDS file with `saveRDS` - - LinearRegression `lm` model in R: saved as an RDS file with `saveRDS` - - XGBClassifier: saved as a .json or .bin file with `xgb.save` - - XGBRegressor: saved as a .json or .bin file with `xgb.save` + Initialize a VM Model from an R model. LogisticRegression and LinearRegression models are converted to sklearn models by extracting the coefficients and intercept from the R model. XGB models are loaded using the xgboost - since xgb models saved in .json or .bin format can be loaded directly with either Python or R + since xgb models saved in .json or .bin format can be loaded directly with either Python or R. Args: - model_path (str): The path to the R model saved as an RDS or XGB file + model_path (str): The path to the R model saved as an RDS or XGB file. input_id (str): The input ID for the model. Defaults to "model". Returns: - VMModel: A VM Model instance + VMModel: A VM Model instance. """ # TODO: proper check for supported models @@ -340,7 +318,7 @@ def get_test_suite( *args: Any, **kwargs: Any, ) -> TestSuite: - """Gets a TestSuite object for the current project or a specific test suite + """Gets a TestSuite object for the current project or a specific test suite. This function provides an interface to retrieve the TestSuite instance for the current project or a specific TestSuite instance identified by test_suite_id. @@ -354,8 +332,11 @@ def get_test_suite( section (str, optional): The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None. - args: Additional arguments to pass to the TestSuite - kwargs: Additional keyword arguments to pass to the TestSuite + args: Additional arguments to pass to the TestSuite. + kwargs: Additional keyword arguments to pass to the TestSuite. + + Returns: + TestSuite: The TestSuite instance. """ if test_suite_id is None: if client_config.documentation_template is None: @@ -378,14 +359,14 @@ def run_test_suite( inputs: Optional[Dict[str, Any]] = None, **kwargs: Any, ) -> Dict[str, Any]: - """High Level function for running a test suite + """High Level function for running a test suite. This function provides a high level interface for running a test suite. A test suite is a collection of tests. This function will automatically find the correct test suite class based on the test_suite_id, initialize each of the tests, and run them. Args: - test_suite_id (str): The test suite name (e.g. 'classifier_full_suite') + test_suite_id (str): The test suite name. For example, 'classifier_full_suite'. config (dict, optional): A dictionary of parameters to pass to the tests in the test suite. Defaults to None. send (bool, optional): Whether to post the test results to the API. send=False @@ -394,13 +375,13 @@ class based on the test_suite_id, initialize each of the tests, and run them. inputs (dict, optional): A dictionary of test inputs to pass to the TestSuite, such as `model`, `dataset` `models`, etc. These inputs will be accessible by any test in the test suite. See the test documentation or `vm.describe_test()` for more details on the inputs required for each. Defaults to None. - **kwargs: backwards compatibility for passing in test inputs using keyword arguments + **kwargs: backwards compatibility for passing in test inputs using keyword arguments. Raises: - ValueError: If the test suite name is not found or if there is an error initializing the test suite + ValueError: If the test suite name is not found or if there is an error initializing the test suite. Returns: - TestSuite: the TestSuite instance + TestSuite: The TestSuite instance. """ try: Suite: TestSuite = get_test_suite_by_id(test_suite_id) @@ -426,13 +407,13 @@ class based on the test_suite_id, initialize each of the tests, and run them. def preview_template() -> None: - """Preview the documentation template for the current project + """Preview the documentation template for the current project. This function will display the documentation template for the current project. If the project has not been initialized, then an error will be raised. Raises: - ValueError: If the project has not been initialized + ValueError: If the project has not been initialized. """ if client_config.documentation_template is None: raise MissingDocumentationTemplate( @@ -450,7 +431,7 @@ def run_documentation_tests( config: Optional[Dict[str, Any]] = None, **kwargs: Any, ) -> Dict[str, Any]: - """Collect and run all the tests associated with a template + """Collect and run all the tests associated with a template. This function will analyze the current project's documentation template and collect all the tests associated with it into a test suite. It will then run the test @@ -460,15 +441,15 @@ def run_documentation_tests( section (str or list, optional): The section(s) to preview. Defaults to None. send (bool, optional): Whether to send the results to the ValidMind API. Defaults to True. fail_fast (bool, optional): Whether to stop running tests after the first failure. Defaults to False. - inputs (dict, optional): A dictionary of test inputs to pass to the TestSuite - config: A dictionary of test parameters to override the defaults - **kwargs: backwards compatibility for passing in test inputs using keyword arguments + inputs (dict, optional): A dictionary of test inputs to pass to the TestSuite. + config: A dictionary of test parameters to override the defaults. + **kwargs: backwards compatibility for passing in test inputs using keyword arguments. Returns: TestSuite or dict: The completed TestSuite instance or a dictionary of TestSuites if section is a list. Raises: - ValueError: If the project has not been initialized + ValueError: If the project has not been initialized. """ if client_config.documentation_template is None: raise MissingDocumentationTemplate( @@ -511,22 +492,22 @@ def _run_documentation_section( inputs: Optional[Dict[str, Any]] = None, **kwargs: Any, ) -> Dict[str, Any]: - """Run all tests in a template section + """Run all tests in a template section. This function will collect all tests used in a template section into a TestSuite and then run the TestSuite as usual. Args: - template: A valid flat template - section: The section of the template to run (if not provided, run all sections) - send: Whether to send the results to the ValidMind API + template: A valid flat template. + section: The section of the template to run (if not provided, run all sections). + send: Whether to send the results to the ValidMind API. fail_fast (bool, optional): Whether to stop running tests after the first failure. Defaults to False. - config: A dictionary of test parameters to override the defaults - inputs: A dictionary of test inputs to pass to the TestSuite - **kwargs: backwards compatibility for passing in test inputs using keyword arguments + config: A dictionary of test parameters to override the defaults. + inputs: A dictionary of test inputs to pass to the TestSuite. + **kwargs: backwards compatibility for passing in test inputs using keyword arguments. Returns: - The completed TestSuite instance + The completed TestSuite instance. """ test_suite = get_template_test_suite(template, section) diff --git a/validmind/client_config.py b/validmind/client_config.py index a237d45e7..df11fb5e0 100644 --- a/validmind/client_config.py +++ b/validmind/client_config.py @@ -13,7 +13,7 @@ @dataclass class ClientConfig: """ - Configuration class for the ValidMind API client. This is instantiated + Configuration class for the ValidMind API client. This class is instantiated when initializing the API client. """ @@ -25,7 +25,7 @@ class ClientConfig: def __post_init__(self): """ - Set additional attributes when initializing the class + Set additional attributes when initializing the class. """ # check if running on notebook and set running_on_colab try: @@ -36,7 +36,7 @@ def __post_init__(self): self.running_on_colab = False def can_generate_llm_test_descriptions(self): - """Returns True if the client can generate LLM based test descriptions""" + """Returns True if the client can generate LLM-based test descriptions.""" return self.feature_flags.get("llm_test_descriptions", True) diff --git a/validmind/errors.py b/validmind/errors.py index a7db65c49..28afb112d 100644 --- a/validmind/errors.py +++ b/validmind/errors.py @@ -52,7 +52,7 @@ class MissingCacheResultsArgumentsError(BaseError): class MissingOrInvalidModelPredictFnError(BaseError): """ - When the pytorch model is missing a predict function or its predict + When the PyTorch model is missing a predict function or its predict method does not have the expected arguments. """ @@ -71,7 +71,7 @@ class InvalidAPICredentialsError(APIRequestError): def description(self, *args, **kwargs): return ( self.message - or "Invalid API credentials. Please ensure that you have provided the correct values for api_key and api_secret." + or "Invalid API credentials. Please ensure that you have provided the correct values for API_KEY and API_SECRET." ) @@ -115,7 +115,7 @@ class InvalidTestResultsError(APIRequestError): class InvalidTestParametersError(BaseError): """ - When an invalid parameters for the test. + When invalid parameters are provided for the test. """ pass @@ -123,7 +123,7 @@ class InvalidTestParametersError(BaseError): class InvalidInputError(BaseError): """ - When an invalid input object. + When an invalid input object is provided. """ pass @@ -131,7 +131,7 @@ class InvalidInputError(BaseError): class InvalidTextObjectError(APIRequestError): """ - When an invalid Metadat (Text) object is sent to the API. + When an invalid Metadata (Text) object is sent to the API. """ pass @@ -155,7 +155,7 @@ class InvalidXGBoostTrainedModelError(BaseError): class LoadTestError(BaseError): """ - Exception raised when an error occurs while loading a test + Exception raised when an error occurs while loading a test. """ def __init__(self, message: str, original_error: Optional[Exception] = None): @@ -323,7 +323,7 @@ class SkipTestError(BaseError): def raise_api_error(error_string): """ Safely try to parse JSON from the response message in case the API - returns a non-JSON string or if the API returns a non-standard error + returns a non-JSON string or if the API returns a non-standard error. """ try: json_response = json.loads(error_string) diff --git a/validmind/input_registry.py b/validmind/input_registry.py index f54034abc..5c92ca306 100644 --- a/validmind/input_registry.py +++ b/validmind/input_registry.py @@ -29,7 +29,7 @@ def get(self, key): if not input_obj: raise InvalidInputError( f"There's no such input with given ID '{key}'. " - "Please pass valid input ID" + "Please pass valid input ID." ) return input_obj diff --git a/validmind/logging.py b/validmind/logging.py index 0da16e880..604de4df7 100644 --- a/validmind/logging.py +++ b/validmind/logging.py @@ -2,7 +2,7 @@ # See the LICENSE file in the root of this repository for details. # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial -"""ValidMind logging module.""" +"""ValidMind logging module""" import logging import os @@ -18,7 +18,7 @@ def _get_log_level() -> int: - """Get the log level from the environment variable""" + """Get the log level from the environment variable.""" log_level_str = os.getenv("LOG_LEVEL", "INFO").upper() if log_level_str not in ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]: @@ -31,7 +31,7 @@ def get_logger( name: str = "validmind", log_level: Optional[int] = None ) -> logging.Logger: - """Get a logger for the given module name""" + """Get a logger for the given module name.""" formatter = logging.Formatter( fmt="%(asctime)s - %(levelname)s(%(name)s): %(message)s" ) @@ -57,20 +57,20 @@ def get_logger( def init_sentry(server_config: Dict[str, Any]) -> None: - """Initialize Sentry SDK for sending logs back to ValidMind + """Initialize Sentry SDK for sending logs back to ValidMind. - This will usually only be called by the api_client module to initialize the - sentry connection after the user calls `validmind.init()`. This is because the DSN + This will usually only be called by the API client module to initialize the + Sentry connection after the user calls `validmind.init()`. This is because the DSN and other config options will be returned by the API. Args: - server_config (Dict[str, Any]): The config dictionary returned by the API - - send_logs (bool): Whether to send logs to Sentry (gets removed) - - dsn (str): The Sentry DSN - ...: Other config options for Sentry + server_config (Dict[str, Any]): The config dictionary returned by the API. + - send_logs (bool): Whether to send logs to Sentry (gets removed). + - dsn (str): The Sentry DSN. + ...: Other config options for Sentry. Returns: - None + None. """ if os.getenv("VM_NO_TELEMETRY", False): return @@ -103,15 +103,15 @@ def log_performance( logger: Optional[logging.Logger] = None, force: bool = False ) -> Callable[[F], F]: - """Decorator to log the time it takes to run a function + """Decorator to log the time it takes to run a function. Args: name (str, optional): The name of the function. Defaults to None. logger (logging.Logger, optional): The logger to use. Defaults to None. - force (bool, optional): Whether to force logging even if env var is off + force (bool, optional): Whether to force logging even if env var is off. Returns: - Callable: The decorated function + Callable: The decorated function. """ def decorator(func: F) -> F: # check if log level is set to debug @@ -169,10 +169,10 @@ async def wrap(*args: Any, **kwargs: Any) -> Any: def send_single_error(error: Exception) -> None: - """Send a single error to Sentry + """Send a single error to Sentry. Args: - error (Exception): The exception to send + error (Exception): The exception to send. """ event, hint = event_from_exception(exc_info_from_error(error)) client = sentry_sdk.Client(__dsn, release=f"validmind-python@{__version__}") diff --git a/validmind/template.py b/validmind/template.py index 758bfa986..b2e17990a 100644 --- a/validmind/template.py +++ b/validmind/template.py @@ -147,10 +147,10 @@ def _create_section_widget(tree: List[Dict[str, Any]]) -> Accordion: def preview_template(template: str) -> None: - """Preview a template in Jupyter Notebook + """Preview a template in Jupyter Notebook. Args: - template (dict): The template to preview + template (dict): The template to preview. """ if not is_notebook(): logger.warning("preview_template() only works in Jupyter Notebook") @@ -188,13 +188,13 @@ def _get_section_tests(section: Dict[str, Any]) -> List[str]: def _create_test_suite_section(section: Dict[str, Any]) -> Dict[str, Any]: """Create a section object for a test suite that contains the tests in a section - in the template + in the template. Args: - section: a section of a template (in tree form) + section: A section of a template (in tree form). Returns: - A TestSuite section dict + A TestSuite section dict. """ if section_tests := _get_section_tests(section): return { @@ -212,11 +212,11 @@ def _create_template_test_suite( Create and run a test suite from a template. Args: - template: A valid flat template - section: The section of the template to run (if not provided, run all sections) + template: A valid flat template. + section: The section of the template to run. Runs all sections if not provided. Returns: - A dynamically-create TestSuite Class + A dynamically-created TestSuite Class. """ section_tree = _convert_sections_to_section_tree( sections=template["sections"], @@ -243,16 +243,16 @@ def get_template_test_suite( template: str, section: Optional[str] = None ) -> TestSuite: - """Get a TestSuite instance containing all tests in a template + """Get a TestSuite instance containing all tests in a template. This function will collect all tests used in a template into a dynamically-created - TestSuite object + TestSuite object. Args: template: A valid flat template section: The section of the template to run (if not provided, run all sections) Returns: - The TestSuite instance + The TestSuite instance. """ return _create_template_test_suite(template, section)() diff --git a/validmind/utils.py b/validmind/utils.py index d9463cf7f..91887971c 100644 --- a/validmind/utils.py +++ b/validmind/utils.py @@ -63,20 +63,20 @@ def parse_version(version: str) -> tuple[int, ...]: """ - Parse a semver version string into a tuple of major, minor, patch integers + Parse a semver version string into a tuple of major, minor, patch integers. Args: - version (str): The semantic version string to parse + version (str): The semantic version string to parse. Returns: - tuple[int, ...]: A tuple of major, minor, patch integers + tuple[int, ...]: A tuple of major, minor, patch integers. """ return tuple(int(x) for x in version.split(".")[:3]) def is_notebook() -> bool: """ - Checks if the code is running in a Jupyter notebook or IPython shell + Checks if the code is running in a Jupyter notebook or IPython shell. https://stackoverflow.com/questions/15411967/how-can-i-check-if-code-is-executed-in-the-ipython-notebook """ @@ -210,9 +210,7 @@ def is_dataframe(self, obj): def get_full_typename(o: Any) -> Any: - """We determine types based on type names so we don't have to import - (and therefore depend on) PyTorch, TensorFlow, etc. - """ + """We determine types based on type names so we don't have to import.""" instance_name = o.__class__.__module__ + "." + o.__class__.__name__ if instance_name in ["builtins.module", "__builtin__.module"]: return o.__name__ @@ -314,9 +312,9 @@ def format_key_values(key_values: Dict[str, Any]) -> Dict[str, Any]: def summarize_data_quality_results(results): """ - TODO: generalize this to work with metrics and test results + TODO: generalize this to work with metrics and test results. - Summarize the results of the data quality test suite + Summarize the results of the data quality test suite. """ test_results = [] for result in results: @@ -355,7 +353,7 @@ def format_number(number): def format_dataframe(df: pd.DataFrame) -> pd.DataFrame: - """Format a pandas DataFrame for display purposes""" + """Format a pandas DataFrame for display purposes.""" df = df.style.set_properties(**{"text-align": "left"}).hide(axis="index") return df.set_table_styles([dict(selector="th", props=[("text-align", "left")])]) @@ -366,20 +364,20 @@ def run_async( name: Optional[str] = None, **kwargs: Any ) -> T: - """Helper function to run functions asynchronously + """Helper function to run functions asynchronously. This takes care of the complexity of running the logging functions asynchronously. It will - detect the type of environment we are running in (ipython notebook or not) and run the + detect the type of environment we are running in (IPython notebook or not) and run the function accordingly. Args: - func: The function to run asynchronously - *args: The arguments to pass to the function - name: Optional name for the task - **kwargs: The keyword arguments to pass to the function + func: The function to run asynchronously. + *args: The arguments to pass to the function. + name: Optional name for the task. + **kwargs: The keyword arguments to pass to the function. Returns: - The result of the function + The result of the function. """ try: if asyncio.get_event_loop().is_running() and is_notebook(): @@ -402,15 +400,15 @@ def run_async_check( *args: Any, **kwargs: Any ) -> Optional[asyncio.Task[T]]: - """Helper function to run functions asynchronously if the task doesn't already exist + """Helper function to run functions asynchronously if the task doesn't already exist. Args: - func: The function to run asynchronously - *args: The arguments to pass to the function - **kwargs: The keyword arguments to pass to the function + func: The function to run asynchronously. + *args: The arguments to pass to the function. + **kwargs: The keyword arguments to pass to the function. Returns: - Optional[asyncio.Task[T]]: The task if created or found, None otherwise + Optional[asyncio.Task[T]]: The task if created or found, None otherwise. """ if __loop: return # we don't need this if we are using our own loop @@ -429,15 +427,15 @@ def run_async_check( def fuzzy_match(string: str, search_string: str, threshold: float = 0.7) -> bool: - """Check if a string matches another string using fuzzy matching + """Check if a string matches another string using fuzzy matching. Args: - string (str): The string to check - search_string (str): The string to search for - threshold (float): The similarity threshold to use (Default: 0.7) + string (str): The string to check. + search_string (str): The string to search for. + threshold (float): The similarity threshold to use (Default: 0.7). Returns: - bool: True if the string matches the search string, False otherwise + bool: True if the string matches the search string, False otherwise. """ score = difflib.SequenceMatcher(None, string, search_string).ratio() @@ -468,7 +466,7 @@ def test_id_to_name(test_id: str) -> str: def get_model_info(model): - """Attempts to extract all model info from a model object instance""" + """Attempts to extract all model info from a model object instance.""" architecture = model.name framework = model.library framework_version = model.library_version @@ -492,7 +490,7 @@ def get_model_info(model): def get_dataset_info(dataset): - """Attempts to extract all dataset info from a dataset object instance""" + """Attempts to extract all dataset info from a dataset object instance.""" num_rows, num_cols = dataset.df.shape schema = dataset.df.dtypes.apply(lambda x: x.name).to_dict() description = ( @@ -511,7 +509,7 @@ def preview_test_config(config): """Preview test configuration in a collapsible HTML section. Args: - config (dict): Test configuration dictionary + config (dict): Test configuration dictionary. """ try: @@ -535,7 +533,7 @@ def preview_test_config(config): def display(widget_or_html, syntax_highlighting=True, mathjax=True): - """Display widgets with extra goodies (syntax highlighting, MathJax, etc.)""" + """Display widgets with extra goodies (syntax highlighting, MathJax, etc.).""" if isinstance(widget_or_html, str): ipy_display(HTML(widget_or_html)) # if html we can auto-detect if we actually need syntax highlighting or MathJax @@ -552,7 +550,7 @@ def display(widget_or_html, syntax_highlighting=True, mathjax=True): def md_to_html(md: str, mathml=False) -> str: - """Converts Markdown to HTML using mistune with plugins""" + """Converts Markdown to HTML using mistune with plugins.""" # use mistune with math plugin to convert to html html = mistune.create_markdown( plugins=["math", "table", "strikethrough", "footnotes"] diff --git a/validmind/vm_models/dataset/dataset.py b/validmind/vm_models/dataset/dataset.py index d04d9235d..6f4885d2e 100644 --- a/validmind/vm_models/dataset/dataset.py +++ b/validmind/vm_models/dataset/dataset.py @@ -25,9 +25,9 @@ class VMDataset(VMInput): - """Base class for VM datasets + """Base class for VM datasets. - Child classes should be used to support new dataset types (tensor, polars etc) + Child classes should be used to support new dataset types (tensor, polars etc.) by converting the user's dataset into a numpy array collecting metadata like column names and then call this (parent) class `__init__` method. diff --git a/validmind/vm_models/dataset/utils.py b/validmind/vm_models/dataset/utils.py index dae143fd8..65ec40c86 100644 --- a/validmind/vm_models/dataset/utils.py +++ b/validmind/vm_models/dataset/utils.py @@ -45,11 +45,11 @@ def from_dict(cls, data: dict): ) def __contains__(self, key): - """Allow checking if a key is `in` the extra columns""" + """Allow checking if a key is `in` the extra columns.""" return key in self.flatten() def flatten(self) -> List[str]: - """Get a list of all column names""" + """Get a list of all column names.""" return [ self.group_by_column, *self.extras, @@ -78,13 +78,14 @@ def probability_column(self, model, column_name: str = None): def as_df(series_or_frame: Union[pd.Series, pd.DataFrame]) -> pd.DataFrame: + """Convert a pandas Series or DataFrame to a DataFrame.""" if isinstance(series_or_frame, pd.Series): return series_or_frame.to_frame() return series_or_frame def _is_probabilties(output): - """Check if the output from the predict method is probabilities.""" + """Check if the output is a probability array.""" if not isinstance(output, np.ndarray) or output.ndim > 1: return False @@ -98,6 +99,7 @@ def _is_probabilties(output): def compute_predictions(model, X, **kwargs) -> tuple: + """Compute predictions and probabilities for a model.""" probability_values = None try: diff --git a/validmind/vm_models/figure.py b/validmind/vm_models/figure.py index d843889b8..2c99a8816 100644 --- a/validmind/vm_models/figure.py +++ b/validmind/vm_models/figure.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial """ -Figure objects track the figure schema supported by the ValidMind API +Figure objects track the figure schema supported by the ValidMind API. """ import base64 @@ -38,7 +38,7 @@ def create_figure( key: str, ref_id: str, ) -> "Figure": - """Create a VM Figure object from a raw figure object""" + """Create a VM Figure object from a raw figure object.""" if is_matplotlib_figure(figure) or is_plotly_figure(figure) or is_png_image(figure): return Figure(key=key, figure=figure, ref_id=ref_id) @@ -48,7 +48,7 @@ def create_figure( @dataclass class Figure: """ - Figure objects track the schema supported by the ValidMind API + Figure objects track the schema supported by the ValidMind API. """ key: str @@ -115,7 +115,7 @@ def to_widget(self): def serialize(self): """ - Serializes the Figure to a dictionary so it can be sent to the API + Serializes the Figure to a dictionary so it can be sent to the API. """ return { "type": self._type, @@ -125,7 +125,7 @@ def serialize(self): def _get_b64_url(self): """ - Returns a base64 encoded URL for the figure + Returns a base64 encoded URL for the figure. """ if is_matplotlib_figure(self.figure): buffer = BytesIO() @@ -152,7 +152,7 @@ def _get_b64_url(self): ) def serialize_files(self): - """Creates a `requests`-compatible files object to be sent to the API""" + """Creates a `requests`-compatible files object to be sent to the API.""" if is_matplotlib_figure(self.figure): buffer = BytesIO() self.figure.savefig(buffer, bbox_inches="tight") diff --git a/validmind/vm_models/input.py b/validmind/vm_models/input.py index 399f2cf17..a4cac67c7 100644 --- a/validmind/vm_models/input.py +++ b/validmind/vm_models/input.py @@ -10,23 +10,23 @@ class VMInput(ABC): """ - Base class for ValidMind Input types + Base class for ValidMind Input types. """ def with_options(self, **kwargs: Dict[str, Any]) -> "VMInput": """ Allows for setting options on the input object that are passed by the user - when using the input to run a test or set of tests + when using the input to run a test or set of tests. To allow options, just override this method in the subclass (see VMDataset) and ensure that it returns a new instance of the input with the specified options set. Args: - **kwargs: Arbitrary keyword arguments that will be passed to the input object + **kwargs: Arbitrary keyword arguments that will be passed to the input object. Returns: - VMInput: A new instance of the input with the specified options set + VMInput: A new instance of the input with the specified options set. """ if kwargs: raise NotImplementedError("This type of input does not support options") diff --git a/validmind/vm_models/model.py b/validmind/vm_models/model.py index fa54a1a7e..d49b783a9 100644 --- a/validmind/vm_models/model.py +++ b/validmind/vm_models/model.py @@ -40,7 +40,7 @@ class ModelTask(Enum): - """Model task enums""" + """Model task enums.""" # TODO: add more tasks CLASSIFICATION = "classification" @@ -67,7 +67,7 @@ def __or__(self, other): @dataclass class ModelAttributes: """ - Model attributes definition + Model attributes definition. """ architecture: str = None @@ -79,7 +79,7 @@ class ModelAttributes: @classmethod def from_dict(cls, data): """ - Creates a ModelAttributes instance from a dictionary + Creates a ModelAttributes instance from a dictionary. """ return cls( architecture=data.get("architecture"), @@ -235,8 +235,8 @@ def is_model_metadata(model): Checks if the model is a dictionary containing metadata about a model. We want to check if the metadata dictionary contains at least the following keys: - - architecture - - language + - Architecture + - Language """ if not isinstance(model, dict): return False diff --git a/validmind/vm_models/result/result.py b/validmind/vm_models/result/result.py index 29392255d..5f7cbe9a4 100644 --- a/validmind/vm_models/result/result.py +++ b/validmind/vm_models/result/result.py @@ -3,7 +3,7 @@ # SPDX-License-Identifier: AGPL-3.0 AND ValidMind Commercial """ -Result Objects for test results +Result objects for test results """ import asyncio import json @@ -43,15 +43,15 @@ class RawData: - """Holds raw data for a test result""" + """Holds raw data for a test result.""" def __init__(self, log: bool = False, **kwargs: Any) -> None: - """Create a new RawData object + """Create a new RawData object. Args: - log (bool): If True, log the raw data to ValidMind + log (bool): If True, log the raw data to ValidMind. **kwargs: Keyword arguments to set as attributes, such as - `RawData(log=True, dataset_duplicates=df_duplicates)` + `RawData(log=True, dataset_duplicates=df_duplicates)`. """ self.log = log @@ -94,7 +94,7 @@ def serialize(self) -> Dict[str, Any]: @dataclass class ResultTable: """ - A dataclass that holds the table summary of result + A dataclass that holds the table summary of result. """ data: Union[List[Any], pd.DataFrame] @@ -123,33 +123,33 @@ def serialize(self): @dataclass class Result: - """Base Class for test suite results""" + """Base Class for test suite results.""" result_id: str = None name: str = None def __str__(self) -> str: - """May be overridden by subclasses""" + """May be overridden by subclasses.""" return self.__class__.__name__ @abstractmethod def to_widget(self): - """Create an ipywdiget representation of the result... Must be overridden by subclasses""" + """Create an ipywidget representation of the result... Must be overridden by subclasses.""" raise NotImplementedError @abstractmethod def log(self): - """Log the result... Must be overridden by subclasses""" + """Log the result... Must be overridden by subclasses.""" raise NotImplementedError def show(self): - """Display the result... May be overridden by subclasses""" + """Display the result... May be overridden by subclasses.""" display(self.to_widget()) @dataclass class ErrorResult(Result): - """Result for test suites that fail to load or run properly""" + """Result for test suites that fail to load or run properly.""" name: str = "Failed Test" error: Exception = None @@ -167,7 +167,7 @@ async def log_async(self): @dataclass class TestResult(Result): - """Test result""" + """Test result.""" name: str = "Test Result" ref_id: str = None @@ -245,12 +245,12 @@ def add_table( table: Union[ResultTable, pd.DataFrame, List[Dict[str, Any]]], title: Optional[str] = None, ): - """Add a new table to the result + """Add a new table to the result. Args: - table (Union[ResultTable, pd.DataFrame, List[Dict[str, Any]]]): The table to add + table (Union[ResultTable, pd.DataFrame, List[Dict[str, Any]]]): The table to add. title (Optional[str]): The title of the table (can optionally be provided for - pd.DataFrame and List[Dict[str, Any]] tables) + pd.DataFrame and List[Dict[str, Any]] tables). """ if self.tables is None: self.tables = [] @@ -261,10 +261,10 @@ def add_table( self.tables.append(table) def remove_table(self, index: int): - """Remove a table from the result by index + """Remove a table from the result by index. Args: - index (int): The index of the table to remove (default is 0) + index (int): The index of the table to remove (default is 0). """ if self.tables is None: return @@ -289,10 +289,10 @@ def add_figure( - plotly.graph_objs.Figure: A plotly figure - plotly.graph_objs.FigureWidget: A plotly figure widget - bytes: A PNG image as raw bytes - - validmind.vm_models.figure.Figure: A ValidMind figure object + - validmind.vm_models.figure.Figure: A ValidMind figure object. Returns: - None + None. """ if self.figures is None: self.figures = [] @@ -311,10 +311,10 @@ def add_figure( self.figures.append(figure) def remove_figure(self, index: int = 0): - """Remove a figure from the result by index + """Remove a figure from the result by index. Args: - index (int): The index of the figure to remove (default is 0) + index (int): The index of the figure to remove (default is 0). """ if self.figures is None: return @@ -350,7 +350,7 @@ def to_widget(self): @classmethod def _get_client_config(cls): - """Get the client config, loading it if not cached""" + """Get the client config, loading it if not cached.""" if cls._client_config_cache is None: api_client.reload() cls._client_config_cache = api_client.client_config @@ -368,7 +368,7 @@ def _get_client_config(cls): return cls._client_config_cache def check_result_id_exist(self): - """Check if the result_id exists in any test block across all sections""" + """Check if the result_id exists in any test block across all sections.""" client_config = self._get_client_config() # Iterate through all sections @@ -389,7 +389,7 @@ def check_result_id_exist(self): def _validate_section_id_for_block( self, section_id: str, position: Union[int, None] = None ): - """Validate the section_id exits on the template before logging""" + """Validate the section_id exits on the template before logging.""" client_config = self._get_client_config() found = False @@ -428,7 +428,7 @@ def _validate_section_id_for_block( ) def serialize(self): - """Serialize the result for the API""" + """Serialize the result for the API.""" return { "test_name": self.result_id, "title": self.title, @@ -486,15 +486,15 @@ async def log_async( return await asyncio.gather(*tasks) def log(self, section_id: str = None, position: int = None, unsafe: bool = False): - """Log the result to ValidMind + """Log the result to ValidMind. Args: section_id (str): The section ID within the model document to insert the - test result + test result. position (int): The position (index) within the section to insert the test - result + result. unsafe (bool): If True, log the result even if it contains sensitive data - i.e. raw data from input datasets + i.e. raw data from input datasets. """ self.check_result_id_exist() diff --git a/validmind/vm_models/result/utils.py b/validmind/vm_models/result/utils.py index 7455e36c8..11f2b3174 100644 --- a/validmind/vm_models/result/utils.py +++ b/validmind/vm_models/result/utils.py @@ -28,7 +28,7 @@ def get_result_template(): - """Get the jinja html template for rendering test results""" + """Get the Jinja2 HTML template for rendering test results.""" global _result_template if _result_template is None: @@ -39,7 +39,7 @@ def get_result_template(): async def update_metadata(content_id: str, text: str, _json: Union[Dict, List] = None): - """Create or Update a Metadata Object""" + """Create or update a metadata object.""" parts = content_id.split("::") content_id = parts[0] revision_name = parts[1] if len(parts) > 1 else None @@ -72,7 +72,7 @@ async def update_metadata(content_id: str, text: str, _json: Union[Dict, List] = def check_for_sensitive_data(data: pd.DataFrame, inputs: List[VMInput]): - """Check if a table contains raw data from input datasets""" + """Check if the data contains sensitive information from input datasets.""" dataset_columns = { col: len(input_obj.df) for input_obj in inputs @@ -96,7 +96,7 @@ def check_for_sensitive_data(data: pd.DataFrame, inputs: List[VMInput]): def tables_to_widgets(tables: List["ResultTable"]): - """Convert summary (list of json tables) into a list of ipywidgets""" + """Convert a list of tables to ipywidgets.""" widgets = [ HTML("

Tables

"), ] @@ -147,7 +147,7 @@ def tables_to_widgets(tables: List["ResultTable"]): def figures_to_widgets(figures: List[Figure]) -> list: - """Plot figures to a ipywidgets GridBox""" + """Convert a list of figures to ipywidgets.""" num_columns = 2 if len(figures) > 1 else 1 plot_widgets = GridBox( diff --git a/validmind/vm_models/test_suite/runner.py b/validmind/vm_models/test_suite/runner.py index 829278e74..145be09cd 100644 --- a/validmind/vm_models/test_suite/runner.py +++ b/validmind/vm_models/test_suite/runner.py @@ -17,7 +17,7 @@ class TestSuiteRunner: """ - Runs a test suite + Runs a test suite. """ suite: TestSuite = None @@ -36,7 +36,7 @@ def __init__(self, suite: TestSuite, config: dict = None, inputs: dict = None): self._load_config(inputs) def _load_config(self, inputs: dict = None): - """Splits the config into a global config and test configs""" + """Splits the config into a global config and test configs.""" self._test_configs = { test.test_id: {"inputs": inputs or {}} for test in self.suite.get_tests() } @@ -59,7 +59,7 @@ def _load_config(self, inputs: dict = None): def _start_progress_bar(self, send: bool = True): """ - Initializes the progress bar elements + Initializes the progress bar elements. """ # TODO: make this work for when user runs only a section of the test suite # if we are sending then there is a task for each test and logging its result @@ -76,7 +76,7 @@ def _stop_progress_bar(self): self.pbar.close() async def log_results(self): - """Logs the results of the test suite to ValidMind + """Logs the results of the test suite to ValidMind. This method will be called after the test suite has been run and all results have been collected. This method will log the results to ValidMind. @@ -127,7 +127,7 @@ def summarize(self, show_link: bool = True): summary.display() def run(self, send: bool = True, fail_fast: bool = False): - """Runs the test suite, renders the summary and sends the results to ValidMind + """Runs the test suite, renders the summary and sends the results to ValidMind. Args: send (bool, optional): Whether to send the results to ValidMind. diff --git a/validmind/vm_models/test_suite/summary.py b/validmind/vm_models/test_suite/summary.py index d7a0c2eaf..e3b53cab8 100644 --- a/validmind/vm_models/test_suite/summary.py +++ b/validmind/vm_models/test_suite/summary.py @@ -16,6 +16,7 @@ def id_to_name(id: str) -> str: + """Convert an ID to a human-readable name.""" # replace underscores, hyphens etc with spaces name = id.replace("_", " ").replace("-", " ").replace(".", " ") # capitalize each word @@ -26,6 +27,8 @@ def id_to_name(id: str) -> str: @dataclass class TestSuiteSectionSummary: + """Represents a summary of a test suite section.""" + tests: List[TestSuiteTest] description: Optional[str] = None @@ -35,6 +38,7 @@ def __post_init__(self): self._build_summary() def _add_description(self): + """Add the section description to the summary.""" if not self.description: return @@ -45,6 +49,7 @@ def _add_description(self): ) def _add_tests_summary(self): + """Add the test results summary.""" children = [] titles = [] @@ -59,6 +64,7 @@ def _add_tests_summary(self): self._widgets.append(widgets.Accordion(children=children, titles=titles)) def _build_summary(self): + """Build the complete summary.""" self._widgets = [] if self.description: @@ -69,11 +75,14 @@ def _build_summary(self): self.summary = widgets.VBox(self._widgets) def display(self): + """Display the summary.""" display(self.summary) @dataclass class TestSuiteSummary: + """Represents a summary of a complete test suite.""" + title: str description: str sections: List[TestSuiteSection] @@ -82,9 +91,11 @@ class TestSuiteSummary: _widgets: List[widgets.Widget] = None def __post_init__(self): + """Initialize the summary after the dataclass is created.""" self._build_summary() def _add_title(self): + """Add the title to the summary.""" title = f"""

Test Suite Results: {self.title}


""".strip() @@ -92,6 +103,7 @@ def _add_title(self): self._widgets.append(widgets.HTML(value=title)) def _add_results_link(self): + """Add a link to documentation on ValidMind.""" # avoid circular import from ...api_client import get_api_host, get_api_model @@ -99,14 +111,15 @@ def _add_results_link(self): link = f"{ui_host}model-inventory/{get_api_model()}" results_link = f"""

- Check out the updated documentation in your - ValidMind project. + Check out the updated documentation on + ValidMind.

""".strip() self._widgets.append(widgets.HTML(value=results_link)) def _add_description(self): + """Add the test suite description to the summary.""" self._widgets.append( widgets.HTML( value=f'
{md_to_html(self.description)}
' @@ -114,6 +127,7 @@ def _add_description(self): ) def _add_sections_summary(self): + """Append the section summary.""" children = [] titles = [] @@ -132,11 +146,13 @@ def _add_sections_summary(self): self._widgets.append(widgets.Accordion(children=children, titles=titles)) def _add_top_level_section_summary(self): + """Add the top-level section summary.""" self._widgets.append( TestSuiteSectionSummary(tests=self.sections[0].tests).summary ) def _add_footer(self): + """Add the footer.""" footer = """
- -
- -
-
-

validmind

-
- - - -
- - - - -
- - - -
- - -

The ValidMind Library is a suite of developer tools and methods designed to automate the documentation and validation of your models. Designed to be model agnostic, the ValidMind Library provides all the standard functionality without requiring you to rewrite any functions as long as your model is built in Python.

-

With a rich array of documentation tools and test suites, from documenting descriptions of your datasets to testing your models for weak spots and overfit areas, the ValidMind Library helps you automate model documentation by feeding the ValidMind Platform with documentation artifacts and test results.

-

To install the ValidMind Library:

-
pip install validmind
-

To initialize the ValidMind Library, paste the code snippet with the model identifier credentials directly into your development source code, replacing this example with your own:

-
import validmind as vm
-
-vm.init(
-  api_host = "https://api.dev.vm.validmind.ai/api/v1/tracking/tracking",
-  api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
-  api_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
-  project = "<project-identifier>"
-)
-

After you have pasted the code snippet into your development source code and executed the code, the Python Library API will register with ValidMind. You can now use the ValidMind Library to document and test your models, and to upload to the ValidMind Platform.

-
-

Python API

-
-

version

-
2.8.0
-
-
-

get_test_suite()

-
def get_test_suite(
-    test_suite_id: str = None,
-    section: str = None,
-    *args = (),
-    **kwargs = {}) -> TestSuite:
-

Gets a TestSuite object for the current project or a specific test suite This function provides an interface to retrieve the TestSuite instance for the current project or a specific TestSuite instance identified by test_suite_id. The project Test Suite will contain sections for every section in the project’s documentation template and these Test Suite Sections will contain all the tests associated with that template section.

-

Parameters

-
    -
  • optional): The test suite name. If not passed, then the project’s test suite will be returned. Defaults to None. section (str,
  • -
  • optional): The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None.
  • -
  • args: Additional arguments to pass to the TestSuite
  • -
  • kwargs: Additional keyword arguments to pass to the TestSuite
  • -
-
-
-

init()

-
def init(
-    project: Optional = None,
-    api_key: Optional = None,
-    api_secret: Optional = None,
-    api_host: Optional = None,
-    model: Optional = None,
-    monitoring: bool = False):
-

Initializes the API client instances and calls the /ping endpoint to ensure the provided credentials are valid and we can connect to the ValidMind API. If the API key and secret are not provided, the client will attempt to retrieve them from the environment variables VM_API_KEY and VM_API_SECRET.

-

Parameters

-
    -
  • optional): The project CUID. Alias for model. Defaults to None. [DEPRECATED] model (str,
  • -
  • optional): The model CUID. Defaults to None. api_key (str,
  • -
  • optional): The API key. Defaults to None. api_secret (str,
  • -
  • optional): The API secret. Defaults to None. api_host (str,
  • -
  • optional): The API host. Defaults to None. monitoring
  • -
  • (bool): The ongoing monitoring flag. Defaults to False.
  • -
-

Raises

-
    -
  • ValueError: If the API key and secret are not provided
  • -
-
-
-

init_dataset()

-
def init_dataset(
-    dataset,
-    model = None,
-    index = None,
-    index_name: str = None,
-    date_time_index: bool = False,
-    columns: list = None,
-    text_column: str = None,
-    target_column: str = None,
-    feature_columns: list = None,
-    extra_columns: dict = None,
-    class_labels: dict = None,
-    type: str = None,
-    input_id: str = None,
-    __log = True) -> VMDataset:
-

Initializes a VM Dataset, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are reading a valid dataset type. The following dataset types are supported:

-
    -
  • Pandas DataFrame
  • -
  • Polars DataFrame
  • -
  • Numpy ndarray
  • -
  • Torch TensorDataset
  • -
-

Parameters

-
    -
  • (VMModel): ValidMind model object targets
  • -
  • (vm.vm.DatasetTargets): A list of target variables target_column
  • -
  • (str): The name of the target column in the dataset feature_columns
  • -
  • (list): A list of names of feature columns in the dataset extra_columns
  • -
  • (dictionary): A dictionary containing the names of the prediction_column and group_by_columns in the dataset class_labels
  • -
  • (dict): A list of class labels for classification problems type
  • -
  • (str): The type of dataset (one of DATASET_TYPES) input_id
  • -
  • (str): The input ID for the dataset (e.g. “my_dataset”). By default, this will be set to dataset but if you are passing this dataset as a test input using some other key than dataset, then you should set this to the same key.
  • -
-

Returns

-
    -
  • A VM Dataset instance
  • -
-

Raises

-
    -
  • ValueError: If the dataset type is not supported
  • -
-
-
-

init_model()

-
def init_model(
-    model: object = None,
-    input_id: str = 'model',
-    attributes: dict = None,
-    predict_fn: callable = None,
-    __log = True,
-    **kwargs = {}) -> VMModel:
-

Initializes a VM Model, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are creating a model supported libraries.

-

Parameters

-
    -
  • model: A trained model or VMModel instance input_id
  • -
  • (str): The input ID for the model (e.g. “my_model”). By default, this will be set to model but if you are passing this model as a test input using some other key than model, then you should set this to the same key. attributes
  • -
  • (dict): A dictionary of model attributes predict_fn
  • -
  • (callable): A function that takes an input and returns a prediction
  • -
  • **kwargs: Additional arguments to pass to the model
  • -
-

Returns

-
    -
  • A VM Model instance
  • -
-

Raises

-
    -
  • ValueError: If the model type is not supported
  • -
-
-
-

init_r_model()

-
def init_r_model(
-    model_path: str,
-    input_id: str = 'model') -> VMModel:
-

Initializes a VM Model for an R model R models must be saved to disk and the filetype depends on the model type… Currently we support the following model types:

-
    -
  • LogisticRegression glm model in R: saved as an RDS file with saveRDS
  • -
  • LinearRegression lm model in R: saved as an RDS file with saveRDS
  • -
  • XGBClassifier: saved as a .json or .bin file with xgb.save
  • -
  • XGBRegressor: saved as a .json or .bin file with xgb.save LogisticRegression and LinearRegression models are converted to sklearn models by extracting the coefficients and intercept from the R model. XGB models are loaded using the xgboost since xgb models saved in .json or .bin format can be loaded directly with either Python or R
  • -
-

Parameters

-
    -
  • (str): The path to the R model saved as an RDS or XGB file model_type
  • -
  • (str): The type of the model (one of R_MODEL_TYPES)
  • -
-

Returns

-
    -
  • A VM Model instance
  • -
-
-
-

log_metric()

-
def log_metric(
-    key: str,
-    value: float,
-    inputs: Optional = None,
-    params: Optional = None,
-    recorded_at: Optional = None,
-    thresholds: Optional = None):
-

Logs a unit metric Unit metrics are key-value pairs where the key is the metric name and the value is a scalar (int or float). These key-value pairs are associated with the currently selected model (inventory model in the ValidMind Platform) and keys can be logged to over time to create a history of the metric. On the ValidMind Platform, these metrics will be used to create plots/visualizations for documentation and dashboards etc.

-

Parameters

-
    -
  • (str): The metric key value
  • -
  • (float): The metric value inputs (list,
  • -
  • optional): A list of input IDs that were used to compute the metric. params (dict,
  • -
  • optional): Dictionary of parameters used to compute the metric. recorded_at (str,
  • -
  • optional): The timestamp of the metric. Server will use current time if not provided. thresholds (dict,
  • -
  • optional): Dictionary of thresholds for the metric.
  • -
-
-
-

preview_template()

-
def preview_template(
-):
-

Preview the documentation template for the current project This function will display the documentation template for the current project. If the project has not been initialized, then an error will be raised.

-

Raises

-
    -
  • ValueError: If the project has not been initialized
  • -
-
-
-

reload()

-
def reload(
-):
-

Reconnect to the ValidMind API and reload the project configuration

-
-
-

run_documentation_tests()

-
def run_documentation_tests(
-    section = None,
-    send = True,
-    fail_fast = False,
-    inputs = None,
-    config = None,
-    **kwargs = {}):
-

Collect and run all the tests associated with a template This function will analyze the current project’s documentation template and collect all the tests associated with it into a test suite. It will then run the test suite, log the results to the ValidMind API, and display them to the user.

-

Parameters

-
    -
  • optional): The section(s) to preview. Defaults to None. send (bool,
  • -
  • optional): Whether to send the results to the ValidMind API. Defaults to True. fail_fast (bool,
  • -
  • optional): Whether to stop running tests after the first failure. Defaults to False. inputs (dict,
  • -
  • optional): A dictionary of test inputs to pass to the TestSuite
  • -
  • config: A dictionary of test parameters to override the defaults
  • -
  • **kwargs: backwards compatibility for passing in test inputs using keyword arguments
  • -
-

Returns

-
    -
  • TestSuite or dict: The completed TestSuite instance or a dictionary of TestSuites if section is a list.
  • -
-

Raises

-
    -
  • ValueError: If the project has not been initialized
  • -
-
-
-

run_test_suite()

-
def run_test_suite(
-    test_suite_id,
-    send = True,
-    fail_fast = False,
-    config = None,
-    inputs = None,
-    **kwargs = {}):
-

High Level function for running a test suite This function provides a high level interface for running a test suite. A test suite is a collection of tests. This function will automatically find the correct test suite class based on the test_suite_id, initialize each of the tests, and run them.

-

Parameters

-
    -
  • (str): The test suite name (e.g. ‘classifier_full_suite’) config (dict,
  • -
  • optional): A dictionary of parameters to pass to the tests in the test suite. Defaults to None. send (bool,
  • -
  • optional): Whether to post the test results to the API. send=False is useful for testing. Defaults to True. fail_fast (bool,
  • -
  • optional): Whether to stop running tests after the first failure. Defaults to False. inputs (dict,
  • -
  • optional): A dictionary of test inputs to pass to the TestSuite e.g. model, dataset models etc. These inputs will be accessible by any test in the test suite. See the test documentation or vm.describe_test() for more details on the inputs required for each.
  • -
  • **kwargs: backwards compatibility for passing in test inputs using keyword arguments
  • -
-

Returns

-
    -
  • the TestSuite instance
  • -
-

Raises

-
    -
  • ValueError: If the test suite name is not found or if there is an error initializing the test suite
  • -
-
-
-

tags()

-
def tags(
-    *tags = ()):
-

Decorator for specifying tags for a test.

-

Parameters

-
    -
  • *tags: The tags to apply to the test.
  • -
-
-
-

tasks()

-
def tasks(
-    *tasks = ()):
-

Decorator for specifying the task types that a test is designed for.

-

Parameters

-
    -
  • *tasks: The task types that the test is designed for.
  • -
-
-
-

test()

-
def test(
-    func_or_id):
-

Decorator for creating and registering custom tests This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the validmind.tests.run_test function. The function can take two different types of arguments:

-
    -
  • Inputs: ValidMind model or dataset (or list of models/datasets). These arguments must use the following names: model, models, dataset, datasets.
  • -
  • Parameters: Any additional keyword arguments of any type (must have a default value) that can have any name. The function should return one of the following types:
  • -
  • Table: Either a list of dictionaries or a pandas DataFrame
  • -
  • Plot: Either a matplotlib figure or a plotly figure
  • -
  • Scalar: A single number (int or float)
  • -
  • Boolean: A single boolean value indicating whether the test passed or failed The function may also include a docstring. This docstring will be used and logged as the metric’s description.
  • -
-

Parameters

-
    -
  • func: The function to decorate
  • -
  • test_id: The identifier for the metric. If not provided, the function name is used.
  • -
-

Returns

-
    -
  • The decorated function.
  • -
-
-
- -
- - -
+ +
+ +
+
+

validmind

+
+ + + +
+ + + + +
+ + + +
+ + +

The ValidMind Library is a suite of developer tools and methods designed to automate the documentation and validation of your models. Designed to be model agnostic, the ValidMind Library provides all the standard functionality without requiring you to rewrite any functions as long as your model is built in Python.

+

With a rich array of documentation tools and test suites, from documenting descriptions of your datasets to testing your models for weak spots and overfit areas, the ValidMind Library helps you automate model documentation by feeding the ValidMind Platform with documentation artifacts and test results.

+

To install the ValidMind Library:

+
pip install validmind
+

To initialize the ValidMind Library, paste the code snippet with the model identifier credentials directly into your development source code, replacing this example with your own:

+
import validmind as vm
+
+vm.init(
+  api_host = "https://api.dev.vm.validmind.ai/api/v1/tracking/tracking",
+  api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
+  api_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
+  project = "<project-identifier>"
+)
+

After you have pasted the code snippet into your development source code and executed the code, the Python Library API will register with ValidMind. You can now use the ValidMind Library to document and test your models, and to upload to the ValidMind Platform.

+
+

Python API

+
+

version

+
2.8.0
+
+
+

get_test_suite()

+
def get_test_suite(
+    test_suite_id: str = None,
+    section: str = None,
+    *args = (),
+    **kwargs = {}) -> TestSuite:
+

Gets a TestSuite object for the current project or a specific test suite This function provides an interface to retrieve the TestSuite instance for the current project or a specific TestSuite instance identified by test_suite_id. The project Test Suite will contain sections for every section in the project’s documentation template and these Test Suite Sections will contain all the tests associated with that template section.

+

Parameters

+
    +
  • optional): The test suite name. If not passed, then the project’s test suite will be returned. Defaults to None. section (str,
  • +
  • optional): The section of the documentation template from which to retrieve the test suite. This only applies if test_suite_id is None. Defaults to None.
  • +
  • args: Additional arguments to pass to the TestSuite
  • +
  • kwargs: Additional keyword arguments to pass to the TestSuite
  • +
+
+
+

init()

+
def init(
+    project: Optional = None,
+    api_key: Optional = None,
+    api_secret: Optional = None,
+    api_host: Optional = None,
+    model: Optional = None,
+    monitoring: bool = False):
+

Initializes the API client instances and calls the /ping endpoint to ensure the provided credentials are valid and we can connect to the ValidMind API. If the API key and secret are not provided, the client will attempt to retrieve them from the environment variables VM_API_KEY and VM_API_SECRET.

+

Parameters

+
    +
  • optional): The project CUID. Alias for model. Defaults to None. [DEPRECATED] model (str,
  • +
  • optional): The model CUID. Defaults to None. api_key (str,
  • +
  • optional): The API key. Defaults to None. api_secret (str,
  • +
  • optional): The API secret. Defaults to None. api_host (str,
  • +
  • optional): The API host. Defaults to None. monitoring
  • +
  • (bool): The ongoing monitoring flag. Defaults to False.
  • +
+

Raises

+
    +
  • ValueError: If the API key and secret are not provided
  • +
+
+
+

init_dataset()

+
def init_dataset(
+    dataset,
+    model = None,
+    index = None,
+    index_name: str = None,
+    date_time_index: bool = False,
+    columns: list = None,
+    text_column: str = None,
+    target_column: str = None,
+    feature_columns: list = None,
+    extra_columns: dict = None,
+    class_labels: dict = None,
+    type: str = None,
+    input_id: str = None,
+    __log = True) -> VMDataset:
+

Initializes a VM Dataset, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are reading a valid dataset type. The following dataset types are supported:

+
    +
  • Pandas DataFrame
  • +
  • Polars DataFrame
  • +
  • Numpy ndarray
  • +
  • Torch TensorDataset
  • +
+

Parameters

+
    +
  • (VMModel): ValidMind model object targets
  • +
  • (vm.vm.DatasetTargets): A list of target variables target_column
  • +
  • (str): The name of the target column in the dataset feature_columns
  • +
  • (list): A list of names of feature columns in the dataset extra_columns
  • +
  • (dictionary): A dictionary containing the names of the prediction_column and group_by_columns in the dataset class_labels
  • +
  • (dict): A list of class labels for classification problems type
  • +
  • (str): The type of dataset (one of DATASET_TYPES) input_id
  • +
  • (str): The input ID for the dataset (e.g. “my_dataset”). By default, this will be set to dataset but if you are passing this dataset as a test input using some other key than dataset, then you should set this to the same key.
  • +
+

Returns

+
    +
  • A VM Dataset instance
  • +
+

Raises

+
    +
  • ValueError: If the dataset type is not supported
  • +
+
+
+

init_model()

+
def init_model(
+    model: object = None,
+    input_id: str = 'model',
+    attributes: dict = None,
+    predict_fn: callable = None,
+    __log = True,
+    **kwargs = {}) -> VMModel:
+

Initializes a VM Model, which can then be passed to other functions that can perform additional analysis and tests on the data. This function also ensures we are creating a model supported libraries.

+

Parameters

+
    +
  • model: A trained model or VMModel instance input_id
  • +
  • (str): The input ID for the model (e.g. “my_model”). By default, this will be set to model but if you are passing this model as a test input using some other key than model, then you should set this to the same key. attributes
  • +
  • (dict): A dictionary of model attributes predict_fn
  • +
  • (callable): A function that takes an input and returns a prediction
  • +
  • **kwargs: Additional arguments to pass to the model
  • +
+

Returns

+
    +
  • A VM Model instance
  • +
+

Raises

+
    +
  • ValueError: If the model type is not supported
  • +
+
+
+

init_r_model()

+
def init_r_model(
+    model_path: str,
+    input_id: str = 'model') -> VMModel:
+

Initializes a VM Model for an R model R models must be saved to disk and the filetype depends on the model type… Currently we support the following model types:

+
    +
  • LogisticRegression glm model in R: saved as an RDS file with saveRDS
  • +
  • LinearRegression lm model in R: saved as an RDS file with saveRDS
  • +
  • XGBClassifier: saved as a .json or .bin file with xgb.save
  • +
  • XGBRegressor: saved as a .json or .bin file with xgb.save LogisticRegression and LinearRegression models are converted to sklearn models by extracting the coefficients and intercept from the R model. XGB models are loaded using the xgboost since xgb models saved in .json or .bin format can be loaded directly with either Python or R
  • +
+

Parameters

+
    +
  • (str): The path to the R model saved as an RDS or XGB file model_type
  • +
  • (str): The type of the model (one of R_MODEL_TYPES)
  • +
+

Returns

+
    +
  • A VM Model instance
  • +
+
+
+

log_metric()

+
def log_metric(
+    key: str,
+    value: float,
+    inputs: Optional = None,
+    params: Optional = None,
+    recorded_at: Optional = None,
+    thresholds: Optional = None):
+

Logs a unit metric Unit metrics are key-value pairs where the key is the metric name and the value is a scalar (int or float). These key-value pairs are associated with the currently selected model (inventory model in the ValidMind Platform) and keys can be logged to over time to create a history of the metric. On the ValidMind Platform, these metrics will be used to create plots/visualizations for documentation and dashboards etc.

+

Parameters

+
    +
  • (str): The metric key value
  • +
  • (float): The metric value inputs (list,
  • +
  • optional): A list of input IDs that were used to compute the metric. params (dict,
  • +
  • optional): Dictionary of parameters used to compute the metric. recorded_at (str,
  • +
  • optional): The timestamp of the metric. Server will use current time if not provided. thresholds (dict,
  • +
  • optional): Dictionary of thresholds for the metric.
  • +
+
+
+

preview_template()

+
def preview_template(
+):
+

Preview the documentation template for the current project This function will display the documentation template for the current project. If the project has not been initialized, then an error will be raised.

+

Raises

+
    +
  • ValueError: If the project has not been initialized
  • +
+
+
+

reload()

+
def reload(
+):
+

Reconnect to the ValidMind API and reload the project configuration

+
+
+

run_documentation_tests()

+
def run_documentation_tests(
+    section = None,
+    send = True,
+    fail_fast = False,
+    inputs = None,
+    config = None,
+    **kwargs = {}):
+

Collect and run all the tests associated with a template This function will analyze the current project’s documentation template and collect all the tests associated with it into a test suite. It will then run the test suite, log the results to the ValidMind API, and display them to the user.

+

Parameters

+
    +
  • optional): The section(s) to preview. Defaults to None. send (bool,
  • +
  • optional): Whether to send the results to the ValidMind API. Defaults to True. fail_fast (bool,
  • +
  • optional): Whether to stop running tests after the first failure. Defaults to False. inputs (dict,
  • +
  • optional): A dictionary of test inputs to pass to the TestSuite
  • +
  • config: A dictionary of test parameters to override the defaults
  • +
  • **kwargs: backwards compatibility for passing in test inputs using keyword arguments
  • +
+

Returns

+
    +
  • TestSuite or dict: The completed TestSuite instance or a dictionary of TestSuites if section is a list.
  • +
+

Raises

+
    +
  • ValueError: If the project has not been initialized
  • +
+
+
+

run_test_suite()

+
def run_test_suite(
+    test_suite_id,
+    send = True,
+    fail_fast = False,
+    config = None,
+    inputs = None,
+    **kwargs = {}):
+

High Level function for running a test suite This function provides a high level interface for running a test suite. A test suite is a collection of tests. This function will automatically find the correct test suite class based on the test_suite_id, initialize each of the tests, and run them.

+

Parameters

+
    +
  • (str): The test suite name (e.g. ‘classifier_full_suite’) config (dict,
  • +
  • optional): A dictionary of parameters to pass to the tests in the test suite. Defaults to None. send (bool,
  • +
  • optional): Whether to post the test results to the API. send=False is useful for testing. Defaults to True. fail_fast (bool,
  • +
  • optional): Whether to stop running tests after the first failure. Defaults to False. inputs (dict,
  • +
  • optional): A dictionary of test inputs to pass to the TestSuite e.g. model, dataset models etc. These inputs will be accessible by any test in the test suite. See the test documentation or vm.describe_test() for more details on the inputs required for each.
  • +
  • **kwargs: backwards compatibility for passing in test inputs using keyword arguments
  • +
+

Returns

+
    +
  • the TestSuite instance
  • +
+

Raises

+
    +
  • ValueError: If the test suite name is not found or if there is an error initializing the test suite
  • +
+
+
+

tags()

+
def tags(
+    *tags = ()):
+

Decorator for specifying tags for a test.

+

Parameters

+
    +
  • *tags: The tags to apply to the test.
  • +
+
+
+

tasks()

+
def tasks(
+    *tasks = ()):
+

Decorator for specifying the task types that a test is designed for.

+

Parameters

+
    +
  • *tasks: The task types that the test is designed for.
  • +
+
+
+

test()

+
def test(
+    func_or_id):
+

Decorator for creating and registering custom tests This decorator registers the function it wraps as a test function within ValidMind under the provided ID. Once decorated, the function can be run using the validmind.tests.run_test function. The function can take two different types of arguments:

+
    +
  • Inputs: ValidMind model or dataset (or list of models/datasets). These arguments must use the following names: model, models, dataset, datasets.
  • +
  • Parameters: Any additional keyword arguments of any type (must have a default value) that can have any name. The function should return one of the following types:
  • +
  • Table: Either a list of dictionaries or a pandas DataFrame
  • +
  • Plot: Either a matplotlib figure or a plotly figure
  • +
  • Scalar: A single number (int or float)
  • +
  • Boolean: A single boolean value indicating whether the test passed or failed The function may also include a docstring. This docstring will be used and logged as the metric’s description.
  • +
+

Parameters

+
    +
  • func: The function to decorate
  • +
  • test_id: The identifier for the metric. If not provided, the function name is used.
  • +
+

Returns

+
    +
  • The decorated function.
  • +
+
+
+ +
+ + +
- -
- -
-
-

errors

-
- - - -
- - - - -
- - - -
- - -

This module contains all the custom errors that are used in the ValidMind Library. The following base errors are defined for others:

-
    -
  • BaseError
  • -
  • APIRequestError
  • -
-
-

class APIRequestError

-
class APIRequestError(BaseError):
-

Generic error for API request errors that are not known.

-

Inherited members

- -
-
-

class BaseError

-
class BaseError(Exception):
-

Inherited members

-
    -
  • From builtins.BaseException: with_traceback, add_note
  • -
-

Methods

-
-
-

description()

-
description(self, args, kwargs)
-
-
-

class GetTestSuiteError

-
class GetTestSuiteError(BaseError):
-

When the test suite could not be found.

-

Inherited members

- -
-
-

class InitializeTestSuiteError

-
class InitializeTestSuiteError(BaseError):
-

When the test suite was found but could not be initialized.

-

Inherited members

- -
-
-

class InvalidAPICredentialsError

-
class InvalidAPICredentialsError(APIRequestError):
-

Inherited members

- -

Methods

-
-
-

description()

-
description(self, args, kwargs)
-
-
-

class InvalidContentIdPrefixError

-
class InvalidContentIdPrefixError(APIRequestError):
-

When an invalid text content_id is sent to the API.

-

Inherited members

- -
-
-

class InvalidInputError

-
class InvalidInputError(BaseError):
-

When an invalid input object.

-

Inherited members

- -
-
-

class InvalidMetricResultsError

-
class InvalidMetricResultsError(APIRequestError):
-

When an invalid metric results object is sent to the API.

-

Inherited members

- -
-
-

class InvalidProjectError

-
class InvalidProjectError(APIRequestError):
-

Inherited members

- -

Methods

-
-
-

description()

-
description(self, args, kwargs)
-
-
-

class InvalidRequestBodyError

-
class InvalidRequestBodyError(APIRequestError):
-

When a POST/PUT request is made with an invalid request body.

-

Inherited members

- -
-
-

class InvalidTestParametersError

-
class InvalidTestParametersError(BaseError):
-

When an invalid parameters for the test.

-

Inherited members

- -
-
-

class InvalidTestResultsError

-
class InvalidTestResultsError(APIRequestError):
-

When an invalid test results object is sent to the API.

-

Inherited members

- -
-
-

class InvalidTextObjectError

-
class InvalidTextObjectError(APIRequestError):
-

When an invalid Metadat (Text) object is sent to the API.

-

Inherited members

- -
-
-

class InvalidValueFormatterError

-
class InvalidValueFormatterError(BaseError):
-

When an invalid value formatter is provided when serializing results.

-

Inherited members

- -
-
-

class InvalidXGBoostTrainedModelError

-
class InvalidXGBoostTrainedModelError(BaseError):
-

When an invalid XGBoost trained model is used when calling init_r_model.

-

Inherited members

- -
-
-

class LoadTestError

-
class LoadTestError(BaseError):
-

Exception raised when an error occurs while loading a test

-

Inherited members

- -

Methods

-
-
-

class MismatchingClassLabelsError

-
class MismatchingClassLabelsError(BaseError):
-

When the class labels found in the dataset don’t match the provided target labels.

-

Inherited members

- -
-
-

class MissingAPICredentialsError

-
class MissingAPICredentialsError(BaseError):
-

Inherited members

- -

Methods

-
-
-

description()

-
description(self, args, kwargs)
-
-
-

class MissingCacheResultsArgumentsError

-
class MissingCacheResultsArgumentsError(BaseError):
-

When the cache_results function is missing arguments.

-

Inherited members

- -
-
-

class MissingClassLabelError

-
class MissingClassLabelError(BaseError):
-

When the one or more class labels are missing from provided dataset targets.

-

Inherited members

- -
-
-

class MissingDependencyError

-
class MissingDependencyError(BaseError):
-

When a required dependency is missing.

-

Inherited members

- -

Methods

-
-
-

class MissingDocumentationTemplate

-
class MissingDocumentationTemplate(BaseError):
-

When the client config is missing the documentation template.

-

Inherited members

- -
-
-

class MissingModelIdError

-
class MissingModelIdError(BaseError):
-

Inherited members

- -

Methods

-
-
-

description()

-
description(self, args, kwargs)
-
-
-

class MissingOrInvalidModelPredictFnError

-
class MissingOrInvalidModelPredictFnError(BaseError):
-

When the pytorch model is missing a predict function or its predict method does not have the expected arguments.

-

Inherited members

- -
-
-

class MissingRequiredTestInputError

-
class MissingRequiredTestInputError(BaseError):
-

When a required test context variable is missing.

-

Inherited members

- -
-
-

class MissingRExtrasError

-
class MissingRExtrasError(BaseError):
-

When the R extras have not been installed.

-

Inherited members

- -

Methods

-
-
-

description()

-
description(self, args, kwargs)
-
-
-

class MissingTextContentIdError

-
class MissingTextContentIdError(APIRequestError):
-

When a Text object is sent to the API without a content_id.

-

Inherited members

- -
-
-

class MissingTextContentsError

-
class MissingTextContentsError(APIRequestError):
-

When a Text object is sent to the API without a “text” attribute.

-

Inherited members

- -
-
-

class SkipTestError

-
class SkipTestError(BaseError):
-

Useful error to throw when a test cannot be executed.

-

Inherited members

- -
-
-

class TestInputInvalidDatasetError

-
class TestInputInvalidDatasetError(BaseError):
-

When an invalid dataset is used in a test context.

-

Inherited members

- -
-
-

class UnsupportedColumnTypeError

-
class UnsupportedColumnTypeError(BaseError):
-

When an unsupported column type is found on a dataset.

-

Inherited members

- -
-
-

class UnsupportedDatasetError

-
class UnsupportedDatasetError(BaseError):
-

When an unsupported dataset is used.

-

Inherited members

- -
-
-

class UnsupportedFigureError

-
class UnsupportedFigureError(BaseError):
-

When an unsupported figure object is constructed.

-

Inherited members

- -
-
-

class UnsupportedModelError

-
class UnsupportedModelError(BaseError):
-

When an unsupported model is used.

-

Inherited members

- -
-
-

class UnsupportedModelForSHAPError

-
class UnsupportedModelForSHAPError(BaseError):
-

When an unsupported model is used for SHAP importance.

-

Inherited members

- -
-
-

class UnsupportedRModelError

-
class UnsupportedRModelError(BaseError):
-

When an unsupported R model is used.

-

Inherited members

- -
-
-

raise_api_error()

-
def raise_api_error(
-    error_string):
-

Safely try to parse JSON from the response message in case the API returns a non-JSON string or if the API returns a non-standard error

-
-
-

should_raise_on_fail_fast()

-
def should_raise_on_fail_fast(
-    error) -> bool:
-

Determine whether an error should be raised when fail_fast is True.

-
- -
- - -